Merge "Add extra filtering options to floating ip list"
This commit is contained in:
commit
29587eaa66
@ -89,6 +89,10 @@ List floating IP(s)
|
|||||||
[--network <network>]
|
[--network <network>]
|
||||||
[--port <port>]
|
[--port <port>]
|
||||||
[--fixed-ip-address <fixed-ip-address>]
|
[--fixed-ip-address <fixed-ip-address>]
|
||||||
|
[--long]
|
||||||
|
[--status <status>]
|
||||||
|
[--project <project> [--project-domain <project-domain>]]
|
||||||
|
[--router <router>]
|
||||||
|
|
||||||
.. option:: --network <network>
|
.. option:: --network <network>
|
||||||
|
|
||||||
@ -108,6 +112,37 @@ List floating IP(s)
|
|||||||
|
|
||||||
*Network version 2 only*
|
*Network version 2 only*
|
||||||
|
|
||||||
|
.. option:: --long
|
||||||
|
|
||||||
|
List additional fields in output
|
||||||
|
|
||||||
|
*Network version 2 only*
|
||||||
|
|
||||||
|
.. option:: --status <status>
|
||||||
|
|
||||||
|
List floating IP(s) according to given status ('ACTIVE', 'DOWN')
|
||||||
|
|
||||||
|
*Network version 2 only*
|
||||||
|
|
||||||
|
.. option:: --project <project>
|
||||||
|
|
||||||
|
List floating IP(s) according to given project (name or ID)
|
||||||
|
|
||||||
|
*Network version 2 only*
|
||||||
|
|
||||||
|
.. option:: --project-domain <project-domain>
|
||||||
|
|
||||||
|
Domain the project belongs to (name or ID). This can
|
||||||
|
be used in case collisions between project names exist.
|
||||||
|
|
||||||
|
*Network version 2 only*
|
||||||
|
|
||||||
|
.. option:: --router <router>
|
||||||
|
|
||||||
|
List floating IP(s) according to given router (name or ID)
|
||||||
|
|
||||||
|
*Network version 2 only*
|
||||||
|
|
||||||
floating ip show
|
floating ip show
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
@ -219,6 +219,8 @@ class DeleteIPFloating(DeleteFloatingIP):
|
|||||||
|
|
||||||
|
|
||||||
class ListFloatingIP(common.NetworkAndComputeLister):
|
class ListFloatingIP(common.NetworkAndComputeLister):
|
||||||
|
# TODO(songminglong): Use SDK resource mapped attribute names once
|
||||||
|
# the OSC minimum requirements include SDK 1.0
|
||||||
_description = _("List floating IP(s)")
|
_description = _("List floating IP(s)")
|
||||||
|
|
||||||
def update_parser_network(self, parser):
|
def update_parser_network(self, parser):
|
||||||
@ -240,11 +242,38 @@ class ListFloatingIP(common.NetworkAndComputeLister):
|
|||||||
help=_("List floating IP(s) according to "
|
help=_("List floating IP(s) according to "
|
||||||
"given fixed IP address")
|
"given fixed IP address")
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--long',
|
||||||
|
action='store_true',
|
||||||
|
default=False,
|
||||||
|
help=_("List additional fields in output")
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--status',
|
||||||
|
metavar='<status>',
|
||||||
|
choices=['ACTIVE', 'DOWN'],
|
||||||
|
help=_("List floating IP(s) according to "
|
||||||
|
"given status ('ACTIVE', 'DOWN')")
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--project',
|
||||||
|
metavar='<project>',
|
||||||
|
help=_("List floating IP(s) according to "
|
||||||
|
"given project (name or ID)")
|
||||||
|
)
|
||||||
|
identity_common.add_project_domain_option_to_parser(parser)
|
||||||
|
parser.add_argument(
|
||||||
|
'--router',
|
||||||
|
metavar='<router>',
|
||||||
|
help=_("List floating IP(s) according to "
|
||||||
|
"given router (name or ID)")
|
||||||
|
)
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action_network(self, client, parsed_args):
|
def take_action_network(self, client, parsed_args):
|
||||||
network_client = self.app.client_manager.network
|
network_client = self.app.client_manager.network
|
||||||
|
identity_client = self.app.client_manager.identity
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'id',
|
'id',
|
||||||
@ -262,6 +291,17 @@ class ListFloatingIP(common.NetworkAndComputeLister):
|
|||||||
'Floating Network',
|
'Floating Network',
|
||||||
'Project',
|
'Project',
|
||||||
)
|
)
|
||||||
|
if parsed_args.long:
|
||||||
|
columns = columns + (
|
||||||
|
'router_id',
|
||||||
|
'status',
|
||||||
|
'description',
|
||||||
|
)
|
||||||
|
headers = headers + (
|
||||||
|
'Router',
|
||||||
|
'Status',
|
||||||
|
'Description',
|
||||||
|
)
|
||||||
|
|
||||||
query = {}
|
query = {}
|
||||||
|
|
||||||
@ -275,6 +315,20 @@ class ListFloatingIP(common.NetworkAndComputeLister):
|
|||||||
query['port_id'] = port.id
|
query['port_id'] = port.id
|
||||||
if parsed_args.fixed_ip_address is not None:
|
if parsed_args.fixed_ip_address is not None:
|
||||||
query['fixed_ip_address'] = parsed_args.fixed_ip_address
|
query['fixed_ip_address'] = parsed_args.fixed_ip_address
|
||||||
|
if parsed_args.status:
|
||||||
|
query['status'] = parsed_args.status
|
||||||
|
if parsed_args.project is not None:
|
||||||
|
project = identity_common.find_project(
|
||||||
|
identity_client,
|
||||||
|
parsed_args.project,
|
||||||
|
parsed_args.project_domain,
|
||||||
|
)
|
||||||
|
query['tenant_id'] = project.id
|
||||||
|
query['project_id'] = project.id
|
||||||
|
if parsed_args.router is not None:
|
||||||
|
router = network_client.find_router(parsed_args.router,
|
||||||
|
ignore_missing=False)
|
||||||
|
query['router_id'] = router.id
|
||||||
|
|
||||||
data = client.ips(**query)
|
data = client.ips(**query)
|
||||||
|
|
||||||
|
@ -32,7 +32,10 @@ class TestFloatingIPNetwork(network_fakes.TestNetworkV2):
|
|||||||
|
|
||||||
# Get a shortcut to the network client
|
# Get a shortcut to the network client
|
||||||
self.network = self.app.client_manager.network
|
self.network = self.app.client_manager.network
|
||||||
|
# Get a shortcut to the ProjectManager Mock
|
||||||
self.projects_mock = self.app.client_manager.identity.projects
|
self.projects_mock = self.app.client_manager.identity.projects
|
||||||
|
# Get a shortcut to the DomainManager Mock
|
||||||
|
self.domains_mock = self.app.client_manager.identity.domains
|
||||||
|
|
||||||
|
|
||||||
class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
|
class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
|
||||||
@ -287,6 +290,9 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
|
|||||||
fake_port = network_fakes.FakePort.create_one_port({
|
fake_port = network_fakes.FakePort.create_one_port({
|
||||||
'id': 'fake_port_id',
|
'id': 'fake_port_id',
|
||||||
})
|
})
|
||||||
|
fake_router = network_fakes.FakeRouter.create_one_router({
|
||||||
|
'id': 'fake_router_id',
|
||||||
|
})
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'ID',
|
'ID',
|
||||||
@ -296,8 +302,14 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
|
|||||||
'Floating Network',
|
'Floating Network',
|
||||||
'Project',
|
'Project',
|
||||||
)
|
)
|
||||||
|
columns_long = columns + (
|
||||||
|
'Router',
|
||||||
|
'Status',
|
||||||
|
'Description',
|
||||||
|
)
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
|
data_long = []
|
||||||
for ip in floating_ips:
|
for ip in floating_ips:
|
||||||
data.append((
|
data.append((
|
||||||
ip.id,
|
ip.id,
|
||||||
@ -307,6 +319,17 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
|
|||||||
ip.floating_network_id,
|
ip.floating_network_id,
|
||||||
ip.tenant_id,
|
ip.tenant_id,
|
||||||
))
|
))
|
||||||
|
data_long.append((
|
||||||
|
ip.id,
|
||||||
|
ip.floating_ip_address,
|
||||||
|
ip.fixed_ip_address,
|
||||||
|
ip.port_id,
|
||||||
|
ip.floating_network_id,
|
||||||
|
ip.tenant_id,
|
||||||
|
ip.router_id,
|
||||||
|
ip.status,
|
||||||
|
ip.description,
|
||||||
|
))
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestListFloatingIPNetwork, self).setUp()
|
super(TestListFloatingIPNetwork, self).setUp()
|
||||||
@ -314,6 +337,7 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
|
|||||||
self.network.ips = mock.Mock(return_value=self.floating_ips)
|
self.network.ips = mock.Mock(return_value=self.floating_ips)
|
||||||
self.network.find_network = mock.Mock(return_value=self.fake_network)
|
self.network.find_network = mock.Mock(return_value=self.fake_network)
|
||||||
self.network.find_port = mock.Mock(return_value=self.fake_port)
|
self.network.find_port = mock.Mock(return_value=self.fake_port)
|
||||||
|
self.network.find_router = mock.Mock(return_value=self.fake_router)
|
||||||
|
|
||||||
# Get the command object to test
|
# Get the command object to test
|
||||||
self.cmd = floating_ip.ListFloatingIP(self.app, self.namespace)
|
self.cmd = floating_ip.ListFloatingIP(self.app, self.namespace)
|
||||||
@ -380,6 +404,94 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
|
|||||||
self.assertEqual(self.columns, columns)
|
self.assertEqual(self.columns, columns)
|
||||||
self.assertEqual(self.data, list(data))
|
self.assertEqual(self.data, list(data))
|
||||||
|
|
||||||
|
def test_floating_ip_list_long(self):
|
||||||
|
arglist = ['--long', ]
|
||||||
|
verifylist = [('long', True), ]
|
||||||
|
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.network.ips.assert_called_once_with()
|
||||||
|
self.assertEqual(self.columns_long, columns)
|
||||||
|
self.assertEqual(self.data_long, list(data))
|
||||||
|
|
||||||
|
def test_floating_ip_list_status(self):
|
||||||
|
arglist = [
|
||||||
|
'--status', 'ACTIVE',
|
||||||
|
'--long',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('status', 'ACTIVE'),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.network.ips.assert_called_once_with(**{
|
||||||
|
'status': 'ACTIVE',
|
||||||
|
})
|
||||||
|
self.assertEqual(self.columns_long, columns)
|
||||||
|
self.assertEqual(self.data_long, list(data))
|
||||||
|
|
||||||
|
def test_floating_ip_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)
|
||||||
|
filters = {'tenant_id': project.id,
|
||||||
|
'project_id': project.id, }
|
||||||
|
|
||||||
|
self.network.ips.assert_called_once_with(**filters)
|
||||||
|
|
||||||
|
self.assertEqual(self.columns, columns)
|
||||||
|
self.assertEqual(self.data, list(data))
|
||||||
|
|
||||||
|
def test_floating_ip_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,
|
||||||
|
'project_id': project.id, }
|
||||||
|
|
||||||
|
self.network.ips.assert_called_once_with(**filters)
|
||||||
|
self.assertEqual(self.columns, columns)
|
||||||
|
self.assertEqual(self.data, list(data))
|
||||||
|
|
||||||
|
def test_floating_ip_list_router(self):
|
||||||
|
arglist = [
|
||||||
|
'--router', 'fake_router_id',
|
||||||
|
'--long',
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('router', 'fake_router_id'),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.network.ips.assert_called_once_with(**{
|
||||||
|
'router_id': 'fake_router_id',
|
||||||
|
})
|
||||||
|
self.assertEqual(self.columns_long, columns)
|
||||||
|
self.assertEqual(self.data_long, list(data))
|
||||||
|
|
||||||
|
|
||||||
class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
|
class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
|
||||||
|
|
||||||
|
6
releasenotes/notes/bug-1614379-d8e2815804d53cef.yaml
Normal file
6
releasenotes/notes/bug-1614379-d8e2815804d53cef.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Add ``--long``, ``--status``, ``--project``, ``--project-domain``,
|
||||||
|
and ``--router`` options to ``floating ip list`` command.
|
||||||
|
[Bug `1614379 <https://bugs.launchpad.net/bugs/1614379>`_]
|
Loading…
Reference in New Issue
Block a user