Search in sources :

Example 1 with ResourceDefinition

use of com.linbit.linstor.api.model.ResourceDefinition in project cloudstack by apache.

the class LinstorPrimaryDataStoreDriverImpl method createResourceFromSnapshot.

private String createResourceFromSnapshot(long csSnapshotId, String rscName, StoragePoolVO storagePoolVO) {
    final String rscGrp = storagePoolVO.getUserInfo() != null && !storagePoolVO.getUserInfo().isEmpty() ? storagePoolVO.getUserInfo() : "DfltRscGrp";
    final DevelopersApi linstorApi = LinstorUtil.getLinstorAPI(storagePoolVO.getHostAddress());
    SnapshotVO snapshotVO = _snapshotDao.findById(csSnapshotId);
    String snapName = LinstorUtil.RSC_PREFIX + snapshotVO.getUuid();
    VolumeVO volumeVO = _volumeDao.findById(snapshotVO.getVolumeId());
    String cloneRes = LinstorUtil.RSC_PREFIX + volumeVO.getPath();
    try {
        s_logger.debug("Create new resource definition: " + rscName);
        ResourceDefinitionCreate rdCreate = new ResourceDefinitionCreate();
        ResourceDefinition rd = new ResourceDefinition();
        rd.setName(rscName);
        rd.setResourceGroupName(rscGrp);
        rdCreate.setResourceDefinition(rd);
        ApiCallRcList answers = linstorApi.resourceDefinitionCreate(rdCreate);
        checkLinstorAnswersThrow(answers);
        SnapshotRestore snapshotRestore = new SnapshotRestore();
        snapshotRestore.toResource(rscName);
        s_logger.debug("Create new volume definition for snapshot: " + cloneRes + ":" + snapName);
        answers = linstorApi.resourceSnapshotsRestoreVolumeDefinition(cloneRes, snapName, snapshotRestore);
        checkLinstorAnswersThrow(answers);
        // restore snapshot to new resource
        s_logger.debug("Restore resource from snapshot: " + cloneRes + ":" + snapName);
        answers = linstorApi.resourceSnapshotRestore(cloneRes, snapName, snapshotRestore);
        checkLinstorAnswersThrow(answers);
        return getDeviceName(linstorApi, rscName);
    } catch (ApiException apiEx) {
        s_logger.error("Linstor: ApiEx - " + apiEx.getMessage());
        throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
    }
}
Also used : ResourceDefinitionCreate(com.linbit.linstor.api.model.ResourceDefinitionCreate) ApiCallRcList(com.linbit.linstor.api.model.ApiCallRcList) SnapshotRestore(com.linbit.linstor.api.model.SnapshotRestore) SnapshotVO(com.cloud.storage.SnapshotVO) VolumeVO(com.cloud.storage.VolumeVO) ResourceDefinition(com.linbit.linstor.api.model.ResourceDefinition) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ApiException(com.linbit.linstor.api.ApiException)

Example 2 with ResourceDefinition

use of com.linbit.linstor.api.model.ResourceDefinition in project cloudstack by apache.

the class LinstorStorageAdaptor method createPhysicalDisk.

@Override
public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size) {
    final String rscName = getLinstorRscName(name);
    LinstorStoragePool lpool = (LinstorStoragePool) pool;
    final DevelopersApi api = getLinstorAPI(pool);
    try {
        List<ResourceDefinition> definitionList = api.resourceDefinitionList(Collections.singletonList(rscName), null, null, null);
        if (definitionList.isEmpty()) {
            ResourceGroupSpawn rgSpawn = new ResourceGroupSpawn();
            rgSpawn.setResourceDefinitionName(rscName);
            // linstor uses KiB
            rgSpawn.addVolumeSizesItem(size / 1024);
            s_logger.debug("Linstor: Spawn resource " + rscName);
            ApiCallRcList answers = api.resourceGroupSpawn(lpool.getResourceGroup(), rgSpawn);
            handleLinstorApiAnswers(answers, "Linstor: Unable to spawn resource.");
        }
        // query linstor for the device path
        List<ResourceWithVolumes> resources = api.viewResources(Collections.emptyList(), Collections.singletonList(rscName), Collections.emptyList(), null, null, null);
        if (!resources.isEmpty() && !resources.get(0).getVolumes().isEmpty()) {
            final String devPath = resources.get(0).getVolumes().get(0).getDevicePath();
            s_logger.info("Linstor: Created drbd device: " + devPath);
            final KVMPhysicalDisk kvmDisk = new KVMPhysicalDisk(devPath, name, pool);
            kvmDisk.setFormat(QemuImg.PhysicalDiskFormat.RAW);
            return kvmDisk;
        } else {
            s_logger.error("Linstor: viewResources didn't return resources or volumes.");
            throw new CloudRuntimeException("Linstor: viewResources didn't return resources or volumes.");
        }
    } catch (ApiException apiEx) {
        throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
    }
}
Also used : ApiCallRcList(com.linbit.linstor.api.model.ApiCallRcList) ResourceDefinition(com.linbit.linstor.api.model.ResourceDefinition) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ResourceGroupSpawn(com.linbit.linstor.api.model.ResourceGroupSpawn) ResourceWithVolumes(com.linbit.linstor.api.model.ResourceWithVolumes) ApiException(com.linbit.linstor.api.ApiException)

Aggregations

CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)2 ApiException (com.linbit.linstor.api.ApiException)2 DevelopersApi (com.linbit.linstor.api.DevelopersApi)2 ApiCallRcList (com.linbit.linstor.api.model.ApiCallRcList)2 ResourceDefinition (com.linbit.linstor.api.model.ResourceDefinition)2 SnapshotVO (com.cloud.storage.SnapshotVO)1 VolumeVO (com.cloud.storage.VolumeVO)1 ResourceDefinitionCreate (com.linbit.linstor.api.model.ResourceDefinitionCreate)1 ResourceGroupSpawn (com.linbit.linstor.api.model.ResourceGroupSpawn)1 ResourceWithVolumes (com.linbit.linstor.api.model.ResourceWithVolumes)1 SnapshotRestore (com.linbit.linstor.api.model.SnapshotRestore)1