package org.ovirt.engine.core.bll.network.dc; 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.cluster.NetworkClusterHelper; import org.ovirt.engine.core.bll.network.cluster.NetworkHelper; import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; import org.ovirt.engine.core.bll.provider.ProviderValidator; import org.ovirt.engine.core.bll.provider.network.NetworkProviderProxy; import org.ovirt.engine.core.bll.validator.NetworkValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.RemoveNetworkParameters; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.dao.provider.ProviderDao; import org.ovirt.engine.core.utils.transaction.TransactionSupport; @NonTransactiveCommandAttribute(forceCompensation = true) public class RemoveNetworkCommand<T extends RemoveNetworkParameters> extends NetworkCommon<T> { @Inject private NetworkClusterHelper networkClusterHelper; @Inject private NetworkDao networkDao; @Inject private ProviderDao providerDao; @Inject private NetworkClusterDao networkClusterDao; @Inject private VmDao vmDao; private Network network; private Provider<?> provider; public RemoveNetworkCommand(Guid id) { super(id); } public RemoveNetworkCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected Network getNetwork() { if (network == null) { network = networkDao.get(getParameters().getId()); } return network; } private Provider<?> getProvider() { if (provider == null) { provider = providerDao.get(getNetwork().getProvidedBy().getProviderId()); } return provider; } @Override protected void executeCommand() { setStoragePoolId(getNetwork().getDataCenterId()); TransactionSupport.executeInNewTransaction(() -> { removeVnicProfiles(); removeFromClusters(); getCompensationContext().snapshotEntity(getNetwork()); networkDao.remove(getNetwork().getId()); getCompensationContext().stateChanged(); return null; }); if (getNetwork().isExternal()) { if (getParameters().isRemoveFromNetworkProvider()) { removeExternalNetwork(); } } if (NetworkHelper.shouldRemoveNetworkFromHostUponNetworkRemoval(getNetwork())) { removeNetworkFromHosts(); } setSucceeded(true); } private void removeFromClusters() { for (NetworkCluster networkCluster : networkClusterDao.getAllForNetwork(getNetwork().getId())) { networkClusterHelper.removeNetworkAndReassignRoles(networkCluster); } } private void removeNetworkFromHosts() { NetworkHelper.removeNetworkFromHostsInDataCenter(getNetwork(), getStoragePoolId(), cloneContextAndDetachFromParent() ); } private void removeExternalNetwork() { NetworkProviderProxy proxy = ProviderProxyFactory.getInstance().create(getProvider()); proxy.remove(getNetwork().getProvidedBy().getExternalId()); } @Override protected void setActionMessageParameters() { super.setActionMessageParameters(); addValidationMessage(EngineMessage.VAR__ACTION__REMOVE); } @Override protected boolean validate() { NetworkValidator validator = new NetworkValidator(vmDao, networkDao.get(getNetwork().getId())); return validate(validator.networkIsSet(getParameters().getId())) && validate(validator.notRemovingManagementNetwork()) && validate(validator.notIscsiBondNetwork()) && validate(validator.networkNotUsedByVms()) && validate(validator.networkNotUsedByTemplates()) && validate(getRemoveExternalNetworkValidationResult()); } private ValidationResult getRemoveExternalNetworkValidationResult() { ProviderNetwork providerNetwork = getNetwork().getProvidedBy(); if (providerNetwork == null || !getParameters().isRemoveFromNetworkProvider()){ return ValidationResult.VALID; } ProviderValidator providerValidator = new ProviderValidator(getProvider()); return providerValidator.validateReadOnlyActions(); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_REMOVE_NETWORK : AuditLogType.NETWORK_REMOVE_NETWORK_FAILED; } }