package org.ovirt.engine.core.bll;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.LockProperties;
import org.ovirt.engine.core.common.action.LockProperties.Scope;
import org.ovirt.engine.core.common.action.MigrateVmToServerParameters;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
@NonTransactiveCommandAttribute
public class MigrateVmToServerCommand<T extends MigrateVmToServerParameters> extends MigrateVmCommand<T> {
public MigrateVmToServerCommand(T parameters, CommandContext commandContext) {
super(parameters, commandContext);
}
@Override
public void init() {
setDestinationVdsId(getParameters().getVdsId());
}
@Override
protected LockProperties applyLockProperties(LockProperties lockProperties) {
return lockProperties.withScope(Scope.Command);
}
@Override
protected boolean validate() {
if (getDestinationVds() == null) {
return failValidation(EngineMessage.VDS_INVALID_SERVER_ID);
}
if (getDestinationVds().getStatus() != VDSStatus.Up) {
addValidationMessage(EngineMessage.VAR__HOST_STATUS__UP);
return failValidation(EngineMessage.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL);
}
if (!super.validate()) {
return false;
}
if (getParameters().getTargetClusterId() != null && !getParameters().getTargetClusterId().equals(getDestinationVds().getClusterId())) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_DESTINATION_HOST_NOT_IN_DESTINATION_CLUSTER);
}
if (getVm().getRunOnVds() != null && getVm().getRunOnVds().equals(getDestinationVdsId())) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_MIGRATION_TO_SAME_HOST);
}
if (!getVm().getClusterId().equals(getDestinationVds().getClusterId()) && getParameters().getTargetClusterId() == null) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_MIGRATE_BETWEEN_TWO_CLUSTERS);
}
return true;
}
@Override
protected AuditLogType getAuditLogForMigrationFailure() {
return AuditLogType.VM_MIGRATION_TO_SERVER_FAILED;
}
/**
* In case we failed to migrate to that specific server, the VM should no longer be pending,
* and we report failure, without an attempt to rerun
*/
@Override
public void rerun() {
// make VM property to null in order to refresh it from db
setVm(null);
determineMigrationFailureForAuditLog();
runningFailed();
}
@Override
protected List<Guid> getVdsWhiteList() {
return Arrays.asList(getDestinationVdsId());
}
@Override
public Map<String, String> getJobMessageProperties() {
jobProperties = super.getJobMessageProperties();
if (getDestinationVdsName() != null) {
jobProperties.put(VdcObjectType.VDS.name().toLowerCase(), getDestinationVdsName());
}
return jobProperties;
}
}