package org.ovirt.engine.core.bll.provider.storage;
import java.util.List;
import org.ovirt.engine.core.bll.provider.ProviderProxy;
import org.ovirt.engine.core.bll.provider.ProviderValidator;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainDynamic;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StorageFormatType;
import org.ovirt.engine.core.common.businessentities.TenantProviderProperties;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.woorea.openstack.base.client.HttpMethod;
import com.woorea.openstack.base.client.OpenStackClient;
import com.woorea.openstack.base.client.OpenStackRequest;
import com.woorea.openstack.base.client.OpenStackResponseException;
import com.woorea.openstack.base.client.OpenStackTokenProvider;
import com.woorea.openstack.keystone.model.Access;
import com.woorea.openstack.keystone.utils.KeystoneTokenProvider;
public abstract class AbstractOpenStackStorageProviderProxy<C extends OpenStackClient, T extends TenantProviderProperties, V extends ProviderValidator> implements ProviderProxy<V> {
protected C client;
protected Provider<T> provider;
protected OpenStackTokenProvider tokenProvider;
protected KeystoneTokenProvider keystoneTokenProvider;
protected StorageDomain storageDomain;
protected V providerValidator;
private static Logger log = LoggerFactory.getLogger(AbstractOpenStackStorageProviderProxy.class);
@Override
public void testConnection() {
try {
getClient().execute(new OpenStackRequest<>(getClient(), HttpMethod.GET, "", null, null));
} catch (OpenStackResponseException e) {
log.error("{} (OpenStack response error code: {})", e.getMessage(), e.getStatus());
log.debug("Exception", e);
throw new EngineException(EngineError.PROVIDER_FAILURE, e);
} catch (RuntimeException e) {
throw new EngineException(EngineError.PROVIDER_FAILURE, e);
}
}
protected abstract C getClient();
protected Provider getProvider() {
return provider;
}
protected OpenStackTokenProvider getTokenProvider() {
if (tokenProvider == null && getProvider().isRequiringAuthentication()) {
String tenantName = provider.getAdditionalProperties().getTenantName();
tokenProvider = getKeystoneTokenProvider().getProviderByTenant(tenantName);
}
return tokenProvider;
}
protected KeystoneTokenProvider getKeystoneTokenProvider() {
if (keystoneTokenProvider == null) {
keystoneTokenProvider = new KeystoneTokenProvider(getProvider().getAuthUrl(),
getProvider().getUsername(), getProvider().getPassword());
}
return keystoneTokenProvider;
}
protected Access getAccess() {
String tenantName = provider.getAdditionalProperties().getTenantName();
return getKeystoneTokenProvider().getAccessByTenant(tenantName);
}
protected String getTenantId() {
return getAccess().getToken().getTenant().getId();
}
protected Guid addStorageDomain(StorageType storageType, StorageDomainType storageDomainType) {
// Storage domain static
StorageDomainStatic domainStaticEntry = new StorageDomainStatic();
domainStaticEntry.setId(Guid.newGuid());
domainStaticEntry.setStorage(provider.getId().toString());
domainStaticEntry.setStorageName(provider.getName());
domainStaticEntry.setDescription(provider.getDescription());
domainStaticEntry.setStorageFormat(StorageFormatType.V1);
domainStaticEntry.setStorageType(storageType);
domainStaticEntry.setStorageDomainType(storageDomainType);
domainStaticEntry.setWipeAfterDelete(false);
getDbFacade().getStorageDomainStaticDao().save(domainStaticEntry);
// Storage domain dynamic
StorageDomainDynamic domainDynamicEntry = new StorageDomainDynamic();
domainDynamicEntry.setId(domainStaticEntry.getId());
getDbFacade().getStorageDomainDynamicDao().save(domainDynamicEntry);
return domainStaticEntry.getId();
}
@Override
public void onModification() {
// updating storage domain information
Guid storageDomainId = getProviderStorageDomain().getId();
StorageDomainStatic domainStaticEntry =
getDbFacade().getStorageDomainStaticDao().get(storageDomainId);
domainStaticEntry.setStorageName(provider.getName());
domainStaticEntry.setDescription(provider.getDescription());
getDbFacade().getStorageDomainStaticDao().update(domainStaticEntry);
}
@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().getStorageDomainDynamicDao().remove(storageDomainEntry.getId());
getDbFacade().getStorageDomainStaticDao().remove(storageDomainEntry.getId());
}
protected StorageDomain getProviderStorageDomain() {
if (storageDomain == null) {
List<StorageDomain> storageDomains =
getDbFacade().getStorageDomainDao().getAllByConnectionId(provider.getId());
storageDomain = storageDomains.get(0);
}
return storageDomain;
}
protected static DbFacade getDbFacade() {
return DbFacade.getInstance();
}
}