Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / __init__.py @ 1c366ac9

History | View | Annotate | Download (14.1 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 eb647cfe Stavros Sachtouris
        :param networks: (list of dicts) Networks to connect to, list this:
132 eb647cfe Stavros Sachtouris
            "networks": [
133 1c366ac9 Stavros Sachtouris
            {"network": <network_uuid>},
134 1c366ac9 Stavros Sachtouris
            {"network": <network_uuid>, "fixed_ip": address},
135 1c366ac9 Stavros Sachtouris
            {"port": <port_id>}, ...]
136 eb647cfe Stavros Sachtouris
            ATTENTION: Empty list is different to None. None means ' do not
137 eb647cfe Stavros Sachtouris
            mention it', empty list means 'automatically get an ip'
138 eb647cfe Stavros Sachtouris

139 2bd23362 Stavros Sachtouris
        :returns: a dict with the new virtual server details
140 a2ef112e Stavros Sachtouris

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

168 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
169 a1c50326 Giorgos Verigakis

170 8194b51b Stavros Sachtouris
        :param new_name: (str)
171 cd295a1d Stavros Sachtouris

172 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
173 a1c50326 Giorgos Verigakis
        """
174 6a0b1658 Giorgos Verigakis
        req = {'server': {'name': new_name}}
175 cd295a1d Stavros Sachtouris
        r = self.servers_put(server_id, json_data=req)
176 cd295a1d Stavros Sachtouris
        return r.headers
177 3dabe5d2 Stavros Sachtouris
178 a1c50326 Giorgos Verigakis
    def delete_server(self, server_id):
179 a2ef112e Stavros Sachtouris
        """Submit a deletion request for a server specified by id
180 a2ef112e Stavros Sachtouris

181 a2ef112e Stavros Sachtouris
        :param server_id: integer (str or int)
182 cd295a1d Stavros Sachtouris

183 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
184 a2ef112e Stavros Sachtouris
        """
185 cd295a1d Stavros Sachtouris
        r = self.servers_delete(server_id)
186 cd295a1d Stavros Sachtouris
        return r.headers
187 6ce9fc72 Stavros Sachtouris
188 ef2e6c9f Stavros Sachtouris
    def change_admin_password(self, server_id, new_password):
189 ef2e6c9f Stavros Sachtouris
        """
190 ef2e6c9f Stavros Sachtouris
        :param server_id: (int)
191 ef2e6c9f Stavros Sachtouris

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

211 a2ef112e Stavros Sachtouris
        :param hard: perform a hard reboot if true, soft reboot otherwise
212 a2ef112e Stavros Sachtouris
        """
213 ef2e6c9f Stavros Sachtouris
        req = {'reboot': {'type': 'HARD' if hard else 'SOFT'}}
214 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
215 cd295a1d Stavros Sachtouris
        return r.headers
216 3dabe5d2 Stavros Sachtouris
217 fc7c3c4c Stavros Sachtouris
    def resize_server(self, server_id, flavor_id):
218 fc7c3c4c Stavros Sachtouris
        """
219 fc7c3c4c Stavros Sachtouris
        :param server_id: (str)
220 fc7c3c4c Stavros Sachtouris

221 fc7c3c4c Stavros Sachtouris
        :param flavor_id: (int)
222 fc7c3c4c Stavros Sachtouris

223 fc7c3c4c Stavros Sachtouris
        :returns: (dict) request headers
224 fc7c3c4c Stavros Sachtouris
        """
225 fc7c3c4c Stavros Sachtouris
        req = {'resize': {'flavorRef': flavor_id}}
226 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
227 ef2e6c9f Stavros Sachtouris
        return r.headers
228 ef2e6c9f Stavros Sachtouris
229 ef2e6c9f Stavros Sachtouris
    def confirm_resize_server(self, server_id):
230 ef2e6c9f Stavros Sachtouris
        """OS"""
231 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(
232 ef2e6c9f Stavros Sachtouris
            server_id, json_data=dict(confirmResize=None))
233 ef2e6c9f Stavros Sachtouris
        return r.headers
234 ef2e6c9f Stavros Sachtouris
235 ef2e6c9f Stavros Sachtouris
    def revert_resize_server(self, server_id):
236 ef2e6c9f Stavros Sachtouris
        """OS"""
237 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(
238 ef2e6c9f Stavros Sachtouris
            server_id, json_data=dict(revertResize=None))
239 ef2e6c9f Stavros Sachtouris
        return r.headers
240 ef2e6c9f Stavros Sachtouris
241 ef2e6c9f Stavros Sachtouris
    def create_server_image(self, server_id, image_name, **metadata):
242 ef2e6c9f Stavros Sachtouris
        """OpenStack method for taking snapshots"""
243 ef2e6c9f Stavros Sachtouris
        req = dict(createImage=dict(name=image_name, metadata=metadata))
244 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req)
245 ef2e6c9f Stavros Sachtouris
        return r.headers['location']
246 ef2e6c9f Stavros Sachtouris
247 ef2e6c9f Stavros Sachtouris
    def start_server(self, server_id):
248 ef2e6c9f Stavros Sachtouris
        """OS Extentions"""
249 ef2e6c9f Stavros Sachtouris
        req = {'os-start': None}
250 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req, success=202)
251 ef2e6c9f Stavros Sachtouris
        return r.headers
252 ef2e6c9f Stavros Sachtouris
253 ef2e6c9f Stavros Sachtouris
    def shutdown_server(self, server_id):
254 ef2e6c9f Stavros Sachtouris
        """OS Extentions"""
255 ef2e6c9f Stavros Sachtouris
        req = {'os-stop': None}
256 ef2e6c9f Stavros Sachtouris
        r = self.servers_action_post(server_id, json_data=req, success=202)
257 fc7c3c4c Stavros Sachtouris
        return r.headers
258 fc7c3c4c Stavros Sachtouris
259 0b179c69 Stavros Sachtouris
    def get_server_metadata(self, server_id, key='', response_headers=dict(
260 0b179c69 Stavros Sachtouris
            previous=None, next=None)):
261 0b179c69 Stavros Sachtouris
        r = self.servers_metadata_get(server_id, key)
262 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
263 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
264 7749f75a Stavros Sachtouris
        return r.json['meta' if key else 'metadata']
265 3dabe5d2 Stavros Sachtouris
266 a1c50326 Giorgos Verigakis
    def create_server_metadata(self, server_id, key, val):
267 df0045d8 Stavros Sachtouris
        req = {'meta': {key: val}}
268 6d6d5141 Stavros Sachtouris
        r = self.servers_metadata_put(
269 6d6d5141 Stavros Sachtouris
            server_id, key, json_data=req, success=201)
270 df0045d8 Stavros Sachtouris
        return r.json['meta']
271 3dabe5d2 Stavros Sachtouris
272 0b179c69 Stavros Sachtouris
    def update_server_metadata(
273 0b179c69 Stavros Sachtouris
            self, server_id,
274 0b179c69 Stavros Sachtouris
            response_headers=dict(previous=None, next=None), **metadata):
275 6a0b1658 Giorgos Verigakis
        req = {'metadata': metadata}
276 6d6d5141 Stavros Sachtouris
        r = self.servers_metadata_post(server_id, json_data=req, success=201)
277 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
278 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
279 6a0b1658 Giorgos Verigakis
        return r.json['metadata']
280 3dabe5d2 Stavros Sachtouris
281 a1c50326 Giorgos Verigakis
    def delete_server_metadata(self, server_id, key):
282 6d6d5141 Stavros Sachtouris
        r = self.servers_metadata_delete(server_id, key)
283 cd295a1d Stavros Sachtouris
        return r.headers
284 6666f3b3 Stavros Sachtouris
285 e51c7d5b Stavros Sachtouris
    def list_flavors(self, detail=False, response_headers=dict(
286 e51c7d5b Stavros Sachtouris
            previous=None, next=None)):
287 e51c7d5b Stavros Sachtouris
        r = self.flavors_get(detail=bool(detail))
288 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
289 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
290 fab9b17f Stavros Sachtouris
        return r.json['flavors']
291 a1c50326 Giorgos Verigakis
292 a1c50326 Giorgos Verigakis
    def get_flavor_details(self, flavor_id):
293 6666f3b3 Stavros Sachtouris
        r = self.flavors_get(flavor_id)
294 6a0b1658 Giorgos Verigakis
        return r.json['flavor']
295 6666f3b3 Stavros Sachtouris
296 e51c7d5b Stavros Sachtouris
    def list_images(self, detail=False, response_headers=dict(
297 e51c7d5b Stavros Sachtouris
            next=None, previous=None)):
298 e51c7d5b Stavros Sachtouris
        r = self.images_get(detail=bool(detail))
299 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
300 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
301 fab9b17f Stavros Sachtouris
        return r.json['images']
302 3dabe5d2 Stavros Sachtouris
303 71286858 Stavros Sachtouris
    def get_image_details(self, image_id, **kwargs):
304 a2ef112e Stavros Sachtouris
        """
305 a2ef112e Stavros Sachtouris
        :returns: dict
306 a2ef112e Stavros Sachtouris

307 a2ef112e Stavros Sachtouris
        :raises ClientError: 404 if image not available
308 a2ef112e Stavros Sachtouris
        """
309 71286858 Stavros Sachtouris
        r = self.images_get(image_id, **kwargs)
310 71286858 Stavros Sachtouris
        try:
311 71286858 Stavros Sachtouris
            return r.json['image']
312 71286858 Stavros Sachtouris
        except KeyError:
313 de73876b Stavros Sachtouris
            raise ClientError('Image not available', 404, details=[
314 de73876b Stavros Sachtouris
                'Image %d not found or not accessible'])
315 3dabe5d2 Stavros Sachtouris
316 a1c50326 Giorgos Verigakis
    def delete_image(self, image_id):
317 a2ef112e Stavros Sachtouris
        """
318 a2ef112e Stavros Sachtouris
        :param image_id: (str)
319 a2ef112e Stavros Sachtouris
        """
320 f5f35422 Stavros Sachtouris
        r = self.images_delete(image_id)
321 f5f35422 Stavros Sachtouris
        return r.headers
322 6666f3b3 Stavros Sachtouris
323 e51c7d5b Stavros Sachtouris
    def get_image_metadata(self, image_id, key='', response_headers=dict(
324 e51c7d5b Stavros Sachtouris
            previous=None, next=None)):
325 a2ef112e Stavros Sachtouris
        """
326 a2ef112e Stavros Sachtouris
        :param image_id: (str)
327 a2ef112e Stavros Sachtouris

328 a2ef112e Stavros Sachtouris
        :param key: (str) the metadatum key
329 a2ef112e Stavros Sachtouris

330 a2ef112e Stavros Sachtouris
        :returns (dict) metadata if key not set, specific metadatum otherwise
331 a2ef112e Stavros Sachtouris
        """
332 e51c7d5b Stavros Sachtouris
        r = self.images_metadata_get(image_id, key)
333 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
334 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
335 7749f75a Stavros Sachtouris
        return r.json['meta' if key else 'metadata']
336 3dabe5d2 Stavros Sachtouris
337 ca5528f1 Stavros Sachtouris
    # def create_image_metadata(self, image_id, key, val):
338 ca5528f1 Stavros Sachtouris
    #     """
339 ca5528f1 Stavros Sachtouris
    #     :param image_id: integer (str or int)
340 a2ef112e Stavros Sachtouris
341 ca5528f1 Stavros Sachtouris
    #     :param key: (str) metadatum key
342 a2ef112e Stavros Sachtouris
343 ca5528f1 Stavros Sachtouris
    #     :param val: (str) metadatum value
344 a2ef112e Stavros Sachtouris
345 ca5528f1 Stavros Sachtouris
    #     :returns: (dict) updated metadata
346 ca5528f1 Stavros Sachtouris
    #     """
347 ca5528f1 Stavros Sachtouris
    #     req = {'meta': {key: val}}
348 ca5528f1 Stavros Sachtouris
    #     r = self.images_metadata_put(image_id, key, json_data=req)
349 ca5528f1 Stavros Sachtouris
    #     return r.json['meta']
350 a1c50326 Giorgos Verigakis
351 e51c7d5b Stavros Sachtouris
    def update_image_metadata(
352 e51c7d5b Stavros Sachtouris
            self, image_id,
353 e51c7d5b Stavros Sachtouris
            response_headers=dict(previous=None, next=None), **metadata):
354 a2ef112e Stavros Sachtouris
        """
355 a2ef112e Stavros Sachtouris
        :param image_id: (str)
356 a2ef112e Stavros Sachtouris

357 a2ef112e Stavros Sachtouris
        :param metadata: dict
358 a2ef112e Stavros Sachtouris

359 a2ef112e Stavros Sachtouris
        :returns: updated metadata
360 a2ef112e Stavros Sachtouris
        """
361 6a0b1658 Giorgos Verigakis
        req = {'metadata': metadata}
362 e51c7d5b Stavros Sachtouris
        r = self.images_metadata_post(image_id, json_data=req)
363 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
364 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
365 6a0b1658 Giorgos Verigakis
        return r.json['metadata']
366 a1c50326 Giorgos Verigakis
367 a1c50326 Giorgos Verigakis
    def delete_image_metadata(self, image_id, key):
368 a2ef112e Stavros Sachtouris
        """
369 a2ef112e Stavros Sachtouris
        :param image_id: (str)
370 a2ef112e Stavros Sachtouris

371 a2ef112e Stavros Sachtouris
        :param key: (str) metadatum key
372 cd295a1d Stavros Sachtouris

373 cd295a1d Stavros Sachtouris
        :returns: (dict) response headers
374 a2ef112e Stavros Sachtouris
        """
375 6d6d5141 Stavros Sachtouris
        r = self.images_metadata_delete(image_id, key)
376 f5f35422 Stavros Sachtouris
        return r.headers
377 03033b54 Stavros Sachtouris
378 03033b54 Stavros Sachtouris
    def get_floating_ip_pools(self, tenant_id):
379 03033b54 Stavros Sachtouris
        """
380 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
381 03033b54 Stavros Sachtouris

382 03033b54 Stavros Sachtouris
        :returns: (dict) {floating_ip_pools:[{name: ...}, ...]}
383 03033b54 Stavros Sachtouris
        """
384 03033b54 Stavros Sachtouris
        r = self.floating_ip_pools_get(tenant_id)
385 03033b54 Stavros Sachtouris
        return r.json
386 03033b54 Stavros Sachtouris
387 03033b54 Stavros Sachtouris
    def get_floating_ips(self, tenant_id):
388 03033b54 Stavros Sachtouris
        """
389 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
390 03033b54 Stavros Sachtouris

391 03033b54 Stavros Sachtouris
        :returns: (dict) {floating_ips:[
392 03033b54 Stavros Sachtouris
            {fixed_ip: ..., id: ..., instance_id: ..., ip: ..., pool: ...},
393 03033b54 Stavros Sachtouris
            ... ]}
394 03033b54 Stavros Sachtouris
        """
395 03033b54 Stavros Sachtouris
        r = self.floating_ips_get(tenant_id)
396 03033b54 Stavros Sachtouris
        return r.json
397 03033b54 Stavros Sachtouris
398 03033b54 Stavros Sachtouris
    def alloc_floating_ip(self, tenant_id, pool=None):
399 03033b54 Stavros Sachtouris
        """
400 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
401 03033b54 Stavros Sachtouris

402 03033b54 Stavros Sachtouris
        :param pool: (str) pool of ips to allocate from
403 03033b54 Stavros Sachtouris

404 d252a7a8 Stavros Sachtouris
        :returns: (dict) {fixed_ip: . id: . instance_id: . ip: . pool: .}
405 03033b54 Stavros Sachtouris
        """
406 03033b54 Stavros Sachtouris
        json_data = dict(pool=pool) if pool else dict()
407 03033b54 Stavros Sachtouris
        r = self.floating_ips_post(tenant_id, json_data)
408 03033b54 Stavros Sachtouris
        return r.json['floating_ip']
409 03033b54 Stavros Sachtouris
410 03033b54 Stavros Sachtouris
    def get_floating_ip(self, tenant_id, fip_id=None):
411 03033b54 Stavros Sachtouris
        """
412 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
413 03033b54 Stavros Sachtouris

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

416 03033b54 Stavros Sachtouris
        :returns: (list) [
417 03033b54 Stavros Sachtouris
            {fixed_ip: ..., id: ..., instance_id: ..., ip: ..., pool: ...},
418 03033b54 Stavros Sachtouris
            ... ]
419 03033b54 Stavros Sachtouris
        """
420 03033b54 Stavros Sachtouris
        r = self.floating_ips_get(tenant_id, fip_id)
421 03033b54 Stavros Sachtouris
        return r.json['floating_ips']
422 03033b54 Stavros Sachtouris
423 03033b54 Stavros Sachtouris
    def delete_floating_ip(self, tenant_id, fip_id=None):
424 03033b54 Stavros Sachtouris
        """
425 03033b54 Stavros Sachtouris
        :param tenant_id: (str)
426 03033b54 Stavros Sachtouris

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

429 03033b54 Stavros Sachtouris
        :returns: (dict) request headers
430 03033b54 Stavros Sachtouris
        """
431 03033b54 Stavros Sachtouris
        r = self.floating_ips_delete(tenant_id, fip_id)
432 03033b54 Stavros Sachtouris
        return r.headers