Skip to content

Commit d4f19e9

Browse files
sureshanapartidhslove
authored andcommitted
[VMware] Update vlans with proper range before creating port group for dvSwitch (apache#10708)
1 parent 68281dc commit d4f19e9

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
@@ -276,16 +276,18 @@ public static String getPublicNetworkNamePrefix(String vlanId) {
276276
}
277277
}
278278

279-
public static String composeCloudNetworkName(String prefix, String vlanId, String svlanId, Integer networkRateMbps, String vSwitchName) {
279+
public static String composeCloudNetworkName(String prefix, String vlanId, String svlanId, Integer networkRateMbps, String vSwitchName, VirtualSwitchType vSwitchType) {
280280
StringBuffer sb = new StringBuffer(prefix);
281281
if (vlanId == null || UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
282282
sb.append(".untagged");
283283
} else {
284+
if (vSwitchType != VirtualSwitchType.StandardVirtualSwitch && StringUtils.containsAny(vlanId, ",-")) {
285+
vlanId = com.cloud.utils.StringUtils.numbersToRange(vlanId);
286+
}
284287
sb.append(".").append(vlanId);
285288
if (svlanId != null) {
286289
sb.append(".").append("s" + svlanId);
287290
}
288-
289291
}
290292

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

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

301308
public static Map<String, String> getValidatedVsmCredentials(VmwareContext context) throws Exception {
@@ -598,7 +605,7 @@ public static Pair<ManagedObjectReference, String> prepareNetwork(String physica
598605
if (vlanId != null) {
599606
vlanId = vlanId.replace("vlan://", "");
600607
}
601-
networkName = composeCloudNetworkName(namePrefix, vlanId, secondaryvlanId, networkRateMbps, physicalNetwork);
608+
networkName = composeCloudNetworkName(namePrefix, vlanId, secondaryvlanId, networkRateMbps, physicalNetwork, vSwitchType);
602609

603610
if (vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId) && !StringUtils.containsAny(vlanId, ",-")) {
604611
createGCTag = true;
@@ -1173,8 +1180,9 @@ public static VmwareDistributedVirtualSwitchVlanSpec createDVPortVlanSpec(Intege
11731180
if (vlanId == null && vlanRange != null && !vlanRange.isEmpty()) {
11741181
LOGGER.debug("Creating dvSwitch port vlan-trunk spec with range: " + vlanRange);
11751182
VmwareDistributedVirtualSwitchTrunkVlanSpec trunkVlanSpec = new VmwareDistributedVirtualSwitchTrunkVlanSpec();
1176-
for (final String vlanRangePart : vlanRange.split(",")) {
1177-
if (vlanRangePart == null || vlanRange.isEmpty()) {
1183+
String vlanRangeUpdated = com.cloud.utils.StringUtils.numbersToRange(vlanRange);
1184+
for (final String vlanRangePart : vlanRangeUpdated.split(",")) {
1185+
if (vlanRangePart == null || vlanRangePart.isEmpty()) {
11781186
continue;
11791187
}
11801188
final NumericRange numericRange = new NumericRange();
@@ -1327,7 +1335,7 @@ public static Pair<ManagedObjectReference, String> prepareNetwork(String vSwitch
13271335
// No doubt about this, depending on vid=null to avoid lots of code below
13281336
vid = null;
13291337
} else {
1330-
networkName = composeCloudNetworkName(namePrefix, vlanId, null, networkRateMbps, vSwitchName);
1338+
networkName = composeCloudNetworkName(namePrefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
13311339

13321340
if (vlanId != null && !UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
13331341
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
@@ -581,7 +581,7 @@ public void testComposeCloudNetworkNameTaggedVlanPublicTraffic() throws Exceptio
581581
networkRateMbps = 200;
582582
prefix = "cloud.public";
583583
vSwitchName = "vSwitch0";
584-
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName);
584+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
585585
assertEquals("cloud.public.100.200.1-vSwitch0", cloudNetworkName);
586586
}
587587

@@ -591,7 +591,7 @@ public void testComposeCloudNetworkNameUnTaggedVlanStorageTraffic() throws Excep
591591
networkRateMbps = null;
592592
prefix = "cloud.storage";
593593
vSwitchName = "vSwitch1";
594-
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName);
594+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
595595
assertEquals("cloud.storage.untagged.0.1-vSwitch1", cloudNetworkName);
596596
}
597597

@@ -602,10 +602,60 @@ public void testComposeCloudNetworkNameUnTaggedVlanGuestTraffic() throws Excepti
602602
networkRateMbps = 512;
603603
prefix = "cloud.guest";
604604
vSwitchName = "vSwitch2";
605-
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName);
605+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, svlanId, networkRateMbps, vSwitchName, VirtualSwitchType.StandardVirtualSwitch);
606606
assertEquals("cloud.guest.400.s123.512.1-vSwitch2", cloudNetworkName);
607607
}
608608

609+
@Test
610+
public void testComposeCloudNetworkNameVlanRangeGuestTrafficDvSwitch() {
611+
vlanId = "400-500";
612+
networkRateMbps = 512;
613+
prefix = "cloud.guest";
614+
vSwitchName = "dvSwitch0";
615+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
616+
assertEquals("cloud.guest.400-500.512.1-dvSwitch0", cloudNetworkName);
617+
}
618+
619+
@Test
620+
public void testComposeCloudNetworkNameVlanNumbersGuestTrafficDvSwitch() {
621+
vlanId = "3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020";
622+
networkRateMbps = 512;
623+
prefix = "cloud.guest";
624+
vSwitchName = "dvSwitch0";
625+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
626+
assertEquals("cloud.guest.3001-3020.512.1-dvSwitch0", cloudNetworkName);
627+
}
628+
629+
@Test
630+
public void testComposeCloudNetworkNameVlanNumbersAndRangeGuestTrafficDvSwitch() {
631+
vlanId = "3001,3004-3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3020";
632+
networkRateMbps = 512;
633+
prefix = "cloud.guest";
634+
vSwitchName = "dvSwitch0";
635+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
636+
assertEquals("cloud.guest.3001,3004-3018,3020.512.1-dvSwitch0", cloudNetworkName);
637+
}
638+
639+
@Test
640+
public void testComposeCloudNetworkNameUnorderedVlanNumbersAndRangeGuestTrafficDvSwitch() {
641+
vlanId = "3018,3020,3011,3012,3004-3006,3007,3001,3008,3009,3010,3013,3014,3015,3016,3017";
642+
networkRateMbps = 512;
643+
prefix = "cloud.guest";
644+
vSwitchName = "dvSwitch0";
645+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
646+
assertEquals("cloud.guest.3001,3004-3018,3020.512.1-dvSwitch0", cloudNetworkName);
647+
}
648+
649+
@Test
650+
public void testComposeCloudNetworkNameOverlappingVlanNumbersAndRangeGuestTrafficDvSwitch() {
651+
vlanId = "3018,3020,3011,3012,3004-3006,3007,3001,3008,3009,3010,3013,3014,3015,3016,3017,3005-3008";
652+
networkRateMbps = 512;
653+
prefix = "cloud.guest";
654+
vSwitchName = "dvSwitch0";
655+
String cloudNetworkName = HypervisorHostHelper.composeCloudNetworkName(prefix, vlanId, null, networkRateMbps, vSwitchName, VirtualSwitchType.VMwareDistributedVirtualSwitch);
656+
assertEquals("cloud.guest.3001,3004-3018,3020.512.1-dvSwitch0", cloudNetworkName);
657+
}
658+
609659
@Test
610660
public void testOvfDomRewriter() {
611661
final String ovfString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +

0 commit comments

Comments
 (0)