package org.ovirt.engine.core.bll;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.hostedengine.HostedEngineHelper;
import org.ovirt.engine.core.bll.network.cluster.NetworkClusterHelper;
import org.ovirt.engine.core.bll.validator.HostValidator;
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.VdcActionType;
import org.ovirt.engine.core.common.action.VdsActionParameters;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.locks.LockingGroup;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.gluster.GlusterServiceVDSParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.network.NetworkDao;
import org.ovirt.engine.core.utils.lock.EngineLock;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
@NonTransactiveCommandAttribute
public class ActivateVdsCommand<T extends VdsActionParameters> extends VdsCommand<T> {
@Inject
private HostedEngineHelper hostedEngineHelper;
@Inject
private NetworkClusterHelper networkClusterHelper;
@Inject
private NetworkDao networkDao;
private boolean haMaintenanceFailed;
public ActivateVdsCommand(T parameters, CommandContext commandContext) {
super(parameters, commandContext);
}
/**
* Constructor for command creation when compensation is applied on startup
*/
protected ActivateVdsCommand(Guid commandId) {
super(commandId);
haMaintenanceFailed = false;
}
@Override
protected LockProperties applyLockProperties(LockProperties lockProperties) {
return lockProperties.withScope(Scope.Execution);
}
@Override
protected void executeCommand() {
final VDS vds = getVds();
try (EngineLock monitoringLock = acquireMonitorLock("Activate host")) {
executionHandler.updateSpecificActionJobCompleted(vds.getId(), VdcActionType.MaintenanceVds, false);
setSucceeded(setVdsStatus(VDSStatus.Unassigned).getSucceeded());
if (getSucceeded()) {
TransactionSupport.executeInNewTransaction(() -> {
// set network to operational / non-operational
List<Network> networks = networkDao.getAllForCluster(vds.getClusterId());
networkClusterHelper.setStatus(vds.getClusterId(), networks);
return null;
});
if (vds.getHighlyAvailableIsConfigured()) {
haMaintenanceFailed = !hostedEngineHelper.updateHaLocalMaintenanceMode(getVds(), false);
}
// Start glusterd service on the node, which would haven been stopped due to maintenance
if (vds.getClusterSupportsGlusterService()) {
runVdsCommand(VDSCommandType.ManageGlusterService,
new GlusterServiceVDSParameters(vds.getId(), Arrays.asList("glusterd"), "restart"));
}
}
}
}
@Override
protected boolean validate() {
HostValidator validator = HostValidator.createInstance(getVds());
return validate(validator.hostExists()) &&
validate(validator.validateStatusForActivation()) &&
validate(validator.validateUniqueId());
}
@Override
protected Map<String, Pair<String, String>> getExclusiveLocks() {
return Collections.singletonMap(getParameters().getVdsId().toString(),
LockMessagesMatchUtil.makeLockingPair(LockingGroup.VDS, EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED));
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__ACTIVATE);
addValidationMessage(EngineMessage.VAR__TYPE__HOST);
}
@Override
public AuditLogType getAuditLogTypeValue() {
if (getParameters().isRunSilent()) {
return getSucceeded()
? haMaintenanceFailed
? AuditLogType.VDS_ACTIVATE_MANUAL_HA_ASYNC
: AuditLogType.VDS_ACTIVATE_ASYNC
: AuditLogType.VDS_ACTIVATE_FAILED_ASYNC;
} else {
return getSucceeded()
? haMaintenanceFailed
? AuditLogType.VDS_ACTIVATE_MANUAL_HA
: AuditLogType.VDS_ACTIVATE
: AuditLogType.VDS_ACTIVATE_FAILED;
}
}
}