| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| package com.cloud.storage; | |
| import java.util.Arrays; | |
| import java.util.Date; | |
| import org.apache.cloudstack.acl.ControlledEntity; | |
| import org.apache.cloudstack.api.Displayable; | |
| import org.apache.cloudstack.api.Identity; | |
| import org.apache.cloudstack.api.InternalIdentity; | |
| import com.cloud.template.BasedOn; | |
| import com.cloud.utils.fsm.StateMachine2; | |
| import com.cloud.utils.fsm.StateObject; | |
| public interface Volume extends ControlledEntity, Identity, InternalIdentity, BasedOn, StateObject<Volume.State>, Displayable { | |
| static final long DISK_OFFERING_SUITABILITY_CHECK_VOLUME_ID = -1; | |
| // Managed storage volume parameters (specified in the compute/disk offering for PowerFlex) | |
| String BANDWIDTH_LIMIT_IN_MBPS = "bandwidthLimitInMbps"; | |
| String IOPS_LIMIT = "iopsLimit"; | |
| enum Type { | |
| UNKNOWN, ROOT, SWAP, DATADISK, ISO | |
| }; | |
| enum State { | |
| Allocated(false, "The volume is allocated but has not been created yet."), | |
| Creating(true, "The volume is being created. getPoolId() should reflect the pool where it is being created."), | |
| Ready(false, "The volume is ready to be used."), | |
| Migrating(true, "The volume is migrating to other storage pool"), | |
| Snapshotting(true, "There is a snapshot created on this volume, not backed up to secondary storage yet"), | |
| RevertSnapshotting(true, "There is a snapshot created on this volume, the volume is being reverting from snapshot"), | |
| Resizing(true, "The volume is being resized"), | |
| Expunging(true, "The volume is being expunging"), | |
| Expunged(false, "The volume has been expunged, and can no longer be recovered"), | |
| Destroy(false, "The volume is destroyed, and can be recovered."), | |
| Destroying(false, "The volume is destroying, and can't be recovered."), | |
| UploadOp(true, "The volume upload operation is in progress or in short the volume is on secondary storage"), | |
| Copying(true, "Volume is copying from image store to primary, in case it's an uploaded volume"), | |
| Uploaded(false, "Volume is uploaded"), | |
| NotUploaded(true, "The volume entry is just created in DB, not yet uploaded"), | |
| UploadInProgress(true, "Volume upload is in progress"), | |
| UploadError(false, "Volume upload encountered some error"), | |
| UploadAbandoned(false, "Volume upload is abandoned since the upload was never initiated within a specified time"), | |
| Attaching(true, "The volume is attaching to a VM from Ready state."), | |
| Restoring(true, "The volume is being restored from backup."), | |
| Consolidating(true, "The volume is being flattened."), | |
| RestoreError(false, "The volume restore encountered an error."); | |
| boolean _transitional; | |
| String _description; | |
| /** | |
| * Volume State | |
| * @param transitional true for transition/non-final state, otherwise false | |
| * @param description description of the state | |
| */ | |
| private State(boolean transitional, String description) { | |
| _transitional = transitional; | |
| _description = description; | |
| } | |
| public static StateMachine2<State, Event, Volume> getStateMachine() { | |
| return s_fsm; | |
| } | |
| public boolean isTransitional() { | |
| return _transitional; | |
| } | |
| public String getDescription() { | |
| return _description; | |
| } | |
| private final static StateMachine2<State, Event, Volume> s_fsm = new StateMachine2<State, Event, Volume>(); | |
| static { | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.CreateRequested, Creating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.OperationFailed, Allocated, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.OperationSucceeded, Allocated, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.OperationRetry, Creating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.OperationFailed, Allocated, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.CreateRequested, Creating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.CreateRequested, Creating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.ResizeRequested, Resizing, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Resizing, Event.OperationSucceeded, Ready, Arrays.asList(new StateMachine2.Transition.Impact[]{StateMachine2.Transition.Impact.USAGE}))); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Resizing, Event.OperationFailed, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.UploadRequested, UploadOp, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Uploaded, Event.CopyRequested, Copying, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.OperationFailed, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Copying, Event.OperationSucceeded, Ready, Arrays.asList(new StateMachine2.Transition.Impact[]{StateMachine2.Transition.Impact.USAGE}))); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Copying, Event.OperationFailed, Uploaded, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadOp, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Destroy, Event.ExpungingRequested, Expunging, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunging, Event.ExpungingRequested, Expunging, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunging, Event.OperationSucceeded, Expunged,null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunging, Event.OperationFailed, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.SnapshotRequested, Snapshotting, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Snapshotting, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Snapshotting, Event.OperationFailed, Ready,null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.RevertSnapshotRequested, RevertSnapshotting, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(RevertSnapshotting, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(RevertSnapshotting, Event.OperationFailed, Ready,null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.MigrationCopyRequested, Creating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.MigrationCopyFailed, Allocated, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Creating, Event.MigrationCopySucceeded, Ready, Arrays.asList(new StateMachine2.Transition.Impact[]{StateMachine2.Transition.Impact.USAGE}))); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.MigrationRequested, Migrating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Migrating, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Migrating, Event.OperationFailed, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Destroy, Event.OperationSucceeded, Destroy, Arrays.asList(new StateMachine2.Transition.Impact[]{StateMachine2.Transition.Impact.USAGE}))); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Destroy, Event.OperationFailed, Destroy, Arrays.asList(StateMachine2.Transition.Impact.USAGE))); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadOp, Event.OperationSucceeded, Uploaded, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadOp, Event.OperationFailed, Allocated, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Uploaded, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunged, Event.ExpungingRequested, Expunged, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunged, Event.OperationSucceeded, Expunged, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunged, Event.OperationFailed, Expunged, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(NotUploaded, Event.OperationTimeout, UploadAbandoned, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(NotUploaded, Event.UploadRequested, UploadInProgress, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(NotUploaded, Event.OperationSucceeded, Uploaded, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(NotUploaded, Event.OperationFailed, UploadError, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadInProgress, Event.OperationSucceeded, Uploaded, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadInProgress, Event.OperationFailed, UploadError, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadInProgress, Event.OperationTimeout, UploadError, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadError, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadAbandoned, Event.DestroyRequested, Destroy, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.AttachRequested, Attaching, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Attaching, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Attaching, Event.OperationFailed, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Destroy, Event.RecoverRequested, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.RestoreRequested, Restoring, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Expunged, Event.RestoreRequested, Restoring, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Destroy, Event.RestoreRequested, Restoring, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Restoring, Event.RestoreSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Restoring, Event.RestoreFailed, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<>(Ready, Event.ConsolidationRequested, Consolidating, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<>(Consolidating, Event.OperationSucceeded, Ready, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<>(Consolidating, Event.OperationFailed, RestoreError, null)); | |
| s_fsm.addTransition(new StateMachine2.Transition<>(RestoreError, Event.RestoreFailed, RestoreError, null)); | |
| } | |
| } | |
| enum Event { | |
| CreateRequested, | |
| CopyRequested, | |
| CopySucceeded, | |
| CopyFailed, | |
| OperationFailed, | |
| OperationSucceeded, | |
| OperationRetry, | |
| UploadRequested, | |
| MigrationRequested, | |
| MigrationCopyRequested, | |
| MigrationCopySucceeded, | |
| MigrationCopyFailed, | |
| SnapshotRequested, | |
| RevertSnapshotRequested, | |
| DestroyRequested, | |
| RecoverRequested, | |
| ExpungingRequested, | |
| ResizeRequested, | |
| AttachRequested, | |
| OperationTimeout, | |
| RestoreRequested, | |
| RestoreSucceeded, | |
| RestoreFailed, | |
| ConsolidationRequested | |
| } | |
| /** | |
| * @return the volume name | |
| */ | |
| String getName(); | |
| /** | |
| * @return total size of the partition | |
| */ | |
| Long getSize(); | |
| Long getMinIops(); | |
| Long getMaxIops(); | |
| String get_iScsiName(); | |
| /** | |
| * @return the vm instance id | |
| */ | |
| Long getInstanceId(); | |
| /** | |
| * @return the folder of the volume | |
| */ | |
| String getFolder(); | |
| /** | |
| * @return the path created. | |
| */ | |
| String getPath(); | |
| Long getPodId(); | |
| long getDataCenterId(); | |
| Type getVolumeType(); | |
| Long getPoolId(); | |
| @Override | |
| State getState(); | |
| Date getAttached(); | |
| Long getDeviceId(); | |
| Date getCreated(); | |
| Long getDiskOfferingId(); | |
| String getChainInfo(); | |
| boolean isRecreatable(); | |
| public long getUpdatedCount(); | |
| public void incrUpdatedCount(); | |
| public Date getUpdated(); | |
| /** | |
| * @return | |
| */ | |
| String getReservationId(); | |
| /** | |
| * @param reserv | |
| */ | |
| void setReservationId(String reserv); | |
| Storage.ImageFormat getFormat(); | |
| Storage.ProvisioningType getProvisioningType(); | |
| Long getVmSnapshotChainSize(); | |
| Integer getHypervisorSnapshotReserve(); | |
| @Deprecated | |
| boolean isDisplayVolume(); | |
| boolean isDisplay(); | |
| boolean isDeployAsIs(); | |
| String getExternalUuid(); | |
| void setExternalUuid(String externalUuid); | |
| Long getPassphraseId(); | |
| void setPassphraseId(Long id); | |
| Long getKmsKeyId(); | |
| void setKmsKeyId(Long id); | |
| Long getKmsWrappedKeyId(); | |
| void setKmsWrappedKeyId(Long id); | |
| String getEncryptFormat(); | |
| void setEncryptFormat(String encryptFormat); | |
| boolean isDeleteProtection(); | |
| } |