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

pearl11594 pushed a commit to branch netris-update-vpc-and-tier-names
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 8572d6a776223edfc778c34322457b76f9cce1cd
Author: Pearl Dsilva <[email protected]>
AuthorDate: Tue Mar 4 22:55:37 2025 -0500

    Update netris VPC and tier name
---
 .../com/cloud/network/element/VpcProvider.java     |  2 +
 .../com/cloud/network/netris/NetrisService.java    |  2 +
 .../management/ContrailVpcElementImpl.java         |  5 +++
 .../agent/api/UpdateNetrisVnetCommand.java         | 17 ++++++++
 .../agent/api/UpdateNetrisVpcCommand.java          | 32 +++++++++++++++
 .../apache/cloudstack/resource/NetrisResource.java | 17 ++++++++
 .../apache/cloudstack/service/NetrisApiClient.java |  3 ++
 .../cloudstack/service/NetrisApiClientImpl.java    | 45 ++++++++++++++++++++++
 .../apache/cloudstack/service/NetrisElement.java   |  5 +++
 .../cloudstack/service/NetrisServiceImpl.java      |  9 +++++
 .../org/apache/cloudstack/service/NsxElement.java  |  5 +++
 .../network/element/VpcVirtualRouterElement.java   |  5 +++
 .../java/com/cloud/network/vpc/VpcManagerImpl.java | 11 ++++++
 .../cloudstack/service/NetrisServiceMockTest.java  |  5 +++
 14 files changed, 163 insertions(+)

diff --git a/api/src/main/java/com/cloud/network/element/VpcProvider.java 
b/api/src/main/java/com/cloud/network/element/VpcProvider.java
index 6debd1fbc2d..47e70d6597d 100644
--- a/api/src/main/java/com/cloud/network/element/VpcProvider.java
+++ b/api/src/main/java/com/cloud/network/element/VpcProvider.java
@@ -55,4 +55,6 @@ public interface VpcProvider extends NetworkElement {
     boolean applyACLItemsToPrivateGw(PrivateGateway gateway, List<? extends 
NetworkACLItem> rules) throws ResourceUnavailableException;
 
     boolean updateVpcSourceNatIp(Vpc vpc, IpAddress address);
+
+    boolean updateVpc(Vpc vpc, String previousVpcName);
 }
diff --git a/api/src/main/java/com/cloud/network/netris/NetrisService.java 
b/api/src/main/java/com/cloud/network/netris/NetrisService.java
index 43f94e0c6b7..f14e531b4da 100644
--- a/api/src/main/java/com/cloud/network/netris/NetrisService.java
+++ b/api/src/main/java/com/cloud/network/netris/NetrisService.java
@@ -28,6 +28,8 @@ public interface NetrisService {
 
     boolean createVpcResource(long zoneId, long accountId, long domainId, Long 
vpcId, String vpcName, boolean sourceNatEnabled, String cidr, boolean 
isVpcNetwork);
 
+    boolean updateVpcResource(long zoneId, long accountId, long domainId, Long 
vpcId, String vpcName, String previousVpcName);
+
     boolean deleteVpcResource(long zoneId, long accountId, long domainId, Vpc 
vpc);
 
     boolean createVnetResource(Long zoneId, long accountId, long domainId, 
String vpcName, Long vpcId, String networkName, Long networkId, String cidr, 
Boolean globalRouting);
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 d5060443c9e..d492e6214ec 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
@@ -201,4 +201,9 @@ public class ContrailVpcElementImpl extends 
ContrailElementImpl implements Netwo
     public boolean updateVpcSourceNatIp(Vpc vpc, IpAddress address) {
         return true;
     }
+
+    @Override
+    public boolean updateVpc(Vpc vpc, String previousVpcName) {
+        return true;
+    }
 }
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/UpdateNetrisVnetCommand.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/UpdateNetrisVnetCommand.java
new file mode 100644
index 00000000000..98fa9b7643a
--- /dev/null
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/UpdateNetrisVnetCommand.java
@@ -0,0 +1,17 @@
+package org.apache.cloudstack.agent.api;
+
+public class UpdateNetrisVnetCommand extends NetrisCommand{
+    private String prevNetworkName;
+
+    public UpdateNetrisVnetCommand(long zoneId, Long accountId, Long domainId, 
String name, Long id, boolean isVpc) {
+        super(zoneId, accountId, domainId, name, id, isVpc);
+    }
+
+    public String getPrevNetworkName() {
+        return prevNetworkName;
+    }
+
+    public void setPrevNetworkName(String prevNetworkName) {
+        this.prevNetworkName = prevNetworkName;
+    }
+}
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/UpdateNetrisVpcCommand.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/UpdateNetrisVpcCommand.java
new file mode 100644
index 00000000000..764d9155a02
--- /dev/null
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/UpdateNetrisVpcCommand.java
@@ -0,0 +1,32 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.agent.api;
+
+public class UpdateNetrisVpcCommand extends NetrisCommand {
+    private String previousVpcName;
+    public UpdateNetrisVpcCommand(long zoneId, Long accountId, Long domainId, 
String name, Long id, boolean isVpc) {
+        super(zoneId, accountId, domainId, name, id, isVpc);
+    }
+
+    public String getPreviousVpcName() {
+        return previousVpcName;
+    }
+
+    public void setPreviousVpcName(String previousVpcName) {
+        this.previousVpcName = previousVpcName;
+    }
+}
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
index e7419caf743..6cb072e87e3 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/resource/NetrisResource.java
@@ -44,6 +44,7 @@ import org.apache.cloudstack.agent.api.NetrisAnswer;
 import org.apache.cloudstack.StartupNetrisCommand;
 import org.apache.cloudstack.agent.api.ReleaseNatIpCommand;
 import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand;
