Eliraz Levi has uploaded a new change for review. Change subject: common: adding maskValidator util ......................................................................
common: adding maskValidator util Change-Id: I04fb0aa2193801688f1bfc5dc7684cabdfa2827d Bug-Url: https://bugzilla.redhat.com/1012881 Signed-off-by: Eliraz Levi <el...@redhat.com> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/ValidationUtils.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/CidrValidator.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskValidator.java A backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskValidatorTest.java 4 files changed, 158 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/44/35144/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/ValidationUtils.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/ValidationUtils.java index 0252dc2..ecf0f93 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/ValidationUtils.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/utils/ValidationUtils.java @@ -22,16 +22,24 @@ public static final String ONLY_ASCII_OR_NONE = "[\\p{ASCII}]*"; public static final String NO_SPECIAL_CHARACTERS_WITH_DOT = "[0-9a-zA-Z-_\\.]+"; public static final String NO_TRIMMING_WHITE_SPACES_PATTERN = "^$|\\S.*\\S"; + // TODO elevi "" return true for this/.. public static final String IP_PATTERN = "^\\b((25[0-5]|2[0-4]\\d|[01]\\d\\d|\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|[01]\\d\\d|\\d?\\d)\\b$|^$"; public static final String CIDR_FORMAT_PATTERN = "^\\b((25[0-5]|2[0-4]\\d|[01]\\d\\d|\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|[01]\\d\\d|\\d?\\d)(?:/(?:3[0-2]|[12]?[0-9]))$"; public static final String ISO_SUFFIX = ".iso"; public static final String ISO_SUFFIX_PATTERN = "^$|^.+\\.iso$"; + public static final String SUBNET_PATTERN_AS_NETMASK = "^([3][0-2]|[0-2][0-9]|[0-9])$"; + public static final String NETMASK_PATTERN = + "(^\\b((25[0-5]|2[0-4]\\d|[01]\\d\\d|\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|[01]\\d\\d|\\d?\\d)\\b$)|(" + + SUBNET_PATTERN_AS_NETMASK + ")+"; - /** the mask will be replaced with zero-padded number in the generated names of the VMs in the pool, - * see NameForVmInPoolGeneratorTest PoolNameValidationTest for valid and invalid expressions of this pattern */ - public static final String POOL_NAME_PATTERN = "^[\\p{L}0-9._-]+[" + VmPool.MASK_CHARACTER + "]*[\\p{L}0-9._-]*$|^[\\p{L}0-9._-]*[" + VmPool.MASK_CHARACTER + "]*[\\p{L}0-9._-]+$"; + /** + * the mask will be replaced with zero-padded number in the generated names of the VMs in the pool, see + * NameForVmInPoolGeneratorTest PoolNameValidationTest for valid and invalid expressions of this pattern + */ + public static final String POOL_NAME_PATTERN = "^[\\p{L}0-9._-]+[" + VmPool.MASK_CHARACTER + + "]*[\\p{L}0-9._-]*$|^[\\p{L}0-9._-]*[" + VmPool.MASK_CHARACTER + "]*[\\p{L}0-9._-]+$"; private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/CidrValidator.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/CidrValidator.java index 951e588..18e63ca 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/CidrValidator.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/CidrValidator.java @@ -45,7 +45,7 @@ return isNetworkAddress(ipAsInteger, mask); } - private static long covnertIpToInt(String ipAdd) { + protected static long covnertIpToInt(String ipAdd) { String[] subAdd = ipAdd.split("\\."); long output = 0; long temp; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskValidator.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskValidator.java new file mode 100644 index 0000000..57da54f --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskValidator.java @@ -0,0 +1,67 @@ +package org.ovirt.engine.core.common.validation; + +import org.ovirt.engine.core.common.utils.ValidationUtils; + +public class MaskValidator { + + private static MaskValidator validator = new MaskValidator(); + + private MaskValidator() { + + } + + public static MaskValidator getInstance() { + return validator; + } + + /*** + * Check if mask is in IP format: x.x.x.x or string [0-32] where: + * <ul> + * <li>x belongs to [0,255] + * </ul> + * <p> + * <b>Note!</b> the function is not validating that mask value is valid, please see @see + * {@link MaskValidator#isMaskValid(String)} + * + * @return true if correct IP format or string [0-32], false otherwise. + */ + public boolean isMaskFormatValid(String mask) { + return mask != null && mask.matches(ValidationUtils.NETMASK_PATTERN); + } + + /*** + * check if mask is valid + * + * @param mask + * assume in correct format, please use the following function first: @see + * {@link MaskValidator#isMaskFormatValid(String)} + * @return true if valid mask ,false otherwise + */ + public boolean isMaskValid(String mask) { + if (mask.matches(ValidationUtils.SUBNET_PATTERN_AS_NETMASK)) { + return true; + } + + long maskAsInt = CidrValidator.covnertIpToInt(mask); + long flag = 1; + flag <<= 32; + + boolean isFirstZeroFound = false; + for (int i = 0; i < 32; i++) { + flag >>= 1; + if (!isFirstZeroFound && (flag & maskAsInt) == 0) { + isFirstZeroFound = true; + continue; + } + + if ((flag & maskAsInt) != 0 && isFirstZeroFound) { + return false; + } + + } + + return true; + + } + +} diff --git a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskValidatorTest.java b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskValidatorTest.java new file mode 100644 index 0000000..72cc1c4 --- /dev/null +++ b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskValidatorTest.java @@ -0,0 +1,79 @@ +package org.ovirt.engine.core.common.validation; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Collection; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class MaskValidatorTest { + + private final String mask; + private final boolean isMaskValidFormat; + private final boolean isMaskValid; + + public MaskValidatorTest(String mask, boolean isMaskValidFormat, boolean isMaskValid) { + this.mask = mask; + this.isMaskValidFormat = isMaskValidFormat; + this.isMaskValid = isMaskValid; + } + + @Test + public void checkMaskFormatValidator() { + assertEquals("Failed to validate mask's Format: " + mask, + isMaskValidFormat, + MaskValidator.getInstance().isMaskFormatValid(mask)); + } + + @Test + public void checkMaskValidAddress() { + + if (!isMaskValidFormat) { + return; + } + + assertEquals("Failed to validate mask value" + mask, + isMaskValid, + MaskValidator.getInstance().isMaskValid(mask)); + + } + + @Parameterized.Parameters + public static Collection<Object[]> namesParams() { + return Arrays.asList(new Object[][] { + + // Bad Format prefix format + { null, false, false }, //$NON-NLS-1$ + { "a.a.a.a", false, false }, //$NON-NLS-1$ + { "255.255.0", false, false }, //$NON-NLS-1$ + { "255.255.0.0.0", false, false }, //$NON-NLS-1$ + { "255.255.0.0.", false, false }, //$NON-NLS-1$ + + // Prefix not valid + { "255.255.0.1", true, false }, //$NON-NLS-1$ + { "255.0.255.0", true, false }, //$NON-NLS-1$ + { "255.0.0.255", true, false }, //$NON-NLS-1$ + { "224.0.255.0", true, false }, //$NON-NLS-1$ + + // Valid prefix + { "255.255.0.0", true, true }, //$NON-NLS-1$ + { "255.255.255.255", true, true }, //$NON-NLS-1$ + + // 0-32 bad format format + { "31 ", false, false }, //$NON-NLS-1$ + { "33", false, false }, //$NON-NLS-1$ + { "31/", false, false }, //$NON-NLS-1$ + { "31*", false, false }, //$NON-NLS-1$ + { "//31 ", false, false }, //$NON-NLS-1$ + + // 0-32 valid + { "31", true, true }, //$NON-NLS-1$ + + }); + } + +} -- To view, visit http://gerrit.ovirt.org/35144 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I04fb0aa2193801688f1bfc5dc7684cabdfa2827d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Eliraz Levi <el...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches