X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=tests%2Ftransportpce_tests%2Fcommon%2Ftest_utils_rfc8040.py;h=1536a2b7bc0ff358cbee0fcc9a57b5eeebe7a137;hb=refs%2Fchanges%2F20%2F102220%2F6;hp=ae4716189868f53f4477a07e34761d93f7f8cfa7;hpb=6dc56e813eefe81ce293823936c500869b841e0a;p=transportpce.git diff --git a/tests/transportpce_tests/common/test_utils_rfc8040.py b/tests/transportpce_tests/common/test_utils_rfc8040.py index ae4716189..1536a2b7b 100644 --- a/tests/transportpce_tests/common/test_utils_rfc8040.py +++ b/tests/transportpce_tests/common/test_utils_rfc8040.py @@ -29,8 +29,7 @@ import simulators SIMS = simulators.SIMS 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" +KARAF_OK_START_MSG = "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' @@ -108,7 +107,6 @@ def delete_request(url): def post_request(url, data): if data: - print(json.dumps(data)) return requests.request( "POST", url.format(RESTCONF_BASE_URL), data=json.dumps(data), @@ -282,7 +280,7 @@ def mount_device(node: str, sim: str): '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): + if wait_until_log_contains(TPCE_LOG, 'Triggering notification stream NETCONF for node ' + node, 180): print('Node ' + node + ' correctly added to tpce topology', end='... ', flush=True) else: print('Node ' + node + ' still not added to tpce topology', end='... ', flush=True) @@ -318,6 +316,22 @@ def check_device_connection(node: str): 'connection-status': connection_status} +def check_node_request(node: str): + # pylint: disable=line-too-long + url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device?content=config', # nopep8 + 'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device'} # nopep8 + response = get_request(url[RESTCONF_VERSION].format('{}', node)) + res = response.json() + return_key = {'rfc8040': 'org-openroadm-device:org-openroadm-device', + 'draft-bierman02': 'org-openroadm-device'} + if return_key[RESTCONF_VERSION] in res.keys(): + response_attribute = res[return_key[RESTCONF_VERSION]] + else: + response_attribute = res['errors']['error'][0] + return {'status_code': response.status_code, + 'org-openroadm-device': response_attribute} + + def check_node_attribute_request(node: str, attribute: str, attribute_value: str): # pylint: disable=line-too-long url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}?content=nonconfig', # nopep8 @@ -360,67 +374,43 @@ def del_node_attribute_request(node: str, attribute: str, attribute_value: str): # -def get_portmapping(node: str): - 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() - return_key = {'rfc8040': 'transportpce-portmapping:nodes', - 'draft-bierman02': 'nodes'} - nodes = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'nodes': nodes} +def post_portmapping(payload: str): + url = {'rfc8040': '{}/data/transportpce-portmapping:network', + 'draft-bierman02': '{}/config/transportpce-portmapping:network'} + json_payload = json.loads(payload) + response = post_request(url[RESTCONF_VERSION].format('{}'), json_payload) + return {'status_code': response.status_code} -def get_portmapping_node_info(node: str): - 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() - 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'][0] - return {'status_code': response.status_code, - 'node-info': node_info} +def del_portmapping(): + url = {'rfc8040': '{}/data/transportpce-portmapping:network', + 'draft-bierman02': '{}/config/transportpce-portmapping:network'} + response = delete_request(url[RESTCONF_VERSION].format('{}')) + return {'status_code': response.status_code} -def portmapping_request(node: str, mapping: str): - 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() - 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_switching_pool_request(node: str, switching_pool: str): - url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/switching-pool-lcp={}', - 'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/switching-pool-lcp/{}'} - response = get_request(url[RESTCONF_VERSION].format('{}', node, switching_pool)) - res = response.json() - return_key = {'rfc8040': 'transportpce-portmapping:switching-pool-lcp', - 'draft-bierman02': 'switching-pool-lcp'} - switching_pool = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'switching_pool': switching_pool} - - -def portmapping_mc_capa_request(node: str, mc_capa: str): - 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)) +def get_portmapping_node_attr(node: str, attr: str, value: str): + # pylint: disable=consider-using-f-string + url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}', + 'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}'} + target_url = url[RESTCONF_VERSION].format('{}', node) + if attr is not None: + target_url = (target_url + '/{}').format('{}', attr) + if value is not None: + suffix = {'rfc8040': '={}', 'draft-bierman02': '/{}'} + target_url = (target_url + suffix[RESTCONF_VERSION]).format('{}', value) + else: + attr = 'nodes' + response = get_request(target_url) res = response.json() - return_key = {'rfc8040': 'transportpce-portmapping:mc-capabilities', - 'draft-bierman02': 'mc-capabilities'} - capabilities = res[return_key[RESTCONF_VERSION]] + return_key = {'rfc8040': 'transportpce-portmapping:' + attr, + 'draft-bierman02': attr} + if return_key[RESTCONF_VERSION] in res.keys(): + return_output = res[return_key[RESTCONF_VERSION]] + else: + return_output = res['errors']['error'][0] return {'status_code': response.status_code, - 'mc-capabilities': capabilities} + attr: return_output} # # Topology operations @@ -437,14 +427,32 @@ def get_ietf_network_request(network: str, content: str): else: format_args = ('{}', 'operational', network) response = get_request(url[RESTCONF_VERSION].format(*format_args)) - res = response.json() - return_key = {'rfc8040': 'ietf-network:network', - 'draft-bierman02': 'network'} - networks = res[return_key[RESTCONF_VERSION]] + if bool(response): + res = response.json() + return_key = {'rfc8040': 'ietf-network:network', + 'draft-bierman02': 'network'} + networks = res[return_key[RESTCONF_VERSION]] + else: + networks = None return {'status_code': response.status_code, 'network': networks} +def put_ietf_network(network: str, payload: str): + url = {'rfc8040': '{}/data/ietf-network:networks/network={}', + 'draft-bierman02': '{}/config/ietf-network:networks/network/{}'} + json_payload = json.loads(payload) + response = put_request(url[RESTCONF_VERSION].format('{}', network), json_payload) + return {'status_code': response.status_code} + + +def del_ietf_network(network: str): + url = {'rfc8040': '{}/data/ietf-network:networks/network={}', + 'draft-bierman02': '{}/config/ietf-network:networks/network/{}'} + response = delete_request(url[RESTCONF_VERSION].format('{}', network)) + return {'status_code': response.status_code} + + def get_ietf_network_link_request(network: str, link: str, content: str): url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}', 'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'} @@ -494,7 +502,7 @@ def del_oms_attr_request(link: str,): return response -def del_ietf_network_node_request(network: str, node: str, content: str): +def get_ietf_network_node_request(network: str, node: str, content: str): url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}', 'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'} if RESTCONF_VERSION == 'rfc8040': @@ -503,168 +511,101 @@ def del_ietf_network_node_request(network: str, node: str, content: str): format_args = ('{}', content, network, node) else: format_args = ('{}', 'operational', network, node) - response = delete_request(url[RESTCONF_VERSION].format(*format_args)) - return response - -# -# TransportPCE internal API RPCs -# - - -def prepend_dict_keys(input_dict: dict, prefix: str): - return_dict = {} - for key, value in input_dict.items(): - newkey = prefix + key - if isinstance(value, dict): - return_dict[newkey] = prepend_dict_keys(value, prefix) - # TODO: perhaps some recursion depth limit or another solution has to be considered here - # even if recursion depth is given by the input_dict argument - # direct (self-)recursive functions may carry unwanted side-effects such as ressource consumptions - else: - return_dict[newkey] = value - return return_dict - - -def connect_xpdr_to_rdm_request(payload: dict): - url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': {'links-input': payload}}, 'networkutils:') + response = get_request(url[RESTCONF_VERSION].format(*format_args)) + if bool(response): + res = response.json() + return_key = {'rfc8040': 'ietf-network:node', + 'draft-bierman02': 'node'} + node = res[return_key[RESTCONF_VERSION]][0] else: - data = {'input': {'links-input': payload}} - return post_request(url, data) + node = None + return {'status_code': response.status_code, + 'node': node} -def connect_rdm_to_xpdr_request(payload: dict): - url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': {'links-input': payload}}, 'networkutils:') +def del_ietf_network_node_request(network: str, node: str, content: str): + url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}', + 'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'} + if RESTCONF_VERSION == 'rfc8040': + format_args = ('{}', network, node, content) + elif content == 'config': + format_args = ('{}', content, network, node) else: - data = {'input': {'links-input': payload}} - return post_request(url, data) + format_args = ('{}', 'operational', network, node) + response = delete_request(url[RESTCONF_VERSION].format(*format_args)) + return response -def device_renderer_create_ots_oms_request(nodeid: str, lcp: str): - url = "{}/operations/transportpce-device-renderer:create-ots-oms" - payload = { - 'node-id': nodeid, - 'logical-connection-point': lcp} - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-device-renderer:') - else: - data = {'input': payload} - return post_request(url, data) +# +# Service list operations +# -def device_renderer_service_path_request(payload: dict): - url = "{}/operations/transportpce-device-renderer:service-path" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-device-renderer:') - else: - data = {'input': payload} - response = post_request(url, data) +def get_ordm_serv_list_request(): + url = {'rfc8040': '{}/data/org-openroadm-service:service-list?content=nonconfig', + 'draft-bierman02': '{}/operational/org-openroadm-service:service-list/'} + response = get_request(url[RESTCONF_VERSION]) res = response.json() - return_key = {'rfc8040': 'transportpce-device-renderer:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'output': return_output} - - -def device_renderer_otn_service_path_request(payload: dict): - url = "{}/operations/transportpce-device-renderer:otn-service-path" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-device-renderer:') + return_key = {'rfc8040': 'org-openroadm-service:service-list', + 'draft-bierman02': 'service-list'} + if return_key[RESTCONF_VERSION] in res.keys(): + response_attribute = res[return_key[RESTCONF_VERSION]] else: - data = {'input': payload} - response = post_request(url, data) - res = response.json() - return_key = {'rfc8040': 'transportpce-device-renderer:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] + response_attribute = res['errors']['error'][0] return {'status_code': response.status_code, - 'output': return_output} + 'service-list': response_attribute} -def renderer_service_implementation_request(payload: dict): - url = "{}/operations/transportpce-renderer:service-implementation-request" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-renderer:') +def get_ordm_serv_list_attr_request(attribute: str, value: str): + url = {'rfc8040': '{}/data/org-openroadm-service:service-list/{}={}?content=nonconfig', + 'draft-bierman02': '{}/operational/org-openroadm-service:service-list/{}/{}'} + if RESTCONF_VERSION == 'rfc8040': + format_args = ('{}', attribute, value) else: - data = {'input': payload} - response = post_request(url, data) + format_args = ('{}', attribute, value) + response = get_request(url[RESTCONF_VERSION].format(*format_args)) res = response.json() - return_key = {'rfc8040': 'transportpce-renderer:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'output': return_output} - - -def olm_get_pm_request(payload: dict): - url = "{}/operations/transportpce-olm:get-pm" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-olm:') + return_key = {'rfc8040': 'org-openroadm-service:' + attribute, + 'draft-bierman02': attribute} + if return_key[RESTCONF_VERSION] in res.keys(): + response_attribute = res[return_key[RESTCONF_VERSION]] else: - data = {'input': payload} - response = post_request(url, data) - res = response.json() - return_key = {'rfc8040': 'transportpce-olm:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] + response_attribute = res['errors']['error'][0] return {'status_code': response.status_code, - 'output': return_output} + attribute: response_attribute} -def olm_calculate_spanloss_base_request(payload: dict): - url = "{}/operations/transportpce-olm:calculate-spanloss-base" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-olm:') - else: - data = {'input': payload} - response = post_request(url, data) - res = response.json() - return_key = {'rfc8040': 'transportpce-olm:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'output': return_output} +# +# TransportPCE internal API RPCs +# -def olm_service_power_setup_request(payload: dict): - url = "{}/operations/transportpce-olm:service-power-setup" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-olm:') - else: - data = {'input': payload} - response = post_request(url, data) - res = response.json() - return_key = {'rfc8040': 'transportpce-olm:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'output': return_output} +def prepend_dict_keys(input_dict: dict, prefix: str): + return_dict = {} + for key, value in input_dict.items(): + newkey = prefix + key + if isinstance(value, dict): + return_dict[newkey] = prepend_dict_keys(value, prefix) + # TODO: perhaps some recursion depth limit or another solution has to be considered here + # even if recursion depth is given by the input_dict argument + # direct (self-)recursive functions may carry unwanted side-effects such as ressource consumptions + else: + return_dict[newkey] = value + return return_dict -def olm_service_power_turndown_request(payload: dict): - url = "{}/operations/transportpce-olm:service-power-turndown" - if RESTCONF_VERSION == 'draft-bierman02': - data = prepend_dict_keys({'input': payload}, 'transportpce-olm:') +def transportpce_api_rpc_request(api_module: str, rpc: str, payload: dict): + # pylint: disable=consider-using-f-string + url = "{}/operations/{}:{}".format('{}', api_module, rpc) + if payload is None: + data = None + elif RESTCONF_VERSION == 'draft-bierman02': + data = prepend_dict_keys({'input': payload}, api_module + ':') else: data = {'input': payload} response = post_request(url, data) res = response.json() - return_key = {'rfc8040': 'transportpce-olm:output', - 'draft-bierman02': 'output'} - return_output = res[return_key[RESTCONF_VERSION]] - return {'status_code': response.status_code, - 'output': return_output} - - -def olm_calculate_spanloss_current_request(): - url = "{}/operations/transportpce-olm:calculate-spanloss-current" - response = post_request(url, None) - res = response.json() - return_key = {'rfc8040': 'transportpce-olm:output', + return_key = {'rfc8040': api_module + ':output', 'draft-bierman02': 'output'} return_output = res[return_key[RESTCONF_VERSION]] return {'status_code': response.status_code,