package org.ovirt.engine.core.config.entity.helper; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.config.entity.ConfigKey; import org.ovirt.engine.core.utils.MacAddressRangeUtils; /** * The class verifies the provided MAC address ranges to set the values of MAC addresses pool is defined properly. The * expected format is: * * <pre> * AA:AA:AA:AA:AA:AA-BB:BB:BB:BB:BB:BB,CC:CC:CC:CC:CC:CC-DD:DD:DD:DD:DD:DD,... * </pre> */ public class MacAddressPoolRangesValueHelper extends StringValueHelper { private static final String VALID_MAC_ADDRESS_FORMAT = "(\\p{XDigit}{2}:){5}\\p{XDigit}{2}"; private static final Pattern MAC_ADDRESS_PATTERN = Pattern.compile(VALID_MAC_ADDRESS_FORMAT); @Override public ValidationResult validate(ConfigKey key, String value) { if (StringUtils.isBlank(value)) { 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"); } 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)); } } 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); } private boolean validateRangePart(String rangePart) { return MAC_ADDRESS_PATTERN.matcher(rangePart).matches(); } }