Fix Bug 934. OSM CLI crashes for listing operations with insufficient permissions
[osm/osmclient.git] / osmclient / sol005 / nsi.py
index 0fcfe1d..b582ae1 100644 (file)
@@ -22,8 +22,10 @@ from osmclient.common import utils
 from osmclient.common import wait as WaitForStatus
 from osmclient.common.exceptions import ClientException
 from osmclient.common.exceptions import NotFound
+from osmclient.common.exceptions import OsmHttpException
 import yaml
 import json
+import logging
 
 
 class Nsi(object):
@@ -31,6 +33,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 +42,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,18 +58,20 @@ class Nsi(object):
     def list(self, filter=None):
         """Returns a list of NSI
         """
+        self._logger.debug("")
         self._client.get_token()
         filter_string = ''
         if filter:
             filter_string = '?{}'.format(filter)
-        resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
+        _, resp = self._http.get2_cmd('{}{}'.format(self._apiBase,filter_string))
         if resp:
-            return resp
+            return json.loads(resp)
         return list()
 
     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 +84,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):
@@ -85,14 +92,15 @@ class Nsi(object):
                 if name == nsi['name']:
                     nsi_id = nsi['_id']
                     break
-        resp = self._http.get_cmd('{}/{}'.format(self._apiBase, nsi_id))
+        _, resp = self._http.get2_cmd('{}/{}'.format(self._apiBase, nsi_id))
         #resp = self._http.get_cmd('{}/{}/nsd_content'.format(self._apiBase, nsi_id))
         #print(yaml.safe_dump(resp))
         if resp:
-            return resp
+            return json.loads(resp)
         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:
@@ -118,18 +126,20 @@ class Nsi(object):
                     msg = json.loads(resp)
                 except ValueError:
                     msg = resp
-            raise ClientException("failed to delete nsi {} - {}".format(name, msg))
+            raise OsmHttpException("failed to delete nsi {} - {}".format(name, msg))
 
     def create(self, nst_name, nsi_name, account, config=None,
                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]
 
@@ -203,6 +213,8 @@ class Nsi(object):
                             not additional_param_subnet.get("additionalParamsForVnf"):
                         raise ValueError("Error at --config 'additionalParamsForSubnet' items must contain "
                                          "'additionalParamsForNs' and/or 'additionalParamsForVnf'")
+            if "timeout_nsi_deploy" in nsi_config:
+                nsi["timeout_nsi_deploy"] = nsi_config.pop("timeout_nsi_deploy")
 
         # print(yaml.safe_dump(nsi))
         try:
@@ -215,37 +227,38 @@ class Nsi(object):
                           for (key,val) in list(headers.items())]
             self._http.set_http_header(http_header)
             http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
-                                       postfields_dict=nsi)
+                                   postfields_dict=nsi)
             #print('HTTP CODE: {}'.format(http_code))
             #print('RESP: {}'.format(resp))
-            if http_code in (200, 201, 202, 204):
-                if resp:
-                    resp = json.loads(resp)
-                if not resp or 'id' not in resp:
-                    raise ClientException('unexpected response from server - {} '.format(
-                                      resp))
-                if wait:
-                    # Wait for status for NSI instance creation
-                    self._wait(resp.get('nsilcmop_id'))
-                print(resp['id'])
-            else:
-                msg = ""
-                if resp:
-                    try:
-                        msg = json.loads(resp)
-                    except ValueError:
-                        msg = resp
-                raise ClientException(msg)
+            #if http_code in (200, 201, 202, 204):
+            if resp:
+                resp = json.loads(resp)
+            if not resp or 'id' not in resp:
+                raise ClientException('unexpected response from server - {} '.format(
+                                  resp))
+            if wait:
+                # Wait for status for NSI instance creation
+                self._wait(resp.get('nsilcmop_id'))
+            print(resp['id'])
+            #else:
+            #    msg = ""
+            #    if resp:
+            #        try:
+            #            msg = json.loads(resp)
+            #        except ValueError:
+            #            msg = resp
+            #    raise ClientException(msg)
         except ClientException as exc:
             message="failed to create nsi: {} nst: {}\nerror:\n{}".format(
                     nsi_name,
                     nst_name,
                     str(exc))
