UI: Option to choose the isolation method when creating the public IP range (#12000)
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 85cfddf..a7826e0 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 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 c0ba99a..2a3b25c 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 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 1e744aa..580e82d 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -4005,7 +4005,6 @@
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 00c8110..624a13d 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 3955b8c..1ae581c 100644
--- a/ui/src/views/infra/network/IpRangesTabPublic.vue
+++ b/ui/src/views/infra/network/IpRangesTabPublic.vue
@@ -220,6 +220,20 @@
<a-select-option v-for="pod in pods" :key="pod.id" :value="pod.id" :label="pod.name">{{ pod.name }}</a-select-option>
</a-select>
</a-form-item>
+ <a-form-item name="isolationmethod" ref="isolationmethod" class="form__item" v-if="!basicGuestNetwork">
+ <tooltip-label :title="$t('label.isolation.method')" :tooltip="$t('label.choose.isolation.method.public.ip.range')" class="tooltip-label-wrapper"/>
+ <a-select
+ v-model:value="form.isolationmethod"
+ showSearch
+ optionFilterProp="label"
+ :filterOption="(input, option) => {
+ return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
+ }" >
+ <a-select-option value="">{{ }}</a-select-option>
+ <a-select-option value="vlan"> VLAN </a-select-option>
+ <a-select-option value="vxlan"> VXLAN </a-select-option>
+ </a-select>
+ </a-form-item>
<a-form-item name="vlan" ref="vlan" :label="$t('label.vlan')" class="form__item" v-if="!basicGuestNetwork">
<a-input v-model:value="form.vlan" />
</a-form-item>
@@ -452,7 +466,8 @@
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 @@
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