feature: sol004 and sol007
[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
98 if filename.endswith(".tar.gz"):
99 headers["Content-Type"] = "application/gzip"
100 else:
101 headers["Content-Type"] = "application/zip"
102 # headers['Content-Type'] = 'application/binary'
103 # Next three lines are to be removed in next version
104 # headers['Content-Filename'] = basename(filename)
105 # file_size = stat(filename).st_size
106 # headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
107 headers["Content-File-MD5"] = utils.md5(filename)
108 http_header = [
109 "{}: {}".format(key, val) for (key, val) in list(headers.items())
110 ]
111 self._http.set_http_header(http_header)
112 http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
113 # print('HTTP CODE: {}'.format(http_code))
114 # print('RESP: {}'.format(resp))
115 # if http_code in (200, 201, 202, 204):
116 if resp:
117 resp = json.loads(resp)
118 if not resp or "id" not in resp:
119 raise ClientException(
120 "unexpected response from server - {}".format(resp)
121 )
122 print(resp["id"])
123 # else:
124 # msg = ""
125 # if resp:
126 # try:
127 # msg = json.loads(resp)
128 # except ValueError:
129 # msg = resp
130 # raise ClientException("failed to upload package - {}".format(msg))