From: garciadeblas Date: Thu, 21 Nov 2019 11:02:05 +0000 (+0100) Subject: Adding logging capabilities to osmclient X-Git-Tag: v7.0.1rc2~1^2~4 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=6bc001c642c74e6742d0a5dd5922738ae4c4fb0d;p=osm%2Fosmclient.git Adding logging capabilities to osmclient Change-Id: Ia48b5a95d4fb3cdbf85f90f62a6196f4b045d2f2 Signed-off-by: garciadeblas --- diff --git a/debian/python3-osmclient.postinst b/debian/python3-osmclient.postinst index 9695c47..75ec83f 100644 --- a/debian/python3-osmclient.postinst +++ b/debian/python3-osmclient.postinst @@ -16,7 +16,7 @@ echo "POST INSTALL OSMCLIENT" #Install pyangbind, required for python3-osm-im -python3 -m pip install pyangbind +python3 -m pip install pyangbind verboselogs #configure autocomplete for osmclient [ -z "$SUDO_USER" ] && SUDO_USER="$USER" su $SUDO_USER -c 'mkdir -p $HOME/.bash_completion.d' diff --git a/osmclient/client.py b/osmclient/client.py index eccfee2..56570b4 100644 --- a/osmclient/client.py +++ b/osmclient/client.py @@ -21,9 +21,32 @@ OSM client entry point from osmclient.v1 import client as client from osmclient.sol005 import client as sol005client +import logging +import verboselogs +verboselogs.install() def Client(version=1, host=None, sol005=True, *args, **kwargs): + log_format_simple = "%(levelname)s %(message)s" + log_format_complete = "%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)s %(funcName)s(): %(message)s" + log_formatter_simple = logging.Formatter(log_format_simple, datefmt='%Y-%m-%dT%H:%M:%S') + handler = logging.StreamHandler() + handler.setFormatter(log_formatter_simple) + logger = logging.getLogger('osmclient') + logger.setLevel(level=logging.WARNING) + logger.addHandler(handler) + verbose = kwargs.get('verbose',0) + if verbose>0: + log_formatter = logging.Formatter(log_format_complete, datefmt='%Y-%m-%dT%H:%M:%S') + #handler = logging.StreamHandler() + handler.setFormatter(log_formatter) + #logger.addHandler(handler) + if verbose==1: + logger.setLevel(level=logging.INFO) + elif verbose==2: + logger.setLevel(level=logging.VERBOSE) + elif verbose>2: + logger.setLevel(level=logging.DEBUG) if not sol005: if version == 1: return client.Client(host, *args, **kwargs) diff --git a/osmclient/common/http.py b/osmclient/common/http.py index 17f82e3..b67b594 100644 --- a/osmclient/common/http.py +++ b/osmclient/common/http.py @@ -50,9 +50,13 @@ class Http(object): curl_cmd = self._get_curl_cmd(endpoint) curl_cmd.setopt(pycurl.HTTPGET, 1) curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write) + self._logger.info("Request METHOD: {} URL: {}".format("GET",self._url + endpoint)) curl_cmd.perform() + http_code = curl_cmd.getinfo(pycurl.HTTP_CODE) + self._logger.info("Response HTTPCODE: {}".format(http_code)) curl_cmd.close() if data.getvalue(): + self._logger.debug("Response DATA: {}".format(json.loads(data.getvalue().decode()))) return json.loads(data.getvalue().decode()) return None @@ -61,9 +65,13 @@ class Http(object): curl_cmd = self._get_curl_cmd(endpoint) curl_cmd.setopt(pycurl.CUSTOMREQUEST, "DELETE") curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write) + self._logger.info("Request METHOD: {} URL: {}".format("DELETE",self._url + endpoint)) curl_cmd.perform() + http_code = curl_cmd.getinfo(pycurl.HTTP_CODE) + self._logger.info("Response HTTPCODE: {}".format(http_code)) curl_cmd.close() if data.getvalue(): + self._logger.debug("Response DATA: {}".format(json.loads(data.getvalue().decode()))) return json.loads(data.getvalue().decode()) return None @@ -84,8 +92,12 @@ class Http(object): (pycurl.FORM_FILE, formfile[1])))]) + self._logger.info("Request METHOD: {} URL: {}".format("POST",self._url + endpoint)) curl_cmd.perform() + http_code = curl_cmd.getinfo(pycurl.HTTP_CODE) + self._logger.info("Response HTTPCODE: {}".format(http_code)) curl_cmd.close() if data.getvalue(): + self._logger.debug("Response DATA: {}".format(json.loads(data.getvalue().decode()))) return json.loads(data.getvalue().decode()) return None diff --git a/osmclient/scripts/osm.py b/osmclient/scripts/osm.py index 4cc451b..ab90dd7 100755 --- a/osmclient/scripts/osm.py +++ b/osmclient/scripts/osm.py @@ -29,8 +29,13 @@ import pycurl import os import textwrap import pkg_resources +import logging +# Global variables + +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'], max_content_width=160) + def wrap_text(text, width): wrapper = textwrap.TextWrapper(width=width) lines = text.splitlines() @@ -53,6 +58,7 @@ def check_client_version(obj, what, version='sol005'): :return: - :raises ClientError: if the specified version does not match the client version """ + logger.debug("") fullclassname = obj.__module__ + "." + obj.__class__.__name__ message = 'The following commands or options are only supported with the option "--sol005": {}'.format(what) if version == 'v1': @@ -62,9 +68,7 @@ def check_client_version(obj, what, version='sol005'): return -CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'], max_content_width=160) - -@click.group(context_settings=CONTEXT_SETTINGS) +@click.group(context_settings=dict(help_option_names=['-h', '--help'], max_content_width=160)) @click.option('--hostname', default="127.0.0.1", envvar='OSM_HOSTNAME', @@ -90,6 +94,8 @@ CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'], max_content_width=16 envvar='OSM_PROJECT', help='project (defaults to admin). ' + 'Also can set OSM_PROJECT in environment') +@click.option('-v', '--verbose', count=True, + help='increase verbosity (-v INFO, -vv VERBOSE, -vvv DEBUG)') #@click.option('--so-port', # default=None, # envvar='OSM_SO_PORT', @@ -111,13 +117,14 @@ CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'], max_content_width=16 # help='hostname of RO server. ' + # 'Also can set OSM_RO_PORT in environment') @click.pass_context -def cli_osm(ctx, hostname, user, password, project): +def cli_osm(ctx, hostname, user, password, project, verbose): + global logger if hostname is None: print(( "either hostname option or OSM_HOSTNAME " + "environment variable needs to be specified")) exit(1) - kwargs={} + kwargs = {'verbose': verbose} # if so_port is not None: # kwargs['so_port']=so_port # if so_project is not None: @@ -134,6 +141,7 @@ def cli_osm(ctx, hostname, user, password, project): if project is not None: kwargs['project']=project ctx.obj = client.Client(host=hostname, sol005=sol005, **kwargs) + logger = logging.getLogger('osmclient') #################### @@ -192,6 +200,7 @@ def ns_list(ctx, filter): --filter nsd.vendor=&nsd-ref= --filter nsd.constituent-vnfd.vnfd-id-ref= """ + logger.debug("") if filter: check_client_version(ctx.obj, '--filter') resp = ctx.obj.ns.list(filter) @@ -232,6 +241,7 @@ def ns_list(ctx, filter): def nsd_list(ctx, filter): + logger.debug("") if filter: check_client_version(ctx.obj, '--filter') resp = ctx.obj.nsd.list(filter) @@ -257,6 +267,7 @@ def nsd_list(ctx, filter): @click.pass_context def nsd_list1(ctx, filter): """list all NSD/NS pkg in the system""" + logger.debug("") nsd_list(ctx, filter) @@ -266,10 +277,12 @@ def nsd_list1(ctx, filter): @click.pass_context def nsd_list2(ctx, filter): """list all NS packages""" + logger.debug("") nsd_list(ctx, filter) def vnfd_list(ctx, nf_type, filter): + logger.debug("") if nf_type: check_client_version(ctx.obj, '--nf_type') elif filter: @@ -312,6 +325,7 @@ def vnfd_list(ctx, nf_type, filter): @click.pass_context def vnfd_list1(ctx, nf_type, filter): """list all xNF packages (VNF, HNF, PNF)""" + logger.debug("") vnfd_list(ctx, nf_type, filter) @@ -322,6 +336,7 @@ def vnfd_list1(ctx, nf_type, filter): @click.pass_context def vnfd_list2(ctx, nf_type, filter): """list all xNF packages (VNF, HNF, PNF)""" + logger.debug("") vnfd_list(ctx, nf_type, filter) @@ -332,6 +347,7 @@ def vnfd_list2(ctx, nf_type, filter): @click.pass_context def nfpkg_list(ctx, nf_type, filter): """list all xNF packages (VNF, HNF, PNF)""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) vnfd_list(ctx, nf_type, filter) @@ -399,6 +415,7 @@ def vnf_list(ctx, ns, filter): @click.pass_context def vnf_list1(ctx, ns, filter): """list all NF instances""" + logger.debug("") vnf_list(ctx, ns, filter) @@ -455,6 +472,7 @@ def nf_list(ctx, ns, filter): --filter vdur.ip-address= --filter vnfd-ref=,vdur.ip-address= """ + logger.debug("") vnf_list(ctx, ns, filter) @@ -466,6 +484,7 @@ def ns_op_list(ctx, name): NAME: name or ID of the NS instance """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.ns.list_op(name) @@ -487,6 +506,7 @@ def ns_op_list(ctx, name): def nsi_list(ctx, filter): """list all Network Slice Instances""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.nsi.list(filter) @@ -523,6 +543,7 @@ def nsi_list(ctx, filter): @click.pass_context def nsi_list1(ctx, filter): """list all Network Slice Instances (NSI)""" + logger.debug("") nsi_list(ctx, filter) @@ -532,10 +553,12 @@ def nsi_list1(ctx, filter): @click.pass_context def nsi_list2(ctx, filter): """list all Network Slice Instances (NSI)""" + logger.debug("") nsi_list(ctx, filter) def nst_list(ctx, filter): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.nst.list(filter) @@ -557,6 +580,7 @@ def nst_list(ctx, filter): @click.pass_context def nst_list1(ctx, filter): """list all Network Slice Templates (NST) in the system""" + logger.debug("") nst_list(ctx, filter) @@ -566,10 +590,12 @@ def nst_list1(ctx, filter): @click.pass_context def nst_list2(ctx, filter): """list all Network Slice Templates (NST) in the system""" + logger.debug("") nst_list(ctx, filter) def nsi_op_list(ctx, name): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.nsi.list_op(name) @@ -592,6 +618,7 @@ def nsi_op_list1(ctx, name): NAME: name or ID of the Network Slice Instance """ + logger.debug("") nsi_op_list(ctx, name) @@ -603,6 +630,7 @@ def nsi_op_list2(ctx, name): NAME: name or ID of the Network Slice Instance """ + logger.debug("") nsi_op_list(ctx, name) @@ -612,6 +640,7 @@ def nsi_op_list2(ctx, name): @click.pass_context def pdu_list(ctx, filter): """list all Physical Deployment Units (PDU)""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.pdu.list(filter) @@ -646,6 +675,7 @@ def pdu_list(ctx, filter): #################### def nsd_show(ctx, name, literal): + logger.debug("") # try: resp = ctx.obj.nsd.get(name) # resp = ctx.obj.nsd.get_individual(name) @@ -674,6 +704,7 @@ def nsd_show1(ctx, name, literal): NAME: name or ID of the NSD/NSpkg """ + logger.debug("") nsd_show(ctx, name, literal) @@ -687,10 +718,12 @@ def nsd_show2(ctx, name, literal): NAME: name or ID of the NSD/NSpkg """ + logger.debug("") nsd_show(ctx, name, literal) def vnfd_show(ctx, name, literal): + logger.debug("") # try: resp = ctx.obj.vnfd.get(name) # resp = ctx.obj.vnfd.get_individual(name) @@ -719,6 +752,7 @@ def vnfd_show1(ctx, name, literal): NAME: name or ID of the VNFD/VNFpkg """ + logger.debug("") vnfd_show(ctx, name, literal) @@ -732,6 +766,7 @@ def vnfd_show2(ctx, name, literal): NAME: name or ID of the VNFD/VNFpkg """ + logger.debug("") vnfd_show(ctx, name, literal) @@ -745,6 +780,7 @@ def nfpkg_show(ctx, name, literal): NAME: name or ID of the NFpkg """ + logger.debug("") vnfd_show(ctx, name, literal) @@ -759,6 +795,7 @@ def ns_show(ctx, name, literal, filter): NAME: name or ID of the NS instance """ + logger.debug("") # try: ns = ctx.obj.ns.get(name) # except ClientException as e: @@ -798,6 +835,7 @@ def vnf_show(ctx, name, literal, filter, kdu): NAME: name or ID of the VNF instance """ + logger.debug("") if kdu: if literal: raise ClientException('"--literal" option is incompatible with "--kdu" option') @@ -899,6 +937,7 @@ def ns_op_show(ctx, id, filter, literal): ID: operation identifier """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) op_info = ctx.obj.ns.get_op(id) @@ -919,6 +958,7 @@ def ns_op_show(ctx, id, filter, literal): def nst_show(ctx, name, literal): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.nst.get(name) @@ -948,6 +988,7 @@ def nst_show1(ctx, name, literal): NAME: name or ID of the NST """ + logger.debug("") nst_show(ctx, name, literal) @@ -961,10 +1002,12 @@ def nst_show2(ctx, name, literal): NAME: name or ID of the NST """ + logger.debug("") nst_show(ctx, name, literal) def nsi_show(ctx, name, literal, filter): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) nsi = ctx.obj.nsi.get(name) @@ -997,6 +1040,7 @@ def nsi_show1(ctx, name, literal, filter): NAME: name or ID of the Network Slice Instance """ + logger.debug("") nsi_show(ctx, name, literal, filter) @@ -1011,10 +1055,12 @@ def nsi_show2(ctx, name, literal, filter): NAME: name or ID of the Network Slice Instance """ + logger.debug("") nsi_show(ctx, name, literal, filter) def nsi_op_show(ctx, id, filter): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) op_info = ctx.obj.nsi.get_op(id) @@ -1039,6 +1085,7 @@ def nsi_op_show1(ctx, id, filter): ID: operation identifier """ + logger.debug("") nsi_op_show(ctx, id, filter) @@ -1051,6 +1098,7 @@ def nsi_op_show2(ctx, id, filter): ID: operation identifier """ + logger.debug("") nsi_op_show(ctx, id, filter) @@ -1065,6 +1113,7 @@ def pdu_show(ctx, name, literal, filter): NAME: name or ID of the PDU """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) pdu = ctx.obj.pdu.get(name) @@ -1091,6 +1140,7 @@ def pdu_show(ctx, name, literal, filter): #################### def nsd_create(ctx, filename, overwrite): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.nsd.create(filename, overwrite) @@ -1112,6 +1162,7 @@ def nsd_create1(ctx, filename, overwrite): FILENAME: NSD yaml file or NSpkg tar.gz file """ + logger.debug("") nsd_create(ctx, filename, overwrite) @@ -1128,10 +1179,12 @@ def nsd_create2(ctx, filename, overwrite): FILENAME: NSD yaml file or NSpkg tar.gz file """ + logger.debug("") nsd_create(ctx, filename, overwrite) def vnfd_create(ctx, filename, overwrite): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.vnfd.create(filename, overwrite) @@ -1153,6 +1206,7 @@ def vnfd_create1(ctx, filename, overwrite): FILENAME: VNFD yaml file or VNFpkg tar.gz file """ + logger.debug("") vnfd_create(ctx, filename, overwrite) @@ -1169,6 +1223,7 @@ def vnfd_create2(ctx, filename, overwrite): FILENAME: VNFD yaml file or VNFpkg tar.gz file """ + logger.debug("") vnfd_create(ctx, filename, overwrite) @@ -1185,6 +1240,7 @@ def nfpkg_create(ctx, filename, overwrite): FILENAME: NF Descriptor yaml file or NFpkg tar.gz file """ + logger.debug("") vnfd_create(ctx, filename, overwrite) @@ -1224,6 +1280,7 @@ def ns_create(ctx, config_file, wait): """creates a new NS instance""" + logger.debug("") # try: if config_file: check_client_version(ctx.obj, '--config_file') @@ -1244,6 +1301,7 @@ def ns_create(ctx, def nst_create(ctx, filename, overwrite): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.nst.create(filename, overwrite) @@ -1265,6 +1323,7 @@ def nst_create1(ctx, filename, overwrite): FILENAME: NST yaml file or NSTpkg tar.gz file """ + logger.debug("") nst_create(ctx, filename, overwrite) @@ -1281,11 +1340,13 @@ def nst_create2(ctx, filename, overwrite): FILENAME: NST yaml file or NSTpkg tar.gz file """ + logger.debug("") nst_create(ctx, filename, overwrite) def nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait): """creates a new Network Slice Instance (NSI)""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) if config_file: @@ -1329,6 +1390,7 @@ def nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_fi @click.pass_context def nsi_create1(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait): """creates a new Network Slice Instance (NSI)""" + logger.debug("") nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait=wait) @@ -1359,6 +1421,7 @@ def nsi_create1(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_f @click.pass_context def nsi_create2(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait): """creates a new Network Slice Instance (NSI)""" + logger.debug("") nsi_create(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_file, wait=wait) @@ -1376,6 +1439,7 @@ def nsi_create2(ctx, nst_name, nsi_name, vim_account, ssh_keys, config, config_f @click.pass_context def pdu_create(ctx, name, pdu_type, interface, description, vim_account, descriptor_file): """creates a new Physical Deployment Unit (PDU)""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) pdu = {} @@ -1407,11 +1471,13 @@ def pdu_create(ctx, name, pdu_type, interface, description, vim_account, descrip # print(str(e)) # exit(1) + #################### # UPDATE operations #################### def nsd_update(ctx, name, content): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.nsd.update(name, content) @@ -1430,6 +1496,7 @@ def nsd_update1(ctx, name, content): NAME: name or ID of the NSD/NSpkg """ + logger.debug("") nsd_update(ctx, name, content) @@ -1443,10 +1510,12 @@ def nsd_update2(ctx, name, content): NAME: name or ID of the NSD/NSpkg """ + logger.debug("") nsd_update(ctx, name, content) def vnfd_update(ctx, name, content): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.vnfd.update(name, content) @@ -1465,6 +1534,7 @@ def vnfd_update1(ctx, name, content): NAME: name or ID of the VNFD/VNFpkg """ + logger.debug("") vnfd_update(ctx, name, content) @@ -1478,6 +1548,7 @@ def vnfd_update2(ctx, name, content): NAME: VNFD yaml file or VNFpkg tar.gz file """ + logger.debug("") vnfd_update(ctx, name, content) @@ -1491,10 +1562,12 @@ def nfpkg_update(ctx, name, content): NAME: NF Descriptor yaml file or NFpkg tar.gz file """ + logger.debug("") vnfd_update(ctx, name, content) def nst_update(ctx, name, content): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.nst.update(name, content) @@ -1513,6 +1586,7 @@ def nst_update1(ctx, name, content): NAME: name or ID of the NSD/NSpkg """ + logger.debug("") nst_update(ctx, name, content) @@ -1526,6 +1600,7 @@ def nst_update2(ctx, name, content): NAME: name or ID of the NSD/NSpkg """ + logger.debug("") nst_update(ctx, name, content) @@ -1534,6 +1609,7 @@ def nst_update2(ctx, name, content): #################### def nsd_delete(ctx, name, force): + logger.debug("") # try: if not force: ctx.obj.nsd.delete(name) @@ -1554,6 +1630,7 @@ def nsd_delete1(ctx, name, force): NAME: name or ID of the NSD/NSpkg to be deleted """ + logger.debug("") nsd_delete(ctx, name, force) @@ -1566,10 +1643,12 @@ def nsd_delete2(ctx, name, force): NAME: name or ID of the NSD/NSpkg to be deleted """ + logger.debug("") nsd_delete(ctx, name, force) def vnfd_delete(ctx, name, force): + logger.debug("") # try: if not force: ctx.obj.vnfd.delete(name) @@ -1590,6 +1669,7 @@ def vnfd_delete1(ctx, name, force): NAME: name or ID of the VNFD/VNFpkg to be deleted """ + logger.debug("") vnfd_delete(ctx, name, force) @@ -1602,6 +1682,7 @@ def vnfd_delete2(ctx, name, force): NAME: name or ID of the VNFD/VNFpkg to be deleted """ + logger.debug("") vnfd_delete(ctx, name, force) @@ -1614,6 +1695,7 @@ def nfpkg_delete(ctx, name, force): NAME: name or ID of the NFpkg to be deleted """ + logger.debug("") vnfd_delete(ctx, name, force) @@ -1632,6 +1714,7 @@ def ns_delete(ctx, name, force, wait): NAME: name or ID of the NS instance to be deleted """ + logger.debug("") # try: if not force: ctx.obj.ns.delete(name, wait=wait) @@ -1644,6 +1727,7 @@ def ns_delete(ctx, name, force, wait): def nst_delete(ctx, name, force): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.nst.delete(name, force) @@ -1661,6 +1745,7 @@ def nst_delete1(ctx, name, force): NAME: name or ID of the NST/NSTpkg to be deleted """ + logger.debug("") nst_delete(ctx, name, force) @@ -1673,10 +1758,12 @@ def nst_delete2(ctx, name, force): NAME: name or ID of the NST/NSTpkg to be deleted """ + logger.debug("") nst_delete(ctx, name, force) def nsi_delete(ctx, name, force, wait): + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.nsi.delete(name, force, wait=wait) @@ -1700,6 +1787,7 @@ def nsi_delete1(ctx, name, force, wait): NAME: name or ID of the Network Slice instance to be deleted """ + logger.debug("") nsi_delete(ctx, name, force, wait=wait) @@ -1712,6 +1800,7 @@ def nsi_delete2(ctx, name, force, wait): NAME: name or ID of the Network Slice instance to be deleted """ + logger.debug("") nsi_delete(ctx, name, force, wait=wait) @@ -1724,6 +1813,7 @@ def pdu_delete(ctx, name, force): NAME: name or ID of the PDU to be deleted """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.pdu.delete(name, force) @@ -1785,6 +1875,7 @@ def vim_create(ctx, sdn_port_mapping, wait): """creates a new VIM account""" + logger.debug("") # try: if sdn_controller: check_client_version(ctx.obj, '--sdn_controller') @@ -1843,6 +1934,7 @@ def vim_update(ctx, NAME: name or ID of the VIM account """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) vim = {} @@ -1875,6 +1967,7 @@ def vim_delete(ctx, name, force, wait): NAME: name or ID of the VIM account to be deleted """ + logger.debug("") # try: if not force: ctx.obj.vim.delete(name, wait=wait) @@ -1895,6 +1988,7 @@ def vim_delete(ctx, name, force, wait): @click.pass_context def vim_list(ctx, filter): """list all VIM accounts""" + logger.debug("") if filter: check_client_version(ctx.obj, '--filter') # if ro_update: @@ -1919,6 +2013,7 @@ def vim_show(ctx, name): NAME: name or ID of the VIM account """ + logger.debug("") # try: resp = ctx.obj.vim.get(name) if 'vim_password' in resp: @@ -1981,6 +2076,7 @@ def wim_create(ctx, wim_port_mapping, wait): """creates a new WIM account""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) # if sdn_controller: @@ -2034,6 +2130,7 @@ def wim_update(ctx, NAME: name or ID of the WIM account """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) wim = {} @@ -2065,6 +2162,7 @@ def wim_delete(ctx, name, force, wait): NAME: name or ID of the WIM account to be deleted """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.wim.delete(name, force, wait=wait) @@ -2079,6 +2177,7 @@ def wim_delete(ctx, name, force, wait): @click.pass_context def wim_list(ctx, filter): """list all WIM accounts""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.wim.list(filter) @@ -2100,6 +2199,7 @@ def wim_show(ctx, name): NAME: name or ID of the WIM account """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.wim.get(name) @@ -2154,6 +2254,7 @@ def wim_show(ctx, name): @click.pass_context def sdnc_create(ctx, **kwargs): """creates a new SDN controller""" + logger.debug("") sdncontroller = {x: kwargs[x] for x in kwargs if kwargs[x] and x not in ("wait", "ip_address", "port", "switch_dpid")} if kwargs.get("port"): @@ -2197,6 +2298,7 @@ def sdnc_update(ctx, **kwargs): NAME: name or ID of the SDN controller """ + logger.debug("") sdncontroller = {x: kwargs[x] for x in kwargs if kwargs[x] and x not in ("wait", "ip_address", "port", "switch_dpid", "new_name")} if kwargs.get("newname"): @@ -2233,6 +2335,7 @@ def sdnc_delete(ctx, name, force, wait): NAME: name or ID of the SDN controller to be deleted """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.sdnc.delete(name, force, wait=wait) @@ -2247,6 +2350,7 @@ def sdnc_delete(ctx, name, force, wait): @click.pass_context def sdnc_list(ctx, filter): """list all SDN controllers""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.sdnc.list(filter) @@ -2268,6 +2372,7 @@ def sdnc_show(ctx, name): NAME: name or ID of the SDN controller """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.sdnc.get(name) @@ -2624,6 +2729,7 @@ def project_create(ctx, name): NAME: name of the project """ + logger.debug("") project = {} project['name'] = name # try: @@ -2643,6 +2749,7 @@ def project_delete(ctx, name): NAME: name or ID of the project to be deleted """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.project.delete(name) @@ -2657,6 +2764,7 @@ def project_delete(ctx, name): @click.pass_context def project_list(ctx, filter): """list all projects""" + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.project.list(filter) @@ -2678,6 +2786,7 @@ def project_show(ctx, name): NAME: name or ID of the project """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.project.get(name) @@ -2708,7 +2817,7 @@ def project_update(ctx, project, name): :param name: new name for the project :return: """ - + logger.debug("") project_changes = {} project_changes['name'] = name @@ -2748,6 +2857,7 @@ def user_create(ctx, username, password, projects, project_role_mappings): PROJECTS: projects assigned to user (internal only) PROJECT_ROLE_MAPPING: roles in projects assigned to user (keystone) """ + logger.debug("") user = {} user['username'] = username user['password'] = password @@ -2798,6 +2908,7 @@ def user_update(ctx, username, password, set_username, set_project, remove_proje ADD_PROJECT_ROLE: adding mappings for project/role(s) REMOVE_PROJECT_ROLE: removing mappings for project/role(s) """ + logger.debug("") user = {} user['password'] = password user['username'] = set_username @@ -2824,6 +2935,7 @@ def user_delete(ctx, name): \b NAME: name or ID of the user to be deleted """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.user.delete(name) @@ -2859,6 +2971,7 @@ def user_show(ctx, name): NAME: name or ID of the user """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.user.get(name) @@ -2902,6 +3015,7 @@ def ns_alarm_create(ctx, name, ns, vnf, vdu, metric, severity, """creates a new alarm for a NS instance""" # TODO: Check how to validate threshold_value. # Should it be an integer (1-100), percentage, or decimal (0.01-1.00)? + logger.debug("") # try: ns_instance = ctx.obj.ns.get(ns) alarm = {} @@ -2958,6 +3072,7 @@ def ns_metric_export(ctx, ns, vnf, vdu, metric, interval): """exports a metric to the internal OSM bus, which can be read by other apps""" # TODO: Check how to validate interval. # Should it be an integer (seconds), or should a suffix (s,m,h,d,w) also be permitted? + logger.debug("") # try: ns_instance = ctx.obj.ns.get(ns) metric_data = {} @@ -3005,6 +3120,7 @@ def upload_package(ctx, filename): FILENAME: VNF or NS package file (tar.gz) """ + logger.debug("") # try: ctx.obj.package.upload(filename) fullclassname = ctx.obj.__module__ + "." + ctx.obj.__class__.__name__ @@ -3194,6 +3310,7 @@ def ns_action(ctx, NS_NAME: name or ID of the NS instance """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) op_data = {} @@ -3240,6 +3357,7 @@ def vnf_scale(ctx, NS_NAME: name or ID of the NS instance. VNF_NAME: member-vnf-index in the NS to be scaled. """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) if not scale_in and not scale_out: @@ -3268,6 +3386,7 @@ def role_create(ctx, name, permissions): NAME: Name or ID of the role. DEFINITION: Definition of grant/denial of access to resources. """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.role.create(name, permissions) @@ -3301,6 +3420,7 @@ def role_update(ctx, name, set_name, add, remove): ADD: Grant/denial of access to resource to add. REMOVE: Grant/denial of access to resource to remove. """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.role.update(name, set_name, None, add, remove) @@ -3320,6 +3440,7 @@ def role_delete(ctx, name): \b NAME: Name or ID of the role. """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) ctx.obj.role.delete(name) @@ -3336,6 +3457,7 @@ def role_list(ctx, filter): """ List all roles. """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.role.list(filter) @@ -3359,6 +3481,7 @@ def role_show(ctx, name): \b NAME: Name or ID of the role. """ + logger.debug("") # try: check_client_version(ctx.obj, ctx.command.name) resp = ctx.obj.role.get(name) @@ -3534,3 +3657,4 @@ def cli(): if __name__ == '__main__': cli() + diff --git a/osmclient/sol005/client.py b/osmclient/sol005/client.py index 2de6a4c..bf6f845 100644 --- a/osmclient/sol005/client.py +++ b/osmclient/sol005/client.py @@ -39,6 +39,7 @@ from osmclient.sol005 import repo from osmclient.common.exceptions import ClientException from osmclient.common import package_tool import json +import logging class Client(object): @@ -55,6 +56,7 @@ class Client(object): self._user = user self._password = password self._project = project + self._logger = logging.getLogger('osmclient') self._auth_endpoint = '/admin/v1/tokens' self._headers = {} self._token = None @@ -98,6 +100,7 @@ class Client(object): ''' def get_token(self): + self._logger.debug("") if self._token is None: postfields_dict = {'username': self._user, 'password': self._password, diff --git a/osmclient/sol005/http.py b/osmclient/sol005/http.py index f19a098..aca8a4b 100644 --- a/osmclient/sol005/http.py +++ b/osmclient/sol005/http.py @@ -17,8 +17,11 @@ from io import BytesIO import pycurl import json +import logging +import copy from osmclient.common import http + class Http(http.Http): def __init__(self, url, user='admin', password='admin'): @@ -26,10 +29,13 @@ class Http(http.Http): self._user = user self._password = password self._http_header = None + self._logger = logging.getLogger('osmclient') def _get_curl_cmd(self, endpoint): + self._logger.debug("") curl_cmd = pycurl.Curl() - #print(self._url + endpoint) + if self._logger.getEffectiveLevel() == logging.DEBUG: + curl_cmd.setopt(pycurl.VERBOSE, True) curl_cmd.setopt(pycurl.URL, self._url + endpoint) curl_cmd.setopt(pycurl.SSL_VERIFYPEER, 0) curl_cmd.setopt(pycurl.SSL_VERIFYHOST, 0) @@ -38,16 +44,19 @@ class Http(http.Http): return curl_cmd def delete_cmd(self, endpoint): + self._logger.debug("") data = BytesIO() curl_cmd = self._get_curl_cmd(endpoint) curl_cmd.setopt(pycurl.CUSTOMREQUEST, "DELETE") curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write) + self._logger.info("Request METHOD: {} URL: {}".format("DELETE",self._url + endpoint)) curl_cmd.perform() http_code = curl_cmd.getinfo(pycurl.HTTP_CODE) - #print('HTTP_CODE: {}'.format(http_code)) + self._logger.info("Response HTTPCODE: {}".format(http_code)) curl_cmd.close() # TODO 202 accepted should be returned somehow if data.getvalue(): + self._logger.verbose("Response DATA: {}".format(json.loads(data.getvalue().decode()))) return http_code, data.getvalue().decode() else: return http_code, None @@ -55,6 +64,7 @@ class Http(http.Http): def send_cmd(self, endpoint='', postfields_dict=None, formfile=None, filename=None, put_method=False, patch_method=False): + self._logger.debug("") data = BytesIO() curl_cmd = self._get_curl_cmd(endpoint) if put_method: @@ -66,6 +76,13 @@ class Http(http.Http): if postfields_dict is not None: jsondata = json.dumps(postfields_dict) + if 'password' in postfields_dict: + postfields_dict_copy = copy.deepcopy(postfields_dict) + postfields_dict_copy['password']='******' + jsondata_log = json.dumps(postfields_dict_copy) + else: + jsondata_log = jsondata + self._logger.verbose("Request POSTFIELDS: {}".format(jsondata_log)) curl_cmd.setopt(pycurl.POSTFIELDS, jsondata) elif formfile is not None: curl_cmd.setopt( @@ -76,18 +93,28 @@ class Http(http.Http): elif filename is not None: with open(filename, 'rb') as stream: postdata=stream.read() + self._logger.verbose("Request POSTFIELDS: Binary content") curl_cmd.setopt(pycurl.POSTFIELDS, postdata) + if put_method: + self._logger.info("Request METHOD: {} URL: {}".format("PUT",self._url + endpoint)) + elif patch_method: + self._logger.info("Request METHOD: {} URL: {}".format("PATCH",self._url + endpoint)) + else: + self._logger.info("Request METHOD: {} URL: {}".format("POST",self._url + endpoint)) curl_cmd.perform() http_code = curl_cmd.getinfo(pycurl.HTTP_CODE) + self._logger.info("Response HTTPCODE: {}".format(http_code)) curl_cmd.close() if data.getvalue(): + self._logger.verbose("Response DATA: {}".format(json.loads(data.getvalue().decode()))) return http_code, data.getvalue().decode() else: return http_code, None def post_cmd(self, endpoint='', postfields_dict=None, formfile=None, filename=None): + self._logger.debug("") return self.send_cmd(endpoint=endpoint, postfields_dict=postfields_dict, formfile=formfile, @@ -96,6 +123,7 @@ class Http(http.Http): def put_cmd(self, endpoint='', postfields_dict=None, formfile=None, filename=None): + self._logger.debug("") return self.send_cmd(endpoint=endpoint, postfields_dict=postfields_dict, formfile=formfile, @@ -104,6 +132,7 @@ class Http(http.Http): def patch_cmd(self, endpoint='', postfields_dict=None, formfile=None, filename=None): + self._logger.debug("") return self.send_cmd(endpoint=endpoint, postfields_dict=postfields_dict, formfile=formfile, @@ -111,14 +140,18 @@ class Http(http.Http): put_method=False, patch_method=True) def get2_cmd(self, endpoint): + self._logger.debug("") data = BytesIO() curl_cmd = self._get_curl_cmd(endpoint) curl_cmd.setopt(pycurl.HTTPGET, 1) curl_cmd.setopt(pycurl.WRITEFUNCTION, data.write) + self._logger.info("Request METHOD: {} URL: {}".format("GET",self._url + endpoint)) curl_cmd.perform() http_code = curl_cmd.getinfo(pycurl.HTTP_CODE) + self._logger.info("Response HTTPCODE: {}".format(http_code)) curl_cmd.close() if data.getvalue(): + self._logger.debug("Response DATA: {}".format(json.loads(data.getvalue().decode()))) return http_code, data.getvalue().decode() return http_code, None diff --git a/osmclient/sol005/ns.py b/osmclient/sol005/ns.py index e9858f4..381ad42 100644 --- a/osmclient/sol005/ns.py +++ b/osmclient/sol005/ns.py @@ -24,6 +24,7 @@ from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import yaml import json +import logging class Ns(object): @@ -31,6 +32,7 @@ class Ns(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/nslcm' self._apiVersion = '/v1' self._apiResource = '/ns_instances_content' @@ -39,6 +41,7 @@ class Ns(object): # NS '--wait' option def _wait(self, id, deleteFlag=False): + self._logger.debug("") # Endpoint to get operation status apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/ns_lcm_op_occs') # Wait for status for NS instance creation/update/deletion @@ -53,6 +56,7 @@ class Ns(object): def list(self, filter=None): """Returns a list of NS """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -65,6 +69,7 @@ class Ns(object): def get(self, name): """Returns an NS based on name or id """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for ns in self.list(): @@ -77,6 +82,7 @@ class Ns(object): raise NotFound("ns {} not found".format(name)) def get_individual(self, name): + self._logger.debug("") self._client.get_token() ns_id = name if not utils.validate_uuid4(name): @@ -92,6 +98,7 @@ class Ns(object): raise NotFound("ns {} not found".format(name)) def delete(self, name, force=False, wait=False): + self._logger.debug("") ns = self.get(name) querystring = '' if force: @@ -121,6 +128,7 @@ class Ns(object): def create(self, nsd_name, nsr_name, account, config=None, ssh_keys=None, description='default description', admin_status='ENABLED', wait=False): + self._logger.debug("") self._client.get_token() nsd = self._client.nsd.get(nsd_name) @@ -128,6 +136,7 @@ class Ns(object): wim_account_id = {} def get_vim_account_id(vim_account): + self._logger.debug("") if vim_account_id.get(vim_account): return vim_account_id[vim_account] @@ -138,6 +147,7 @@ class Ns(object): return vim['_id'] def get_wim_account_id(wim_account): + self._logger.debug("") if not isinstance(wim_account, str): return wim_account if wim_account_id.get(wim_account): @@ -245,6 +255,7 @@ class Ns(object): def list_op(self, name, filter=None): """Returns the list of operations of a NS """ + self._logger.debug("") ns = self.get(name) try: self._apiResource = '/ns_lcm_op_occs' @@ -282,6 +293,7 @@ class Ns(object): def get_op(self, operationId): """Returns the status of an operation """ + self._logger.debug("") self._client.get_token() try: self._apiResource = '/ns_lcm_op_occs' @@ -314,6 +326,8 @@ class Ns(object): def exec_op(self, name, op_name, op_data=None, wait=False, ): """Executes an operation on a NS """ + self._logger.debug("") + ns = self.get(name) try: ns = self.get(name) self._apiResource = '/ns_instances' @@ -353,6 +367,7 @@ class Ns(object): def scale_vnf(self, ns_name, vnf_name, scaling_group, scale_in, scale_out, wait=False): """Scales a VNF by adding/removing VDUs """ + self._logger.debug("") self._client.get_token() try: op_data={} @@ -374,6 +389,7 @@ class Ns(object): raise ClientException(message) def create_alarm(self, alarm): + self._logger.debug("") self._client.get_token() data = {} data["create_alarm_request"] = {} @@ -402,6 +418,7 @@ class Ns(object): raise ClientException(message) def delete_alarm(self, name): + self._logger.debug("") self._client.get_token() data = {} data["delete_alarm_request"] = {} @@ -431,6 +448,7 @@ class Ns(object): raise ClientException(message) def export_metric(self, metric): + self._logger.debug("") self._client.get_token() data = {} data["read_metric_data_request"] = metric @@ -458,6 +476,7 @@ class Ns(object): raise ClientException(message) def get_field(self, ns_name, field): + self._logger.debug("") nsr = self.get(ns_name) print(yaml.safe_dump(nsr)) if nsr is None: @@ -467,3 +486,4 @@ class Ns(object): return nsr[field] raise NotFound("failed to find {} in ns {}".format(field, ns_name)) + diff --git a/osmclient/sol005/nsd.py b/osmclient/sol005/nsd.py index 9adc8f7..bf91ca6 100644 --- a/osmclient/sol005/nsd.py +++ b/osmclient/sol005/nsd.py @@ -24,6 +24,7 @@ from osmclient.common import utils import json import magic from os.path import basename +import logging #from os import stat @@ -32,6 +33,7 @@ class Nsd(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/nsd' self._apiVersion = '/v1' self._apiResource = '/ns_descriptors' @@ -40,6 +42,7 @@ class Nsd(object): #self._apiBase='/nsds' def list(self, filter=None): + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -51,6 +54,7 @@ class Nsd(object): return list() def get(self, name): + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for nsd in self.list(): @@ -63,7 +67,8 @@ class Nsd(object): raise NotFound("nsd {} not found".format(name)) def get_individual(self, name): - # Called to get_token not required, because will be implicitly called by get. + self._logger.debug("") + # Call to get_token not required, because will be implicitly called by get. nsd = self.get(name) # It is redundant, since the previous one already gets the whole nsdinfo # The only difference is that a different primitive is exercised @@ -74,6 +79,8 @@ class Nsd(object): raise NotFound("nsd {} not found".format(name)) def get_thing(self, name, thing, filename): + self._logger.debug("") + # Call to get_token not required, because will be implicitly called by get. nsd = self.get(name) headers = self._client._headers headers['Accept'] = 'application/binary' @@ -94,15 +101,19 @@ class Nsd(object): raise ClientException("failed to get {} from {} - {}".format(thing, name, msg)) def get_descriptor(self, name, filename): + self._logger.debug("") self.get_thing(name, 'nsd', filename) def get_package(self, name, filename): + self._logger.debug("") self.get_thing(name, 'package_content', filename) def get_artifact(self, name, artifact, filename): + self._logger.debug("") self.get_thing(name, 'artifacts/{}'.format(artifact), filename) def delete(self, name, force=False): + self._logger.debug("") nsd = self.get(name) querystring = '' if force: @@ -125,6 +136,7 @@ class Nsd(object): raise ClientException("failed to delete nsd {} - {}".format(name, msg)) def create(self, filename, overwrite=None, update_endpoint=None): + self._logger.debug("") self._client.get_token() mime_type = magic.from_file(filename, mime=True) if mime_type is None: @@ -182,6 +194,7 @@ class Nsd(object): raise ClientException("failed to create/update nsd - {}".format(msg)) def update(self, name, filename): + self._logger.debug("") nsd = self.get(name) endpoint = '{}/{}/nsd_content'.format(self._apiBase, nsd['_id']) self.create(filename=filename, update_endpoint=endpoint) diff --git a/osmclient/sol005/nsi.py b/osmclient/sol005/nsi.py index 0fcfe1d..7995595 100644 --- a/osmclient/sol005/nsi.py +++ b/osmclient/sol005/nsi.py @@ -24,6 +24,7 @@ from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import yaml import json +import logging class Nsi(object): @@ -31,6 +32,7 @@ class Nsi(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/nsilcm' self._apiVersion = '/v1' self._apiResource = '/netslice_instances_content' @@ -39,6 +41,7 @@ class Nsi(object): # NSI '--wait' option def _wait(self, id, deleteFlag=False): + self._logger.debug("") self._client.get_token() # Endpoint to get operation status apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/nsi_lcm_op_occs') @@ -54,6 +57,7 @@ class Nsi(object): def list(self, filter=None): """Returns a list of NSI """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -66,6 +70,7 @@ class Nsi(object): def get(self, name): """Returns an NSI based on name or id """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for nsi in self.list(): @@ -78,6 +83,7 @@ class Nsi(object): raise NotFound("nsi {} not found".format(name)) def get_individual(self, name): + self._logger.debug("") nsi_id = name self._client.get_token() if not utils.validate_uuid4(name): @@ -93,6 +99,7 @@ class Nsi(object): raise NotFound("nsi {} not found".format(name)) def delete(self, name, force=False, wait=False): + self._logger.debug("") nsi = self.get(name) querystring = '' if force: @@ -124,12 +131,14 @@ class Nsi(object): ssh_keys=None, description='default description', admin_status='ENABLED', wait=False): + self._logger.debug("") self._client.get_token() nst = self._client.nst.get(nst_name) vim_account_id = {} def get_vim_account_id(vim_account): + self._logger.debug("") if vim_account_id.get(vim_account): return vim_account_id[vim_account] @@ -246,6 +255,7 @@ class Nsi(object): def list_op(self, name, filter=None): """Returns the list of operations of a NSI """ + self._logger.debug("") nsi = self.get(name) try: self._apiResource = '/nsi_lcm_op_occs' @@ -283,6 +293,7 @@ class Nsi(object): def get_op(self, operationId): """Returns the status of an operation """ + self._logger.debug("") self._client.get_token() try: self._apiResource = '/nsi_lcm_op_occs' @@ -315,6 +326,7 @@ class Nsi(object): def exec_op(self, name, op_name, op_data=None): """Executes an operation on a NSI """ + self._logger.debug("") nsi = self.get(name) try: self._apiResource = '/netslice_instances' diff --git a/osmclient/sol005/nst.py b/osmclient/sol005/nst.py index f0da0f5..e75c8f5 100644 --- a/osmclient/sol005/nst.py +++ b/osmclient/sol005/nst.py @@ -23,6 +23,7 @@ from osmclient.common.exceptions import ClientException from osmclient.common import utils import json import magic +import logging #from os import stat #from os.path import basename @@ -31,6 +32,7 @@ class Nst(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/nst' self._apiVersion = '/v1' self._apiResource = '/netslice_templates' @@ -38,6 +40,7 @@ class Nst(object): self._apiVersion, self._apiResource) def list(self, filter=None): + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -49,6 +52,7 @@ class Nst(object): return list() def get(self, name): + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for nst in self.list(): @@ -61,6 +65,7 @@ class Nst(object): raise NotFound("nst {} not found".format(name)) def get_individual(self, name): + self._logger.debug("") nst = self.get(name) # It is redundant, since the previous one already gets the whole nstinfo # The only difference is that a different primitive is exercised @@ -71,6 +76,7 @@ class Nst(object): raise NotFound("nst {} not found".format(name)) def get_thing(self, name, thing, filename): + self._logger.debug("") nst = self.get(name) headers = self._client._headers headers['Accept'] = 'application/binary' @@ -91,15 +97,19 @@ class Nst(object): raise ClientException("failed to get {} from {} - {}".format(thing, name, msg)) def get_descriptor(self, name, filename): + self._logger.debug("") self.get_thing(name, 'nst', filename) def get_package(self, name, filename): + self._logger.debug("") self.get_thing(name, 'nst_content', filename) def get_artifact(self, name, artifact, filename): + self._logger.debug("") self.get_thing(name, 'artifacts/{}'.format(artifact), filename) def delete(self, name, force=False): + self._logger.debug("") nst = self.get(name) querystring = '' if force: @@ -122,6 +132,7 @@ class Nst(object): raise ClientException("failed to delete nst {} - {}".format(name, msg)) def create(self, filename, overwrite=None, update_endpoint=None): + self._logger.debug("") self._client.get_token() mime_type = magic.from_file(filename, mime=True) if mime_type is None: @@ -176,6 +187,7 @@ class Nst(object): raise ClientException("failed to create/update nst - {}".format(msg)) def update(self, name, filename): + self._logger.debug("") nst = self.get(name) endpoint = '{}/{}/nst_content'.format(self._apiBase, nst['_id']) self.create(filename=filename, update_endpoint=endpoint) diff --git a/osmclient/sol005/package.py b/osmclient/sol005/package.py index c383862..a52ba15 100644 --- a/osmclient/sol005/package.py +++ b/osmclient/sol005/package.py @@ -24,17 +24,21 @@ from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound from osmclient.common import utils import json +import logging class Package(object): def __init__(self, http=None, client=None): self._client = client self._http = http + self._logger = logging.getLogger('osmclient') def get_key_val_from_pkg(self, descriptor_file): + self._logger.debug("") return utils.get_key_val_from_pkg(descriptor_file) def _wait_for_package(self, pkg_type): + self._logger.debug("") if 'vnfd' in pkg_type['type']: get_method = self._client.vnfd.get elif 'nsd' in pkg_type['type']: @@ -44,6 +48,7 @@ class Package(object): # helper method to check if pkg exists def check_exists(func): + self._logger.debug("") try: func() except NotFound: @@ -58,6 +63,7 @@ class Package(object): """wait(block) for an upload to succeed. The filename passed is assumed to be a descriptor tarball. """ + self._logger.debug("") self._client.get_token() pkg_type = utils.get_key_val_from_pkg(filename) @@ -69,6 +75,7 @@ class Package(object): .format(filename)) def upload(self, filename): + self._logger.debug("") self._client.get_token() pkg_type = utils.get_key_val_from_pkg(filename) if pkg_type is None: diff --git a/osmclient/sol005/pdud.py b/osmclient/sol005/pdud.py index 22ca8bc..42fe40d 100644 --- a/osmclient/sol005/pdud.py +++ b/osmclient/sol005/pdud.py @@ -22,6 +22,7 @@ from osmclient.common.exceptions import NotFound from osmclient.common.exceptions import ClientException from osmclient.common import utils import json +import logging class Pdu(object): @@ -29,6 +30,7 @@ class Pdu(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/pdu' self._apiVersion = '/v1' self._apiResource = '/pdu_descriptors' @@ -36,6 +38,7 @@ class Pdu(object): self._apiVersion, self._apiResource) def list(self, filter=None): + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -46,6 +49,7 @@ class Pdu(object): return list() def get(self, name): + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for pdud in self.list(): @@ -58,6 +62,7 @@ class Pdu(object): raise NotFound("pdud {} not found".format(name)) def get_individual(self, name): + self._logger.debug("") pdud = self.get(name) # It is redundant, since the previous one already gets the whole pdudInfo # The only difference is that a different primitive is exercised @@ -68,6 +73,7 @@ class Pdu(object): raise NotFound("pdu {} not found".format(name)) def delete(self, name, force=False): + self._logger.debug("") pdud = self.get(name) querystring = '' if force: @@ -90,6 +96,7 @@ class Pdu(object): raise ClientException("failed to delete pdu {} - {}".format(name, msg)) def create(self, pdu, update_endpoint=None): + self._logger.debug("") self._client.get_token() headers= self._client._headers headers['Content-Type'] = 'application/yaml' @@ -121,6 +128,7 @@ class Pdu(object): raise ClientException("failed to create/update pdu - {}".format(msg)) def update(self, name, filename): + self._logger.debug("") pdud = self.get(name) endpoint = '{}/{}'.format(self._apiBase, pdud['_id']) self.create(filename=filename, update_endpoint=endpoint) diff --git a/osmclient/sol005/project.py b/osmclient/sol005/project.py index 19a27c3..8f119e8 100644 --- a/osmclient/sol005/project.py +++ b/osmclient/sol005/project.py @@ -23,12 +23,14 @@ from osmclient.common import utils from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import json +import logging class Project(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/admin' self._apiVersion = '/v1' self._apiResource = '/projects' @@ -38,6 +40,7 @@ class Project(object): def create(self, name, project): """Creates a new OSM project """ + self._logger.debug("") self._client.get_token() http_code, resp = self._http.post_cmd(endpoint=self._apiBase, postfields_dict=project) @@ -62,6 +65,7 @@ class Project(object): def update(self, project, project_changes): """Updates an OSM project identified by name """ + self._logger.debug("") self._client.get_token() proj = self.get(project) http_code, resp = self._http.patch_cmd(endpoint='{}/{}'.format(self._apiBase, proj['_id']), @@ -89,6 +93,7 @@ class Project(object): def delete(self, name, force=False): """Deletes an OSM project identified by name """ + self._logger.debug("") self._client.get_token() project = self.get(name) querystring = '' @@ -116,6 +121,7 @@ class Project(object): def list(self, filter=None): """Returns the list of OSM projects """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -129,6 +135,7 @@ class Project(object): def get(self, name): """Returns a specific OSM project based on name or id """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for proj in self.list(): @@ -140,4 +147,3 @@ class Project(object): return proj raise NotFound("Project {} not found".format(name)) - diff --git a/osmclient/sol005/role.py b/osmclient/sol005/role.py index 01f3bc3..404784a 100644 --- a/osmclient/sol005/role.py +++ b/osmclient/sol005/role.py @@ -25,12 +25,14 @@ from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import json import yaml +import logging class Role(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/admin' self._apiVersion = '/v1' self._apiResource = '/roles' @@ -46,6 +48,7 @@ class Role(object): :raises ClientException: when receives an unexpected from the server. :raises ClientException: when fails creating a role. """ + self._logger.debug("") self._client.get_token() role = {"name": name} @@ -95,6 +98,7 @@ class Role(object): :raises ClientException: when receives an unexpected response from the server. :raises ClientException: when fails updating a role. """ + self._logger.debug("") self._client.get_token() if new_name is None and permissions is None and add is None and remove is None: raise ClientException('At least one option should be provided') @@ -173,6 +177,7 @@ class Role(object): :param force: :raises ClientException: when fails to delete a role. """ + self._logger.debug("") self._client.get_token() role = self.get(name) querystring = '' @@ -204,6 +209,7 @@ class Role(object): :param filter: :returns: """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -222,6 +228,7 @@ class Role(object): :raises NotFound: when the role is not found. :returns: the specified role. """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for role in self.list(): @@ -232,3 +239,4 @@ class Role(object): if name == role['name']: return role raise NotFound("Role {} not found".format(name)) + diff --git a/osmclient/sol005/sdncontroller.py b/osmclient/sol005/sdncontroller.py index 8f4522d..b2bbc37 100644 --- a/osmclient/sol005/sdncontroller.py +++ b/osmclient/sol005/sdncontroller.py @@ -23,12 +23,14 @@ from osmclient.common import wait as WaitForStatus from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import json +import logging class SdnController(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/admin' self._apiVersion = '/v1' self._apiResource = '/sdns' @@ -37,6 +39,7 @@ class SdnController(object): # SDNC '--wait' option def _wait(self, id, deleteFlag=False): + self._logger.debug("") self._client.get_token() # Endpoint to get operation status apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/sdns') @@ -50,7 +53,9 @@ class SdnController(object): deleteFlag=deleteFlag) def _get_id_for_wait(self, name): - # Returns id of name, or the id itself if given as argument + """Returns id of name, or the id itself if given as argument + """ + self._logger.debug("") for sdnc in self.list(): if name == sdnc['_id']: return sdnc['_id'] @@ -60,6 +65,7 @@ class SdnController(object): return '' def create(self, name, sdn_controller, wait=False): + self._logger.debug("") self._client.get_token() http_code, resp = self._http.post_cmd(endpoint=self._apiBase, postfields_dict=sdn_controller) # print('HTTP CODE: {}'.format(http_code)) @@ -83,6 +89,7 @@ class SdnController(object): raise ClientException("failed to create SDN controller {} - {}".format(name, msg)) def update(self, name, sdn_controller, wait=False): + self._logger.debug("") self._client.get_token() sdnc = self.get(name) sdnc_id_for_wait = self._get_id_for_wait(name) @@ -109,6 +116,7 @@ class SdnController(object): raise ClientException("failed to update SDN controller {} - {}".format(name, msg)) def delete(self, name, force=False, wait=False): + self._logger.debug("") self._client.get_token() sdn_controller = self.get(name) sdnc_id_for_wait = self._get_id_for_wait(name) @@ -141,6 +149,7 @@ class SdnController(object): def list(self, filter=None): """Returns a list of SDN controllers """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -154,6 +163,7 @@ class SdnController(object): def get(self, name): """Returns an SDN controller based on name or id """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for sdnc in self.list(): @@ -165,4 +175,3 @@ class SdnController(object): return sdnc raise NotFound("SDN controller {} not found".format(name)) - diff --git a/osmclient/sol005/user.py b/osmclient/sol005/user.py index 64d5c69..6c10325 100644 --- a/osmclient/sol005/user.py +++ b/osmclient/sol005/user.py @@ -23,12 +23,14 @@ from osmclient.common import utils from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import json +import logging class User(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/admin' self._apiVersion = '/v1' self._apiResource = '/users' @@ -38,6 +40,7 @@ class User(object): def create(self, name, user): """Creates a new OSM user """ + self._logger.debug("") self._client.get_token() if not user["projects"] or (len(user["projects"]) == 1 and not user["projects"][0]): del user["projects"] @@ -84,6 +87,7 @@ class User(object): def update(self, name, user): """Updates an existing OSM user identified by name """ + self._logger.debug("") self._client.get_token() # print(user) myuser = self.get(name) @@ -165,6 +169,7 @@ class User(object): def delete(self, name, force=False): """Deletes an existing OSM user identified by name """ + self._logger.debug("") self._client.get_token() user = self.get(name) querystring = '' @@ -192,6 +197,7 @@ class User(object): def list(self, filter=None): """Returns the list of OSM users """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -205,6 +211,7 @@ class User(object): def get(self, name): """Returns an OSM user based on name or id """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for user in self.list(): @@ -216,4 +223,3 @@ class User(object): return user raise NotFound("User {} not found".format(name)) - diff --git a/osmclient/sol005/vim.py b/osmclient/sol005/vim.py index 1af7cc7..43911a6 100644 --- a/osmclient/sol005/vim.py +++ b/osmclient/sol005/vim.py @@ -24,12 +24,14 @@ from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import yaml import json +import logging class Vim(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/admin' self._apiVersion = '/v1' self._apiResource = '/vim_accounts' @@ -38,6 +40,7 @@ class Vim(object): # VIM '--wait' option def _wait(self, id, deleteFlag=False): + self._logger.debug("") self._client.get_token() # Endpoint to get operation status apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/vim_accounts') @@ -51,7 +54,10 @@ class Vim(object): deleteFlag=deleteFlag) def _get_id_for_wait(self, name): - # Returns id of name, or the id itself if given as argument + """ Returns id of name, or the id itself if given as argument + """ + self._logger.debug("") + self._client.get_token() for vim in self.list(): if name == vim['uuid']: return vim['uuid'] @@ -61,6 +67,7 @@ class Vim(object): return '' def create(self, name, vim_access, sdn_controller=None, sdn_port_mapping=None, wait=False): + self._logger.debug("") self._client.get_token() if 'vim-type' not in vim_access: #'openstack' not in vim_access['vim-type']): @@ -107,6 +114,7 @@ class Vim(object): raise ClientException("failed to create vim {} - {}".format(name, msg)) def update(self, vim_name, vim_account, sdn_controller, sdn_port_mapping, wait=False): + self._logger.debug("") self._client.get_token() vim = self.get(vim_name) vim_id_for_wait = self._get_id_for_wait(vim_name) @@ -149,6 +157,7 @@ class Vim(object): raise ClientException("failed to update vim {} - {}".format(vim_name, msg)) def update_vim_account_dict(self, vim_account, vim_access): + self._logger.debug("") vim_account['vim_type'] = vim_access['vim-type'] vim_account['description'] = vim_access['description'] vim_account['vim_url'] = vim_access['vim-url'] @@ -160,12 +169,14 @@ class Vim(object): def get_id(self, name): """Returns a VIM id from a VIM name """ + self._logger.debug("") for vim in self.list(): if name == vim['name']: return vim['uuid'] raise NotFound("vim {} not found".format(name)) def delete(self, vim_name, force=False, wait=False): + self._logger.debug("") self._client.get_token() vim_id = vim_name if not utils.validate_uuid4(vim_name): @@ -203,6 +214,7 @@ class Vim(object): def list(self, filter=None): """Returns a list of VIM accounts """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -219,6 +231,7 @@ class Vim(object): def get(self, name): """Returns a VIM account based on name or id """ + self._logger.debug("") self._client.get_token() vim_id = name if not utils.validate_uuid4(name): diff --git a/osmclient/sol005/vnf.py b/osmclient/sol005/vnf.py index b7ac856..6aa44d8 100644 --- a/osmclient/sol005/vnf.py +++ b/osmclient/sol005/vnf.py @@ -20,6 +20,7 @@ OSM vnf API handling from osmclient.common import utils from osmclient.common.exceptions import NotFound +import logging class Vnf(object): @@ -27,6 +28,7 @@ class Vnf(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/nslcm' self._apiVersion = '/v1' self._apiResource = '/vnfrs' @@ -36,6 +38,7 @@ class Vnf(object): def list(self, ns=None, filter=None): """Returns a list of VNF instances """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -55,6 +58,7 @@ class Vnf(object): def get(self, name): """Returns a VNF instance based on name or id """ + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for vnf in self.list(): @@ -67,6 +71,7 @@ class Vnf(object): raise NotFound("vnf {} not found".format(name)) def get_individual(self, name): + self._logger.debug("") self._client.get_token() vnf_id = name if not utils.validate_uuid4(name): diff --git a/osmclient/sol005/vnfd.py b/osmclient/sol005/vnfd.py index ffa0182..ec54c95 100644 --- a/osmclient/sol005/vnfd.py +++ b/osmclient/sol005/vnfd.py @@ -24,6 +24,7 @@ from osmclient.common import utils import json import magic from os.path import basename +import logging #from os import stat @@ -32,6 +33,7 @@ class Vnfd(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/vnfpkgm' self._apiVersion = '/v1' self._apiResource = '/vnf_packages' @@ -40,6 +42,7 @@ class Vnfd(object): #self._apiBase='/vnfds' def list(self, filter=None): + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -50,6 +53,7 @@ class Vnfd(object): return list() def get(self, name): + self._logger.debug("") self._client.get_token() if utils.validate_uuid4(name): for vnfd in self.list(): @@ -62,6 +66,7 @@ class Vnfd(object): raise NotFound("vnfd {} not found".format(name)) def get_individual(self, name): + self._logger.debug("") vnfd = self.get(name) # It is redundant, since the previous one already gets the whole vnfpkginfo # The only difference is that a different primitive is exercised @@ -72,6 +77,7 @@ class Vnfd(object): raise NotFound("vnfd {} not found".format(name)) def get_thing(self, name, thing, filename): + self._logger.debug("") vnfd = self.get(name) headers = self._client._headers headers['Accept'] = 'application/binary' @@ -92,15 +98,19 @@ class Vnfd(object): raise ClientException("failed to get {} from {} - {}".format(thing, name, msg)) def get_descriptor(self, name, filename): + self._logger.debug("") self.get_thing(name, 'vnfd', filename) def get_package(self, name, filename): + self._logger.debug("") self.get_thing(name, 'package_content', filename) def get_artifact(self, name, artifact, filename): + self._logger.debug("") self.get_thing(name, 'artifacts/{}'.format(artifact), filename) def delete(self, name, force=False): + self._logger.debug("") self._client.get_token() vnfd = self.get(name) querystring = '' @@ -124,6 +134,7 @@ class Vnfd(object): raise ClientException("failed to delete vnfd {} - {}".format(name, msg)) def create(self, filename, overwrite=None, update_endpoint=None): + self._logger.debug("") self._client.get_token() mime_type = magic.from_file(filename, mime=True) if mime_type is None: @@ -181,6 +192,7 @@ class Vnfd(object): raise ClientException("failed to create/update vnfd - {}".format(msg)) def update(self, name, filename): + self._logger.debug("") self._client.get_token() vnfd = self.get(name) endpoint = '{}/{}/package_content'.format(self._apiBase, vnfd['_id']) diff --git a/osmclient/sol005/wim.py b/osmclient/sol005/wim.py index 943ceb4..61c4dda 100644 --- a/osmclient/sol005/wim.py +++ b/osmclient/sol005/wim.py @@ -24,12 +24,14 @@ from osmclient.common.exceptions import ClientException from osmclient.common.exceptions import NotFound import yaml import json +import logging class Wim(object): def __init__(self, http=None, client=None): self._http = http self._client = client + self._logger = logging.getLogger('osmclient') self._apiName = '/admin' self._apiVersion = '/v1' self._apiResource = '/wim_accounts' @@ -38,6 +40,7 @@ class Wim(object): # WIM '--wait' option def _wait(self, id, deleteFlag=False): + self._logger.debug("") self._client.get_token() # Endpoint to get operation status apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/wim_accounts') @@ -51,7 +54,9 @@ class Wim(object): deleteFlag=deleteFlag) def _get_id_for_wait(self, name): - # Returns id of name, or the id itself if given as argument + """Returns id of name, or the id itself if given as argument + """ + self._logger.debug("") for wim in self.list(): if name == wim['uuid']: return wim['uuid'] @@ -61,6 +66,7 @@ class Wim(object): return '' def create(self, name, wim_input, wim_port_mapping=None, wait=False): + self._logger.debug("") self._client.get_token() if 'wim_type' not in wim_input: raise Exception("wim type not provided") @@ -102,6 +108,7 @@ class Wim(object): raise ClientException("failed to create wim {} - {}".format(name, msg)) def update(self, wim_name, wim_account, wim_port_mapping=None, wait=False): + self._logger.debug("") self._client.get_token() wim = self.get(wim_name) wim_id_for_wait = self._get_id_for_wait(wim_name) @@ -141,7 +148,8 @@ class Wim(object): raise ClientException("failed to update wim {} - {}".format(wim_name, msg)) def update_wim_account_dict(self, wim_account, wim_input): - print(wim_input) + self._logger.debug("") + self._logger.debug(str(wim_input)) wim_account['wim_type'] = wim_input['wim_type'] wim_account['description'] = wim_input['description'] wim_account['wim_url'] = wim_input['url'] @@ -152,12 +160,14 @@ class Wim(object): def get_id(self, name): """Returns a WIM id from a WIM name """ + self._logger.debug("") for wim in self.list(): if name == wim['name']: return wim['uuid'] raise NotFound("wim {} not found".format(name)) def delete(self, wim_name, force=False, wait=False): + self._logger.debug("") self._client.get_token() wim_id = wim_name wim_id_for_wait = self._get_id_for_wait(wim_name) @@ -197,6 +207,7 @@ class Wim(object): def list(self, filter=None): """Returns a list of VIM accounts """ + self._logger.debug("") self._client.get_token() filter_string = '' if filter: @@ -213,6 +224,7 @@ class Wim(object): def get(self, name): """Returns a VIM account based on name or id """ + self._logger.debug("") self._client.get_token() wim_id = name if not utils.validate_uuid4(name): @@ -224,3 +236,4 @@ class Wim(object): else: return resp raise NotFound("wim {} not found".format(name)) + diff --git a/requirements.txt b/requirements.txt index 997ff57..96b6e69 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,4 +20,5 @@ PyYAML pycurl python-magic jinja2 +verboselogs git+https://osm.etsi.org/gerrit/osm/IM.git#egg=osm-im diff --git a/setup.py b/setup.py index 313d087..1a60771 100644 --- a/setup.py +++ b/setup.py @@ -28,8 +28,8 @@ setup( description=_description, license='Apache 2', install_requires=[ - 'Click', 'prettytable', 'pyyaml', 'PycURL', 'python-magic', - 'jinja2', 'osm-im' + 'Click', 'prettytable', 'pyyaml', 'pycurl', 'python-magic', + 'jinja2', 'osm-im', 'verboselogs' ], dependency_links=[ 'git+https://osm.etsi.org/gerrit/osm/IM.git#egg=osm-im',