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.bll.validator.VirtIoRngValidator; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.RngDeviceParameters; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; import org.ovirt.engine.core.common.businessentities.VmEntityType; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDeviceDao; import org.ovirt.engine.core.dao.VmStaticDao; import org.ovirt.engine.core.dao.VmTemplateDao; /** * Base class for crud for random number generator devices */ public abstract class AbstractRngDeviceCommand<T extends RngDeviceParameters> extends CommandBase<T> { @Inject private VmStaticDao vmStaticDao; @Inject private VmTemplateDao vmTemplateDao; @Inject private VmDeviceDao vmDeviceDao; private VmBase cachedEntity = null; private VmEntityType templateType = null; private List<VmDevice> cachedRngDevices = null; private boolean blankTemplate = false; protected AbstractRngDeviceCommand(T parameters, CommandContext context) { super(parameters, context); } @Override protected void init() { super.init(); if (getParameters().getRngDevice() == null || getParameters().getRngDevice().getVmId() == null) { return; } Guid vmId = getParameters().getRngDevice().getVmId(); setVmId(vmId); if (getParameters().isVm()) { cachedEntity = vmStaticDao.get(vmId); } else { blankTemplate = VmTemplateHandler.BLANK_VM_TEMPLATE_ID.equals(vmId); VmTemplate template = vmTemplateDao.get(vmId); templateType = template.getTemplateType(); cachedEntity = template; } if (cachedEntity != null) { setClusterId(cachedEntity.getClusterId()); } cachedRngDevices = new ArrayList<>(); List<VmDevice> rngDevs = vmDeviceDao.getVmDeviceByVmIdAndType(vmId, VmDeviceGeneralType.RNG); if (rngDevs != null) { cachedRngDevices.addAll(rngDevs); } } @Override public List<PermissionSubject> getPermissionCheckSubjects() { List<PermissionSubject> permissionList = new ArrayList<>(); permissionList.add(new PermissionSubject(getParameters().getRngDevice().getVmId(), getParameters().isVm() ? VdcObjectType.VM : VdcObjectType.VmTemplate, getActionType().getActionGroup())); return permissionList; } @Override protected boolean validate() { if (getParameters().getRngDevice().getVmId() == null || cachedEntity == null) { return failValidation(getParameters().isVm() ? EngineMessage.ACTION_TYPE_FAILED_VM_NOT_FOUND : EngineMessage.ACTION_TYPE_FAILED_TEMPLATE_DOES_NOT_EXIST); } if (getParameters().isVm() && getVm() != null && getVm().isRunningOrPaused()) { return failValidation(EngineMessage.ACTION_TYPE_FAILED_VM_IS_RUNNING); } return true; } /** * Provides the new instance of VirtIoRngValidator * This method is here only to make it possible to mock it in tests */ protected VirtIoRngValidator getVirtioRngValidator() { return new VirtIoRngValidator(); } protected List<VmDevice> getRngDevices() { return cachedRngDevices; } protected VmEntityType getTemplateType() { return templateType; } public boolean isBlankTemplate() { return blankTemplate; } public VmBase getCachedEntity() { return cachedEntity; } }