package org.ovirt.engine.core.bll.storage.domain; import static org.ovirt.engine.core.common.constants.StorageConstants.STEP_DEVICE_TYPE; import java.util.Collections; import java.util.List; import java.util.Map; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.InternalCommandAttribute; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.SerialChildCommandsExecutionCallback; import org.ovirt.engine.core.bll.SerialChildExecutingCommand; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.connection.StorageHelperDirector; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.MoveStorageDomainDeviceCommandParameters; import org.ovirt.engine.core.common.action.ReduceStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.RemoveDeviceFromSANStorageDomainCommandParameters; import org.ovirt.engine.core.common.action.RemoveDeviceFromSANStorageDomainCommandParameters.OperationStage; import org.ovirt.engine.core.common.action.VdcActionParametersBase.EndProcedure; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.job.StepEnum; @NonTransactiveCommandAttribute @InternalCommandAttribute public class RemoveDeviceFromSANStorageDomainCommand<T extends RemoveDeviceFromSANStorageDomainCommandParameters> extends CommandBase<T> implements SerialChildExecutingCommand { public RemoveDeviceFromSANStorageDomainCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); setStorageDomainId(getParameters().getStorageDomainId()); } @Override protected void executeCommand() { movePV(); setSucceeded(true); } @Override public List<PermissionSubject> getPermissionCheckSubjects() { return Collections.emptyList(); } private void movePV() { MoveStorageDomainDeviceCommandParameters p = new MoveStorageDomainDeviceCommandParameters(getParameters() .getStorageDomainId(), getParameters().getDeviceId(), getParameters().getDestinationDevices()); p.setParentCommand(getActionType()); p.setParentParameters(getParameters()); p.setStoragePoolId(getStoragePoolId()); p.setVdsRunningOn(getParameters().getVdsId()); p.setEndProcedure(EndProcedure.COMMAND_MANAGED); runInternalAction(VdcActionType.MoveStorageDomainDevice, p, null); } private void reduceDomain() { ReduceStorageDomainCommandParameters p = new ReduceStorageDomainCommandParameters(getParameters() .getStorageDomainId(), getParameters().getDeviceId()); p.setParentCommand(getActionType()); p.setParentParameters(getParameters()); p.setStoragePoolId(getStoragePoolId()); p.setVdsRunningOn(getParameters().getVdsId()); p.setEndProcedure(EndProcedure.COMMAND_MANAGED); runInternalAction(VdcActionType.ReduceStorageDomain, p, null); } @Override public CommandCallback getCallback() { return new SerialChildCommandsExecutionCallback(); } @Override public boolean performNextOperation(int completedChildCount) { if (getParameters().getOperationStage() == OperationStage.MOVE) { getParameters().setOperationStage(OperationStage.REDUCE); persistCommandIfNeeded(); reduceDomain(); return true; } return false; } protected void endSuccessfully() { StorageHelperDirector.getInstance() .getItem(getStorageDomain().getStorageType()) .removeLunFromStorageDomain(getParameters().getDeviceId()); setSucceeded(true); } @Override public AuditLogType getAuditLogTypeValue() { addCustomValue("LunId", getParameters().getDeviceId()); switch (getActionState()) { case EXECUTE: return AuditLogType.USER_REMOVE_DEVICE_FROM_STORAGE_DOMAIN_STARTED; case END_SUCCESS: return AuditLogType.USER_REMOVE_DEVICE_FROM_STORAGE_DOMAIN; default: return AuditLogType.USER_REMOVE_DEVICE_FROM_STORAGE_DOMAIN_FAILED; } } @Override public StepEnum getCommandStep() { return StepEnum.REMOVE_DEVICE_FROM_DOMAIN; } @Override public Map<String, String> getJobMessageProperties() { if (jobProperties == null) { jobProperties = super.getJobMessageProperties(); } jobProperties.put(STEP_DEVICE_TYPE, getParameters().getDeviceId()); return jobProperties; } }