package org.ovirt.engine.core.bll.provider.storage; import java.util.List; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.provider.ProviderValidator; import org.ovirt.engine.core.bll.storage.connection.CINDERStorageHelper; import org.ovirt.engine.core.bll.validator.storage.StoragePoolValidator; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.ProviderType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.storage.OpenStackVolumeProviderProperties; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.StorageDomainDao; import org.ovirt.engine.core.dao.StoragePoolDao; public class CinderProviderValidator extends ProviderValidator { StorageDomain CinderStorageDomain; public CinderProviderValidator(Provider<?> provider) { super(provider); } @Override public ValidationResult validateAddProvider() { ValidationResult cinderValidation = isCinderAlreadyExists(); if (!cinderValidation.isValid()) { return cinderValidation; } if (getStoragePool() != null) { return validateAttachStorageDomain(); } return ValidationResult.VALID; } @Override public ValidationResult validateRemoveProvider() { if (getStorageDomain() == null) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST); } StorageDomainStatus status = getStorageDomain().getStatus(); if (status != StorageDomainStatus.Inactive && status != StorageDomainStatus.Maintenance && status != StorageDomainStatus.Unknown) { if (status.isStorageDomainInProcess()) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED); } return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2, String.format("$%s %s", "status", status)); } return CINDERStorageHelper.isCinderHasNoImages(getStorageDomain().getId()); } private StorageDomain getStorageDomain() { if (CinderStorageDomain == null) { List<StorageDomain> providerStorageList = getStorageDomainDao().getAllByConnectionId(provider.getId()); if (!providerStorageList.isEmpty()) { CinderStorageDomain = providerStorageList.get(0); } } return CinderStorageDomain; } private ValidationResult validateAttachStorageDomain() { StoragePoolValidator spValidator = new StoragePoolValidator(getStoragePool()); ValidationResult result; result = spValidator.isAnyDomainInProcess(); if (!result.isValid()) { return result; } result = spValidator.checkStoragePoolNotInStatus(StoragePoolStatus.Up); if (!result.isValid()) { return result; } return ValidationResult.VALID; } private StoragePool getStoragePool() { Guid storagePoolId = ((OpenStackVolumeProviderProperties) provider.getAdditionalProperties()).getStoragePoolId(); return getStoragePoolDao().get(storagePoolId); } protected StoragePoolDao getStoragePoolDao() { return DbFacade.getInstance().getStoragePoolDao(); } protected StorageDomainDao getStorageDomainDao() { return DbFacade.getInstance().getStorageDomainDao(); } public ValidationResult isCinderAlreadyExists() { List<Provider<?>> cinderProvidersFromDB = getProviderDao().getAllByTypes(ProviderType.OPENSTACK_VOLUME); for (Provider cinderProviderFromDB : cinderProvidersFromDB) { if (provider.getUrl().equals(cinderProviderFromDB.getUrl())) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_CINDER_ALREADY_EXISTS); } } return ValidationResult.VALID; } }