+import org.apache.cloudstack.agent.api.UpdateNetrisVpcCommand;
 import org.apache.cloudstack.service.NetrisApiClient;
 import org.apache.cloudstack.service.NetrisApiClientImpl;
 import org.apache.logging.log4j.LogManager;
@@ -98,6 +99,8 @@ public class NetrisResource implements ServerResource {
             return executeRequest((CheckHealthCommand) cmd);
         } else if (cmd instanceof CreateNetrisVpcCommand) {
             return executeRequest((CreateNetrisVpcCommand) cmd);
+        } else if (cmd instanceof UpdateNetrisVpcCommand) {
+          return executeRequest((UpdateNetrisVpcCommand) cmd);
         } else if (cmd instanceof DeleteNetrisVpcCommand) {
             return executeRequest((DeleteNetrisVpcCommand) cmd);
         } else if (cmd instanceof CreateNetrisVnetCommand) {
@@ -242,6 +245,20 @@ public class NetrisResource implements ServerResource {
         }
     }
 
+    private Answer executeRequest(UpdateNetrisVpcCommand cmd) {
+        try {
+            boolean result = netrisApiClient.updateVpc(cmd);
+            if (!result) {
+                return new NetrisAnswer(cmd, false, String.format("Netris VPC 
%s creation failed", cmd.getName()));
+            }
+            return new NetrisAnswer(cmd, true, "OK");
+        } catch (CloudRuntimeException e) {
+            String msg = String.format("Error creating Netris VPC: %s", 
e.getMessage());
+            logger.error(msg, e);
+            return new NetrisAnswer(cmd, new CloudRuntimeException(msg));
+        }
+    }
+
     private Answer executeRequest(CreateNetrisVnetCommand cmd) {
         try {
             String vpcName = cmd.getVpcName();
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
index 5957805d22d..8f7fcbbb4c7 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClient.java
@@ -34,6 +34,7 @@ import 
org.apache.cloudstack.agent.api.DeleteNetrisVnetCommand;
 import org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand;
 import org.apache.cloudstack.agent.api.ReleaseNatIpCommand;
 import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand;
+import org.apache.cloudstack.agent.api.UpdateNetrisVpcCommand;
 
 import java.util.List;
 
@@ -50,6 +51,8 @@ public interface NetrisApiClient {
      */
     boolean createVpc(CreateNetrisVpcCommand cmd);
 
+    boolean updateVpc(UpdateNetrisVpcCommand cmd);
+
     /**
      * Delete a VPC on CloudStack removes the following Netris resources:
      * - Delete the IPAM Allocation for the VPC using the Prefix = VPC CIDR
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
index 25c24bf0bf5..857959d4e1d 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisApiClientImpl.java
@@ -98,6 +98,8 @@ import io.netris.model.VnetResAddBody;
 import io.netris.model.VnetResDeleteBody;
 import io.netris.model.VnetResListBody;
 import io.netris.model.VnetsBody;
+import io.netris.model.VpcEditResponseOK;
+import io.netris.model.VpcVpcIdBody;
 import io.netris.model.response.AuthResponse;
 import io.netris.model.response.L4LbEditResponse;
 import io.netris.model.response.TenantResponse;
@@ -117,6 +119,7 @@ import 
org.apache.cloudstack.agent.api.DeleteNetrisVpcCommand;
 import org.apache.cloudstack.agent.api.NetrisCommand;
 import org.apache.cloudstack.agent.api.ReleaseNatIpCommand;
 import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand;
+import org.apache.cloudstack.agent.api.UpdateNetrisVpcCommand;
 import org.apache.cloudstack.resource.NetrisResourceObjectUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
@@ -257,6 +260,30 @@ public class NetrisApiClientImpl implements 
NetrisApiClient {
         return response;
     }
 
+    private VpcEditResponseOK updateVpcInternal(String vpcName, String 
prevVpcName, int adminTenantId, String adminTenantName) {
+        VpcEditResponseOK response;
+        logger.debug(String.format("Updating Netris VPC name from %s to %s", 
prevVpcName, vpcName));
+        try {
+            VPCListing vpcResource = getVpcByNameAndTenant(prevVpcName);
+            if (vpcResource == null) {
+                logger.error("Could not find the Netris VPC resource with name 
{} and tenant ID {}", prevVpcName, tenantId);
+                return null;
+            }
+            VpcApi vpcApi = apiClient.getApiStubForMethod(VpcApi.class);
+            VpcVpcIdBody body = new VpcVpcIdBody();
+            body.setName(vpcName);
+            VPCAdminTenant vpcAdminTenant = new VPCAdminTenant();
+            vpcAdminTenant.setId(adminTenantId);
+            vpcAdminTenant.name(adminTenantName);
+            body.setAdminTenant(vpcAdminTenant);
+            response = vpcApi.apiV2VpcVpcIdPut(body, vpcResource.getId());
+        } catch (ApiException e) {
+            logAndThrowException("Error updating Netris VPC", e);
+            return null;
+        }
+        return response;
+    }
+
     private InlineResponse2004Data createIpamAllocationInternal(String 
ipamName, String ipamPrefix, VPCListing vpc) {
         logger.debug(String.format("Creating Netris IPAM Allocation %s for VPC 
%s", ipamPrefix, vpc.getName()));
         try {
@@ -302,6 +329,24 @@ public class NetrisApiClientImpl implements 
NetrisApiClient {
         return createdIpamAllocation != null;
     }
 
+    @Override
+    public boolean updateVpc(UpdateNetrisVpcCommand cmd) {
+        Long domainId = cmd.getDomainId();
+        Long zoneId = cmd.getZoneId();
+        Long accountId = cmd.getAccountId();
+        Long vpcId = cmd.getId();
+        String prevVpcName = cmd.getPreviousVpcName();
+        String netrisVpcName = 
NetrisResourceObjectUtils.retrieveNetrisResourceObjectName(cmd, 
NetrisResourceObjectUtils.NetrisObjectType.VPC);
+        String netrisPrevVpcName = String.format("D%s-A%s-Z%s-V%s-%s", 
domainId, accountId, zoneId, vpcId, prevVpcName);
+        VpcEditResponseOK updatedVpc = updateVpcInternal(netrisVpcName, 
netrisPrevVpcName, tenantId, tenantName);
+        if (updatedVpc == null || !updatedVpc.isIsSuccess()) {
+            String reason = updatedVpc == null ? "Empty response" : "Operation 
failed on Netris";
+            logger.debug("The update of Netris VPC {} failed: {}", 
cmd.getPreviousVpcName(), reason);
+            return false;
+        }
+        return true;
+    }
+
     @Override
     public boolean deleteNatRule(DeleteNetrisNatRuleCommand cmd) {
         try {
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
index 5cc2a1c2a41..04268a292bd 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java
@@ -466,6 +466,11 @@ public class NetrisElement extends AdapterBase implements 
DhcpServiceProvider, D
         return netrisService.updateVpcSourceNatIp(vpc, address);
     }
 
+    @Override
+    public boolean updateVpc(Vpc vpc, String previousVpcName) {
+        return netrisService.updateVpcResource(vpc.getZoneId(), 
vpc.getAccountId(), vpc.getDomainId(), vpc.getId(), vpc.getName(), 
previousVpcName);
+    }
+
     @Override
     public boolean applyNetworkACLs(Network network, List<? extends 
NetworkACLItem> rules) throws ResourceUnavailableException {
         if (!canHandle(network, Network.Service.NetworkACL)) {
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
index 45e9147d632..b47f908958e 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisServiceImpl.java
@@ -58,6 +58,7 @@ import org.apache.cloudstack.agent.api.NetrisAnswer;
 import org.apache.cloudstack.agent.api.NetrisCommand;
 import org.apache.cloudstack.agent.api.ReleaseNatIpCommand;
 import org.apache.cloudstack.agent.api.SetupNetrisPublicRangeCommand;
+import org.apache.cloudstack.agent.api.UpdateNetrisVpcCommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
@@ -198,6 +199,14 @@ public class NetrisServiceImpl implements NetrisService, 
Configurable {
         return answer.getResult();
     }
 
+    @Override
+    public boolean updateVpcResource(long zoneId, long accountId, long 
domainId, Long vpcId, String vpcName, String previousVpcName) {
+        UpdateNetrisVpcCommand cmd = new UpdateNetrisVpcCommand(zoneId, 
accountId, domainId, vpcName, vpcId, true);
+        cmd.setPreviousVpcName(previousVpcName);
+        NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);
+        return answer.getResult();
+    }
+
     @Override
     public boolean deleteVpcResource(long zoneId, long accountId, long 
domainId, Vpc vpc) {
         DeleteNetrisVpcCommand cmd = new DeleteNetrisVpcCommand(zoneId, 
accountId, domainId, vpc.getName(), vpc.getCidr(), vpc.getId(), 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 f56e69ab352..18e7ea26c8b 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
@@ -945,4 +945,9 @@ public class NsxElement extends AdapterBase implements  
DhcpServiceProvider, Dns
     public boolean updateVpcSourceNatIp(Vpc vpc, IpAddress address) {
         return nsxService.updateVpcSourceNatIp(vpc, address);
     }
+
+    @Override
+    public boolean updateVpc(Vpc vpc, String previousVpcName) {
+        return true;
+    }
 }
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 841f6221182..c4f5a565d71 100644
--- 
a/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java
+++ 
b/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -732,4 +732,9 @@ public class VpcVirtualRouterElement extends 
VirtualRouterElement implements Vpc
     public boolean updateVpcSourceNatIp(Vpc vpc, IpAddress address) {
         return true;
     }
+
+    @Override
+    public boolean updateVpc(Vpc vpc, String previousVpcName) {
+        return true;
+    }
 }
diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java 
b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index dd49bbd79f9..62cd7afeaff 100644
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@ -1582,6 +1582,7 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
         _accountMgr.checkAccess(caller, null, false, vpcToUpdate);
 
         final VpcVO vpc = vpcDao.createForUpdate(vpcId);
+        String previousVpcName = vpcToUpdate.getName();
 
         if (vpcName != null) {
             vpc.setName(vpcName);
@@ -1617,6 +1618,16 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
             } else {
                 if (logger.isDebugEnabled()) {
                     logger.debug("no restart needed.");
+                    if (isVpcForProvider(Provider.Netris, vpcToUpdate)) {
+                        final String sourceNatProvider = 
_vpcSrvcDao.getProviderForServiceInVpc(vpc.getId(), Service.SourceNat);
+                        for (final VpcProvider provider : getVpcElements()) {
+                            if ((provider instanceof StaticNatServiceProvider 
&& provider.getName().equalsIgnoreCase(sourceNatProvider))) {
+                                vpcToUpdate.setName(vpcName);
+                                provider.updateVpc(vpcToUpdate, 
previousVpcName);
+                                break;
+                            }
+                        }
+                    }
                 }
             }
             return vpcDao.findById(vpcId);
diff --git 
a/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java 
b/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java
index 7dbfc0b9cbb..dd3707c6051 100644
--- 
a/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java
+++ 
b/server/src/test/java/org/apache/cloudstack/service/NetrisServiceMockTest.java
@@ -36,6 +36,11 @@ public class NetrisServiceMockTest implements NetrisService {
         return true;
     }
 
+    @Override
+    public boolean updateVpcResource(long zoneId, long accountId, long 
domainId, Long vpcId, String vpcName, String previousVpcName) {
+        return true;
+    }
+
     @Override
     public boolean deleteVpcResource(long zoneId, long accountId, long 
domainId, Vpc vpc) {
         return true;

Reply via email to