Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / image.py @ 21d7e374

History | View | Annotate | Download (6.1 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 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 cb69a058 Stavros Sachtouris
        """
113 dd7461ac Stavros Sachtouris
        path = path4url('images') + '/'
114 edbee9c8 Stavros Sachtouris
        self.set_header('X-Image-Meta-Name', name)
115 edbee9c8 Stavros Sachtouris
        self.set_header('X-Image-Meta-Location', location)
116 44b8928d Giorgos Verigakis
117 fe5173b9 Stavros Sachtouris
        async_headers = {}
118 a1c50326 Giorgos Verigakis
        for key, val in params.items():
119 a1c50326 Giorgos Verigakis
            if key in ('id', 'store', 'disk_format', 'container_format',
120 a1c50326 Giorgos Verigakis
                       'size', 'checksum', 'is_public', 'owner'):
121 a1c50326 Giorgos Verigakis
                key = 'x-image-meta-' + key.replace('_', '-')
122 fe5173b9 Stavros Sachtouris
                async_headers[key] = val
123 44b8928d Giorgos Verigakis
124 a1c50326 Giorgos Verigakis
        for key, val in properties.items():
125 fe5173b9 Stavros Sachtouris
            async_headers['X-Image-Meta-Property-%s' % key] = val
126 44b8928d Giorgos Verigakis
127 fe5173b9 Stavros Sachtouris
        r = self.post(path, success=200, async_headers=async_headers)
128 c2f6a275 Stavros Sachtouris
        r.release()
129 bcebdfef Stavros Sachtouris
130 a1c50326 Giorgos Verigakis
    def list_members(self, image_id):
131 cb69a058 Stavros Sachtouris
        """
132 cb69a058 Stavros Sachtouris
        :param image_id: (str)
133 cb69a058 Stavros Sachtouris

134 cb69a058 Stavros Sachtouris
        :returns: (list) users who can use current user's images
135 cb69a058 Stavros Sachtouris
        """
136 3dabe5d2 Stavros Sachtouris
        path = path4url('images', image_id, 'members')
137 cd75ff39 Giorgos Verigakis
        r = self.get(path, success=200)
138 cd75ff39 Giorgos Verigakis
        return r.json['members']
139 a1c50326 Giorgos Verigakis
140 a1c50326 Giorgos Verigakis
    def list_shared(self, member):
141 cb69a058 Stavros Sachtouris
        """
142 cb69a058 Stavros Sachtouris
        :param member: (str) sharers account
143 cb69a058 Stavros Sachtouris

144 cb69a058 Stavros Sachtouris
        :returns: (list) images shared by member
145 cb69a058 Stavros Sachtouris
        """
146 edbee9c8 Stavros Sachtouris
        path = path4url('shared-images', member)
147 1bb4d14d Stavros Sachtouris
        #self.set_param('format', 'json')
148 cd75ff39 Giorgos Verigakis
        r = self.get(path, success=200)
149 cd75ff39 Giorgos Verigakis
        return r.json['shared_images']
150 a1c50326 Giorgos Verigakis
151 a1c50326 Giorgos Verigakis
    def add_member(self, image_id, member):
152 cb69a058 Stavros Sachtouris
        """
153 cb69a058 Stavros Sachtouris
        :param image_id: (str)
154 cb69a058 Stavros Sachtouris

155 cb69a058 Stavros Sachtouris
        :param member: (str) user to allow access to current user's images
156 cb69a058 Stavros Sachtouris
        """
157 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members', member)
158 6ce9fc72 Stavros Sachtouris
        r = self.put(path, success=204)
159 6ce9fc72 Stavros Sachtouris
        r.release()
160 986b53f8 Giorgos Verigakis
161 a1c50326 Giorgos Verigakis
    def remove_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 deprive from current user's images
166 cb69a058 Stavros Sachtouris
        """
167 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members', member)
168 6ce9fc72 Stavros Sachtouris
        r = self.delete(path, success=204)
169 6ce9fc72 Stavros Sachtouris
        r.release()
170 44b8928d Giorgos Verigakis
171 a1c50326 Giorgos Verigakis
    def set_members(self, image_id, members):
172 cb69a058 Stavros Sachtouris
        """
173 cb69a058 Stavros Sachtouris
        :param image_id: (str)
174 cb69a058 Stavros Sachtouris

175 cb69a058 Stavros Sachtouris
        :param members: (list) user to deprive from current user's images
176 cb69a058 Stavros Sachtouris
        """
177 edbee9c8 Stavros Sachtouris
        path = path4url('images', image_id, 'members')
178 a1c50326 Giorgos Verigakis
        req = {'memberships': [{'member_id': member} for member in members]}
179 6ce9fc72 Stavros Sachtouris
        r = self.put(path, json=req, success=204)
180 6ce9fc72 Stavros Sachtouris
        r.release()