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

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

commit bac8653e41feb6089a9408f96cf3db28771da76a
Author: Pearl Dsilva <[email protected]>
AuthorDate: Tue Dec 10 13:45:50 2024 -0500

    Add Netris Tag parameter to the Network provider and fix zone creation 
wizard (#33)
    
    * Add Netris Tag parameter to the Network provider
    
    * remove unused import
    
    * Fix public IP ranges creation on zone creation (#34)
    
    * use single quotes
    
    ---------
    
    Co-authored-by: Nicolas Vazquez <[email protected]>
---
 .../java/com/cloud/network/netris/NetrisProvider.java |  1 +
 .../java/org/apache/cloudstack/api/ApiConstants.java  |  1 +
 .../com/cloud/network/element/NetrisProviderVO.java   | 19 +++++++++++++++++++
 .../resources/META-INF/db/schema-41910to42000.sql     |  1 +
 .../cloudstack/agent/api/CreateNetrisVnetCommand.java |  9 +++++++++
 .../cloudstack/api/command/AddNetrisProviderCmd.java  |  7 +++++++
 .../api/response/NetrisProviderResponse.java          | 12 ++++++++++++
 .../cloudstack/service/NetrisApiClientImpl.java       |  9 ++++++---
 .../cloudstack/service/NetrisProviderServiceImpl.java |  4 ++++
 .../apache/cloudstack/service/NetrisServiceImpl.java  |  2 ++
 .../cloud/configuration/ConfigurationManagerImpl.java | 12 +++++++-----
 ui/public/locales/en.json                             |  3 +++
 ui/src/views/infra/network/ServiceProvidersTab.vue    |  2 +-
 ui/src/views/infra/zone/ZoneWizardLaunchZone.vue      |  1 +
 .../views/infra/zone/ZoneWizardNetworkSetupStep.vue   |  6 ++++++
 15 files changed, 80 insertions(+), 9 deletions(-)

diff --git a/api/src/main/java/com/cloud/network/netris/NetrisProvider.java 
b/api/src/main/java/com/cloud/network/netris/NetrisProvider.java
index 82dc5a271a7..1a76f948a29 100644
--- a/api/src/main/java/com/cloud/network/netris/NetrisProvider.java
+++ b/api/src/main/java/com/cloud/network/netris/NetrisProvider.java
@@ -27,4 +27,5 @@ public interface NetrisProvider extends InternalIdentity, 
Identity {
     String getUsername();
     String getSiteName();
     String getTenantName();
+    String getNetrisTag();
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java 
b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 0849e747774..196f80264cd 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -1162,6 +1162,7 @@ public class ApiConstants {
     public static final String HAS_RULES = "hasrules";
     public static final String NSX_DETAIL_KEY = "forNsx";
     public static final String NETRIS_DETAIL_KEY = "forNetris";
+    public static final String NETRIS_TAG = "netristag";
     public static final String DISK_PATH = "diskpath";
     public static final String IMPORT_SOURCE = "importsource";
     public static final String TEMP_PATH = "temppath";
diff --git 
a/engine/schema/src/main/java/com/cloud/network/element/NetrisProviderVO.java 
b/engine/schema/src/main/java/com/cloud/network/element/NetrisProviderVO.java
index 2df1faae077..12d7f22e340 100644
--- 
a/engine/schema/src/main/java/com/cloud/network/element/NetrisProviderVO.java
+++ 
b/engine/schema/src/main/java/com/cloud/network/element/NetrisProviderVO.java
@@ -66,6 +66,9 @@ public class NetrisProviderVO implements NetrisProvider {
     @Column(name = "tenant_name")
     private String tenantName;
 
+    @Column(name = "netris_tag")
+    private String netrisTag;
+
     @Column(name = "created")
     private Date created;
 
@@ -171,6 +174,14 @@ public class NetrisProviderVO implements NetrisProvider {
         this.tenantName = tenantName;
     }
 
+    public String getNetrisTag() {
+        return netrisTag;
+    }
+
+    public void setNetrisTag(String netrisTag) {
+        this.netrisTag = netrisTag;
+    }
+
     public Date getCreated() {
         return created;
     }
@@ -197,6 +208,7 @@ public class NetrisProviderVO implements NetrisProvider {
         private String password;
         private String siteName;
         private String tenantName;
+        private String netrisTag;
 
         public Builder() {
             // Default constructor
@@ -246,6 +258,12 @@ public class NetrisProviderVO implements NetrisProvider {
             this.tenantName = tenantName;
             return this;
         }
+
+        public Builder setNetrisTag(String netrisTag) {
+            this.netrisTag = netrisTag;
+            return this;
+        }
+
         public NetrisProviderVO build() {
             NetrisProviderVO provider = new NetrisProviderVO();
             provider.setZoneId(this.zoneId);
@@ -258,6 +276,7 @@ public class NetrisProviderVO implements NetrisProvider {
             provider.setPassword(this.password);
             provider.setSiteName(this.siteName);
             provider.setTenantName(this.tenantName);
+            provider.setNetrisTag(this.netrisTag);
             provider.setCreated(new Date());
             return provider;
         }
diff --git 
a/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql 
b/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
index 9873c355baa..3f39a7da089 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
@@ -439,6 +439,7 @@ CREATE TABLE `cloud`.`netris_providers` (
     `password` varchar(255) NOT NULL,
     `site_name` varchar(255) NOT NULL,
     `tenant_name` varchar(255) NOT NULL,
+    `netris_tag` varchar(255) NOT NULL,
     `created` datetime NOT NULL COMMENT 'created date',
     `removed` datetime COMMENT 'removed date if not null',
     PRIMARY KEY (`id`),
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/CreateNetrisVnetCommand.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/CreateNetrisVnetCommand.java
index 12ef9482ea8..7ba6c9250fd 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/CreateNetrisVnetCommand.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/agent/api/CreateNetrisVnetCommand.java
@@ -22,6 +22,7 @@ public class CreateNetrisVnetCommand extends NetrisCommand {
     private String cidr;
     private Integer vxlanId;
     private String gateway;
+    private String netrisTag;
 
     public CreateNetrisVnetCommand(Long zoneId, Long accountId, Long domainId, 
String vpcName, Long vpcId, String vNetName, Long networkId, String cidr, 
String gateway, boolean isVpc) {
         super(zoneId, accountId, domainId, vNetName, networkId, isVpc);
@@ -55,4 +56,12 @@ public class CreateNetrisVnetCommand extends NetrisCommand {
     public String getGateway() {
         return gateway;
     }
+
+    public String getNetrisTag() {
+        return netrisTag;
+    }
+
+    public void setNetrisTag(String netrisTag) {
+        this.netrisTag = netrisTag;
+    }
 }
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/command/AddNetrisProviderCmd.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/command/AddNetrisProviderCmd.java
index d8e49e776ae..6bd9bddb17c 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/command/AddNetrisProviderCmd.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/command/AddNetrisProviderCmd.java
@@ -68,6 +68,9 @@ public class AddNetrisProviderCmd extends BaseCmd {
     @Parameter(name = ApiConstants.TENANT_NAME, type = CommandType.STRING, 
required = true, description = "Password to login into Netris")
     private String tenantName;
 
+    @Parameter(name = ApiConstants.NETRIS_TAG, type = CommandType.STRING, 
required = true, description = "Netris tag for vNets")
+    private String netrisTag;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -104,6 +107,10 @@ public class AddNetrisProviderCmd extends BaseCmd {
         return tenantName;
     }
 
+    public String getNetrisTag() {
+        return netrisTag;
+    }
+
     @Override
     public void execute() throws ServerApiException, 
ConcurrentOperationException {
         NetrisProvider provider = netrisProviderService.addProvider(this);
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/response/NetrisProviderResponse.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/response/NetrisProviderResponse.java
index 0a6030659f0..d130c3a7372 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/response/NetrisProviderResponse.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/api/response/NetrisProviderResponse.java
@@ -57,6 +57,10 @@ public class NetrisProviderResponse extends BaseResponse {
     @Param(description = "Netris Admin tenant name")
     private String tenantName;
 
+    @SerializedName(ApiConstants.NETRIS_TAG)
+    @Param(description = "Netris Tag for vNets")
+    private String netrisTag;
+
     public String getName() {
         return name;
     }
@@ -120,4 +124,12 @@ public class NetrisProviderResponse extends BaseResponse {
     public void setTenantName(String tenantName) {
         this.tenantName = tenantName;
     }
+
+    public String getNetrisTag() {
+        return netrisTag;
+    }
+
+    public void setNetrisTag(String netrisTag) {
+        this.netrisTag = netrisTag;
+    }
 }
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 51de34552a5..3d1eb893b4e 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
@@ -86,6 +86,7 @@ import org.apache.logging.log4j.Logger;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -382,7 +383,7 @@ public class NetrisApiClientImpl implements NetrisApiClient 
{
         Long networkId = cmd.getId();
         String vnetCidr = cmd.getCidr();
         Integer vxlanId = cmd.getVxlanId();
-        String gateway = cmd.getGateway();
+        String netrisTag = cmd.getNetrisTag();
         String netmask = vnetCidr.split("/")[1];
         String netrisGateway = cmd.getGateway() + "/" + netmask;
         boolean isVpc = cmd.isVpc();
@@ -407,7 +408,7 @@ public class NetrisApiClientImpl implements NetrisApiClient 
{
         createIpamSubnetInternal(netrisSubnetName, vnetCidr, 
SubnetBody.PurposeEnum.COMMON, associatedVpc);
         logger.debug("Successfully created IPAM Subnet {} for network {} on 
Netris", netrisSubnetName, networkName);
 
-        VnetResAddBody vnetResponse = createVnetInternal(associatedVpc, 
netrisVnetName, netrisGateway, vxlanId);
+        VnetResAddBody vnetResponse = createVnetInternal(associatedVpc, 
netrisVnetName, netrisGateway, vxlanId, netrisTag);
         if (vnetResponse == null || !vnetResponse.isIsSuccess()) {
             String reason = vnetResponse == null ? "Empty response" : 
"Operation failed on Netris";
             logger.debug("The Netris vNet creation {} failed: {}", vNetName, 
reason);
@@ -899,7 +900,7 @@ public class NetrisApiClientImpl implements NetrisApiClient 
{
         }
     }
 
-    VnetResAddBody createVnetInternal(VPCListing associatedVpc, String 
netrisVnetName, String netrisGateway, Integer vxlanId) {
+    VnetResAddBody createVnetInternal(VPCListing associatedVpc, String 
netrisVnetName, String netrisGateway, Integer vxlanId, String netrisTag) {
         logger.debug("Creating Netris VPC vNet {} for CIDR {}", 
netrisVnetName, netrisGateway);
         try {
             VnetAddBody vnetBody = new VnetAddBody();
@@ -950,6 +951,8 @@ public class NetrisApiClientImpl implements NetrisApiClient 
{
             vpc.setId(associatedVpc.getId());
             vnetBody.setVpc(vpc);
 
+            vnetBody.setTags(Collections.singletonList(netrisTag));
+
             VNetApi vnetApi = apiClient.getApiStubForMethod(VNetApi.class);
             return vnetApi.apiV2VnetPost(vnetBody);
         } catch (ApiException e) {
diff --git 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java
 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java
index a18251cee11..ff2d13d7f1b 100644
--- 
a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java
+++ 
b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisProviderServiceImpl.java
@@ -86,6 +86,7 @@ public class NetrisProviderServiceImpl implements 
NetrisProviderService {
         final String password = cmd.getPassword();
         final String tenantName = cmd.getTenantName();
         final String siteName = cmd.getSiteName();
+        final String netrisTag = cmd.getNetrisTag();
 
         Map<String, String> params = new HashMap<>();
         params.put("guid", UUID.randomUUID().toString());
@@ -97,6 +98,7 @@ public class NetrisProviderServiceImpl implements 
NetrisProviderService {
         params.put("password", password);
         params.put("siteName", siteName);
         params.put("tenantName", tenantName);
+        params.put("netrisTag", netrisTag);
 
         Map<String, Object> hostdetails = new HashMap<>(params);
         NetrisProvider netrisProvider;
@@ -117,6 +119,7 @@ public class NetrisProviderServiceImpl implements 
NetrisProviderService {
                             .setPassword(password)
                             .setSiteName(siteName)
                             .setTenantName(tenantName)
+                            .setNetrisTag(netrisTag)
                             .build();
 
                     netrisProviderDao.persist(netrisProviderVO);
@@ -190,6 +193,7 @@ public class NetrisProviderServiceImpl implements 
NetrisProviderService {
         response.setZoneName(zone.getName());
         response.setSiteName(provider.getSiteName());
         response.setTenantName(provider.getTenantName());
+        response.setNetrisTag(provider.getNetrisTag());
         response.setObjectName("netrisProvider");
         return response;
     }
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 a8fe3ae2054..a72b50fc8ed 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
@@ -203,6 +203,8 @@ public class NetrisServiceImpl implements NetrisService, 
Configurable {
         String vxlanId = 
Networks.BroadcastDomainType.getValue(network.getBroadcastUri());
         CreateNetrisVnetCommand cmd = new CreateNetrisVnetCommand(zoneId, 
accountId, domainId, vpcName, vpcId, networkName, networkId, cidr, 
network.getGateway(), !Objects.isNull(vpcId));
         cmd.setVxlanId(Integer.parseInt(vxlanId));
+        NetrisProviderVO netrisProvider = 
netrisProviderDao.findByZoneId(zoneId);
+        cmd.setNetrisTag(netrisProvider.getNetrisTag());
         NetrisAnswer answer = sendNetrisCommand(cmd, zoneId);
         return answer.getResult();
     }
diff --git 
a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java 
b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index 9b00a53e969..c4cefa5899b 100644
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -4667,12 +4667,14 @@ public class ConfigurationManagerImpl extends 
ManagerBase implements Configurati
             throw new InvalidParameterValueException("Unable to find zone by 
id " + zoneId);
         }
 
-        // If external provider is provided, verify zone has that provider 
enabled
+        // If external provider is provided, verify zone has that provider 
enabled and the controller added
         Provider provider = cmd.getProvider();
-        if (Objects.nonNull(provider)) {
+        NsxProviderVO nsxProvider = nsxProviderDao.findByZoneId(zoneId);
+        NetrisProviderVO netrisProvider = 
netrisProviderDao.findByZoneId(zoneId);
+        if (Objects.nonNull(provider) && ObjectUtils.anyNotNull(nsxProvider, 
netrisProvider)) {
             boolean unsupported =
-                    (Provider.Nsx == provider && 
nsxProviderDao.findByZoneId(zoneId) == null) ||
-                            (Provider.Netris == provider && 
netrisProviderDao.findByZoneId(zoneId) == null);
+                    (Provider.Nsx == provider && nsxProvider == null) ||
+                            (Provider.Netris == provider && netrisProvider == 
null);
             if (unsupported) {
                 throw new InvalidParameterValueException(String.format("Cannot 
add public IP range as the zone does not support provider: %s", 
provider.getName()));
             }
@@ -4847,7 +4849,7 @@ public class ConfigurationManagerImpl extends ManagerBase 
implements Configurati
                 }
             });
 
-            if (provider == Provider.Netris) {
+            if (provider == Provider.Netris && 
netrisProviderDao.findByZoneId(zoneId) != null) {
                 
netrisService.createIPAMAllocationsForZoneLevelPublicRanges(zoneId);
             }
             messageBus.publish(_name, MESSAGE_CREATE_VLAN_IP_RANGE_EVENT, 
PublishScope.LOCAL, vlan);
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index 1ed17a2ee11..baedf21ecbf 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -1493,6 +1493,7 @@
 "label.ncc": "NCC",
 "label.netmask": "Netmask",
 "label.netris": "Netris",
+"label.netristag": "Netris tag",
 "label.netris.provider": "Netris Provider",
 "label.netris.provider.name": "Netris provider name",
 "label.netris.provider.hostname": "Netris provider hostname",
@@ -1501,6 +1502,7 @@
 "label.netris.provider.password": "Netris provider password",
 "label.netris.provider.site": "Netris provider Site name",
 "label.netris.provider.tenant.name": "Netris provider Admin Tenant name",
+"label.netris.provider.tag": "Netris Tag",
 "label.netscaler": "NetScaler",
 "label.netscaler.mpx": "NetScaler MPX LoadBalancer",
 "label.netscaler.sdx": "NetScaler SDX LoadBalancer",
@@ -3251,6 +3253,7 @@
 "message.installwizard.tooltip.netris.provider.username": "Netris Provider 
username not provided",
 "message.installwizard.tooltip.netris.provider.password": "Netris Provider 
password not provided",
 "message.installwizard.tooltip.netris.provider.site": "Netris Provider Site 
name not provided",
+"message.installwizard.tooltip.netris.provider.tag": "Netris Tag to be 
assigned to vNets",
 "message.installwizard.tooltip.netris.provider.tenant.name": "Netris Provider 
Admin Tenant name not provided",
 "message.installwizard.tooltip.nsx.provider.hostname": "NSX Provider hostname 
/ IP address not provided",
 "message.installwizard.tooltip.nsx.provider.username": "NSX Provider username 
not provided",
diff --git a/ui/src/views/infra/network/ServiceProvidersTab.vue 
b/ui/src/views/infra/network/ServiceProvidersTab.vue
index 16c965763c3..5da28bcab7f 100644
--- a/ui/src/views/infra/network/ServiceProvidersTab.vue
+++ b/ui/src/views/infra/network/ServiceProvidersTab.vue
@@ -1169,7 +1169,7 @@ export default {
                   value: (record) => { return record.zoneid }
                 }
               },
-              columns: ['name', 'hostname', 'port', 'site', 'tenantname']
+              columns: ['name', 'hostname', 'port', 'site', 'tenantname', 
'netristag']
             }
           ]
         }
diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue 
b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
index bb71088c5d1..51092f56212 100644
--- a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
+++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
@@ -1127,6 +1127,7 @@ export default {
           providerParams.zoneid = this.stepData.zoneReturned.id
           providerParams.sitename = this.prefillContent?.siteName || ''
           providerParams.tenantname = this.prefillContent?.tenantName || ''
+          providerParams.netristag = this.prefillContent?.netrisTag || ''
 
           await this.addNetrisProvider(providerParams)
           this.stepData.stepMove.push('addNetrisProvider')
diff --git a/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue 
b/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
index 863bb6a375c..66dbe3aeddc 100644
--- a/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
+++ b/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
@@ -519,6 +519,12 @@ export default {
           key: 'tenantName',
           placeHolder: 
'message.installwizard.tooltip.netris.provider.tenant.name',
           required: true
+        },
+        {
+          title: 'label.netris.provider.tag',
+          key: 'netrisTag',
+          placeHolder: 'message.installwizard.tooltip.netris.provider.tag',
+          required: true
         }
       ]
       return fields

Reply via email to