package org.ovirt.engine.core.bll.provider.network; import javax.inject.Inject; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.network.dc.AddNetworkCommand; import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; import org.ovirt.engine.core.bll.provider.ProviderValidator; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.provider.ProviderDao; import org.ovirt.engine.core.utils.transaction.TransactionSupport; @NonTransactiveCommandAttribute public class AddNetworkOnProviderCommand<T extends AddNetworkStoragePoolParameters> extends AddNetworkCommand<T> { @Inject private ProviderDao providerDao; @Inject private VmDao vmDao; private Provider<?> provider; public AddNetworkOnProviderCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected LockProperties applyLockProperties(LockProperties lockProperties) { return lockProperties; } private Provider<?> getProvider() { if (provider == null) { provider = providerDao.get(getNetwork().getProvidedBy().getProviderId()); } return provider; } @Override protected boolean validate() { ProviderValidator validator = new ProviderValidator(getProvider()); return validate(validator.providerIsSet()) && validate(validator.validateReadOnlyActions()) && super.validate(); } @Override protected void executeCommand() { NetworkProviderProxy proxy = ProviderProxyFactory.getInstance().create(getProvider()); getNetwork().getProvidedBy().setExternalId(proxy.add(getNetwork())); getNetwork().setVlanId(null); getNetwork().setLabel(null); TransactionSupport.executeInNewTransaction(() -> { super.executeCommand(); getReturnValue().setActionReturnValue(getNetwork()); return null; }); } @Override protected AddNetworkValidator getNetworkValidator() { return new AddNetworkOnProviderValidator(vmDao, getNetwork()); } protected class AddNetworkOnProviderValidator extends AddNetworkValidator { public AddNetworkOnProviderValidator(VmDao vmDao, Network network) { super(vmDao, network); } /** * External networks can't have an MTU set since the provider can't assure this. */ @Override public ValidationResult mtuValid() { return network.getMtu() == 0 ? ValidationResult.VALID : new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_EXTERNAL_NETWORK_CANNOT_HAVE_MTU); } /** * VLAN ID is not relevant in this case, so don't check it. */ @Override public ValidationResult vlanIdNotUsed() { return ValidationResult.VALID; } } }