package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.QuotaCRUDParameters;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.Permission;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.QuotaCluster;
import org.ovirt.engine.core.common.businessentities.QuotaStorage;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.PermissionDao;
import org.ovirt.engine.core.dao.QuotaDao;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
public class AddQuotaCommand extends QuotaCRUDCommand {
@Inject
private PermissionDao permissionDao;
@Inject
private QuotaDao quotaDao;
public AddQuotaCommand(QuotaCRUDParameters parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected void executeCommand() {
setQuotaParameter();
if (getParameters().isCopyPermissions()) {
TransactionSupport.executeInNewTransaction(() -> executeAddQuota());
} else {
executeAddQuota();
}
}
private Void executeAddQuota() {
quotaDao.save(getQuota());
if (getParameters().isCopyPermissions()) {
copyQuotaPermissions();
}
getReturnValue().setSucceeded(true);
setActionReturnValue(getQuota().getId());
return null;
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
List<PermissionSubject> permissionsSubject = new ArrayList<>();
permissionsSubject.add(new PermissionSubject(getStoragePoolId(),
VdcObjectType.StoragePool,
getActionType().getActionGroup()));
if (getParameters().isCopyPermissions()) {
permissionsSubject.add(new PermissionSubject(getStoragePoolId(),
VdcObjectType.StoragePool,
ActionGroup.MANIPULATE_PERMISSIONS));
}
return permissionsSubject;
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__ADD);
addValidationMessage(EngineMessage.VAR__TYPE__QUOTA);
}
/**
* Set quota from the parameter
*/
private void setQuotaParameter() {
Quota quotaParameter = getParameters().getQuota();
quotaParameter.setId(Guid.newGuid());
if (quotaParameter.getQuotaStorages() != null) {
for (QuotaStorage quotaStorage : quotaParameter.getQuotaStorages()) {
quotaStorage.setQuotaId(quotaParameter.getId());
quotaStorage.setQuotaStorageId(Guid.newGuid());
}
}
if (quotaParameter.getQuotaClusters() != null) {
for (QuotaCluster quotaCluster : quotaParameter.getQuotaClusters()) {
quotaCluster.setQuotaId(quotaParameter.getId());
quotaCluster.setQuotaClusterId(Guid.newGuid());
}
}
setQuotaThresholdDefaults(quotaParameter);
setQuota(quotaParameter);
}
// Setting defaults for hard and soft limits, for REST
private void setQuotaThresholdDefaults(Quota quotaParameter) {
if (quotaParameter.getGraceStoragePercentage() == 0) {
quotaParameter.setGraceStoragePercentage(Config.<Integer> getValue(ConfigValues.QuotaGraceStorage));
}
if (quotaParameter.getGraceClusterPercentage() == 0) {
quotaParameter.setGraceClusterPercentage(Config.<Integer>getValue(ConfigValues.QuotaGraceCluster));
}
if (quotaParameter.getThresholdStoragePercentage() == 0) {
quotaParameter.setThresholdStoragePercentage(Config.<Integer> getValue(ConfigValues.QuotaThresholdStorage));
}
if (quotaParameter.getThresholdClusterPercentage() == 0) {
quotaParameter.setThresholdClusterPercentage(Config.<Integer>getValue(ConfigValues.QuotaThresholdCluster));
}
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_ADD_QUOTA : AuditLogType.USER_FAILED_ADD_QUOTA;
}
private void copyQuotaPermissions() {
UniquePermissionsSet permissionsToAdd = new UniquePermissionsSet();
List<Permission> vmPermissions =
permissionDao.getAllForEntity(getParameters().getQuotaId(), getEngineSessionSeqId(), false);
for (Permission vmPermission : vmPermissions) {
permissionsToAdd.addPermission(vmPermission.getAdElementId(), vmPermission.getRoleId(),
getQuotaId(), vmPermission.getObjectType());
}
if (!permissionsToAdd.isEmpty()) {
List<Permission> permissionsList = permissionsToAdd.asPermissionList();
MultiLevelAdministrationHandler.addPermission(permissionsList.toArray(new Permission[permissionsList.size()]));
}
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(CreateEntity.class);
return super.getValidationGroups();
}
}