Eliraz Levi has uploaded a new change for review. Change subject: backend: allowing netmask as mask in staticIP conf ......................................................................
backend: allowing netmask as mask in staticIP conf allowing having netmask as mask of static IP configuration field, using maskValidation utill Change-Id: If92f2ec51f9cb647d6008b2fd2b1ab4c3db1d3f1 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/action/UpdateNetworkToVdsParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/AConstraint.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskConstraint.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/Mask.java A backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/utils/MaskAnnotationTest.java A backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskConstraintTest.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java 9 files changed, 280 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/55/35155/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateNetworkToVdsParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateNetworkToVdsParameters.java index 97dfc6b..2cfa6fa 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateNetworkToVdsParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateNetworkToVdsParameters.java @@ -3,9 +3,11 @@ import java.util.ArrayList; import javax.validation.Valid; +import javax.validation.constraints.Pattern; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; +import org.ovirt.engine.core.common.utils.ValidationUtils; import org.ovirt.engine.core.compat.Guid; public class UpdateNetworkToVdsParameters extends AttachNetworkToVdsParameters { @@ -15,6 +17,13 @@ private ArrayList<VdsNetworkInterface> interfaces; private String bondName; + // TODO elevi ask if different message need to be defined + @Pattern(regexp = ValidationUtils.IP_PATTERN + "^[0-32]$", message = "UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT") + @Override + public String getSubnet() { + return super.getSubnet(); + } + public UpdateNetworkToVdsParameters() { } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 3e584fa..57bc928 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -540,6 +540,8 @@ NETWORK_CANNOT_DETACH_NETWORK_USED_BY_VMS(ErrorType.CONFLICT), BAD_CIDR_FORMAT(ErrorType.BAD_PARAMETERS), CIDR_NOT_NETWORK_ADDRESS(ErrorType.BAD_PARAMETERS), + UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT(ErrorType.BAD_PARAMETERS), + UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_VALUE(ErrorType.BAD_PARAMETERS), NON_VM_NETWORK_CANNOT_SUPPORT_STP(ErrorType.CONFLICT), NETWORK_MTU_DIFFERENCES(ErrorType.CONFLICT), NETWORK_MTU_OVERRIDE_NOT_SUPPORTED(ErrorType.CONFLICT), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/AConstraint.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/AConstraint.java new file mode 100644 index 0000000..a51cf41 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/AConstraint.java @@ -0,0 +1,81 @@ +package org.ovirt.engine.core.common.validation; + +import javax.validation.ConstraintValidatorContext; + +public class AConstraint { + + private static AConstraint aConstraint = new AConstraint(); + + private AConstraint() { + + } + + public static AConstraint getInstance() { + return aConstraint; + } + + public class AConstraintArgsFormatValue { + protected boolean isValidFormat; + protected boolean isValidValue; + protected String badFormatErrorMessage; + protected String badValueErrorMessage; + + @SuppressWarnings("unused") + private AConstraintArgsFormatValue() { + + } + + public AConstraintArgsFormatValue(boolean isValidFormat, + boolean isValidValue, + String badFormatErrorMessage, + String badValueErrorMessage) { + this.isValidFormat = isValidFormat; + this.isValidValue = isValidValue; + this.badFormatErrorMessage = badFormatErrorMessage; + this.badValueErrorMessage = badValueErrorMessage; + } + } + + public class AConstraintArgsFormat { + protected boolean isValidFormat; + protected String badFormatErrorMessage; + + @SuppressWarnings("unused") + private AConstraintArgsFormat() { + + } + + public AConstraintArgsFormat(boolean isValidFormat, String badFormatErrorMessage) { + this.isValidFormat = isValidFormat; + this.badFormatErrorMessage = badFormatErrorMessage; + } + } + + public boolean isValid(AConstraintArgsFormatValue args, ConstraintValidatorContext context) { + if (!args.isValidFormat) { + return failWith(context, args.badFormatErrorMessage); + } + else if (!args.isValidValue) { + return failWith(context, args.badValueErrorMessage); + } + + return true; + } + + public boolean isValid(AConstraintArgsFormat args, ConstraintValidatorContext context) { + if (!args.isValidFormat) { + return failWith(context, args.badFormatErrorMessage); + } + + return true; + } + + private boolean failWith(ConstraintValidatorContext context, String message) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(message) + .addNode("cidr") + .addConstraintViolation(); + return false; + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskConstraint.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskConstraint.java new file mode 100644 index 0000000..0229d38 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/MaskConstraint.java @@ -0,0 +1,37 @@ +package org.ovirt.engine.core.common.validation; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.validation.annotation.Mask; + +public class MaskConstraint implements ConstraintValidator<Mask, String> { + + @Override + public void initialize(Mask constraintAnnotation) { + } + + @Override + public boolean isValid(String mask, ConstraintValidatorContext context) { + AConstraint.AConstraintArgsFormatValue args = + AConstraint.getInstance().new AConstraintArgsFormatValue(isMaskFormatValid(mask), + isMaskValid(mask), + VdcBllMessages.UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT.name(), + VdcBllMessages.UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_VALUE.name()); + return AConstraint.getInstance().isValid(args, context); + } + + private boolean isMaskFormatValid(String mask) { + return getMaskValidator().isMaskFormatValid(mask); + } + + private boolean isMaskValid(String mask) { + return getMaskValidator().isMaskValid(mask); + } + + MaskValidator getMaskValidator() { + return MaskValidator.getInstance(); + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/Mask.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/Mask.java new file mode 100644 index 0000000..e52e639 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/validation/annotation/Mask.java @@ -0,0 +1,25 @@ +package org.ovirt.engine.core.common.validation.annotation; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import org.ovirt.engine.core.common.validation.MaskConstraint; + +@Target({ FIELD }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = MaskConstraint.class) +public @interface Mask { + String message() default ""; + + Class<?>[] groups() default {}; + + Class<? extends Payload>[] payload() default {}; +} diff --git a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/utils/MaskAnnotationTest.java b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/utils/MaskAnnotationTest.java new file mode 100644 index 0000000..942f560 --- /dev/null +++ b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/utils/MaskAnnotationTest.java @@ -0,0 +1,113 @@ +package org.ovirt.engine.core.common.utils; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validator; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.validation.annotation.Mask; + +@RunWith(Parameterized.class) +public class MaskAnnotationTest { + + private final String mask; + private final boolean isValidMaskFormat; + private final boolean isValidMaskValue; + private Validator validator; + + public MaskAnnotationTest(String mask, + boolean isValidMaskFormat, + boolean isValidMaskValue) { + this.mask = mask; + this.isValidMaskFormat = isValidMaskFormat; + this.isValidMaskValue = isValidMaskValue; + } + + @Before + public void setup() throws Exception { + validator = ValidationUtils.getValidator(); + } + + @Test + public void checkCidrFormatAnnotation() { + MaskContainer container = new MaskContainer(mask); + Set<ConstraintViolation<MaskContainer>> result = validator.validate(container); + if (!isValidMaskValue && isValidMaskFormat) { + assertEquals("Failed to validate mask's error format: " + container.getMask(), + VdcBllMessages.UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_VALUE.name(), + result.iterator().next().getMessage()); + } else if (!isValidMaskFormat) { + assertEquals("Failed to validate mask's error format: " + container.getMask(), + VdcBllMessages.UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT.name(), + result.iterator().next().getMessage()); + } else { + assertEquals("Failed to validate mask's format: " + container.getMask(), + isValidMaskFormat, + result.isEmpty()); + } + + } + + @Test + public void checkCidrNetworkAddressAnnotation() { + MaskContainer container = new MaskContainer(mask); + Set<ConstraintViolation<MaskContainer>> result = validator.validate(container); + if (!isValidMaskFormat) { + assertEquals("Failed to validate mask's network address error: " + container.getMask(), + VdcBllMessages.UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT.name(), + result.iterator().next().getMessage()); + } else if (!isValidMaskValue) { + assertEquals("Failed to validate mask's network address error: " + container.getMask(), + VdcBllMessages.UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_VALUE.name(), + result.iterator().next().getMessage()); + } else { + assertEquals("Failed to validate mask's network address: " + container.getMask(), + isValidMaskValue, + result.isEmpty()); + } + + } + + @Parameterized.Parameters + public static Collection<Object[]> namesParams() { + + return Arrays.asList(new Object[][] { + // Bad Format + { "a.a.a.a", false, false }, + { "//32", false, false }, + { "33", false, false }, + + // Not A Valid Mask + { "253.0.0.32", true, false }, + + // valid mask + { "255.255.255.0", true, true }, + { "15", true, true } + }); + + } + + private class MaskContainer { + @Mask + private final String mask; + + public MaskContainer(String mask) { + this.mask = mask; + } + + public String getMask() { + return mask; + } + + } + +} diff --git a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskConstraintTest.java b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskConstraintTest.java new file mode 100644 index 0000000..8905710 --- /dev/null +++ b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/validation/MaskConstraintTest.java @@ -0,0 +1,5 @@ +package org.ovirt.engine.core.common.validation; + +public class MaskConstraintTest { + +} diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index b4b1970..53cb800 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -743,6 +743,8 @@ NETWORK_ADDR_IN_STATIC_IP_BAD_FORMAT=Bad format of IP address NETWORK_ADDR_IN_GATEWAY_BAD_FORMAT=Bad format of gateway address NETWORK_ADDR_IN_SUBNET_BAD_FORMAT=Bad format of subnet mask +UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT= Bad format of subnet mask or number +UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_VALUE = Invalid subnet's prefix NETWORK_BOND_NAME_BAD_FORMAT=Bad bond name, it must begin with the prefix 'bond' followed by a number. NETWORK_CANNOT_CONTAIN_BOND_NAME=Bad network name, network cannot start with 'bond' RHEVH_LOCALFS_WRONG_PATH_LOCATION=Local Storage folder on RHEV Hypervisor must be located under ${path} diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index 70cc80f..c69e8c4 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -2015,6 +2015,12 @@ @DefaultStringValue("Bad format of subnet mask") String NETWORK_ADDR_IN_SUBNET_BAD_FORMAT(); + @DefaultStringValue("Invalid subnet's prefix") + String UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_VALUE(); + + @DefaultStringValue("Bad format of subnet mask or number") + String UPDATE_NETWORK_ADDR_IN_SUBNET_BAD_FORMAT(); + @DefaultStringValue("Bad bond name, it must begin with the prefix 'bond' followed by a number.") String NETWORK_BOND_NAME_BAD_FORMAT(); -- To view, visit http://gerrit.ovirt.org/35155 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If92f2ec51f9cb647d6008b2fd2b1ab4c3db1d3f1 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