network: Fix update of network provider

On update the network provider parameters were
nested in the "provider". According to the
Neutron API [0], update should follow the same
semantics as create.

[0] https://docs.openstack.org/api-ref/network/v2/?expanded=update-network-detail#update-network

Change-Id: Ie2664611873f7528b9a2e6c0fbdbcf12a2c4ba90
This commit is contained in:
Ales Musil 2020-11-09 15:10:11 +01:00
parent 98f0c67120
commit 44c5515602
2 changed files with 48 additions and 9 deletions

View File

@ -568,17 +568,15 @@ class NetworkCloudMixin:
:returns: The updated network object.
:raises: OpenStackCloudException on operation error.
"""
if 'provider' in kwargs:
if not isinstance(kwargs['provider'], dict):
provider = kwargs.pop('provider', None)
if provider:
if not isinstance(provider, dict):
raise exc.OpenStackCloudException(
"Parameter 'provider' must be a dict")
# Only pass what we know
provider = {}
for key in kwargs['provider']:
if key in ('physical_network', 'network_type',
'segmentation_id'):
provider['provider:' + key] = kwargs['provider'][key]
kwargs['provider'] = provider
for key in ('physical_network', 'network_type',
'segmentation_id'):
if key in provider:
kwargs['provider:' + key] = provider.pop(key)
if 'external' in kwargs:
kwargs['router:external'] = kwargs.pop('external')

View File

@ -175,6 +175,47 @@ class TestNetwork(base.TestCase):
self._compare_networks(mock_new_network_rep, network)
self.assert_calls()
def test_update_network_provider(self):
network_id = "test-net-id"
network_name = "network"
network = {'id': network_id, 'name': network_name}
provider_opts = {'physical_network': 'mynet',
'network_type': 'vlan',
'segmentation_id': 'vlan1',
'should_not_be_passed': 1}
update_network_provider_opts = {
'provider:physical_network': 'mynet',
'provider:network_type': 'vlan',
'provider:segmentation_id': 'vlan1'
}
mock_update_rep = copy.copy(self.mock_new_network_rep)
mock_update_rep.update(update_network_provider_opts)
self.register_uris([
dict(method='GET',
uri=self.get_mock_url(
'network', 'public',
append=['v2.0', 'networks', network_name]),
status_code=404),
dict(method='GET',
uri=self.get_mock_url(
'network', 'public', append=['v2.0', 'networks'],
qs_elements=['name=%s' % network_name]),
json={'networks': [network]}),
dict(method='PUT',
uri=self.get_mock_url(
'network', 'public',
append=['v2.0', 'networks', network_id]),
json={'network': mock_update_rep},
validate=dict(
json={'network': update_network_provider_opts}))
])
network = self.cloud.update_network(
network_name,
provider=provider_opts
)
self._compare_networks(mock_update_rep, network)
self.assert_calls()
def test_create_network_with_availability_zone_hints(self):
self.register_uris([
dict(method='GET',