package org.ovirt.engine.core.vdsbroker.vdsbroker; import org.ovirt.engine.core.compat.*; import org.ovirt.engine.core.common.*; import org.ovirt.engine.core.common.businessentities.*; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.*; import org.ovirt.engine.core.common.vdscommands.*; public class FenceVdsVDSCommand<P extends FenceVdsVDSCommandParameters> extends VdsBrokerCommand<P> { private FenceStatusReturnForXmlRpc _result; public FenceVdsVDSCommand(P parameters) { super(parameters); } /** * Alerts the specified log type. * * @param logType * Type of the log. */ private void Alert(AuditLogType logType) { AuditLogableBase alert = new AuditLogableBase(); alert.setVdsId(getParameters().getTargetVdsID()); AlertDirector.Alert(alert, logType); } /** * Alerts the specified log type. * * @param logType * Type of the log. * @param reason * The reason. */ private void Alert(AuditLogType logType, String reason) { AuditLogableBase alert = new AuditLogableBase(); alert.setVdsId(getParameters().getTargetVdsID()); alert.AddCustomValue("Reason", reason); AlertDirector.Alert(alert, logType); } /** * Alerts if power management status failed. * * @param reason * The reason. */ protected void AlertPowerManagementStatusFailed(String reason) { Alert(AuditLogType.VDS_ALERT_FENCING_TEST_FAILED, reason); } @Override protected void ExecuteVdsBrokerCommand() { VdsFencingOptions vdsFencingOptions = new VdsFencingOptions(getParameters().getType(), getParameters().getOptions()); String options = vdsFencingOptions.ToInternalString(); // ignore starting already started host or stopping already stopped host. if (!isAlreadyInRequestedStatus(options)) { _result = getBroker().fenceNode(getParameters().getIp(), "", getParameters().getType(), getParameters().getUser(), getParameters().getPassword(), GetActualActionName(), "", options); ProceedProxyReturnValue(); getVDSReturnValue().setSucceeded(false); if (getParameters().getAction() == FenceActionType.Status && _result.Power != null) { String stat = _result.Power.toLowerCase(); String msg = _result.mStatus.mMessage; if (StringHelper.EqOp(stat, "on") || StringHelper.EqOp(stat, "off")) { getVDSReturnValue().setSucceeded(true); } else { if (!getParameters().getTargetVdsID().equals(Guid.Empty)) { AlertPowerManagementStatusFailed(msg); } } FenceStatusReturnValue fenceStatusReturnValue = new FenceStatusReturnValue(stat, msg); setReturnValue(fenceStatusReturnValue); } else { setReturnValue((_result.mStatus.mMessage != null) ? _result.mStatus.mMessage : ""); getVDSReturnValue().setSucceeded(true); } } else { handleSkippedOperation(); } } /** * Handles cases where fencing operation was skipped (host is already in requested state) */ private void handleSkippedOperation() { FenceStatusReturnValue fenceStatusReturnValue = new FenceStatusReturnValue(FenceStatusReturnValue.SKIPPED,""); AuditLogableBase auditLogable = new AuditLogableBase(); auditLogable.AddCustomValue("HostName", (DbFacade.getInstance().getVdsDAO().get(getParameters().getTargetVdsID())).getvds_name()); auditLogable.AddCustomValue("AgentStatus", GetActualActionName()); auditLogable.AddCustomValue("Operation", getParameters().getAction().toString()); AuditLogDirector.log(auditLogable, AuditLogType.VDS_ALREADY_IN_REQUESTED_STATUS); getVDSReturnValue().setSucceeded(true); setReturnValue(fenceStatusReturnValue); } /** * Checks if Host is already in the requested status. * If Host is Down and a Stop command is issued or * if Host is Up and a Start command is issued * command should do nothing. * * @param options * Fencing options passed to the agent * @return */ private boolean isAlreadyInRequestedStatus(String options) { boolean ret = false; FenceActionType action = getParameters().getAction(); _result = getBroker().fenceNode(getParameters().getIp(), "", getParameters().getType(), getParameters().getUser(), getParameters().getPassword(), "status", "", options); if (_result.Power != null) { String status = _result.Power.toLowerCase(); if ((action == FenceActionType.Start && status.equals("on")) || action == FenceActionType.Stop && status.equals("off")) ret = true; } return ret; } @Override protected StatusForXmlRpc getReturnStatus() { return (_result.mStatus != null) ? _result.mStatus : new StatusForXmlRpc(); } private String GetActualActionName() { String actualActionName; switch (getParameters().getAction()) { case Restart: actualActionName = "reboot"; break; case Start: actualActionName = "on"; break; case Stop: actualActionName = "off"; break; default: actualActionName = "status"; break; } return actualActionName; } @Override protected Object getReturnValueFromBroker() { return _result; } }