This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch nsx-additional-fixes in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 4a56dbba92f274869f69940ea0c77f29f6e00f2f Author: Pearl Dsilva <pearl1...@gmail.com> AuthorDate: Tue Feb 27 12:31:22 2024 -0500 NSX: Re-add network rules when network is updated --- .../apache/cloudstack/resource/NsxResource.java | 4 ++- .../apache/cloudstack/service/NsxApiClient.java | 34 ++++++++++++++++++---- .../org/apache/cloudstack/service/NsxElement.java | 7 ++--- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java index 453a26016d7..06f6f9c1bcb 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java @@ -387,7 +387,9 @@ public class NsxResource implements ServerResource { String privatePort = cmd.getPrivatePort(); String service = privatePort.contains("-") ? nsxApiClient.getServicePath(ruleName, privatePort, cmd.getProtocol(), null, null) : nsxApiClient.getNsxInfraServices(ruleName, privatePort, cmd.getProtocol(), null, null); - + if (nsxApiClient.doesPfRuleExist(ruleName, tier1GatewayName, cmd.getNetworkResourceName())) { + return new NsxAnswer(cmd, true, null); + } nsxApiClient.createPortForwardingRule(ruleName, tier1GatewayName, cmd.getNetworkResourceName(), cmd.getPublicIp(), cmd.getVmIp(), cmd.getPublicPort(), service); } catch (Exception e) { diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java index 6091130c476..940464d3ba2 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java @@ -124,6 +124,7 @@ public class NsxApiClient { protected static final String NSX_LB_PASSIVE_MONITOR = "/infra/lb-monitor-profiles/default-passive-lb-monitor"; protected static final String TCP_MONITOR_PROFILE = "LBTcpMonitorProfile"; protected static final String UDP_MONITOR_PROFILE = "LBUdpMonitorProfile"; + protected static final String NAT_ID = "USER"; private enum PoolAllocation { ROUTING, LB_SMALL, LB_MEDIUM, LB_LARGE, LB_XLARGE } @@ -342,18 +343,16 @@ public class NsxApiClient { private void removeTier1GatewayNatRules(String tier1Id) { NatRules natRulesService = (NatRules) nsxService.apply(NatRules.class); - String natId = "USER"; - PolicyNatRuleListResult result = natRulesService.list(tier1Id, natId, null, false, null, null, null, null); + PolicyNatRuleListResult result = natRulesService.list(tier1Id, NAT_ID, null, false, null, null, null, null); List<PolicyNatRule> natRules = result.getResults(); if (CollectionUtils.isEmpty(natRules)) { logger.debug(String.format("Didn't find any NAT rule to remove on the Tier 1 Gateway %s", tier1Id)); } else { for (PolicyNatRule natRule : natRules) { logger.debug(String.format("Removing NAT rule %s from Tier 1 Gateway %s", natRule.getId(), tier1Id)); - natRulesService.delete(tier1Id, natId, natRule.getId()); + natRulesService.delete(tier1Id, NAT_ID, natRule.getId()); } } - } public String getDefaultSiteId() { @@ -566,13 +565,23 @@ public class NsxApiClient { natService.patch(tier1GatewayName, NatId.USER.name(), ruleName, rule); } catch (Error error) { ApiError ae = error.getData()._convertTo(ApiError.class); - String msg = String.format("Failed to delete NSX Port-forward rule %s for network: %s, due to %s", + String msg = String.format("Failed to add NSX Port-forward rule %s for network: %s, due to %s", ruleName, networkName, ae.getErrorMessage()); logger.error(msg); throw new CloudRuntimeException(msg); } } + public boolean doesPfRuleExist(String ruleName, String tier1GatewayName, String networkName) { + try { + NatRules natService = (NatRules) nsxService.apply(NatRules.class); + PolicyNatRule rule = natService.get(tier1GatewayName, NAT_ID, ruleName); + return !Objects.isNull(rule); + } catch (Error error) { + return false; + } + } + List<LBPoolMember> getLbPoolMembers(List<NsxLoadBalancerMember> memberList, String tier1GatewayName) { List<LBPoolMember> members = new ArrayList<>(); for (NsxLoadBalancerMember member : memberList) { @@ -678,6 +687,9 @@ public class NsxApiClient { String lbVirtualServerName = getVirtualServerName(tier1GatewayName, lbId); String lbServiceName = getLoadBalancerName(tier1GatewayName); LbVirtualServers lbVirtualServers = (LbVirtualServers) nsxService.apply(LbVirtualServers.class); + if (Objects.nonNull(getLbVirtualServerService(lbVirtualServers, lbServiceName))) { + return; + } LBVirtualServer lbVirtualServer = new LBVirtualServer.Builder() .setId(lbVirtualServerName) .setDisplayName(lbVirtualServerName) @@ -762,6 +774,18 @@ public class NsxApiClient { return null; } + private LBVirtualServer getLbVirtualServerService(LbVirtualServers lbVirtualServers, String lbVSName) { + try { + LBVirtualServer lbVirtualServer = lbVirtualServers.get(lbVSName); + if (Objects.nonNull(lbVirtualServer)) { + return lbVirtualServer; + } + } catch (Exception e) { + return null; + } + return null; + } + private String getLbPath(String lbServiceName) { try { LbServices lbServices = (LbServices) nsxService.apply(LbServices.class); 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 f69cc0d1bef..1fb546ed122 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 @@ -558,7 +558,7 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns .setRuleId(rule.getId()) .setProtocol(rule.getProtocol().toUpperCase(Locale.ROOT)) .build(); - if (rule.getState() == FirewallRule.State.Add) { + if (Arrays.asList(FirewallRule.State.Add, FirewallRule.State.Active).contains(rule.getState())) { result &= nsxService.createPortForwardRule(networkRule); } else if (rule.getState() == FirewallRule.State.Revoke) { result &= nsxService.deletePortForwardRule(networkRule); @@ -642,9 +642,6 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException { boolean result = true; for (LoadBalancingRule loadBalancingRule : rules) { - if (loadBalancingRule.getState() == FirewallRule.State.Active) { - continue; - } IPAddressVO publicIp = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), loadBalancingRule.getSourceIp().addr()); NsxOpObject nsxObject = getNsxOpObject(network); @@ -666,7 +663,7 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns .setProtocol(loadBalancingRule.getLbProtocol().toUpperCase(Locale.ROOT)) .setAlgorithm(loadBalancingRule.getAlgorithm()) .build(); - if (loadBalancingRule.getState() == FirewallRule.State.Add) { + if (Arrays.asList(FirewallRule.State.Add, FirewallRule.State.Active).contains(loadBalancingRule.getState())) { result &= nsxService.createLbRule(networkRule); } else if (loadBalancingRule.getState() == FirewallRule.State.Revoke) { result &= nsxService.deleteLbRule(networkRule);