Search in sources :

Example 51 with Volume

use of com.cloud.storage.Volume in project cloudstack by apache.

the class VolumeServiceImpl method registerVolumeCallback.

protected Void registerVolumeCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> callback, CreateVolumeContext<VolumeApiResult> context) {
    CreateCmdResult result = callback.getResult();
    VolumeObject vo = (VolumeObject) context.volume;
    try {
        if (result.isFailed()) {
            vo.processEvent(Event.OperationFailed);
            // delete the volume entry from volumes table in case of failure
            VolumeVO vol = volDao.findById(vo.getId());
            if (vol != null) {
                volDao.remove(vo.getId());
            }
        } else {
            vo.processEvent(Event.OperationSuccessed, result.getAnswer());
            if (vo.getSize() != null) {
                // publish usage events
                // get physical size from volume_store_ref table
                long physicalSize = 0;
                DataStore ds = vo.getDataStore();
                VolumeDataStoreVO volStore = _volumeStoreDao.findByStoreVolume(ds.getId(), vo.getId());
                if (volStore != null) {
                    physicalSize = volStore.getPhysicalSize();
                } else {
                    s_logger.warn("No entry found in volume_store_ref for volume id: " + vo.getId() + " and image store id: " + ds.getId() + " at the end of uploading volume!");
                }
                Scope dsScope = ds.getScope();
                if (dsScope.getScopeType() == ScopeType.ZONE) {
                    if (dsScope.getScopeId() != null) {
                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_UPLOAD, vo.getAccountId(), dsScope.getScopeId(), vo.getId(), vo.getName(), null, null, physicalSize, vo.getSize(), Volume.class.getName(), vo.getUuid());
                    } else {
                        s_logger.warn("Zone scope image store " + ds.getId() + " has a null scope id");
                    }
                } else if (dsScope.getScopeType() == ScopeType.REGION) {
                    // publish usage event for region-wide image store using a -1 zoneId for 4.2, need to revisit post-4.2
                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_UPLOAD, vo.getAccountId(), -1, vo.getId(), vo.getName(), null, null, physicalSize, vo.getSize(), Volume.class.getName(), vo.getUuid());
                    _resourceLimitMgr.incrementResourceCount(vo.getAccountId(), ResourceType.secondary_storage, vo.getSize());
                }
            }
        }
        VolumeApiResult res = new VolumeApiResult(vo);
        context.future.complete(res);
        return null;
    } catch (Exception e) {
        s_logger.error("register volume failed: ", e);
        // delete the volume entry from volumes table in case of failure
        VolumeVO vol = volDao.findById(vo.getId());
        if (vol != null) {
            volDao.remove(vo.getId());
        }
        VolumeApiResult res = new VolumeApiResult(null);
        context.future.complete(res);
        return null;
    }
}
Also used : VolumeVO(com.cloud.storage.VolumeVO) Scope(org.apache.cloudstack.engine.subsystem.api.storage.Scope) Volume(com.cloud.storage.Volume) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) PrimaryDataStore(org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore) VolumeDataStoreVO(org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO) CreateCmdResult(org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException)

Example 52 with Volume

use of com.cloud.storage.Volume in project cloudstack by apache.

the class VolumeObject method processEvent.

