SIMS = simulators.SIMS
HONEYNODE_OK_START_MSG = 'Netconf SSH endpoint started successfully at 0.0.0.0'
-KARAF_OK_START_MSG = "Blueprint container for bundle org.opendaylight.netconf.restconf.* was successfully created"
+LIGHTYNODE_OK_START_MSG = 'Data tree change listeners registered'
+KARAF_OK_START_MSG = "Transportpce controller started"
LIGHTY_OK_START_MSG = re.escape("lighty.io and RESTCONF-NETCONF started")
ODL_LOGIN = 'admin'
RESTCONF_PORT = 8181
RESTCONF_PATH_PREFIX = {'rfc8040': '/rests',
- 'lighty': '/restconf',
'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:
#
+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')
+ sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ '..', '..', 'sample_configs', 'openroadm', sim[1])
+ if os.path.isfile(executable):
+ with open(log_file, 'w', encoding='utf-8') as outfile:
+ return subprocess.Popen(
+ [executable, SIMS[sim]['port'], os.path.join(sample_directory, SIMS[sim]['configfile'])],
+ stdout=outfile, stderr=outfile)
+ return None
+
+
+def start_lightynode(log_file: str, sim):
+ executable = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ '..', '..', 'lightynode', 'lightynode-openroadm-device', 'start-device.sh')
+ sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ '..', '..', 'sample_configs', 'openroadm', sim[1])
+ if os.path.isfile(executable):
+ with open(log_file, 'w', encoding='utf-8') as outfile:
+ return subprocess.Popen(
+ [executable, "-v" + sim[1], "-p" + SIMS[sim]['port'], "-f" + os.path.join(sample_directory,
+ SIMS[sim]['configfile'])],
+ stdout=outfile, stderr=outfile)
+ return None
+
+
def start_sims(sims_list):
+ if 'USE_SIMS' in os.environ:
+ sims_to_use = os.environ['USE_SIMS']
+ print(os.environ['USE_SIMS'] + ' ' + sims_to_use)
+ else:
+ sims_to_use = 'honeynode'
+ if sims_to_use == 'None':
+ return None
+ if sims_to_use == 'lightynode':
+ start_msg = LIGHTYNODE_OK_START_MSG
+ start_method = start_lightynode
+ print("lightynode used")
+ else:
+ start_msg = HONEYNODE_OK_START_MSG
+ start_method = start_honeynode
for sim in sims_list:
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):
+ process = start_method(log_file, sim)
+ if wait_until_log_contains(log_file, start_msg, 100):
print('simulator for ' + sim[0] + ' started')
else:
print('simulator for ' + sim[0] + ' failed to start')
def start_tpce():
+ if 'NO_ODL_STARTUP' in os.environ:
+ print('No OpenDaylight instance to start!')
+ return []
print('starting OpenDaylight...')
if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True':
process = start_lighty()
else:
process = start_karaf()
start_msg = KARAF_OK_START_MSG
- if wait_until_log_contains(TPCE_LOG, start_msg, time_to_wait=300):
+ if wait_until_log_contains(TPCE_LOG, start_msg, time_to_wait=100):
print('OpenDaylight started !')
else:
print('OpenDaylight failed to start !')
executable = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'client')
- return subprocess.run([executable],
+# FIXME: https://jira.opendaylight.org/browse/TRNSPRTPCE-701
+# -b option needed below because of Karaf client bug reporte in the JIRA ticket mentioned above
+ return subprocess.run([executable, '-b'],
input='feature:install ' + feature_name + '\n feature:list | grep '
+ feature_name + ' \n logout \n',
universal_newlines=True, check=False)
process.send_signal(signal.SIGINT)
-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')
- sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
- '..', '..', 'sample_configs', 'openroadm', sim[1])
- if os.path.isfile(executable):
- with open(log_file, 'w', encoding='utf-8') as outfile:
- return subprocess.Popen(
- [executable, SIMS[sim]['port'], os.path.join(sample_directory, SIMS[sim]['configfile'])],
- stdout=outfile, stderr=outfile)
- return None
-
-
def wait_until_log_contains(log_file, regexp, time_to_wait=60):
# pylint: disable=lost-exception
# pylint: disable=consider-using-with
def mount_device(node: str, sim: str):
url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}',
- 'lighty': '{}/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,
def unmount_device(node: str):
url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}',
- 'lighty': '{}/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):
def check_device_connection(node: str):
url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}?content=nonconfig',
- 'lighty': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}?content=nonconfig',
'draft-bierman02': '{}/operational/network-topology:network-topology/topology/topology-netconf/node/{}'}
response = get_request(url[RESTCONF_VERSION].format('{}', node))
res = response.json()
return_key = {'rfc8040': 'network-topology:node',
- 'lighty': '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']
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
- 'lighty': '{}/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',
- 'lighty': '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]]
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
- 'lighty': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}?content=nonconfig', # nopep8
'draft-bierman02': '{}/operational/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, attribute, attribute_value))
res = response.json()
return_key = {'rfc8040': 'org-openroadm-device:' + attribute,
- 'lighty': 'org-openroadm-device:' + attribute,
'draft-bierman02': attribute}
if return_key[RESTCONF_VERSION] in res.keys():
response_attribute = res[return_key[RESTCONF_VERSION]]
def check_node_attribute2_request(node: str, attribute: str, attribute_value: str, attribute2: 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
- 'lighty': '{}/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, attribute, attribute_value, attribute2))
res = response.json()
def del_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/{}={}', # nopep8
- 'lighty': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}', # nopep8
'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}'} # nopep8
response = delete_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value))
return response
def post_portmapping(payload: str):
url = {'rfc8040': '{}/data/transportpce-portmapping:network',
- 'lighty': '{}/data/transportpce-portmapping:network',
'draft-bierman02': '{}/config/transportpce-portmapping:network'}
json_payload = json.loads(payload)
response = post_request(url[RESTCONF_VERSION].format('{}'), json_payload)
def del_portmapping():
url = {'rfc8040': '{}/data/transportpce-portmapping:network',
- 'lighty': '{}/data/transportpce-portmapping:network',
'draft-bierman02': '{}/config/transportpce-portmapping:network'}
response = delete_request(url[RESTCONF_VERSION].format('{}'))
return {'status_code': response.status_code}
def get_portmapping_node_attr(node: str, attr: str, value: str):
# pylint: disable=consider-using-f-string
url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}',
- 'lighty': '{}/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': '={}', 'lighty': '={}', 'draft-bierman02': '/{}'}
+ 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:' + attr,
- 'lighty': 'transportpce-portmapping:' + attr,
'draft-bierman02': attr}
if return_key[RESTCONF_VERSION] in res.keys():
return_output = res[return_key[RESTCONF_VERSION]]
def get_ietf_network_request(network: str, content: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}?content={}',
- 'lighty': '{}/data/ietf-network:networks/network={}?content={}',
'draft-bierman02': '{}/{}/ietf-network:networks/network/{}'}
- if RESTCONF_VERSION in ('rfc8040', 'lighty'):
+ if RESTCONF_VERSION in ('rfc8040'):
format_args = ('{}', network, content)
elif content == 'config':
format_args = ('{}', content, network)
if bool(response):
res = response.json()
return_key = {'rfc8040': 'ietf-network:network',
- 'lighty': 'ietf-network:network',
'draft-bierman02': 'network'}
networks = res[return_key[RESTCONF_VERSION]]
else:
def put_ietf_network(network: str, payload: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}',
- 'lighty': '{}/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)
def del_ietf_network(network: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}',
- 'lighty': '{}/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={}',
- 'lighty': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
- if RESTCONF_VERSION in ('rfc8040', 'lighty'):
+ if RESTCONF_VERSION in ('rfc8040'):
format_args = ('{}', network, link, content)
elif content == 'config':
format_args = ('{}', content, network, link)
response = get_request(url[RESTCONF_VERSION].format(*format_args))
res = response.json()
return_key = {'rfc8040': 'ietf-network-topology:link',
- 'lighty': 'ietf-network-topology:link',
'draft-bierman02': 'ietf-network-topology:link'}
link = res[return_key[RESTCONF_VERSION]][0]
return {'status_code': response.status_code,
def del_ietf_network_link_request(network: str, link: str, content: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
- 'lighty': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
- if RESTCONF_VERSION in ('rfc8040', 'lighty'):
+ if RESTCONF_VERSION in ('rfc8040'):
format_args = ('{}', network, link, content)
elif content == 'config':
format_args = ('{}', content, network, link)
def add_oms_attr_request(link: str, oms_attr: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
- 'lighty': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
'draft-bierman02': '{}/config/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
url2 = url[RESTCONF_VERSION] + '/org-openroadm-network-topology:OMS-attributes/span'
network = 'openroadm-topology'
def del_oms_attr_request(link: str,):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
- 'lighty': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
'draft-bierman02': '{}/config/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
url2 = url[RESTCONF_VERSION] + '/org-openroadm-network-topology:OMS-attributes/span'
network = 'openroadm-topology'
def get_ietf_network_node_request(network: str, node: str, content: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}',
- 'lighty': '{}/data/ietf-network:networks/network={}/node={}?content={}',
'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'}
- if RESTCONF_VERSION in ('rfc8040', 'lighty'):
+ if RESTCONF_VERSION in ('rfc8040'):
format_args = ('{}', network, node, content)
elif content == 'config':
format_args = ('{}', content, network, node)
if bool(response):
res = response.json()
return_key = {'rfc8040': 'ietf-network:node',
- 'lighty': 'ietf-network:node',
'draft-bierman02': 'node'}
node = res[return_key[RESTCONF_VERSION]][0]
else:
def del_ietf_network_node_request(network: str, node: str, content: str):
url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}',
- 'lighty': '{}/data/ietf-network:networks/network={}/node={}?content={}',
'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'}
- if RESTCONF_VERSION in ('rfc8040', 'lighty'):
+ if RESTCONF_VERSION in ('rfc8040'):
format_args = ('{}', network, node, content)
elif content == 'config':
format_args = ('{}', content, network, node)
def get_ordm_serv_list_request():
url = {'rfc8040': '{}/data/org-openroadm-service:service-list?content=nonconfig',
- 'lighty': '{}/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': 'org-openroadm-service:service-list',
- 'lighty': 'org-openroadm-service:service-list',
'draft-bierman02': 'service-list'}
if return_key[RESTCONF_VERSION] in res.keys():
response_attribute = res[return_key[RESTCONF_VERSION]]
def get_ordm_serv_list_attr_request(attribute: str, value: str):
url = {'rfc8040': '{}/data/org-openroadm-service:service-list/{}={}?content=nonconfig',
- 'lighty': '{}/data/org-openroadm-service:service-list/{}={}?content=nonconfig',
'draft-bierman02': '{}/operational/org-openroadm-service:service-list/{}/{}'}
format_args = ('{}', attribute, value)
response = get_request(url[RESTCONF_VERSION].format(*format_args))
res = response.json()
return_key = {'rfc8040': 'org-openroadm-service:' + attribute,
- 'lighty': 'org-openroadm-service:' + attribute,
'draft-bierman02': attribute}
if return_key[RESTCONF_VERSION] in res.keys():
response_attribute = res[return_key[RESTCONF_VERSION]]
def get_serv_path_list_attr(attribute: str, value: str):
url = {'rfc8040': '{}/data/transportpce-service-path:service-path-list/{}={}?content=nonconfig',
- 'lighty': '{}/data/transportpce-service-path:service-path-list/{}={}?content=nonconfig',
'draft-bierman02': '{}/operational/transportpce-service-path:service-path-list/{}/{}'}
response = get_request(url[RESTCONF_VERSION].format('{}', attribute, value))
res = response.json()
return_key = {'rfc8040': 'transportpce-service-path:' + attribute,
- 'lighty': 'transportpce-service-path:' + attribute,
'draft-bierman02': attribute}
if return_key[RESTCONF_VERSION] in res.keys():
response_attribute = res[return_key[RESTCONF_VERSION]]
else:
res = response.json()
return_key = {'rfc8040': api_module + ':output',
- 'lighty': api_module + ':output',
'draft-bierman02': 'output'}
if response.status_code == requests.codes.internal_server_error:
return_output = res