From f300f5a03e8d430660c225e1cf4efd5e80bc2056 Mon Sep 17 00:00:00 2001 From: Andrey Volchkov Date: Fri, 19 Dec 2025 18:04:43 +0200 Subject: [PATCH] fix: NsxResource.executeRequest DeleteNsxNatRuleCommand comparison bug Fixes an issue in NsxResource.executeRequest where Network.Service comparison failed when DeleteNsxNatRuleCommand was executed in a different process. Due to serialization/deserialization, the deserialized Network.Service instance was not equal to the static instances Network.Service.StaticNat and Network.Service.PortForwarding, causing the comparison to always return false. --- .../cloudstack/agent/api/DeleteNsxNatRuleCommand.java | 7 +++++++ .../java/org/apache/cloudstack/resource/NsxResource.java | 6 +++--- .../org/apache/cloudstack/resource/NsxResourceTest.java | 6 ++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxNatRuleCommand.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxNatRuleCommand.java index c5231b19ac40..b642df856185 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxNatRuleCommand.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/DeleteNsxNatRuleCommand.java @@ -54,6 +54,13 @@ public String getProtocol() { return protocol; } + public String getNetworkServiceName() { + if (service != null) { + return service.getName(); + } + return null; + } + @Override public boolean equals(Object o) { if (this == o) { 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 76815b0deebe..78a9363a5e49 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 @@ -415,10 +415,10 @@ private NsxAnswer executeRequest(CreateNsxPortForwardRuleCommand cmd) { private NsxAnswer executeRequest(DeleteNsxNatRuleCommand cmd) { String ruleName = null; - if (cmd.getService() == Network.Service.StaticNat) { + if (Network.Service.StaticNat.getName().equals(cmd.getNetworkServiceName())) { ruleName = NsxControllerUtils.getStaticNatRuleName(cmd.getDomainId(), cmd.getAccountId(), cmd.getZoneId(), cmd.getNetworkResourceId(), cmd.isResourceVpc()); - } else if (cmd.getService() == Network.Service.PortForwarding) { + } else if (Network.Service.PortForwarding.getName().equals(cmd.getNetworkServiceName())) { ruleName = NsxControllerUtils.getPortForwardRuleName(cmd.getDomainId(), cmd.getAccountId(), cmd.getZoneId(), cmd.getNetworkResourceId(), cmd.getRuleId(), cmd.isResourceVpc()); } @@ -456,7 +456,7 @@ private NsxAnswer executeRequest(DeleteNsxLoadBalancerRuleCommand cmd) { try { nsxApiClient.deleteNsxLbResources(tier1GatewayName, cmd.getLbId()); } catch (Exception e) { - logger.error(String.format("Failed to add NSX load balancer rule %s for network: %s", ruleName, cmd.getNetworkResourceName())); + logger.error(String.format("Failed to delete NSX load balancer rule %s for network: %s", ruleName, cmd.getNetworkResourceName())); return new NsxAnswer(cmd, new CloudRuntimeException(e.getMessage())); } return new NsxAnswer(cmd, true, null); diff --git a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java index ee4f4fb64c20..0d74bb8a3b3d 100644 --- a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java +++ b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.resource; +import com.cloud.network.Network; import com.cloud.network.dao.NetworkVO; import com.cloud.utils.exception.CloudRuntimeException; import com.vmware.nsx.model.TransportZone; @@ -61,6 +62,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) @@ -247,8 +249,12 @@ public void testCreatePortForwardRule() { @Test public void testDeleteNsxNatRule() { DeleteNsxNatRuleCommand cmd = new DeleteNsxNatRuleCommand(domainId, accountId, zoneId, 3L, "VPC01", true, 2L, 5L, "22", "tcp"); + Network.Service service = mock(Network.Service.class); + when(service.getName()).thenReturn("PortForwarding"); + cmd.setService(service); NsxAnswer answer = (NsxAnswer) nsxResource.executeRequest(cmd); assertTrue(answer.getResult()); + verify(nsxApi).deleteNatRule(service, "22", "tcp", "VPC01", "D1-A2-Z1-V3", "D1-A2-Z1-V3-PF5"); } @Test