Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / image.py @ 8b516110

History | View | Annotate | Download (14.7 kB)

1 234954d1 Stavros Sachtouris
# Copyright 2012 GRNET S.A. All rights reserved.
2 7493ccb6 Stavros Sachtouris
#
3 7493ccb6 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7493ccb6 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7493ccb6 Stavros Sachtouris
# conditions are met:
6 7493ccb6 Stavros Sachtouris
#
7 7493ccb6 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 7493ccb6 Stavros Sachtouris
#      disclaimer.
10 7493ccb6 Stavros Sachtouris
#
11 7493ccb6 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 7493ccb6 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 7493ccb6 Stavros Sachtouris
#      provided with the distribution.
15 7493ccb6 Stavros Sachtouris
#
16 7493ccb6 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7493ccb6 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7493ccb6 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7493ccb6 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7493ccb6 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7493ccb6 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7493ccb6 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7493ccb6 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7493ccb6 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7493ccb6 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7493ccb6 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7493ccb6 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7493ccb6 Stavros Sachtouris
#
29 7493ccb6 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7493ccb6 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7493ccb6 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 7493ccb6 Stavros Sachtouris
# or implied, of GRNET S.A.command
33 7493ccb6 Stavros Sachtouris
34 f3e94e06 Stavros Sachtouris
from kamaki.cli import command
35 d486baec Stavros Sachtouris
from kamaki.cli.command_tree import CommandTree
36 15142309 Stavros Sachtouris
from kamaki.cli.utils import print_dict, print_items
37 1395c40e Stavros Sachtouris
from kamaki.clients.image import ImageClient
38 83c3ba87 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument, ValueArgument, KeyValueArgument
39 83c3ba87 Stavros Sachtouris
from kamaki.cli.argument import IntArgument
40 bfb54881 Stavros Sachtouris
from kamaki.cli.commands.cyclades import _init_cyclades
41 a03ade9e Stavros Sachtouris
from kamaki.cli.commands import _command_init, errors
42 0b368c8c Stavros Sachtouris
43 234954d1 Stavros Sachtouris
44 a29d2f88 Stavros Sachtouris
image_cmds = CommandTree(
45 a29d2f88 Stavros Sachtouris
    'image',
46 a29d2f88 Stavros Sachtouris
    'Cyclades/Plankton API image commands\n'
47 a29d2f88 Stavros Sachtouris
    'image compute:\tCyclades/Compute API image commands')
48 d486baec Stavros Sachtouris
_commands = [image_cmds]
49 234954d1 Stavros Sachtouris
50 234954d1 Stavros Sachtouris
51 573be34f Stavros Sachtouris
about_image_id = [
52 573be34f Stavros Sachtouris
    'To see a list of available image ids: /image list']
53 15142309 Stavros Sachtouris
54 15142309 Stavros Sachtouris
55 5eae854d Stavros Sachtouris
class _init_image(_command_init):
56 a03ade9e Stavros Sachtouris
    @errors.generic.all
57 a03ade9e Stavros Sachtouris
    def _run(self):
58 a03ade9e Stavros Sachtouris
        token = self.config.get('image', 'token')\
59 a03ade9e Stavros Sachtouris
            or self.config.get('compute', 'token')\
60 a03ade9e Stavros Sachtouris
            or self.config.get('global', 'token')
61 a03ade9e Stavros Sachtouris
        base_url = self.config.get('image', 'url')\
62 a03ade9e Stavros Sachtouris
            or self.config.get('compute', 'url')\
63 a03ade9e Stavros Sachtouris
            or self.config.get('global', 'url')
64 a03ade9e Stavros Sachtouris
        self.client = ImageClient(base_url=base_url, token=token)
65 f47417e7 Stavros Sachtouris
        self._set_log_params()
66 c5b9380c Stavros Sachtouris
        self._update_max_threads()
67 a03ade9e Stavros Sachtouris
68 7493ccb6 Stavros Sachtouris
    def main(self):
69 a03ade9e Stavros Sachtouris
        self._run()
70 7493ccb6 Stavros Sachtouris
71 234954d1 Stavros Sachtouris
72 573be34f Stavros Sachtouris
# Plankton Image Commands
73 573be34f Stavros Sachtouris
74 573be34f Stavros Sachtouris
75 d486baec Stavros Sachtouris
@command(image_cmds)
76 573be34f Stavros Sachtouris
class image_list(_init_image):
77 573be34f Stavros Sachtouris
    """List images accessible by user"""
