From 819d009eb8f97c15bdf074e132612f17f2e4fbc1 Mon Sep 17 00:00:00 2001 From: "guillaume.lambert" Date: Fri, 3 Dec 2021 20:57:49 +0100 Subject: [PATCH] Reintroduce nb-bierman02 support in new func tests Up to now, migrated tests no more supported legacy bierman02 draft RESTCONF queries, and only RFC8040. With a few adaptations, they can now be configured to reuse this old RESTCONF version via an environment variable. JIRA: TRNSPRTPCE-567 Signed-off-by: guillaume.lambert Change-Id: I8be28014be2c572c7555865d4af76988e30bf9ac --- .../1.2.1/test01_portmapping.py | 36 ++-- .../2.2.1/test01_portmapping.py | 36 ++-- .../7.1/test01_portmapping.py | 22 +- .../common/test_utils_rfc8040.py | 203 ++++++++++-------- tox.ini | 17 +- 5 files changed, 171 insertions(+), 143 deletions(-) diff --git a/tests/transportpce_tests/1.2.1/test01_portmapping.py b/tests/transportpce_tests/1.2.1/test01_portmapping.py index 9d28b0c4d..a595bd555 100644 --- a/tests/transportpce_tests/1.2.1/test01_portmapping.py +++ b/tests/transportpce_tests/1.2.1/test01_portmapping.py @@ -194,20 +194,18 @@ class TransportPCEPortMappingTesting(unittest.TestCase): def test_17_xpdr_device_disconnected(self): response = test_utils_rfc8040.check_device_connection("XPDRA01") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['connection-status']) + self.assertIn(response['connection-status']['error-type'], ('protocol', 'application')) + self.assertEqual(response['connection-status']['error-tag'], 'data-missing') + self.assertEqual(response['connection-status']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_18_xpdr_device_not_connected(self): response = test_utils_rfc8040.get_portmapping_node_info("XPDRA01") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['node-info']) + self.assertIn(response['node-info']['error-type'], ('protocol', 'application')) + self.assertEqual(response['node-info']['error-tag'], 'data-missing') + self.assertEqual(response['node-info']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_19_rdm_device_disconnection(self): response = test_utils_rfc8040.unmount_device("ROADMA01") @@ -216,20 +214,18 @@ class TransportPCEPortMappingTesting(unittest.TestCase): def test_20_rdm_device_disconnected(self): response = test_utils_rfc8040.check_device_connection("ROADMA01") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['connection-status']) + self.assertIn(response['connection-status']['error-type'], ('protocol', 'application')) + self.assertEqual(response['connection-status']['error-tag'], 'data-missing') + self.assertEqual(response['connection-status']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_21_rdm_device_not_connected(self): response = test_utils_rfc8040.get_portmapping_node_info("ROADMA01") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['node-info']) + self.assertIn(response['node-info']['error-type'], ('protocol', 'application')) + self.assertEqual(response['node-info']['error-tag'], 'data-missing') + self.assertEqual(response['node-info']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') if __name__ == "__main__": diff --git a/tests/transportpce_tests/2.2.1/test01_portmapping.py b/tests/transportpce_tests/2.2.1/test01_portmapping.py index fa650b742..ac485e2e1 100644 --- a/tests/transportpce_tests/2.2.1/test01_portmapping.py +++ b/tests/transportpce_tests/2.2.1/test01_portmapping.py @@ -186,20 +186,18 @@ class TransportPCEPortMappingTesting(unittest.TestCase): def test_16_xpdr_device_disconnected(self): response = test_utils_rfc8040.check_device_connection("XPDR-A1") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['connection-status']) + self.assertIn(response['connection-status']['error-type'], ('protocol', 'application')) + self.assertEqual(response['connection-status']['error-tag'], 'data-missing') + self.assertEqual(response['connection-status']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_17_xpdr_device_not_connected(self): response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A1") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['node-info']) + self.assertIn(response['node-info']['error-type'], ('protocol', 'application')) + self.assertEqual(response['node-info']['error-tag'], 'data-missing') + self.assertEqual(response['node-info']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_18_rdm_device_disconnection(self): response = test_utils_rfc8040.unmount_device("ROADM-A1") @@ -208,20 +206,18 @@ class TransportPCEPortMappingTesting(unittest.TestCase): def test_19_rdm_device_disconnected(self): response = test_utils_rfc8040.check_device_connection("ROADM-A1") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['connection-status']) + self.assertIn(response['connection-status']['error-type'], ('protocol', 'application')) + self.assertEqual(response['connection-status']['error-tag'], 'data-missing') + self.assertEqual(response['connection-status']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_20_rdm_device_not_connected(self): response = test_utils_rfc8040.get_portmapping_node_info("ROADM-A1") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['node-info']) + self.assertIn(response['node-info']['error-type'], ('protocol', 'application')) + self.assertEqual(response['node-info']['error-tag'], 'data-missing') + self.assertEqual(response['node-info']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') if __name__ == "__main__": diff --git a/tests/transportpce_tests/7.1/test01_portmapping.py b/tests/transportpce_tests/7.1/test01_portmapping.py index b5317f550..6aed5f309 100644 --- a/tests/transportpce_tests/7.1/test01_portmapping.py +++ b/tests/transportpce_tests/7.1/test01_portmapping.py @@ -155,8 +155,8 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase): res = test_utils_rfc8040.portmapping_mc_capa_request("XPDR-A2", "XPDR-mcprofile") self.assertEqual(res['status_code'], requests.codes.ok) self.assertEqual(res['mc-capabilities'][0]['mc-node-name'], 'XPDR-mcprofile') - self.assertEqual(res['mc-capabilities'][0]['center-freq-granularity'], '3.125') - self.assertEqual(res['mc-capabilities'][0]['slot-width-granularity'], '6.25') + self.assertEqual(str(res['mc-capabilities'][0]['center-freq-granularity']), '3.125') + self.assertEqual(str(res['mc-capabilities'][0]['slot-width-granularity']), '6.25') def test_09_xpdr_device_disconnection(self): response = test_utils_rfc8040.unmount_device("XPDR-A2") @@ -165,20 +165,18 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase): def test_10_xpdr_device_disconnected(self): response = test_utils_rfc8040.check_device_connection("XPDR-A2") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['connection-status']) + self.assertIn(response['connection-status']['error-type'], ('protocol', 'application')) + self.assertEqual(response['connection-status']['error-tag'], 'data-missing') + self.assertEqual(response['connection-status']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') def test_11_xpdr_device_not_connected(self): response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A2") self.assertEqual(response['status_code'], requests.codes.conflict) - self.assertIn( - {"error-tag": "data-missing", - "error-message": "Request could not be completed because the relevant data model content does not exist", - "error-type": "protocol"}, - response['node-info']) + self.assertIn(response['node-info']['error-type'], ('protocol', 'application')) + self.assertEqual(response['node-info']['error-tag'], 'data-missing') + self.assertEqual(response['node-info']['error-message'], + 'Request could not be completed because the relevant data model content does not exist') if __name__ == '__main__': diff --git a/tests/transportpce_tests/common/test_utils_rfc8040.py b/tests/transportpce_tests/common/test_utils_rfc8040.py index ab3a0f260..1a5ea6265 100644 --- a/tests/transportpce_tests/common/test_utils_rfc8040.py +++ b/tests/transportpce_tests/common/test_utils_rfc8040.py @@ -28,15 +28,15 @@ import simulators SIMS = simulators.SIMS -HONEYNODE_OK_START_MSG = "Netconf SSH endpoint started successfully at 0.0.0.0" +HONEYNODE_OK_START_MSG = 'Netconf SSH endpoint started successfully at 0.0.0.0' KARAF_OK_START_MSG = re.escape( "Blueprint container for bundle org.opendaylight.netconf.restconf")+".* was successfully created" LIGHTY_OK_START_MSG = re.escape("lighty.io and RESTCONF-NETCONF started") -ODL_LOGIN = "admin" -ODL_PWD = "admin" -NODES_LOGIN = "admin" -NODES_PWD = "admin" +ODL_LOGIN = 'admin' +ODL_PWD = 'admin' +NODES_LOGIN = 'admin' +NODES_PWD = 'admin' TYPE_APPLICATION_JSON = {'Content-Type': 'application/json', 'Accept': 'application/json'} TYPE_APPLICATION_XML = {'Content-Type': 'application/xml', 'Accept': 'application/xml'} @@ -44,26 +44,37 @@ TYPE_APPLICATION_XML = {'Content-Type': 'application/xml', 'Accept': 'applicatio CODE_SHOULD_BE_200 = 'Http status code should be 200' CODE_SHOULD_BE_201 = 'Http status code should be 201' -SIM_LOG_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), "log") +SIM_LOG_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'log') process_list = [] - -if "USE_ODL_ALT_RESTCONF_PORT" in os.environ: - RESTCONF_BASE_URL = "http://localhost:" + os.environ['USE_ODL_ALT_RESTCONF_PORT'] + "/rests" +if 'USE_ODL_ALT_RESTCONF_PORT' in os.environ: + RESTCONF_PORT = os.environ['USE_ODL_ALT_RESTCONF_PORT'] +else: + RESTCONF_PORT = 8181 + +RESTCONF_PATH_PREFIX = {'rfc8040': '/rests', + 'draft-bierman02': '/restconf'} +if 'USE_ODL_RESTCONF_VERSION' in os.environ: + RESTCONF_VERSION = os.environ['USE_ODL_RESTCONF_VERSION'] + if RESTCONF_VERSION not in RESTCONF_PATH_PREFIX.keys(): + print('unsupported RESTCONF version ' + RESTCONF_VERSION) + sys.exit(3) else: - RESTCONF_BASE_URL = "http://localhost:8181/rests" + RESTCONF_VERSION = 'rfc8040' -if "USE_ODL_ALT_KARAF_INSTALL_DIR" in os.environ: +RESTCONF_BASE_URL = 'http://localhost:' + RESTCONF_PORT + RESTCONF_PATH_PREFIX[RESTCONF_VERSION] + +if 'USE_ODL_ALT_KARAF_INSTALL_DIR' in os.environ: KARAF_INSTALLDIR = os.environ['USE_ODL_ALT_KARAF_INSTALL_DIR'] else: - KARAF_INSTALLDIR = "karaf" + KARAF_INSTALLDIR = 'karaf' KARAF_LOG = os.path.join( os.path.dirname(os.path.realpath(__file__)), - "..", "..", "..", KARAF_INSTALLDIR, "target", "assembly", "data", "log", "karaf.log") + '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'data', 'log', 'karaf.log') -if "USE_LIGHTY" in os.environ and os.environ['USE_LIGHTY'] == 'True': +if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True': TPCE_LOG = 'odl-' + str(os.getpid()) + '.log' else: TPCE_LOG = KARAF_LOG @@ -75,14 +86,14 @@ else: def get_request(url): return requests.request( - "GET", url.format(RESTCONF_BASE_URL), + 'GET', url.format(RESTCONF_BASE_URL), headers=TYPE_APPLICATION_JSON, auth=(ODL_LOGIN, ODL_PWD)) def put_request(url, data): return requests.request( - "PUT", url.format(RESTCONF_BASE_URL), + 'PUT', url.format(RESTCONF_BASE_URL), data=json.dumps(data), headers=TYPE_APPLICATION_JSON, auth=(ODL_LOGIN, ODL_PWD)) @@ -90,7 +101,7 @@ def put_request(url, data): def delete_request(url): return requests.request( - "DELETE", url.format(RESTCONF_BASE_URL), + 'DELETE', url.format(RESTCONF_BASE_URL), headers=TYPE_APPLICATION_JSON, auth=(ODL_LOGIN, ODL_PWD)) @@ -101,13 +112,13 @@ def delete_request(url): def start_sims(sims_list): for sim in sims_list: - print("starting simulator " + sim[0] + " in OpenROADM device version " + sim[1] + "...") + print('starting simulator ' + sim[0] + ' in OpenROADM device version ' + sim[1] + '...') log_file = os.path.join(SIM_LOG_DIRECTORY, SIMS[sim]['logfile']) process = start_honeynode(log_file, sim) if wait_until_log_contains(log_file, HONEYNODE_OK_START_MSG, 100): - print("simulator for " + sim[0] + " started") + print('simulator for ' + sim[0] + ' started') else: - print("simulator for " + sim[0] + " failed to start") + print('simulator for ' + sim[0] + ' failed to start') shutdown_process(process) for pid in process_list: shutdown_process(pid) @@ -117,17 +128,17 @@ def start_sims(sims_list): def start_tpce(): - print("starting OpenDaylight...") - if "USE_LIGHTY" in os.environ and os.environ['USE_LIGHTY'] == 'True': + print('starting OpenDaylight...') + if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True': process = start_lighty() start_msg = LIGHTY_OK_START_MSG else: process = start_karaf() start_msg = KARAF_OK_START_MSG if wait_until_log_contains(TPCE_LOG, start_msg, time_to_wait=300): - print("OpenDaylight started !") + print('OpenDaylight started !') else: - print("OpenDaylight failed to start !") + print('OpenDaylight failed to start !') shutdown_process(process) for pid in process_list: shutdown_process(pid) @@ -137,31 +148,31 @@ def start_tpce(): def start_karaf(): - print("starting KARAF TransportPCE build...") + print('starting KARAF TransportPCE build...') executable = os.path.join( os.path.dirname(os.path.realpath(__file__)), - "..", "..", "..", KARAF_INSTALLDIR, "target", "assembly", "bin", "karaf") + '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'karaf') with open('odl.log', 'w', encoding='utf-8') as outfile: return subprocess.Popen( - ["sh", executable, "server"], stdout=outfile, stderr=outfile, stdin=None) + ['sh', executable, 'server'], stdout=outfile, stderr=outfile, stdin=None) def start_lighty(): - print("starting LIGHTY.IO TransportPCE build...") + print('starting LIGHTY.IO TransportPCE build...') executable = os.path.join( os.path.dirname(os.path.realpath(__file__)), - "..", "..", "..", "lighty", "target", "tpce", - "clean-start-controller.sh") + '..', '..', '..', 'lighty', 'target', 'tpce', + 'clean-start-controller.sh') with open(TPCE_LOG, 'w', encoding='utf-8') as outfile: return subprocess.Popen( - ["sh", executable], stdout=outfile, stderr=outfile, stdin=None) + ['sh', executable], stdout=outfile, stderr=outfile, stdin=None) def install_karaf_feature(feature_name: str): - print("installing feature " + feature_name) + print('installing feature ' + feature_name) executable = os.path.join( os.path.dirname(os.path.realpath(__file__)), - "..", "..", "..", KARAF_INSTALLDIR, "target", "assembly", "bin", "client") + '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'client') return subprocess.run([executable], input='feature:install ' + feature_name + '\n feature:list | grep ' + feature_name + ' \n logout \n', @@ -178,9 +189,9 @@ def shutdown_process(process): def start_honeynode(log_file: str, sim): executable = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "..", "..", "honeynode", sim[1], "honeynode-simulator", "honeycomb-tpce") + '..', '..', 'honeynode', sim[1], 'honeynode-simulator', 'honeycomb-tpce') sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)), - "..", "..", "sample_configs", "openroadm", sim[1]) + '..', '..', 'sample_configs', 'openroadm', sim[1]) if os.path.isfile(executable): with open(log_file, 'w', encoding='utf-8') as outfile: return subprocess.Popen( @@ -207,20 +218,20 @@ def wait_until_log_contains(log_file, regexp, time_to_wait=60): while True: line = filelogs.readline() if compiled_regexp.search(line): - print("Pattern found!", end=' ') + print('Pattern found!', end=' ') stringfound = True break if not line: time.sleep(0.1) except TimeoutError: - print("Pattern not found after " + str(time_to_wait), end=" seconds! ", flush=True) + print('Pattern not found after ' + str(time_to_wait), end=' seconds! ', flush=True) except PermissionError: - print("Permission Error when trying to access the log file", end=" ... ", flush=True) + print('Permission Error when trying to access the log file', end=' ... ', flush=True) finally: if filefound: filelogs.close() else: - print("log file does not exist or is not accessible... ", flush=True) + print('log file does not exist or is not accessible... ', flush=True) return stringfound @@ -245,46 +256,50 @@ class TimeOut: # -def mount_device(node_id, sim): - url = "{}/data/network-topology:network-topology/topology=topology-netconf/node={}" - body = {"node": [{ - "node-id": node_id, - "netconf-node-topology:username": NODES_LOGIN, - "netconf-node-topology:password": NODES_PWD, - "netconf-node-topology:host": "127.0.0.1", - "netconf-node-topology:port": SIMS[sim]['port'], - "netconf-node-topology:tcp-only": "false", - "netconf-node-topology:pass-through": {}}]} - response = put_request(url.format('{}', node_id), body) - if wait_until_log_contains(TPCE_LOG, re.escape("Triggering notification stream NETCONF for node " + node_id), 180): - print("Node " + node_id + " correctly added to tpce topology", end='... ', flush=True) +def mount_device(node: str, sim: str): + url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}', + 'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}'} + body = {'node': [{ + 'node-id': node, + 'netconf-node-topology:username': NODES_LOGIN, + 'netconf-node-topology:password': NODES_PWD, + 'netconf-node-topology:host': '127.0.0.1', + 'netconf-node-topology:port': SIMS[sim]['port'], + 'netconf-node-topology:tcp-only': 'false', + 'netconf-node-topology:pass-through': {}}]} + response = put_request(url[RESTCONF_VERSION].format('{}', node), body) + if wait_until_log_contains(TPCE_LOG, re.escape('Triggering notification stream NETCONF for node ' + node), 180): + print('Node ' + node + ' correctly added to tpce topology', end='... ', flush=True) else: - print("Node " + node_id + " still not added to tpce topology", end='... ', flush=True) + print('Node ' + node + ' still not added to tpce topology', end='... ', flush=True) if response.status_code == requests.codes.ok: - print("It was probably loaded at start-up", end='... ', flush=True) + print('It was probably loaded at start-up', end='... ', flush=True) # TODO an else-clause to abort test would probably be nice here return response -def unmount_device(node_id): - url = "{}/data/network-topology:network-topology/topology=topology-netconf/node={}" - response = delete_request(url.format('{}', node_id)) - if wait_until_log_contains(TPCE_LOG, re.escape("onDeviceDisConnected: " + node_id), 180): - print("Node " + node_id + " correctly deleted from tpce topology", end='... ', flush=True) +def unmount_device(node: str): + url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}', + 'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}'} + response = delete_request(url[RESTCONF_VERSION].format('{}', node)) + if wait_until_log_contains(TPCE_LOG, re.escape("onDeviceDisConnected: " + node), 180): + print('Node ' + node + ' correctly deleted from tpce topology', end='... ', flush=True) else: - print("Node " + node_id + " still not deleted from tpce topology", end='... ', flush=True) + print('Node ' + node + ' still not deleted from tpce topology', end='... ', flush=True) return response def check_device_connection(node: str): - url = "{}/data/network-topology:network-topology/topology=topology-netconf/node={}" - response = get_request(url.format('{}', node)) + url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}', + 'draft-bierman02': '{}/operational/network-topology:network-topology/topology/topology-netconf/node/{}'} + response = get_request(url[RESTCONF_VERSION].format('{}', node)) res = response.json() - key = 'network-topology:node' - if key in res.keys(): - connection_status = res[key][0]['netconf-node-topology:connection-status'] + return_key = {'rfc8040': 'network-topology:node', + 'draft-bierman02': 'node'} + if return_key[RESTCONF_VERSION] in res.keys(): + connection_status = res[return_key[RESTCONF_VERSION]][0]['netconf-node-topology:connection-status'] else: - connection_status = res['errors']['error'] + connection_status = res['errors']['error'][0] return {'status_code': response.status_code, 'connection-status': connection_status} @@ -294,41 +309,52 @@ def check_device_connection(node: str): def get_portmapping(node: str): - url = "{}/data/transportpce-portmapping:network/nodes={}" - response = get_request(url.format('{}', node)) + url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}', + 'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}'} + response = get_request(url[RESTCONF_VERSION].format('{}', node)) res = response.json() - nodes = res['transportpce-portmapping:nodes'] + return_key = {'rfc8040': 'transportpce-portmapping:nodes', + 'draft-bierman02': 'nodes'} + nodes = res[return_key[RESTCONF_VERSION]] return {'status_code': response.status_code, 'nodes': nodes} def get_portmapping_node_info(node: str): - url = "{}/data/transportpce-portmapping:network/nodes={}/node-info" - response = get_request(url.format('{}', node)) + url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/node-info', + 'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/node-info'} + response = get_request(url[RESTCONF_VERSION].format('{}', node)) res = response.json() - key = 'transportpce-portmapping:node-info' - if key in res.keys(): - node_info = res[key] + return_key = {'rfc8040': 'transportpce-portmapping:node-info', + 'draft-bierman02': 'node-info'} + if return_key[RESTCONF_VERSION] in res.keys(): + node_info = res[return_key[RESTCONF_VERSION]] else: - node_info = res['errors']['error'] + node_info = res['errors']['error'][0] return {'status_code': response.status_code, 'node-info': node_info} def portmapping_request(node: str, mapping: str): - url = "{}/data/transportpce-portmapping:network/nodes={}/mapping={}" - response = get_request(url.format('{}', node, mapping)) + url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/mapping={}', + 'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/mapping/{}'} + response = get_request(url[RESTCONF_VERSION].format('{}', node, mapping)) res = response.json() - mapping = res['transportpce-portmapping:mapping'] + return_key = {'rfc8040': 'transportpce-portmapping:mapping', + 'draft-bierman02': 'mapping'} + mapping = res[return_key[RESTCONF_VERSION]] return {'status_code': response.status_code, 'mapping': mapping} def portmapping_mc_capa_request(node: str, mc_capa: str): - url = "{}/data/transportpce-portmapping:network/nodes={}/mc-capabilities={}" - response = get_request(url.format('{}', node, mc_capa)) + url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/mc-capabilities={}', + 'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/mc-capabilities/{}'} + response = get_request(url[RESTCONF_VERSION].format('{}', node, mc_capa)) res = response.json() - capabilities = res['transportpce-portmapping:mc-capabilities'] + return_key = {'rfc8040': 'transportpce-portmapping:mc-capabilities', + 'draft-bierman02': 'mc-capabilities'} + capabilities = res[return_key[RESTCONF_VERSION]] return {'status_code': response.status_code, 'mc-capabilities': capabilities} @@ -338,9 +364,18 @@ def portmapping_mc_capa_request(node: str, mc_capa: str): def get_ietf_network_request(network: str, content: str): - url = "{}/data/ietf-network:networks/network={}?content={}" - response = get_request(url.format('{}', network, content)) + url = {'rfc8040': '{}/data/ietf-network:networks/network={}?content={}', + 'draft-bierman02': '{}/{}/ietf-network:networks/network/{}'} + if RESTCONF_VERSION == 'rfc8040': + format_args = ('{}', network, content) + elif content == 'config': + format_args = ('{}', content, network) + else: + format_args = ('{}', 'operational', network) + response = get_request(url[RESTCONF_VERSION].format(*format_args)) res = response.json() - networks = res['ietf-network:network'] + return_key = {'rfc8040': 'ietf-network:network', + 'draft-bierman02': 'network'} + networks = res[return_key[RESTCONF_VERSION]] return {'status_code': response.status_code, 'network': networks} diff --git a/tox.ini b/tox.ini index 8e9528a65..202991a85 100644 --- a/tox.ini +++ b/tox.ini @@ -54,7 +54,7 @@ commands = [testenv:testsPCE] depends = buildcontroller whitelist_externals = launch_tests.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION #setenv = # USE_LIGHTY=True commands = @@ -76,9 +76,10 @@ commands = depends = buildcontroller,build_karaf_tests121,sims121,testsPCE # testsPCE dependency is only here to chain tests in the gate and avoid resources starvation whitelist_externals = launch_tests.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION setenv = # USE_LIGHTY=True + USE_ODL_RESTCONF_VERSION=draft-bierman02 USE_ODL_ALT_KARAF_ENV=./karaf121.env USE_ODL_ALT_KARAF_INSTALL_DIR=karaf121 commands = @@ -108,9 +109,10 @@ commands = depends = buildcontroller,build_karaf_tests221,sims221,tests71 # tests71 dependency is only here to chain tests in the gate and avoid ressources starvation whitelist_externals = launch_tests.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION setenv = # USE_LIGHTY=True + USE_ODL_RESTCONF_VERSION=draft-bierman02 USE_ODL_ALT_KARAF_ENV=./karaf221.env USE_ODL_ALT_KARAF_INSTALL_DIR=karaf221 commands = @@ -131,9 +133,10 @@ commands = [testenv:tests71] depends = buildcontroller,build_karaf_tests71,sims71 whitelist_externals = launch_tests.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION setenv = # USE_LIGHTY=True + USE_ODL_RESTCONF_VERSION=draft-bierman02 USE_ODL_ALT_KARAF_ENV=./karaf71.env USE_ODL_ALT_KARAF_INSTALL_DIR=karaf71 commands = @@ -155,7 +158,7 @@ commands = depends = buildcontroller,sims121,sims221,sims71,tests121,tests221,tests71 #the last dependency is to avoid temporarily concurrent ressources problem in parallel mode whitelist_externals = launch_tests.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION setenv = # USE_LIGHTY=True USE_ODL_ALT_KARAF_ENV=./karaf121.env @@ -168,7 +171,7 @@ commands = depends = buildcontroller whitelist_externals = launch_tests.sh dockercmd.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION commands = #sudo docker pull atriki/gnpyrest:v1.2 ./dockercmd.sh run -d -p 8008:5000 --name gnpy_tpce_rest1 atriki/gnpyrest:v1.2 @@ -179,7 +182,7 @@ commands = depends = buildcontroller,sims221 whitelist_externals = launch_tests.sh dockercmd.sh -passenv = LAUNCHER USE_LIGHTY +passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION commands = ./dockercmd.sh run -d -p 2181:2181 -p 9092:9092 --env ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 --name tpce_kafka1 teivah/kafka:2.0.0 ./launch_tests.sh with_docker nbinotifications -- 2.36.6