diff --git a/api/src/main/java/com/cloud/network/element/NetworkACLServiceProvider.java b/api/src/main/java/com/cloud/network/element/NetworkACLServiceProvider.java index 92d3519d596..852a650cfcd 100644 --- a/api/src/main/java/com/cloud/network/element/NetworkACLServiceProvider.java +++ b/api/src/main/java/com/cloud/network/element/NetworkACLServiceProvider.java @@ -33,6 +33,6 @@ public interface NetworkACLServiceProvider extends NetworkElement { */ boolean applyNetworkACLs(Network config, List rules) throws ResourceUnavailableException; - boolean reorderAclRules(Vpc vpc, List networkACLItems); + boolean reorderAclRules(Vpc vpc, List networks, List networkACLItems); } diff --git a/engine/components-api/src/main/java/com/cloud/network/vpc/NetworkACLManager.java b/engine/components-api/src/main/java/com/cloud/network/vpc/NetworkACLManager.java index 9d1caa1c031..de69b894183 100644 --- a/engine/components-api/src/main/java/com/cloud/network/vpc/NetworkACLManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/vpc/NetworkACLManager.java @@ -19,6 +19,7 @@ package com.cloud.network.vpc; import java.util.List; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; import com.cloud.network.dao.NetworkVO; public interface NetworkACLManager { @@ -92,5 +93,5 @@ public interface NetworkACLManager { boolean applyACLToPrivateGw(PrivateGateway gateway) throws ResourceUnavailableException; - boolean reorderAclRules(VpcVO vpc, List networkACLItems); + boolean reorderAclRules(VpcVO vpc, List networks, List networkACLItems); } diff --git a/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/element/BigSwitchBcfElement.java b/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/element/BigSwitchBcfElement.java index c4b8de2ed95..9677d3b13ab 100644 --- a/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/element/BigSwitchBcfElement.java +++ b/plugins/network-elements/bigswitch/src/main/java/com/cloud/network/element/BigSwitchBcfElement.java @@ -701,7 +701,7 @@ NetworkACLServiceProvider, FirewallServiceProvider, ResourceStateAdapter { } @Override - public boolean reorderAclRules(Vpc vpc, List networkACLItems) { + public boolean reorderAclRules(Vpc vpc, List networks, List networkACLItems) { return true; } diff --git a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailVpcElementImpl.java b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailVpcElementImpl.java index 58169f22d7b..cdbda514d88 100644 --- a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailVpcElementImpl.java +++ b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailVpcElementImpl.java @@ -186,7 +186,7 @@ public class ContrailVpcElementImpl extends ContrailElementImpl implements Netwo } @Override - public boolean reorderAclRules(Vpc vpc, List networkACLItems) { + public boolean reorderAclRules(Vpc vpc, List networks, List networkACLItems) { return true; } diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java index e1f921957b5..24e80b2130c 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java @@ -66,7 +66,6 @@ import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.StaticNat; import com.cloud.network.vpc.NetworkACLItem; -import com.cloud.network.vpc.NetworkACLItemVO; import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; @@ -90,9 +89,7 @@ import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.VMInstanceDao; import net.sf.ehcache.config.InvalidConfigurationException; -import org.apache.cloudstack.NsxAnswer; import org.apache.cloudstack.StartupNsxCommand; -import org.apache.cloudstack.agent.api.DeleteNsxDistributedFirewallRulesCommand; import org.apache.cloudstack.api.command.admin.internallb.ConfigureInternalLoadBalancerElementCmd; import org.apache.cloudstack.api.command.admin.internallb.CreateInternalLoadBalancerElementCmd; import org.apache.cloudstack.api.command.admin.internallb.ListInternalLoadBalancerElementsCmd; @@ -709,17 +706,22 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns } @Override - public boolean reorderAclRules(Vpc vpc, List networkACLItems) { + public boolean reorderAclRules(Vpc vpc, List networks, List networkACLItems) { List aclRulesList = new ArrayList<>(); for (NetworkACLItem rule : networkACLItems) { String privatePort = getPrivatePortRangeForACLRule(rule); aclRulesList.add(getNsxNetworkRuleForAcl(rule, privatePort)); } - DeleteNsxDistributedFirewallRulesCommand command = new DeleteNsxDistributedFirewallRulesCommand(vpc.getDomainId(), - vpc.getAccountId(), vpc.getZoneId(), vpc.getId(), network.getId(), netRules); - NsxAnswer result = nsxControllerUtils.sendNsxCommand(command, network.getDataCenterId()); - return result.getResult(); - return true; + for (Network network: networks) { + nsxService.deleteFirewallRules(network, aclRulesList); + } + boolean success = true; + for (Network network : networks) { + for (NsxNetworkRule aclRule : aclRulesList) { + success = success && nsxService.addFirewallRules(network, List.of(aclRule)); + } + } + return success; } private NsxNetworkRule getNsxNetworkRuleForAcl(NetworkACLItem rule, String privatePort) { diff --git a/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java index 6b79950949d..acd58400dc4 100644 --- a/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java +++ b/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java @@ -532,7 +532,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc } @Override - public boolean reorderAclRules(Vpc vpc, List networkACLItems) { + public boolean reorderAclRules(Vpc vpc, List networks, List networkACLItems) { return true; } diff --git a/server/src/main/java/com/cloud/network/vpc/NetworkACLManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/NetworkACLManagerImpl.java index 6e0d8a6162e..d97b0c45b4a 100644 --- a/server/src/main/java/com/cloud/network/vpc/NetworkACLManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/NetworkACLManagerImpl.java @@ -21,7 +21,6 @@ import java.util.List; import javax.inject.Inject; -import com.cloud.network.nsx.NsxProvider; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.PublishScope; @@ -371,12 +370,12 @@ public class NetworkACLManagerImpl extends ManagerBase implements NetworkACLMana } @Override - public boolean reorderAclRules(VpcVO vpc, List networkACLItems) { + public boolean reorderAclRules(VpcVO vpc, List networks, List networkACLItems) { List nsxElements = new ArrayList<>(); nsxElements.add((NetworkACLServiceProvider) _ntwkModel.getElementImplementingProvider(Network.Provider.Nsx.getName())); try { for (final NetworkACLServiceProvider provider : nsxElements) { - return provider.reorderAclRules(networkACLItems); + return provider.reorderAclRules(vpc, networks, networkACLItems); } } catch (final Exception ex) { s_logger.debug("Failed to reorder ACLs on NSX due to: " + ex.getLocalizedMessage()); diff --git a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java index 4dc62babe1c..3bd4d0e368a 100644 --- a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java @@ -990,9 +990,10 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ VpcVO vpc = _vpcDao.findById(lockedAcl.getVpcId()); final DataCenter dc = _entityMgr.findById(DataCenter.class, vpc.getZoneId()); final NsxProviderVO nsxProvider = nsxProviderDao.findByZoneId(dc.getId()); - if (Objects.nonNull(nsxProvider)) { + List networks = _networkDao.listByAclId(lockedAcl.getId()); + if (Objects.nonNull(nsxProvider) && !networks.isEmpty()) { allAclRules = getAllAclRulesSortedByNumber(lockedAcl.getId()); - _networkAclMgr.reorderAclRules(vpc, allAclRules); + _networkAclMgr.reorderAclRules(vpc, networks, allAclRules); } return networkACLItem; } finally {