Yevgeny Zaspitsky has uploaded a new change for review.

Change subject: engine: Add separate validation for multicast MAC address
......................................................................

engine: Add separate validation for multicast MAC address

Split MAC address format validation into two separate ones:
1. Valid MAC address
2. Unicast MAC address

Change-Id: I4077a14fb61c2e082db9f81f1ded3b25ca98fc3f
Bug-Url: https://bugzilla.redhat.com/1118385
Signed-off-by: Yevgeny Zaspitsky <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
4 files changed, 40 insertions(+), 17 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/96/32196/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java
index d8edf59..a8b7ba2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyTemplateCommand.java
@@ -58,7 +58,7 @@
     private List<DiskImage> _templateDisks;
     private StorageDomain sourceDomain;
     private Guid sourceDomainId = Guid.Empty;
-    private final static Pattern VALIDATE_MAC_ADDRESS = 
Pattern.compile(VmNic.UNICAST_MAC_ADDRESS_FORMAT);
+    private final static Pattern VALIDATE_MAC_ADDRESS = 
Pattern.compile("\\p{XDigit}[02468AaCcEe](:\\p{XDigit}{2}){5}");
 
     /**
      * Constructor for command creation when compensation is applied on startup
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java
index eabbfaa..5e7b344 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/MacRange.java
@@ -13,14 +13,21 @@
 
     private Guid macPoolId;
 
-    @Pattern(regexp = VmNic.UNICAST_MAC_ADDRESS_FORMAT,
-            message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID)
+    @Pattern.List({
+                   @Pattern(regexp = VmNic.VALID_MAC_ADDRESS_FORMAT,
+                            message = 
VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID),
+                   @Pattern(regexp = VmNic.NON_MULTICAST_MAC_ADDRESS_FORMAT,
+                            message = 
VmNic.VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST)
+    })
     @NotNull(message= "VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL")
     private String macFrom;
 
-    @Pattern(regexp = VmNic.UNICAST_MAC_ADDRESS_FORMAT,
-            message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID)
-    @NotNull(message = "VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL")
+    @Pattern.List({
+                   @Pattern(regexp = VmNic.VALID_MAC_ADDRESS_FORMAT,
+                            message = 
VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_INVALID),
+                   @Pattern(regexp = VmNic.NON_MULTICAST_MAC_ADDRESS_FORMAT,
+                            message = 
VmNic.VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST)
+    })
     private String macTo;
 
     public String getMacFrom() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java
index 93f406a..ba5159b 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/network/VmNic.java
@@ -14,15 +14,24 @@
  * <code>VmNic</code> defines a type of {@link NetworkInterface} for instances 
of {@link VM}.
  */
 public class VmNic extends NetworkInterface<VmNetworkStatistics> {
-    public static final String UNICAST_MAC_ADDRESS_FORMAT = 
"\\p{XDigit}[02468aAcCeE](:\\p{XDigit}{2}){5}";
-    public static final String NON_NULLABLE_MAC_ADDRESS_FORMAT = 
"^.*(?<!(00:){5}00)$";
 
     private static final long serialVersionUID = 7428150502868988886L;
+
+    private static final String ODD_HEX_DIGIT_PATTERN = "[13579BbDbFdf]";
+
+    public static final String NON_MULTICAST_MAC_ADDRESS_FORMAT =
+            ".*(?<!^\\p{XDigit}" + ODD_HEX_DIGIT_PATTERN + 
"(:\\p{XDigit}{2}){5}$)";
+    public static final String VALID_MAC_ADDRESS_FORMAT =
+            "^(\\p{XDigit}{2}:){5}\\p{XDigit}{2}$";
+
+    public static final String NON_NULLABLE_MAC_ADDRESS_FORMAT = 
"^.*(?<!(00:){5}00)$";
 
     protected static final String VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL =
             "VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL";
     protected static final String VALIDATION_MESSAGE_NAME_NOT_NULL = 
"VALIDATION.VM.NETWORK.NAME.NOT_NULL";
     public static final String VALIDATION_MESSAGE_MAC_ADDRESS_INVALID = 
"VALIDATION.VM.NETWORK.MAC.ADDRESS.INVALID";
+    public static final String VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST =
+            "VALIDATION.VM.NETWORK.MAC.ADDRESS.MULTICAST";
 
     private Guid vmId;
     private Guid vnicProfileId;
@@ -74,15 +83,21 @@
 
     @NotNull(message = VmNic.VALIDATION_MESSAGE_MAC_ADDRESS_NOT_NULL, groups = 
{ UpdateVmNic.class })
     @Pattern.List({
-            @Pattern(regexp = "(^$)|(" + UNICAST_MAC_ADDRESS_FORMAT + ")",
-                    message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID,
-                    groups = { CreateEntity.class }),
-            @Pattern(regexp = UNICAST_MAC_ADDRESS_FORMAT,
-                    message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID,
-                    groups = { UpdateEntity.class }),
-            @Pattern(regexp = NON_NULLABLE_MAC_ADDRESS_FORMAT,
-                    message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID,
-                    groups = { CreateEntity.class, UpdateEntity.class })
+                   @Pattern(regexp = "(^$)|(" + VALID_MAC_ADDRESS_FORMAT + ")",
+                            message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID,
+                            groups = { CreateEntity.class }),
+                   @Pattern(regexp = "(^$)|(" + 
NON_MULTICAST_MAC_ADDRESS_FORMAT + ")",
+                            message = 
VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST,
+                            groups = { CreateEntity.class }),
+                   @Pattern(regexp = VALID_MAC_ADDRESS_FORMAT,
+                            message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID,
+                            groups = { UpdateEntity.class }),
+                   @Pattern(regexp = NON_MULTICAST_MAC_ADDRESS_FORMAT,
+                            message = 
VALIDATION_VM_NETWORK_MAC_ADDRESS_MULTICAST,
+                            groups = { UpdateEntity.class }),
+                   @Pattern(regexp = NON_NULLABLE_MAC_ADDRESS_FORMAT,
+                            message = VALIDATION_MESSAGE_MAC_ADDRESS_INVALID,
+                            groups = { CreateEntity.class, UpdateEntity.class 
})
     })
     @Override
     public String getMacAddress() {
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 c5b3ff3..b8bccb1 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -829,6 +829,7 @@
 VALIDATION_INVALID_CORRELATION_ID=The correlation ID must be formed of 
"a-z0-9A-Z" or "-_"
 VALIDATION.SOURCE_SNAPSHOT_ID.NOT_NULL=Source snapshot is required
 VALIDATION.VM.NETWORK.MAC.ADDRESS.INVALID=MAC address must be in format 
"HH:HH:HH:HH:HH:HH" where H is a hexadecimal character (either a digit or A-F, 
case is insignificant).
+VALIDATION.VM.NETWORK.MAC.ADDRESS.MULTICAST=Multi-cast MAC address is not 
allowed.
 VALIDATION.VM.NETWORK.MAC.ADDRESS.NOT_NULL=MAC address is required.
 VALIDATION.VM.NETWORK.NAME.NOT_NULL=Interface name is required.
 VALIDATION.CONNECTIVITY.TIMEOUT.INVALID=Connectivity timeout is not valid. 
Timeout must be between 1 and 120.


-- 
To view, visit http://gerrit.ovirt.org/32196
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4077a14fb61c2e082db9f81f1ded3b25ca98fc3f
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Yevgeny Zaspitsky <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to