Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / image_cli.py @ 89ecfa57

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