Revision d8ff7b56 kamaki/cli/commands/cyclades.py

b/kamaki/cli/commands/cyclades.py
175 175
        enum=FlagArgument('Enumerate results', '--enumerate'),
176 176
        flavor_id=ValueArgument('filter by flavor id', ('--flavor-id')),
177 177
        image_id=ValueArgument('filter by image id', ('--image-id')),
178
        user_id=ValueArgument('filter by user id', ('--user-id')),
179
        user_name=ValueArgument('filter by user name', ('--user-name')),
180
        status=ValueArgument(
181
            'filter by status (ACTIVE, STOPPED, REBOOT, ERROR, etc.)',
182
            ('--status')),
178 183
        meta=KeyValueArgument('filter by metadata key=values', ('--metadata')),
179 184
        meta_like=KeyValueArgument(
180 185
            'print only if in key=value, the value is part of actual value',
......
190 195
            srv['tenant_id'] += ' (%s)' % uuids[srv['tenant_id']]
191 196
        return servers
192 197

  
198
    def _apply_common_filters(self, servers):
199
        common_filters = dict()
200
        if self['status']:
201
            common_filters['status'] = self['status']
202
        if self['user_id'] or self['user_name']:
203
            uuid = self['user_id'] or self._username2uuid(self['user_name'])
204
            common_filters['user_id'] = uuid
205
        return filter_dicts_by_dict(servers, common_filters)
206

  
193 207
    def _filter_by_image(self, servers):
194 208
        iid = self['image_id']
195 209
        new_servers = []
......
228 242
        withimage = bool(self['image_id'])
229 243
        withflavor = bool(self['flavor_id'])
230 244
        withmeta = bool(self['meta'] or self['meta_like'])
231
        detail = self['detail'] or withimage or withflavor or withmeta
245
        withcommons = bool(
246
            self['status'] or self['user_id'] or self['user_name'])
247
        detail = self['detail'] or (
248
            withimage or withflavor or withmeta or withcommons)
232 249
        servers = self.client.list_servers(detail, self['since'])
233 250

  
234 251
        servers = self._filter_by_name(servers)
235 252
        servers = self._filter_by_id(servers)
253
        servers = self._apply_common_filters(servers)
236 254
        if withimage:
237 255
            servers = self._filter_by_image(servers)
238 256
        if withflavor:
......
688 706
class flavor_list(_init_cyclades, _optional_json, _name_filter, _id_filter):
689 707
    """List available hardware flavors"""
690 708

  
709
    PERMANENTS = ('id', 'name')
710

  
691 711
    arguments = dict(
692 712
        detail=FlagArgument('show detailed output', ('-l', '--details')),
693 713
        limit=IntArgument('limit # of listed flavors', ('-n', '--number')),
694 714
        more=FlagArgument(
695 715
            'output results in pages (-n to set items per page, default 10)',
696 716
            '--more'),
697
        enum=FlagArgument('Enumerate results', '--enumerate')
717
        enum=FlagArgument('Enumerate results', '--enumerate'),
718
        ram=ValueArgument('filter by ram', ('--ram')),
719
        vcpus=ValueArgument('filter by number of VCPUs', ('--vcpus')),
720
        disk=ValueArgument('filter by disk size in GB', ('--disk')),
721
        disk_template=ValueArgument(
722
            'filter by disk_templace', ('--disk-template'))
698 723
    )
699 724

  
725
    def _apply_common_filters(self, flavors):
726
        common_filters = dict()
727
        if self['ram']:
728
            common_filters['ram'] = self['ram']
729
        if self['vcpus']:
730
            common_filters['vcpus'] = self['vcpus']
731
        if self['disk']:
732
            common_filters['disk'] = self['disk']
733
        if self['disk_template']:
734
            common_filters['SNF:disk_template'] = self['disk_template']
735
        return filter_dicts_by_dict(flavors, common_filters)
736

  
700 737
    @errors.generic.all
701 738
    @errors.cyclades.connection
702 739
    def _run(self):
703
        flavors = self.client.list_flavors(self['detail'])
740
        withcommons = self['ram'] or self['vcpus'] or (
741
            self['disk'] or self['disk_template'])
742
        detail = self['detail'] or withcommons
743
        flavors = self.client.list_flavors(detail)
704 744
        flavors = self._filter_by_name(flavors)
705 745
        flavors = self._filter_by_id(flavors)
746
        if withcommons:
747
            flavors = self._apply_common_filters(flavors)
706 748
        if not (self['detail'] or self['json_output']):
707 749
            remove_from_items(flavors, 'links')
750
        if detail and not self['detail']:
751
            for flv in flavors:
752
                for key in set(flv).difference(self.PERMANENTS):
753
                    flv.pop(key)
708 754
        pg_size = 10 if self['more'] and not self['limit'] else self['limit']
709 755
        self._print(
710 756
            flavors,

Also available in: Unified diff