Merge "Add filtering options to os network list command"
This commit is contained in:
		@@ -186,17 +186,60 @@ List networks
 | 
			
		||||
.. code:: bash
 | 
			
		||||
 | 
			
		||||
    os network list
 | 
			
		||||
        [--external]
 | 
			
		||||
        [--external | --internal]
 | 
			
		||||
        [--long]
 | 
			
		||||
        [--name <name>]
 | 
			
		||||
        [--enable | --disable]
 | 
			
		||||
        [--project <project> [--project-domain <project-domain>]]
 | 
			
		||||
        [--share | --no-share]
 | 
			
		||||
        [--status <status>]
 | 
			
		||||
 | 
			
		||||
.. option:: --external
 | 
			
		||||
 | 
			
		||||
    List external networks
 | 
			
		||||
 | 
			
		||||
.. option:: --internal
 | 
			
		||||
 | 
			
		||||
    List internal networks
 | 
			
		||||
 | 
			
		||||
.. option:: --long
 | 
			
		||||
 | 
			
		||||
    List additional fields in output
 | 
			
		||||
 | 
			
		||||
.. option:: --name <name>
 | 
			
		||||
 | 
			
		||||
    List networks according to their name
 | 
			
		||||
 | 
			
		||||
.. option:: --enable
 | 
			
		||||
 | 
			
		||||
    List enabled networks
 | 
			
		||||
 | 
			
		||||
.. option:: --disable
 | 
			
		||||
 | 
			
		||||
    List disabled networks
 | 
			
		||||
 | 
			
		||||
.. option:: --project <project>
 | 
			
		||||
 | 
			
		||||
    List networks according to their project (name or ID)
 | 
			
		||||
 | 
			
		||||
.. option:: --project-domain <project-domain>
 | 
			
		||||
 | 
			
		||||
    Domain the project belongs to (name or ID).
 | 
			
		||||
    This can be used in case collisions between project names exist.
 | 
			
		||||
 | 
			
		||||
.. option:: --share
 | 
			
		||||
 | 
			
		||||
    List networks shared between projects
 | 
			
		||||
 | 
			
		||||
.. option:: --no-share
 | 
			
		||||
 | 
			
		||||
    List networks not shared between projects
 | 
			
		||||
 | 
			
		||||
.. option:: --status <status>
 | 
			
		||||
 | 
			
		||||
    List networks according to their status
 | 
			
		||||
    ('ACTIVE', 'BUILD', 'DOWN', 'ERROR')
 | 
			
		||||
 | 
			
		||||
