Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / image_cli.py @ 7b6e977c

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