Step 2: Move test folder to root
[integration/test.git] / tools / CSIT_Test / base / modules / switch_manager.py
diff --git a/tools/CSIT_Test/base/modules/switch_manager.py b/tools/CSIT_Test/base/modules/switch_manager.py
new file mode 100644 (file)
index 0000000..d4bd142
--- /dev/null
@@ -0,0 +1,156 @@
+"""
+CSIT test tools.
+Authors: Baohua Yang@IBM, Denghui Huang@IBM
+Updated: 2013-11-01
+"""
+
+import sys
+
+sys.path.append('..')
+from restlib import *  # noqa
+from testmodule import TestModule
+
+sys.path.remove('..')
+
+
+class SwitchManager(TestModule):
+    """
+    Test for the switch manager, including read switch nodes.
+    Start 2-layer tree topology network. e.g., in Mininet, run
+        'sudo mn --controller=remote,ip=127.0.0.1 --mac --topo tree,2'
+    """
+
+    def __init__(self, restSubContext='/controller/nb/v2/switchmanager', user=DEFAULT_USER, password=DEFAULT_PWD,
+                 container=DEFAULT_CONTAINER, contentType='json', prefix=DEFAULT_PREFIX):
+        super(self.__class__, self).__init__(restSubContext, user, password, container, contentType, prefix)
+
+    def get_nodes(self):
+        """
+        The name is suggested to match the NB API.
+        list all nodes and their properties
+        """
+        suffix = 'nodes'
+        r = super(self.__class__, self).read(suffix)
+        if r:
+            return r
+
+    def get_node(self, suffix):
+        """
+        The name is suggested to match the NB API.
+        list nodeconnector and properties of a node.
+        """
+        r = super(self.__class__, self).read(suffix)
+        if r:
+            return r
+
+    def add_property_to_node(self, node_type, node_id, property, value):
+        """
+        Add a property to given node.
+        """
+        suffix = 'node/' + node_type + '/' + node_id + '/property'
+        super(self.__class__, self).update(suffix + '/' + property + '/' + str(value))
+
+    def remove_property_from_node(self, node_type, node_id, property):
+        """
+        Remove a property from given node.
+        """
+        suffix = 'node/' + node_type + '/' + node_id + '/property'
+        super(self.__class__, self).delete(suffix + '/' + property)
+
+    def add_property_to_nodeconnector(self, node_type, node_id, nc_type, nc_id, property, value):
+        """
+        Add a property to given node.
+        """
+        suffix = 'nodeconnector/' + node_type + '/' + node_id + '/' + nc_type + '/' + nc_id + '/property'
+        super(self.__class__, self).update(suffix + '/' + property + '/' + str(value))
+
+    def remove_property_from_nodeconnector(self, node_type, node_id, nc_type, nc_id, property):
+        """
+        Add a property to given node.
+        """
+        suffix = 'nodeconnector/' + node_type + '/' + node_id + '/' + nc_type + '/' + nc_id + '/property'
+        super(self.__class__, self).delete(suffix + '/' + property)
+
+    def test_list_nodes(self):
+        """
+        The name is suggested to match the NB API.
+        list all nodes and their properties
+        >>> SwitchManager().test_list_nodes()
+        True
+        """
+        result = []
+        r = self.get_nodes()
+        t = super(self.__class__, self).extract_properties(r, 'nodeProperties', 'node')
+        if t:
+            result.append({u'type': u'OF', u'id': u'00:00:00:00:00:00:00:01'} in t)
+            result.append({u'type': u'OF', u'id': u'00:00:00:00:00:00:00:02'} in t)
+            result.append({u'type': u'OF', u'id': u'00:00:00:00:00:00:00:03'} in t)
+            return result == [True, True, True]
+
+    def test_node_property_operations(self, node_type, node_id, property, value):
+        """
+        Test the add,remove,show actions on node properties.
+
+        >>> SwitchManager().test_node_property_operations('OF','00:00:00:00:00:00:00:01','description','Switch1')
+        True
+        >>> SwitchManager().test_node_property_operations('OF','00:00:00:00:00:00:00:02','description','Switch2')
+        True
+        >>> SwitchManager().test_node_property_operations('OF','00:00:00:00:00:00:00:03','description','Switch3')
+        True
+        """
+        result = []
+        # current node properties should not include description
+        r = self.get_nodes()
+        v = [e['properties'].get(property) for e in r['nodeProperties'] if
+             e['node'] == {u'type': node_type, u'id': node_id}]
+        result.append(v == [{u'value': u'None'}] or v == [None])
+        # After adding, current node properties should include description
+        self.add_property_to_node(node_type, node_id, property, value)
+        r = self.get_nodes()
+        v = [e['properties'].get(property) for e in r['nodeProperties'] if
+             e['node'] == {u'type': node_type, u'id': node_id}]
+        result.append(v == [{u'value': value}])
+        # After removing, current node properties should not include description
+        self.remove_property_from_node(node_type, node_id, property)
+        r = self.get_nodes()
+        v = [e['properties'].get(property) for e in r['nodeProperties'] if
+             e['node'] == {u'type': node_type, u'id': node_id}]
+        result.append(v == [{u'value': u'None'}] or v == [None])
+        return result == [True, True, True]
+
+    def test_nodeconnector_property_operations(self, node_type, node_id, nc_type, nc_id, property, value):
+        """
+        Test the add,remove,show actions on nodeconnector properties.
+
+        >>> SwitchManager().test_nodeconnector_property_operations(
+                'OF','00:00:00:00:00:00:00:01','OF','1','bandwidth',1000)
+        True
+        """
+        result = []
+        node_suffix = 'node/' + node_type + '/' + node_id
+        # default bw should be 10000000000L
+        r = self.get_node(node_suffix)
+        default_value = [e['properties'][property] for e in r['nodeConnectorProperties'] if
+                         property in e['properties'] and e['nodeconnector'] == {
+                             u'node': {u'type': node_type, u'id': node_id}, u'type': nc_type, u'id': nc_id}]
+        # After setting, the value should be the value
+        self.add_property_to_nodeconnector(node_type, node_id, nc_type, nc_id, property, value)
+        r = self.get_node(node_suffix)
+        current_value = [e['properties'][property] for e in r['nodeConnectorProperties'] if
+                         property in e['properties'] and e['nodeconnector'] == {
+                             u'node': {u'type': node_type, u'id': node_id}, u'type': nc_type, u'id': nc_id}]
+        result.append(current_value == [{'value': value}])
+        # After removing, and restoring the default value, the bandwidth property should be default
+        self.remove_property_from_nodeconnector(node_type, node_id, nc_type, nc_id, property)
+        r = self.get_node(node_suffix)
+        v = [e['properties'][property] for e in r['nodeConnectorProperties'] if
+             property in e['properties'] and e['nodeconnector'] == {u'node': {u'type': node_type, u'id': node_id},
+                                                                    u'type': nc_type, u'id': nc_id}]
+        result.append(v == [])
+        self.add_property_to_nodeconnector(node_type, node_id, nc_type, nc_id, property, default_value[0]['value'])
+        r = self.get_node(node_suffix)
+        current_value = [e['properties'][property] for e in r['nodeConnectorProperties'] if
+                         property in e['properties'] and e['nodeconnector'] == {
+                             u'node': {u'type': node_type, u'id': node_id}, u'type': nc_type, u'id': nc_id}]
+        result.append(current_value == default_value)
+        return result == [True, True, True]