package org.ovirt.engine.core.bll;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.DetachAdGroupFromTimeLeasedPoolParameters;
import org.ovirt.engine.core.common.action.DetachUserFromTimeLeasedPoolParameters;
import org.ovirt.engine.core.common.action.StopVmParameters;
import org.ovirt.engine.core.common.action.StopVmTypeEnum;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.tags_vm_map;
import org.ovirt.engine.core.common.businessentities.time_lease_vm_pool_map;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
public class DetachAdGroupFromTimeLeasedPoolCommand<T extends DetachAdGroupFromTimeLeasedPoolParameters> extends
VmPoolToAdGroupBaseCommand<T> {
private boolean mInternal = false;
private final time_lease_vm_pool_map mMap;
public DetachAdGroupFromTimeLeasedPoolCommand(T parameters) {
super(parameters);
mMap = DbFacade.getInstance().getVmPoolDAO().getTimeLeasedVmPoolMapByIdForVmPool(parameters.getAdElementId(),
parameters.getVmPoolId());
mInternal = parameters.getIsInternal();
}
@Override
protected void executeCommand() {
List<tags_vm_map> map = DbFacade.getInstance().getTagDAO().getTimeLeasedUserVmsByAdGroupAndVmPoolId(
getAdGroup().getid(), getVmPoolId());
// first stop all vms
for (tags_vm_map tagVmMap : map) {
VM vm = DbFacade.getInstance().getVmDAO().getById(tagVmMap.getvm_id());
if (vm.getVmPoolId() != null && vm.getVmPoolId().equals(getVmPoolId()) && vm.isStatusUp()) {
StopVmParameters param = new StopVmParameters(vm.getvm_guid(), StopVmTypeEnum.NORMAL);
param.setSessionId(getParameters().getSessionId());
Backend.getInstance().runInternalAction(VdcActionType.StopVm, param);
}
}
// remove all users from time lease pool
for (tags_vm_map tagVmMap : map) {
DetachUserFromTimeLeasedPoolParameters param = new DetachUserFromTimeLeasedPoolParameters(getVmPoolId(),
tagVmMap.getvm_id(), false);
param.setSessionId(getParameters().getSessionId());
// old time-lease pools implementation
// should be re-implemented, don't remove comments below
// Backend.getInstance().runInternalAction(VdcActionType.DetachUserFromTimeLeasedPool,
// param);
}
DbFacade.getInstance().getVmPoolDAO().removeTimeLeasedVmPoolMap(getGroupId(), getVmPoolId());
// old time-leased pools implementation
// should be re-implemented, don't remove comments below
// tags tag =
// DbFacade.getInstance().GetAdElementTagByAdElement(getGroupId());
// DbFacade.getInstance().RemoveTagsVmPoolMap(tag.gettag_id(),
// getVmPoolId());
if (!mInternal) {
TimeLeasedVmPoolManager.getInstance().RemoveAction(mMap);
}
setSucceeded(true);
}
@Override
public AuditLogType getAuditLogTypeValue() {
if (mInternal) {
return getSucceeded() ? AuditLogType.USER_DETACH_AD_GROUP_FROM_TIME_LEASED_POOL_INTERNAL
: AuditLogType.USER_DETACH_AD_GROUP_FROM_TIME_LEASED_POOL_FAILED_INTERNAL;
} else {
return getSucceeded() ? AuditLogType.USER_DETACH_AD_GROUP_FROM_TIME_LEASED_POOL
: AuditLogType.USER_DETACH_AD_GROUP_FROM_TIME_LEASED_POOL_FAILED;
}
}
// TODO this command should be removed - AI Ofrenkel
@Override
public Map<Guid, VdcObjectType> getPermissionCheckSubjects() {
return Collections.singletonMap(Guid.Empty, VdcObjectType.Unknown);
}
}