Merge "Support "network list" command in nova network"
This commit is contained in:
commit
36b21461d9
@ -2,7 +2,7 @@
|
|||||||
network
|
network
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Network v2
|
Compute v2, Network v2
|
||||||
|
|
||||||
network create
|
network create
|
||||||
--------------
|
--------------
|
||||||
|
@ -168,11 +168,10 @@ class DeleteNetwork(common.NetworkAndComputeCommand):
|
|||||||
client.networks.delete(network.id)
|
client.networks.delete(network.id)
|
||||||
|
|
||||||
|
|
||||||
class ListNetwork(command.Lister):
|
class ListNetwork(common.NetworkAndComputeLister):
|
||||||
"""List networks"""
|
"""List networks"""
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
def update_parser_common(self, parser):
|
||||||
parser = super(ListNetwork, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--external',
|
'--external',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
@ -187,9 +186,7 @@ class ListNetwork(command.Lister):
|
|||||||
)
|
)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action_network(self, client, parsed_args):
|
||||||
client = self.app.client_manager.network
|
|
||||||
|
|
||||||
if parsed_args.long:
|
if parsed_args.long:
|
||||||
columns = (
|
columns = (
|
||||||
'id',
|
'id',
|
||||||
@ -231,7 +228,29 @@ class ListNetwork(command.Lister):
|
|||||||
args = {'router:external': True}
|
args = {'router:external': True}
|
||||||
else:
|
else:
|
||||||
args = {}
|
args = {}
|
||||||
|
|
||||||
data = client.networks(**args)
|
data = client.networks(**args)
|
||||||
|
|
||||||
|
return (column_headers,
|
||||||
|
(utils.get_item_properties(
|
||||||
|
s, columns,
|
||||||
|
formatters=_formatters,
|
||||||
|
) for s in data))
|
||||||
|
|
||||||
|
def take_action_compute(self, client, parsed_args):
|
||||||
|
columns = (
|
||||||
|
'id',
|
||||||
|
'label',
|
||||||
|
'cidr',
|
||||||
|
)
|
||||||
|
column_headers = (
|
||||||
|
'ID',
|
||||||
|
'Name',
|
||||||
|
'Subnet',
|
||||||
|
)
|
||||||
|
|
||||||
|
data = client.networks.list()
|
||||||
|
|
||||||
return (column_headers,
|
return (column_headers,
|
||||||
(utils.get_item_properties(
|
(utils.get_item_properties(
|
||||||
s, columns,
|
s, columns,
|
||||||
|
@ -587,3 +587,61 @@ class FakeFloatingIP(object):
|
|||||||
if floating_ips is None:
|
if floating_ips is None:
|
||||||
floating_ips = FakeFloatingIP.create_floating_ips(count)
|
floating_ips = FakeFloatingIP.create_floating_ips(count)
|
||||||
return mock.MagicMock(side_effect=floating_ips)
|
return mock.MagicMock(side_effect=floating_ips)
|
||||||
|
|
||||||
|
|
||||||
|
class FakeNetwork(object):
|
||||||
|
"""Fake one or more networks."""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def create_one_network(attrs={}, methods={}):
|
||||||
|
"""Create a fake network.
|
||||||
|
|
||||||
|
:param Dictionary attrs:
|
||||||
|
A dictionary with all attributes
|
||||||
|
:param Dictionary methods:
|
||||||
|
A dictionary with all methods
|
||||||
|
:return:
|
||||||
|
A FakeResource object, with id, label, cidr
|
||||||
|
"""
|
||||||
|
# Set default attributes.
|
||||||
|
network_attrs = {
|
||||||
|
'id': 'network-id-' + uuid.uuid4().hex,
|
||||||
|
'label': 'network-label-' + uuid.uuid4().hex,
|
||||||
|
'cidr': '10.0.0.0/24',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Overwrite default attributes.
|
||||||
|
network_attrs.update(attrs)
|
||||||
|
|
||||||
|
# Set default methods.
|
||||||
|
network_methods = {
|
||||||
|
'keys': ['id', 'label', 'cidr'],
|
||||||
|
}
|
||||||
|
|
||||||
|
# Overwrite default methods.
|
||||||
|
network_methods.update(methods)
|
||||||
|
|
||||||
|
network = fakes.FakeResource(info=copy.deepcopy(network_attrs),
|
||||||
|
methods=copy.deepcopy(network_methods),
|
||||||
|
loaded=True)
|
||||||
|
|
||||||
|
return network
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def create_networks(attrs={}, methods={}, count=2):
|
||||||
|
"""Create multiple fake networks.
|
||||||
|
|
||||||
|
:param Dictionary attrs:
|
||||||
|
A dictionary with all attributes
|
||||||
|
:param Dictionary methods:
|
||||||
|
A dictionary with all methods
|
||||||
|
:param int count:
|
||||||
|
The number of networks to fake
|
||||||
|
:return:
|
||||||
|
A list of FakeResource objects faking the networks
|
||||||
|
"""
|
||||||
|
networks = []
|
||||||
|
for i in range(0, count):
|
||||||
|
networks.append(FakeNetwork.create_one_network(attrs, methods))
|
||||||
|
|
||||||
|
return networks
|
||||||
|
@ -579,7 +579,7 @@ class TestNetworkCompute(compute_fakes.TestComputev2):
|
|||||||
class TestDeleteNetworkCompute(TestNetworkCompute):
|
class TestDeleteNetworkCompute(TestNetworkCompute):
|
||||||
|
|
||||||
# The network to delete.
|
# The network to delete.
|
||||||
_network = network_fakes.FakeNetwork.create_one_network()
|
_network = compute_fakes.FakeNetwork.create_one_network()
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestDeleteNetworkCompute, self).setUp()
|
super(TestDeleteNetworkCompute, self).setUp()
|
||||||
@ -596,10 +596,10 @@ class TestDeleteNetworkCompute(TestNetworkCompute):
|
|||||||
|
|
||||||
def test_network_delete(self):
|
def test_network_delete(self):
|
||||||
arglist = [
|
arglist = [
|
||||||
self._network.name,
|
self._network.label,
|
||||||
]
|
]
|
||||||
verifylist = [
|
verifylist = [
|
||||||
('network', [self._network.name]),
|
('network', [self._network.label]),
|
||||||
]
|
]
|
||||||
|
|
||||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
@ -607,3 +607,50 @@ class TestDeleteNetworkCompute(TestNetworkCompute):
|
|||||||
|
|
||||||
self.compute.networks.delete.assert_called_with(self._network.id)
|
self.compute.networks.delete.assert_called_with(self._network.id)
|
||||||
self.assertIsNone(result)
|
self.assertIsNone(result)
|
||||||
|
|
||||||
|
|
||||||
|
class TestListNetworkCompute(TestNetworkCompute):
|
||||||
|
|
||||||
|
# The networks going to be listed up.
|
||||||
|
_networks = compute_fakes.FakeNetwork.create_networks(count=3)
|
||||||
|
|
||||||
|
columns = (
|
||||||
|
'ID',
|
||||||
|
'Name',
|
||||||
|
'Subnet',
|
||||||
|
)
|
||||||
|
|
||||||
|
data = []
|
||||||
|
for net in _networks:
|
||||||
|
data.append((
|
||||||
|
net.id,
|
||||||
|
net.label,
|
||||||
|
net.cidr,
|
||||||
|
))
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestListNetworkCompute, self).setUp()
|
||||||
|
|
||||||
|
self.app.client_manager.network_endpoint_enabled = False
|
||||||
|
|
||||||
|
self.compute.networks.list.return_value = self._networks
|
||||||
|
|
||||||
|
# Get the command object to test
|
||||||
|
self.cmd = network.ListNetwork(self.app, None)
|
||||||
|
|
||||||
|
def test_network_list_no_options(self):
|
||||||
|
arglist = []
|
||||||
|
verifylist = [
|
||||||
|
('external', False),
|
||||||
|
('long', False),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
|
||||||
|
# In base command class Lister in cliff, abstract method take_action()
|
||||||
|
# returns a tuple containing the column names and an iterable
|
||||||
|
# containing the data to be listed.
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
self.compute.networks.list.assert_called_with()
|
||||||
|
self.assertEqual(self.columns, columns)
|
||||||
|
self.assertEqual(self.data, list(data))
|
||||||
|
@ -2,3 +2,5 @@
|
|||||||
features:
|
features:
|
||||||
- Command ``network delete`` is now available for nova network.
|
- Command ``network delete`` is now available for nova network.
|
||||||
[Bug `1543672 <https://bugs.launchpad.net/python-openstackclient/+bug/1543672>`_]
|
[Bug `1543672 <https://bugs.launchpad.net/python-openstackclient/+bug/1543672>`_]
|
||||||
|
- Command ``network list`` is now available for nova network.
|
||||||
|
[Bug `1543672 <https://bugs.launchpad.net/python-openstackclient/+bug/1543672>`_]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user