Fix Bug 1493 repo generation from osm-packages
[osm/osmclient.git] / osmclient / sol005 / package.py
index 172ee45..1fa0e24 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 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
+import os.path
 
 
 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 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)
         pkg_type = utils.get_key_val_from_pkg(filename)
+
         if pkg_type is None:
             raise ClientException("Cannot determine package type")
         if pkg_type is None:
             raise ClientException("Cannot determine package type")
-        if pkg_type['type'] == 'nsd':
-            endpoint = '/nsd/v1/ns_descriptors_content'
+
+        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:
         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)
-        #print 'HTTP CODE: {}'.format(http_code)
-        #print 'RESP: {}'.format(resp)
-        if http_code in (200, 201, 202, 204):
+            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 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 delete ns {} - {}".format(name, msg))
-
+            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))