Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / __init__.py @ 81c60832

History | View | Annotate | Download (14.7 kB)

1 24851aa5 Stavros Sachtouris
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 a1c50326 Giorgos Verigakis
#
3 a1c50326 Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 a1c50326 Giorgos Verigakis
# without modification, are permitted provided that the following
5 a1c50326 Giorgos Verigakis
# conditions are met:
6 a1c50326 Giorgos Verigakis
#
7 a1c50326 Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 a1c50326 Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 a1c50326 Giorgos Verigakis
#      disclaimer.
10 a1c50326 Giorgos Verigakis
#
11 a1c50326 Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 a1c50326 Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 a1c50326 Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 a1c50326 Giorgos Verigakis
#      provided with the distribution.
15 a1c50326 Giorgos Verigakis
#
16 a1c50326 Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a1c50326 Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a1c50326 Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a1c50326 Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a1c50326 Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a1c50326 Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a1c50326 Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a1c50326 Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a1c50326 Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a1c50326 Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a1c50326 Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a1c50326 Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 a1c50326 Giorgos Verigakis
#
29 a1c50326 Giorgos Verigakis
# The views and conclusions contained in the software and
30 a1c50326 Giorgos Verigakis
# documentation are those of the authors and should not be
31 a1c50326 Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 a1c50326 Giorgos Verigakis
# or implied, of GRNET S.A.
33 a1c50326 Giorgos Verigakis
34 606fe15f Stavros Sachtouris
from kamaki.clients import ClientError
35 55faa0bc Stavros Sachtouris
from kamaki.clients.compute.rest_api import ComputeRestClient
36 a1c50326 Giorgos Verigakis
37 3dabe5d2 Stavros Sachtouris
38 55faa0bc Stavros Sachtouris
class ComputeClient(ComputeRestClient):
39 d2cea1e2 Giorgos Verigakis
    """OpenStack Compute API 1.1 client"""
40 2f749e6e Stavros Sachtouris
41 dbcbf446 Stavros Sachtouris
    def list_servers(
42 dbcbf446 Stavros Sachtouris
            self,
43 dbcbf446 Stavros Sachtouris
            detail=False,
44 dbcbf446 Stavros Sachtouris
            changes_since=None,
45 dbcbf446 Stavros Sachtouris
            image=None,
46 dbcbf446 Stavros Sachtouris
            flavor=None,
47 dbcbf446 Stavros Sachtouris
            name=None,
48 dbcbf446 Stavros Sachtouris
            marker=None,
49 dbcbf446 Stavros Sachtouris
            limit=None,
50 dbcbf446 Stavros Sachtouris
            status=None,
51 dbcbf446 Stavros Sachtouris
            host=None,
52 dbcbf446 Stavros Sachtouris
            response_headers=dict(previous=None, next=None)):
53 a2ef112e Stavros Sachtouris
        """
54 a2ef112e Stavros Sachtouris
        :param detail: if true, append full server details to each item
55 a2ef112e Stavros Sachtouris

56 dbcbf446 Stavros Sachtouris
        :param response_headers: (dict) use it to get previous/next responses
57 dbcbf446 Stavros Sachtouris
            Keep the existing dict format to actually get the server responses
58 dbcbf446 Stavros Sachtouris
            Use it with very long lists or with marker
59 dbcbf446 Stavros Sachtouris

60 a2ef112e Stavros Sachtouris
        :returns: list of server ids and names
61 a2ef112e Stavros Sachtouris
        """
62 dbcbf446 Stavros Sachtouris
        r = self.servers_get(
63 dbcbf446 Stavros Sachtouris
            detail=bool(detail),
64 dbcbf446 Stavros Sachtouris
            changes_since=changes_since,
65 dbcbf446 Stavros Sachtouris
            image=image,
66 dbcbf446 Stavros Sachtouris
            flavor=flavor,
67 dbcbf446 Stavros Sachtouris
            name=name,
68 dbcbf446 Stavros Sachtouris
            marker=marker,
69 dbcbf446 Stavros Sachtouris
            limit=limit,
70 dbcbf446 Stavros Sachtouris
            status=status,
71 dbcbf446 Stavros Sachtouris
            host=host)
72 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
73 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
74 fab9b17f Stavros Sachtouris
        return r.json['servers']
