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