package org.ovirt.engine.core.bll;
import java.util.Collections;
import org.ovirt.engine.core.compat.*;
import org.ovirt.engine.core.common.businessentities.*;
import org.ovirt.engine.core.common.action.*;
import org.ovirt.engine.core.common.interfaces.*;
import org.ovirt.engine.core.common.queries.*;
import org.ovirt.engine.core.dal.dbbroker.*;
public final class HighAvailableVmsDirector {
public static void TryRunHighAvailableVmsOnVmDown(Guid vmId) {
VM vm = DbFacade.getInstance().getVmDAO().getById(vmId);
TryRunHighAvailableVm(vm.getvds_group_name());
}
public static void TryRunHighAvailableVdsUp(Guid vdsId) {
VDS vds = DbFacade.getInstance().getVdsDAO().get(vdsId);
TryRunHighAvailableVm(vds.getvds_group_name());
}
private static void TryRunHighAvailableVm(String vdsGroupName) {
String searchStatement = String.format("Vms: status=down and cluster =%1$s", vdsGroupName);
SearchParameters p = new SearchParameters(searchStatement, SearchType.VM);
p.setMaxCount(Integer.MAX_VALUE);
java.util.ArrayList<IVdcQueryable> vmsFromDb = (java.util.ArrayList<IVdcQueryable>) Backend.getInstance()
.runInternalQuery(VdcQueryType.Search, p).getReturnValue();
if (vmsFromDb != null && vmsFromDb.size() != 0) {
java.util.ArrayList<VM> highlyAvailableVms = new java.util.ArrayList<VM>();
for (IVdcQueryable vm : vmsFromDb) {
VM currVm = (VM) ((vm instanceof VM) ? vm : null);
if (currVm != null && currVm.getauto_startup() && currVm.getExitStatus().getValue() != 0) {
highlyAvailableVms.add(currVm);
}
}
Collections.sort(highlyAvailableVms, Collections.reverseOrder(new VmsComparer()));
for (VM vm : highlyAvailableVms) {
if (!Backend.getInstance().runInternalAction(VdcActionType.RunVm, new RunVmParams(vm.getvmt_guid()))
.getSucceeded()) {
break;
}
}
}
}
}