Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / image / __init__.py @ b773795c

History | View | Annotate | Download (6.5 kB)

1 e3f01d64 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 cb69a058 Stavros Sachtouris
34 cb69a058 Stavros Sachtouris
from kamaki.clients import Client, ClientError
35 fab9b17f Stavros Sachtouris
from kamaki.clients.utils import path4url
36 a1c50326 Giorgos Verigakis
37 3dabe5d2 Stavros Sachtouris
38 17b255c7 Stavros Sachtouris
def _format_image_headers(headers):
39 17b255c7 Stavros Sachtouris
    reply = dict(properties=dict())
40 17b255c7 Stavros Sachtouris
    meta_prefix = 'x-image-meta-'
41 17b255c7 Stavros Sachtouris
    property_prefix = 'x-image-meta-property-'
42 17b255c7 Stavros Sachtouris
43 17b255c7 Stavros Sachtouris
    for key, val in headers.items():
44 17b255c7 Stavros Sachtouris
        key = key.lower()
45 17b255c7 Stavros Sachtouris
        if key.startswith(property_prefix):
46 17b255c7 Stavros Sachtouris
            key = key[len(property_prefix):].upper().replace('-', '_')
47 17b255c7 Stavros Sachtouris
            reply['properties'][key] = val
48 17b255c7 Stavros Sachtouris
        elif key.startswith(meta_prefix):
49 17b255c7 Stavros Sachtouris
            key = key[len(meta_prefix):]
50 17b255c7 Stavros Sachtouris
            reply[key] = val
51 17b255c7 Stavros Sachtouris
    return reply
52 17b255c7 Stavros Sachtouris
53 17b255c7 Stavros Sachtouris
54 cd75ff39 Giorgos Verigakis
class ImageClient(Client):
55 76e7661e Stavros Sachtouris
    """Synnefo Plankton API client"""
56 44b8928d Giorgos Verigakis
57 2f749e6e Stavros Sachtouris
    def __init__(self, base_url, token):
58 33dc6317 Stavros Sachtouris
        super(ImageClient, self).__init__(base_url, token)
59 2f749e6e Stavros Sachtouris
60 f5eac743 Stavros Sachtouris
    def list_public(self, detail=False, filters={}, order=''):
61 f5eac743 Stavros Sachtouris
        """
62 f5eac743 Stavros Sachtouris
        :param detail: (bool)
63 44b8928d Giorgos Verigakis

64 f5eac743 Stavros Sachtouris
        :param filters: (dict) request filters
65 44b8928d Giorgos Verigakis

66 cb69a058 Stavros Sachtouris
        :param order: (str) order listing by field (default is ascending, - for
67 cb69a058 Stavros Sachtouris
            descending)
68 f5eac743 Stavros Sachtouris

69 f5eac743 Stavros Sachtouris
        :returns: (list) id,name + full image info if detail
70 f5eac743 Stavros Sachtouris
        """
71 dd7461ac Stavros Sachtouris
        path = path4url('images', 'detail') if detail else (
72 dd7461ac Stavros Sachtouris
            path4url('images') + '/')
73 44b8928d Giorgos Verigakis
74 fa984c2c Stavros Sachtouris
        async_params = {}
75 2f749e6e Stavros Sachtouris
        if isinstance(filters, dict):
76 fa984c2c Stavros Sachtouris
            for key, value in filters.items():
77 fa984c2c Stavros Sachtouris
                if value:
78 fa984c2c Stavros Sachtouris
                    async_params[key] = value
79 6325d148 Stavros Sachtouris
        if order and order.startswith('-'):
80 d86c3c7d Stavros Sachtouris
            async_params['sort_dir'] = 'desc'
81 a1c50326 Giorgos Verigakis
            order = order[1:]
82 a1c50326 Giorgos Verigakis
        else:
83 d86c3c7d Stavros Sachtouris
            async_params['sort_dir'] = 'asc'
84 d86c3c7d Stavros Sachtouris
        if order:
