Support "network list" command in nova network
"network list" command is not implemented in nova network. This patch implements it. The Network object in novaclient is quite different from the one in sdk. And the output of "network list" using Nova network is also quite different from using Neutron. It is like this: # openstack network list +--------------------------------------+---------+-------------+ | ID | Name | Subnet | +--------------------------------------+---------+-------------+ | 96a98ec4-31f6-45f6-99e6-9384569b3bb5 | private | 10.0.0.0/24 | +--------------------------------------+---------+-------------+ --long and --external options have not been implemented because the attrs in Network object in novaclient is too much different. This patch also introduces a new FakeNetwork class in compute/v2/fake.py to fake nova network. Change-Id: Id1fdf81fb2fa8b39f2c76b7bae37ac4fecafd0f7 Depends-On: I1b59264cd40aaf1062f4e8db233ccb7fd0e95f0e partial-Bug: 1543672
This commit is contained in:
parent
0a3ba91d53
commit
ddc97c6dc5
@ -2,7 +2,7 @@
|
||||
network
|
||||
=======
|
||||
|
||||
Network v2
|
||||
Compute v2, Network v2
|
||||
|
||||
network create
|
||||
--------------
|
||||
|
@ -168,11 +168,10 @@ class DeleteNetwork(common.NetworkAndComputeCommand):
|
||||
client.networks.delete(network.id)
|
||||
|
||||
|
||||
class ListNetwork(command.Lister):
|
||||
class ListNetwork(common.NetworkAndComputeLister):
|
||||
"""List networks"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListNetwork, self).get_parser(prog_name)
|
||||
def update_parser_common(self, parser):
|
||||
parser.add_argument(
|
||||
'--external',
|
||||
action='store_true',
|
||||
@ -187,9 +186,7 @@ class ListNetwork(command.Lister):
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.network
|
||||
|
||||
def take_action_network(self, client, parsed_args):
|
||||
if parsed_args.long:
|
||||
columns = (
|
||||
'id',
|
||||
@ -231,7 +228,29 @@ class ListNetwork(command.Lister):
|
||||
args = {'router:external': True}
|
||||
else:
|
||||
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,
|
||||
(utils.get_item_properties(
|
||||
s, columns,
|
||||
|
@ -525,3 +525,61 @@ class FakeFloatingIP(object):
|
||||
if floating_ips is None:
|
||||
floating_ips = FakeFloatingIP.create_floating_ips(count)
|
||||
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):
|
||||
|
||||
# The network to delete.
|
||||
_network = network_fakes.FakeNetwork.create_one_network()
|
||||
_network = compute_fakes.FakeNetwork.create_one_network()
|
||||
|
||||
def setUp(self):
|
||||
super(TestDeleteNetworkCompute, self).setUp()
|
||||
@ -596,10 +596,10 @@ class TestDeleteNetworkCompute(TestNetworkCompute):
|
||||
|
||||
def test_network_delete(self):
|
||||
arglist = [
|
||||
self._network.name,
|
||||
self._network.label,
|
||||
]
|
||||
verifylist = [
|
||||
('network', [self._network.name]),
|
||||
('network', [self._network.label]),
|
||||
]
|
||||
|
||||
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.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:
|
||||
- Command ``network delete`` is now available for nova network.
|
||||
[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…
Reference in New Issue
Block a user