75 3dabe5d2 Stavros Sachtouris
76 dbcbf446 Stavros Sachtouris
    def get_server_details(
77 dbcbf446 Stavros Sachtouris
            self, server_id,
78 dbcbf446 Stavros Sachtouris
            changes_since=None,
79 dbcbf446 Stavros Sachtouris
            image=None,
80 dbcbf446 Stavros Sachtouris
            flavor=None,
81 dbcbf446 Stavros Sachtouris
            name=None,
82 dbcbf446 Stavros Sachtouris
            marker=None,
83 dbcbf446 Stavros Sachtouris
            limit=None,
84 dbcbf446 Stavros Sachtouris
            status=None,
85 dbcbf446 Stavros Sachtouris
            host=None,
86 dbcbf446 Stavros Sachtouris
            response_headers=dict(previous=None, next=None),
87 dbcbf446 Stavros Sachtouris
            **kwargs):
88 a2ef112e Stavros Sachtouris
        """Return detailed info for a server
89 a2ef112e Stavros Sachtouris

90 a2ef112e Stavros Sachtouris
        :param server_id: integer (int or str)
91 a2ef112e Stavros Sachtouris

92 a2ef112e Stavros Sachtouris
        :returns: dict with server details
93 a2ef112e Stavros Sachtouris
        """
94 dbcbf446 Stavros Sachtouris
        r = self.servers_get(
95 dbcbf446 Stavros Sachtouris
            server_id,
96 dbcbf446 Stavros Sachtouris
            changes_since=changes_since,
97 dbcbf446 Stavros Sachtouris
            image=image,
98 dbcbf446 Stavros Sachtouris
            flavor=flavor,
99 dbcbf446 Stavros Sachtouris
            name=name,
100 dbcbf446 Stavros Sachtouris
            marker=marker,
101 dbcbf446 Stavros Sachtouris
            limit=limit,
102 dbcbf446 Stavros Sachtouris
            status=status,
103 dbcbf446 Stavros Sachtouris
            host=host,
104 dbcbf446 Stavros Sachtouris
            **kwargs)
105 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
106 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
107 6a0b1658 Giorgos Verigakis
        return r.json['server']
108 3dabe5d2 Stavros Sachtouris
109 dbcbf446 Stavros Sachtouris
    def create_server(
110 dbcbf446 Stavros Sachtouris
            self, name, flavor_id, image_id,
111 dbcbf446 Stavros Sachtouris
            security_group=None,
112 dbcbf446 Stavros Sachtouris
            user_data=None,
113 dbcbf446 Stavros Sachtouris
            availability_zone=None,
114 dbcbf446 Stavros Sachtouris
            metadata=None,
115 dbcbf446 Stavros Sachtouris
            personality=None,
116 dbcbf446 Stavros Sachtouris
            response_headers=dict(location=None)):
117 a1c50326 Giorgos Verigakis
        """Submit request to create a new server
118 a1c50326 Giorgos Verigakis

119 a2ef112e Stavros Sachtouris
        :param name: (str)
120 a2ef112e Stavros Sachtouris

121 a2ef112e Stavros Sachtouris
        :param flavor_id: integer id denoting a preset hardware configuration
122 a2ef112e Stavros Sachtouris

123 2bd23362 Stavros Sachtouris
        :param image_id: (str) id of the image of the virtual server
124 a1c50326 Giorgos Verigakis

125 dbcbf446 Stavros Sachtouris
        :param metadata: (dict) vm metadata
126 dbcbf446 Stavros Sachtouris

127 a2ef112e Stavros Sachtouris
        :param personality: a list of (file path, file contents) tuples,
128 2bd23362 Stavros Sachtouris
            describing files to be injected into virtual server upon creation
129 a1c50326 Giorgos Verigakis

130 2bd23362 Stavros Sachtouris
        :returns: a dict with the new virtual server details
131 a2ef112e Stavros Sachtouris

132 a2ef112e Stavros Sachtouris
        :raises ClientError: wraps request errors
133 a1c50326 Giorgos Verigakis
        """
134 dbcbf446 Stavros Sachtouris
        req = {'server': {
135 dbcbf446 Stavros Sachtouris
            'name': name, 'flavorRef': flavor_id, 'imageRef': image_id}}
136 dbcbf446 Stavros Sachtouris
137 ae3c77f9 Stavros Sachtouris
        if metadata:
138 ae3c77f9 Stavros Sachtouris
            req['server']['metadata'] = metadata
139 ae3c77f9 Stavros Sachtouris
140 a1c50326 Giorgos Verigakis
        if personality:
