Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / image_cli.py @ 8741c407

History | View | Annotate | Download (13 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 03fd7ddb Stavros Sachtouris
from kamaki.cli.commands.cyclades_cli import _init_cyclades
41 a03ade9e Stavros Sachtouris
from kamaki.cli.commands import _command_init, errors
42 0b368c8c Stavros Sachtouris
43 234954d1 Stavros Sachtouris
44 8741c407 Stavros Sachtouris
image_cmds = CommandTree('image', 'Plankton Image API commands')
45 d486baec Stavros Sachtouris
_commands = [image_cmds]
46 234954d1 Stavros Sachtouris
47 234954d1 Stavros Sachtouris
48 15142309 Stavros Sachtouris
about_image_id = ['To see a list of available image ids: /image list']
49 15142309 Stavros Sachtouris
50 15142309 Stavros Sachtouris
51 5eae854d Stavros Sachtouris
class _init_image(_command_init):
52 a03ade9e Stavros Sachtouris
    @errors.generic.all
53 a03ade9e Stavros Sachtouris
    def _run(self):
54 a03ade9e Stavros Sachtouris
        token = self.config.get('image', 'token')\
55 a03ade9e Stavros Sachtouris
            or self.config.get('compute', 'token')\
56 a03ade9e Stavros Sachtouris
            or self.config.get('global', 'token')
57 a03ade9e Stavros Sachtouris
        base_url = self.config.get('image', 'url')\
58 a03ade9e Stavros Sachtouris
            or self.config.get('compute', 'url')\
59 a03ade9e Stavros Sachtouris
            or self.config.get('global', 'url')
60 a03ade9e Stavros Sachtouris
        self.client = ImageClient(base_url=base_url, token=token)
61 a03ade9e Stavros Sachtouris
62 7493ccb6 Stavros Sachtouris
    def main(self):
63 a03ade9e Stavros Sachtouris
        self._run()
64 7493ccb6 Stavros Sachtouris
65 234954d1 Stavros Sachtouris
66 d486baec Stavros Sachtouris
@command(image_cmds)
67 7493ccb6 Stavros Sachtouris
class image_public(_init_image):
68 7493ccb6 Stavros Sachtouris
    """List public images"""
69 7493ccb6 Stavros Sachtouris
70 1ae79e60 Stavros Sachtouris
    arguments = dict(
71 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
72 1ae79e60 Stavros Sachtouris
        container_format=ValueArgument(
73 1ae79e60 Stavros Sachtouris
            'filter by container format',
74 1ae79e60 Stavros Sachtouris
            '--container-format'),
75 1ae79e60 Stavros Sachtouris
        disk_format=ValueArgument('filter by disk format', '--disk-format'),
76 1ae79e60 Stavros Sachtouris
        name=ValueArgument('filter by name', '--name'),
77 1ae79e60 Stavros Sachtouris
        size_min=IntArgument('filter by minimum size', '--size-min'),
78 1ae79e60 Stavros Sachtouris
        size_max=IntArgument('filter by maximum size', '--size-max'),
79 1ae79e60 Stavros Sachtouris
        status=ValueArgument('filter by status', '--status'),
80 1ae79e60 Stavros Sachtouris
        order=ValueArgument(
81 1ae79e60 Stavros Sachtouris
            'order by FIELD ( - to reverse order)',
82 1ae79e60 Stavros Sachtouris
            '--order',
83 83c3ba87 Stavros Sachtouris
            default=''),
84 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit number of listed images', ('-n', '--number')),
85 83c3ba87 Stavros Sachtouris
        more=FlagArgument(
86 83c3ba87 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
87 83c3ba87 Stavros Sachtouris
            '--more')
88 1ae79e60 Stavros Sachtouris
    )
89 7493ccb6 Stavros Sachtouris
90 a03ade9e Stavros Sachtouris
    @errors.generic.all
91 a03ade9e Stavros Sachtouris
    @errors.cyclades.connection
92 a03ade9e Stavros Sachtouris
    def _run(self):
93 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
94 7493ccb6 Stavros Sachtouris
        filters = {}
95 fa984c2c Stavros Sachtouris
        for arg in set([
96 1ae79e60 Stavros Sachtouris
                'container_format',
97 1ae79e60 Stavros Sachtouris
                'disk_format',
98 1ae79e60 Stavros Sachtouris
                'name',
99 1ae79e60 Stavros Sachtouris
                'size_min',
100 1ae79e60 Stavros Sachtouris
                'size_max',
101 de73876b Stavros Sachtouris
                'status']).intersection(self.arguments):
102 1ae79e60 Stavros Sachtouris
            filters[arg] = self[arg]
103 1ae79e60 Stavros Sachtouris
104 1ae79e60 Stavros Sachtouris
        order = self['order']
105 1ae79e60 Stavros Sachtouris
        detail = self['detail']
106 a03ade9e Stavros Sachtouris
        images = self.client.list_public(detail, filters, order)
107 83c3ba87 Stavros Sachtouris
        if self['more']:
108 83c3ba87 Stavros Sachtouris
            print_items(
109 83c3ba87 Stavros Sachtouris
                images,
110 83c3ba87 Stavros Sachtouris
                title=('name',),
111 83c3ba87 Stavros Sachtouris
                with_enumeration=True,
112 f769a16a Stavros Sachtouris
                page_size=self['limit'] or 10)
113 83c3ba87 Stavros Sachtouris
        elif self['limit']:
114 83c3ba87 Stavros Sachtouris
            print_items(
115 83c3ba87 Stavros Sachtouris
                images[:self['limit']],
116 83c3ba87 Stavros Sachtouris
                title=('name',),
117 83c3ba87 Stavros Sachtouris
                with_enumeration=True)
118 83c3ba87 Stavros Sachtouris
        else:
119 83c3ba87 Stavros Sachtouris
            print_items(images, title=('name',), with_enumeration=True)
120 7493ccb6 Stavros Sachtouris
121 a03ade9e Stavros Sachtouris
    def main(self):
122 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
123 a03ade9e Stavros Sachtouris
        self._run()
124 a03ade9e Stavros Sachtouris
125 234954d1 Stavros Sachtouris
126 d486baec Stavros Sachtouris
@command(image_cmds)
127 7493ccb6 Stavros Sachtouris
class image_meta(_init_image):
128 15142309 Stavros Sachtouris
    """Get image metadata
129 15142309 Stavros Sachtouris
    Image metadata include:
130 439826ec Stavros Sachtouris
    - image file information (location, size, etc.)
131 439826ec Stavros Sachtouris
    - image information (id, name, etc.)
132 439826ec Stavros Sachtouris
    - image os properties (os, fs, etc.)
133 15142309 Stavros Sachtouris
    """
134 7493ccb6 Stavros Sachtouris
135 a03ade9e Stavros Sachtouris
    @errors.generic.all
136 a03ade9e Stavros Sachtouris
    @errors.plankton.connection
137 a03ade9e Stavros Sachtouris
    @errors.plankton.id
138 a03ade9e Stavros Sachtouris
    def _run(self, image_id):
139 a03ade9e Stavros Sachtouris
        image = self.client.get_meta(image_id)
140 7493ccb6 Stavros Sachtouris
        print_dict(image)
141 7493ccb6 Stavros Sachtouris
142 a03ade9e Stavros Sachtouris
    def main(self, image_id):
143 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
144 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
145 a03ade9e Stavros Sachtouris
146 234954d1 Stavros Sachtouris
147 d486baec Stavros Sachtouris
@command(image_cmds)
148 7493ccb6 Stavros Sachtouris
class image_register(_init_image):
149 fc903073 Stavros Sachtouris
    """(Re)Register an image"""
150 7493ccb6 Stavros Sachtouris
151 1ae79e60 Stavros Sachtouris
    arguments = dict(
152 1ae79e60 Stavros Sachtouris
        checksum=ValueArgument('set image checksum', '--checksum'),
153 1ae79e60 Stavros Sachtouris
        container_format=ValueArgument(
154 1ae79e60 Stavros Sachtouris
            'set container format',
155 1ae79e60 Stavros Sachtouris
            '--container-format'),
156 1ae79e60 Stavros Sachtouris
        disk_format=ValueArgument('set disk format', '--disk-format'),
157 1ae79e60 Stavros Sachtouris
        id=ValueArgument('set image ID', '--id'),
158 1ae79e60 Stavros Sachtouris
        owner=ValueArgument('set image owner (admin only)', '--owner'),
159 1ae79e60 Stavros Sachtouris
        properties=KeyValueArgument(
160 1ae79e60 Stavros Sachtouris
            'add property in key=value form (can be repeated)',
161 f40f0cb7 Stavros Sachtouris
            ('-p, --property')),
162 1ae79e60 Stavros Sachtouris
        is_public=FlagArgument('mark image as public', '--public'),
163 1ae79e60 Stavros Sachtouris
        size=IntArgument('set image size', '--size'),
164 f40f0cb7 Stavros Sachtouris
        update=FlagArgument(
165 f40f0cb7 Stavros Sachtouris
            'update existing image properties',
166 f40f0cb7 Stavros Sachtouris
            ('-u', '--update'))
167 1ae79e60 Stavros Sachtouris
    )
168 7493ccb6 Stavros Sachtouris
169 a03ade9e Stavros Sachtouris
    @errors.generic.all
170 a03ade9e Stavros Sachtouris
    @errors.plankton.connection
171 a03ade9e Stavros Sachtouris
    def _run(self, name, location):
172 7493ccb6 Stavros Sachtouris
        if not location.startswith('pithos://'):
173 f3e94e06 Stavros Sachtouris
            account = self.config.get('store', 'account') \
174 f3e94e06 Stavros Sachtouris
                or self.config.get('global', 'account')
175 8741c407 Stavros Sachtouris
            assert account, 'No user account provided'
176 7493ccb6 Stavros Sachtouris
            if account[-1] == '/':
177 7493ccb6 Stavros Sachtouris
                account = account[:-1]
178 f3e94e06 Stavros Sachtouris
            container = self.config.get('store', 'container') \
179 f3e94e06 Stavros Sachtouris
                or self.config.get('global', 'container')
180 f769a16a Stavros Sachtouris
            if not container:
181 234954d1 Stavros Sachtouris
                location = 'pithos://%s/%s' % (account, location)
182 234954d1 Stavros Sachtouris
            else:
183 234954d1 Stavros Sachtouris
                location = 'pithos://%s/%s/%s' % (account, container, location)
184 7493ccb6 Stavros Sachtouris
185 7493ccb6 Stavros Sachtouris
        params = {}
186 f769a16a Stavros Sachtouris
        for key in set([
187 1ae79e60 Stavros Sachtouris
                'checksum',
188 1ae79e60 Stavros Sachtouris
                'container_format',
189 1ae79e60 Stavros Sachtouris
                'disk_format',
190 1ae79e60 Stavros Sachtouris
                'id',
191 1ae79e60 Stavros Sachtouris
                'owner',
192 1ae79e60 Stavros Sachtouris
                'size',
193 de73876b Stavros Sachtouris
                'is_public']).intersection(self.arguments):
194 1ae79e60 Stavros Sachtouris
            params[key] = self[key]
195 1ae79e60 Stavros Sachtouris
196 1ae79e60 Stavros Sachtouris
            properties = self['properties']
197 a03ade9e Stavros Sachtouris
        if self['update']:
198 a03ade9e Stavros Sachtouris
            self.client.reregister(location, name, params, properties)
199 a03ade9e Stavros Sachtouris
        else:
200 a03ade9e Stavros Sachtouris
            self.client.register(name, location, params, properties)
201 a03ade9e Stavros Sachtouris
202 a03ade9e Stavros Sachtouris
    def main(self, name, location):
203 a03ade9e Stavros Sachtouris
        super(self.__class__, self)._run()
204 a03ade9e Stavros Sachtouris
        self._run(name, location)
205 7493ccb6 Stavros Sachtouris
206 234954d1 Stavros Sachtouris
207 d486baec Stavros Sachtouris
@command(image_cmds)
208 7493ccb6 Stavros Sachtouris
class image_members(_init_image):
209 7493ccb6 Stavros Sachtouris
    """Get image members"""
210 7493ccb6 Stavros Sachtouris
211 236e7d08 Stavros Sachtouris
    @errors.generic.all
212 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
213 236e7d08 Stavros Sachtouris
    @errors.plankton.id
214 236e7d08 Stavros Sachtouris
    def _run(self, image_id):
215 236e7d08 Stavros Sachtouris
        members = self.client.list_members(image_id)
216 fc903073 Stavros Sachtouris
        print_items(members)
217 7493ccb6 Stavros Sachtouris
218 236e7d08 Stavros Sachtouris
    def main(self, image_id):
219 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
220 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
221 236e7d08 Stavros Sachtouris
222 234954d1 Stavros Sachtouris
223 d486baec Stavros Sachtouris
@command(image_cmds)
224 7493ccb6 Stavros Sachtouris
class image_shared(_init_image):
225 15142309 Stavros Sachtouris
    """List images shared by a member"""
226 7493ccb6 Stavros Sachtouris
227 236e7d08 Stavros Sachtouris
    @errors.generic.all
228 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
229 236e7d08 Stavros Sachtouris
    def _run(self, member):
230 236e7d08 Stavros Sachtouris
        images = self.client.list_shared(member)
231 fc903073 Stavros Sachtouris
        print_items(images)
232 7493ccb6 Stavros Sachtouris
233 236e7d08 Stavros Sachtouris
    def main(self, member):
234 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
235 236e7d08 Stavros Sachtouris
        self._run(member)
236 236e7d08 Stavros Sachtouris
237 234954d1 Stavros Sachtouris
238 d486baec Stavros Sachtouris
@command(image_cmds)
239 7493ccb6 Stavros Sachtouris
class image_addmember(_init_image):
240 7493ccb6 Stavros Sachtouris
    """Add a member to an image"""
241 7493ccb6 Stavros Sachtouris
242 236e7d08 Stavros Sachtouris
    @errors.generic.all
243 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
244 236e7d08 Stavros Sachtouris
    @errors.plankton.id
245 b04288f7 Stavros Sachtouris
    def _run(self, image_id=None, member=None):
246 7493ccb6 Stavros Sachtouris
            self.client.add_member(image_id, member)
247 236e7d08 Stavros Sachtouris
248 236e7d08 Stavros Sachtouris
    def main(self, image_id, member):
249 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
250 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, member=member)
251 7493ccb6 Stavros Sachtouris
252 234954d1 Stavros Sachtouris
253 d486baec Stavros Sachtouris
@command(image_cmds)
254 7493ccb6 Stavros Sachtouris
class image_delmember(_init_image):
255 7493ccb6 Stavros Sachtouris
    """Remove a member from an image"""
