Replace usage of LBaaS v2 constant

Neutron LBaaS was retired some time ago and its constants was removed
from core neutron[1]. This replaces the usage of LBaaS v2 constants to
enable IPv6 RA.

Ideally this implementation should be replaced by something more
generic but for now the trunk subport owner can be used.

[1] https://review.opendev.org/c/openstack/neutron/+/902048

Change-Id: I887766a68b93d984130808bfbb171ffcaae950fe
This commit is contained in:
Takashi Kajinami 2023-12-04 10:57:37 +09:00
parent f76d066df5
commit 81fc941f63
3 changed files with 41 additions and 21 deletions

View File

@ -34,7 +34,7 @@ from keystoneauth1 import exceptions as keystone_exceptions
from neutronclient.v2_0 import client as neutron_client
from novaclient import client as nova_client
import neutron_lib.constants
import neutron_lib.services.trunk.constants
import charm.openstack.octavia as octavia # for constants
@ -359,8 +359,12 @@ def get_hm_port(identity_service, local_unit_name, local_unit_address,
# 1: https://github.com/openstack/neutron/blob/
# 50308c03c960bd6e566f328a790b8e05f5e92ead/
# neutron/common/utils.py#L200
#
# NOTE(tkajinam): This implementation may need to be updated
# because the current logic heavily depends on neutron's internal
# behavior.
'device_owner': (
neutron_lib.constants.DEVICE_OWNER_LOADBALANCERV2),
neutron_lib.services.trunk.constants.TRUNK_SUBPORT_OWNER),
'security_groups': [
health_secgrp['id'],
],
@ -385,24 +389,37 @@ def get_hm_port(identity_service, local_unit_name, local_unit_address,
nc.add_tag('ports', hm_port['id'], 'charm-octavia')
except NEUTRON_TEMP_EXCS as e:
raise APIUnavailable('neutron', 'ports', e)
elif hm_port.get(
'binding:host_id') != port_template['port']['binding:host_id']:
# Ensure binding:host_id is up to date on a existing port
#
# In the event of a need to update it, we bring the port down to make
# sure Neutron rebuilds the port correctly.
#
# Our caller, ``setup_hm_port``, will toggle the port admin status.
try:
nc.update_port(hm_port['id'], {
'port': {
'admin_state_up': False,
'binding:host_id': port_template['port'][
'binding:host_id'],
}
})
except NEUTRON_TEMP_EXCS as e:
raise APIUnavailable('neutron', 'ports', e)
else:
if (hm_port.get('binding:host_id') !=
port_template['port']['binding:host_id']):
# Ensure binding:host_id is up to date on a existing port
#
# In the event of a need to update it, we bring the port down to
# make sure Neutron rebuilds the port correctly.
#
# Our caller, ``setup_hm_port``, will toggle the port admin status.
try:
nc.update_port(hm_port['id'], {
'port': {
'admin_state_up': False,
'binding:host_id': port_template['port'][
'binding:host_id'],
}
})
except NEUTRON_TEMP_EXCS as e:
raise APIUnavailable('neutron', 'ports', e)
if (hm_port.get('device_owner') !=
port_template['port']['device_owner']):
try:
nc.update_port(hm_port['id'], {
'port': {
'device_owner': port_template['port']['device_owner']
}
})
except NEUTRON_TEMP_EXCS as e:
raise APIUnavailable('neutron', 'ports', e)
return hm_port

View File

@ -72,6 +72,8 @@ sys.modules['novaclient'] = novaclient
neutron_lib = mock.MagicMock()
sys.modules['neutron_lib'] = neutron_lib
sys.modules['neutron_lib.constants'] = neutron_lib.constants
sys.modules['neutron_lib.services.trunk.constants'] = (
neutron_lib.services.trunk.constants)
neutronclient = mock.MagicMock()
sys.modules['neutronclient'] = neutronclient
sys.modules['neutronclient.v2_0'] = neutronclient.v2_0

View File

@ -186,7 +186,8 @@ class TestAPICrud(test_utils.PatchHelper):
self.patch('charms.reactive.set_flag', 'set_flag')
identity_service = mock.MagicMock()
self.patch_object(api_crud, 'neutron_lib')
self.neutron_lib.constants.DEVICE_OWNER_LOADBALANCERV2 = 'fakeowner'
self.neutron_lib.services.trunk.constants.TRUNK_SUBPORT_OWNER = (
'fakeowner')
self.patch_object(api_crud, 'lookup_hm_port')
self.lookup_hm_port.return_value = None
result = api_crud.get_hm_port(identity_service,