package org.ovirt.engine.core.bll.profiles;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.VmBase;
import org.ovirt.engine.core.common.businessentities.profiles.CpuProfile;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.PermissionDao;
import org.ovirt.engine.core.dao.profiles.CpuProfileDao;
@Singleton
public class CpuProfileHelper {
@Inject
CpuProfileDao cpuProfileDao;
@Inject
PermissionDao permissionDao;
public static CpuProfile createCpuProfile(Guid clusterId, String name) {
CpuProfile cpuProfile = new CpuProfile();
cpuProfile.setId(Guid.newGuid());
cpuProfile.setName(name);
cpuProfile.setClusterId(clusterId);
return cpuProfile;
}
public ValidationResult assignFirstCpuProfile(VmBase vmBase, Guid userId) {
List<CpuProfile> cpuProfileWithPermissions = cpuProfileDao.getAllForCluster(
vmBase.getClusterId(), userId, !Guid.isNullOrEmpty(userId), ActionGroup.ASSIGN_CPU_PROFILE);
/* TODO use a properly selected default CPU profile for the cluster once the API becomes available
see bug https://bugzilla.redhat.com/show_bug.cgi?id=1262293 for the explanation. We should probably
add a permission check as well to make sure the profile is available to the user who added the VM. */
if (cpuProfileWithPermissions.isEmpty()) {
return new ValidationResult(EngineMessage.ACTION_TYPE_CPU_PROFILE_EMPTY);
}
vmBase.setCpuProfileId(cpuProfileWithPermissions.get(0).getId());
return ValidationResult.VALID;
}
private boolean checkPermissions(Guid cpuProfileId, Guid userId) {
return Guid.isNullOrEmpty(userId) ||
permissionDao.getEntityPermissions(userId,
ActionGroup.ASSIGN_CPU_PROFILE,
cpuProfileId,
VdcObjectType.CpuProfile) != null;
}
public ValidationResult setAndValidateCpuProfile(VmBase vmBase, Guid userId) {
if (vmBase.getCpuProfileId() == null) {
return assignFirstCpuProfile(vmBase, userId);
}
Guid clusterId = vmBase.getClusterId();
if (clusterId == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_CPU_PROFILE_CLUSTER_NOT_PROVIDED);
}
CpuProfile fetchedCpuProfile = cpuProfileDao.get(vmBase.getCpuProfileId());
if (fetchedCpuProfile == null) {
return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_CPU_PROFILE_NOT_FOUND);
}
if (!clusterId.equals(fetchedCpuProfile.getClusterId())) {
return new ValidationResult(EngineMessage.ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER);
}
if (!checkPermissions(vmBase.getCpuProfileId(), userId)) {
return new ValidationResult(EngineMessage.ACTION_TYPE_NO_PERMISSION_TO_ASSIGN_CPU_PROFILE,
String.format("$cpuProfileId %s",
vmBase.getCpuProfileId()),
String.format("$cpuProfileName %s",
fetchedCpuProfile.getName()));
}
return ValidationResult.VALID;
}
}