another stateless progress
authorDan Klein <[email protected]>
Sun, 30 Aug 2015 10:59:07 +0000 (13:59 +0300)
committerDan Klein <[email protected]>
Sun, 30 Aug 2015 10:59:07 +0000 (13:59 +0300)
scripts/automation/trex_control_plane/client_utils/packet_builder.py

index 172dcda..0d31f28 100644 (file)
@@ -79,6 +79,13 @@ class CTRexPktBuilder(object):
         def add_vm_variable(self, name):
             if name not in self.vm_variables.keys():
                 self.vm_variables[name] = self.CTRexVMVariable(name)
+            else:
+                raise CTRexPktBuilder.VMVarNameExistsError(name)
+
+        def set_vm_var_field(self, var_name, field_name, val):
+            pass
+            return self.vm_variables[var_name].set_field(field_name, val)
+
 
         def fix_checksum_ipv4(self):
             pass
@@ -91,8 +98,7 @@ class CTRexPktBuilder(object):
 
         def dump(self):
             return [var.dump()
-                    for var in self.vm_variables
-                    if var.is_validty()]
+                    for var in self.vm_variables]
 
         class CTRexVMVariable(object):
             VALID_SIZE = [1, 2, 4, 8]
@@ -110,6 +116,25 @@ class CTRexPktBuilder(object):
                 self.min_addr = str(self.init_addr)
                 self.max_addr = str(self.init_addr)
 
+            def set_field(self, field_name, val):
+                if field_name == "size":
+                    if type(val) != int:
+                        raise CTRexPktBuilder.VMVarFieldTypeError("size", int)
+                    elif val not in self.VALID_SIZE:
+                        raise CTRexPktBuilder.VMVarValueError("size", self.VALID_SIZE)
+                elif field_name == "type":
+                    if type(val) != str:
+                        raise CTRexPktBuilder.VMVarFieldTypeError("type", str)
+                    elif val not in self.VALID_TYPE:
+                        raise CTRexPktBuilder.VMVarValueError("type", self.VALID_TYPE)
+                elif field_name == "core_mask":
+                    if type(val) != str:
+                        raise CTRexPktBuilder.VMVarFieldTypeError("core_mask", str)
+                    elif val not in self.VALID_TYPE:
+                        raise CTRexPktBuilder.VMVarValueError("core_mask", self.VALID_CORE_MASK)
+                # update field value on success
+                setattr(self, field_name, val)
+
             def is_valid(self):
                 if self.size not in self.VALID_SIZE:
                     return False
@@ -152,6 +177,38 @@ class CTRexPktBuilder(object):
             self.message = message or self._default_message
             super(CTRexPktBuilder.IPAddressError, self).__init__(-11, self.message)
 
+    class VMVarNameExistsError(CPacketBuildException):
+        """
+        This exception is used to indicate an error on the IP addressing part of the packet.
+        """
+        def __init__(self, name, message=''):
+            self._default_message = 'The given VM name ({0})already exists as part of the stream.'.format(name)
+            self.message = message or self._default_message
+            super(CTRexPktBuilder.VMVarNameExistsError, self).__init__(-21, self.message)
+
+    class VMVarFieldTypeError(CPacketBuildException):
+        """
+        This exception is used to indicate an error on the IP addressing part of the packet.
+        """
+        def __init__(self, name, ok_type, message=''):
+            self._default_message = 'The desired value of field {field_name} is of type {field_type}, \
+            and not of the allowed {allowed_type}.'.format(field_name=name,
+                                                           field_type=type(name).__name__,
+                                                           allowed_type=ok_type.__name__)
+            self.message = message or self._default_message
+            super(CTRexPktBuilder.VMVarNameExistsError, self).__init__(-31, self.message)
+
+    class VMVarValueError(CPacketBuildException):
+        """
+        This exception is used to indicate an error on the IP addressing part of the packet.
+        """
+        def __init__(self, name, ok_opts, message=''):
+            self._default_message = 'The desired value of field {field_name} is illegal.\n \
+            The only allowed options are: {allowed_opts}.'.format(field_name=name,
+                                                                  allowed_opts=ok_opts)
+            self.message = message or self._default_message
+            super(CTRexPktBuilder.VMVarValueError, self).__init__(-32, self.message)
+
 
 if __name__ == "__main__":
     pass