Search in sources :

Example 16 with DevelopersApi

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

the class LinstorStorageAdaptor method getAvailable.

public long getAvailable(LinstorStoragePool pool) {
    DevelopersApi linstorApi = getLinstorAPI(pool);
    final String rscGroupName = pool.getResourceGroup();
    try {
        List<ResourceGroup> rscGrps = linstorApi.resourceGroupList(Collections.singletonList(rscGroupName), null, null, null);
        if (rscGrps.isEmpty()) {
            final String errMsg = String.format("Linstor: Resource group '%s' not found", rscGroupName);
            s_logger.error(errMsg);
            throw new CloudRuntimeException(errMsg);
        }
        List<StoragePool> storagePools = linstorApi.viewStoragePools(Collections.emptyList(), rscGrps.get(0).getSelectFilter().getStoragePoolList(), null, null, null);
        final long free = storagePools.stream().filter(sp -> sp.getProviderKind() != ProviderKind.DISKLESS).mapToLong(StoragePool::getFreeCapacity).sum() * // linstor uses KiB
        1024;
        s_logger.debug("Linstor: getAvailable() -> " + free);
        return free;
    } catch (ApiException apiEx) {
        s_logger.error(apiEx.getMessage());
        throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
    }
}
Also used : ResourceGroup(com.linbit.linstor.api.model.ResourceGroup) ApiCallRc(com.linbit.linstor.api.model.ApiCallRc) QemuImgFile(org.apache.cloudstack.utils.qemu.QemuImgFile) HashMap(java.util.HashMap) StoragePool(com.linbit.linstor.api.model.StoragePool) Configuration(com.linbit.linstor.api.Configuration) ApiCallRcList(com.linbit.linstor.api.model.ApiCallRcList) QemuImg(org.apache.cloudstack.utils.qemu.QemuImg) LibvirtException(org.libvirt.LibvirtException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) Logger(org.apache.log4j.Logger) ProviderKind(com.linbit.linstor.api.model.ProviderKind) Map(java.util.Map) Properties(com.linbit.linstor.api.model.Properties) VolumeDefinition(com.linbit.linstor.api.model.VolumeDefinition) Storage(com.cloud.storage.Storage) Nonnull(javax.annotation.Nonnull) ResourceDefinition(com.linbit.linstor.api.model.ResourceDefinition) QemuImgException(org.apache.cloudstack.utils.qemu.QemuImgException) ResourceMakeAvailable(com.linbit.linstor.api.model.ResourceMakeAvailable) ResourceWithVolumes(com.linbit.linstor.api.model.ResourceWithVolumes) IOException(java.io.IOException) InputStreamReader(java.io.InputStreamReader) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ApiException(com.linbit.linstor.api.ApiException) List(java.util.List) ApiClient(com.linbit.linstor.api.ApiClient) ResourceDefinitionModify(com.linbit.linstor.api.model.ResourceDefinitionModify) ResourceGroupSpawn(com.linbit.linstor.api.model.ResourceGroupSpawn) StringJoiner(java.util.StringJoiner) Optional(java.util.Optional) BufferedReader(java.io.BufferedReader) Collections(java.util.Collections) StoragePool(com.linbit.linstor.api.model.StoragePool) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ResourceGroup(com.linbit.linstor.api.model.ResourceGroup) ApiException(com.linbit.linstor.api.ApiException)

Example 17 with DevelopersApi

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

the class LinstorStorageAdaptor method disconnectPhysicalDiskByPath.

/**
 * disconnectPhysicalDiskByPath is called after e.g. a live migration.
 * The problem is we have no idea just from the path to which linstor-controller
 * this resource would belong to. But as it should be highly unlikely that someone
 * uses more than one linstor-controller to manage resource on the same kvm host.
 * We will just take the first stored storagepool.
 */
@Override
public boolean disconnectPhysicalDiskByPath(String localPath) {
    // get first storage pool from the map, as we don't know any better:
    if (!MapStorageUuidToStoragePool.isEmpty()) {
        s_logger.debug("Linstor: disconnectPhysicalDiskByPath " + localPath);
        String firstKey = MapStorageUuidToStoragePool.keySet().stream().findFirst().get();
        final KVMStoragePool pool = MapStorageUuidToStoragePool.get(firstKey);
        s_logger.debug("Linstor: Using storpool: " + pool.getUuid());
        final DevelopersApi api = getLinstorAPI(pool);
        try {
            List<ResourceWithVolumes> resources = api.viewResources(Collections.singletonList(localNodeName), null, null, null, null, null);
            Optional<ResourceWithVolumes> rsc = getResourceByPath(resources, localPath);
            if (rsc.isPresent()) {
                ResourceDefinitionModify rdm = new ResourceDefinitionModify();
                rdm.deleteProps(Collections.singletonList("DrbdOptions/Net/allow-two-primaries"));
                ApiCallRcList answers = api.resourceDefinitionModify(rsc.get().getName(), rdm);
                if (answers.hasError()) {
                    s_logger.error("Failed to remove 'allow-two-primaries' on " + rsc.get().getName());
                    throw new CloudRuntimeException(answers.get(0).getMessage());
                }
                return true;
            }
            s_logger.warn("Linstor: Couldn't find resource for this path: " + localPath);
        } catch (ApiException apiEx) {
            s_logger.error(apiEx);
            throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
        }
    }
    return false;
}
Also used : ApiCallRcList(com.linbit.linstor.api.model.ApiCallRcList) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ResourceDefinitionModify(com.linbit.linstor.api.model.ResourceDefinitionModify) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ResourceWithVolumes(com.linbit.linstor.api.model.ResourceWithVolumes) ApiException(com.linbit.linstor.api.ApiException)