256 7493ccb6 Stavros Sachtouris
257 236e7d08 Stavros Sachtouris
    @errors.generic.all
258 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
259 236e7d08 Stavros Sachtouris
    @errors.plankton.id
260 b04288f7 Stavros Sachtouris
    def _run(self, image_id=None, member=None):
261 7493ccb6 Stavros Sachtouris
            self.client.remove_member(image_id, member)
262 236e7d08 Stavros Sachtouris
263 236e7d08 Stavros Sachtouris
    def main(self, image_id, member):
264 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
265 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, member=member)
266 7493ccb6 Stavros Sachtouris
267 234954d1 Stavros Sachtouris
268 d486baec Stavros Sachtouris
@command(image_cmds)
269 7493ccb6 Stavros Sachtouris
class image_setmembers(_init_image):
270 7493ccb6 Stavros Sachtouris
    """Set the members of an image"""
271 7493ccb6 Stavros Sachtouris
272 236e7d08 Stavros Sachtouris
    @errors.generic.all
273 236e7d08 Stavros Sachtouris
    @errors.plankton.connection
274 236e7d08 Stavros Sachtouris
    @errors.plankton.id
275 b04288f7 Stavros Sachtouris
    def _run(self, image_id, members):
276 236e7d08 Stavros Sachtouris
            self.client.set_members(image_id, members)
