Skip to content

Commit f0838cd

Browse files
[VMware] Update vlans with proper range before creating port group for dvSwitch (#10708)
1 parent 919c979 commit f0838cd

File tree

3 files changed

+159
-11
lines changed

3 files changed

+159
-11
lines changed

utils/src/main/java/com/cloud/utils/StringUtils.java

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.util.HashMap;
2929
import java.util.List;
3030
import java.util.Map;
31+
import java.util.Set;
32+
import java.util.TreeSet;
3133
import java.util.regex.Matcher;
3234
import java.util.regex.Pattern;
3335

@@ -90,7 +92,7 @@ public static List<String> csvTagsToList(final String tags) {
9092

9193
/**
9294
* Converts a List of tags to a comma separated list
93-
* @param tags
95+
* @param tagsList
9496
* @return String containing a comma separated list of tags
9597
*/
9698

@@ -304,4 +306,92 @@ public static Map<String, String> parseJsonToMap(String jsonString) {
304306

305307
return mapResult;
306308
}
309+
310+
/**
311+
* Converts the comma separated numbers to ranges for any consecutive numbers in the input with numbers (and ranges)
312+
* Eg: "198,200-203,299,300,301,303,304,305,306,307,308,311,197" to "197-198,200-203,299-301,303-308,311"
313+
* @param inputNumbersAndRanges
314+
* @return String containing a converted ranges for any consecutive numbers
315+
*/
316+
public static String numbersToRange(String inputNumbersAndRanges) {
317+
Set<Integer> numberSet = new TreeSet<>();
318+
for (String inputNumber : inputNumbersAndRanges.split(",")) {
319+
inputNumber = inputNumber.trim();
320+
if (inputNumber.contains("-")) {
321+
String[] range = inputNumber.split("-");
322+
if (range.length == 2 && range[0] != null && range[1] != null) {
323+
int start = NumbersUtil.parseInt(range[0], 0);
324+
int end = NumbersUtil.parseInt(range[1], 0);
325+
for (int i = start; i <= end; i++) {
326+
numberSet.add(i);
327+
}
328+
}
329+
} else {
330+
numberSet.add(NumbersUtil.parseInt(inputNumber, 0));
331+
}
332+
}
333+
334+
StringBuilder result = new StringBuilder();
335+
if (!numberSet.isEmpty()) {
336+
List<Integer> numbers = new ArrayList<>(numberSet);
337+
int startNumber = numbers.get(0);
338+
int endNumber = startNumber;
339+
340+
for (int i = 1; i < numbers.size(); i++) {
341+
if (numbers.get(i) == endNumber + 1) {
342+
endNumber = numbers.get(i);
343+
} else {
344+
appendRange(result, startNumber, endNumber);
345+
startNumber = endNumber = numbers.get(i);
346+
}
347+
}
348+
appendRange(result, startNumber, endNumber);
349+
}
350+
351+
return result.toString();
352+
}
353+
354+
private static void appendRange(StringBuilder sb, int startNumber, int endNumber) {
355+
if (sb.length() > 0) {
356+
sb.append(",");
357+
}
358+
if (startNumber == endNumber) {
359+
sb.append(startNumber);
360+
} else {
361+
sb.append(startNumber).append("-").append(endNumber);
362+
}
363+
}
364+
365+
/**
366+
* Converts the comma separated numbers and ranges to numbers
367+
* Eg: "197-198,200-203,299-301,303-308,311" to "197,198,200,201,202,203,299,300,301,303,304,305,306,307,308,311"
368+
* @param inputNumbersAndRanges
369+
* @return String containing a converted numbers
370+
*/
371+
public static String rangeToNumbers(String inputNumbersAndRanges) {
372+
Set<Integer> numberSet = new TreeSet<>();
373+
for (String inputNumber : inputNumbersAndRanges.split(",")) {
374+
inputNumber = inputNumber.trim();
375+
if (inputNumber.contains("-")) {
376+
String[] range = inputNumber.split("-");
377+
int startNumber = Integer.parseInt(range[0]);
378+
int endNumber = Integer.parseInt(range[1]);
379+
for (int i = startNumber; i <= endNumber; i++) {
380+
numberSet.add(i);
381+
}
382+
} else {
383+
numberSet.add(Integer.parseInt(inputNumber));
384+
}
385+
}
386+
387+
StringBuilder result = new StringBuilder();
388+
for (int number : numberSet) {
389+
if (result.length() > 0) {
390+
result.append(",");
391+
}
392+
result.append(number);
393+
}
394+
395+
return result.toString();
396+
}
307397
}

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,16 +274,18 @@ public static String getPublicNetworkNamePrefix(String vlanId) {
274274
}
275275
}
276276