141 c4922a05 Giorgos Verigakis
            req['server']['personality'] = personality
142 3dabe5d2 Stavros Sachtouris
143 dbcbf446 Stavros Sachtouris
        r = self.servers_post(
144 dbcbf446 Stavros Sachtouris
            json_data=req,
145 dbcbf446 Stavros Sachtouris
            security_group=security_group,
146 dbcbf446 Stavros Sachtouris
            user_data=user_data,
147 dbcbf446 Stavros Sachtouris
            availability_zone=availability_zone)
148 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
149 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
150 6a0b1658 Giorgos Verigakis
        return r.json['server']
151 3dabe5d2 Stavros Sachtouris
152 a1c50326 Giorgos Verigakis
    def update_server_name(self, server_id, new_name):
153 a2ef112e Stavros Sachtouris
        """Update the name of the server as reported by the API (does not
154 2bd23362 Stavros Sachtouris
            modify the hostname used inside the virtual server)
155 a2ef112e Stavros Sachtouris

156 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
157 a1c50326 Giorgos Verigakis

158 8194b51b Stavros Sachtouris
        :param new_name: (str)
159 cd295a1d Stavros Sachtouris

160 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
161 a1c50326 Giorgos Verigakis
        """
162 6a0b1658 Giorgos Verigakis
        req = {'server': {'name': new_name}}
163 cd295a1d Stavros Sachtouris
        r = self.servers_put(server_id, json_data=req)
164 cd295a1d Stavros Sachtouris
        return r.headers
165 3dabe5d2 Stavros Sachtouris
166 a1c50326 Giorgos Verigakis
    def delete_server(self, server_id):
167 a2ef112e Stavros Sachtouris
        """Submit a deletion request for a server specified by id
168 a2ef112e Stavros Sachtouris

169 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
170 cd295a1d Stavros Sachtouris

171 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
172 a2ef112e Stavros Sachtouris
        """
173 cd295a1d Stavros Sachtouris
        r = self.servers_delete(server_id)
174 cd295a1d Stavros Sachtouris
        return r.headers
175 6ce9fc72 Stavros Sachtouris
176 ef2e6c9f Stavros Sachtouris
    def change_admin_password(self, server_id, new_password):
177 ef2e6c9f Stavros Sachtouris
        """
178 ef2e6c9f Stavros Sachtouris
        :param server_id: (int)
179 ef2e6c9f Stavros Sachtouris

180 ef2e6c9f Stavros Sachtouris
        :param new_password: (str)
181 ef2e6c9f Stavros Sachtouris
        """
182 ef2e6c9f Stavros Sachtouris
        req = {"changePassword": {"adminPass": new_password}}
183 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
184 ef2e6c9f Stavros Sachtouris
        return r.headers
185 ef2e6c9f Stavros Sachtouris
186 ef2e6c9f Stavros Sachtouris
    def rebuild_server(self, server_id, response_headers=dict(location=None)):
187 ef2e6c9f Stavros Sachtouris
        """OS"""
188 ef2e6c9f Stavros Sachtouris
        server = self.get_server_details(server_id)
189 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(
190 ef2e6c9f Stavros Sachtouris
            server_id, json_data=dict(rebuild=server['server']))
191 ef2e6c9f Stavros Sachtouris
        for k, v in response_headers.items():
192 ef2e6c9f Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
193 ef2e6c9f Stavros Sachtouris
        return r.json['server']
194 ef2e6c9f Stavros Sachtouris
195 a1c50326 Giorgos Verigakis
    def reboot_server(self, server_id, hard=False):
196 a2ef112e Stavros Sachtouris
        """
197 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
198 a2ef112e Stavros Sachtouris

199 a2ef112e Stavros Sachtouris
        :param hard: perform a hard reboot if true, soft reboot otherwise
200 a2ef112e Stavros Sachtouris
        """
201 ef2e6c9f Stavros Sachtouris
        req = {'reboot': {'type': 'HARD' if hard else 'SOFT'}}
202 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
203 cd295a1d Stavros Sachtouris
        return r.headers
204 3dabe5d2 Stavros Sachtouris
205 fc7c3c4c Stavros Sachtouris
    def resize_server(self, server_id, flavor_id):
