From d9612b723b49fad6453856eb70a81a15d42a01ac Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 7 Aug 2025 10:06:09 -0400 Subject: [PATCH 1/4] Add LB service to Custom VPC/Network offerings --- .../api/command/admin/network/CreateNetworkOfferingCmd.java | 4 ++-- .../api/command/admin/vpc/CreateVPCOfferingCmd.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index 51ba6ec02eaf..c7825389059e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -297,7 +297,7 @@ public List getSupportedServices() { SourceNat.getName(), PortForwarding.getName())); } - if (getNsxSupportsLbService()) { + if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris"))) { services.add(Lb.getName()); } if (Boolean.TRUE.equals(forVpc)) { @@ -410,7 +410,7 @@ private void getServiceProviderMapForExternalProvider(Map> else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()) || NetworkACL.getName().equalsIgnoreCase(service)) { serviceProviderMap.put(service, List.of(provider)); } - if (!getNsxSupportsLbService()) { + if ("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) { serviceProviderMap.remove(Lb.getName()); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java index 84f4d4514604..4a6dc55dc868 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java @@ -194,7 +194,7 @@ public List getSupportedServices() { if (NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode())) { supportedServices.add(Gateway.getName()); } - if (getNsxSupportsLbService()) { + if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris"))) { supportedServices.add(Lb.getName()); } } @@ -259,7 +259,7 @@ else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMo serviceProviderMap.put(service, List.of(provider)); } } - if (!getNsxSupportsLbService()) { + if ("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) { serviceProviderMap.remove(Lb.getName()); } } From 043818913266b2afc097b9d1949d9df19d2d3f14 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 7 Aug 2025 10:51:04 -0400 Subject: [PATCH 2/4] fix offering --- .../api/command/admin/network/CreateNetworkOfferingCmd.java | 6 ++++-- .../api/command/admin/vpc/CreateVPCOfferingCmd.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index c7825389059e..15aaf479eafa 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -297,7 +297,8 @@ public List getSupportedServices() { SourceNat.getName(), PortForwarding.getName())); } - if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris"))) { + if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris") && + NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()))) { services.add(Lb.getName()); } if (Boolean.TRUE.equals(forVpc)) { @@ -410,7 +411,8 @@ private void getServiceProviderMapForExternalProvider(Map> else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()) || NetworkACL.getName().equalsIgnoreCase(service)) { serviceProviderMap.put(service, List.of(provider)); } - if ("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) { + if (("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) || + ("Netris".equalsIgnoreCase(provider) && NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode()))) { serviceProviderMap.remove(Lb.getName()); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java index 4a6dc55dc868..4bfcf33cb3e7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java @@ -194,7 +194,8 @@ public List getSupportedServices() { if (NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode())) { supportedServices.add(Gateway.getName()); } - if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris"))) { + if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris") && + NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()))) { supportedServices.add(Lb.getName()); } } @@ -259,7 +260,8 @@ else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMo serviceProviderMap.put(service, List.of(provider)); } } - if ("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) { + if (("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) || + ("Netris".equalsIgnoreCase(provider) && NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode()))) { serviceProviderMap.remove(Lb.getName()); } } From 7fb20fc364da0c385027755d439f61ed4bc479af Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 11 Sep 2025 13:26:43 -0400 Subject: [PATCH 3/4] externalize common checks to a utility file --- .../network/CreateNetworkOfferingCmd.java | 10 +++-- .../admin/vpc/CreateVPCOfferingCmd.java | 10 +++-- .../api/command/utils/OfferingUtils.java | 38 +++++++++++++++++++ 3 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index 15aaf479eafa..56333f4081b0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -61,6 +61,10 @@ import static com.cloud.network.Network.Service.UserData; import static com.cloud.network.Network.Service.Firewall; +import static org.apache.cloudstack.api.command.utils.OfferingUtils.isNetrisNatted; +import static org.apache.cloudstack.api.command.utils.OfferingUtils.isNetrisRouted; +import static org.apache.cloudstack.api.command.utils.OfferingUtils.isNsxWithoutLb; + @APICommand(name = "createNetworkOffering", description = "Creates a network offering.", responseObject = NetworkOfferingResponse.class, since = "3.0.0", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class CreateNetworkOfferingCmd extends BaseCmd { @@ -297,8 +301,7 @@ public List getSupportedServices() { SourceNat.getName(), PortForwarding.getName())); } - if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris") && - NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()))) { + if (getNsxSupportsLbService() || (provider != null && isNetrisNatted(getProvider(), getNetworkMode()))) { services.add(Lb.getName()); } if (Boolean.TRUE.equals(forVpc)) { @@ -411,8 +414,7 @@ private void getServiceProviderMapForExternalProvider(Map> else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()) || NetworkACL.getName().equalsIgnoreCase(service)) { serviceProviderMap.put(service, List.of(provider)); } - if (("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) || - ("Netris".equalsIgnoreCase(provider) && NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode()))) { + if (isNsxWithoutLb(getProvider(), getNsxSupportsLbService()) || isNetrisRouted(getProvider(), getNetworkMode())) { serviceProviderMap.remove(Lb.getName()); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java index 4bfcf33cb3e7..9ed7ced528e7 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java @@ -62,6 +62,10 @@ import static com.cloud.network.Network.Service.UserData; import static com.cloud.network.Network.Service.Gateway; +import static org.apache.cloudstack.api.command.utils.OfferingUtils.isNetrisNatted; +import static org.apache.cloudstack.api.command.utils.OfferingUtils.isNetrisRouted; +import static org.apache.cloudstack.api.command.utils.OfferingUtils.isNsxWithoutLb; + @APICommand(name = "createVPCOffering", description = "Creates VPC offering", responseObject = VpcOfferingResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd { @@ -194,8 +198,7 @@ public List getSupportedServices() { if (NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode())) { supportedServices.add(Gateway.getName()); } - if (getNsxSupportsLbService() || (provider != null && provider.equalsIgnoreCase("Netris") && - NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()))) { + if (getNsxSupportsLbService() || isNetrisNatted(getProvider(), getNetworkMode())) { supportedServices.add(Lb.getName()); } } @@ -260,8 +263,7 @@ else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMo serviceProviderMap.put(service, List.of(provider)); } } - if (("Nsx".equalsIgnoreCase(provider) && !getNsxSupportsLbService()) || - ("Netris".equalsIgnoreCase(provider) && NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode()))) { + if ((isNsxWithoutLb(getProvider(), getNsxSupportsLbService())) || isNetrisRouted(getProvider(), getNetworkMode())) { serviceProviderMap.remove(Lb.getName()); } } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java b/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java new file mode 100644 index 000000000000..21db43d17acb --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java @@ -0,0 +1,38 @@ +// 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.api.command.utils; + +import com.cloud.offering.NetworkOffering; + +public class OfferingUtils { + + private OfferingUtils() { + } + + public static boolean isNetrisNatted(String provider, String networkMode) { + return "Netris".equalsIgnoreCase(provider) && + NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(networkMode); + } + + public static boolean isNsxWithoutLb(String provider, boolean nsxSupportsLbService) { + return "Nsx".equalsIgnoreCase(provider) && !nsxSupportsLbService; + } + + public static boolean isNetrisRouted(String provider, String networkMode) { + return "Netris".equalsIgnoreCase(provider) && NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(networkMode); + } +} From 72c32e9c83ce9ea314401c69c0d49e7198693762 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 11 Sep 2025 13:32:01 -0400 Subject: [PATCH 4/4] remove trailing spaces --- .../org/apache/cloudstack/api/command/utils/OfferingUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java b/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java index 21db43d17acb..433a37c07cde 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/utils/OfferingUtils.java @@ -24,7 +24,7 @@ private OfferingUtils() { } public static boolean isNetrisNatted(String provider, String networkMode) { - return "Netris".equalsIgnoreCase(provider) && + return "Netris".equalsIgnoreCase(provider) && NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(networkMode); }