network set
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -304,21 +304,66 @@ class ListNetwork(common.NetworkAndComputeLister):
 | 
			
		||||
    """List networks"""
 | 
			
		||||
 | 
			
		||||
    def update_parser_common(self, parser):
 | 
			
		||||
        parser.add_argument(
 | 
			
		||||
        router_ext_group = parser.add_mutually_exclusive_group()
 | 
			
		||||
        router_ext_group.add_argument(
 | 
			
		||||
            '--external',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            default=False,
 | 
			
		||||
            help=_("List external networks")
 | 
			
		||||
        )
 | 
			
		||||
        router_ext_group.add_argument(
 | 
			
		||||
            '--internal',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            help=_("List internal networks")
 | 
			
		||||
        )
 | 
			
		||||
        parser.add_argument(
 | 
			
		||||
            '--long',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            default=False,
 | 
			
		||||
            help=_("List additional fields in output")
 | 
			
		||||
        )
 | 
			
		||||
        parser.add_argument(
 | 
			
		||||
            '--name',
 | 
			
		||||
            metavar='<name>',
 | 
			
		||||
            help=_("List networks according to their name")
 | 
			
		||||
        )
 | 
			
		||||
        admin_state_group = parser.add_mutually_exclusive_group()
 | 
			
		||||
        admin_state_group.add_argument(
 | 
			
		||||
            '--enable',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            help=_("List enabled networks")
 | 
			
		||||
        )
 | 
			
		||||
        admin_state_group.add_argument(
 | 
			
		||||
            '--disable',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            help=_("List disabled networks")
 | 
			
		||||
        )
 | 
			
		||||
        parser.add_argument(
 | 
			
		||||
            '--project',
 | 
			
		||||
            metavar='<project>',
 | 
			
		||||
            help=_("List networks according to their project (name or ID)")
 | 
			
		||||
        )
 | 
			
		||||
        identity_common.add_project_domain_option_to_parser(parser)
 | 
			
		||||
        shared_group = parser.add_mutually_exclusive_group()
 | 
			
		||||
        shared_group.add_argument(
 | 
			
		||||
            '--share',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            help=_("List networks shared between projects")
 | 
			
		||||
        )
 | 
			
		||||
        shared_group.add_argument(
 | 
			
		||||
            '--no-share',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            help=_("List networks not shared between projects")
 | 
			
		||||
        )
 | 
			
		||||
        parser.add_argument(
 | 
			
		||||
            '--status',
 | 
			
		||||
            metavar='<status>',
 | 
			
		||||
            choices=['ACTIVE', 'BUILD', 'DOWN', 'ERROR'],
 | 
			
		||||
            help=_("List networks according to their status "
 | 
			
		||||
                   "('ACTIVE', 'BUILD', 'DOWN', 'ERROR')")
 | 
			
		||||
        )
 | 
			
		||||
        return parser
 | 
			
		||||
 | 
			
		||||
    def take_action_network(self, client, parsed_args):
 | 
			
		||||
        identity_client = self.app.client_manager.identity
 | 
			
		||||
        if parsed_args.long:
 | 
			
		||||
            columns = (
 | 
			
		||||
                'id',
 | 
			
		||||
@@ -356,11 +401,37 @@ class ListNetwork(common.NetworkAndComputeLister):
 | 
			
		||||
                'Subnets',
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        if parsed_args.external:
 | 
			
		||||
            args = {'router:external': True}
 | 
			
		||||
        else:
 | 
			
		||||
        args = {}
 | 
			
		||||
 | 
			
		||||
        if parsed_args.external:
 | 
			
		||||
            args['router:external'] = True
 | 
			
		||||
        elif parsed_args.internal:
 | 
			
		||||
            args['router:external'] = False
 | 
			
		||||
 | 
			
		||||
        if parsed_args.name is not None:
 | 
			
		||||
            args['name'] = parsed_args.name
 | 
			
		||||
 | 
			
		||||
        if parsed_args.enable:
 | 
			
		||||
            args['admin_state_up'] = True
 | 
			
		||||
        elif parsed_args.disable:
 | 
			
		||||
            args['admin_state_up'] = False
 | 
			
		||||
 | 
			
		||||
        if parsed_args.project:
 | 
			
		||||
            project = identity_common.find_project(
 | 
			
		||||
                identity_client,
 | 
			
		||||
                parsed_args.project,
 | 
			
		||||
                parsed_args.project_domain,
 | 
			
		||||
            )
 | 
			
		||||
            args['tenant_id'] = project.id
 | 
			
		||||
 | 
			
		||||
        if parsed_args.share:
 | 
			
		||||
            args['shared'] = True
 | 
			
		||||
        elif parsed_args.no_share:
 | 
			
		||||
            args['shared'] = False
 | 
			
		||||
 | 
			
		||||
        if parsed_args.status:
 | 
			
		||||
            args['status'] = parsed_args.status
 | 
			
		||||
 | 
			
		||||
        data = client.networks(**args)
 | 
			
		||||
 | 
			
		||||
        return (column_headers,
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
 | 
			
		||||
import mock
 | 
			
		||||
from mock import call
 | 
			
		||||
import random
 | 
			
		||||
 | 
			
		||||
from osc_lib import exceptions
 | 
			
		||||
from osc_lib import utils
 | 
			
		||||
@@ -498,6 +499,23 @@ class TestListNetwork(TestNetwork):
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_list_internal(self):
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--internal',
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('internal', True),
 | 
			
		||||
            ('long', False),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'router:external': False}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_network_list_long(self):
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--long',
 | 
			
		||||
@@ -517,6 +535,150 @@ class TestListNetwork(TestNetwork):
 | 
			
		||||
        self.assertEqual(self.columns_long, columns)
 | 
			
		||||
        self.assertEqual(self.data_long, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_list_name(self):
 | 
			
		||||
        test_name = "fakename"
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--name', test_name,
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('external', False),
 | 
			
		||||
            ('long', False),
 | 
			
		||||
            ('name', test_name),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'name': test_name}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_network_list_enable(self):
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--enable',
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('long', False),
 | 
			
		||||
            ('external', False),
 | 
			
		||||
            ('enable', True),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'admin_state_up': True}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_network_list_disable(self):
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--disable',
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('long', False),
 | 
			
		||||
            ('external', False),
 | 
			
		||||
            ('disable', True)
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'admin_state_up': False}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_network_list_project(self):
 | 
			
		||||
        project = identity_fakes_v3.FakeProject.create_one_project()
 | 
			
		||||
        self.projects_mock.get.return_value = project
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--project', project.id,
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('project', project.id),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'tenant_id': project.id}
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_networ_list_project_domain(self):
 | 
			
		||||
        project = identity_fakes_v3.FakeProject.create_one_project()
 | 
			
		||||
        self.projects_mock.get.return_value = project
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--project', project.id,
 | 
			
		||||
            '--project-domain', project.domain_id,
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('project', project.id),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
        filters = {'tenant_id': project.id}
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(**filters)
 | 
			
		||||
 | 
			
		||||
    def test_network_list_share(self):
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--share',
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('long', False),
 | 
			
		||||
            ('share', True),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'shared': True}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_network_list_no_share(self):
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--no-share',
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('long', False),
 | 
			
		||||
            ('no_share', True),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'shared': False}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
    def test_network_list_status(self):
 | 
			
		||||
        choices = ['ACTIVE', 'BUILD', 'DOWN', 'ERROR']
 | 
			
		||||
        test_status = random.choice(choices)
 | 
			
		||||
        arglist = [
 | 
			
		||||
            '--status', test_status,
 | 
			
		||||
        ]
 | 
			
		||||
        verifylist = [
 | 
			
		||||
            ('long', False),
 | 
			
		||||
            ('status', test_status),
 | 
			
		||||
        ]
 | 
			
		||||
        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
 | 
			
		||||
        columns, data = self.cmd.take_action(parsed_args)
 | 
			
		||||
 | 
			
		||||
        self.network.networks.assert_called_once_with(
 | 
			
		||||
            **{'status': test_status}
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(self.columns, columns)
 | 
			
		||||
        self.assertEqual(self.data, list(data))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestSetNetwork(TestNetwork):
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								releasenotes/notes/bug-1578819-d1efccfefb18356d.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								releasenotes/notes/bug-1578819-d1efccfefb18356d.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
---
 | 
			
		||||
features:
 | 
			
		||||
  - |
 | 
			
		||||
    Add ``--internal``, ``--name``, ``--project`` and ``--project-domain``,
 | 
			
		||||
    ``--enable`` and ``--disable``, ``--share`` and ``--no share``, ``--status``
 | 
			
		||||
    options to the ``network list`` command.
 | 
			
		||||
    [Bug `1578819 <https://bugs.launchpad.net/bugs/1578819>`_]
 | 
			
		||||
		Reference in New Issue
	
	Block a user