package org.ovirt.engine.core.bll.network.template; 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.VmNicValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddVmTemplateInterfaceParameters; import org.ovirt.engine.core.common.businessentities.VmEntityType; import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.network.VmNic; 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.compat.Version; import org.ovirt.engine.core.dao.network.VmNicDao; public class AddVmTemplateInterfaceCommand<T extends AddVmTemplateInterfaceParameters> extends VmTemplateInterfaceCommandBase<T> { @Inject private VmNicDao vmNicDao; public AddVmTemplateInterfaceCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected void executeCommand() { getParameters().getInterface().setVmTemplateId(getParameters().getVmTemplateId()); getParameters().getInterface().setId(Guid.newGuid()); getParameters().getInterface().setSpeed( VmInterfaceType.forValue( getParameters().getInterface().getType()).getSpeed()); vmNicDao.save(getParameters().getInterface()); getVmDeviceUtils().addInterface( getParameters().getVmTemplateId(), getParameters().getInterface().getId(), getParameters().getInterface().isPlugged(), getParameters().getInterface().isPassthrough()); setSucceeded(true); } @Override protected boolean validate() { if (!super.validate()) { return false; } List<VmNic> interfaces = vmNicDao.getAllForTemplate(getParameters().getVmTemplateId()); if (!interfaceNameUnique(interfaces) || !validate(templateExists()) || !validate(linkedToTemplate())) { return false; } vmTemplateHandler.updateDisksFromDb(getVmTemplate()); // not relevant for instance types - will be checked when a VM will be created out of it if (getVmTemplate().getTemplateType() != VmEntityType.INSTANCE_TYPE) { if (!updateVnicForBackwardCompatibility()) { return false; } List<VmNic> interfacesForCheckPciLimit = new ArrayList<>(interfaces); interfacesForCheckPciLimit.add(getParameters().getInterface()); if (!validate(VmValidator.checkPciAndIdeLimit(getVmTemplate().getOsId(), getCluster().getCompatibilityVersion(), getVmTemplate().getNumOfMonitors(), interfacesForCheckPciLimit, getTemplateDiskVmElements(), getVmDeviceUtils().hasVirtioScsiController(getVmTemplate().getId()), getVmDeviceUtils().hasWatchdog(getVmTemplate().getId()), getVmDeviceUtils().hasMemoryBalloon(getVmTemplate().getId()), getVmDeviceUtils().hasSoundDevice(getVmTemplate().getId())))) { return false; } Version clusterCompatibilityVersion = getCluster().getCompatibilityVersion(); VmNicValidator nicValidator = new VmNicValidator(getParameters().getInterface(), clusterCompatibilityVersion, getVmTemplate().getOsId()); return validate(nicValidator.isCompatibleWithOs()) && validate(nicValidator.profileValid(getVmTemplate().getClusterId())) && validate(nicValidator.typeMatchesProfile()) && validate(nicValidator.passthroughIsLinked()); } return true; } @Override protected List<Class<?>> getValidationGroups() { addValidationGroup(CreateEntity.class); return super.getValidationGroups(); } /** * Set the parameters for bll messages, such as type and action, */ @Override protected void setActionMessageParameters() { super.setActionMessageParameters(); addValidationMessage(EngineMessage.VAR__ACTION__ADD); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_ADD_TEMPLATE_INTERFACE : AuditLogType.NETWORK_ADD_TEMPLATE_INTERFACE_FAILED; } @Override public List<PermissionSubject> getPermissionCheckSubjects() { List<PermissionSubject> subjects = super.getPermissionCheckSubjects(); VmNetworkInterface nic = getParameters().getInterface(); if (nic != null && nic.getVnicProfileId() != null && getVmTemplate() != null) { subjects.add(new PermissionSubject(nic.getVnicProfileId(), VdcObjectType.VnicProfile, getActionType().getActionGroup())); } return subjects; } }