new commands: ns-op-list, ns-op-show, ns-action
[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 http_code, 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 http_code, resp = self._http.delete_cmd('{}/{}'.format(self._apiBase,vnfd['_id']))
94 #print 'RESP: {}'.format(resp)
95 if http_code == 202:
96 print 'Deletion in progress'
97 elif http_code == 204:
98 print 'Deleted'
99 else:
100 raise ClientException("failed to delete vnfd {}: {}".format(name, resp))
101
102 def create(self, filename, overwrite=None, update_endpoint=None):
103 mime_type = magic.from_file(filename, mime=True)
104 if mime_type is None:
105 raise ClientException(
106 "failed to guess MIME type for file '{}'".format(filename))
107 headers= self._client._headers
108 if mime_type in ['application/yaml', 'text/plain']:
109 headers['Content-Type'] = 'application/yaml'
110 elif mime_type == 'application/gzip':
111 headers['Content-Type'] = 'application/gzip'
112 #headers['Content-Type'] = 'application/binary'
113 # Next three lines are to be removed in next version
114 #headers['Content-Filename'] = basename(filename)
115 #file_size = stat(filename).st_size
116 #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
117 else:
118 raise ClientException(
119 "Unexpected MIME type for file {}: MIME type {}".format(
120 filename, mime_type)
121 )
122 headers["Content-File-MD5"] = utils.md5(filename)
123 http_header = ['{}: {}'.format(key,val)
124 for (key,val) in headers.items()]
125 self._http.set_http_header(http_header)
126 if update_endpoint:
127 resp = self._http.put_cmd(endpoint=update_endpoint, filename=filename)
128 else:
129 ow_string = ''
130 if overwrite:
131 ow_string = '?{}'.format(overwrite)
132 self._apiResource = '/vnf_packages_content'
133 self._apiBase = '{}{}{}'.format(self._apiName,
134 self._apiVersion, self._apiResource)
135 endpoint = '{}{}'.format(self._apiBase,ow_string)
136 resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
137 #print resp
138 if not resp or 'id' not in resp:
139 raise ClientException("failed to upload package")
140 else:
141 print resp['id']
142
143 def update(self, name, filename):
144 vnfd = self.get(name)
145 endpoint = '{}/{}/vnfd_content'.format(self._apiBase, vnfd['_id'])
146 self.create(filename=filename, update_endpoint=endpoint)
147