package org.ovirt.engine.core.bll.storage.domain; import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.validator.storage.StorageDomainValidator; import org.ovirt.engine.core.common.action.StorageDomainManagementParameter; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dao.StorageDomainDao; import org.ovirt.engine.core.dao.StorageServerConnectionDao; public class AddStorageDomainCommon<T extends StorageDomainManagementParameter> extends AddStorageDomainCommand<T> { @Inject private StorageServerConnectionDao storageServerConnectionDao; @Inject private StorageDomainDao storageDomainDao; /** * Constructor for command creation when compensation is applied on startup */ protected AddStorageDomainCommon(Guid commandId) { super(commandId); } public AddStorageDomainCommon(T parameters, CommandContext commandContext) { super(parameters, commandContext); } protected boolean checkStorageConnection(String storageDomainConnection) { List<StorageDomain> domains = null; StorageServerConnections connection = storageServerConnectionDao.get(storageDomainConnection); if (connection == null) { return failValidation(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST); } if (connection.getStorageType().isFileDomain()) { domains = getStorageDomainsByConnId(connection.getId()); if (domains.size() > 0) { String domainNames = domains.stream().map(StorageDomain::getName).collect(Collectors.joining(",")); return prepareFailureMessageForDomains(domainNames); } } return true; } protected List<StorageDomain> getStorageDomainsByConnId(String connectionId) { return storageDomainDao.getAllByConnectionId(Guid.createGuidFromString(connectionId)); } protected boolean prepareFailureMessageForDomains(String domainNames) { addValidationMessageVariable("domainNames", domainNames); return failValidation(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTION_BELONGS_TO_SEVERAL_STORAGE_DOMAINS); } @Override protected boolean canAddDomain() { return checkStorageConnection(getStorageDomain().getStorage()); } @Override protected String getStorageArgs() { return storageServerConnectionDao .get(getStorageDomain().getStorage()) .getConnection(); } @Override protected boolean validateDiscardAfterDeleteLegal(StorageDomainValidator storageDomainValidator, Version compatibilityVersion) { /* Discard after delete is only relevant for block storage domains. Therefore, if it is enabled for a non block storage domain, the validation should fail. */ if (getStorageDomain().isDiscardAfterDelete()) { return failValidation( EngineMessage.ACTION_TYPE_FAILED_DISCARD_AFTER_DELETE_SUPPORTED_ONLY_BY_BLOCK_DOMAINS); } return true; } }