package org.ovirt.engine.core.bll.storage;
import java.util.List;
import org.ovirt.engine.core.bll.Backend;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.StorageDomainManagementParameter;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.storage_domain_static;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.SetStorageDomainDescriptionVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.ObjectIdentityChecker;
public class UpdateStorageDomainCommand<T extends StorageDomainManagementParameter> extends
StorageDomainManagementCommandBase<T> {
public UpdateStorageDomainCommand(T parameters) {
super(parameters);
}
private boolean _storageDomainNameChanged;
@Override
protected boolean canDoAction() {
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE);
boolean returnValue = super.canDoAction() && CheckStorageDomain()
&& checkStorageDomainStatus(StorageDomainStatus.Active) && CheckStorageDomainNameLengthValid();
storage_domain_static oldDomain =
DbFacade.getInstance().getStorageDomainStaticDAO().get(getStorageDomain().getid());
java.util.ArrayList<String> props = ObjectIdentityChecker.GetChangedFields(oldDomain, getStorageDomain()
.getStorageStaticData());
// allow change only to name field
props.remove("storage_name");
if (returnValue && props.size() > 0) {
addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS);
returnValue = false;
}
_storageDomainNameChanged = !StringHelper.EqOp(oldDomain.getstorage_name(), getStorageDomain()
.getstorage_name());
// if domain is part of pool, and name changed, check that pool is up in
// order to change description in spm
if (returnValue
&& _storageDomainNameChanged
&& getStoragePool() != null
&& !((Boolean) Backend
.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.IsValid,
new IrsBaseVDSCommandParameters(getStoragePool().getId())).getReturnValue())
.booleanValue()) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_IMAGE_REPOSITORY_NOT_FOUND);
returnValue = false;
}
if (returnValue && _storageDomainNameChanged && IsStorageWithSameNameExists()) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NAME_ALREADY_EXIST);
returnValue = false;
}
return returnValue;
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_UPDATE_STORAGE_DOMAIN
: AuditLogType.USER_UPDATE_STORAGE_DOMAIN_FAILED;
}
@Override
protected void executeCommand() {
DbFacade.getInstance().getStorageDomainStaticDAO().update(getStorageDomain().getStorageStaticData());
if (_storageDomainNameChanged && getStoragePool() != null) {
Backend.getInstance()
.getResourceManager()
.RunVdsCommand(
VDSCommandType.SetStorageDomainDescription,
new SetStorageDomainDescriptionVDSCommandParameters(getStoragePool().getId(),
getStorageDomain().getid(), getStorageDomain().getstorage_name()));
}
setSucceeded(true);
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(UpdateEntity.class);
return super.getValidationGroups();
}
}