Example 18 with DevelopersApi

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

the class LinstorStorageAdaptor method getCapacity.

public long getCapacity(LinstorStoragePool pool) {
    DevelopersApi linstorApi = getLinstorAPI(pool);
    final String rscGroupName = pool.getResourceGroup();
    try {
        List<ResourceGroup> rscGrps = linstorApi.resourceGroupList(Collections.singletonList(rscGroupName), null, null, null);
        if (rscGrps.isEmpty()) {
            final String errMsg = String.format("Linstor: Resource group '%s' not found", rscGroupName);
            s_logger.error(errMsg);
            throw new CloudRuntimeException(errMsg);
        }
        List<StoragePool> storagePools = linstorApi.viewStoragePools(Collections.emptyList(), rscGrps.get(0).getSelectFilter().getStoragePoolList(), null, null, null);
        final long capacity = storagePools.stream().filter(sp -> sp.getProviderKind() != ProviderKind.DISKLESS).mapToLong(sp -> sp.getTotalCapacity() != null ? sp.getTotalCapacity() : 0).sum() * // linstor uses kiB
        1024;
        s_logger.debug("Linstor: GetCapacity() -> " + capacity);
        return capacity;
    } catch (ApiException apiEx) {
        s_logger.error(apiEx.getMessage());
        throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
    }
}
Also used : ResourceGroup(com.linbit.linstor.api.model.ResourceGroup) ApiCallRc(com.linbit.linstor.api.model.ApiCallRc) QemuImgFile(org.apache.cloudstack.utils.qemu.QemuImgFile) HashMap(java.util.HashMap) StoragePool(com.linbit.linstor.api.model.StoragePool) Configuration(com.linbit.linstor.api.Configuration) ApiCallRcList(com.linbit.linstor.api.model.ApiCallRcList) QemuImg(org.apache.cloudstack.utils.qemu.QemuImg) LibvirtException(org.libvirt.LibvirtException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) Logger(org.apache.log4j.Logger) ProviderKind(com.linbit.linstor.api.model.ProviderKind) Map(java.util.Map) Properties(com.linbit.linstor.api.model.Properties) VolumeDefinition(com.linbit.linstor.api.model.VolumeDefinition) Storage(com.cloud.storage.Storage) Nonnull(javax.annotation.Nonnull) ResourceDefinition(com.linbit.linstor.api.model.ResourceDefinition) QemuImgException(org.apache.cloudstack.utils.qemu.QemuImgException) ResourceMakeAvailable(com.linbit.linstor.api.model.ResourceMakeAvailable) ResourceWithVolumes(com.linbit.linstor.api.model.ResourceWithVolumes) IOException(java.io.IOException) InputStreamReader(java.io.InputStreamReader) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ApiException(com.linbit.linstor.api.ApiException) List(java.util.List) ApiClient(com.linbit.linstor.api.ApiClient) ResourceDefinitionModify(com.linbit.linstor.api.model.ResourceDefinitionModify) ResourceGroupSpawn(com.linbit.linstor.api.model.ResourceGroupSpawn) StringJoiner(java.util.StringJoiner) Optional(java.util.Optional) BufferedReader(java.io.BufferedReader) Collections(java.util.Collections) StoragePool(com.linbit.linstor.api.model.StoragePool) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DevelopersApi(com.linbit.linstor.api.DevelopersApi) ResourceGroup(com.linbit.linstor.api.model.ResourceGroup) ApiException(com.linbit.linstor.api.ApiException)

Aggregations

DevelopersApi (com.linbit.linstor.api.DevelopersApi)18 ApiException (com.linbit.linstor.api.ApiException)16 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)13 ApiCallRcList (com.linbit.linstor.api.model.ApiCallRcList)13 ApiClient (com.linbit.linstor.api.ApiClient)6 ResourceWithVolumes (com.linbit.linstor.api.model.ResourceWithVolumes)6 ResourceDefinition (com.linbit.linstor.api.model.ResourceDefinition)5 ResourceDefinitionModify (com.linbit.linstor.api.model.ResourceDefinitionModify)5 ResourceGroupSpawn (com.linbit.linstor.api.model.ResourceGroupSpawn)5 Configuration (com.linbit.linstor.api.Configuration)4 ApiCallRc (com.linbit.linstor.api.model.ApiCallRc)4 Properties (com.linbit.linstor.api.model.Properties)4 ProviderKind (com.linbit.linstor.api.model.ProviderKind)4 ResourceGroup (com.linbit.linstor.api.model.ResourceGroup)4 ResourceMakeAvailable (com.linbit.linstor.api.model.ResourceMakeAvailable)4 StoragePool (com.linbit.linstor.api.model.StoragePool)4 VolumeDefinition (com.linbit.linstor.api.model.VolumeDefinition)4 Collections (java.util.Collections)4 List (java.util.List)4 Logger (org.apache.log4j.Logger)4