package org.ovirt.engine.core.bll.hostdeploy;
import java.util.Collections;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
import org.ovirt.engine.core.bll.VdsCommand;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback;
import org.ovirt.engine.core.bll.validator.UpgradeHostValidator;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.MaintenanceNumberOfVdssParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.action.hostdeploy.UpgradeHostParameters;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.errors.EngineMessage;
@NonTransactiveCommandAttribute
public class UpgradeHostCommand<T extends UpgradeHostParameters> extends VdsCommand<T> {
public UpgradeHostCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected void init() {
if (getParameters().getInitialStatus() == null) {
if (getVds() != null) {
getParameters().setInitialStatus(getVds().getStatus());
}
}
}
@Override
protected boolean validate() {
UpgradeHostValidator validator = new UpgradeHostValidator(getVds());
return validate(validator.hostExists())
&& validate(validator.statusSupportedForHostUpgrade())
&& validate(validator.updatesAvailable())
&& validate(validator.imageProvidedForOvirtNode(getParameters().getoVirtIsoFile()));
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__UPGRADE);
addValidationMessage(EngineMessage.VAR__TYPE__HOST);
}
@Override
protected void executeCommand() {
VDSStatus statusBeforeUpgrade = getVds().getStatus();
if (statusBeforeUpgrade != VDSStatus.Maintenance) {
Future<VdcReturnValueBase> maintenanceCmd =
CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.MaintenanceNumberOfVdss,
createMaintenanceParams(),
cloneContext());
VdcReturnValueBase result;
try {
result = maintenanceCmd.get();
if (!result.getSucceeded()) {
propagateFailure(result);
return;
}
} catch (InterruptedException | ExecutionException e) {
log.error("Exception", e);
return;
}
}
setSucceeded(true);
}
public MaintenanceNumberOfVdssParameters createMaintenanceParams() {
MaintenanceNumberOfVdssParameters params =
new MaintenanceNumberOfVdssParameters(Collections.singletonList(getVdsId()), true);
return withRootCommandInfo(params);
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.HOST_UPGRADE_STARTED : AuditLogType.HOST_UPGRADE_FAILED;
}
@Override
public CommandCallback getCallback() {
return new HostUpgradeCallback();
}
}