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

Reply via email to