Revision 6d190dd1 kamaki/cli/commands/cyclades.py

b/kamaki/cli/commands/cyclades.py
40 40
from kamaki.cli.argument import FlagArgument, ValueArgument, KeyValueArgument
41 41
from kamaki.cli.argument import ProgressBarArgument, DateArgument, IntArgument
42 42
from kamaki.cli.commands import _command_init, errors, addLogSettings
43
from kamaki.cli.commands import _optional_output_cmd, _optional_json
43
from kamaki.cli.commands import (
44
    _optional_output_cmd, _optional_json, _name_filter, _id_filter)
44 45

  
45 46
from base64 import b64encode
46 47
from os.path import exists
......
155 156

  
156 157

  
157 158
@command(server_cmds)
158
class server_list(_init_cyclades, _optional_json):
159
class server_list(_init_cyclades, _optional_json, _name_filter, _id_filter):
159 160
    """List Virtual Machines accessible by user"""
160 161

  
161 162
    PERMANENTS = ('id', 'name')
......
172 173
            'output results in pages (-n to set items per page, default 10)',
173 174
            '--more'),
174 175
        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 176
        flavor_id=ValueArgument('filter by flavor id', ('--flavor-id')),
184 177
        image_id=ValueArgument('filter by image id', ('--image-id')),
185 178
        meta=KeyValueArgument('filter by metadata key=values', ('--metadata')),
......
188 181
            ('--metadata-like')),
189 182
    )
190 183

  
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 184
    def _add_user_name(self, servers):
201 185
        uuids = self._uuids2usernames(list(set(
202 186
                [srv['user_id'] for srv in servers] +
......
206 190
            srv['tenant_id'] += ' (%s)' % uuids[srv['tenant_id']]
207 191
        return servers
208 192

  
209
    def _filtered_by_image(self, servers):
193
    def _filter_by_image(self, servers):
210 194
        iid = self['image_id']
211 195
        new_servers = []
212 196
        for srv in servers:
......
214 198
                new_servers.append(srv)
215 199
        return new_servers
216 200

  
217
    def _filtered_by_flavor(self, servers):
201
    def _filter_by_flavor(self, servers):
218 202
        fid = self['flavor_id']
219 203
        new_servers = []
220 204
        for srv in servers:
......
222 206
                new_servers.append(srv)
223 207
        return new_servers
224 208

  
225
    def _filtered_by_metadata(self, servers):
209
    def _filter_by_metadata(self, servers):
226 210
        new_servers = []
227 211
        for srv in servers:
228 212
            if not 'metadata' in srv:
......
247 231
        detail = self['detail'] or withimage or withflavor or withmeta
248 232
        servers = self.client.list_servers(detail, self['since'])
249 233

  
250
        servers = self._filtered_by_name(servers)
234
        servers = self._filter_by_name(servers)
235
        servers = self._filter_by_id(servers)
251 236
        if withimage:
252
            servers = self._filtered_by_image(servers)
237
            servers = self._filter_by_image(servers)
253 238
        if withflavor:
254
            servers = self._filtered_by_flavor(servers)
239
            servers = self._filter_by_flavor(servers)
255 240
        if withmeta:
256
            servers = self._filtered_by_metadata(servers)
241
            servers = self._filter_by_metadata(servers)
257 242

  
258 243
        if self['detail'] and not self['json_output']:
259 244
            servers = self._add_user_name(servers)
......
700 685

  
701 686

  
702 687
@command(flavor_cmds)
703
class flavor_list(_init_cyclades, _optional_json):
688
class flavor_list(_init_cyclades, _optional_json, _name_filter, _id_filter):
704 689
    """List available hardware flavors"""
705 690

  
706 691
    arguments = dict(
......
716 701
    @errors.cyclades.connection
717 702
    def _run(self):
718 703
        flavors = self.client.list_flavors(self['detail'])
704
        flavors = self._filter_by_name(flavors)
705
        flavors = self._filter_by_id(flavors)
719 706
        if not (self['detail'] or self['json_output']):
720 707
            remove_from_items(flavors, 'links')
721 708
        pg_size = 10 if self['more'] and not self['limit'] else self['limit']
......
767 754

  
768 755

  
769 756
@command(network_cmds)
770
class network_list(_init_cyclades, _optional_json):
757
class network_list(_init_cyclades, _optional_json, _name_filter, _id_filter):
771 758
    """List networks"""
772 759

  
773 760
    arguments = dict(
......
783 770
    @errors.cyclades.connection
784 771
    def _run(self):
785 772
        networks = self.client.list_networks(self['detail'])
773
        networks = self._filter_by_name(networks)
774
        networks = self._filter_by_id(networks)
786 775
        if not (self['detail'] or self['json_output']):
787 776
            remove_from_items(networks, 'links')
788 777
        kwargs = dict(with_enumeration=self['enum'])

Also available in: Unified diff