85 d86c3c7d Stavros Sachtouris
            async_params['sort_key'] = order
86 44b8928d Giorgos Verigakis
87 fa984c2c Stavros Sachtouris
        r = self.get(path, async_params=async_params, success=200)
88 cd75ff39 Giorgos Verigakis
        return r.json
89 44b8928d Giorgos Verigakis
90 a1c50326 Giorgos Verigakis
    def get_meta(self, image_id):
91 cb69a058 Stavros Sachtouris
        """
92 cb69a058 Stavros Sachtouris
        :param image_id: (string)
93 cb69a058 Stavros Sachtouris

94 cb69a058 Stavros Sachtouris
        :returns: (list) image metadata (key:val)
95 cb69a058 Stavros Sachtouris
        """
96 3dabe5d2 Stavros Sachtouris
        path = path4url('images', image_id)
97 cd75ff39 Giorgos Verigakis
        r = self.head(path, success=200)
98 44b8928d Giorgos Verigakis
99 17b255c7 Stavros Sachtouris
        return _format_image_headers(r.headers)
100 44b8928d Giorgos Verigakis
101 a1c50326 Giorgos Verigakis
    def register(self, name, location, params={}, properties={}):
102 f5f35422 Stavros Sachtouris
        """Register an image that is uploaded at location
103 cb69a058 Stavros Sachtouris

104 cb69a058 Stavros Sachtouris
        :param name: (str)
105 cb69a058 Stavros Sachtouris

106 cb69a058 Stavros Sachtouris
        :param location: (str) pithos://<account>/<container>/<path>
107 cb69a058 Stavros Sachtouris

108 cb69a058 Stavros Sachtouris
        :param params: (dict) image metadata (X-Image-Meta) can be id, store,
109 cb69a058 Stavros Sachtouris
            disc_format, container_format, size, checksum, is_public, owner
110 cb69a058 Stavros Sachtouris

111 cb69a058 Stavros Sachtouris
        :param properties: (dict) image properties (X-Image-Meta-Property)
112 7b6e977c Stavros Sachtouris

113 17b255c7 Stavros Sachtouris
        :returns: (dict) metadata of the created image
114 cb69a058 Stavros Sachtouris
        """
115 dd7461ac Stavros Sachtouris
        path = path4url('images') + '/'
116 edbee9c8 Stavros Sachtouris
        self.set_header('X-Image-Meta-Name', name)
117 edbee9c8 Stavros Sachtouris
        self.set_header('X-Image-Meta-Location', location)
118 44b8928d Giorgos Verigakis
119 fe5173b9 Stavros Sachtouris
        async_headers = {}
120 a1c50326 Giorgos Verigakis
        for key, val in params.items():
121 2dc39c27 Stavros Sachtouris
            if key in ('store', 'disk_format', 'container_format',
122 2dc39c27 Stavros Sachtouris
                       'size', 'checksum', 'is_public', 'owner') and val:
123 a1c50326 Giorgos Verigakis
                key = 'x-image-meta-' + key.replace('_', '-')
124 fe5173b9 Stavros Sachtouris
                async_headers[key] = val
125 44b8928d Giorgos Verigakis
126 a1c50326 Giorgos Verigakis
        for key, val in properties.items():
127 f875dd02 Stavros Sachtouris
            async_headers['x-image-meta-property-%s' % key] = val
128 44b8928d Giorgos Verigakis
129 7b6e977c Stavros Sachtouris
        r = self.post(path, success=200, async_headers=async_headers)
130 17b255c7 Stavros Sachtouris
131 17b255c7 Stavros Sachtouris
        return _format_image_headers(r.headers)
132 bcebdfef Stavros Sachtouris
133 fd6608bd Stavros Sachtouris
    def unregister(self, image_id):
134 fd6608bd Stavros Sachtouris
        """Unregister an image
135 fd6608bd Stavros Sachtouris

136 fd6608bd Stavros Sachtouris
        :param image_id: (str)
137 f5f35422 Stavros Sachtouris

138 f5f35422 Stavros Sachtouris
        :returns: (dict) response headers
139 fd6608bd Stavros Sachtouris
        """