78 7493ccb6 Stavros Sachtouris
79 1ae79e60 Stavros Sachtouris
    arguments = dict(
80 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
81 1ae79e60 Stavros Sachtouris
        container_format=ValueArgument(
82 1ae79e60 Stavros Sachtouris
            'filter by container format',
83 1ae79e60 Stavros Sachtouris
            '--container-format'),
84 1ae79e60 Stavros Sachtouris
        disk_format=ValueArgument('filter by disk format', '--disk-format'),
85 1ae79e60 Stavros Sachtouris
        name=ValueArgument('filter by name', '--name'),
86 faeccbf9 Stavros Sachtouris
        name_pref=ValueArgument(
87 faeccbf9 Stavros Sachtouris
            'filter by name prefix (case insensitive)',
88 faeccbf9 Stavros Sachtouris
            '--name-prefix'),
89 faeccbf9 Stavros Sachtouris
        name_suff=ValueArgument(
90 faeccbf9 Stavros Sachtouris
            'filter by name suffix (case insensitive)',
91 faeccbf9 Stavros Sachtouris
            '--name-suffix'),
92 faeccbf9 Stavros Sachtouris
        name_like=ValueArgument(
93 faeccbf9 Stavros Sachtouris
            'print only if name contains this (case insensitive)',
94 faeccbf9 Stavros Sachtouris
            '--name-like'),
95 1ae79e60 Stavros Sachtouris
        size_min=IntArgument('filter by minimum size', '--size-min'),
96 1ae79e60 Stavros Sachtouris
        size_max=IntArgument('filter by maximum size', '--size-max'),
97 1ae79e60 Stavros Sachtouris
        status=ValueArgument('filter by status', '--status'),
98 f9457c89 Stavros Sachtouris
        owner=ValueArgument('filter by owner', '--owner'),
99 1ae79e60 Stavros Sachtouris
        order=ValueArgument(
100 1ae79e60 Stavros Sachtouris
            'order by FIELD ( - to reverse order)',
101 1ae79e60 Stavros Sachtouris
            '--order',
102 83c3ba87 Stavros Sachtouris
            default=''),
103 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit number of listed images', ('-n', '--number')),
104 83c3ba87 Stavros Sachtouris
        more=FlagArgument(
105 83c3ba87 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
106 83c3ba87 Stavros Sachtouris
            '--more')
107 1ae79e60 Stavros Sachtouris
    )
108 7493ccb6 Stavros Sachtouris
109 f9457c89 Stavros Sachtouris
    def _filtered_by_owner(self, detail, *list_params):
110 f9457c89 Stavros Sachtouris
        images = []
111 f9457c89 Stavros Sachtouris
        MINKEYS = set([
112 f9457c89 Stavros Sachtouris
            'id', 'size', 'status', 'disk_format', 'container_format', 'name'])
113 f9457c89 Stavros Sachtouris
        for img in self.client.list_public(True, *list_params):
114 f9457c89 Stavros Sachtouris
            if img['owner'] == self['owner']:
115 f9457c89 Stavros Sachtouris
                if not detail:
116 f9457c89 Stavros Sachtouris
                    for key in set(img.keys()).difference(MINKEYS):
117 f9457c89 Stavros Sachtouris
                        img.pop(key)
118 f9457c89 Stavros Sachtouris
                images.append(img)
119 f9457c89 Stavros Sachtouris
        return images
120 f9457c89 Stavros Sachtouris
121 faeccbf9 Stavros Sachtouris
    def _filtered_by_name(self, images):
122 faeccbf9 Stavros Sachtouris
        np, ns, nl = self['name_pref'], self['name_suff'], self['name_like']
123 faeccbf9 Stavros Sachtouris
        return [img for img in images if (
124 faeccbf9 Stavros Sachtouris
            (not np) or img['name'].lower().startswith(np.lower())) and (
125 faeccbf9 Stavros Sachtouris
            (not ns) or img['name'].lower().endswith(ns.lower())) and (
126 faeccbf9 Stavros Sachtouris
            (not nl) or nl.lower() in img['name'].lower())]