-            raise ClientException(message)
+            raise OsmHttpException(message)
 
     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'
@@ -259,30 +272,31 @@ class Nsi(object):
                                                        filter_string) )
             #print('HTTP CODE: {}'.format(http_code))
             #print('RESP: {}'.format(resp))
-            if http_code == 200:
-                if resp:
-                    resp = json.loads(resp)
-                    return resp
-                else:
-                    raise ClientException('unexpected response from server')
+            #if http_code == 200:
+            if resp:
+                resp = json.loads(resp)
+                return resp
             else:
-                msg = ""
-                if resp:
-                    try:
-                        resp = json.loads(resp)
-                        msg = resp['detail']
-                    except ValueError:
-                        msg = resp
-                raise ClientException(msg)
+                 raise ClientException('unexpected response from server')
+            #else:
+            #    msg = ""
+            #    if resp:
+            #        try:
+            #            resp = json.loads(resp)
+            #            msg = resp['detail']
+            #        except ValueError:
+            #            msg = resp
+            #    raise ClientException(msg)
         except ClientException as exc:
             message="failed to get operation list of NSI {}:\nerror:\n{}".format(
                     name,
                     str(exc))
-            raise ClientException(message)
+            raise OsmHttpException(message)
 
     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'
@@ -291,30 +305,31 @@ class Nsi(object):
             http_code, resp = self._http.get2_cmd('{}/{}'.format(self._apiBase, operationId))
             #print('HTTP CODE: {}'.format(http_code))
             #print('RESP: {}'.format(resp))
-            if http_code == 200:
-                if resp:
-                    resp = json.loads(resp)
-                    return resp
-                else:
-                    raise ClientException('unexpected response from server')
+            #if http_code == 200:
+            if resp:
+                resp = json.loads(resp)
+                return resp
             else:
-                msg = ""
-                if resp:
-                    try:
-                        resp = json.loads(resp)
-                        msg = resp['detail']
-                    except ValueError:
-                        msg = resp
-                raise ClientException(msg)
+                raise ClientException('unexpected response from server')
+            #else:
+            #    msg = ""
+            #    if resp:
+            #        try:
+            #            resp = json.loads(resp)
+            #            msg = resp['detail']
+            #        except ValueError:
+            #            msg = resp
+            #    raise ClientException(msg)
         except ClientException as exc:
             message="failed to get status of operation {}:\nerror:\n{}".format(
                     operationId,
                     str(exc))
-            raise ClientException(message)
+            raise OsmHttpException(message)
 
     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'
@@ -326,24 +341,24 @@ class Nsi(object):
             http_code, resp = self._http.post_cmd(endpoint=endpoint, postfields_dict=op_data)
             #print('HTTP CODE: {}'.format(http_code))
             #print('RESP: {}'.format(resp))
-            if http_code in (200, 201, 202, 204):
-                if resp:
-                    resp = json.loads(resp)
-                if not resp or 'id' not in resp:
-                    raise ClientException('unexpected response from server - {}'.format(
-                                      resp))
-                print(resp['id'])
-            else:
-                msg = ""
-                if resp:
-                    try:
-                        msg = json.loads(resp)
-                    except ValueError:
-                        msg = resp
-                raise ClientException(msg)
+            #if http_code in (200, 201, 202, 204):
+            if resp:
+                resp = json.loads(resp)
+            if not resp or 'id' not in resp:
+                raise ClientException('unexpected response from server - {}'.format(
+                                  resp))
+            print(resp['id'])
+            #else:
+            #    msg = ""
+            #    if resp:
+            #        try:
+            #            msg = json.loads(resp)
+            #        except ValueError:
+            #            msg = resp
+            #    raise ClientException(msg)
         except ClientException as exc:
             message="failed to exec operation {}:\nerror:\n{}".format(
                     name,
                     str(exc))
-            raise ClientException(message)
+            raise OsmHttpException(message)