206 fc7c3c4c Stavros Sachtouris
        """
207 fc7c3c4c Stavros Sachtouris
        :param server_id: (str)
208 fc7c3c4c Stavros Sachtouris

209 fc7c3c4c Stavros Sachtouris
        :param flavor_id: (int)
210 fc7c3c4c Stavros Sachtouris

211 fc7c3c4c Stavros Sachtouris
        :returns: (dict) request headers
212 fc7c3c4c Stavros Sachtouris
        """
213 fc7c3c4c Stavros Sachtouris
        req = {'resize': {'flavorRef': flavor_id}}
214 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
215 ef2e6c9f Stavros Sachtouris
        return r.headers
216 ef2e6c9f Stavros Sachtouris
217 ef2e6c9f Stavros Sachtouris
    def confirm_resize_server(self, server_id):
218 ef2e6c9f Stavros Sachtouris
        """OS"""
219 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(
220 ef2e6c9f Stavros Sachtouris
            server_id, json_data=dict(confirmResize=None))
221 ef2e6c9f Stavros Sachtouris
        return r.headers
222 ef2e6c9f Stavros Sachtouris
223 ef2e6c9f Stavros Sachtouris
    def revert_resize_server(self, server_id):
224 ef2e6c9f Stavros Sachtouris
        """OS"""
225 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(
226 ef2e6c9f Stavros Sachtouris
            server_id, json_data=dict(revertResize=None))
227 ef2e6c9f Stavros Sachtouris
        return r.headers
228 ef2e6c9f Stavros Sachtouris
229 ef2e6c9f Stavros Sachtouris
    def create_server_image(self, server_id, image_name, **metadata):
230 ef2e6c9f Stavros Sachtouris
        """OpenStack method for taking snapshots"""
231 ef2e6c9f Stavros Sachtouris
        req = dict(createImage=dict(name=image_name, metadata=metadata))
232 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
233 ef2e6c9f Stavros Sachtouris
        return r.headers['location']
234 ef2e6c9f Stavros Sachtouris
235 ef2e6c9f Stavros Sachtouris
    def start_server(self, server_id):
236 ef2e6c9f Stavros Sachtouris
        """OS Extentions"""
237 ef2e6c9f Stavros Sachtouris
        req = {'os-start': None}
238 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req, success=202)
239 ef2e6c9f Stavros Sachtouris
        return r.headers
240 ef2e6c9f Stavros Sachtouris
241 ef2e6c9f Stavros Sachtouris
    def shutdown_server(self, server_id):
242 ef2e6c9f Stavros Sachtouris
        """OS Extentions"""
243 ef2e6c9f Stavros Sachtouris
        req = {'os-stop': None}
244 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req, success=202)
245 fc7c3c4c Stavros Sachtouris
        return r.headers
246 fc7c3c4c Stavros Sachtouris
247 0b179c69 Stavros Sachtouris
    def get_server_metadata(self, server_id, key='', response_headers=dict(
248 0b179c69 Stavros Sachtouris
            previous=None, next=None)):
249 a2ef112e Stavros Sachtouris
        """
250 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
251 a2ef112e Stavros Sachtouris

252 a2ef112e Stavros Sachtouris
        :param key: (str) the metadatum key (all metadata if not given)
253 a2ef112e Stavros Sachtouris

254 a2ef112e Stavros Sachtouris
        :returns: a key:val dict of requests metadata
255 a2ef112e Stavros Sachtouris
        """
256 0b179c69 Stavros Sachtouris
        r = self.servers_metadata_get(server_id, key)
257 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
258 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
259 7749f75a Stavros Sachtouris
        return r.json['meta' if key else 'metadata']
260 3dabe5d2 Stavros Sachtouris
261 a1c50326 Giorgos Verigakis
    def create_server_metadata(self, server_id, key, val):
262 a2ef112e Stavros Sachtouris
        """
263 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
264 a2ef112e Stavros Sachtouris

265 a2ef112e Stavros Sachtouris
        :param key: (str)
266 a2ef112e Stavros Sachtouris

267 a2ef112e Stavros Sachtouris
        :param val: (str)
268 a2ef112e Stavros Sachtouris

269 a2ef112e Stavros Sachtouris
        :returns: dict of updated key:val metadata
270 a2ef112e Stavros Sachtouris
        """
271 df0045d8 Stavros Sachtouris
        req = {'meta': {key: val}}
272 6d6d5141 Stavros Sachtouris
        r = self.servers_metadata_put(
273 6d6d5141 Stavros Sachtouris
            server_id, key, json_data=req, success=201)
