From 2ec8b0938c05a22f957de36627b11a9a4dc5929f Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Sun, 23 Dec 2018 17:14:52 +0100 Subject: [PATCH] validate interface/unit schema --- test/data/update_netconf_data.py | 53 ++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/test/data/update_netconf_data.py b/test/data/update_netconf_data.py index 354176d3..ad1fce60 100644 --- a/test/data/update_netconf_data.py +++ b/test/data/update_netconf_data.py @@ -36,7 +36,7 @@ def _load_netconf(hostname, ssh_params): # -SCHEMA = """<?xml version="1.1" encoding="UTF-8" ?> +CONFIG_SCHEMA = """<?xml version="1.1" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="generic-sequence"> @@ -50,9 +50,9 @@ SCHEMA = """<?xml version="1.1" encoding="UTF-8" ?> <xs:complexType name="juniper-interface"> <xs:sequence> <xs:choice minOccurs="1" maxOccurs="unbounded"> - <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string" /> - <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string" /> - <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string" /> + <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string" /> + <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xs:choice> </xs:sequence> <xs:attribute name="inactive" type="xs:string" /> @@ -97,6 +97,31 @@ SCHEMA = """<?xml version="1.1" encoding="UTF-8" ?> </xs:schema> """ + +UNIT_SCHEMA = """<?xml version="1.1" encoding="UTF-8" ?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:complexType name="generic-sequence"> + <xs:sequence> + <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute processContents="skip" /> + </xs:complexType> + + <xs:element name="unit"> + <xs:complexType> + <xs:sequence> + <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:int" /> + <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string" /> + <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="inactive" type="xs:string" /> + </xs:complexType> + </xs:element> + +</xs:schema> +""" + if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) @@ -120,16 +145,26 @@ if __name__ == "__main__": "%s-netconf.xml" % r['hostname']) # schema_doc = etree.parse(SCHEMA_FILENAME) - schema_doc = etree.XML(SCHEMA.encode('utf-8')) + schema_doc = etree.XML(CONFIG_SCHEMA.encode('utf-8')) schema = etree.XMLSchema(schema_doc) parser = etree.XMLParser(schema=schema) logging.debug("FILENAME: %s" % filename) try: - etree.parse(filename, parser) + config_doc = etree.parse(filename, parser) except etree.XMLSyntaxError as ex: logging.debug(ex) for e in parser.error_log: - logging.debug("%d.%d: %s" % ( - e.line, e.column, e.message)) - exit(-1) + logging.debug("%d.%d: %s" % (e.line, e.column, e.message)) + continue + + + + schema_doc = etree.XML(UNIT_SCHEMA.encode('utf-8')) + schema = etree.XMLSchema(schema_doc) + parser = etree.XMLParser(schema=schema) + + # for i in data.xpath('//configuration/groups/interfaces/interface'): + for i in config_doc.xpath('//configuration/interfaces/interface'): + for u in i.xpath('./unit'): + schema.assertValid(u) -- GitLab