package org.ovirt.engine.core.bll.network.vm; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.VmCommand; import org.ovirt.engine.core.bll.VmHandler; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.validator.MacAddressValidator; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.common.action.ActivateDeactivateVmNicParameters; import org.ovirt.engine.core.common.action.AddVmInterfaceParameters; import org.ovirt.engine.core.common.action.PlugAction; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.network.VmNic; import org.ovirt.engine.core.common.businessentities.storage.DiskVmElement; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineException; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.DiskVmElementDao; import org.ovirt.engine.core.dao.VmStaticDao; public abstract class AbstractVmInterfaceCommand<T extends AddVmInterfaceParameters> extends VmCommand<T> { @Inject private BackwardCompatibilityVnicHelper backwardCompatibilityVnicHelper; @Inject private VmStaticDao vmStaticDao; @Inject private DiskVmElementDao diskVmElementDao; protected AbstractVmInterfaceCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } protected AbstractVmInterfaceCommand(Guid commandId) { super(commandId); } protected boolean activateOrDeactivateNic(VmNic nic, PlugAction plugAction, boolean newNic) { ActivateDeactivateVmNicParameters parameters = new ActivateDeactivateVmNicParameters(nic, plugAction, newNic); parameters.setVmId(getParameters().getVmId()); VdcReturnValueBase returnValue = runInternalAction(VdcActionType.ActivateDeactivateVmNic, parameters, cloneContextAndDetachFromParent()); if (!returnValue.getSucceeded()) { propagateFailure(returnValue); } return returnValue.getSucceeded(); } protected void bumpVmVersion() { final VmStatic vmStaticData = getVm().getStaticData(); getCompensationContext().snapshotEntity(vmStaticData); vmStaticDao.incrementDbGeneration(vmStaticData.getId()); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__TYPE__INTERFACE); } protected boolean addMacToPool(String macAddress) { if (getMacPool().addMac(macAddress)) { return true; } else { throw new EngineException(EngineError.MAC_ADDRESS_IS_IN_USE); } } protected ValidationResult macAvailable() { return new MacAddressValidator(getMacPool(), getMacAddress()).isMacAssignableValidator(); } protected boolean uniqueInterfaceName(List<VmNic> interfaces) { return VmHandler.isNotDuplicateInterfaceName(interfaces, getInterfaceName(), getReturnValue().getValidationMessages()); } protected boolean pciAndIdeWithinLimit(VM vm, List<VmNic> allInterfaces) { List<DiskVmElement> diskVmElements = diskVmElementDao.getAllForVm(getVmId()); return validate(VmValidator.checkPciAndIdeLimit(vm.getOs(), vm.getCompatibilityVersion(), vm.getNumOfMonitors(), allInterfaces, diskVmElements, getVmDeviceUtils().hasVirtioScsiController(getVmId()), getVmDeviceUtils().hasWatchdog(getVmId()), getVmDeviceUtils().hasMemoryBalloon(getVmId()), getVmDeviceUtils().hasSoundDevice(getVmId()))); } protected ValidationResult vmTemplateEmpty() { return getInterface().getVmTemplateId() != null ? new ValidationResult(EngineMessage.NETWORK_INTERFACE_TEMPLATE_CANNOT_BE_SET) : ValidationResult.VALID; } protected boolean updateVnicForBackwardCompatibility(VmNic oldNic) { if (!validate(backwardCompatibilityVnicHelper.updateNicForBackwardCompatibility(getParameters().getInterface(), oldNic, getParameters().getNetworkName(), getParameters().isPortMirroring(), getVm().getStaticData(), getCurrentUser()))) { return false; } return true; } protected boolean updateVnicForBackwardCompatibility() { return updateVnicForBackwardCompatibility(null); } protected ValidationResult vmStatusLegal(VMStatus status) { return status == VMStatus.Up || status == VMStatus.Down || status == VMStatus.ImageLocked ? ValidationResult.VALID : new ValidationResult(EngineMessage.NETWORK_CANNOT_ADD_INTERFACE_WHEN_VM_STATUS_NOT_UP_DOWN_LOCKED); } protected String getMacAddress() { return getInterface().getMacAddress(); } protected VmNetworkInterface getInterface() { return getParameters().getInterface(); } public String getInterfaceName() { return getInterface().getName(); } }