127 faeccbf9 Stavros Sachtouris
128 a03ade9e Stavros Sachtouris
    @errors.generic.all
129 a03ade9e Stavros Sachtouris
    @errors.cyclades.connection
130 a03ade9e Stavros Sachtouris
    def _run(self):
131 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
132 7493ccb6 Stavros Sachtouris
        filters = {}
133 fa984c2c Stavros Sachtouris
        for arg in set([
134 1ae79e60 Stavros Sachtouris
                'container_format',
135 1ae79e60 Stavros Sachtouris
                'disk_format',
136 1ae79e60 Stavros Sachtouris
                'name',
137 1ae79e60 Stavros Sachtouris
                'size_min',
138 1ae79e60 Stavros Sachtouris
                'size_max',
139 de73876b Stavros Sachtouris
                'status']).intersection(self.arguments):
140 1ae79e60 Stavros Sachtouris
            filters[arg] = self[arg]
141 1ae79e60 Stavros Sachtouris
142 1ae79e60 Stavros Sachtouris
        order = self['order']
143 1ae79e60 Stavros Sachtouris
        detail = self['detail']
144 f9457c89 Stavros Sachtouris
        if self['owner']:
145 f9457c89 Stavros Sachtouris
            images = self._filtered_by_owner(detail, filters, order)
146 f9457c89 Stavros Sachtouris
        else:
147 f9457c89 Stavros Sachtouris
            images = self.client.list_public(detail, filters, order)
148 faeccbf9 Stavros Sachtouris
        images = self._filtered_by_name(images)
149 f9457c89 Stavros Sachtouris
150 83c3ba87 Stavros Sachtouris
        if self['more']:
151 83c3ba87 Stavros Sachtouris
            print_items(
152 83c3ba87 Stavros Sachtouris
                images,
153 83c3ba87 Stavros Sachtouris
                title=('name',),
154 83c3ba87 Stavros Sachtouris
                with_enumeration=True,
155 f769a16a Stavros Sachtouris
                page_size=self['limit'] or 10)
156 83c3ba87 Stavros Sachtouris
        elif self['limit']:
157 83c3ba87 Stavros Sachtouris
            print_items(
158 83c3ba87 Stavros Sachtouris
                images[:self['limit']],
159 83c3ba87 Stavros Sachtouris
                title=('name',),
160 83c3ba87 Stavros Sachtouris
                with_enumeration=True)
161 83c3ba87 Stavros Sachtouris
        else:
162 83c3ba87 Stavros Sachtouris
            print_items(images, title=('name',), with_enumeration=True)
163 7493ccb6 Stavros Sachtouris
164 a03ade9e Stavros Sachtouris
    def main(self):
165 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
166 a03ade9e Stavros Sachtouris
        self._run()
167 a03ade9e Stavros Sachtouris
168 234954d1 Stavros Sachtouris
169 d486baec Stavros Sachtouris
@command(image_cmds)
170 7493ccb6 Stavros Sachtouris
class image_meta(_init_image):
171 15142309 Stavros Sachtouris
    """Get image metadata
172 15142309 Stavros Sachtouris
    Image metadata include:
173 439826ec Stavros Sachtouris
    - image file information (location, size, etc.)
174 439826ec Stavros Sachtouris
    - image information (id, name, etc.)
175 439826ec Stavros Sachtouris
    - image os properties (os, fs, etc.)
176 15142309 Stavros Sachtouris
    """
177 7493ccb6 Stavros Sachtouris
178 a03ade9e Stavros Sachtouris
    @errors.generic.all
179 a03ade9e Stavros Sachtouris
    @errors.plankton.connection
180 a03ade9e Stavros Sachtouris
    @errors.plankton.id
181 a03ade9e Stavros Sachtouris
    def _run(self, image_id):
182 a03ade9e Stavros Sachtouris
        image = self.client.get_meta(image_id)
183 7493ccb6 Stavros Sachtouris
        print_dict(image)
184 7493ccb6 Stavros Sachtouris
185 a03ade9e Stavros Sachtouris
    def main(self, image_id):
186 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
187 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
188 a03ade9e Stavros Sachtouris
189 234954d1 Stavros Sachtouris
190 d486baec Stavros Sachtouris
@command(image_cmds)
191 7493ccb6 Stavros Sachtouris
class image_register(_init_image):
192 fc903073 Stavros Sachtouris
    """(Re)Register an image"""
