Fix #1063 flake tests
[osm/osmclient.git] / osmclient / sol005 / package.py
index b2fe035..622fb86 100644 (file)
 OSM package API handling
 """
 
-import tarfile
-import re
-import yaml
 #from os import stat
 #from os.path import basename
 from osmclient.common.exceptions import ClientException
 from osmclient.common.exceptions import NotFound
 from osmclient.common import utils
 import json
+import logging
+import os.path
 
 
 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 upload(self, filename):
+    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 pkg_type['type'] == 'nsd':
-            endpoint = '/nsd/v1/ns_descriptors_content'
-        else:
-            endpoint = '/vnfpkgm/v1/vnf_packages_content'
-        #endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
-        #print 'Endpoint: {}'.format(endpoint)
-        headers = self._client._headers
-        headers['Content-Type'] = 'application/gzip'
-        #headers['Content-Type'] = 'application/binary'
-        # Next three lines are to be removed in next version
-        #headers['Content-Filename'] = basename(filename)
-        #file_size = stat(filename).st_size
-        #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()]
-        self._http.set_http_header(http_header)
-        http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
-        if resp:
-            resp = json.loads(resp)
-        #print 'RESP: {}'.format(yaml.safe_dump(resp))
-        if not resp or 'id' not in resp:
-            raise ClientException("failed to upload package")
-        else:
-            print resp['id']
 
+        if not self._wait_for_package(pkg_type):
+            raise ClientException("package {} failed to upload"
+                                  .format(filename))
 
+    def upload(self, filename, skip_charm_build=False):
+        self._logger.debug("")
+        if os.path.isdir(filename):
+            filename = filename.rstrip('/')
+            filename = self._client.package_tool.build(filename, skip_validation=False, skip_charm_build=skip_charm_build)
+            self.upload(filename)
+        else:
+            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 pkg_type['type'] == 'nsd':
+                endpoint = '/nsd/v1/ns_descriptors_content'
+            else:
+                endpoint = '/vnfpkgm/v1/vnf_packages_content'
+            #endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
+            #print('Endpoint: {}'.format(endpoint))
+            headers = self._client._headers
+            headers['Content-Type'] = 'application/gzip'
+            #headers['Content-Type'] = 'application/binary'
+            # Next three lines are to be removed in next version
+            #headers['Content-Filename'] = basename(filename)
+            #file_size = stat(filename).st_size
+            #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 list(headers.items())]
+            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 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("failed to upload package - {}".format(msg))