Пример #1
0
    def test_conversion_XML_to_JSON_version(self):
        self.maxDiff = None
        url = "/api/config/car/toyota/models"
        xml = _collapse_string('''
<data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <models>
              <name-m>Camry</name-m>	  
              <year>2015</year>	  
              <capacity>5</capacity>	  
              <version_str>2.0</version_str>
            </models>
          </car>
        </data>
        ''')
        #

        expected_json = _collapse_string('''
{"vehicle-a:models":[{"year" : 2015,"name-m" : "Camry","capacity" : 5, "version_str":"2.0"}]}
        ''')

        schema = load_multiple_schema_root(["vehicle-a", "vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(False, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #2
0
    def test_conversion_XML_to_JSON_notification(self):
        yang_model = RwYang.Model.create_libncx()
        yang_model.load_module("vehicle-a")
        schema = yang_model.get_root_node()

        converter = XmlToJsonTranslator(schema, logger)

        expected_json = """
{"notification" : {"eventTime" : "2016-03-02T01:50:15.774039-05:00","vehicle-a:notif" : {"cont":{"cont-leaf" : "true","dict" : [{"value" : "bar","name" : "foo"},{"value" : "bar1","name" : "foo1"}]},"top-leaf" : 12}}}
"""
        notif_pb = VehicleAYang.YangNotif_VehicleA().create_notif()
        cont_pb = notif_pb.create_cont()
        dict_pb = cont_pb.create_dict()
        dict_pb.name = "foo"
        dict_pb.value = "bar"
        cont_pb.dict.append(dict_pb)
        dict_pb = cont_pb.create_dict()
        dict_pb.name = "foo1"
        dict_pb.value = "bar1"
        cont_pb.dict.append(dict_pb)
        cont_pb.cont_leaf = True
        notif_pb.cont = cont_pb
        notif_pb.top_leaf = 12

        content_xml = notif_pb.to_xml_v2(yang_model)
        notif_xml = """<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0"><eventTime>2016-03-02T01:50:15.774039-05:00</eventTime>"""
        notif_xml += content_xml
        notif_xml += "</notification>"

        json_str = converter.convert_notification(notif_xml)

        actual = _ordered(json.loads(json_str))
        expected = _ordered(json.loads(expected_json))
        self.assertEqual(actual, expected)
Пример #3
0
    def test_conversion_XML_to_JSON_get_list_with_name_of_child(self):
        self.maxDiff = None
        url = "/api/config/car/toyota/models/name-m"
        xml = _collapse_string('''
        <data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <brand>toyota</brand>
            <models>
              <name-m>name-m</name-m>    
              <capacity>5</capacity>     
            </models>
          </car>
        </data>
        ''')
        #

        expected_json = _collapse_string('''
{"vehicle-a:models" :{"name-m" : "name-m","capacity" : 5}}
        ''')

        schema = load_multiple_schema_root(["vehicle-a", "vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(False, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #4
0
    def test_conversion_XML_to_JSON_null_string(self):
        self.maxDiff = None
        url = "/api/operational/car/toyota/models"
        xml = _collapse_string('''
        <data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <models>
              <name-m/>
            </models>
          </car>
        </data>
        ''')

        expected_json = _collapse_string('''
        {"vehicle-a:models":[{"name-m" : ""}]}
        ''')

        schema = load_multiple_schema_root(["vehicle-a", "vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(False, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #5
0
    def test_conversion_XML_to_JSON_notification(self):
        yang_model = RwYang.Model.create_libncx()
        yang_model.load_module("vehicle-a")
        schema = yang_model.get_root_node()

        converter = XmlToJsonTranslator(schema, logger)

        expected_json = """
{"notification" : {"eventTime" : "2016-03-02T01:50:15.774039-05:00","vehicle-a:notif" : {"cont":{"cont-leaf" : "true","dict" : [{"value" : "bar","name" : "foo"},{"value" : "bar1","name" : "foo1"}]},"top-leaf" : 12}}}
"""
        notif_pb = VehicleAYang.YangNotif_VehicleA().create_notif()
        cont_pb = notif_pb.create_cont()
        dict_pb = cont_pb.create_dict()
        dict_pb.name = "foo"
        dict_pb.value = "bar"
        cont_pb.dict.append(dict_pb)
        dict_pb = cont_pb.create_dict()
        dict_pb.name = "foo1"
        dict_pb.value = "bar1"
        cont_pb.dict.append(dict_pb)
        cont_pb.cont_leaf = True
        notif_pb.cont = cont_pb
        notif_pb.top_leaf = 12

        content_xml = notif_pb.to_xml_v2(yang_model)
        notif_xml = """<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0"><eventTime>2016-03-02T01:50:15.774039-05:00</eventTime>"""
        notif_xml += content_xml
        notif_xml += "</notification>"

        json_str = converter.convert_notification(notif_xml)

        actual = _ordered(json.loads(json_str))
        expected = _ordered(json.loads(expected_json))
        self.assertEqual(actual, expected)
Пример #6
0
    def test_conversion_XML_to_JSON_null_string(self):
        self.maxDiff = None
        url = "/api/operational/car/toyota/models"
        xml = _collapse_string(
            """
        <data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <models>
              <name-m/>
            </models>
          </car>
        </data>
        """
        )

        expected_json = _collapse_string(
            """
        {"vehicle-a:models":[{"name-m" : ""}]}
        """
        )

        schema = load_multiple_schema_root(["vehicle-a", "vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(False, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #7
0
    def test_conversion_XML_to_JSON_version(self):
        self.maxDiff = None
        url = "/api/config/car/toyota/models"
        xml = _collapse_string('''
<data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <models>
              <name-m>Camry</name-m>	  
              <year>2015</year>	  
              <capacity>5</capacity>	  
              <version_str>2.0</version_str>
            </models>
          </car>
        </data>
        ''')
        #

        expected_json = _collapse_string('''
{"vehicle-a:models":[{"year" : 2015,"name-m" : "Camry","capacity" : 5, "version_str":"2.0"}]}
        ''')

        schema = load_multiple_schema_root(["vehicle-a","vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)
        
        actual_json = converter.convert(False, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #8
0
    def test_conversion_XML_to_JSON_get_list_with_name_of_child(self):
        self.maxDiff = None
        url = "/api/config/car/toyota/models/name-m"
        xml = _collapse_string('''
        <data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <brand>toyota</brand>
            <models>
              <name-m>name-m</name-m>    
              <capacity>5</capacity>     
            </models>
          </car>
        </data>
        ''')
        #

        expected_json = _collapse_string('''
{"vehicle-a:models" :{"name-m" : "name-m","capacity" : 5}}
        ''')

        schema = load_multiple_schema_root(["vehicle-a","vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)
        
        actual_json = converter.convert(False, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #9
0
    def test_conversion_XML_to_JSON_vcs(self):
        self.maxDiff = None
        url = "/api/operational/vcs/info"
        xml = _collapse_string(
            """
<data>
<rw-base:vcs xmlns:rw-base="http://riftio.com/ns/riftware-1.0/rw-base">
    <rw-base:info>
        <rw-base:components>
            <rw-base:component_info>
                <rw-base:instance_name>RW_VM_MASTER-2</rw-base:instance_name>
                <rw-base:component_type>RWVM</rw-base:component_type>
                <rw-base:component_name>RW_VM_MASTER</rw-base:component_name>
                <rw-base:instance_id>2</rw-base:instance_id>
                <rw-base:state>RUNNING</rw-base:state>
                <rw-base:config-ready>true</rw-base:config-ready>
                <rw-base:recovery-action>FAILCRITICAL</rw-base:recovery-action>
                <rw-base:rwcomponent_parent>rw.colony-102</rw-base:rwcomponent_parent>
                <rw-base:rwcomponent_children>msgbroker-100</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>dtsrouter-101</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.Proc_1.uAgent-103</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.TermIO-105</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.CLI-104</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.Proc_2.Restconf-106</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.Proc_3.RestPortForward-108</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.MC.UI-109</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>logd-110</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>confd-114</rw-base:rwcomponent_children>
                <rw-base:vm_info>
                    <rw-base:vm-ip-address>127.0.2.1</rw-base:vm-ip-address>
                    <rw-base:pid>31610</rw-base:pid>
                    <rw-base:leader>true</rw-base:leader>
                </rw-base:vm_info>
            </rw-base:component_info>
        </rw-base:components>
    </rw-base:info>
</rw-base:vcs>
</data>
        """
        )

        schema = load_multiple_schema_root(["rw-base"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(False, url, xpath, xml)
Пример #10
0
    def test_conversion_XML_to_JSON_vcs(self):
        self.maxDiff = None
        url = "/api/operational/vcs/info"
        xml = _collapse_string('''
<data>
<rw-base:vcs xmlns:rw-base="http://riftio.com/ns/riftware-1.0/rw-base">
    <rw-base:info>
        <rw-base:components>
            <rw-base:component_info>
                <rw-base:instance_name>RW_VM_MASTER-2</rw-base:instance_name>
                <rw-base:component_type>RWVM</rw-base:component_type>
                <rw-base:component_name>RW_VM_MASTER</rw-base:component_name>
                <rw-base:instance_id>2</rw-base:instance_id>
                <rw-base:state>RUNNING</rw-base:state>
                <rw-base:config-ready>true</rw-base:config-ready>
                <rw-base:recovery-action>FAILCRITICAL</rw-base:recovery-action>
                <rw-base:rwcomponent_parent>rw.colony-102</rw-base:rwcomponent_parent>
                <rw-base:rwcomponent_children>msgbroker-100</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>dtsrouter-101</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.Proc_1.uAgent-103</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.TermIO-105</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.CLI-104</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.Proc_2.Restconf-106</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.Proc_3.RestPortForward-108</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>RW.MC.UI-109</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>logd-110</rw-base:rwcomponent_children>
                <rw-base:rwcomponent_children>confd-114</rw-base:rwcomponent_children>
                <rw-base:vm_info>
                    <rw-base:vm-ip-address>127.0.2.1</rw-base:vm-ip-address>
                    <rw-base:pid>31610</rw-base:pid>
                    <rw-base:leader>true</rw-base:leader>
                </rw-base:vm_info>
            </rw-base:component_info>
        </rw-base:components>
    </rw-base:info>
</rw-base:vcs>
</data>
        ''')

        schema = load_multiple_schema_root(["rw-base"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(False, url, xpath, xml)
Пример #11
0
    def test_conversion_XML_to_JSON_2(self):
        self.maxDiff = None
        url = "/api/operational/car/toyota/models"
        xml = _collapse_string(
            """
        <data>
          <car xmlns="http://riftio.com/ns/core/mgmt/rwrestconf/test/vehicle-a">
            <models>
              <name-m>Camry</name-m>	  
              <year>2015</year>	  
              <capacity>5</capacity>	  
            </models>
            <models>
              <name-m>Tacoma</name-m>	  
              <year>2017</year>	  
              <capacity>7</capacity>	  
            </models>
          </car>
        </data>
        """
        )

        expected_json = _collapse_string(
            """
{"collection":{"vehicle-a:models":[{"name-m" : "Camry","capacity" : 5,"year" : 2015},{"name-m" : "Tacoma","capacity" : 7,"year" : 2017}]}}
        """
        )

        schema = load_multiple_schema_root(["vehicle-a", "vehicle-augment-a"])

        converter = XmlToJsonTranslator(schema, logger)

        xpath = create_xpath_from_url(url, schema)

        actual_json = converter.convert(True, url, xpath, xml)

        actual = _ordered(json.loads(actual_json))
        expected = _ordered(json.loads(expected_json))

        self.assertEquals(actual, expected)
Пример #12
0
    def _start_server(self):
        if self._server is not None:
            self._server.stop()
        self._connection_manager = ConnectionManager(
            self._configuration, self._log, self.loop, self.NETCONF_SERVER_IP,
            self.NETCONF_SERVER_PORT, self._dts, self._schema_root)
        self._confd_url_converter = ConfdRestTranslator(self._schema_root)
        self._xml_to_json_translator = XmlToJsonTranslator(
            self._schema_root, self._log)

        webhost = "{}:{}".format(socket.gethostbyname(socket.getfqdn()),
                                 self.RESTCONF_PORT)
        self._state_provider = StateProvider(self._log, self.loop,
                                             self.NETCONF_SERVER_IP,
                                             self.NETCONF_SERVER_PORT, webhost,
                                             self._configuration.use_https)

        http_handler_arguments = {
            "asyncio_loop": self.loop,
            "confd_url_converter": self._confd_url_converter,
            "configuration": self._configuration,
            "connection_manager": self._connection_manager,
            "logger": self._log,
            "schema_root": self._schema_root,
            "statistics": self._statistics,
            "xml_to_json_translator": self._xml_to_json_translator,
        }
        stream_handler_args = {
            "logger": self._log,
            "loop": self.loop,
            "netconf_ip": self.NETCONF_SERVER_IP,
            "netconf_port": self.NETCONF_SERVER_PORT,
            "statistics": self._statistics,
            "xml_to_json_translator": self._xml_to_json_translator,
        }
        logout_handler_arguments = {
            "logger": self._log,
            "connection_manager": self._connection_manager,
            "asyncio_loop": self.loop,
        }

        # provide a read-only handler that always uses the xml-mode for speed
        self._read_only_configuration = Configuration()
        self._read_only_configuration.use_netconf = False
        self._read_only_connection_manager = ConnectionManager(
            self._configuration, self._log, self.loop, self.NETCONF_SERVER_IP,
            self.NETCONF_SERVER_PORT, self._dts, self._schema_root)
        read_only_handler_arguments = {
            "logger": self._log,
            "connection_manager": self._read_only_connection_manager,
            "schema_root": self._schema_root,
            "confd_url_converter": self._confd_url_converter,
            "xml_to_json_translator": self._xml_to_json_translator,
            "asyncio_loop": self.loop,
            "configuration": self._configuration,
            "statistics": self._statistics,
        }

        application = tornado.web.Application([
            (r"/api/readonly/config/(.*)", ReadOnlyHandler,
             read_only_handler_arguments),
            (r"/api/readonly/running/(.*)", ReadOnlyHandler,
             read_only_handler_arguments),
            (r"/api/readonly/operational/(.*)", ReadOnlyHandler,
             read_only_handler_arguments),
            (r"/api/config/(.*)", HttpHandler, http_handler_arguments),
            (r"/api/logout", LogoutHandler, logout_handler_arguments),
            (r"/api/operational/(.*)", HttpHandler, http_handler_arguments),
            (r"/api/operations/(.*)", HttpHandler, http_handler_arguments),
            (r"/api/running/(.*)", HttpHandler, http_handler_arguments),
            (r"/api/schema/(.*)", HttpHandler, http_handler_arguments),
            (r"/streams/(.*)", event_source.HttpStreamHandler,
             stream_handler_args),
            (r"/ws_streams/(.*)", event_source.WebSocketStreamHandler,
             stream_handler_args),
        ],
                                              compress_response=True)

        io_loop = rift.tasklets.tornado.TaskletAsyncIOLoop(
            asyncio_loop=self.loop)
        if self._configuration.use_https:
            ssl_options = {
                "certfile": self._ssl_cert,
                "keyfile": self._ssl_key,
            }
            self._server = tornado.httpserver.HTTPServer(
                application,
                io_loop=io_loop,
                ssl_options=ssl_options,
            )
        else:
            self._server = tornado.httpserver.HTTPServer(
                application,
                io_loop=io_loop,
            )

        self._server.listen(self.RESTCONF_PORT)