277 236e7d08 Stavros Sachtouris
278 236e7d08 Stavros Sachtouris
    def main(self, image_id, *members):
279 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
280 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, members=members)
281 f3e94e06 Stavros Sachtouris
282 f3e94e06 Stavros Sachtouris
283 d486baec Stavros Sachtouris
@command(image_cmds)
284 8741c407 Stavros Sachtouris
class image_compute(_init_cyclades):
285 8741c407 Stavros Sachtouris
    """Compute Image API commands"""
286 8741c407 Stavros Sachtouris
287 8741c407 Stavros Sachtouris
288 8741c407 Stavros Sachtouris
@command(image_cmds)
289 8741c407 Stavros Sachtouris
class image_compute_list(_init_cyclades):
290 f3e94e06 Stavros Sachtouris
    """List images"""
291 f3e94e06 Stavros Sachtouris
292 1ae79e60 Stavros Sachtouris
    arguments = dict(
293 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
294 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit number listed images', ('-n', '--number')),
295 15142309 Stavros Sachtouris
        more=FlagArgument(
296 15142309 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
297 15142309 Stavros Sachtouris
            '--more')
298 1ae79e60 Stavros Sachtouris
    )
299 f3e94e06 Stavros Sachtouris
300 15142309 Stavros Sachtouris
    def _make_results_pretty(self, images):