193 7493ccb6 Stavros Sachtouris
194 1ae79e60 Stavros Sachtouris
    arguments = dict(
195 1ae79e60 Stavros Sachtouris
        checksum=ValueArgument('set image checksum', '--checksum'),
196 1ae79e60 Stavros Sachtouris
        container_format=ValueArgument(
197 1ae79e60 Stavros Sachtouris
            'set container format',
198 1ae79e60 Stavros Sachtouris
            '--container-format'),
199 1ae79e60 Stavros Sachtouris
        disk_format=ValueArgument('set disk format', '--disk-format'),
200 2dc39c27 Stavros Sachtouris
        #id=ValueArgument('set image ID', '--id'),
201 1ae79e60 Stavros Sachtouris
        owner=ValueArgument('set image owner (admin only)', '--owner'),
202 1ae79e60 Stavros Sachtouris
        properties=KeyValueArgument(
203 1ae79e60 Stavros Sachtouris
            'add property in key=value form (can be repeated)',
204 1736e06d Stavros Sachtouris
            ('-p', '--property')),
205 1ae79e60 Stavros Sachtouris
        is_public=FlagArgument('mark image as public', '--public'),
206 1ae79e60 Stavros Sachtouris
        size=IntArgument('set image size', '--size'),
207 f40f0cb7 Stavros Sachtouris
        update=FlagArgument(
208 f40f0cb7 Stavros Sachtouris
            'update existing image properties',
209 f40f0cb7 Stavros Sachtouris
            ('-u', '--update'))
210 1ae79e60 Stavros Sachtouris
    )
211 7493ccb6 Stavros Sachtouris
212 a03ade9e Stavros Sachtouris
    @errors.generic.all
213 a03ade9e Stavros Sachtouris
    @errors.plankton.connection
214 a03ade9e Stavros Sachtouris
    def _run(self, name, location):
215 7493ccb6 Stavros Sachtouris
        if not location.startswith('pithos://'):
216 3ae60112 Stavros Sachtouris
            account = self.config.get('file', 'account') \
217 f3e94e06 Stavros Sachtouris
                or self.config.get('global', 'account')
218 8741c407 Stavros Sachtouris
            assert account, 'No user account provided'
219 7493ccb6 Stavros Sachtouris
            if account[-1] == '/':
220 7493ccb6 Stavros Sachtouris
                account = account[:-1]
221 3ae60112 Stavros Sachtouris
            container = self.config.get('file', 'container') \
222 f3e94e06 Stavros Sachtouris
                or self.config.get('global', 'container')
223 f769a16a Stavros Sachtouris
            if not container:
224 234954d1 Stavros Sachtouris
                location = 'pithos://%s/%s' % (account, location)
225 234954d1 Stavros Sachtouris
            else:
226 234954d1 Stavros Sachtouris
                location = 'pithos://%s/%s/%s' % (account, container, location)
227 7493ccb6 Stavros Sachtouris
228 7493ccb6 Stavros Sachtouris
        params = {}
229 f769a16a Stavros Sachtouris
        for key in set([
230 1ae79e60 Stavros Sachtouris
                'checksum',
231 1ae79e60 Stavros Sachtouris
                'container_format',
232 1ae79e60 Stavros Sachtouris
                'disk_format',
233 1ae79e60 Stavros Sachtouris
                'owner',
234 1ae79e60 Stavros Sachtouris
                'size',
235 de73876b Stavros Sachtouris
                'is_public']).intersection(self.arguments):
236 1ae79e60 Stavros Sachtouris
            params[key] = self[key]
237 1ae79e60 Stavros Sachtouris
238 1ae79e60 Stavros Sachtouris
            properties = self['properties']
239 a03ade9e Stavros Sachtouris
        if self['update']:
240 a03ade9e Stavros Sachtouris
            self.client.reregister(location, name, params, properties)
241 a03ade9e Stavros Sachtouris
        else:
242 7b6e977c Stavros Sachtouris
            r = self.client.register(name, location, params, properties)
243 7b6e977c Stavros Sachtouris
            print_dict(r)
244 a03ade9e Stavros Sachtouris
245 a03ade9e Stavros Sachtouris
    def main(self, name, location):
246 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
247 a03ade9e Stavros Sachtouris
        self._run(name, location)
