1 # Copyright 2018 Telefonica
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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
18 OSM package API handling
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
29 class Package(object):
30 def __init__(self
, http
=None, client
=None):
34 def get_key_val_from_pkg(self
, descriptor_file
):
35 return utils
.get_key_val_from_pkg(descriptor_file
)
37 def _wait_for_package(self
, pkg_type
):
38 if 'vnfd' in pkg_type
['type']:
39 get_method
= self
._client
.vnfd
.get
40 elif 'nsd' in pkg_type
['type']:
41 get_method
= self
._client
.nsd
.get
43 raise ClientException("no valid package type found")
45 # helper method to check if pkg exists
46 def check_exists(func
):
53 return utils
.wait_for_value(lambda:
55 get_method(pkg_type
['name'])))
57 def wait_for_upload(self
, filename
):
58 """wait(block) for an upload to succeed.
59 The filename passed is assumed to be a descriptor tarball.
61 pkg_type
= utils
.get_key_val_from_pkg(filename
)
64 raise ClientException("Cannot determine package type")
66 if not self
._wait
_for
_package
(pkg_type
):
67 raise ClientException("package {} failed to upload"
70 def upload(self
, filename
):
71 pkg_type
= utils
.get_key_val_from_pkg(filename
)
73 raise ClientException("Cannot determine package type")
74 if pkg_type
['type'] == 'nsd':
75 endpoint
= '/nsd/v1/ns_descriptors_content'
77 endpoint
= '/vnfpkgm/v1/vnf_packages_content'
78 #endpoint = '/nsds' if pkg_type['type'] == 'nsd' else '/vnfds'
79 #print('Endpoint: {}'.format(endpoint))
80 headers
= self
._client
._headers
81 headers
['Content-Type'] = 'application/gzip'
82 #headers['Content-Type'] = 'application/binary'
83 # Next three lines are to be removed in next version
84 #headers['Content-Filename'] = basename(filename)
85 #file_size = stat(filename).st_size
86 #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
87 headers
["Content-File-MD5"] = utils
.md5(filename
)
88 http_header
= ['{}: {}'.format(key
,val
)
89 for (key
,val
) in list(headers
.items())]
90 self
._http
.set_http_header(http_header
)
91 http_code
, resp
= self
._http
.post_cmd(endpoint
=endpoint
, filename
=filename
)
92 #print('HTTP CODE: {}'.format(http_code))
93 #print('RESP: {}'.format(resp))
94 if http_code
in (200, 201, 202, 204):
96 resp
= json
.loads(resp
)
97 if not resp
or 'id' not in resp
:
98 raise ClientException('unexpected response from server - {}'.format(
105 msg
= json
.loads(resp
)
108 raise ClientException("failed to upload package - {}".format(msg
))