fixed_configured=True when Add/Remove port IPs
When updating a port with the fixed_ips request the fixed_configured argument should be set to true when calling _ipam_get_subnets() so that all subnets are returned if host is not set. Otherwise the ip allocation will be deffered and an empty list of possible subnets for the port is returned. Which in turn led to raising an error that the network requires subnets to allocate an IP address. Closes-Bug: #1844124 Change-Id: I2e690ea0cf5fa0614e39be2b0e83afad3daa7f48
This commit is contained in:
parent
3ad6af7626
commit
def8e95aad
@ -345,7 +345,7 @@ class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):
|
|||||||
try:
|
try:
|
||||||
subnets = self._ipam_get_subnets(
|
subnets = self._ipam_get_subnets(
|
||||||
context, network_id=port['network_id'], host=host,
|
context, network_id=port['network_id'], host=host,
|
||||||
service_type=port.get('device_owner'))
|
service_type=port.get('device_owner'), fixed_configured=True)
|
||||||
except ipam_exc.DeferIpam:
|
except ipam_exc.DeferIpam:
|
||||||
subnets = []
|
subnets = []
|
||||||
|
|
||||||
|
@ -688,8 +688,8 @@ class TestDbBasePluginIpam(test_db_base.NeutronDbPluginV2TestCase):
|
|||||||
original_ips, new_ips, mac)
|
original_ips, new_ips, mac)
|
||||||
mocks['driver'].get_address_request_factory.assert_called_once_with()
|
mocks['driver'].get_address_request_factory.assert_called_once_with()
|
||||||
mocks['ipam']._ipam_get_subnets.assert_called_once_with(
|
mocks['ipam']._ipam_get_subnets.assert_called_once_with(
|
||||||
context, network_id=port_dict['network_id'], host=None,
|
context, network_id=port_dict['network_id'], fixed_configured=True,
|
||||||
service_type=port_dict['device_owner'])
|
host=None, service_type=port_dict['device_owner'])
|
||||||
# Validate port_dict is passed into address_factory
|
# Validate port_dict is passed into address_factory
|
||||||
address_factory.get_request.assert_called_once_with(context,
|
address_factory.get_request.assert_called_once_with(context,
|
||||||
port_dict,
|
port_dict,
|
||||||
|
@ -1175,8 +1175,8 @@ class TestSegmentAwareIpam(SegmentAwareIpamTestCase):
|
|||||||
self.assertEqual(segment_exc.HostConnectedToMultipleSegments.__name__,
|
self.assertEqual(segment_exc.HostConnectedToMultipleSegments.__name__,
|
||||||
res['NeutronError']['type'])
|
res['NeutronError']['type'])
|
||||||
|
|
||||||
def test_port_update_excludes_hosts_on_segments(self):
|
def test_port_update_with_fixed_ips_ok_if_no_binding_host(self):
|
||||||
"""No binding information is provided, subnets on segments"""
|
"""No binding host information is provided, subnets on segments"""
|
||||||
with self.network() as network:
|
with self.network() as network:
|
||||||
segment = self._test_create_segment(
|
segment = self._test_create_segment(
|
||||||
network_id=network['network']['id'],
|
network_id=network['network']['id'],
|
||||||
@ -1196,7 +1196,33 @@ class TestSegmentAwareIpam(SegmentAwareIpamTestCase):
|
|||||||
port_req = self.new_update_request('ports', data, port_id)
|
port_req = self.new_update_request('ports', data, port_id)
|
||||||
response = port_req.get_response(self.api)
|
response = port_req.get_response(self.api)
|
||||||
|
|
||||||
# Gets bad request because there are no eligible subnets.
|
# The IP is allocated since there is no binding host info any
|
||||||
|
# subnet can be used for allocation.
|
||||||
|
self.assertEqual(webob.exc.HTTPOk.code, response.status_int)
|
||||||
|
|
||||||
|
def test_port_update_with_fixed_ips_fail_if_host_not_on_segment(self):
|
||||||
|
"""Binding information is provided, subnets on segments. Update to
|
||||||
|
subnet on different segment fails.
|
||||||
|
"""
|
||||||
|
network, segments, subnets = self._create_test_segments_with_subnets(2)
|
||||||
|
|
||||||
|
# Setup host mappings
|
||||||
|
self._setup_host_mappings([(segments[0]['segment']['id'], 'fakehost')])
|
||||||
|
|
||||||
|
# Create a port and validate immediate ip allocation
|
||||||
|
res = self._create_port_and_show(network,
|
||||||
|
arg_list=(portbindings.HOST_ID,),
|
||||||
|
**{portbindings.HOST_ID: 'fakehost'})
|
||||||
|
self._validate_immediate_ip_allocation(res['port']['id'])
|
||||||
|
|
||||||
|
# Try requesting an new IP, but the subnet does not match host segment
|
||||||
|
port_id = res['port']['id']
|
||||||
|
data = {'port': {
|
||||||
|
'fixed_ips': [{'subnet_id': subnets[1]['subnet']['id']}]}}
|
||||||
|
port_req = self.new_update_request('ports', data, port_id)
|
||||||
|
response = port_req.get_response(self.api)
|
||||||
|
|
||||||
|
# Port update fails.
|
||||||
self.assertEqual(webob.exc.HTTPBadRequest.code, response.status_int)
|
self.assertEqual(webob.exc.HTTPBadRequest.code, response.status_int)
|
||||||
|
|
||||||
def _create_port_and_show(self, network, **kwargs):
|
def _create_port_and_show(self, network, **kwargs):
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
When updating the fixed-ips of a port residing on a routed provider
|
||||||
|
network the port update would always fail if *host* was not set.
|
||||||
|
See bug: `1844124 <https://bugs.launchpad.net/tripleo/+bug/1844124>`_.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user