Martin Mucha has uploaded a new change for review. Change subject: core: lenient validation of mac pool ranges in engine-config ......................................................................
core: lenient validation of mac pool ranges in engine-config • fail when there's no usable mac in supplied ranges • don't fail when there ranges are empty prior to clipping Change-Id: Id7e47c1ab1c2ffd340e1ff2596ee567557324a28 Bug-Url: https://bugzilla.redhat.com/1165025 Signed-off-by: Martin Mucha <mmu...@redhat.com> --- M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java M backend/manager/tools/src/main/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelper.java M backend/manager/tools/src/test/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelperTest.java 3 files changed, 73 insertions(+), 61 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/90/35390/1 diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java index 3beb76b..7d6e820 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java @@ -33,25 +33,39 @@ } public static Collection<LongRange> parseRangeString(String ranges) { - if (StringUtils.isEmpty(ranges)) { + List<String[]> rangeStringBoundaries = rangeStringToStringBoundaries(ranges); + + return parseRangeStringBoundaries(rangeStringBoundaries); + } + + public static Collection<LongRange> parseRangeStringBoundaries(List<String[]> rangeStringBoundaries) { + DisjointRanges disjointRanges = new DisjointRanges(); + for (String[] rangeStringBoundary : rangeStringBoundaries) { + disjointRanges.addRange(macToLong(rangeStringBoundary[0]), macToLong(rangeStringBoundary[1])); + } + + return clipMultiCastsFromRanges(disjointRanges.getRanges()); + } + + public static List<String[]> rangeStringToStringBoundaries(String rangeString) { + if (StringUtils.isEmpty(rangeString)) { return Collections.emptyList(); } - String[] rangesArray = ranges.split("[,]", -1); - DisjointRanges disjointRanges = new DisjointRanges(); - + List<String[]> result = new ArrayList<>(); + String[] rangesArray = rangeString.split("[,]", -1); 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])); + result.add(new String[]{ startEndArray[0], startEndArray[1]}); } else { throw new IllegalArgumentException( "Failed to initialize Mac Pool range. Please fix Mac Pool range: rangesArray[i]"); } } - return clipMultiCastsFromRanges(disjointRanges.getRanges()); + return result; } private static Collection<LongRange> clipMultiCastsFromRanges(Collection<LongRange> ranges) { @@ -122,22 +136,4 @@ return Long.parseLong(StringUtils.remove(mac, ':'), HEX_RADIX); } - 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; - } } diff --git a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelper.java b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelper.java index e772c94..fa72dd6 100644 --- a/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelper.java +++ b/backend/manager/tools/src/main/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelper.java @@ -1,8 +1,11 @@ package org.ovirt.engine.core.config.entity.helper; +import java.util.Collection; +import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.LongRange; import org.ovirt.engine.core.config.entity.ConfigKey; import org.ovirt.engine.core.utils.MacAddressRangeUtils; @@ -26,46 +29,61 @@ return new ValidationResult(false, "The MAC address range cannot be empty."); } - String[] ranges = value.split(","); - for (String range : ranges) { - String[] rangeParts = range.split("-"); - if (rangeParts.length == 2) { - String rangeStart = rangeParts[0].toLowerCase(); - String rangeEnd = rangeParts[1].toLowerCase(); - if (!validateRangePart(rangeStart)) { - return new ValidationResult(false, "The range start is an invalid MAC address. " + rangeStart - + " should be in a format of AA:AA:AA:AA:AA:AA"); - } + try { + List<String[]> rangesBoundaries = MacAddressRangeUtils.rangeStringToStringBoundaries(value); + ValidationResult rangeValidation = validateRangesSyntax(rangesBoundaries); + if (!rangeValidation.isOk()) { + return rangeValidation; + } - if (!validateRangePart(rangeEnd)) { - return new ValidationResult(false, "The range end is an invalid MAC address. " + rangeStart - + " should be in a format of AA:AA:AA:AA:AA:AA"); - } - - if (rangeStart.compareTo(rangeEnd) > 0) { - return new ValidationResult(false, - String.format("The entered range is invalid. %s should be ordered from lower to higer" - + " MAC address. Did you mean %s-%s ?", - range, - rangeEnd, - rangeStart)); - } - - if (!MacAddressRangeUtils.isRangeValid(rangeStart, rangeEnd)) { - return new ValidationResult(false, - String.format("The entered range is invalid. %s contains no valid MAC addresses.", range)); - } - + if (rangesAreEmpty(rangesBoundaries)) { + return new ValidationResult(false, + String.format("The entered ranges is invalid. %s contains no valid MAC addresses.", value)); } else { - return new ValidationResult(false, "The entered value is in imporper format. " + value - + " should be in a format of AA:AA:AA:AA:AA:AA-BB:BB:BB:BB:BB:BB,..."); + return new ValidationResult(true); + } + } catch (IllegalArgumentException e) { + return new ValidationResult(false, "The entered value is in improper format. " + value + + " should be in a format of AA:AA:AA:AA:AA:AA-BB:BB:BB:BB:BB:BB,..."); + } + } + + public static boolean rangesAreEmpty(List<String[]> rangesBoundaries) { + Collection<LongRange> ranges = MacAddressRangeUtils.parseRangeStringBoundaries(rangesBoundaries); + + if (ranges.isEmpty()) { + return true; + } + + for (LongRange range : ranges) { + if (range.getMaximumLong() - range.getMinimumLong() >= 0) { + return false; } } + return true; + } + + private ValidationResult validateRangesSyntax(List<String[]> rangesBoundaries) { + for (String[] rangeBoundaries : rangesBoundaries) { + for (String rangeBoundary : rangeBoundaries) { + ValidationResult startPartValidation = validateRangePart(rangeBoundary); + if (!startPartValidation.isOk()) { + return startPartValidation; + } + } + } return new ValidationResult(true); } - private boolean validateRangePart(String rangePart) { - return MAC_ADDRESS_PATTERN.matcher(rangePart).matches(); + private ValidationResult validateRangePart(String rangePart) { + rangePart.toLowerCase(); + boolean matches = MAC_ADDRESS_PATTERN.matcher(rangePart).matches(); + if (!matches) { + return new ValidationResult(false, "The range start/end is an invalid MAC address. " + rangePart + + " should be in a format of AA:AA:AA:AA:AA:AA"); + } else { + return new ValidationResult(true); + } } } diff --git a/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelperTest.java b/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelperTest.java index 415b4cd..63e0e19 100644 --- a/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelperTest.java +++ b/backend/manager/tools/src/test/java/org/ovirt/engine/core/config/entity/helper/MacAddressPoolRangesValueHelperTest.java @@ -24,7 +24,7 @@ @Test public void validateRanges() { - assertEquals(expectedResult, validator.validate(null, ranges).isOk()); + assertEquals(ranges+" should be "+(expectedResult?"valid":"invalid"), expectedResult, validator.validate(null, ranges).isOk()); } @Parameterized.Parameters @@ -38,13 +38,11 @@ { "AA:AA:AA:AA:AA:AA-AA:AA:AA:AA:AA:AB,AA:AA:AA:AA:AA:AA-AA:AA:AA:AA:AA:AB", true }, { "AA:AA:AA:AA:AA:AA-AA:AA:AA:AA:AA:AB,CC:CC:CC:CC:CC:CC-CC:CC:CC:CC:CC:CD", true }, { "CC:CC:CC:CC:CC:CC-CC:CC:CC:CC:CC:CD,AA:AA:AA:AA:AA:AA-AA:AA:AA:AA:AA:AB", true }, - { "BB:BB:BB:BB:BB:BB-AA:AA:AA:AA:AA:AA", false }, - { "BB:BB:BB:BB:BB:BB-aa:aa:aa:aa:aa:aa", false }, - { "bb:bb:bb:bb:bb:bb-AA:AA:AA:AA:AA:AA", false }, { "BB:BB:BB:BB:BB:BA,BB:BB:BB:BB:BB:BB", false }, { "AA:AA:AA:AA:AA,BB:BB:BB:BB:BB:BB", false }, { "AA-AA-AA-AA-AA-AA-BB-BB-BB-BB-BB-BB", false }, { "AA:AA:AA:AA:AA:AA-AA:AA:AA:AA:AA:AB,XA:AA:AA:AA:AA:AA-BB:BB:BB:BB:BB:BB", false }, + { "01:00:00:00:00:00-01:FF:FF:FF:FF:FF", false}, { null, false }, { "", false }, { " ", false }, -- To view, visit http://gerrit.ovirt.org/35390 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id7e47c1ab1c2ffd340e1ff2596ee567557324a28 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Martin Mucha <mmu...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches