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