Skip to content

Commit 856738b

Browse files
UI: Option to choose the isolation method when creating the public IP range
1 parent 243f566 commit 856738b

File tree

5 files changed

+30
-4
lines changed

5 files changed

+30
-4
lines changed

api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.cloud.exception.ResourceAllocationException;
3535
import com.cloud.exception.ResourceUnavailableException;
3636
import com.cloud.user.Account;
37+
import org.apache.commons.lang3.StringUtils;
3738

3839
@APICommand(name = "createManagementNetworkIpRange",
3940
description = "Creates a Management network IP range.",
@@ -118,7 +119,7 @@ public Boolean isForSystemVms() {
118119
}
119120

120121
public String getVlan() {
121-
if (vlan == null || vlan.isEmpty()) {
122+
if (StringUtils.isBlank(vlan)) {
122123
vlan = "untagged";
123124
}
124125
return vlan;

api/src/main/java/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.cloud.exception.ResourceAllocationException;
3939
import com.cloud.exception.ResourceUnavailableException;
4040
import com.cloud.user.Account;
41+
import org.apache.commons.lang3.StringUtils;
4142

4243
import java.util.Objects;
4344

@@ -162,7 +163,7 @@ public boolean isForNsx() {
162163
}
163164

164165
public String getVlan() {
165-
if ((vlan == null || vlan.isEmpty()) && !isForNsx()) {
166+
if (StringUtils.isBlank(vlan) && !isForNsx()) {
166167
vlan = "untagged";
167168
}
168169
return vlan;

server/src/main/java/com/cloud/server/ManagementServerImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3917,7 +3917,6 @@ public List<Class<?>> getCommands() {
39173917
cmdList.add(StartInternalLBVMCmd.class);
39183918
cmdList.add(ListInternalLBVMsCmd.class);
39193919
cmdList.add(ListNetworkIsolationMethodsCmd.class);
3920-
cmdList.add(ListNetworkIsolationMethodsCmd.class);
39213920
cmdList.add(CreateNetworkACLListCmd.class);
39223921
cmdList.add(DeleteNetworkACLListCmd.class);
39233922
cmdList.add(ListNetworkACLListsCmd.class);

ui/public/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@
497497
"label.checksum": "Checksum",
498498
"label.choose.resource.icon": "Choose icon",
499499
"label.choose.saml.identity": "Choose SAML identity provider",
500+
"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'.",
500501
"label.cidr": "CIDR",
501502
"label.cidrsize": "CIDR size",
502503
"label.cidr.destination.network": "Destination Network CIDR",

ui/src/views/infra/network/IpRangesTabPublic.vue

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,20 @@
220220
<a-select-option v-for="pod in pods" :key="pod.id" :value="pod.id" :label="pod.name">{{ pod.name }}</a-select-option>
221221
</a-select>
222222
</a-form-item>
223+
<a-form-item name="isolationmethod" ref="isolationmethod" class="form__item" v-if="!basicGuestNetwork">
224+
<tooltip-label :title="$t('label.isolation.method')" :tooltip="$t('label.choose.isolation.method.public.ip.range')" class="tooltip-label-wrapper"/>
225+
<a-select
226+
v-model:value="form.isolationmethod"
227+
showSearch
228+
optionFilterProp="label"
229+
:filterOption="(input, option) => {
230+
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
231+
}" >
232+
<a-select-option value="">{{ }}</a-select-option>
233+
<a-select-option value="vlan"> vlan </a-select-option>
234+
<a-select-option value="vxlan"> vxlan </a-select-option>
235+
</a-select>
236+
</a-form-item>
223237
<a-form-item name="vlan" ref="vlan" :label="$t('label.vlan')" class="form__item" v-if="!basicGuestNetwork">
224238
<a-input v-model:value="form.vlan" />
225239
</a-form-item>
@@ -452,7 +466,8 @@ export default {
452466
initAddIpRangeForm () {
453467
this.formRef = ref()
454468
this.form = reactive({
455-
iptype: ''
469+
iptype: '',
470+
isolationmethod: ''
456471
})
457472
this.rules = reactive({
458473
podid: [{ required: true, message: this.$t('label.required') }],
@@ -624,6 +639,15 @@ export default {
624639
if (!this.basicGuestNetwork) {
625640
params.zoneId = this.resource.zoneid
626641
params.vlan = values.vlan
642+
const vlanInput = (values.vlan || '').toString().trim()
643+
if (vlanInput) {
644+
const vlanInputLower = vlanInput.toLowerCase()
645+
const startsWithPrefix = vlanInputLower.startsWith('vlan') || vlanInputLower.startsWith('vxlan')
646+
const isNumeric = /^[0-9]+$/.test(vlanInput)
647+
if (!startsWithPrefix && isNumeric && values.isolationmethod) {
648+
params.vlan = `${values.isolationmethod}://${vlanInput}`
649+
}
650+
}
627651
params.forsystemvms = values.forsystemvms
628652
params.account = values.forsystemvms ? null : values.account
629653
params.domainid = values.forsystemvms ? null : values.domain

0 commit comments

Comments
 (0)