diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java index 85cfddfb714f..a7826e022a68 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java @@ -34,6 +34,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; +import com.cloud.utils.StringUtils; @APICommand(name = "createManagementNetworkIpRange", description = "Creates a Management network IP range.", @@ -118,7 +119,7 @@ public Boolean isForSystemVms() { } public String getVlan() { - if (vlan == null || vlan.isEmpty()) { + if (StringUtils.isBlank(vlan)) { vlan = "untagged"; } return vlan; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java index c0ba99a82333..2a3b25c28f3b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.admin.vlan; import com.cloud.utils.net.NetUtils; +import com.cloud.utils.StringUtils; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; @@ -162,7 +163,7 @@ public boolean isForNsx() { } public String getVlan() { - if ((vlan == null || vlan.isEmpty()) && !isForNsx()) { + if (StringUtils.isBlank(vlan) && !isForNsx()) { vlan = "untagged"; } return vlan; diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 58ac6891e5f5..9babe788e87a 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -3917,7 +3917,6 @@ public List> getCommands() { cmdList.add(StartInternalLBVMCmd.class); cmdList.add(ListInternalLBVMsCmd.class); cmdList.add(ListNetworkIsolationMethodsCmd.class); - cmdList.add(ListNetworkIsolationMethodsCmd.class); cmdList.add(CreateNetworkACLListCmd.class); cmdList.add(DeleteNetworkACLListCmd.class); cmdList.add(ListNetworkACLListsCmd.class); diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 8f2e1bb5c050..85a089e03c07 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -497,6 +497,7 @@ "label.checksum": "Checksum", "label.choose.resource.icon": "Choose icon", "label.choose.saml.identity": "Choose SAML identity provider", +"label.choose.isolation.method.public.ip.range": "Choose the proper isolation method for the public IP range in accordance with the zone. Valid options currently 'vlan' or 'vxlan', defaults to 'vlan'.", "label.cidr": "CIDR", "label.cidrsize": "CIDR size", "label.cidr.destination.network": "Destination Network CIDR", diff --git a/ui/src/views/infra/network/IpRangesTabPublic.vue b/ui/src/views/infra/network/IpRangesTabPublic.vue index 3955b8c03591..1ae581ca0b49 100644 --- a/ui/src/views/infra/network/IpRangesTabPublic.vue +++ b/ui/src/views/infra/network/IpRangesTabPublic.vue @@ -220,6 +220,20 @@ {{ pod.name }} + + + + {{ }} + VLAN + VXLAN + + @@ -452,7 +466,8 @@ export default { initAddIpRangeForm () { this.formRef = ref() this.form = reactive({ - iptype: '' + iptype: '', + isolationmethod: '' }) this.rules = reactive({ podid: [{ required: true, message: this.$t('label.required') }], @@ -624,6 +639,15 @@ export default { if (!this.basicGuestNetwork) { params.zoneId = this.resource.zoneid params.vlan = values.vlan + const vlanInput = (values.vlan || '').toString().trim() + if (vlanInput) { + const vlanInputLower = vlanInput.toLowerCase() + const startsWithPrefix = vlanInputLower.startsWith('vlan') || vlanInputLower.startsWith('vxlan') + const isNumeric = /^[0-9]+$/.test(vlanInput) + if (!startsWithPrefix && isNumeric && values.isolationmethod) { + params.vlan = `${values.isolationmethod}://${vlanInput}` + } + } params.forsystemvms = values.forsystemvms params.account = values.forsystemvms ? null : values.account params.domainid = values.forsystemvms ? null : values.domain