Revision 89ea97e1 kamaki/cli/commands/cyclades.py

b/kamaki/cli/commands/cyclades.py
33 33

  
34 34
from kamaki.cli import command
35 35
from kamaki.cli.command_tree import CommandTree
36
from kamaki.cli.utils import print_dict, remove_from_items
36
from kamaki.cli.utils import (
37
    print_dict, remove_from_items, filter_dicts_by_dict)
37 38
from kamaki.cli.errors import raiseCLIError, CLISyntaxError, CLIBaseUrlError
38 39
from kamaki.clients.cyclades import CycladesClient, ClientError
39 40
from kamaki.cli.argument import FlagArgument, ValueArgument, KeyValueArgument
......
157 158
class server_list(_init_cyclades, _optional_json):
158 159
    """List Virtual Machines accessible by user"""
159 160

  
161
    PERMANENTS = ('id', 'name')
162

  
160 163
    __doc__ += about_authentication
161 164

  
162 165
    arguments = dict(
......
168 171
        more=FlagArgument(
169 172
            'output results in pages (-n to set items per page, default 10)',
170 173
            '--more'),
171
        enum=FlagArgument('Enumerate results', '--enumerate')
174
        enum=FlagArgument('Enumerate results', '--enumerate'),
175
        name=ValueArgument('filter by name', '--name'),
176
        name_pref=ValueArgument(
177
            'filter by name prefix (case insensitive)', '--name-prefix'),
178
        name_suff=ValueArgument(
179
            'filter by name suffix (case insensitive)', '--name-suffix'),
180
        name_like=ValueArgument(
181
            'print only if name contains this (case insensitive)',
182
            '--name-like'),
183
        flavor_id=ValueArgument('filter by flavor id', ('--flavor-id')),
184
        image_id=ValueArgument('filter by image id', ('--image-id')),
185
        meta=KeyValueArgument('filter by metadata key=values', ('--metadata')),
186
        meta_like=KeyValueArgument(
187
            'print only if in key=value, the value is part of actual value',
188
            ('--metadata-like')),
172 189
    )
173 190

  
191
    def _filtered_by_name(self, servers):
192
        if self['name']:
193
            servers = filter_dicts_by_dict(servers, dict(name=self['name']))
194
        np, ns, nl = self['name_pref'], self['name_suff'], self['name_like']
195
        return [img for img in servers if (
196
            (not np) or img['name'].lower().startswith(np.lower())) and (
197
            (not ns) or img['name'].lower().endswith(ns.lower())) and (
198
            (not nl) or nl.lower() in img['name'].lower())]
199

  
200
    def _filtered_by_image(self, servers):
201
        iid = self['image_id']
202
        new_servers = []
203
        for srv in servers:
204
            if srv['image']['id'] == iid:
205
                new_servers.append(srv)
206
        return new_servers
207

  
208
    def _filtered_by_flavor(self, servers):
209
        fid = self['flavor_id']
210
        new_servers = []
211
        for srv in servers:
212
            if '%s' % srv['flavor']['id'] == '%s' % fid:
213
                new_servers.append(srv)
214
        return new_servers
215

  
216
    def _filtered_by_metadata(self, servers):
217
        new_servers = []
218
        for srv in servers:
219
            if not 'metadata' in srv:
220
                continue
221
            meta = [dict(srv['metadata'])]
222
            if self['meta']:
223
                meta = filter_dicts_by_dict(meta, self['meta'])
224
            if meta and self['meta_like']:
225
                meta = filter_dicts_by_dict(
226
                    meta, self['meta_like'], exact_match=False)
227
            if meta:
228
                new_servers.append(srv)
229
        return new_servers
230

  
174 231
    @errors.generic.all
175 232
    @errors.cyclades.connection
176 233
    @errors.cyclades.date
177 234
    def _run(self):
178
        servers = self.client.list_servers(self['detail'], self['since'])
235
        withimage = bool(self['image_id'])
236
        withflavor = bool(self['flavor_id'])
237
        withmeta = bool(self['meta'] or self['meta_like'])
238
        detail = self['detail'] or withimage or withflavor or withmeta
239
        servers = self.client.list_servers(detail, self['since'])
240

  
241
        servers = self._filtered_by_name(servers)
242
        if withimage:
243
            servers = self._filtered_by_image(servers)
244
        if withflavor:
245
            servers = self._filtered_by_flavor(servers)
246
        if withmeta:
247
            servers = self._filtered_by_metadata(servers)
248

  
179 249
        if not (self['detail'] or self['json_output']):
180 250
            remove_from_items(servers, 'links')
181

  
251
        #if self['detail'] and not self['json_output']:
252
        #    servers = self._add_owner_name(servers)
253
        if detail and not self['detail']:
254
            for srv in servers:
255
                for key in set(srv).difference(self.PERMANENTS):
256
                    srv.pop(key)
182 257
        kwargs = dict(with_enumeration=self['enum'])
183 258
        if self['more']:
184 259
            kwargs['page_size'] = self['limit'] if self['limit'] else 10

Also available in: Unified diff