Capability to upload a package from a source folder
[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(lambda:
60 check_exists(lambda:
61 get_method(pkg_type['name'])))
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"
76 .format(filename))
77
78 def upload(self, filename, skip_charm_build=False):
79 self._logger.debug("")
80 if os.path.isdir(filename):
81 filename = filename.rstrip('/')
82 filename = self._client.package_tool.build(filename, skip_validation=False, skip_charm_build=skip_charm_build)
83 self.upload(filename)
84 else:
85 self._client.get_token()
86 pkg_type = utils.get_key_val_from_pkg(filename)
87 if pkg_type is None:
88 raise ClientException("Cannot determine package type")
89 if pkg_type['type'] == 'nsd':
90 endpoint = '/nsd/v1/ns_descriptors_content'
91 else:
92 endpoint = '/vnfpkgm/v1/vnf_packages_content'
93 #endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
94 #print('Endpoint: {}'.format(endpoint))
95 headers = self._client._headers
96 headers['Content-Type'] = 'application/gzip'
97 #headers['Content-Type'] = 'application/binary'
98 # Next three lines are to be removed in next version
99 #headers['Content-Filename'] = basename(filename)
100 #file_size = stat(filename).st_size
101 #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
102 headers["Content-File-MD5"] = utils.md5(filename)
103 http_header = ['{}: {}'.format(key,val)
104 for (key,val) in list(headers.items())]
105 self._http.set_http_header(http_header)
106 http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
107 #print('HTTP CODE: {}'.format(http_code))
108 #print('RESP: {}'.format(resp))
109 #if http_code in (200, 201, 202, 204):
110 if resp:
111 resp = json.loads(resp)
112 if not resp or 'id' not in resp:
113 raise ClientException('unexpected response from server - {}'.format(
114 resp))
115 print(resp['id'])
116 # else:
117 # msg = ""
118 # if resp:
119 # try:
120 # msg = json.loads(resp)
121 # except ValueError:
122 # msg = resp
123 # raise ClientException("failed to upload package - {}".format(msg))