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
