Adding logging capabilities to osmclient 31/8231/34
authorgarciadeblas <gerardo.garciadeblas@telefonica.com>
Thu, 21 Nov 2019 11:02:05 +0000 (12:02 +0100)
committergarciadeblas <gerardo.garciadeblas@telefonica.com>
Wed, 15 Jan 2020 10:21:00 +0000 (10:21 +0000)
Change-Id: Ia48b5a95d4fb3cdbf85f90f62a6196f4b045d2f2
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
22 files changed:
debian/python3-osmclient.postinst
osmclient/client.py
osmclient/common/http.py
osmclient/scripts/osm.py
osmclient/sol005/client.py
osmclient/sol005/http.py
osmclient/sol005/ns.py
osmclient/sol005/nsd.py
osmclient/sol005/nsi.py
osmclient/sol005/nst.py
osmclient/sol005/package.py
osmclient/sol005/pdud.py
osmclient/sol005/project.py
osmclient/sol005/role.py
osmclient/sol005/sdncontroller.py
osmclient/sol005/user.py
osmclient/sol005/vim.py
osmclient/sol005/vnf.py
osmclient/sol005/vnfd.py
osmclient/sol005/wim.py
requirements.txt
setup.py

index 9695c47..75ec83f 100644 (file)
@@ -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'
index eccfee2..56570b4 100644 (file)
@@ -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)
index 17f82e3..b67b594 100644 (file)
@@ -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
index 4cc451b..ab90dd7 100755 (executable)
@@ -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=<VENDOR>&nsd-ref=<NSD_NAME>
        --filter  nsd.constituent-vnfd.vnfd-id-ref=<VNFD_NAME>
     """
+    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=<IP_ADDRESS>
        --filter  vnfd-ref=<VNFD_NAME>,vdur.ip-address=<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()
+
index 2de6a4c..bf6f845 100644 (file)
@@ -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,
index f19a098..aca8a4b 100644 (file)
 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
 
index e9858f4..381ad42 100644 (file)
@@ -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))
+
index 9adc8f7..bf91ca6 100644 (file)
@@ -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)
index 0fcfe1d..7995595 100644 (file)
@@ -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'
index f0da0f5..e75c8f5 100644 (file)
@@ -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)
index c383862..a52ba15 100644 (file)
@@ -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:
index 22ca8bc..42fe40d 100644 (file)
@@ -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)
index 19a27c3..8f119e8 100644 (file)
@@ -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))
 
-
index 01f3bc3..404784a 100644 (file)
@@ -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))
+
index 8f4522d..b2bbc37 100644 (file)
@@ -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))
 
-
index 64d5c69..6c10325 100644 (file)
@@ -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))
 
-
index 1af7cc7..43911a6 100644 (file)
@@ -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):
index b7ac856..6aa44d8 100644 (file)
@@ -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):
index ffa0182..ec54c95 100644 (file)
@@ -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'])
index 943ceb4..61c4dda 100644 (file)
@@ -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))
+
index 997ff57..96b6e69 100644 (file)
@@ -20,4 +20,5 @@ PyYAML
 pycurl
 python-magic
 jinja2
+verboselogs
 git+https://osm.etsi.org/gerrit/osm/IM.git#egg=osm-im
index 313d087..1a60771 100644 (file)
--- 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',