274 df0045d8 Stavros Sachtouris
        return r.json['meta']
275 3dabe5d2 Stavros Sachtouris
276 0b179c69 Stavros Sachtouris
    def update_server_metadata(
277 0b179c69 Stavros Sachtouris
            self, server_id,
278 0b179c69 Stavros Sachtouris
            response_headers=dict(previous=None, next=None), **metadata):
279 a2ef112e Stavros Sachtouris
        """
280 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
281 a2ef112e Stavros Sachtouris

282 a2ef112e Stavros Sachtouris
        :param metadata: dict of key:val metadata
283 a2ef112e Stavros Sachtouris

284 a2ef112e Stavros Sachtouris
        :returns: dict of updated key:val metadata
285 a2ef112e Stavros Sachtouris
        """
286 6a0b1658 Giorgos Verigakis
        req = {'metadata': metadata}
287 6d6d5141 Stavros Sachtouris
        r = self.servers_metadata_post(server_id, json_data=req, success=201)
288 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
289 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
290 6a0b1658 Giorgos Verigakis
        return r.json['metadata']
291 3dabe5d2 Stavros Sachtouris
292 a1c50326 Giorgos Verigakis
    def delete_server_metadata(self, server_id, key):
293 a2ef112e Stavros Sachtouris
        """
294 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
295 a2ef112e Stavros Sachtouris

296 a2ef112e Stavros Sachtouris
        :param key: (str) the meta key
297 cd295a1d Stavros Sachtouris

298 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
299 a2ef112e Stavros Sachtouris
        """
300 6d6d5141 Stavros Sachtouris
        r = self.servers_metadata_delete(server_id, key)
301 cd295a1d Stavros Sachtouris
        return r.headers
302 6666f3b3 Stavros Sachtouris
303 e51c7d5b Stavros Sachtouris
    def list_flavors(self, detail=False, response_headers=dict(
304 e51c7d5b Stavros Sachtouris
            previous=None, next=None)):
305 6666f3b3 Stavros Sachtouris
        """
306 a2ef112e Stavros Sachtouris
        :param detail: (bool) detailed flavor info if set, short if not
307 6666f3b3 Stavros Sachtouris

308 bcef3ac9 Stavros Sachtouris
        :returns: (list) flavor info
309 a2ef112e Stavros Sachtouris
        """
310 e51c7d5b Stavros Sachtouris
        r = self.flavors_get(detail=bool(detail))
311 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
312 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
313 fab9b17f Stavros Sachtouris
        return r.json['flavors']
314 a1c50326 Giorgos Verigakis
315 a1c50326 Giorgos Verigakis
    def get_flavor_details(self, flavor_id):
316 a2ef112e Stavros Sachtouris
        """
317 a2ef112e Stavros Sachtouris
        :param flavor_id: integer (str or int)
318 a2ef112e Stavros Sachtouris

319 a2ef112e Stavros Sachtouris
        :returns: dict
320 a2ef112e Stavros Sachtouris
        """
321 6666f3b3 Stavros Sachtouris
        r = self.flavors_get(flavor_id)
322 6a0b1658 Giorgos Verigakis
        return r.json['flavor']
323 6666f3b3 Stavros Sachtouris
324 e51c7d5b Stavros Sachtouris
    def list_images(self, detail=False, response_headers=dict(
325 e51c7d5b Stavros Sachtouris
            next=None, previous=None)):
326 a2ef112e Stavros Sachtouris
        """
327 a2ef112e Stavros Sachtouris
        :param detail: (bool) detailed info if set, short if not
328 a2ef112e Stavros Sachtouris

329 a2ef112e Stavros Sachtouris
        :returns: dict id,name + full info if detail
330 a2ef112e Stavros Sachtouris
        """
331 e51c7d5b Stavros Sachtouris
        r = self.images_get(detail=bool(detail))
332 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
333 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
334 fab9b17f Stavros Sachtouris
        return r.json['images']
335 3dabe5d2 Stavros Sachtouris
336 71286858 Stavros Sachtouris
    def get_image_details(self, image_id, **kwargs):
337 a2ef112e Stavros Sachtouris
        """
338 a2ef112e Stavros Sachtouris
        :param image_id: integer (str or int)
339 a2ef112e Stavros Sachtouris

340 a2ef112e Stavros Sachtouris
        :returns: dict
341 a2ef112e Stavros Sachtouris

342 a2ef112e Stavros Sachtouris
        :raises ClientError: 404 if image not available
343 a2ef112e Stavros Sachtouris
        """
