Revision f3740b99 kamaki/cli/commands/network.py
b/kamaki/cli/commands/network.py | ||
---|---|---|
38 | 38 |
from kamaki.cli.command_tree import CommandTree |
39 | 39 |
from kamaki.cli.errors import ( |
40 | 40 |
CLIBaseUrlError, CLIInvalidArgument, raiseCLIError) |
41 |
from kamaki.clients.cyclades import CycladesNetworkClient |
|
41 |
from kamaki.clients.cyclades import CycladesNetworkClient, ClientError
|
|
42 | 42 |
from kamaki.cli.argument import ( |
43 | 43 |
FlagArgument, ValueArgument, RepeatableArgument, IntArgument) |
44 | 44 |
from kamaki.cli.commands import _command_init, errors, addLogSettings |
45 | 45 |
from kamaki.cli.commands import ( |
46 | 46 |
_optional_output_cmd, _optional_json, _name_filter, _id_filter) |
47 |
from kamaki.cli.utils import filter_dicts_by_dict |
|
48 | 47 |
from kamaki.cli.commands.cyclades import _service_wait |
49 | 48 |
|
50 | 49 |
|
... | ... | |
93 | 92 |
else: |
94 | 93 |
raise CLIBaseUrlError(service='network') |
95 | 94 |
|
95 |
def _filter_by_user_id(self, nets): |
|
96 |
return [net for net in nets if net['user_id'] == self['user_id']] if ( |
|
97 |
self['user_id']) else nets |
|
98 |
|
|
96 | 99 |
def main(self): |
97 | 100 |
self._run() |
98 | 101 |
|
... | ... | |
112 | 115 |
'show only networks belonging to user with this id', '--user-id') |
113 | 116 |
) |
114 | 117 |
|
115 |
def _filter_by_user_id(self, nets): |
|
116 |
return filter_dicts_by_dict(nets, dict(user_id=self['user_id'])) if ( |
|
117 |
self['user_id']) else nets |
|
118 |
|
|
119 | 118 |
@errors.generic.all |
120 | 119 |
@errors.cyclades.connection |
121 | 120 |
def _run(self): |
122 |
nets = self.client.list_networks() |
|
121 |
detail = bool(self['detail'] or self['user_id']) |
|
122 |
nets = self.client.list_networks(detail=detail) |
|
123 | 123 |
nets = self._filter_by_user_id(nets) |
124 | 124 |
nets = self._filter_by_name(nets) |
125 | 125 |
nets = self._filter_by_id(nets) |
126 |
if not self['detail']: |
|
126 |
if detail and not self['detail']:
|
|
127 | 127 |
nets = [dict( |
128 | 128 |
id=n['id'], name=n['name'], links=n['links']) for n in nets] |
129 | 129 |
kwargs = dict() |
... | ... | |
376 | 376 |
|
377 | 377 |
|
378 | 378 |
@command(port_cmds) |
379 |
class port_list(_init_network, _optional_json): |
|
379 |
class port_list(_init_network, _optional_json, _name_filter, _id_filter):
|
|
380 | 380 |
"""List all ports""" |
381 | 381 |
|
382 |
arguments = dict( |
|
383 |
detail=FlagArgument('show detailed output', ('-l', '--details')), |
|
384 |
more=FlagArgument( |
|
385 |
'output results in pages (-n to set items per page, default 10)', |
|
386 |
'--more'), |
|
387 |
user_id=ValueArgument( |
|
388 |
'show only networks belonging to user with this id', '--user-id') |
|
389 |
) |
|
390 |
|
|
382 | 391 |
@errors.generic.all |
383 | 392 |
@errors.cyclades.connection |
384 | 393 |
def _run(self): |
385 |
net = self.client.list_ports() |
|
386 |
self._print(net) |
|
394 |
detail = bool(self['detail'] or self['user_id']) |
|
395 |
ports = self.client.list_ports(detail=detail) |
|
396 |
ports = self._filter_by_user_id(ports) |
|
397 |
ports = self._filter_by_name(ports) |
|
398 |
ports = self._filter_by_id(ports) |
|
399 |
if detail and not self['detail']: |
|
400 |
ports = [dict( |
|
401 |
id=p['id'], name=p['name'], links=p['links']) for p in ports] |
|
402 |
kwargs = dict() |
|
403 |
if self['more']: |
|
404 |
kwargs['out'] = StringIO() |
|
405 |
kwargs['title'] = () |
|
406 |
self._print(ports, **kwargs) |
|
407 |
if self['more']: |
|
408 |
pager(kwargs['out'].getvalue()) |
|
387 | 409 |
|
388 | 410 |
def main(self): |
389 | 411 |
super(self.__class__, self)._run() |
... | ... | |
397 | 419 |
@errors.generic.all |
398 | 420 |
@errors.cyclades.connection |
399 | 421 |
def _run(self, port_id): |
400 |
net = self.client.get_port_details(port_id)
|
|
401 |
self._print(net, self.print_dict)
|
|
422 |
port = self.client.get_port_details(port_id)
|
|
423 |
self._print(port, self.print_dict)
|
|
402 | 424 |
|
403 | 425 |
def main(self, port_id): |
404 | 426 |
super(self.__class__, self)._run() |
... | ... | |
416 | 438 |
@errors.generic.all |
417 | 439 |
@errors.cyclades.connection |
418 | 440 |
def _run(self, port_id): |
441 |
if self['wait']: |
|
442 |
status = self.client.get_port_details(port_id)['status'] |
|
419 | 443 |
r = self.client.delete_port(port_id) |
420 | 444 |
if self['wait']: |
421 |
self._wait(r['id'], r['status']) |
|
445 |
try: |
|
446 |
self._wait(port_id, status) |
|
447 |
except ClientError as ce: |
|
448 |
if ce.status not in (404, ): |
|
449 |
raise |
|
450 |
self.error('Port %s is deleted' % port_id) |
|
422 | 451 |
self._optional_output(r) |
423 | 452 |
|
424 | 453 |
def main(self, port_id): |
... | ... | |
459 | 488 |
fixed_ips=fixed_ips) |
460 | 489 |
if self['wait']: |
461 | 490 |
self._wait(r['id'], r['status']) |
462 |
self._print(r, self.print_dict) |
|
491 |
r = self.client.get_port_details(r['id']) |
|
492 |
self._print([r]) |
|
463 | 493 |
|
464 | 494 |
|
465 | 495 |
@command(port_cmds) |
... | ... | |
612 | 642 |
@errors.cyclades.network_id |
613 | 643 |
@errors.cyclades.server_id |
614 | 644 |
def _run(self, network_id, server_id): |
645 |
self.error('Creating a port to connect network %s with device %s' % ( |
|
646 |
network_id, server_id)) |
|
615 | 647 |
self.connect(network_id, server_id) |
616 | 648 |
|
617 | 649 |
def main(self, network_id, device_id): |
618 | 650 |
super(self.__class__, self)._run() |
619 |
self._run(network_id=network_id, device_id=device_id)
|
|
651 |
self._run(network_id=network_id, server_id=device_id)
|
|
620 | 652 |
|
621 | 653 |
|
622 | 654 |
@command(network_cmds) |
... | ... | |
638 | 670 |
@errors.cyclades.connection |
639 | 671 |
@errors.cyclades.network_id |
640 | 672 |
@errors.cyclades.server_id |
641 |
def _run(self, network_id, device_id):
|
|
642 |
vm = self._cyclades_client().get_server_details(device_id)
|
|
643 |
nets = [net for net in vm['attachments'] if net['network_id'] not in (
|
|
644 |
'network_id', )]
|
|
645 |
if not nets:
|
|
673 |
def _run(self, network_id, server_id):
|
|
674 |
vm = self._cyclades_client().get_server_details(server_id)
|
|
675 |
ports = [port for port in vm['attachments'] if (
|
|
676 |
port['network_id'] not in ('network_id', ))]
|
|
677 |
if not ports:
|
|
646 | 678 |
raiseCLIError('Network %s is not connected to device %s' % ( |
647 |
network_id, device_id)) |
|
648 |
for net in nets: |
|
649 |
self.client.port_delete(net['id']) |
|
650 |
self.error('Deleting this connection:') |
|
651 |
self.print_dict(net) |
|
679 |
network_id, server_id)) |
|
680 |
for port in ports: |
|
681 |
if self['wait']: |
|
682 |
port['status'] = self.client.get_port_details(port['id'])[ |
|
683 |
'status'] |
|
684 |
self.client.delete_port(port['id']) |
|
685 |
self.error('Deleting port %s:' % port['id']) |
|
686 |
self.print_dict(port) |
|
652 | 687 |
if self['wait']: |
653 |
self._wait(net['id'], net['status']) |
|
688 |
try: |
|
689 |
self._wait(port['id'], port['status']) |
|
690 |
except ClientError as ce: |
|
691 |
if ce.status not in (404, ): |
|
692 |
raise |
|
693 |
self.error('Port %s is deleted' % port['id']) |
|
654 | 694 |
|
655 | 695 |
def main(self, network_id, device_id): |
656 | 696 |
super(self.__class__, self)._run() |
657 |
self._run(network_id=network_id, device_id=device_id) |
|
697 |
self._run(network_id=network_id, server_id=device_id) |
Also available in: Unified diff