277-
public static String composeCloudNetworkName(String prefix, String vlanId, String svlanId, Integer networkRateMbps, String vSwitchName) {
277+
public static String composeCloudNetworkName(String prefix, String vlanId, String svlanId, Integer networkRateMbps, String vSwitchName, VirtualSwitchType vSwitchType) {
278278
StringBuffer sb = new StringBuffer(prefix);
279279
if (vlanId == null || UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
280280
sb.append(".untagged");
281281
} else {
282+
if (vSwitchType != VirtualSwitchType.StandardVirtualSwitch && StringUtils.containsAny(vlanId, ",-")) {
283+
vlanId = com.cloud.utils.StringUtils.numbersToRange(vlanId);
284+
}
282285
sb.append(".").append(vlanId);
283286
if (svlanId != null) {
284287
sb.append(".").append("s" + svlanId);
285288
}
286-
287289
}
288290

289291
if (networkRateMbps != null && networkRateMbps.intValue() > 0)
@@ -293,7 +295,12 @@ public static String composeCloudNetworkName(String prefix, String vlanId, Strin
293295
sb.append(".").append(VersioningContants.PORTGROUP_NAMING_VERSION);
294296
sb.append("-").append(vSwitchName);
295297

296-
return sb.toString();
298+
String networkName = sb.toString();
299+
if (networkName.length() > 80) {
300+
// the maximum limit for a vSwitch name is 80 chars, applies to both standard and distributed virtual switches.
301+
s_logger.warn(String.format("The network name: %s for the vSwitch %s of type %s, exceeds 80 chars", networkName, vSwitchName, vSwitchType));
302+
}
303+
return networkName;
297304
}
298305

299306
public static Map<String, String> getValidatedVsmCredentials(VmwareContext context) throws Exception {
@@ -595,7 +602,7 @@ public static Pair<ManagedObjectReference, String> prepareNetwork(String physica
595602
if (vlanId != null) {
596603
vlanId = vlanId.replace("vlan://", "");
597604
}
598-
networkName = composeCloudNetworkName(namePrefix, vlanId, secondaryvlanId, networkRateMbps, physicalNetwork);
605+
networkName = composeCloudNetworkName(namePrefix, vlanId, secondaryvlanId, networkRateMbps, physicalNetwork, vSwitchType);
599606

600607
if (vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId) && !StringUtils.containsAny(vlanId, ",-")) {
601608
createGCTag = true;
@@ -1167,8 +1174,9 @@ public static VmwareDistributedVirtualSwitchVlanSpec createDVPortVlanSpec(Intege
11671174
if (vlanId == null && vlanRange != null && !vlanRange.isEmpty()) {
11681175
s_logger.debug("Creating dvSwitch port vlan-trunk spec with range: " + vlanRange);
11691176
VmwareDistributedVirtualSwitchTrunkVlanSpec trunkVlanSpec = new VmwareDistributedVirtualSwitchTrunkVlanSpec();
1170-
for (final String vlanRangePart : vlanRange.split(",")) {
1171-
if (vlanRangePart == null || vlanRange.isEmpty()) {
1177+
String vlanRangeUpdated = com.cloud.utils.StringUtils.numbersToRange(vlanRange);
1178+
for (final String vlanRangePart : vlanRangeUpdated.split(",")) {
1179+
if (vlanRangePart == null || vlanRangePart.isEmpty()) {
11721180
continue;
11731181
}
11741182
final NumericRange numericRange = new NumericRange();
@@ -1320,7 +1328,7 @@ public static Pair<ManagedObjectReference, String> prepareNetwork(String vSwitch
13201328
// No doubt about this, depending on vid=null to avoid lots of code below
13211329
vid = null;
13221330
} else {
1323-
networkName = composeCloudNetworkName(namePrefix, vlanId, null, networkRateMbps, vSwitchName);
1331+
networkName = composeCloudNetworkName(namePrefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
13241332

13251333
if (vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
13261334
createGCTag = true;

vmware-base/src/test/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelperTest.java

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ public void testComposeCloudNetworkNameTaggedVlanPublicTraffic() throws Exceptio
557557
networkRateMbps = 200;
558558
prefix = "cloud.public";
559559
vSwitchName = "vSwitch0";
560-
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName);
560+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
561561
assertEquals("cloud.public.100.200.1-vSwitch0", cloudNetworkName);
562562
}
563563

@@ -567,7 +567,7 @@ public void testComposeCloudNetworkNameUnTaggedVlanStorageTraffic() throws Excep
567567
networkRateMbps = null;
568568
prefix = "cloud.storage";
569569
vSwitchName = "vSwitch1";
570-
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName);
570+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
571571
assertEquals("cloud.storage.untagged.0.1-vSwitch1", cloudNetworkName);
572572
}
573573

@@ -578,10 +578,60 @@ public void testComposeCloudNetworkNameUnTaggedVlanGuestTraffic() throws Excepti
578578
networkRateMbps = 512;
579579
prefix = "cloud.guest";
580580
vSwitchName = "vSwitch2";
581-
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName);
581+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
582582
assertEquals("cloud.guest.400.s123.512.1-vSwitch2", cloudNetworkName);
583583
}
584584

585+
@Test
586+
public void testComposeCloudNetworkNameVlanRangeGuestTrafficDvSwitch() {
587+
vlanId = "400-500";
588+
networkRateMbps = 512;
589+
prefix = "cloud.guest";
590+
vSwitchName = "dvSwitch0";
591+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
592+
assertEquals("cloud.guest.400-500.512.1-dvSwitch0", cloudNetworkName);
593+
}
594+
595+
@Test
596+
public void testComposeCloudNetworkNameVlanNumbersGuestTrafficDvSwitch() {
597+
vlanId = "3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020";
598+
networkRateMbps = 512;
599+
prefix = "cloud.guest";
600+
vSwitchName = "dvSwitch0";
601+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
602+
assertEquals("cloud.guest.3001-3020.512.1-dvSwitch0", cloudNetworkName);
603+
}
604+
605+
@Test
606+
public void testComposeCloudNetworkNameVlanNumbersAndRangeGuestTrafficDvSwitch() {
607+
vlanId = "3001,3004-3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3020";
608+
networkRateMbps = 512;
609+
prefix = "cloud.guest";
610+
vSwitchName = "dvSwitch0";
611+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
612+
assertEquals("cloud.guest.3001,3004-3018,3020.512.1-dvSwitch0", cloudNetworkName);
613+
}
614+
615+
@Test
616+
public void testComposeCloudNetworkNameUnorderedVlanNumbersAndRangeGuestTrafficDvSwitch() {
617+
vlanId = "3018,3020,3011,3012,3004-3006,3007,3001,3008,3009,3010,3013,3014,3015,3016,3017";
618+
networkRateMbps = 512;
619+
prefix = "cloud.guest";
620+
vSwitchName = "dvSwitch0";
621+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
622+
assertEquals("cloud.guest.3001,3004-3018,3020.512.1-dvSwitch0", cloudNetworkName);
623+
}
624+
625+
@Test
626+
public void testComposeCloudNetworkNameOverlappingVlanNumbersAndRangeGuestTrafficDvSwitch() {
627+
vlanId = "3018,3020,3011,3012,3004-3006,3007,3001,3008,3009,3010,3013,3014,3015,3016,3017,3005-3008";
628+
networkRateMbps = 512;
629+
prefix = "cloud.guest";
630+
vSwitchName = "dvSwitch0";
631+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
632+
assertEquals("cloud.guest.3001,3004-3018,3020.512.1-dvSwitch0", cloudNetworkName);
633+
}
634+
585635
@Test
586636
public void testOvfDomRewriter() {
587637
final String ovfString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +

0 commit comments

Comments
 (0)