@Override
public void processEvent(ObjectInDataStoreStateMachine.Event event) {
    if (dataStore == null) {
        return;
    }
    try {
        Volume.Event volEvent = null;
        if (dataStore.getRole() == DataStoreRole.ImageCache) {
            objectInStoreMgr.update(this, event);
            return;
        }
        if (dataStore.getRole() == DataStoreRole.Image) {
            objectInStoreMgr.update(this, event);
            if (volumeVO.getState() == Volume.State.Migrating || volumeVO.getState() == Volume.State.Copying || volumeVO.getState() == Volume.State.Uploaded || volumeVO.getState() == Volume.State.Expunged) {
                return;
            }
            if (event == ObjectInDataStoreStateMachine.Event.CreateOnlyRequested) {
                volEvent = Volume.Event.UploadRequested;
            } else if (event == ObjectInDataStoreStateMachine.Event.MigrationRequested) {
                volEvent = Volume.Event.CopyRequested;
            }
        } else {
            if (event == ObjectInDataStoreStateMachine.Event.CreateRequested || event == ObjectInDataStoreStateMachine.Event.CreateOnlyRequested) {
                volEvent = Volume.Event.CreateRequested;
            } else if (event == ObjectInDataStoreStateMachine.Event.CopyingRequested) {
                volEvent = Volume.Event.CopyRequested;
            } else if (event == ObjectInDataStoreStateMachine.Event.MigrationRequested) {
                volEvent = Volume.Event.MigrationRequested;
            } else if (event == ObjectInDataStoreStateMachine.Event.MigrationCopyRequested) {
                volEvent = Event.MigrationCopyRequested;
            }
        }
        if (event == ObjectInDataStoreStateMachine.Event.DestroyRequested) {
            volEvent = Volume.Event.DestroyRequested;
        } else if (event == ObjectInDataStoreStateMachine.Event.ExpungeRequested) {
            volEvent = Volume.Event.ExpungingRequested;
        } else if (event == ObjectInDataStoreStateMachine.Event.OperationSuccessed) {
            volEvent = Volume.Event.OperationSucceeded;
        } else if (event == ObjectInDataStoreStateMachine.Event.MigrationCopySucceeded) {
            volEvent = Event.MigrationCopySucceeded;
        } else if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
            volEvent = Volume.Event.OperationFailed;
        } else if (event == ObjectInDataStoreStateMachine.Event.MigrationCopyFailed) {
            volEvent = Event.MigrationCopyFailed;
        } else if (event == ObjectInDataStoreStateMachine.Event.ResizeRequested) {
            volEvent = Volume.Event.ResizeRequested;
        }
        stateTransit(volEvent);
    } catch (Exception e) {
        s_logger.debug("Failed to update state", e);
        throw new CloudRuntimeException("Failed to update state:" + e.toString());
    } finally {
        // state transit call reloads the volume from DB and so check for null as well
        if (event == ObjectInDataStoreStateMachine.Event.OperationFailed && (volumeVO != null && volumeVO.getState() != Volume.State.Copying && volumeVO.getState() != Volume.State.Uploaded && volumeVO.getState() != Volume.State.UploadError)) {
            objectInStoreMgr.deleteIfNotReady(this);
        }
    }
}
Also used : Volume(com.cloud.storage.Volume) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException)

Example 53 with Volume

use of com.cloud.storage.Volume in project cloudstack by apache.

the class CreateSnapshotPolicyCmd method getEntityOwnerId.

@Override
public long getEntityOwnerId() {
    Volume volume = _entityMgr.findById(Volume.class, getVolumeId());
    if (volume == null) {
        throw new InvalidParameterValueException("Unable to find volume by id=" + volumeId);
    }
    Account account = _accountService.getAccount(volume.getAccountId());
    //Can create templates for enabled projects/accounts only
    if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
        Project project = _projectService.findByProjectAccountId(volume.getAccountId());
        if (project.getState() != Project.State.Active) {
            PermissionDeniedException ex = new PermissionDeniedException("Can't add resources to the specified project id in state=" + project.getState() + " as it's no longer active");
            ex.addProxyObject(project.getUuid(), "projectId");
            throw ex;
        }
    } else if (account.getState() == Account.State.disabled) {
        throw new PermissionDeniedException("The owner of template is disabled: " + account);
    }
    return volume.getAccountId();
}
Also used : Account(com.cloud.user.Account) Project(com.cloud.projects.Project) Volume(com.cloud.storage.Volume) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) PermissionDeniedException(com.cloud.exception.PermissionDeniedException)

Example 54 with Volume

use of com.cloud.storage.Volume in project cloudstack by apache.

the class VolumeOrchestrator method allocateTemplatedVolume.

