public static Collection<LongRange> parseRangeString(String ranges) { if (StringUtils.isEmpty(ranges)) { return Collections.emptyList(); } String[] rangesArray = ranges.split("[,]", -1); DisjointRanges disjointRanges = new DisjointRanges(); for (int i = 0; i < rangesArray.length; i++) { String[] startEndArray = rangesArray[i].split("[-]", -1); if (startEndArray.length == 2) { disjointRanges.addRange(macToLong(startEndArray[0]), macToLong(startEndArray[1])); } else { throw new IllegalArgumentException( "Failed to initialize Mac Pool range. Please fix Mac Pool range: rangesArray[i]"); } } return clipMultiCastsFromRanges(disjointRanges.getRanges()); }
public static List<String> macAddressesToStrings(List<Long> macAddresses) { final List<String> result = new ArrayList<>(macAddresses.size()); for (Long macAddress : macAddresses) { result.add(macToString(macAddress)); } return result; }
public static boolean isRangeValid(String start, String end) { long startNum = macToLong(start); long endNum = macToLong(end); if (startNum > endNum) { return false; } Collection<LongRange> ranges = parseRangeString(start + "-" + end); for (LongRange range : ranges) { if (range.getMaximumLong() - range.getMinimumLong() < 0) { return false; } } return true; }
/** * @return ranges in this mac pool which overlap each other */ public static Collection<LongRange> filterOverlappingRanges(org.ovirt.engine.core.common.businessentities.MacPool macPool) { Collection<LongRange> longRanges = toRanges(macPool); return filterOverlappingRangeSets(longRanges, longRanges); }
@Test public void testParseWholeRangeMulticast() { String start = "01:FF:FF:FF:FF:00"; String end = "01:FF:FF:FF:FF:00"; final Collection<LongRange> ranges = MacAddressRangeUtils.parseRangeString(start + '-' + end); assertThat(ranges.isEmpty(), is(true)); } }
public static Collection<LongRange> clipMultiCastsFromRanges(Collection<LongRange> ranges) { final Collection<LongRange> result = new ArrayList<>(); for (LongRange range : ranges) { final LongRange clippedRange = clipRange(range); if (clippedRange != null) { result.add(clippedRange); } } return result; }
public static LongRange clipRange(Range range) { long rangeEnd = range.getMaximumLong(); long rangeStart = range.getMinimumLong(); boolean trimmingOccurred = false; if (MacAddressRangeUtils.macIsMulticast(rangeStart)) { rangeStart = (rangeStart | 0x00FFFFFFFFFFL) + 1; trimmingOccurred = true; } final long trimmedRangeEnd = Math.min(rangeStart + Integer.MAX_VALUE - 1, rangeEnd); if (rangeEnd != trimmedRangeEnd) { rangeEnd = trimmedRangeEnd; trimmingOccurred = true; } if (MacAddressRangeUtils.macIsMulticast(rangeEnd)) { rangeEnd = (rangeEnd & 0xFF0000000000L) - 1; trimmingOccurred = true; } if (rangeStart > rangeEnd) { log.warn( "User supplied range({}) contains only multicast addresses, so this range is not usable.", range); return null; } final LongRange result = new LongRange(rangeStart, rangeEnd); if (trimmingOccurred) { log.warn("User supplied range({}) need to be trimmed to {}.", range, result); } return result; }
if (!MacAddressRangeUtils.isRangeValid(rangeStart, rangeEnd)) { return new ValidationResult(false, String.format("The entered range is invalid. %s contains no valid MAC addresses.", range));
@Test public void testParseHugeRange() { String start = "00:1a:4a:01:00:00"; String end = "00:FF:FF:FF:FF:FF"; final long expectedStart = MacAddressRangeUtils.macToLong(start); final long expectedEnd = MacAddressRangeUtils.macToLong(start) + Integer.MAX_VALUE - 1; testRange(start, end, expectedStart, expectedEnd); }
protected void testRange(String start, String end, long expectedStart, long expectedEnd) { final Collection<LongRange> ranges = MacAddressRangeUtils.parseRangeString(start + '-' + end); final LongRange firstRange = ranges.iterator().next(); assertThat(firstRange.getMinimumLong(), equalTo(expectedStart)); assertThat(firstRange.getMaximumLong(), equalTo(expectedEnd)); }
/** * convert mac pool ranges to long ranges for bll usage without union of overlapping ranges */ public static Collection<LongRange> toRanges(org.ovirt.engine.core.common.businessentities.MacPool macPool) { final List<LongRange> ranges = new ArrayList<>(macPool.getRanges().size()); for (MacRange macRange : macPool.getRanges()) { ranges.add(new LongRange(macToLong(macRange.getMacFrom()), macToLong(macRange.getMacTo()))); } return clipMultiCastsFromRanges(ranges); }
@Test public void testMacToLong() { assertThat(MacAddressRangeUtils.macToLong("00:1a:4a:01:00:00"), is(112910729216L)); }
@Test public void testMacToString() { assertThat(MacAddressRangeUtils.macToString(112910729216L), is("00:1a:4a:01:00:00")); }
/** * convert mac pool ranges to long ranges for bll usage with union of any two overlapping ranges into one range */ public static Collection<LongRange> macPoolToRanges(org.ovirt.engine.core.common.businessentities.MacPool macPool) { final DisjointRanges disjointRanges = new DisjointRanges(); for (MacRange macRange : macPool.getRanges()) { disjointRanges.addRange(macToLong(macRange.getMacFrom()), macToLong(macRange.getMacTo())); } return clipMultiCastsFromRanges(disjointRanges.getRanges()); }
@Test public void testParseClippedEndRange() { String start = "00:FF:FF:FF:FF:FF"; String end = "01:1a:4a:01:00:00"; final long expectedStartEnd = MacAddressRangeUtils.macToLong(start); testRange(start, end, expectedStartEnd, expectedStartEnd); }
@Test public void testParseClippedStartRange() { String start = "01:FF:FF:FF:FF:FF"; String end = "02:00:00:00:00:00"; final long expectedStartEnd = MacAddressRangeUtils.macToLong(end); testRange(start, end, expectedStartEnd, expectedStartEnd); }