301 f3e94e06 Stavros Sachtouris
        for img in images:
302 15142309 Stavros Sachtouris
            if 'metadata' in img:
303 15142309 Stavros Sachtouris
                img['metadata'] = img['metadata']['values']
304 f3e94e06 Stavros Sachtouris
305 236e7d08 Stavros Sachtouris
    @errors.generic.all
306 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
307 236e7d08 Stavros Sachtouris
    def _run(self):
308 236e7d08 Stavros Sachtouris
        images = self.client.list_images(self['detail'])
309 236e7d08 Stavros Sachtouris
        if self['detail']:
310 236e7d08 Stavros Sachtouris
            self._make_results_pretty(images)
311 236e7d08 Stavros Sachtouris
        if self['more']:
312 f769a16a Stavros Sachtouris
            print_items(images, page_size=self['limit'] or 10)
313 236e7d08 Stavros Sachtouris
        else:
314 f769a16a Stavros Sachtouris
            print_items(images[:self['limit']])
315 236e7d08 Stavros Sachtouris
316 f3e94e06 Stavros Sachtouris
    def main(self):
317 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
318 236e7d08 Stavros Sachtouris
        self._run()
319 f3e94e06 Stavros Sachtouris
320 234954d1 Stavros Sachtouris
321 d486baec Stavros Sachtouris
@command(image_cmds)
322 8741c407 Stavros Sachtouris
class image_compute_info(_init_cyclades):
323 15142309 Stavros Sachtouris
    """Get detailed information on an image"""
