This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch fr03-nsx-reorder-acl-rules
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 9d5c8740699b000fa69d060d3ec04f8a7d50d230
Author: Pearl Dsilva <pearl1...@gmail.com>
AuthorDate: Fri Feb 2 10:16:08 2024 -0500

    NSX: Fix ACL rule removal on replacement and fix rule order (#11)
---
 .../java/org/apache/cloudstack/service/NsxElement.java   | 16 +++++++++++-----
 .../com/cloud/network/vpc/NetworkACLManagerImpl.java     |  1 +
 2 files changed, 12 insertions(+), 5 deletions(-)

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 dfb075aa312..05a7d141a86 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
@@ -112,6 +112,7 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -706,8 +707,9 @@ public class NsxElement extends AdapterBase implements  
DhcpServiceProvider, Dns
         if (!canHandle(network, Network.Service.NetworkACL)) {
             return false;
         }
-        List<NsxNetworkRule> nsxAddNetworkRules = new ArrayList<>();
+
         List<NsxNetworkRule> nsxDelNetworkRules = new ArrayList<>();
+        boolean success = true;
         for (NetworkACLItem rule : rules) {
             String privatePort = getPrivatePortRangeForACLRule(rule);
             NsxNetworkRule networkRule = new NsxNetworkRule.Builder()
@@ -723,22 +725,26 @@ public class NsxElement extends AdapterBase implements  
DhcpServiceProvider, Dns
                     .setService(Network.Service.NetworkACL)
                     .build();
             if (Arrays.asList(NetworkACLItem.State.Active, 
NetworkACLItem.State.Add).contains(rule.getState())) {
-                nsxAddNetworkRules.add(networkRule);
+                success = success && nsxService.addFirewallRules(network, 
List.of(networkRule));
             } else if (NetworkACLItem.State.Revoke == rule.getState()) {
                 nsxDelNetworkRules.add(networkRule);
             }
         }
-        boolean success = true;
+
         if (!nsxDelNetworkRules.isEmpty()) {
             success = nsxService.deleteFirewallRules(network, 
nsxDelNetworkRules);
             if (!success) {
                 LOGGER.warn("Not all firewall rules were successfully 
deleted");
             }
         }
-        return success && nsxService.addFirewallRules(network, 
nsxAddNetworkRules);
+        return success;
     }
 
-    @Override
+    private void reorderRules(List<? extends NetworkACLItem> rules) {
+        rules.sort((Comparator) (r1, r2) -> ((NetworkACLItem) r2).getNumber() 
- ((NetworkACLItem) r1).getNumber());
+
+    }
+        @Override
     public boolean applyFWRules(Network network, List<? extends FirewallRule> 
rules) throws ResourceUnavailableException {
 
         if (!canHandle(network, Network.Service.Firewall)) {
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 d95cf9ac7af..2e54474772d 100644
--- a/server/src/main/java/com/cloud/network/vpc/NetworkACLManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/NetworkACLManagerImpl.java
@@ -206,6 +206,7 @@ public class NetworkACLManagerImpl extends ManagerBase 
implements NetworkACLMana
             final List<NetworkACLItemVO> aclItems = 
_networkACLItemDao.listByACL(acl.getId());
             if (aclItems == null || aclItems.isEmpty()) {
                 s_logger.debug("New network ACL is empty. Revoke existing 
rules before applying ACL");
+            } else {
                 if (!revokeACLItemsForNetwork(network.getId())) {
                     throw new CloudRuntimeException("Failed to replace network 
ACL. Error while removing existing ACL items for network: " + network.getId());
                 }

Reply via email to