248 7493ccb6 Stavros Sachtouris
249 234954d1 Stavros Sachtouris
250 d486baec Stavros Sachtouris
@command(image_cmds)
251 7493ccb6 Stavros Sachtouris
class image_members(_init_image):
252 7493ccb6 Stavros Sachtouris
    """Get image members"""
253 7493ccb6 Stavros Sachtouris
254 236e7d08 Stavros Sachtouris
    @errors.generic.all
255 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
256 236e7d08 Stavros Sachtouris
    @errors.plankton.id
257 236e7d08 Stavros Sachtouris
    def _run(self, image_id):
258 236e7d08 Stavros Sachtouris
        members = self.client.list_members(image_id)
259 fc903073 Stavros Sachtouris
        print_items(members)
260 7493ccb6 Stavros Sachtouris
261 236e7d08 Stavros Sachtouris
    def main(self, image_id):
262 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
263 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
264 236e7d08 Stavros Sachtouris
265 234954d1 Stavros Sachtouris
266 d486baec Stavros Sachtouris
@command(image_cmds)
267 7493ccb6 Stavros Sachtouris
class image_shared(_init_image):
268 15142309 Stavros Sachtouris
    """List images shared by a member"""
269 7493ccb6 Stavros Sachtouris
270 236e7d08 Stavros Sachtouris
    @errors.generic.all
271 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
272 236e7d08 Stavros Sachtouris
    def _run(self, member):
273 236e7d08 Stavros Sachtouris
        images = self.client.list_shared(member)
274 fc903073 Stavros Sachtouris
        print_items(images)
275 7493ccb6 Stavros Sachtouris
276 236e7d08 Stavros Sachtouris
    def main(self, member):
277 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
278 236e7d08 Stavros Sachtouris
        self._run(member)
279 236e7d08 Stavros Sachtouris
280 234954d1 Stavros Sachtouris
281 d486baec Stavros Sachtouris
@command(image_cmds)
282 7493ccb6 Stavros Sachtouris
class image_addmember(_init_image):
283 7493ccb6 Stavros Sachtouris
    """Add a member to an image"""
284 7493ccb6 Stavros Sachtouris
285 236e7d08 Stavros Sachtouris
    @errors.generic.all
286 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
287 236e7d08 Stavros Sachtouris
    @errors.plankton.id
288 b04288f7 Stavros Sachtouris
    def _run(self, image_id=None, member=None):
289 7493ccb6 Stavros Sachtouris
            self.client.add_member(image_id, member)
290 236e7d08 Stavros Sachtouris
291 236e7d08 Stavros Sachtouris
    def main(self, image_id, member):
292 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
293 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, member=member)
294 7493ccb6 Stavros Sachtouris
295 234954d1 Stavros Sachtouris
296 d486baec Stavros Sachtouris
@command(image_cmds)
297 7493ccb6 Stavros Sachtouris
class image_delmember(_init_image):
298 7493ccb6 Stavros Sachtouris
    """Remove a member from an image"""
299 7493ccb6 Stavros Sachtouris
300 236e7d08 Stavros Sachtouris
    @errors.generic.all
301 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
302 236e7d08 Stavros Sachtouris
    @errors.plankton.id
303 b04288f7 Stavros Sachtouris
    def _run(self, image_id=None, member=None):
304 7493ccb6 Stavros Sachtouris
            self.client.remove_member(image_id, member)
305 236e7d08 Stavros Sachtouris
306 236e7d08 Stavros Sachtouris
    def main(self, image_id, member):
307 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
308 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, member=member)
309 7493ccb6 Stavros Sachtouris
310 234954d1 Stavros Sachtouris
311 d486baec Stavros Sachtouris
@command(image_cmds)
312 7493ccb6 Stavros Sachtouris
class image_setmembers(_init_image):
313 7493ccb6 Stavros Sachtouris
    """Set the members of an image"""
314 7493ccb6 Stavros Sachtouris
315 236e7d08 Stavros Sachtouris
    @errors.generic.all
316 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
317 236e7d08 Stavros Sachtouris
    @errors.plankton.id
318 b04288f7 Stavros Sachtouris
    def _run(self, image_id, members):
319 236e7d08 Stavros Sachtouris
            self.client.set_members(image_id, members)
