package org.ovirt.engine.core.vdsbroker.vdsbroker;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.core.vdsbroker.*;
import org.ovirt.engine.core.common.errors.*;
import org.ovirt.engine.core.common.vdscommands.*;
public class SpmStopVDSCommand<P extends SpmStopVDSCommandParameters> extends VdsBrokerCommand<P> {
public SpmStopVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void ExecuteVdsBrokerCommand() {
try {
if (canVdsBeReached()) {
boolean performSpmStop = true;
try {
VDSReturnValue vdsReturnValue = ResourceManager
.getInstance()
.runVdsCommand(VDSCommandType.HSMGetAllTasksStatuses,
new VdsIdVDSCommandParametersBase(getVds().getvds_id()));
performSpmStop =
vdsReturnValue.getReturnValue() != null ? ((java.util.HashMap<Guid, AsyncTaskStatus>) vdsReturnValue.getReturnValue()).isEmpty()
: true;
getVDSReturnValue().setSucceeded(vdsReturnValue.getSucceeded());
getVDSReturnValue().setVdsError(vdsReturnValue.getVdsError());
} catch (java.lang.Exception e2) {
log.infoFormat("SpmStopVDSCommand::Could not get tasks on vds {0} stopping SPM",
getVds().getvds_name());
}
if (performSpmStop) {
log.infoFormat("SpmStopVDSCommand::Stopping SPM on vds {0}, pool id {1}", getVds().getvds_name(),
getParameters().getStoragePoolId());
status = getBroker().spmStop(getParameters().getStoragePoolId().toString());
ProceedProxyReturnValue();
} else if (getVDSReturnValue().getVdsError() == null) {
getVDSReturnValue().setSucceeded(false);
VDSError error = new VDSError();
error.setCode(VdcBllErrors.TaskInProgress);
getVDSReturnValue().setVdsError(error);
} else if (getVDSReturnValue().getVdsError().getCode() == VdcBllErrors.VDS_NETWORK_ERROR) {
log.infoFormat(
"SpmStopVDSCommand::Could not get tasks on vds {0} - network exception, not stopping spm! pool id {1}",
getVds().getvds_name(),
getParameters().getStoragePoolId());
}
} else {
log.infoFormat("SpmStopVDSCommand:: vds {0} is in {1} status - not performing spm stop, pool id {2}",
getVds().getvds_name(), getVds().getstatus(), getParameters().getStoragePoolId());
getVDSReturnValue().setVdsError(new VDSError(VdcBllErrors.VDS_NETWORK_ERROR,
"Vds is in incorrect status"));
getVDSReturnValue().setSucceeded(false);
}
} catch (RuntimeException exp) {
log.warnFormat("could not stop spm of pool {0} on vds {1} - reason: {2}", getParameters()
.getStoragePoolId(), getParameters().getVdsId(), exp.toString());
getVDSReturnValue().setExceptionObject(exp);
getVDSReturnValue().setSucceeded(false);
}
}
/**
* Checks if the VDS is in a state where it can be reached or not, since if it can't be reached we don't want to
* try to stop the SPM because the command won't work.
* @return Can the VDS be reached or not?
*/
private boolean canVdsBeReached() {
VDSStatus vdsStatus = getVds().getstatus();
if (vdsStatus == VDSStatus.Down || vdsStatus == VDSStatus.Reboot) {
vdsStatus = getVds().getprevious_status();
}
return vdsStatus != VDSStatus.NonResponsive && getVds().getstatus() != VDSStatus.Problematic;
}
@Override
protected void ProceedProxyReturnValue() {
VdcBllErrors returnStatus = GetReturnValueFromStatus(getReturnStatus());
switch (returnStatus) {
case StoragePoolUnknown:
case SpmStatusError:
// ignore this, the parser can handle the empty result.
break;
case TaskInProgress:
getVDSReturnValue().setVdsError(new VDSError(returnStatus, getReturnStatus().mMessage));
getVDSReturnValue().setSucceeded(false);
break;
default:
super.ProceedProxyReturnValue();
InitializeVdsError(returnStatus);
break;
}
}
private static LogCompat log = LogFactoryCompat.getLog(SpmStopVDSCommand.class);
}