Revision 4c33b869 kamaki/cli/commands/cyclades.py

b/kamaki/cli/commands/cyclades.py
301 301
        nics=FlagArgument(
302 302
            'Show only the network interfaces of this virtual server',
303 303
            '--nics'),
304
        network_id=ValueArgument(
305
            'Show the connection details to that network', '--network-id'),
306 304
        stats=FlagArgument('Get URLs for server statistics', '--stats'),
307 305
        diagnostics=FlagArgument('Diagnostic information', '--diagnostics')
308 306
    )
......
314 312
        if self['nics']:
315 313
            self._print(
316 314
                self.client.get_server_nics(server_id), self.print_dict)
317
        elif self['network_id']:
318
            self._print(
319
                self.client.get_server_network_nics(
320
                    server_id, self['network_id']), self.print_dict)
321 315
        elif self['stats']:
322 316
            self._print(
323 317
                self.client.get_server_stats(server_id), self.print_dict)
......
587 581
        'server_name', 'flavor_id', 'firewall_profile', 'metadata_to_set',
588 582
        'metadata_to_delete']
589 583

  
584
    def _set_firewall_profile(self, server_id):
585
        vm = self._restruct_server_info(
586
            self.client.get_server_details(server_id))
587
        ports = [p for p in vm['ports'] if 'firewallProfile' in p]
588
        pick_port = self.arguments['public_network_port_id']
589
        if pick_port.value:
590
            ports = [p for p in ports if pick_port.value in (
591
                '*', '%s' % p['id'])]
592
        elif len(ports) > 1:
593
            port_strings = ['Server %s ports to public networks:' % server_id]
594
            for p in ports:
595
                port_strings.append('  %s' % p['id'])
596
                for k in ('network_id', 'ipv4', 'ipv6', 'firewallProfile'):
597
                    v = p.get(k)
598
                    if v:
599
                        port_strings.append('\t%s: %s' % (k, v))
600
            raiseCLIError(
601
                'Multiple public connections on server %s' % (
602
                    server_id), details=port_strings + [
603
                        'To select one:',
604
                        '  %s <port id>' % pick_port.lvalue,
605
                        'To set all:',
606
                        '  %s *' % pick_port.lvalue, ])
607
        if not ports:
608
            pp = pick_port.value
609
            raiseCLIError(
610
                'No *public* networks attached on server %s%s' % (
611
                    server_id, ' through port %s' % pp if pp else ''),
612
                details=[
613
                    'To see all networks:',
614
                    '  kamaki network list',
615
                    'To connect to a network:',
616
                    '  kamaki network connect <net id> --device-id %s' % (
617
                        server_id)])
618
        for port in ports:
619
            self.error('Set port %s firewall to %s' % (
620
                port['id'], self['firewall_profile']))
621
            self.client.set_firewall_profile(
622
                server_id=server_id,
623
                profile=self['firewall_profile'],
624
                port_id=port['id'])
625

  
590 626
    @errors.generic.all
591 627
    @errors.cyclades.connection
592 628
    @errors.cyclades.server_id
......
596 632
        if self['flavor_id']:
597 633
            self.client.resize_server(server_id, self['flavor_id'])
598 634
        if self['firewall_profile']:
599
            vm = self._restruct_server_info(
600
                self.client.get_server_details(server_id))
601
            ports = [p for p in vm['ports'] if 'firewallProfile' in p]
602
            pick_port = self.arguments['public_network_port_id']
603
            if pick_port.value:
604
                ports = [p for p in ports if pick_port.value in (
605
                    '*', '%s' % p['id'])]
606
            elif len(ports) > 1:
607
                raiseCLIError(
608
                    'Multiple public connections on server %s' % (
609
                        server_id), details=[
610
                            'To select one:',
611
                            '  %s <port id>' % pick_port.lvalue,
612
                            'To set all:',
613
                            '  %s *' % pick_port.lvalue,
614
                            'Ports to public networks on server %s:' % (
615
                                server_id),
616
                            ','.join([' %s' % p['id'] for p in ports])])
617
            if not ports:
618
                pp = pick_port.value
619
                raiseCLIError(
620
                    'No *public* networks attached on server %s%s' % (
621
                        server_id, ' through port %s' % pp if pp else ''),
622
                    details=[
623
                        'To see all networks:',
624
                        '  kamaki network list',
625
                        'To connect to a network:',
626
                        '  kamaki network connect <net id> --device-id %s' % (
627
                            server_id)])
628
            for port in ports:
629
                self.error('Set port %s firewall to %s' % (
630
                    port['id'], self['firewall_profile']))
631
                self.client.set_firewall_profile(
632
                    server_id=server_id,
633
                    profile=self['firewall_profile'],
634
                    port_id=port['id'])
635
            self._set_firewall_profile(server_id)
635 636
        if self['metadata_to_set']:
636 637
            self.client.update_server_metadata(
637 638
                server_id, **self['metadata_to_set'])

Also available in: Unified diff