344 71286858 Stavros Sachtouris
        r = self.images_get(image_id, **kwargs)
345 71286858 Stavros Sachtouris
        try:
346 71286858 Stavros Sachtouris
            return r.json['image']
347 71286858 Stavros Sachtouris
        except KeyError:
348 de73876b Stavros Sachtouris
            raise ClientError('Image not available', 404, details=[
349 de73876b Stavros Sachtouris
                'Image %d not found or not accessible'])
350 3dabe5d2 Stavros Sachtouris
351 a1c50326 Giorgos Verigakis
    def delete_image(self, image_id):
352 a2ef112e Stavros Sachtouris
        """
353 a2ef112e Stavros Sachtouris
        :param image_id: (str)
354 a2ef112e Stavros Sachtouris
        """
355 f5f35422 Stavros Sachtouris
        r = self.images_delete(image_id)
356 f5f35422 Stavros Sachtouris
        return r.headers
357 6666f3b3 Stavros Sachtouris
358 e51c7d5b Stavros Sachtouris
    def get_image_metadata(self, image_id, key='', response_headers=dict(
359 e51c7d5b Stavros Sachtouris
            previous=None, next=None)):
360 a2ef112e Stavros Sachtouris
        """
361 a2ef112e Stavros Sachtouris
        :param image_id: (str)
362 a2ef112e Stavros Sachtouris

363 a2ef112e Stavros Sachtouris
        :param key: (str) the metadatum key
364 a2ef112e Stavros Sachtouris

365 a2ef112e Stavros Sachtouris
        :returns (dict) metadata if key not set, specific metadatum otherwise
366 a2ef112e Stavros Sachtouris
        """
367 e51c7d5b Stavros Sachtouris
        r = self.images_metadata_get(image_id, key)
368 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
369 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
370 7749f75a Stavros Sachtouris
        return r.json['meta' if key else 'metadata']
371 3dabe5d2 Stavros Sachtouris
372 ca5528f1 Stavros Sachtouris
    # def create_image_metadata(self, image_id, key, val):
373 ca5528f1 Stavros Sachtouris
    #     """
374 ca5528f1 Stavros Sachtouris
    #     :param image_id: integer (str or int)
375 a2ef112e Stavros Sachtouris
376 ca5528f1 Stavros Sachtouris
    #     :param key: (str) metadatum key
377 a2ef112e Stavros Sachtouris
378 ca5528f1 Stavros Sachtouris
    #     :param val: (str) metadatum value
379 a2ef112e Stavros Sachtouris
380 ca5528f1 Stavros Sachtouris
    #     :returns: (dict) updated metadata
381 ca5528f1 Stavros Sachtouris
    #     """
382 ca5528f1 Stavros Sachtouris
    #     req = {'meta': {key: val}}
383 ca5528f1 Stavros Sachtouris
    #     r = self.images_metadata_put(image_id, key, json_data=req)
384 ca5528f1 Stavros Sachtouris
    #     return r.json['meta']
385 a1c50326 Giorgos Verigakis
386 e51c7d5b Stavros Sachtouris
    def update_image_metadata(
387 e51c7d5b Stavros Sachtouris
            self, image_id,
388 e51c7d5b Stavros Sachtouris
            response_headers=dict(previous=None, next=None), **metadata):
389 a2ef112e Stavros Sachtouris
        """
390 a2ef112e Stavros Sachtouris
        :param image_id: (str)
391 a2ef112e Stavros Sachtouris

392 a2ef112e Stavros Sachtouris
        :param metadata: dict
393 a2ef112e Stavros Sachtouris

394 a2ef112e Stavros Sachtouris
        :returns: updated metadata
395 a2ef112e Stavros Sachtouris
        """
396 6a0b1658 Giorgos Verigakis
        req = {'metadata': metadata}
397 e51c7d5b Stavros Sachtouris
        r = self.images_metadata_post(image_id, json_data=req)
398 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
399 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
400 6a0b1658 Giorgos Verigakis
        return r.json['metadata']
401 a1c50326 Giorgos Verigakis
402 a1c50326 Giorgos Verigakis
    def delete_image_metadata(self, image_id, key):
