Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / image / __init__.py @ 8741c407

History | View | Annotate | Download (6.4 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 c270fe96 Stavros Sachtouris
from kamaki.clients.utils import path4url
36 a1c50326 Giorgos Verigakis
37 3dabe5d2 Stavros Sachtouris
38 cd75ff39 Giorgos Verigakis
class ImageClient(Client):
39 cd75ff39 Giorgos Verigakis
    """OpenStack Image Service API 1.0 and GRNET Plankton 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 8741c407 Stavros Sachtouris
    def test(self):
45 8741c407 Stavros Sachtouris
        """
46 8741c407 Stavros Sachtouris
        :param image_id: (str)
47 8741c407 Stavros Sachtouris

48 8741c407 Stavros Sachtouris
        :param member: (str) user to allow access to current user's images
49 8741c407 Stavros Sachtouris
        """
50 8741c407 Stavros Sachtouris
        path = path4url('images')
51 8741c407 Stavros Sachtouris
        data = dict(stuff='stuff')
52 8741c407 Stavros Sachtouris
        r = self.put(path, json=data, async_headers={'x-image-meta-name': 'lalakis'})
53 8741c407 Stavros Sachtouris
        r.release()
54 8741c407 Stavros Sachtouris
55 f5eac743 Stavros Sachtouris
    def list_public(self, detail=False, filters={}, order=''):
56 f5eac743 Stavros Sachtouris
        """
57 f5eac743 Stavros Sachtouris
        :param detail: (bool)
58 44b8928d Giorgos Verigakis

59 f5eac743 Stavros Sachtouris
        :param filters: (dict) request filters
60 44b8928d Giorgos Verigakis

61 cb69a058 Stavros Sachtouris
        :param order: (str) order listing by field (default is ascending, - for
62 cb69a058 Stavros Sachtouris
            descending)
63 f5eac743 Stavros Sachtouris

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

89 cb69a058 Stavros Sachtouris
        :returns: (list) image metadata (key:val)
90 cb69a058 Stavros Sachtouris
        """
91 3dabe5d2 Stavros Sachtouris
        path = path4url('images', image_id)
92 cd75ff39 Giorgos Verigakis
        r = self.head(path, success=200)
93 44b8928d Giorgos Verigakis
94 a1c50326 Giorgos Verigakis
        reply = {}
95 cd75ff39 Giorgos Verigakis
        properties = {}
96 cd75ff39 Giorgos Verigakis
        meta_prefix = 'x-image-meta-'
97 cd75ff39 Giorgos Verigakis
        property_prefix = 'x-image-meta-property-'
98 44b8928d Giorgos Verigakis
99 cd75ff39 Giorgos Verigakis
        for key, val in r.headers.items():
100 a1c50326 Giorgos Verigakis
            key = key.lower()
101 cd75ff39 Giorgos Verigakis
            if key.startswith(property_prefix):
102 cd75ff39 Giorgos Verigakis
                key = key[len(property_prefix):]
103 cd75ff39 Giorgos Verigakis
                properties[key] = val
104 cd75ff39 Giorgos Verigakis
            elif key.startswith(meta_prefix):
105 cd75ff39 Giorgos Verigakis
                key = key[len(meta_prefix):]
106 cd75ff39 Giorgos Verigakis
                reply[key] = val
107 44b8928d Giorgos Verigakis
108 cd75ff39 Giorgos Verigakis
        if properties:
109 cd75ff39 Giorgos Verigakis
            reply['properties'] = properties
110 a1c50326 Giorgos Verigakis
        return reply
111 44b8928d Giorgos Verigakis
112 a1c50326 Giorgos Verigakis
    def register(self, name, location, params={}, properties={}):
113 cb69a058 Stavros Sachtouris
        """Register image put at location
114 cb69a058 Stavros Sachtouris

115 cb69a058 Stavros Sachtouris
        :param name: (str)
116 cb69a058 Stavros Sachtouris

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

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

122 cb69a058 Stavros Sachtouris
        :param properties: (dict) image properties (X-Image-Meta-Property)
123 cb69a058 Stavros Sachtouris
        """
124 dd7461ac Stavros Sachtouris
        path = path4url('images') + '/'
125 edbee9c8 Stavros Sachtouris
        self.set_header('X-Image-Meta-Name', name)
126 edbee9c8 Stavros Sachtouris
        self.set_header('X-Image-Meta-Location', location)
127 44b8928d Giorgos Verigakis
128 fe5173b9 Stavros Sachtouris
        async_headers = {}
129 a1c50326 Giorgos Verigakis
        for key, val in params.items():
130 a1c50326 Giorgos Verigakis
            if key in ('id', 'store', 'disk_format', 'container_format',
131 a1c50326 Giorgos Verigakis
                       'size', 'checksum', 'is_public', 'owner'):
132 a1c50326 Giorgos Verigakis
                key = 'x-image-meta-' + key.replace('_', '-')
133 fe5173b9 Stavros Sachtouris
                async_headers[key] = val
134 44b8928d Giorgos Verigakis
135 a1c50326 Giorgos Verigakis
        for key, val in properties.items():
136 f875dd02 Stavros Sachtouris
            async_headers['x-image-meta-property-%s' % key] = val
137 44b8928d Giorgos Verigakis
138 fe5173b9 Stavros Sachtouris
        r = self.post(path, success=200, async_headers=async_headers)
139 c2f6a275 Stavros Sachtouris
        r.release()
140 bcebdfef Stavros Sachtouris
141 a1c50326 Giorgos Verigakis
    def list_members(self, image_id):
142 cb69a058 Stavros Sachtouris
        """
143 cb69a058 Stavros Sachtouris
        :param image_id: (str)
144 cb69a058 Stavros Sachtouris

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

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

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

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

186 cb69a058 Stavros Sachtouris
        :param members: (list) user to deprive from current user's images
187 cb69a058 Stavros Sachtouris
        """
188 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members')
189 a1c50326 Giorgos Verigakis
        req = {'memberships': [{'member_id': member} for member in members]}
190 6ce9fc72 Stavros Sachtouris
        r = self.put(path, json=req, success=204)
191 6ce9fc72 Stavros Sachtouris
        r.release()