Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.5 kB)

1 a1c50326 Giorgos Verigakis
# Copyright 2011 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 7b6e977c Stavros Sachtouris
from kamaki.clients.utils import path4url, filter_in
36 a1c50326 Giorgos Verigakis
37 3dabe5d2 Stavros Sachtouris
38 cd75ff39 Giorgos Verigakis
class ImageClient(Client):
39 76e7661e Stavros Sachtouris
    """Synnefo Plankton API client"""
40 44b8928d Giorgos Verigakis
41 2f749e6e Stavros Sachtouris
    def __init__(self, base_url, token):
42 33dc6317 Stavros Sachtouris
        super(ImageClient, self).__init__(base_url, token)
43 2f749e6e Stavros Sachtouris
44 f5eac743 Stavros Sachtouris
    def list_public(self, detail=False, filters={}, order=''):
45 f5eac743 Stavros Sachtouris
        """
46 f5eac743 Stavros Sachtouris
        :param detail: (bool)
47 44b8928d Giorgos Verigakis

48 f5eac743 Stavros Sachtouris
        :param filters: (dict) request filters
49 44b8928d Giorgos Verigakis

50 cb69a058 Stavros Sachtouris
        :param order: (str) order listing by field (default is ascending, - for
51 cb69a058 Stavros Sachtouris
            descending)
52 f5eac743 Stavros Sachtouris

53 f5eac743 Stavros Sachtouris
        :returns: (list) id,name + full image info if detail
54 f5eac743 Stavros Sachtouris
        """
55 dd7461ac Stavros Sachtouris
        path = path4url('images', 'detail') if detail else (
56 dd7461ac Stavros Sachtouris
            path4url('images') + '/')
57 44b8928d Giorgos Verigakis
58 fa984c2c Stavros Sachtouris
        async_params = {}
59 2f749e6e Stavros Sachtouris
        if isinstance(filters, dict):
60 fa984c2c Stavros Sachtouris
            for key, value in filters.items():
61 fa984c2c Stavros Sachtouris
                if value:
62 fa984c2c Stavros Sachtouris
                    async_params[key] = value
63 a1c50326 Giorgos Verigakis
        if order.startswith('-'):
64 d86c3c7d Stavros Sachtouris
            async_params['sort_dir'] = 'desc'
65 a1c50326 Giorgos Verigakis
            order = order[1:]
66 a1c50326 Giorgos Verigakis
        else:
67 d86c3c7d Stavros Sachtouris
            async_params['sort_dir'] = 'asc'
68 d86c3c7d Stavros Sachtouris
        if order:
69 d86c3c7d Stavros Sachtouris
            async_params['sort_key'] = order
70 44b8928d Giorgos Verigakis
71 fa984c2c Stavros Sachtouris
        r = self.get(path, async_params=async_params, success=200)
72 cd75ff39 Giorgos Verigakis
        return r.json
73 44b8928d Giorgos Verigakis
74 a1c50326 Giorgos Verigakis
    def get_meta(self, image_id):
75 cb69a058 Stavros Sachtouris
        """
76 cb69a058 Stavros Sachtouris
        :param image_id: (string)
77 cb69a058 Stavros Sachtouris

78 cb69a058 Stavros Sachtouris
        :returns: (list) image metadata (key:val)
79 cb69a058 Stavros Sachtouris
        """
80 3dabe5d2 Stavros Sachtouris
        path = path4url('images', image_id)
81 cd75ff39 Giorgos Verigakis
        r = self.head(path, success=200)
82 44b8928d Giorgos Verigakis
83 a1c50326 Giorgos Verigakis
        reply = {}
84 cd75ff39 Giorgos Verigakis
        properties = {}
85 cd75ff39 Giorgos Verigakis
        meta_prefix = 'x-image-meta-'
86 cd75ff39 Giorgos Verigakis
        property_prefix = 'x-image-meta-property-'
87 44b8928d Giorgos Verigakis
88 cd75ff39 Giorgos Verigakis
        for key, val in r.headers.items():
89 a1c50326 Giorgos Verigakis
            key = key.lower()
90 cd75ff39 Giorgos Verigakis
            if key.startswith(property_prefix):
91 cd75ff39 Giorgos Verigakis
                key = key[len(property_prefix):]
92 cd75ff39 Giorgos Verigakis
                properties[key] = val
93 cd75ff39 Giorgos Verigakis
            elif key.startswith(meta_prefix):
94 cd75ff39 Giorgos Verigakis
                key = key[len(meta_prefix):]
95 cd75ff39 Giorgos Verigakis
                reply[key] = val
96 44b8928d Giorgos Verigakis
97 cd75ff39 Giorgos Verigakis
        if properties:
98 cd75ff39 Giorgos Verigakis
            reply['properties'] = properties
99 a1c50326 Giorgos Verigakis
        return reply
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 7b6e977c Stavros Sachtouris
        :returns: (dict) details 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 7b6e977c Stavros Sachtouris
        return filter_in(r.headers, 'X-Image-')
131 bcebdfef Stavros Sachtouris
132 fd6608bd Stavros Sachtouris
    def unregister(self, image_id):
133 fd6608bd Stavros Sachtouris
        """Unregister an image
134 fd6608bd Stavros Sachtouris

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

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

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

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

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

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

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