package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.action.MigrateVmToServerParameters;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
public class MigrateVmToServerCommand<T extends MigrateVmToServerParameters> extends MigrateVmCommand<T> {
public MigrateVmToServerCommand(T parameters) {
super(parameters);
setVdsDestinationId(parameters.getVdsId());
getVdsSelector().setDestinationVdsId(getVdsDestinationId());
}
@Override
protected boolean canDoAction() {
VM vm = getVm();
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__MIGRATE);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM);
Guid destinationId = getVdsDestinationId();
VDS vds = DbFacade.getInstance().getVdsDAO().get(destinationId);
if (vds == null) {
addCanDoActionMessage(VdcBllMessages.VDS_INVALID_SERVER_ID);
return false;
} else if (vm.getrun_on_vds() != null && vm.getrun_on_vds().equals(destinationId)) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_MIGRATION_TO_SAME_HOST);
return false;
} else if (!vm.getvds_group_id().equals(getDestinationVds().getvds_group_id())) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_MIGRATE_BETWEEN_TWO_CLUSTERS);
return false;
} else {
return super.canDoAction();
}
}
@Override
protected void rerunInternal() {
/**
* 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
*/
DecreasePendingVms(getDestinationVds().getvds_id());
_isRerun = false;
setSucceeded(false);
determineMigrationFailueForAuditLog();
log();
}
}