package org.ovirt.engine.core.bll.provider.storage; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; import org.ovirt.engine.core.bll.storage.connection.CINDERStorageHelper; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.storage.CinderConnectionInfo; import org.ovirt.engine.core.common.businessentities.storage.CinderVolumeType; import org.ovirt.engine.core.common.businessentities.storage.OpenStackVolumeProviderProperties; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.compat.Guid; import com.woorea.openstack.base.client.OpenStackRequest; import com.woorea.openstack.cinder.Cinder; import com.woorea.openstack.cinder.model.ConnectionForInitialize; import com.woorea.openstack.cinder.model.ConnectionInfo; import com.woorea.openstack.cinder.model.Limits; import com.woorea.openstack.cinder.model.Snapshot; import com.woorea.openstack.cinder.model.SnapshotForCreate; import com.woorea.openstack.cinder.model.Volume; import com.woorea.openstack.cinder.model.VolumeForCreate; import com.woorea.openstack.cinder.model.VolumeForUpdate; import com.woorea.openstack.cinder.model.VolumeType; import com.woorea.openstack.cinder.model.VolumeTypes; public class OpenStackVolumeProviderProxy extends AbstractOpenStackStorageProviderProxy<Cinder, OpenStackVolumeProviderProperties, CinderProviderValidator> { private static final String API_VERSION = "/v2/"; public OpenStackVolumeProviderProxy(Provider<OpenStackVolumeProviderProperties> provider) { this.provider = provider; } @Override public void onAddition() { Guid storageDomainId = addStorageDomain(StorageType.CINDER, StorageDomainType.Volume); Guid storagePoolId = provider.getAdditionalProperties().getStoragePoolId(); if (storagePoolId != null && !storagePoolId.equals(Guid.Empty)) { attachStorageDomainToDataCenter(storageDomainId, storagePoolId); } } protected void attachStorageDomainToDataCenter(Guid storageDomainId, Guid storagePoolId) { CINDERStorageHelper CINDERStorageHelper = new CINDERStorageHelper(); CINDERStorageHelper.setRunInNewTransaction(false); CINDERStorageHelper.attachCinderDomainToPool(storageDomainId, storagePoolId); CINDERStorageHelper.activateCinderDomain(storageDomainId, storagePoolId); } @Override protected Cinder getClient() { return getClient(""); } protected Cinder getClient(String tenantId) { if (client == null) { client = new Cinder(getProvider().getUrl().concat(API_VERSION).concat(tenantId)); client.setTokenProvider(getTokenProvider()); } return client; } public String createSnapshot(SnapshotForCreate snapshotForCreate) { Snapshot retCinderSnapshot = getClient(getTenantId()).snapshots().create(snapshotForCreate).execute(); return retCinderSnapshot.getId(); } public void deleteSnapshot(String snapshotId) { getClient(getTenantId()).snapshots().delete(snapshotId).execute(); } public String cloneVolumeFromSnapshot(VolumeForCreate volumeForCreate) { Volume retCinderVolume = getClient(getTenantId()).volumes().create(volumeForCreate).execute(); return retCinderVolume.getId(); } public String createVolume(VolumeForCreate volumeForCreate) { Volume retCinderVolume = getClient(getTenantId()).volumes().create(volumeForCreate).execute(); return retCinderVolume.getId(); } public void deleteVolume(String volumeId) { getClient(getTenantId()).volumes().delete(volumeId).execute(); } public void updateVolume(String volumeId, VolumeForUpdate volumeForUpdate) { getClient(getTenantId()).volumes().update(volumeId, volumeForUpdate).execute(); } public void extendVolume(String volumeId, int newSize) { getClient(getTenantId()).volumes().extend(volumeId, newSize).execute(); } public CinderConnectionInfo initializeConnectionForVolume(String volumeId, ConnectionForInitialize connectionForInitialize) { ConnectionInfo connectionInfo = getClient(getTenantId()).volumes().initializeConnection(volumeId, connectionForInitialize).execute(); CinderConnectionInfo cinderConnectionInfo = new CinderConnectionInfo(); cinderConnectionInfo.setDriverVolumeType(connectionInfo.getDriverVolumeType()); cinderConnectionInfo.setData(connectionInfo.getData()); return cinderConnectionInfo; } public Volume getVolumeById(String id) { return getClient(getTenantId()).volumes().show(id).execute(); } public Snapshot getSnapshotById(String id) { return getClient(getTenantId()).snapshots().show(id).execute(); } public Limits getLimits() { return getClient(getTenantId()).limits().list().execute(); } public List<Volume> getVolumes() { return getClient(getTenantId()).volumes().list(true).execute().getList(); } public List<CinderVolumeType> getVolumeTypes() { ArrayList<CinderVolumeType> cinderVolumeTypes = new ArrayList<>(); OpenStackRequest<VolumeTypes> listRequest = getClient(getTenantId()).volumeTypes().list(); VolumeTypes volumeTypes = listRequest.execute(); for (VolumeType volumeType : volumeTypes) { CinderVolumeType cinderVolumeType = new CinderVolumeType( volumeType.getId(), volumeType.getName(), volumeType.getExtraSpecs()); cinderVolumeTypes.add(cinderVolumeType); } return cinderVolumeTypes; } @Override public void onRemoval() { List<StorageDomain> storageDomains = getDbFacade().getStorageDomainDao().getAllByConnectionId(provider.getId()); // Removing the static and dynamic storage domain entries StorageDomain storageDomainEntry = storageDomains.get(0); getDbFacade().getStorageDomainDao().remove(storageDomainEntry.getId()); } public static OpenStackVolumeProviderProxy getFromStorageDomainId(Guid storageDomainId) { StorageDomainStatic storageDomainStatic = getDbFacade().getStorageDomainStaticDao().get(storageDomainId); if (storageDomainStatic != null) { return getProviderFromStorageDomainStatic(storageDomainStatic); } return null; } public static OpenStackVolumeProviderProxy getFromStorageDomainId(Guid storageDomainId, Guid userID, boolean isFiltered) { StorageDomain storageDomain = getDbFacade().getStorageDomainDao().get(storageDomainId, userID, isFiltered); if (storageDomain != null) { Provider provider = getDbFacade().getProviderDao().get(new Guid(storageDomain.getStorage())); return ProviderProxyFactory.getInstance().create(provider); } return null; } private static OpenStackVolumeProviderProxy getProviderFromStorageDomainStatic(StorageDomainStatic storageDomainStatic) { Provider provider = getDbFacade().getProviderDao().get(new Guid(storageDomainStatic.getStorage())); return ProviderProxyFactory.getInstance().create(provider); } @Override public CinderProviderValidator getProviderValidator() { if (providerValidator == null) { providerValidator = new CinderProviderValidator(provider); } return providerValidator; } }