324 f3e94e06 Stavros Sachtouris
325 236e7d08 Stavros Sachtouris
    @errors.generic.all
326 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
327 236e7d08 Stavros Sachtouris
    @errors.plankton.id
328 236e7d08 Stavros Sachtouris
    def _run(self, image_id):
329 236e7d08 Stavros Sachtouris
        image = self.client.get_image_details(image_id)
330 234954d1 Stavros Sachtouris
        if 'metadata' in image:
331 f3e94e06 Stavros Sachtouris
            image['metadata'] = image['metadata']['values']
332 236e7d08 Stavros Sachtouris
        print_dict(image)
333 f3e94e06 Stavros Sachtouris
334 f3e94e06 Stavros Sachtouris
    def main(self, image_id):
335 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
336 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
337 f3e94e06 Stavros Sachtouris
338 234954d1 Stavros Sachtouris
339 d486baec Stavros Sachtouris
@command(image_cmds)
340 8741c407 Stavros Sachtouris
class image_compute_delete(_init_cyclades):
341 24ff0a35 Stavros Sachtouris
    """Delete an image (WARNING: image file is also removed)"""
342 f3e94e06 Stavros Sachtouris
343 236e7d08 Stavros Sachtouris
    @errors.generic.all
344 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
345 236e7d08 Stavros Sachtouris
    @errors.plankton.id
346 236e7d08 Stavros Sachtouris
    def _run(self, image_id):
347 236e7d08 Stavros Sachtouris
        self.client.delete_image(image_id)
348 236e7d08 Stavros Sachtouris
349 f3e94e06 Stavros Sachtouris
    def main(self, image_id):