@Override
public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm, Account owner) {
    assert (template.getFormat() != ImageFormat.ISO) : "ISO is not a template really....";
    Long size = _tmpltMgr.getTemplateSize(template.getId(), vm.getDataCenterId());
    if (rootDisksize != null) {
        rootDisksize = rootDisksize * 1024 * 1024 * 1024;
        if (rootDisksize > size) {
            s_logger.debug("Using root disk size of " + rootDisksize + " Bytes for volume " + name);
            size = rootDisksize;
        } else {
            s_logger.debug("Using root disk size of " + size + " Bytes for volume " + name + "since specified root disk size of " + rootDisksize + " Bytes is smaller than template");
        }
    }
    minIops = minIops != null ? minIops : offering.getMinIops();
    maxIops = maxIops != null ? maxIops : offering.getMaxIops();
    VolumeVO vol = new VolumeVO(type, name, vm.getDataCenterId(), owner.getDomainId(), owner.getId(), offering.getId(), offering.getProvisioningType(), size, minIops, maxIops, null);
    vol.setFormat(getSupportedImageFormatForCluster(template.getHypervisorType()));
    if (vm != null) {
        vol.setInstanceId(vm.getId());
    }
    vol.setTemplateId(template.getId());
    if (type.equals(Type.ROOT)) {
        vol.setDeviceId(0l);
        if (!vm.getType().equals(VirtualMachine.Type.User)) {
            vol.setRecreatable(true);
        }
    } else {
        vol.setDeviceId(1l);
    }
    if (vm.getType() == VirtualMachine.Type.User) {
        UserVmVO userVm = _userVmDao.findById(vm.getId());
        vol.setDisplayVolume(userVm.isDisplayVm());
    }
    vol = _volsDao.persist(vol);
    // Create event and update resource count for volumes if vm is a user vm
    if (vm.getType() == VirtualMachine.Type.User) {
        Long offeringId = null;
        if (offering.getType() == DiskOffering.Type.Disk) {
            offeringId = offering.getId();
        }
        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offeringId, vol.getTemplateId(), size, Volume.class.getName(), vol.getUuid(), vol.isDisplayVolume());
        _resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume, vol.isDisplayVolume());
        _resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, vol.isDisplayVolume(), new Long(vol.getSize()));
    }
    return toDiskProfile(vol, offering);
}
Also used : UserVmVO(com.cloud.vm.UserVmVO) VolumeVO(com.cloud.storage.VolumeVO) VmWorkMigrateVolume(com.cloud.vm.VmWorkMigrateVolume) VmWorkAttachVolume(com.cloud.vm.VmWorkAttachVolume) Volume(com.cloud.storage.Volume)

Example 55 with Volume

use of com.cloud.storage.Volume in project cloudstack by apache.

the class VolumeOrchestrator method storageMigration.

@Override
public boolean storageMigration(VirtualMachineProfile vm, StoragePool destPool) throws StorageUnavailableException {
    List<VolumeVO> vols = _volsDao.findUsableVolumesForInstance(vm.getId());
    List<Volume> volumesNeedToMigrate = new ArrayList<Volume>();
    for (VolumeVO volume : vols) {
        if (volume.getState() != Volume.State.Ready) {
            s_logger.debug("volume: " + volume.getId() + " is in " + volume.getState() + " state");
            throw new CloudRuntimeException("volume: " + volume.getId() + " is in " + volume.getState() + " state");
        }
        if (volume.getPoolId() == destPool.getId()) {
            s_logger.debug("volume: " + volume.getId() + " is on the same storage pool: " + destPool.getId());
            continue;
        }
        volumesNeedToMigrate.add(volume);
    }
    if (volumesNeedToMigrate.isEmpty()) {
        s_logger.debug("No volume need to be migrated");
        return true;
    }
    for (Volume vol : volumesNeedToMigrate) {
        Volume result = migrateVolume(vol, destPool);
        if (result == null) {
            return false;
        }
    }
    return true;
}
Also used : VolumeVO(com.cloud.storage.VolumeVO) VmWorkMigrateVolume(com.cloud.vm.VmWorkMigrateVolume) VmWorkAttachVolume(com.cloud.vm.VmWorkAttachVolume) Volume(com.cloud.storage.Volume) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ArrayList(java.util.ArrayList)

Aggregations

Volume (com.cloud.storage.Volume)70 StoragePool (com.cloud.storage.StoragePool)21 ServerApiException (org.apache.cloudstack.api.ServerApiException)16 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)15 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)15 ExcludeList (com.cloud.deploy.DeploymentPlanner.ExcludeList)14 VolumeResponse (org.apache.cloudstack.api.response.VolumeResponse)14 ArrayList (java.util.ArrayList)12 Account (com.cloud.user.Account)11 VolumeVO (com.cloud.storage.VolumeVO)10 DiskProfile (com.cloud.vm.DiskProfile)10 StoragePoolAllocator (org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator)10 Test (org.junit.Test)10 DataCenterDeployment (com.cloud.deploy.DataCenterDeployment)9 HashMap (java.util.HashMap)9 DeploymentPlan (com.cloud.deploy.DeploymentPlan)8 PermissionDeniedException (com.cloud.exception.PermissionDeniedException)8 VirtualMachineProfile (com.cloud.vm.VirtualMachineProfile)8 Project (com.cloud.projects.Project)7 VmWorkAttachVolume (com.cloud.vm.VmWorkAttachVolume)7