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