Signed-off-by: Isaku Yamahata <[email protected]>
---
 ryu/tests/integrated/test_of_config_api.py |  151 ++++++++++++++++++++++++++++
 1 file changed, 151 insertions(+)
 create mode 100644 ryu/tests/integrated/test_of_config_api.py

diff --git a/ryu/tests/integrated/test_of_config_api.py 
b/ryu/tests/integrated/test_of_config_api.py
new file mode 100644
index 0000000..cb518e5
--- /dev/null
+++ b/ryu/tests/integrated/test_of_config_api.py
@@ -0,0 +1,151 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import gevent
+import traceback
+
+import lxml.etree
+import ncclient
+
+from ryu.base import app_manager
+from ryu.lib.netconf import constants as nc_consts
+from ryu.lib import of_config
+from ryu.lib.of_config import api as ofc_api
+from ryu.lib.of_config import constants as ofc_consts
+
+
+# Change those parameters depending on your switch configuration
+HOST = '127.0.0.1'
+PORT = 1830
+USERNAME = 'linc'
+PASSWORD = 'linc'
+
+
+def _get_schema():
+    # file_name = of_config.OF_CONFIG_1_0_XSD
+    # file_name = of_config.OF_CONFIG_1_1_XSD
+    file_name = of_config.OF_CONFIG_1_1_1_XSD
+    return lxml.etree.XMLSchema(file=file_name)
+
+
+class OFConfigClient(app_manager.RyuApp):
+    def __init__(self, *args, **kwargs):
+        super(OFConfigClient, self).__init__(*args, **kwargs)
+        self._ofc_session = None
+        gevent.spawn(self._test_api)
+
+    def _validate(self, tree):
+        xmlschema = _get_schema()
+        try:
+            xmlschema.assertValid(tree)
+        except:
+            traceback.print_stack()
+            traceback.print_exc()
+
+    def _do_get(self):
+        data_xml = self._ofc_session.get()
+
+        tree = lxml.etree.fromstring(data_xml)
+        # print(lxml.etree.tostring(tree, pretty_print=True))
+        self._validate(tree)
+        return tree
+
+    def _do_get_config(self, source):
+        print('source = %s' % source)
+        config_xml = self._ofc_session.get_config(source)
+
+        tree = lxml.etree.fromstring(config_xml)
+        # print(lxml.etree.tostring(tree, pretty_print=True))
+        self._validate(tree)
+
+    def _do_edit_config(self, config):
+        tree = lxml.etree.fromstring(config)
+        self._validate(tree)
+        self._ofc_session.edit_config(target='running', config=config)
+
+    def _print_ports(self, tree, ns):
+        for port in tree.findall('{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+                                                    ns, ofc_consts.PORT)):
+            print(lxml.etree.tostring(port, pretty_print=True))
+
+    def _test_api(self):
+        self._ofc_session = ofc_api.OFConfigSessionAPI(
+            self, host=HOST, port=PORT, username=USERNAME, password=PASSWORD)
+        self._ofc_session.connect()
+
+        tree = self._do_get()
+        self._do_get_config('running')
+        self._do_get_config('startup')
+
+        # LINC doesn't support 'candidate' datastore
+        try:
+            self._do_get_config('candidate')
+        except ncclient.NCClientError:
+            traceback.print_exc()
+
+        print(lxml.etree.tostring(tree, pretty_print=True))
+
+        # try to set all ports down
+        qname = lxml.etree.QName(tree.tag)
+        ns = qname.namespace
+        self._print_ports(tree, ns)
+
+        switch_id = tree.find('{%s}%s' % (ns, ofc_consts.ID))
+        resources = tree.find('{%s}%s' % (ns, ofc_consts.RESOURCES))
+        port = tree.find('{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+                                            ns, ofc_consts.PORT))
+        resource_id = tree.find('{%s}%s/{%s}%s/{%s}%s' %
+                                (ns, ofc_consts.RESOURCES,
+                                 ns, ofc_consts.PORT,
+                                 ns, ofc_consts.RESOURCE_ID))
+        configuration = tree.find(
+            '{%s}%s/{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+                                      ns, ofc_consts.PORT,
+                                      ns, ofc_consts.CONFIGURATION))
+        admin_state = tree.find(
+            '{%s}%s/{%s}%s/{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+                                             ns, ofc_consts.PORT,
+                                             ns, ofc_consts.CONFIGURATION,
+                                             ns, ofc_consts.ADMIN_STATE))
+
+        config_ = lxml.etree.Element(
+            '{%s}%s' % (ncclient.xml_.BASE_NS_1_0, nc_consts.CONFIG))
+        capable_switch_ = lxml.etree.SubElement(config_, tree.tag)
+        switch_id_ = lxml.etree.SubElement(capable_switch_, switch_id.tag)
+        switch_id_.text = switch_id.text
+        resources_ = lxml.etree.SubElement(capable_switch_,
+                                           resources.tag)
+        for _amin_state in tree.findall(
+                '{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+                                   ns, ofc_consts.PORT)):
+            port_ = lxml.etree.SubElement(resources_, port.tag)
+            resource_id = port.find('{%s}%s' % (ns, ofc_consts.RESOURCE_ID))
+            resource_id_ = lxml.etree.SubElement(port_, resource_id.tag)
+            resource_id_.text = resource_id.text
+            configuration_ = lxml.etree.SubElement(port_, configuration.tag)
+            configuration_.set(ofc_consts.OPERATION, nc_consts.MERGE)
+            admin_state_ = lxml.etree.SubElement(configuration_,
+                                                 admin_state.tag)
+            admin_state_.text = ofc_consts.DOWN
+
+        print 'edit-configuration'
+        print lxml.etree.tostring(config_, pretty_print=True)
+        self._do_edit_config(lxml.etree.tostring(config_, pretty_print=True))
+
+        tree = self._do_get()
+        self._print_ports(tree, ns)
+
+        self._ofc_session.close_session()
-- 
1.7.10.4


------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to