From a23634dd7e141039de4920ef3563e82ca47de40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Tue, 5 Nov 2024 10:19:54 +0100 Subject: [PATCH] test: Implement put_config_dicts Add all configuration in one command. Also update the test igmp_vlan to use put_config_dicts instead of put_config_dict --- test/case/ietf_interfaces/igmp_vlan/test.py | 387 ++++++++++---------- test/infamy/netconf.py | 18 +- test/infamy/restconf.py | 13 +- 3 files changed, 220 insertions(+), 198 deletions(-) diff --git a/test/case/ietf_interfaces/igmp_vlan/test.py b/test/case/ietf_interfaces/igmp_vlan/test.py index 008d3cf5..cd25a85b 100755 --- a/test/case/ietf_interfaces/igmp_vlan/test.py +++ b/test/case/ietf_interfaces/igmp_vlan/test.py @@ -46,208 +46,211 @@ with infamy.Test() as test: with test.step("Configure device"): - dut1.put_config_dict("ietf-interfaces", + dut1.put_config_dicts( + { + "ietf-interfaces": { + "interfaces": { + "interface": [ { - "interfaces": { - "interface": [ - { - "name": d1send, - "enabled": True, - "bridge-port": { - "bridge": "br0", - "pvid": 55 - - } - }, - { - "name": d1receiver, - "enabled": True, - "bridge-port": { - "bridge": "br0", - "pvid": 77 - } - }, - { - "name": d1trunk, - "enabled": True, - "bridge-port": { - "bridge": "br0" - } - }, - { - "name": "vlan55", - "enabled": True, - "type": "infix-if-type:vlan", - "ipv4": { - "address": [ - { - "ip": "10.0.1.1", - "prefix-length": 24 - } - ] - }, - "vlan": { - "id": 55, - "lower-layer-if": "br0" - } - - }, - { - "name": "vlan77", - "enabled": True, - "type": "infix-if-type:vlan", - "ipv4": { - "address": [ - { - "ip": "10.0.2.1", - "prefix-length": 24 - } - ] - }, - "vlan": { - "id": 77, - "lower-layer-if": "br0" - } - - }, - { - "name": "br0", - "enabled": True, - "type": "infix-if-type:bridge", - - "bridge": { - "vlans": { - "vlan": [ - { - "vid": 55, - "untagged": [ d1send ], - "tagged": [ d1trunk, "br0" ], - "multicast": { - "snooping": True - } - }, - { - "vid": 77, - "untagged": [ d1receiver ], - "tagged": [ d1trunk, "br0" ], - "multicast": { - "snooping": True - } - } - ] - } - } - } - ] + "name": d1send, + "enabled": True, + "bridge-port": { + "bridge": "br0", + "pvid": 55 } - }) - dut1.put_config_dict("ietf-system", { - "system": { - "hostname": "dut1" - } - }) - dut2.put_config_dict("ietf-interfaces", + }, { - "interfaces": { - "interface": [ - { - "name": d2receive, - "enabled": True, - "bridge-port": { - "bridge": "br0", - "pvid": 55 - } - }, + "name": d1receiver, + "enabled": True, + "bridge-port": { + "bridge": "br0", + "pvid": 77 + } + }, + { + "name": d1trunk, + "enabled": True, + "bridge-port": { + "bridge": "br0" + } + }, + { + "name": "vlan55", + "enabled": True, + "type": "infix-if-type:vlan", + "ipv4": { + "address": [ { - "name": d2sender, - "enabled": True, - "bridge-port": { - "bridge": "br0", - "pvid": 77 - } - }, - { - "name": d2trunk, - "enabled": True, - "bridge-port": { - "bridge": "br0" - } - }, - { - "name": "vlan55", - "enabled": True, - "type": "infix-if-type:vlan", - "ipv4": { - "address": [ - { - "ip": "10.0.1.2", - "prefix-length": 24 - } - ] - }, - "vlan": { - "id": 55, - "lower-layer-if": "br0" - } - - }, - { - "name": "vlan77", - "enabled": True, - "type": "infix-if-type:vlan", - "ipv4": { - "address": [ - { - "ip": "10.0.2.2", - "prefix-length": 24 - } - ] - }, - "vlan": { - "id": 77, - "lower-layer-if": "br0" - } - - }, - { - "name": "br0", - "enabled": True, - "type": "infix-if-type:bridge", - - "bridge": { - "vlans": { - "vlan": [ - { - "vid": 55, - "untagged": [ d2receive ], - "tagged": [ d2trunk, "br0" ], - "multicast": { - "snooping": True - } - }, - { - "vid": 77, - "untagged": [ d2sender ], - "tagged": [ d2trunk, "br0" ], - "multicast": { - "snooping": True - } - } - ] - } - } + "ip": "10.0.1.1", + "prefix-length": 24 } ] - + }, + "vlan": { + "id": 55, + "lower-layer-if": "br0" } - }) - dut2.put_config_dict("ietf-system", { - "system": { - "hostname": "dut2" + }, + { + "name": "vlan77", + "enabled": True, + "type": "infix-if-type:vlan", + "ipv4": { + "address": [ + { + "ip": "10.0.2.1", + "prefix-length": 24 + } + ] + }, + "vlan": { + "id": 77, + "lower-layer-if": "br0" + } + + }, + { + "name": "br0", + "enabled": True, + "type": "infix-if-type:bridge", + + "bridge": { + "vlans": { + "vlan": [ + { + "vid": 55, + "untagged": [ d1send ], + "tagged": [ d1trunk, "br0" ], + "multicast": { + "snooping": True + } + }, + { + "vid": 77, + "untagged": [ d1receiver ], + "tagged": [ d1trunk, "br0" ], + "multicast": { + "snooping": True + } + } + ] + } + } + } + ] + } + }, + "ietf-system": { + "system": { + "hostname": "dut1" + } + } } - }) + ) + + dut2.put_config_dicts( + { + "ietf-interfaces": { + "interfaces": { + "interface": [ + { + "name": d2receive, + "enabled": True, + "bridge-port": { + "bridge": "br0", + "pvid": 55 + } + }, + { + "name": d2sender, + "enabled": True, + "bridge-port": { + "bridge": "br0", + "pvid": 77 + } + }, + { + "name": d2trunk, + "enabled": True, + "bridge-port": { + "bridge": "br0" + } + }, + { + "name": "vlan55", + "enabled": True, + "type": "infix-if-type:vlan", + "ipv4": { + "address": [ + { + "ip": "10.0.1.2", + "prefix-length": 24 + } + ] + }, + "vlan": { + "id": 55, + "lower-layer-if": "br0" + } + + }, + { + "name": "vlan77", + "enabled": True, + "type": "infix-if-type:vlan", + "ipv4": { + "address": [ + { + "ip": "10.0.2.2", + "prefix-length": 24 + } + ] + }, + "vlan": { + "id": 77, + "lower-layer-if": "br0" + } + + }, + { + "name": "br0", + "enabled": True, + "type": "infix-if-type:bridge", + + "bridge": { + "vlans": { + "vlan": [ + { + "vid": 55, + "untagged": [ d2receive ], + "tagged": [ d2trunk, "br0" ], + "multicast": { + "snooping": True + } + }, + { + "vid": 77, + "untagged": [ d2sender ], + "tagged": [ d2trunk, "br0" ], + "multicast": { + "snooping": True + } + } + ] + } + } + } + ] + } + }, + "ietf-system": { + "system": { + "hostname": "dut2" + } + } + }) with infamy.IsolatedMacVlan(hsendd1) as d1send_ns, \ infamy.IsolatedMacVlan(hreceived1) as d1receive_ns, \ diff --git a/test/infamy/netconf.py b/test/infamy/netconf.py index 5311a2b6..262bfbc0 100644 --- a/test/infamy/netconf.py +++ b/test/infamy/netconf.py @@ -214,7 +214,7 @@ class Device(Transport): else: return f"" return None - + def _parse_response(self, response, parse): """Helper function to handle XML response parsing.""" if not response: @@ -273,10 +273,10 @@ class Device(Transport): xpath_filter = self._build_xpath_filter(xpath, get_data_xpath=True) response = self.ncc.get_data(datastore="ds:operational", filter=xpath_filter) parsed_data = self._parse_response(response, parse) - + if parse and parsed_data: return parsed_data.print_dict() - + return parsed_data def get_config(self, xpath): @@ -313,6 +313,15 @@ class Device(Transport): continue break + def put_config_dicts(self, models): + config = "" + + for model in models.keys(): + mod = self.ly.get_module(model) + lyd = mod.parse_data_dict(models[model], no_state=True, validate=False) + config+=lyd.print_mem("xml", with_siblings=True, pretty=False)+"\n" + return self.put_config(config) + def put_config_dict(self, modname, edit): """Convert Python dictionary to XMl and send as configuration""" mod = self.ly.get_module(modname) @@ -344,8 +353,8 @@ class Device(Transport): def get_schemas_list(self): schemas = [] - data = self.get_dict("/netconf-state") + for d in data["netconf-state"]["schemas"]["schema"]: schema = {} schema["identifier"] = d['identifier'] @@ -428,4 +437,3 @@ class Device(Transport): return current_datetime.text else: raise ValueError("current-datetime element not found in the response") - \ No newline at end of file diff --git a/test/infamy/restconf.py b/test/infamy/restconf.py index 387657a2..e9d5e08f 100644 --- a/test/infamy/restconf.py +++ b/test/infamy/restconf.py @@ -244,7 +244,7 @@ class Device(Transport): # Directly pass the dictionary without using json.dumps response = requests_workaround_put( - f"{self.restconf_url}/ds/ietf-datastores:{datastore}/", + f"{self.restconf_url}/ds/ietf-datastores:{datastore}", json=data, headers=self.headers, auth=self.auth, @@ -262,6 +262,17 @@ class Device(Transport): for k, v in ds.items(): return {container: v} + def put_config_dicts(self, models): + running = self.get_running() + + for model in models.keys(): + mod = self.lyctx.get_module(model) + lyd = mod.parse_data_dict(models[model], no_state=True, validate=False) + running.merge(lyd) + + return self.put_datastore("running", json.loads(running.print_mem("json", with_siblings=True, pretty=False))) + + def put_config_dict(self, modname, edit): """Add @edit to running config and put the whole configuration"""