package org.ovirt.engine.core.bll.gluster; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; import org.ovirt.engine.core.common.action.gluster.GlusterHookManageParameters; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterHookVDSParameters; import org.ovirt.engine.core.dao.VdsDao; import org.ovirt.engine.core.dao.gluster.GlusterHooksDao; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; /** * BLL command to remove gluster hook from all servers in the cluster. */ @NonTransactiveCommandAttribute public class RemoveGlusterHookCommand extends GlusterHookCommandBase<GlusterHookManageParameters> { @Inject private VdsDao vdsDao; @Inject private GlusterHooksDao glusterHooksDao; protected List<String> errors = new ArrayList<>(); private List<VDS> serversInCluster = null; public RemoveGlusterHookCommand(GlusterHookManageParameters params, CommandContext commandContext) { super(params, commandContext); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties.withScope(Scope.Execution).withWait(true); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__ACTION__REMOVE); addValidationMessage(EngineMessage.VAR__TYPE__GLUSTER_HOOK); } private List<VDS> getServersInCluster() { if (serversInCluster == null) { serversInCluster = vdsDao.getAllForCluster(getGlusterHook().getClusterId()); } return serversInCluster; } @Override protected boolean validate() { if (!super.validate()) { return false; } for (VDS vds: getServersInCluster()) { if (vds.getStatus() != VDSStatus.Up) { setVdsName(vds.getName()); addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_SERVER_STATUS_NOT_UP); addValidationMessage(String.format("$%1$s %2$s", "VdsName", vds.getName())); return false; } } return true; } @Override protected void executeCommand() { entity = getGlusterHook(); addCustomValue(GlusterConstants.HOOK_NAME, entity.getName()); List<Callable<Pair<VDS, VDSReturnValue>>> taskList = new ArrayList<>(); for (final VDS server : getServersInCluster()) { taskList.add(() -> { VDSReturnValue returnValue; returnValue = runVdsCommand( VDSCommandType.RemoveGlusterHook, new GlusterHookVDSParameters(server.getId(), entity.getGlusterCommand(), entity.getStage(), entity.getName() )); return new Pair<>(server, returnValue); }); } if (!taskList.isEmpty()) { List<Pair<VDS, VDSReturnValue>> pairResults = ThreadPoolUtil.invokeAll(taskList); for (Pair<VDS, VDSReturnValue> pairResult : pairResults) { VDSReturnValue retValue = pairResult.getSecond(); if (!retValue.getSucceeded() ) { errors.add(retValue.getVdsError().getMessage()); } } } if (errors.size() > 0) { setSucceeded(false); errorType = AuditLogType.GLUSTER_HOOK_REMOVE_FAILED; handleVdsErrors(getAuditLogTypeValue(), errors); addCustomValue(GlusterConstants.FAILURE_MESSAGE , StringUtils.join(errors, System.lineSeparator())); } else { setSucceeded(true); } if (getSucceeded()) { entity.removeMissingConflict(); glusterHooksDao.remove(entity.getId()); } } @Override public Map<String, String> getJobMessageProperties() { if (jobProperties == null) { jobProperties = super.getJobMessageProperties(); if (getGlusterHook() != null) { jobProperties.put(GlusterConstants.HOOK_NAME, getGlusterHook().getName()); } } return jobProperties; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.GLUSTER_HOOK_REMOVED : errorType; } }