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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)