bc77a8d9132f6de0e0878c1f5db340a0645481c4
[osm/osmclient.git] / osmclient / sol005 / vnfd.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 vnfd API handling
19 """
20
21 from osmclient.common.exceptions import NotFound
22 from osmclient.common.exceptions import ClientException
23 from osmclient.common import utils
24 import yaml
25 import magic
26 #from os import stat
27 #from os.path import basename
28
29 class Vnfd(object):
30
31 def __init__(self, http=None, client=None):
32 self._http = http
33 self._client = client
34 self._apiName = '/vnfpkgm'
35 self._apiVersion = '/v1'
36 self._apiResource = '/vnf_packages'
37 self._apiBase = '{}{}{}'.format(self._apiName,
38 self._apiVersion, self._apiResource)
39 #self._apiBase='/vnfds'
40
41 def list(self, filter=None):
42 filter_string = ''
43 if filter:
44 filter_string = '?{}'.format(filter)
45 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
46 if resp:
47 return resp
48 return list()
49
50 def get(self, name):
51 if utils.validate_uuid4(name):
52 for vnfd in self.list():
53 if name == vnfd['_id']:
54 return vnfd
55 else:
56 for vnfd in self.list():
57 if 'name' in vnfd and name == vnfd['name']:
58 return vnfd
59 raise NotFound("vnfd {} not found".format(name))
60
61 def get_individual(self, name):
62 vnfd = self.get(name)
63 # It is redundant, since the previous one already gets the whole vnfpkginfo
64 # The only difference is that a different primitive is exercised
65 resp = self._http.get_cmd('{}/{}'.format(self._apiBase, vnfd['_id']))
66 #print yaml.safe_dump(resp)
67 if resp:
68 return resp
69 raise NotFound("vnfd {} not found".format(name))
70
71 def get_thing(self, name, thing, filename):
72 vnfd = self.get(name)
73 headers = self._client._headers
74 headers['Accept'] = 'application/binary'
75 resp2 = self._http.get2_cmd('{}/{}/{}'.format(self._apiBase, vnfd['_id'], thing))
76 #print yaml.safe_dump(resp2)
77 if resp2:
78 #store in a file
79 return resp2
80 raise NotFound("vnfd {} not found".format(name))
81
82 def get_descriptor(self, name, filename):
83 self.get_thing(name, 'vnfd', filename)
84
85 def get_package(self, name, filename):
86 self.get_thing(name, 'package_content', filename)
87
88 def get_artifact(self, name, artifact, filename):
89 self.get_thing(name, 'artifacts/{}'.format(artifact), filename)
90
91 def delete(self, name):
92 vnfd = self.get(name)
93 resp = self._http.delete_cmd('{}/{}'.format(self._apiBase,vnfd['_id']))
94 #print 'RESP: '.format(resp)
95 if resp is None:
96 print 'Deleted'
97 else:
98 raise ClientException("failed to delete vnfd {}: {}".format(name, resp))
99
100 def create(self, filename, overwrite=None, update_endpoint=None):
101 mime_type = magic.from_file(filename, mime=True)
102 if mime_type is None:
103 raise ClientException(
104 "failed to guess MIME type for file '{}'".format(filename))
105 headers= self._client._headers
106 if mime_type in ['application/yaml', 'text/plain']:
107 headers['Content-Type'] = 'application/yaml'
108 elif mime_type == 'application/gzip':
109 headers['Content-Type'] = 'application/gzip'
110 #headers['Content-Type'] = 'application/binary'
111 # Next three lines are to be removed in next version
112 #headers['Content-Filename'] = basename(filename)
113 #file_size = stat(filename).st_size
114 #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
115 else:
116 raise ClientException(
117 "Unexpected MIME type for file {}: MIME type {}".format(
118 filename, mime_type)
119 )
120 headers["Content-File-MD5"] = utils.md5(filename)
121 http_header = ['{}: {}'.format(key,val)
122 for (key,val) in headers.items()]
123 self._http.set_http_header(http_header)
124 if update_endpoint:
125 resp = self._http.put_cmd(endpoint=update_endpoint, filename=filename)
126 else:
127 ow_string = ''
128 if overwrite:
129 ow_string = '?{}'.format(overwrite)
130 self._apiResource = '/vnf_packages_content'
131 self._apiBase = '{}{}{}'.format(self._apiName,
132 self._apiVersion, self._apiResource)
133 endpoint = '{}{}'.format(self._apiBase,ow_string)
134 resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
135 #print resp
136 if not resp or 'id' not in resp:
137 raise ClientException("failed to upload package")
138 else:
139 print resp['id']
140
141 def update(self, name, filename):
142 vnfd = self.get(name)
143 endpoint = '{}/{}/vnfd_content'.format(self._apiBase, vnfd['_id'])
144 self.create(filename=filename, update_endpoint=endpoint)
145