CSIT-49: HC Test: Policy - security groups
[csit.git] / resources / libraries / python / honeycomb / HcAPIKwInterfaces.py
index ec928a7..4eaef11 100644 (file)
@@ -307,8 +307,8 @@ class InterfaceKeywords(object):
 
         :param node: Honeycomb node.
         :param interface: The name of interface.
+        :type node: dict
         :type interface: str
-        :type param: str
         :return: Operational data about bridge domain settings in the
         interface.
         :rtype: dict
@@ -390,6 +390,7 @@ class InterfaceKeywords(object):
         :type network: str or int
         :return: Content of response.
         :rtype: bytearray
+        :raises HoneycombError: If the provided netmask or prefix is not valid.
         """
 
         path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4")
@@ -417,6 +418,7 @@ class InterfaceKeywords(object):
         :type network: str or int
         :return: Content of response.
         :rtype: bytearray
+        :raises HoneycombError: If the provided netmask or prefix is not valid.
         """
 
         path = ("interfaces", ("interface", "name", interface), "ietf-ip:ipv4",
@@ -1157,27 +1159,101 @@ class InterfaceKeywords(object):
                                  "information about the tag-rewrite.")
 
     @staticmethod
-    def compare_data_structures(data, ref):
+    def add_ipv4_address_to_sub_interface(node, super_interface, identifier,
+                                          ip_addr, network):
+        """Add an ipv4 address to the specified sub-interface, with the provided
+        netmask or network prefix length. Any existing ipv4 addresses on the
+        sub-interface will be replaced.
+
+        :param node: Honeycomb node.
+        :param super_interface: Super interface.
+        :param identifier: The ID of sub-interface.
+        :param ip_addr: IPv4 address to be set.
+        :param network: Network mask or network prefix length.
+        :type node: dict
+        :type super_interface: str
+        :type identifier: int
+        :type ip_addr: str
+        :type network: str or int
+        :return: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If the provided netmask or prefix is not valid.
+        """
+
+        path = ("interfaces",
+                ("interface", "name", super_interface),
+                "vpp-vlan:sub-interfaces",
+                ("sub-interface", "identifier", int(identifier)),
+                "ipv4")
+
+        if isinstance(network, basestring):
+            address = {"address": [{"ip": ip_addr, "netmask": network}, ]}
+
+        elif isinstance(network, int) and 0 < network < 33:
+            address = {"address": [{"ip": ip_addr, "prefix-length": network}, ]}
+
+        else:
+            raise HoneycombError("{0} is not a valid netmask or prefix length."
+                                 .format(network))
+
+        return InterfaceKeywords._set_interface_properties(
+            node, super_interface, path, address)
+
+    @staticmethod
+    def remove_all_ipv4_addresses_from_sub_interface(node, super_interface, # pylint: disable=invalid-name
+                                                     identifier):
+        """Remove all ipv4 addresses from the specified sub-interface.
+
+        :param node: Honeycomb node.
+        :param super_interface: Super interface.
+        :param identifier: The ID of sub-interface.
+        :type node: dict
+        :type super_interface: str
+        :type identifier: int
+        :return: Content of response.
+        :rtype: bytearray
+        """
+
+        path = ("interfaces",
+                ("interface", "name", super_interface),
+                "vpp-vlan:sub-interfaces",
+                ("sub-interface", "identifier", int(identifier)),
+                "ipv4", "address")
+
+        return InterfaceKeywords._set_interface_properties(
+            node, super_interface, path, None)
+
+    @staticmethod
+    def compare_data_structures(data, ref, ignore=()):
         """Checks if data obtained from UUT is as expected.
 
         :param data: Data to be checked.
         :param ref: Referential data used for comparison.
+        :param ignore: Dictionary keys to be ignored.
         :type data: dict
         :type ref: dict
+        :type ignore: iterable
         :raises HoneycombError: If a parameter from referential data is not
         present in operational data or if it has different value.
         """
 
+        errors = ""
+
         for key, item in ref.items():
+            if key in ignore:
+                continue
             try:
                 if data[key] != item:
-                    raise HoneycombError("The value of parameter '{0}' is "
-                                         "incorrect. It should be "
-                                         "'{1}' but it is '{2}'".
-                                         format(key, item, data[key]))
+                    errors += ("\nThe value of parameter '{0}' is "
+                               "incorrect. It should be "
+                               "'{1}' but it is '{2}'".
+                               format(key, item, data[key]))
             except KeyError:
-                raise HoneycombError("The parameter '{0}' is not present in "
-                                     "operational data".format(key))
+                errors += ("\nThe parameter '{0}' is not present in "
+                           "operational data".format(key))
+
+        if errors:
+            raise HoneycombError(errors)
 
     @staticmethod
     def compare_interface_lists(list1, list2):
@@ -1238,3 +1314,69 @@ class InterfaceKeywords(object):
         vxlan_gpe_structure = [new_vxlan_gpe, ]
         return InterfaceKeywords._set_interface_properties(
             node, interface, path, vxlan_gpe_structure)
+
+    @staticmethod
+    def enable_acl_on_interface(node, interface, table_name):
+        """Enable ACL on the given interface.
+
+        :param node: Honeycomb node.
+        :param interface: The interface where the ACL will be enabled.
+        :param table_name: Name of the classify table.
+        :type node: dict
+        :type interface: str
+        :type table_name: str
+        :return: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If the configuration of interface is not
+        successful.
+        """
+
+        interface = interface.replace("/", "%2F")
+
+        data = {
+            "v3po:acl": {
+                "l2-acl": {
+                    "classify-table": table_name
+                },
+                "ip4-acl": {
+                    "classify-table": table_name
+                }
+            }
+        }
+
+        path = "/interface/" + interface + "/v3po:acl"
+        status_code, resp = HcUtil.\
+            put_honeycomb_data(node, "config_vpp_interfaces", data, path,
+                               data_representation=DataRepresentation.JSON)
+        if status_code != HTTPCodes.OK:
+            raise HoneycombError(
+                "The configuration of interface '{0}' was not successful. "
+                "Status code: {1}.".format(interface, status_code))
+        return resp
+
+    @staticmethod
+    def disable_acl_on_interface(node, interface):
+        """Disable ACL on the given interface.
+
+        :param node: Honeycomb node.
+        :param interface: The interface where the ACL will be disabled.
+        :type node: dict
+        :type interface: str
+        :return: Content of response.
+        :rtype: bytearray
+        :raises HoneycombError: If the configuration of interface is not
+        successful.
+        """
+
+        interface = interface.replace("/", "%2F")
+
+        path = "/interface/" + interface + "/v3po:acl"
+
+        status_code, resp = HcUtil.\
+            delete_honeycomb_data(node, "config_vpp_interfaces", path)
+
+        if status_code != HTTPCodes.OK:
+            raise HoneycombError(
+                "The configuration of interface '{0}' was not successful. "
+                "Status code: {1}.".format(interface, status_code))
+        return resp