350 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
351 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id)
352 f3e94e06 Stavros Sachtouris
353 234954d1 Stavros Sachtouris
354 d486baec Stavros Sachtouris
@command(image_cmds)
355 8741c407 Stavros Sachtouris
class image_compute_properties(_init_cyclades):
356 15142309 Stavros Sachtouris
    """Get properties related to OS installation in an image"""
357 f3e94e06 Stavros Sachtouris
358 236e7d08 Stavros Sachtouris
    @errors.generic.all
359 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
360 236e7d08 Stavros Sachtouris
    @errors.plankton.id
361 236e7d08 Stavros Sachtouris
    @errors.plankton.metadata
362 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key):
363 236e7d08 Stavros Sachtouris
        r = self.client.get_image_metadata(image_id, key)
364 236e7d08 Stavros Sachtouris
        print_dict(r)
365 236e7d08 Stavros Sachtouris
366 48cae069 Stavros Sachtouris
    def main(self, image_id, key=''):
367 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
368 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key)
369 f3e94e06 Stavros Sachtouris
370 234954d1 Stavros Sachtouris
371 d486baec Stavros Sachtouris
@command(image_cmds)
372 f3e94e06 Stavros Sachtouris
class image_addproperty(_init_cyclades):
373 15142309 Stavros Sachtouris
    """Add an OS-related property to an image"""
374 f3e94e06 Stavros Sachtouris
375 236e7d08 Stavros Sachtouris
    @errors.generic.all
376 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
377 236e7d08 Stavros Sachtouris
    @errors.plankton.id
378 b04288f7 Stavros Sachtouris
    @errors.plankton.metadata
379 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key, val):
380 236e7d08 Stavros Sachtouris
        r = self.client.create_image_metadata(image_id, key, val)
381 236e7d08 Stavros Sachtouris
        print_dict(r)
382 236e7d08 Stavros Sachtouris
383 f3e94e06 Stavros Sachtouris
    def main(self, image_id, key, val):
384 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
385 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key, val=val)
386 f3e94e06 Stavros Sachtouris
387 234954d1 Stavros Sachtouris
388 d486baec Stavros Sachtouris
@command(image_cmds)
389 8741c407 Stavros Sachtouris
class image_compute_setproperty(_init_cyclades):
390 15142309 Stavros Sachtouris
    """Update an existing property in an image"""
391 f3e94e06 Stavros Sachtouris
392 236e7d08 Stavros Sachtouris
    @errors.generic.all
393 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
394 236e7d08 Stavros Sachtouris
    @errors.plankton.id
395 b04288f7 Stavros Sachtouris
    @errors.plankton.metadata
396 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key, val):
397 f3e94e06 Stavros Sachtouris
        metadata = {key: val}
398 236e7d08 Stavros Sachtouris
        r = self.client.update_image_metadata(image_id, **metadata)
399 236e7d08 Stavros Sachtouris
        print_dict(r)
400 236e7d08 Stavros Sachtouris
401 236e7d08 Stavros Sachtouris
    def main(self, image_id, key, val):
402 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
403 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key, val=val)
404 f3e94e06 Stavros Sachtouris
405 234954d1 Stavros Sachtouris
406 d486baec Stavros Sachtouris
@command(image_cmds)
407 8741c407 Stavros Sachtouris
class image_compute_delproperty(_init_cyclades):
408 15142309 Stavros Sachtouris
    """Delete a property of an image"""
409 f3e94e06 Stavros Sachtouris
410 236e7d08 Stavros Sachtouris
    @errors.generic.all
411 236e7d08 Stavros Sachtouris
    @errors.cyclades.connection
412 236e7d08 Stavros Sachtouris
    @errors.plankton.id
413 236e7d08 Stavros Sachtouris
    @errors.plankton.metadata
414 236e7d08 Stavros Sachtouris
    def _run(self, image_id, key):
415 236e7d08 Stavros Sachtouris
        self.client.delete_image_metadata(image_id, key)
416 236e7d08 Stavros Sachtouris
417 f3e94e06 Stavros Sachtouris
    def main(self, image_id, key):
418 236e7d08 Stavros Sachtouris
        super(self.__class__, self)._run()
419 b04288f7 Stavros Sachtouris
        self._run(image_id=image_id, key=key)