Fix bug 1721: charms can include reference to .charm files
[osm/osmclient.git] / osmclient / sol005 / package.py
1 # Copyright 2018 Telefonica
2 #
3 # All Rights Reserved.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
15 # under the License.
16
17 """
18 OSM package API handling
19 """
20
21 # from os import stat
22 # from os.path import basename
23 from osmclient.common.exceptions import ClientException
24 from osmclient.common.exceptions import NotFound
25 from osmclient.common import utils
26 import json
27 import logging
28 import os.path
29
30
31 class Package(object):
32 def __init__(self, http=None, client=None):
33 self._client = client
34 self._http = http
35 self._logger = logging.getLogger("osmclient")
36
37 def get_key_val_from_pkg(self, descriptor_file):
38 self._logger.debug("")
39 return utils.get_key_val_from_pkg(descriptor_file)
40
41 def _wait_for_package(self, pkg_type):
42 self._logger.debug("")
43 if "vnfd" in pkg_type["type"]:
44 get_method = self._client.vnfd.get
45 elif "nsd" in pkg_type["type"]:
46 get_method = self._client.nsd.get
47 else:
48 raise ClientException("no valid package type found")
49
50 # helper method to check if pkg exists
51 def check_exists(func):
52 self._logger.debug("")
53 try:
54 func()
55 except NotFound:
56 return False
57 return True
58
59 return utils.wait_for_value(
60 lambda: check_exists(lambda: get_method(pkg_type["name"]))
61 )
62
63 def wait_for_upload(self, filename):
64 """wait(block) for an upload to succeed.
65 The filename passed is assumed to be a descriptor tarball.
66 """
67 self._logger.debug("")
68 self._client.get_token()
69 pkg_type = utils.get_key_val_from_pkg(filename)
70
71 if pkg_type is None:
72 raise ClientException("Cannot determine package type")
73
74 if not self._wait_for_package(pkg_type):
75 raise ClientException("package {} failed to upload".format(filename))
76
77 def upload(self, filename, skip_charm_build=False):
78 self._logger.debug("")
79 if os.path.isdir(filename):
80 filename = filename.rstrip("/")
81 filename = self._client.package_tool.build(
82 filename, skip_validation=False, skip_charm_build=skip_charm_build
83 )
84 self.upload(filename)
85 else:
86 self._client.get_token()
87 pkg_type = utils.get_key_val_from_pkg(filename)
88 if pkg_type is None:
89 raise ClientException("Cannot determine package type")
90 if pkg_type["type"] == "nsd":
91 endpoint = "/nsd/v1/ns_descriptors_content"
92 else:
93 endpoint = "/vnfpkgm/v1/vnf_packages_content"
94 # endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
95 # print('Endpoint: {}'.format(endpoint))
96 headers = self._client._headers
97 headers["Content-Type"] = "application/gzip"
98 # headers['Content-Type'] = 'application/binary'
99 # Next three lines are to be removed in next version
100 # headers['Content-Filename'] = basename(filename)
101 # file_size = stat(filename).st_size
102 # headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
103 headers["Content-File-MD5"] = utils.md5(filename)
104 http_header = [
105 "{}: {}".format(key, val) for (key, val) in list(headers.items())
106 ]
107 self._http.set_http_header(http_header)
108 http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
109 # print('HTTP CODE: {}'.format(http_code))
110 # print('RESP: {}'.format(resp))
111 # if http_code in (200, 201, 202, 204):
112 if resp:
113 resp = json.loads(resp)
114 if not resp or "id" not in resp:
115 raise ClientException(
116 "unexpected response from server - {}".format(resp)
117 )
118 print(resp["id"])
119 # else:
120 # msg = ""
121 # if resp:
122 # try:
123 # msg = json.loads(resp)
124 # except ValueError:
125 # msg = resp
126 # raise ClientException("failed to upload package - {}".format(msg))