320 236e7d08 Stavros Sachtouris
321 236e7d08 Stavros Sachtouris
    def main(self, image_id, *members):
322 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
323 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, members=members)
324 f3e94e06 Stavros Sachtouris
325 f3e94e06 Stavros Sachtouris
326 573be34f Stavros Sachtouris
# Compute Image Commands
327 573be34f Stavros Sachtouris
328 573be34f Stavros Sachtouris
329 d486baec Stavros Sachtouris
@command(image_cmds)
330 8741c407 Stavros Sachtouris
class image_compute(_init_cyclades):
331 a29d2f88 Stavros Sachtouris
    """Cyclades/Compute API image commands"""
332 8741c407 Stavros Sachtouris
333 8741c407 Stavros Sachtouris
334 8741c407 Stavros Sachtouris
@command(image_cmds)
335 8741c407 Stavros Sachtouris
class image_compute_list(_init_cyclades):
336 f3e94e06 Stavros Sachtouris
    """List images"""
337 f3e94e06 Stavros Sachtouris
338 1ae79e60 Stavros Sachtouris
    arguments = dict(
339 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
340 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit number listed images', ('-n', '--number')),
341 15142309 Stavros Sachtouris
        more=FlagArgument(
342 15142309 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
343 15142309 Stavros Sachtouris
            '--more')
344 1ae79e60 Stavros Sachtouris
    )
345 f3e94e06 Stavros Sachtouris
346 15142309 Stavros Sachtouris
    def _make_results_pretty(self, images):
347 f3e94e06 Stavros Sachtouris
        for img in images:
348 15142309 Stavros Sachtouris
            if 'metadata' in img:
349 15142309 Stavros Sachtouris
                img['metadata'] = img['metadata']['values']
350 f3e94e06 Stavros Sachtouris
351 236e7d08 Stavros Sachtouris
    @errors.generic.all
352 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
353 236e7d08 Stavros Sachtouris
    def _run(self):
354 236e7d08 Stavros Sachtouris
        images = self.client.list_images(self['detail'])
355 236e7d08 Stavros Sachtouris
        if self['detail']:
356 236e7d08 Stavros Sachtouris
            self._make_results_pretty(images)
357 236e7d08 Stavros Sachtouris
        if self['more']:
358 f769a16a Stavros Sachtouris
            print_items(images, page_size=self['limit'] or 10)
359 236e7d08 Stavros Sachtouris
        else:
360 f769a16a Stavros Sachtouris
            print_items(images[:self['limit']])
361 236e7d08 Stavros Sachtouris
362 f3e94e06 Stavros Sachtouris
    def main(self):
363 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
364 236e7d08 Stavros Sachtouris
        self._run()
365 f3e94e06 Stavros Sachtouris
366 234954d1 Stavros Sachtouris
367 d486baec Stavros Sachtouris
@command(image_cmds)
368 8741c407 Stavros Sachtouris
class image_compute_info(_init_cyclades):
369 15142309 Stavros Sachtouris
    """Get detailed information on an image"""
370 f3e94e06 Stavros Sachtouris
371 236e7d08 Stavros Sachtouris
    @errors.generic.all
372 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
373 236e7d08 Stavros Sachtouris
    @errors.plankton.id
374 236e7d08 Stavros Sachtouris
    def _run(self, image_id):
375 236e7d08 Stavros Sachtouris
        image = self.client.get_image_details(image_id)
376 234954d1 Stavros Sachtouris
        if 'metadata' in image:
377 f3e94e06 Stavros Sachtouris
            image['metadata'] = image['metadata']['values']
378 236e7d08 Stavros Sachtouris
        print_dict(image)
379 f3e94e06 Stavros Sachtouris
380 f3e94e06 Stavros Sachtouris
    def main(self, image_id):
381 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
382 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
383 f3e94e06 Stavros Sachtouris
384 234954d1 Stavros Sachtouris
385 d486baec Stavros Sachtouris
@command(image_cmds)
386 8741c407 Stavros Sachtouris
class image_compute_delete(_init_cyclades):
387 24ff0a35 Stavros Sachtouris
    """Delete an image (WARNING: image file is also removed)"""
388 f3e94e06 Stavros Sachtouris
389 236e7d08 Stavros Sachtouris
    @errors.generic.all
390 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
391 236e7d08 Stavros Sachtouris
    @errors.plankton.id
