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

Pearl1594 pushed a commit to branch netris-improvements
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 98ae1c4899d79be61055661db1596c7626ae1666
Author: Pearl Dsilva <[email protected]>
AuthorDate: Wed Jul 8 12:45:42 2026 -0400

    Fix issue with adding external node to a CKS cluster with Netris offering
    
    Co-authored-by: Pearl Dsilva <[email protected]>
---
 .../cluster/actionworkers/KubernetesClusterActionWorker.java  |  3 ++-
 .../org/apache/cloudstack/service/NetrisApiClientImpl.java    | 11 ++++++-----
 server/src/main/java/com/cloud/network/NetworkModelImpl.java  |  6 ++++--
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
index 6f7579930d7..7a06b11e3bf 100644
--- 
a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
+++ 
b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
@@ -484,7 +484,8 @@ public class KubernetesClusterActionWorker {
 
     protected IpAddress getPublicIp(Network network) throws 
ManagementServerException {
         if (network.getVpcId() != null) {
-            IpAddress publicIp = getVpcTierKubernetesPublicIp(network);
+            String detailKey = manager.isNetrisNetwork(network) ? 
ApiConstants.NETRIS_NAT_PUBLIC_IP_ID : ApiConstants.PUBLIC_IP_ID;
+            IpAddress publicIp = getVpcTierKubernetesPublicIp(network, 
detailKey);
             if (publicIp == null) {
                 throw new ManagementServerException(String.format("No public 
IP addresses found for VPC tier : %s, Kubernetes cluster : %s", 
network.getName(), kubernetesCluster.getName()));
             }
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 bc6dd912be5..b053f2a854e 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
@@ -1763,12 +1763,12 @@ public class NetrisApiClientImpl implements 
NetrisApiClient {
                 IpTreeSubnet existingSubnet = matchedSubnets.stream().filter(x 
-> x.getPrefix().equals(natIp)).collect(Collectors.toList()).get(0);
                 if (existingSubnet.getPurpose() != 
IpTreeSubnet.PurposeEnum.NAT) {
                     VPCListing systemVpc = getSystemVpc();
-                    logger.debug("Subnet: {} already exists, but purpose is 
not NAT, updating its purpose to 'nat'", natIp);
+                    logger.debug("Subnet: {} already exists with purpose '{}', 
updating its purpose to 'nat'", natIp, existingSubnet.getPurpose());
                     
updateIpamSubnetInternal(existingSubnet.getId().intValue(), netrisSubnetName, 
natIp, SubnetBody.PurposeEnum.NAT, systemVpc, null);
                 }
             }
         } catch (ApiException e) {
-            throw new CloudRuntimeException(String.format("Failed to create 
subnet for %s with NAT purpose", natIp));
+            logAndThrowException(String.format("Failed to create subnet for %s 
with NAT purpose (current purpose conflicts and could not be changed)", natIp), 
e);
         }
     }
 
@@ -1784,12 +1784,13 @@ public class NetrisApiClientImpl implements 
NetrisApiClient {
             if (matchedSubnets.isEmpty()) {
                 createIpamSubnetInternal(netrisSubnetName, lbIp, 
SubnetBody.PurposeEnum.LOAD_BALANCER, systemVpc, null);
             } else if (IpTreeSubnet.PurposeEnum.LOAD_BALANCER != 
matchedSubnets.get(0).getPurpose()){
-                logger.debug("Updating existing NAT subnet {} to have load 
balancer purpose", netrisSubnetName);
-                
updateIpamSubnetInternal(matchedSubnets.get(0).getId().intValue(), 
netrisSubnetName, lbIp, SubnetBody.PurposeEnum.LOAD_BALANCER, systemVpc, null);
+                IpTreeSubnet existingSubnet = matchedSubnets.get(0);
+                logger.debug("Updating existing NAT subnet {} with purpose 
'{}' to have load balancer purpose", netrisSubnetName, 
existingSubnet.getPurpose());
+                updateIpamSubnetInternal(existingSubnet.getId().intValue(), 
netrisSubnetName, lbIp, SubnetBody.PurposeEnum.LOAD_BALANCER, systemVpc, null);
             }
             logger.debug("LB subnet: {} already exists", netrisSubnetName);
         } catch (ApiException e) {
-            throw new CloudRuntimeException(String.format("Failed to create 
subnet for %s with LB purpose", lbIp));
+            logAndThrowException(String.format("Failed to create subnet for %s 
with LB purpose (current purpose conflicts and could not be changed)", lbIp), 
e);
         }
     }
 
diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java 
b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
index 07305c0e641..0e53c9a6bfb 100644
--- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
@@ -495,7 +495,8 @@ public class NetworkModelImpl extends ManagerBase 
implements NetworkModel, Confi
     public Map<Provider, ArrayList<PublicIpAddress>> 
getProviderToIpList(Network network, Map<PublicIpAddress, Set<Service>> 
ipToServices) {
         NetworkOffering offering = 
_networkOfferingDao.findById(network.getNetworkOfferingId());
         boolean isForNsx = isProviderForNetworkOffering(Provider.Nsx, 
offering.getId());
-        if (!offering.isConserveMode() && !isForNsx) {
+        boolean isForNetris = isProviderForNetworkOffering(Provider.Netris, 
offering.getId());
+        if (!offering.isConserveMode() && !isForNsx && !isForNetris) {
             for (PublicIpAddress ip : ipToServices.keySet()) {
                 Set<Service> services = new HashSet<Service>();
                 services.addAll(ipToServices.get(ip));
@@ -1649,7 +1650,8 @@ public class NetworkModelImpl extends ManagerBase 
implements NetworkModel, Confi
             return false;
         }
         boolean isForNsx = isProviderForNetworkOffering(Provider.Nsx, 
offering.getId());
-        if (!offering.isConserveMode() && !isForNsx) {
+        boolean isForNetris = isProviderForNetworkOffering(Provider.Netris, 
offering.getId());
+        if (!offering.isConserveMode() && !isForNsx && !isForNetris) {
             return canIpUsedForNonConserveService(publicIp, service);
         }
         return true;

Reply via email to