package org.ovirt.engine.core.bll.validator.storage;
import java.util.List;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.storage.connection.GLUSTERFSStorageHelper;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
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.StorageServerConnectionDao;
public class StorageConnectionValidator {
private static final String STORAGE_DOMAIN_NAME_REPLACEMENT = "$domainNames %1$s";
private static final String VDS_NAME_REPLACEMENT = "$VdsName %1$s";
private StorageServerConnections connection;
public StorageConnectionValidator(StorageServerConnections connection) {
this.connection = connection;
}
public ValidationResult isConnectionExists() {
if (connection == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST);
}
return ValidationResult.VALID;
}
public ValidationResult isSameStorageType(StorageDomain storageDomain) {
StorageType connectionStorageType = connection.getStorageType();
StorageType storageDomainType = storageDomain.getStorageType();
if (!connectionStorageType.equals(storageDomainType)) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_NOT_SAME_STORAGE_TYPE);
}
return ValidationResult.VALID;
}
public ValidationResult isISCSIConnectionAndDomain(StorageDomain storageDomain) {
ValidationResult validationResult = isSameStorageType(storageDomain);
if (!validationResult.isValid()) {
return validationResult;
}
StorageType connectionStorageType = connection.getStorageType();
StorageType storageDomainType = storageDomain.getStorageType();
if (!connectionStorageType.equals(StorageType.ISCSI) || !storageDomainType.equals(StorageType.ISCSI)) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_ACTION_IS_SUPPORTED_ONLY_FOR_ISCSI_DOMAINS);
}
return ValidationResult.VALID;
}
public ValidationResult isDomainOfConnectionExistsAndInactive(StorageDomain storageDomain) {
if (storageDomain == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST);
}
if (storageDomain.getStatus() != StorageDomainStatus.Maintenance
&& storageDomain.getStorageDomainSharedStatus() != StorageDomainSharedStatus.Unattached) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_UNSUPPORTED_ACTION_DOMAIN_MUST_BE_IN_MAINTENANCE_OR_UNATTACHED,
String.format(STORAGE_DOMAIN_NAME_REPLACEMENT, storageDomain.getStorageName()));
}
return ValidationResult.VALID;
}
public ValidationResult canVDSConnectToGlusterfs(VDS vds) {
if (!GLUSTERFSStorageHelper.canVDSConnectToGlusterfs(vds)) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAIL_VDS_CANNOT_CONNECT_TO_GLUSTERFS,
String.format(VDS_NAME_REPLACEMENT, vds.getName()));
}
return ValidationResult.VALID;
}
public boolean isConnectionForISCSIDomainAttached(StorageDomain storageDomain) {
List<StorageServerConnections> connectionsForDomain = getAllConnectionsForDomain(storageDomain.getId());
for (StorageServerConnections connectionForDomain : connectionsForDomain) {
if (connectionForDomain.getId().equals(connection.getId())) {
return true;
}
}
return false;
}
protected List<StorageServerConnections> getAllConnectionsForDomain(Guid storageDomainId) {
return getStorageServerConnectionDao().getAllForDomain(storageDomainId);
}
protected StorageServerConnectionDao getStorageServerConnectionDao() {
return DbFacade.getInstance().getStorageServerConnectionDao();
}
}