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;
