Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.3 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 cb69a058 Stavros Sachtouris
        """Register image put 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 fd6608bd Stavros Sachtouris
        """
137 fd6608bd Stavros Sachtouris
        path = path4url('images', image_id)
138 fd6608bd Stavros Sachtouris
        self.delete(path, success=204)
139 fd6608bd Stavros Sachtouris
140 a1c50326 Giorgos Verigakis
    def list_members(self, image_id):
141 cb69a058 Stavros Sachtouris
        """
142 cb69a058 Stavros Sachtouris
        :param image_id: (str)
143 cb69a058 Stavros Sachtouris

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

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

165 cb69a058 Stavros Sachtouris
        :param member: (str) user to allow access to current user's images
166 cb69a058 Stavros Sachtouris
        """
167 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members', member)
168 c2b5da2f Stavros Sachtouris
        self.put(path, success=204)
169 986b53f8 Giorgos Verigakis
170 a1c50326 Giorgos Verigakis
    def remove_member(self, image_id, member):
171 cb69a058 Stavros Sachtouris
        """
172 cb69a058 Stavros Sachtouris
        :param image_id: (str)
173 cb69a058 Stavros Sachtouris

174 cb69a058 Stavros Sachtouris
        :param member: (str) user to deprive from current user's images
175 cb69a058 Stavros Sachtouris
        """
176 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members', member)
177 c2b5da2f Stavros Sachtouris
        self.delete(path, success=204)
178 44b8928d Giorgos Verigakis
179 a1c50326 Giorgos Verigakis
    def set_members(self, image_id, members):
180 cb69a058 Stavros Sachtouris
        """
181 cb69a058 Stavros Sachtouris
        :param image_id: (str)
182 cb69a058 Stavros Sachtouris

183 cb69a058 Stavros Sachtouris
        :param members: (list) user to deprive from current user's images
184 cb69a058 Stavros Sachtouris
        """
185 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members')
186 a1c50326 Giorgos Verigakis
        req = {'memberships': [{'member_id': member} for member in members]}
187 c2b5da2f Stavros Sachtouris
        self.put(path, json=req, success=204)