Revision bad9404c

b/snf-cyclades-app/synnefo/api/management/commands/flavor-list.py
34 34
from optparse import make_option
35 35

  
36 36
from django.core.management.base import BaseCommand, CommandError
37
from synnefo.management.common import format_bool
37
from synnefo.management.common import format_bool, filter_results
38 38

  
39 39
from synnefo.db.models import Flavor
40 40

  
41
FIELDS = Flavor._meta.get_all_field_names()
42

  
41 43

  
42 44
class Command(BaseCommand):
43 45
    help = "List flavors"
......
53 55
            dest='deleted',
54 56
            default=False,
55 57
            help="Include deleted flavors"),
58
         make_option('--filter-by',
59
            dest='filter_by',
60
            help="Filter results. Comma seperated list of key=val pairs"
61
                 " that displayed entries must satisfy. e.g."
62
                 " --filter-by \"cpu=1,ram!=1024\"."
63
                 "Available keys are: %s" % ", ".join(FIELDS))
56 64
        )
57 65

  
58 66
    def handle(self, *args, **options):
......
73 81
        else:
74 82
            flavors = Flavor.objects.filter(deleted=False)
75 83

  
84
        filter_by = options['filter_by']
85
        if filter_by:
86
            flavors = filter_results(flavors, filter_by)
87

  
88

  
76 89
        for flavor in flavors.order_by('id'):
77 90
            id = str(flavor.id)
78 91
            cpu = str(flavor.cpu)
b/snf-cyclades-app/synnefo/api/management/commands/network-list.py
34 34
from optparse import make_option
35 35

  
36 36
from django.core.management.base import BaseCommand, CommandError
37
from synnefo.management.common import format_bool
38

  
37
from synnefo.management.common import format_bool, filter_results
39 38
from synnefo.db.models import Network
40 39

  
40
FIELDS = Network._meta.get_all_field_names()
41

  
41 42

  
42 43
class Command(BaseCommand):
43 44
    help = "List networks"
......
63 64
            dest='ipv6',
64 65
            default=False,
65 66
            help="Show IPv6 information of the network"),
67
        make_option('--filter-by',
68
            dest='filter_by',
69
            help="Filter results. Comma seperated list of key 'cond' val pairs"
70
                 " that displayed entries must satisfy. e.g."
71
                 " --filter-by \"name=Network-1,link!=prv0\"."
72
                 " Available keys are: %s" % ", ".join(FIELDS))
73

  
66 74
        )
67 75

  
68 76
    def handle(self, *args, **options):
......
77 85
        if options['public']:
78 86
            networks = networks.filter(public=True)
79 87

  
88
        filter_by = options['filter_by']
89
        if filter_by:
90
            networks = filter_results(networks, filter_by)
91

  
80 92
        labels = ['id', 'name', 'type', 'owner',
81 93
                  'mac_prefix', 'dhcp', 'state', 'link', 'vms', 'public']
82 94
        columns = [3, 16, 22, 30, 10, 6, 8, 12, 4, 6]
b/snf-cyclades-app/synnefo/api/management/commands/server-list.py
34 34
from optparse import make_option
35 35

  
36 36
from django.core.management.base import BaseCommand, CommandError
37
from synnefo.management.common import format_vm_state, get_backend
38

  
37
from synnefo.management.common import (format_vm_state, get_backend,
38
                                       filter_results)
39 39
from synnefo.api.util import get_image
40 40
from synnefo.db.models import VirtualMachine
41 41

  
42 42

  
43
FIELDS = VirtualMachine._meta.get_all_field_names()
44

  
45

  
43 46
class Command(BaseCommand):
44 47
    help = "List servers"
45 48

  
......
59 62
            dest='build',
60 63
            default=False,
61 64
            help="List only servers in the building state"),
62
        make_option('--deleted', action='store_true', dest='deleted',
63
                    default=False,
64
                    help="Include deletd servers"),
65
        make_option('--backend-id', dest='backend_id',
66
                    help="List only servers of the specified backend")
65
        make_option('--deleted',
66
            action='store_true',
67
            dest='deleted',
68
            default=False,
69
            help="Include deleted servers"),
70
        make_option('--backend-id',
71
            dest='backend_id',
72
            help="List only servers of the specified backend"),
73
        make_option('--filter-by',
74
            dest='filter_by',
75
            help="Filter results. Comma seperated list of key `cond` val pairs"
76
                 " that displayed entries must satisfy. e.g."
77
                 " --filter-by \"operstate=STARTED,id>=22\"."
78
                 " Available keys are: %s" % ", ".join(FIELDS))
67 79
        )
68 80

  
69 81
    def handle(self, *args, **options):
......
87 99
        if options['build']:
88 100
            servers = servers.filter(operstate='BUILD')
89 101

  
102
        filter_by = options['filter_by']
103
        if filter_by:
104
            servers = filter_results(servers, filter_by)
105

  
90 106
        labels = ('id', 'name', 'owner', 'flavor', 'image', 'state',
91 107
                  'backend')
92 108
        columns = (3, 12, 20, 11, 12, 9, 40)
b/snf-cyclades-app/synnefo/management/common.py
41 41
from synnefo.db.models import Backend, VirtualMachine, Network, Flavor
42 42
from synnefo.api.util import get_image as backend_get_image
43 43
from synnefo.api.faults import ItemNotFound
44
from django.core.exceptions import FieldError
45

  
44 46

  
45 47
from synnefo.api.util import validate_network_size
46 48
from synnefo.settings import MAX_CIDR_BLOCK
......
158 160
        raise CommandError("Flavor with ID %s not found in DB."
159 161
                           " Use snf-manage flavor-list to find out"
160 162
                           " available flavor IDs." % flavor_id)
163

  
164

  
165
def filter_results(objects, filter_by):
166
    filter_list = filter_by.split(",")
167
    filter_dict = {}
168
    exclude_dict = {}
169

  
170
    def map_field_type(query):
171
        def fix_bool(val):
172
            if val.lower() in ("yes", "true", "t"):
173
                return True
174
            if val.lower() in ("no", "false", "f"):
175
                return False
176
            return val
177

  
178
        if "!=" in query:
179
            key, val = query.split("!=")
180
            exclude_dict[key] = fix_bool(val)
181
            return
182
        OP_MAP = {
183
            ">=": "__gte",
184
            "=>": "__gte",
185
            ">":  "__gt",
186
            "<=": "__lte",
187
            "=<": "__lte",
188
            "<":  "__lt",
189
            "=":  ""
190
        }
191
        for op, new_op in OP_MAP.items():
192
            if op in query:
193
                key, val = query.split(op)
194
                filter_dict[key + new_op] = fix_bool(val)
195
                return
196

  
197
    map(lambda x: map_field_type(x), filter_list)
198

  
199
    try:
200
        objects = objects.filter(**filter_dict)
201
        return objects.exclude(**exclude_dict)
202
    except FieldError as e:
203
        raise CommandError(e)

Also available in: Unified diff