package org.ovirt.engine.core.bll;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.action.RemoveVmFromPoolParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VmPoolParametersBase;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VmPoolDao;
public class RemoveVmFromPoolRunner extends PrevalidatingMultipleActionsRunner {
@Inject
private VmPoolDao vmPoolDao;
public RemoveVmFromPoolRunner(VdcActionType actionType, List<VdcActionParametersBase> parameters, CommandContext commandContext, boolean isInternal) {
super(actionType, parameters, commandContext, isInternal);
}
@Override
protected void runCommands() {
super.runCommands();
// remove also the pool if there is no VMs left in it
removePoolIfNeeded();
}
/**
* If there is no VMs left in the pool, removes the pool itself
*/
private void removePoolIfNeeded() {
if (!isPoolRemovalEnabled()) {
return;
}
Guid poolId = getPoolId();
if (poolId == null) {
return;
}
boolean allVmsRemoved = vmPoolDao.getVmPoolsMapByVmPoolId(poolId).size() == 0;
if (!allVmsRemoved) {
return;
}
VmPoolParametersBase removePoolParam = new VmPoolParametersBase(poolId);
removePoolParam.setSessionId(getSessionId());
Backend.getInstance().runInternalAction(VdcActionType.RemoveVmPool, removePoolParam, commandContext);
}
private boolean isPoolRemovalEnabled() {
return getFirstParam() != null ? getFirstParam().isRemovePoolUponDetachAllVMs() : false;
}
private String getSessionId() {
return getFirstParam() != null ? getFirstParam().getSessionId() : null;
}
private Guid getPoolId() {
return getFirstParam() != null ? getFirstParam().getVmPoolId() : null;
}
private RemoveVmFromPoolParameters getFirstParam() {
Iterator<?> iterator = getParameters() == null ? null : getParameters().iterator();
if (iterator != null && iterator.hasNext()) {
Object param = iterator.next();
if (param instanceof RemoveVmFromPoolParameters) {
return (RemoveVmFromPoolParameters) param;
}
}
return null;
}
}