37 |
37 |
from kamaki.cli import command
|
38 |
38 |
from kamaki.cli.command_tree import CommandTree
|
39 |
39 |
from kamaki.cli.errors import (
|
40 |
|
CLISyntaxError, CLIBaseUrlError, CLIInvalidArgument)
|
|
40 |
CLIBaseUrlError, CLIInvalidArgument, raiseCLIError)
|
41 |
41 |
from kamaki.clients.cyclades import CycladesNetworkClient
|
42 |
42 |
from kamaki.cli.argument import (
|
43 |
43 |
FlagArgument, ValueArgument, RepeatableArgument, IntArgument)
|
... | ... | |
447 |
447 |
self._run(port_id=port_id)
|
448 |
448 |
|
449 |
449 |
|
|
450 |
class _port_create(_init_network):
|
|
451 |
|
|
452 |
@errors.generic.all
|
|
453 |
@errors.cyclades.connection
|
|
454 |
@errors.cyclades.network_id
|
|
455 |
def _run(self, network_id, device_id):
|
|
456 |
fixed_ips = [dict(
|
|
457 |
subnet_id=self['subnet_id'], ip_address=self['ip_address'])] if (
|
|
458 |
self['subnet_id']) else None
|
|
459 |
r = self.client.create_port(
|
|
460 |
network_id, device_id,
|
|
461 |
name=self['name'],
|
|
462 |
security_groups=self['security_group_id'],
|
|
463 |
fixed_ips=fixed_ips)
|
|
464 |
if self['wait']:
|
|
465 |
self._wait(r['id'], r['status'])
|
|
466 |
self._print(r, self.print_dict)
|
|
467 |
|
|
468 |
|
450 |
469 |
@command(port_cmds)
|
451 |
470 |
class port_create(_init_network, _optional_json, _port_wait):
|
452 |
471 |
"""Create a new port (== connect server to network)"""
|
... | ... | |
469 |
488 |
)
|
470 |
489 |
required = ('network_id', 'device_id')
|
471 |
490 |
|
472 |
|
@errors.generic.all
|
473 |
|
@errors.cyclades.connection
|
474 |
|
@errors.cyclades.network_id
|
475 |
|
def _run(self, network_id, device_id):
|
476 |
|
fixed_ips = [dict(
|
477 |
|
subnet_id=self['subnet_id'], ip_address=self['ip_address'])] if (
|
478 |
|
self['subnet_id']) else None
|
479 |
|
r = self.client.create_port(
|
480 |
|
network_id, device_id,
|
481 |
|
name=self['name'],
|
482 |
|
security_groups=self['security_group_id'],
|
483 |
|
fixed_ips=fixed_ips)
|
484 |
|
if self['wait']:
|
485 |
|
self._wait(r['id'], r['status'])
|
486 |
|
self._print(r, self.print_dict)
|
487 |
|
|
488 |
491 |
def main(self):
|
489 |
492 |
super(self.__class__, self)._run()
|
490 |
493 |
self._run(network_id=self['network_id'], device_id=self['device_id'])
|
... | ... | |
585 |
588 |
# Warn users for some importand changes
|
586 |
589 |
|
587 |
590 |
@command(network_cmds)
|
588 |
|
class network_connect(_init_network, _optional_output_cmd):
|
589 |
|
"""DEPRECATED, use /port create"""
|
|
591 |
class network_connect(_port_create):
|
|
592 |
"""Connect a network with a device (server or router)"""
|
590 |
593 |
|
591 |
|
def main(self):
|
592 |
|
raise CLISyntaxError('DEPRECATED, replaced by kamaki port create')
|
|
594 |
arguments = dict(
|
|
595 |
name=ValueArgument('A human readable name', '--name'),
|
|
596 |
security_group_id=RepeatableArgument(
|
|
597 |
'Add a security group id (can be repeated)',
|
|
598 |
('-g', '--security-group')),
|
|
599 |
subnet_id=ValueArgument(
|
|
600 |
'Subnet id for fixed ips (used with --ip-address)',
|
|
601 |
'--subnet-id'),
|
|
602 |
ip_address=ValueArgument(
|
|
603 |
'IP address for subnet id (used with --subnet-id', '--ip-address'),
|
|
604 |
wait=FlagArgument('Wait port to be established', ('-w', '--wait')),
|
|
605 |
)
|
|
606 |
|
|
607 |
def main(self, network_id, device_id):
|
|
608 |
super(self.__class__, self)._run()
|
|
609 |
self._run(network_id=network_id, device_id=device_id)
|
593 |
610 |
|
594 |
611 |
|
595 |
612 |
@command(network_cmds)
|
596 |
|
class network_disconnect(_init_network):
|
597 |
|
"""DEPRECATED, /use port delete"""
|
|
613 |
class network_disconnect(_init_network, _optional_json):
|
|
614 |
"""Disconnnect a network from a device"""
|
598 |
615 |
|
599 |
|
def main(self):
|
600 |
|
raise CLISyntaxError('DEPRECATED, replaced by kamaki port delete')
|
|
616 |
def _cyclades_client(self):
|
|
617 |
auth = getattr(self, 'auth_base')
|
|
618 |
endpoints = auth.get_service_endpoints('compute')
|
|
619 |
URL = endpoints['publicURL']
|
|
620 |
from kamaki.clients.cyclades import CycladesClient
|
|
621 |
return CycladesClient(URL, self.client.token)
|
|
622 |
|
|
623 |
@errors.generic.all
|
|
624 |
@errors.cyclades.connection
|
|
625 |
@errors.cyclades.network_id
|
|
626 |
@errors.cyclades.server_id
|
|
627 |
def _run(self, network_id, device_id):
|
|
628 |
vm = self._cyclades_client().get_server_details(device_id)
|
|
629 |
nets = [net for net in vm['attachments'] if net['network_id'] not in (
|
|
630 |
'network_id', )]
|
|
631 |
if not nets:
|
|
632 |
raiseCLIError('Network %s is not connected to device %s' % (
|
|
633 |
network_id, device_id))
|
|
634 |
for net in nets:
|
|
635 |
self.client.port_delete(net['id'])
|
|
636 |
self.error('Deleted connection:')
|
|
637 |
self.print_dict(net)
|
|
638 |
|
|
639 |
def main(self, network_id, device_id):
|
|
640 |
super(self.__class__, self)._run()
|
|
641 |
self._run(network_id=network_id, device_id=device_id)
|