403 a2ef112e Stavros Sachtouris
        """
404 a2ef112e Stavros Sachtouris
        :param image_id: (str)
405 a2ef112e Stavros Sachtouris

406 a2ef112e Stavros Sachtouris
        :param key: (str) metadatum key
407 cd295a1d Stavros Sachtouris

408 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
409 a2ef112e Stavros Sachtouris
        """
410 6d6d5141 Stavros Sachtouris
        r = self.images_metadata_delete(image_id, key)
411 f5f35422 Stavros Sachtouris
        return r.headers
412 03033b54 Stavros Sachtouris
413 03033b54 Stavros Sachtouris
    def get_floating_ip_pools(self, tenant_id):
414 03033b54 Stavros Sachtouris
        """
415 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
416 03033b54 Stavros Sachtouris

417 03033b54 Stavros Sachtouris
        :returns: (dict) {floating_ip_pools:[{name: ...}, ...]}
418 03033b54 Stavros Sachtouris
        """
419 03033b54 Stavros Sachtouris
        r = self.floating_ip_pools_get(tenant_id)
420 03033b54 Stavros Sachtouris
        return r.json
421 03033b54 Stavros Sachtouris
422 03033b54 Stavros Sachtouris
    def get_floating_ips(self, tenant_id):
423 03033b54 Stavros Sachtouris
        """
424 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
425 03033b54 Stavros Sachtouris

426 03033b54 Stavros Sachtouris
        :returns: (dict) {floating_ips:[
427 03033b54 Stavros Sachtouris
            {fixed_ip: ..., id: ..., instance_id: ..., ip: ..., pool: ...},
428 03033b54 Stavros Sachtouris
            ... ]}
429 03033b54 Stavros Sachtouris
        """
430 03033b54 Stavros Sachtouris
        r = self.floating_ips_get(tenant_id)
431 03033b54 Stavros Sachtouris
        return r.json
432 03033b54 Stavros Sachtouris
433 03033b54 Stavros Sachtouris
    def alloc_floating_ip(self, tenant_id, pool=None):
434 03033b54 Stavros Sachtouris
        """
435 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
436 03033b54 Stavros Sachtouris

437 03033b54 Stavros Sachtouris
        :param pool: (str) pool of ips to allocate from
438 03033b54 Stavros Sachtouris

439 d252a7a8 Stavros Sachtouris
        :returns: (dict) {fixed_ip: . id: . instance_id: . ip: . pool: .}
440 03033b54 Stavros Sachtouris
        """
441 03033b54 Stavros Sachtouris
        json_data = dict(pool=pool) if pool else dict()
442 03033b54 Stavros Sachtouris
        r = self.floating_ips_post(tenant_id, json_data)
443 03033b54 Stavros Sachtouris
        return r.json['floating_ip']
444 03033b54 Stavros Sachtouris
445 03033b54 Stavros Sachtouris
    def get_floating_ip(self, tenant_id, fip_id=None):
446 03033b54 Stavros Sachtouris
        """
447 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
448 03033b54 Stavros Sachtouris

449 03033b54 Stavros Sachtouris
        :param fip_id: (str) floating ip id (if None, all ips are returned)
450 03033b54 Stavros Sachtouris

451 03033b54 Stavros Sachtouris
        :returns: (list) [
452 03033b54 Stavros Sachtouris
            {fixed_ip: ..., id: ..., instance_id: ..., ip: ..., pool: ...},
453 03033b54 Stavros Sachtouris
            ... ]
454 03033b54 Stavros Sachtouris
        """
455 03033b54 Stavros Sachtouris
        r = self.floating_ips_get(tenant_id, fip_id)
456 03033b54 Stavros Sachtouris
        return r.json['floating_ips']
457 03033b54 Stavros Sachtouris
458 03033b54 Stavros Sachtouris
    def delete_floating_ip(self, tenant_id, fip_id=None):
459 03033b54 Stavros Sachtouris
        """
460 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
461 03033b54 Stavros Sachtouris

462 03033b54 Stavros Sachtouris
        :param fip_id: (str) floating ip id (if None, all ips are deleted)
463 03033b54 Stavros Sachtouris

464 03033b54 Stavros Sachtouris
        :returns: (dict) request headers
465 03033b54 Stavros Sachtouris
        """
466 03033b54 Stavros Sachtouris
        r = self.floating_ips_delete(tenant_id, fip_id)
467 03033b54 Stavros Sachtouris
        return r.headers