package org.ovirt.engine.core.bll.storage; import java.util.List; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.utils.VersionSupport; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.StoragePoolManagementParameter; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.common.vdscommands.SetStoragePoolDescriptionVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class UpdateStoragePoolCommand<T extends StoragePoolManagementParameter> extends StoragePoolManagementCommandBase<T> { public UpdateStoragePoolCommand(T parameters) { super(parameters); } /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected UpdateStoragePoolCommand(Guid commandId) { super(commandId); } private storage_pool _oldStoragePool; @Override protected void executeCommand() { DbFacade.getInstance().getStoragePoolDAO().updatePartial(getStoragePool()); if (getStoragePool().getstatus() == StoragePoolStatus.Up && !StringHelper.EqOp(_oldStoragePool.getname(), getStoragePool().getname())) { Backend.getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.SetStoragePoolDescription, new SetStoragePoolDescriptionVDSCommandParameters(getStoragePool().getId(), getStoragePool().getname())); } setSucceeded(true); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_UPDATE_STORAGE_POOL : AuditLogType.USER_UPDATE_STORAGE_POOL_FAILED; } @Override protected boolean canDoAction() { boolean returnValue = super.canDoAction() && CheckStoragePool(); _oldStoragePool = DbFacade.getInstance().getStoragePoolDAO().get(getStoragePool().getId()); if (returnValue && !StringHelper.EqOp(_oldStoragePool.getname(), getStoragePool().getname()) && DbFacade.getInstance().getStoragePoolDAO().getByName(getStoragePool().getname()) != null) { returnValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_NAME_ALREADY_EXIST); } if (returnValue && _oldStoragePool.getstorage_pool_type() != getStoragePool() .getstorage_pool_type() && DbFacade.getInstance() .getStorageDomainStaticDAO() .getAllForStoragePool(getStoragePool().getId()) .size() > 0) { returnValue = false; getReturnValue() .getCanDoActionMessages() .add(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_POOL_TYPE_WITH_DOMAINS .toString()); } returnValue = returnValue && CheckStoragePoolNameLengthValid(); if (returnValue && Version.OpInequality(_oldStoragePool.getcompatibility_version(), getStoragePool() .getcompatibility_version())) { if (!VersionSupport.checkVersionSupported(getStoragePool().getcompatibility_version())) { addCanDoActionMessage(VersionSupport.getUnsupportedVersionMessage()); returnValue = false; } // decreasing of compatibility version is not allowed else if (getStoragePool().getcompatibility_version().compareTo(_oldStoragePool.getcompatibility_version()) < 0) { returnValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CANNOT_DECREASE_COMPATIBILITY_VERSION); } else { // check all clusters has at least the same compatibility // version List<VDSGroup> clusters = DbFacade.getInstance().getVdsGroupDAO().getAllForStoragePool( getStoragePool().getId()); for (VDSGroup cluster : clusters) { if (getStoragePool().getcompatibility_version().compareTo(cluster.getcompatibility_version()) > 0) { returnValue = false; getReturnValue() .getCanDoActionMessages() .add(VdcBllMessages.ERROR_CANNOT_UPDATE_STORAGE_POOL_COMPATIBILITY_VERSION_BIGGER_THAN_CLUSTERS .toString()); break; } } } } returnValue = returnValue && isNotLocalfsWithDefaultCluster(); addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE); return returnValue; } private boolean isNotLocalfsWithDefaultCluster() { if(getStoragePool().getstorage_pool_type() == StorageType.LOCALFS && containsDefaultCluster()) { addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_WITH_DEFAULT_VDS_GROUP_CANNOT_BE_LOCALFS); return false; } return true; } private boolean containsDefaultCluster() { List<VDSGroup> clusters = DbFacade.getInstance().getVdsGroupDAO().getAllForStoragePool(getStoragePool().getId()); boolean hasDefaultCluster = false; for(VDSGroup cluster : clusters) { if(cluster.getID().equals(VDSGroup.DEFAULT_VDS_GROUP_ID)) { hasDefaultCluster = true; break; } } return hasDefaultCluster; } }