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