Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / __init__.py @ 6d6d5141

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 c270fe96 Stavros Sachtouris
from kamaki.clients.utils import path4url
37 a1c50326 Giorgos Verigakis
38 3dabe5d2 Stavros Sachtouris
39 55faa0bc Stavros Sachtouris
class ComputeClient(ComputeRestClient):
40 d2cea1e2 Giorgos Verigakis
    """OpenStack Compute API 1.1 client"""
41 2f749e6e Stavros Sachtouris
42 dbcbf446 Stavros Sachtouris
    def list_servers(
43 dbcbf446 Stavros Sachtouris
            self,
44 dbcbf446 Stavros Sachtouris
            detail=False,
45 dbcbf446 Stavros Sachtouris
            changes_since=None,
46 dbcbf446 Stavros Sachtouris
            image=None,
47 dbcbf446 Stavros Sachtouris
            flavor=None,
48 dbcbf446 Stavros Sachtouris
            name=None,
49 dbcbf446 Stavros Sachtouris
            marker=None,
50 dbcbf446 Stavros Sachtouris
            limit=None,
51 dbcbf446 Stavros Sachtouris
            status=None,
52 dbcbf446 Stavros Sachtouris
            host=None,
53 dbcbf446 Stavros Sachtouris
            response_headers=dict(previous=None, next=None)):
54 a2ef112e Stavros Sachtouris
        """
55 a2ef112e Stavros Sachtouris
        :param detail: if true, append full server details to each item
56 a2ef112e Stavros Sachtouris

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

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

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

93 a2ef112e Stavros Sachtouris
        :returns: dict with server details
94 a2ef112e Stavros Sachtouris
        """
95 dbcbf446 Stavros Sachtouris
        r = self.servers_get(
96 dbcbf446 Stavros Sachtouris
            server_id,
97 dbcbf446 Stavros Sachtouris
            changes_since=changes_since,
98 dbcbf446 Stavros Sachtouris
            image=image,
99 dbcbf446 Stavros Sachtouris
            flavor=flavor,
100 dbcbf446 Stavros Sachtouris
            name=name,
101 dbcbf446 Stavros Sachtouris
            marker=marker,
102 dbcbf446 Stavros Sachtouris
            limit=limit,
103 dbcbf446 Stavros Sachtouris
            status=status,
104 dbcbf446 Stavros Sachtouris
            host=host,
105 dbcbf446 Stavros Sachtouris
            **kwargs)
106 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
107 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
108 6a0b1658 Giorgos Verigakis
        return r.json['server']
109 3dabe5d2 Stavros Sachtouris
110 dbcbf446 Stavros Sachtouris
    def create_server(
111 dbcbf446 Stavros Sachtouris
            self, name, flavor_id, image_id,
112 dbcbf446 Stavros Sachtouris
            security_group=None,
113 dbcbf446 Stavros Sachtouris
            user_data=None,
114 dbcbf446 Stavros Sachtouris
            availability_zone=None,
115 dbcbf446 Stavros Sachtouris
            metadata=None,
116 dbcbf446 Stavros Sachtouris
            personality=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 a2ef112e Stavros Sachtouris
        :param image_id: (str) id denoting the OS image to run on the VM
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 a2ef112e Stavros Sachtouris
            describing files to be injected into VM upon creation.
130 a1c50326 Giorgos Verigakis

131 a2ef112e Stavros Sachtouris
        :returns: a dict with the new VMs 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 dbcbf446 Stavros Sachtouris
        r = self.servers_post(
145 dbcbf446 Stavros Sachtouris
            json_data=req,
146 dbcbf446 Stavros Sachtouris
            security_group=security_group,
147 dbcbf446 Stavros Sachtouris
            user_data=user_data,
148 dbcbf446 Stavros Sachtouris
            availability_zone=availability_zone)
149 0b179c69 Stavros Sachtouris
        for k, v in response_headers.items():
150 0b179c69 Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
151 6a0b1658 Giorgos Verigakis
        return r.json['server']
152 3dabe5d2 Stavros Sachtouris
153 a1c50326 Giorgos Verigakis
    def update_server_name(self, server_id, new_name):
154 a2ef112e Stavros Sachtouris
        """Update the name of the server as reported by the API (does not
155 a2ef112e Stavros Sachtouris
            modify the hostname used inside the VM)
156 a2ef112e Stavros Sachtouris

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

341 a2ef112e Stavros Sachtouris
        :returns: dict
342 a2ef112e Stavros Sachtouris

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

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

366 a2ef112e Stavros Sachtouris
        :returns (dict) metadata if key not set, specific metadatum otherwise
367 a2ef112e Stavros Sachtouris
        """
368 e51c7d5b Stavros Sachtouris
        r = self.images_metadata_get(image_id, key)
369 e51c7d5b Stavros Sachtouris
        for k, v in response_headers.items():
370 e51c7d5b Stavros Sachtouris
            response_headers[k] = r.headers.get(k, v)
371 7749f75a Stavros Sachtouris
        return r.json['meta' if key else 'metadata']
372 3dabe5d2 Stavros Sachtouris
373 a1c50326 Giorgos Verigakis
    def create_image_metadata(self, image_id, key, val):
374 a2ef112e Stavros Sachtouris
        """
375 a2ef112e Stavros Sachtouris
        :param image_id: integer (str or int)
376 a2ef112e Stavros Sachtouris

377 a2ef112e Stavros Sachtouris
        :param key: (str) metadatum key
378 a2ef112e Stavros Sachtouris

379 a2ef112e Stavros Sachtouris
        :param val: (str) metadatum value
380 a2ef112e Stavros Sachtouris

381 a2ef112e Stavros Sachtouris
        :returns: (dict) updated metadata
382 a2ef112e Stavros Sachtouris
        """
383 df0045d8 Stavros Sachtouris
        req = {'meta': {key: val}}
384 6d6d5141 Stavros Sachtouris
        r = self.images_metadata_put(image_id, key, json_data=req)
385 df0045d8 Stavros Sachtouris
        return r.json['meta']
386 a1c50326 Giorgos Verigakis
387 e51c7d5b Stavros Sachtouris
    def update_image_metadata(
388 e51c7d5b Stavros Sachtouris
            self, image_id,
389 e51c7d5b Stavros Sachtouris
            response_headers=dict(previous=None, next=None), **metadata):
390 a2ef112e Stavros Sachtouris
        """
391 a2ef112e Stavros Sachtouris
        :param image_id: (str)
392 a2ef112e Stavros Sachtouris

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

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

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

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

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

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

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

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

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

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

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

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