392 236e7d08 Stavros Sachtouris
    def _run(self, image_id):
393 236e7d08 Stavros Sachtouris
        self.client.delete_image(image_id)
394 236e7d08 Stavros Sachtouris
395 f3e94e06 Stavros Sachtouris
    def main(self, image_id):
396 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
397 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
398 f3e94e06 Stavros Sachtouris
399 234954d1 Stavros Sachtouris
400 d486baec Stavros Sachtouris
@command(image_cmds)
401 8741c407 Stavros Sachtouris
class image_compute_properties(_init_cyclades):
402 15142309 Stavros Sachtouris
    """Get properties related to OS installation in an image"""
403 f3e94e06 Stavros Sachtouris
404 236e7d08 Stavros Sachtouris
    @errors.generic.all
405 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
406 236e7d08 Stavros Sachtouris
    @errors.plankton.id
407 236e7d08 Stavros Sachtouris
    @errors.plankton.metadata
408 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key):
409 236e7d08 Stavros Sachtouris
        r = self.client.get_image_metadata(image_id, key)
410 236e7d08 Stavros Sachtouris
        print_dict(r)
411 236e7d08 Stavros Sachtouris
412 48cae069 Stavros Sachtouris
    def main(self, image_id, key=''):
413 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
414 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key)
415 f3e94e06 Stavros Sachtouris
416 234954d1 Stavros Sachtouris
417 d486baec Stavros Sachtouris
@command(image_cmds)
418 8b516110 Stavros Sachtouris
class image_compute_addproperty(_init_cyclades):
419 15142309 Stavros Sachtouris
    """Add an OS-related property to an image"""
420 f3e94e06 Stavros Sachtouris
421 236e7d08 Stavros Sachtouris
    @errors.generic.all
422 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
423 236e7d08 Stavros Sachtouris
    @errors.plankton.id
424 b04288f7 Stavros Sachtouris
    @errors.plankton.metadata
425 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key, val):
426 236e7d08 Stavros Sachtouris
        r = self.client.create_image_metadata(image_id, key, val)
427 236e7d08 Stavros Sachtouris
        print_dict(r)
428 236e7d08 Stavros Sachtouris
429 f3e94e06 Stavros Sachtouris
    def main(self, image_id, key, val):
430 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
431 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key, val=val)
432 f3e94e06 Stavros Sachtouris
433 234954d1 Stavros Sachtouris
434 d486baec Stavros Sachtouris
@command(image_cmds)
435 8741c407 Stavros Sachtouris
class image_compute_setproperty(_init_cyclades):
436 15142309 Stavros Sachtouris
    """Update an existing property in an image"""
437 f3e94e06 Stavros Sachtouris
438 236e7d08 Stavros Sachtouris
    @errors.generic.all
439 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
440 236e7d08 Stavros Sachtouris
    @errors.plankton.id
441 b04288f7 Stavros Sachtouris
    @errors.plankton.metadata
442 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key, val):
443 f3e94e06 Stavros Sachtouris
        metadata = {key: val}
444 236e7d08 Stavros Sachtouris
        r = self.client.update_image_metadata(image_id, **metadata)
445 236e7d08 Stavros Sachtouris
        print_dict(r)
446 236e7d08 Stavros Sachtouris
447 236e7d08 Stavros Sachtouris
    def main(self, image_id, key, val):
448 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
449 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key, val=val)
450 f3e94e06 Stavros Sachtouris
451 234954d1 Stavros Sachtouris
452 d486baec Stavros Sachtouris
@command(image_cmds)
453 8741c407 Stavros Sachtouris
class image_compute_delproperty(_init_cyclades):
454 15142309 Stavros Sachtouris
    """Delete a property of an image"""
455 f3e94e06 Stavros Sachtouris
456 236e7d08 Stavros Sachtouris
    @errors.generic.all
457 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
458 236e7d08 Stavros Sachtouris
    @errors.plankton.id
459 236e7d08 Stavros Sachtouris
    @errors.plankton.metadata
460 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key):
461 236e7d08 Stavros Sachtouris
        self.client.delete_image_metadata(image_id, key)
462 236e7d08 Stavros Sachtouris
463 f3e94e06 Stavros Sachtouris
    def main(self, image_id, key):
464 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
465 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key)