X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=tests%2Ftransportpce_tests%2Fcommon%2Ftest_utils.py;h=5d2789c1b024bd901f9a61c68ccc773f725e72cf;hb=122239adbcc8e857aa9eff4a45f6ab1900dfe885;hp=f156ad67ac4838968ff05b1d8e72e6c4029b9a8e;hpb=cbfcf23c81171a5f8e84107affcfe77f2a8e0fb1;p=transportpce.git diff --git a/tests/transportpce_tests/common/test_utils.py b/tests/transportpce_tests/common/test_utils.py index f156ad67a..5d2789c1b 100644 --- a/tests/transportpce_tests/common/test_utils.py +++ b/tests/transportpce_tests/common/test_utils.py @@ -22,6 +22,12 @@ import time import psutil import requests +import urllib.parse + +from dict2xml import dict2xml +from netconf_client.connect import connect_ssh +from netconf_client.ncclient import Manager + # pylint: disable=import-error import simulators @@ -48,6 +54,9 @@ CODE_SHOULD_BE_201 = 'Http status code should be 201' T100GE = 'Transponder 100GE' T0_MULTILAYER_TOPO = 'T0 - Multi-layer topology' T0_FULL_MULTILAYER_TOPO = 'T0 - Full Multi-layer topology' +T100GE_UUID = 'cf51c729-3699-308a-a7d0-594c6a62ebbb' +T0_MULTILAYER_TOPO_UUID = '747c670e-7a07-3dab-b379-5b1cd17402a3' +T0_FULL_MULTILAYER_TOPO_UUID = '393f09a4-0a0b-3d82-a4f6-1fbbc14ca1a7' SIM_LOG_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'log') @@ -85,6 +94,19 @@ if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True': else: TPCE_LOG = KARAF_LOG +if 'USE_SIMS' not in os.environ: + SIMS_TO_USE = 'lightynode' + SIMS_TYPE = 'lightynode' +else: + SIMS_TO_USE = os.environ['USE_SIMS'] + print("Forcing to use SIMS " + SIMS_TO_USE) + if SIMS_TO_USE != 'None' or 'SIMS_TYPE' not in os.environ: + SIMS_TYPE = SIMS_TO_USE + else: + SIMS_TYPE = os.environ['SIMS_TYPE'] + print("Forcing to use SIMS type" + SIMS_TYPE) + + # # Basic HTTP operations # @@ -162,14 +184,9 @@ def start_lightynode(log_file: str, sim): def start_sims(sims_list): - if 'USE_SIMS' in os.environ: - sims_to_use = os.environ['USE_SIMS'] - print("Using SIMS " + sims_to_use) - else: - sims_to_use = 'lightynode' - if sims_to_use == 'None': + if SIMS_TO_USE == 'None': return None - if sims_to_use == 'honeynode': + if SIMS_TO_USE == 'honeynode': start_msg = HONEYNODE_OK_START_MSG start_method = start_honeynode else: @@ -260,34 +277,29 @@ def wait_until_log_contains(log_file, regexp, time_to_wait=60): # pylint: disable=lost-exception # pylint: disable=consider-using-with stringfound = False - filefound = False line = None try: with TimeOut(seconds=time_to_wait): while not os.path.exists(log_file): time.sleep(0.2) - filelogs = open(log_file, 'r', encoding='utf-8') - filelogs.seek(0, 2) - filefound = True - print("Searching for pattern '" + regexp + "' in " + os.path.basename(log_file), end='... ', flush=True) - compiled_regexp = re.compile(regexp) - while True: - line = filelogs.readline() - if compiled_regexp.search(line): - print('Pattern found!', end=' ') - stringfound = True - break - if not line: - time.sleep(0.1) + with open(log_file, 'r', encoding='utf-8') as filelogs: + filelogs.seek(0, 2) + print("Searching for pattern '" + regexp + "' in " + os.path.basename(log_file), end='... ', flush=True) + compiled_regexp = re.compile(regexp) + while True: + line = filelogs.readline() + if compiled_regexp.search(line): + print('Pattern found!', end=' ') + stringfound = True + break + if not line: + time.sleep(0.1) + return stringfound except TimeoutError: print('Pattern not found after ' + str(time_to_wait), end=' seconds! ', flush=True) + return stringfound except PermissionError: 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) return stringfound @@ -386,8 +398,12 @@ def check_node_attribute_request(node: str, attribute: str, attribute_value: str 'draft-bierman02': attribute} if return_key[RESTCONF_VERSION] in res.keys(): response_attribute = res[return_key[RESTCONF_VERSION]] - else: + elif 'errors' in res.keys(): response_attribute = res['errors']['error'][0] + else: + # status code 400 invalid request + response_attribute = res['message'] + ' ' + res['url'] + print(response_attribute) return {'status_code': response.status_code, attribute: response_attribute} @@ -672,3 +688,86 @@ def transportpce_api_rpc_request(api_module: str, rpc: str, payload: dict): return_output = res[return_key[RESTCONF_VERSION]] return {'status_code': response.status_code, 'output': return_output} + +# +# simulators datastore operations +# + + +def sims_update_cp_port(sim: tuple, circuitpack: str, port: str, payload: dict): + if SIMS_TYPE == 'lightynode': + return sims_update_cp_port_ntcf(sim, circuitpack, payload) + if SIMS_TYPE == 'honeynode': + return sims_update_cp_port_rest(sim, circuitpack, port, payload) + return False + + +def sims_update_cp_port_rest(sim: tuple, circuitpack: str, port: str, payload: dict): + # pylint: disable=consider-using-f-string + url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/{}/ports/{}".format( + SIMS[sim]['restconf_baseurl'], + urllib.parse.quote(circuitpack, safe=''), + urllib.parse.quote(port, safe='')) + body = {"ports": [payload]} + response = requests.request("PUT", + url, + data=json.dumps(body), + headers=TYPE_APPLICATION_JSON, + auth=(ODL_LOGIN, ODL_PWD), + timeout=REQUEST_TIMEOUT) + return response.status_code == requests.codes.ok + + +def sims_update_cp_port_ntcf(sim: tuple, circuitpack: str, payload: dict): + body = {"circuit-packs": {"circuit-pack-name": circuitpack, "ports": payload}} + xml_body = '' + xml_body += dict2xml(body, indent=" ") + xml_body += '' + with connect_ssh(host='127.0.0.1', + port=int(SIMS[sim]['port']), + username=NODES_LOGIN, + password=NODES_PWD) as session: + mgr = Manager(session, timeout=120) + reply = mgr.edit_config(xml_body, target="candidate", default_operation="merge") + if "None" in str(reply): + return True + return False + + +def sims_update_pm_interact(sim: tuple, payload: dict): + if SIMS_TYPE == 'lightynode': + return sims_update_pm_interact_ntcf(sim, payload) + if SIMS_TYPE == 'honeynode': + return sims_update_pm_interact_rest(sim, payload) + return False + + +def sims_update_pm_interact_rest(sim: tuple, payload: dict): + # pylint: disable=consider-using-f-string + url = "{}/operations/pm-handling:pm-interact".format(SIMS[sim]['restconf_baseurl']) + body = {"input": payload} + response = requests.request("POST", + url, + data=json.dumps(body), + headers=TYPE_APPLICATION_JSON, + auth=(ODL_LOGIN, ODL_PWD), + timeout=REQUEST_TIMEOUT) + return response.status_code == requests.codes.ok + + +def sims_update_pm_interact_ntcf(sim: tuple, payload: dict): + # pylint: disable=line-too-long + xml_body = '' + xml_body += dict2xml(payload, indent=" ") + xml_body += '' + new_xml = xml_body.replace("/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']", + "/a:org-openroadm-device/a:interface[a:name='OTS-DEG2-TTP-TXRX']") + with connect_ssh(host='127.0.0.1', + port=int(SIMS[sim]['port']), + username=NODES_LOGIN, + password=NODES_PWD) as session: + mgr = Manager(session, timeout=120) + reply = mgr.dispatch(new_xml) + if "netconf_client.ncclient.RPCReply" in str(reply): + return True + return False