Fix Bug 934. OSM CLI crashes for listing operations with insufficient permissions
[osm/osmclient.git] / osmclient / sol005 / package.py
index b2fe035..27b3ad4 100644 (file)
 OSM package API handling
 """
 
 OSM package API handling
 """
 
-import tarfile
-import re
-import yaml
 #from os import stat
 #from os.path import basename
 #from os import stat
 #from os.path import basename
+from osmclient.common.exceptions import OsmHttpException
 from osmclient.common.exceptions import ClientException
 from osmclient.common.exceptions import NotFound
 from osmclient.common import utils
 import json
 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
 
 
 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):
 
     def get_key_val_from_pkg(self, descriptor_file):
+        self._logger.debug("")
         return utils.get_key_val_from_pkg(descriptor_file)
 
         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']:
+            get_method = self._client.nsd.get
+        else:
+            raise ClientException("no valid package type found")
+
+        # helper method to check if pkg exists
+        def check_exists(func):
+            self._logger.debug("")
+            try:
+                func()
+            except NotFound:
+                return False
+            return True
+
+        return utils.wait_for_value(lambda:
+                                    check_exists(lambda:
+                                                 get_method(pkg_type['name'])))
+
+    def wait_for_upload(self, filename):
+        """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)
+
+        if pkg_type is None:
+            raise ClientException("Cannot determine package type")
+
+        if not self._wait_for_package(pkg_type):
+            raise ClientException("package {} failed to upload"
+                                  .format(filename))
+
     def upload(self, 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:
             raise ClientException("Cannot determine package type")
         pkg_type = utils.get_key_val_from_pkg(filename)
         if pkg_type is None:
             raise ClientException("Cannot determine package type")
@@ -46,7 +86,7 @@ class Package(object):
         else:
             endpoint = '/vnfpkgm/v1/vnf_packages_content'
         #endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
         else:
             endpoint = '/vnfpkgm/v1/vnf_packages_content'
         #endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
-        #print 'Endpoint: {}'.format(endpoint)
+        #print('Endpoint: {}'.format(endpoint))
         headers = self._client._headers
         headers['Content-Type'] = 'application/gzip'
         #headers['Content-Type'] = 'application/binary'
         headers = self._client._headers
         headers['Content-Type'] = 'application/gzip'
         #headers['Content-Type'] = 'application/binary'
@@ -56,15 +96,23 @@ class Package(object):
         #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
         headers["Content-File-MD5"] = utils.md5(filename)
         http_header = ['{}: {}'.format(key,val)
         #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
         headers["Content-File-MD5"] = utils.md5(filename)
         http_header = ['{}: {}'.format(key,val)
-                      for (key,val) in headers.items()]
+                      for (key,val) in list(headers.items())]
         self._http.set_http_header(http_header)
         http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
         self._http.set_http_header(http_header)
         http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
+        #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 resp:
             resp = json.loads(resp)
-        #print 'RESP: {}'.format(yaml.safe_dump(resp))
         if not resp or 'id' not in resp:
         if not resp or 'id' not in resp:
-            raise ClientException("failed to upload package")
-        else:
-            print resp['id']
-
-
+            raise OsmHttpException('unexpected response from server - {}'.format(
+                                   resp))
+        print(resp['id'])
+        # else:
+        #     msg = ""
+        #     if resp:
+        #         try:
+        #              msg = json.loads(resp)
+        #         except ValueError:
+        #             msg = resp
+        #     raise ClientException("failed to upload package - {}".format(msg))