Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / __init__.py @ 264a13f7

History | View | Annotate | Download (14.8 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 264a13f7 Stavros Sachtouris
            networks=None,
117 dbcbf446 Stavros Sachtouris
            response_headers=dict(location=None)):
118 a1c50326 Giorgos Verigakis
        """Submit request to create a new server
119 a1c50326 Giorgos Verigakis

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

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

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

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

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

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

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

160 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
161 a1c50326 Giorgos Verigakis

162 8194b51b Stavros Sachtouris
        :param new_name: (str)
163 cd295a1d Stavros Sachtouris

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

173 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
174 cd295a1d Stavros Sachtouris

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

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

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

213 fc7c3c4c Stavros Sachtouris
        :param flavor_id: (int)
214 fc7c3c4c Stavros Sachtouris

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

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

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

269 a2ef112e Stavros Sachtouris
        :param key: (str)
270 a2ef112e Stavros Sachtouris

271 a2ef112e Stavros Sachtouris
        :param val: (str)
272 a2ef112e Stavros Sachtouris

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

286 a2ef112e Stavros Sachtouris
        :param metadata: dict of key:val metadata
287 a2ef112e Stavros Sachtouris

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

300 a2ef112e Stavros Sachtouris
        :param key: (str) the meta key
301 cd295a1d Stavros Sachtouris

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

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

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

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

344 a2ef112e Stavros Sachtouris
        :returns: dict
345 a2ef112e Stavros Sachtouris

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

367 a2ef112e Stavros Sachtouris
        :param key: (str) the metadatum key
368 a2ef112e Stavros Sachtouris

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

396 a2ef112e Stavros Sachtouris
        :param metadata: dict
397 a2ef112e Stavros Sachtouris

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

410 a2ef112e Stavros Sachtouris
        :param key: (str) metadatum key
411 cd295a1d Stavros Sachtouris

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

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

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

441 03033b54 Stavros Sachtouris
        :param pool: (str) pool of ips to allocate from
442 03033b54 Stavros Sachtouris

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

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

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

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

468 03033b54 Stavros Sachtouris
        :returns: (dict) request headers
469 03033b54 Stavros Sachtouris
        """
470 03033b54 Stavros Sachtouris
        r = self.floating_ips_delete(tenant_id, fip_id)
471 03033b54 Stavros Sachtouris
        return r.headers