140 fd6608bd Stavros Sachtouris
        path = path4url('images', image_id)
141 f5f35422 Stavros Sachtouris
        r = self.delete(path, success=204)
142 f5f35422 Stavros Sachtouris
        return r.headers
143 fd6608bd Stavros Sachtouris
144 a1c50326 Giorgos Verigakis
    def list_members(self, image_id):
145 cb69a058 Stavros Sachtouris
        """
146 cb69a058 Stavros Sachtouris
        :param image_id: (str)
147 cb69a058 Stavros Sachtouris

148 cb69a058 Stavros Sachtouris
        :returns: (list) users who can use current user's images
149 cb69a058 Stavros Sachtouris
        """
150 3dabe5d2 Stavros Sachtouris
        path = path4url('images', image_id, 'members')
151 cd75ff39 Giorgos Verigakis
        r = self.get(path, success=200)
152 cd75ff39 Giorgos Verigakis
        return r.json['members']
153 a1c50326 Giorgos Verigakis
154 a1c50326 Giorgos Verigakis
    def list_shared(self, member):
155 cb69a058 Stavros Sachtouris
        """
156 cb69a058 Stavros Sachtouris
        :param member: (str) sharers account
157 cb69a058 Stavros Sachtouris

158 cb69a058 Stavros Sachtouris
        :returns: (list) images shared by member
159 cb69a058 Stavros Sachtouris
        """
160 edbee9c8 Stavros Sachtouris
        path = path4url('shared-images', member)
161 1bb4d14d Stavros Sachtouris
        #self.set_param('format', 'json')
162 cd75ff39 Giorgos Verigakis
        r = self.get(path, success=200)
163 cd75ff39 Giorgos Verigakis
        return r.json['shared_images']
164 a1c50326 Giorgos Verigakis
165 a1c50326 Giorgos Verigakis
    def add_member(self, image_id, member):
166 cb69a058 Stavros Sachtouris
        """
167 cb69a058 Stavros Sachtouris
        :param image_id: (str)
168 cb69a058 Stavros Sachtouris

169 cb69a058 Stavros Sachtouris
        :param member: (str) user to allow access to current user's images
170 cb69a058 Stavros Sachtouris
        """
171 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members', member)
172 f5f35422 Stavros Sachtouris
        self.set_header('Content-Length', len(member))
173 f5f35422 Stavros Sachtouris
        r = self.put(path, success=204)
174 f5f35422 Stavros Sachtouris
        return r.headers
175 986b53f8 Giorgos Verigakis
176 a1c50326 Giorgos Verigakis
    def remove_member(self, image_id, member):
177 cb69a058 Stavros Sachtouris
        """
178 cb69a058 Stavros Sachtouris
        :param image_id: (str)
179 cb69a058 Stavros Sachtouris

180 cb69a058 Stavros Sachtouris
        :param member: (str) user to deprive from current user's images
181 cb69a058 Stavros Sachtouris
        """
182 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members', member)
183 f5f35422 Stavros Sachtouris
        r = self.delete(path, success=204)
184 f5f35422 Stavros Sachtouris
        return r.headers
185 44b8928d Giorgos Verigakis
186 a1c50326 Giorgos Verigakis
    def set_members(self, image_id, members):
187 cb69a058 Stavros Sachtouris
        """
188 cb69a058 Stavros Sachtouris
        :param image_id: (str)
189 cb69a058 Stavros Sachtouris

190 cb69a058 Stavros Sachtouris
        :param members: (list) user to deprive from current user's images
191 cb69a058 Stavros Sachtouris
        """
192 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members')
193 a1c50326 Giorgos Verigakis
        req = {'memberships': [{'member_id': member} for member in members]}
194 f5f35422 Stavros Sachtouris
        r = self.put(path, json=req, success=204)
195 f5f35422 Stavros Sachtouris
        return r.headers