Merge "Fix Octavia version detection" into stable/train
This commit is contained in:
commit
145d419cf6
|
@ -30,6 +30,7 @@ from openstack.load_balancer.v2 import pool as o_pool
|
|||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import timeutils
|
||||
from oslo_utils import versionutils
|
||||
|
||||
from kuryr_kubernetes import clients
|
||||
from kuryr_kubernetes import config
|
||||
|
@ -64,21 +65,44 @@ class LBaaSv2Driver(base.LBaaSDriver):
|
|||
|
||||
self._octavia_tags = False
|
||||
# Check if Octavia API supports tagging.
|
||||
lbaas = clients.get_loadbalancer_client()
|
||||
v = lbaas.get_api_major_version()
|
||||
# TODO(dulek): *Maybe* this can be replaced with
|
||||
# lbaas.get_api_major_version(version=_OCTAVIA_TAGGING_VERSION)
|
||||
# if bug https://storyboard.openstack.org/#!/story/2007040 gets
|
||||
# fixed one day.
|
||||
v = self.get_octavia_version()
|
||||
if v >= _OCTAVIA_TAGGING_VERSION:
|
||||
LOG.info('Octavia supports resource tags.')
|
||||
self._octavia_tags = True
|
||||
else:
|
||||
if v is None:
|
||||
v_str = 'unknown'
|
||||
else:
|
||||
v_str = '%d.%d' % v
|
||||
v_str = '%d.%d' % v
|
||||
LOG.warning('[neutron_defaults]resource_tags is set, but Octavia '
|
||||
'API %s does not support resource tagging. Kuryr '
|
||||
'will put requested tags in the description field of '
|
||||
'Octavia resources.', v_str)
|
||||
|
||||
def get_octavia_version(self):
|
||||
lbaas = clients.get_loadbalancer_client()
|
||||
region_name = getattr(CONF.neutron, 'region_name', None)
|
||||
|
||||
regions = lbaas.get_all_version_data()
|
||||
# If region was specified take it, otherwise just take first as default
|
||||
endpoints = regions.get(region_name, list(regions.values())[0])
|
||||
# Take the first endpoint
|
||||
services = list(endpoints.values())[0]
|
||||
# Try load-balancer service, if not take the first
|
||||
versions = services.get('load-balancer', list(services.values())[0])
|
||||
# Lookup the latest version. For safety, we won't look for
|
||||
# version['status'] == 'CURRENT' and assume it's the maximum. Also we
|
||||
# won't assume this dict is sorted.
|
||||
max_ver = 0, 0
|
||||
for version in versions:
|
||||
v_tuple = versionutils.convert_version_to_tuple(version['version'])
|
||||
if v_tuple > max_ver:
|
||||
max_ver = v_tuple
|
||||
|
||||
LOG.debug("Detected Octavia version %d.%d", *max_ver)
|
||||
return max_ver
|
||||
|
||||
def get_service_loadbalancer_name(self, namespace, svc_name):
|
||||
return "%s/%s" % (namespace, svc_name)
|
||||
|
||||
|
|
|
@ -34,33 +34,57 @@ from kuryr_kubernetes.tests.unit import kuryr_fixtures as k_fix
|
|||
|
||||
CONF = cfg.CONF
|
||||
|
||||
OCTAVIA_VERSIONS = {
|
||||
'regionOne': {
|
||||
'public': {
|
||||
'load-balancer': [
|
||||
{
|
||||
'status': 'SUPPORTED',
|
||||
'version': '2.0',
|
||||
'raw_status': u'SUPPORTED',
|
||||
},
|
||||
{
|
||||
'status': 'SUPPORTED',
|
||||
'version': '2.1',
|
||||
'raw_status': u'SUPPORTED',
|
||||
},
|
||||
{
|
||||
'status': 'CURRENT',
|
||||
'version': '2.2',
|
||||
'raw_status': u'CURRENT',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class TestLBaaSv2Driver(test_base.TestCase):
|
||||
def test_add_tags(self):
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.lbaasv2.LBaaSv2Driver.'
|
||||
'get_octavia_version', return_value=(2, 5))
|
||||
def test_add_tags(self, _m_get):
|
||||
CONF.set_override('resource_tags', ['foo'], group='neutron_defaults')
|
||||
self.addCleanup(CONF.clear_override, 'resource_tags',
|
||||
group='neutron_defaults')
|
||||
lbaas = self.useFixture(k_fix.MockLBaaSClient()).client
|
||||
lbaas.get_api_major_version.return_value = (2, 5)
|
||||
d = d_lbaasv2.LBaaSv2Driver()
|
||||
req = {}
|
||||
d._add_tags('loadbalancer', req)
|
||||
self.assertEqual({'tags': ['foo']}, req)
|
||||
|
||||
def test_add_tags_no_tag(self):
|
||||
lbaas = self.useFixture(k_fix.MockLBaaSClient()).client
|
||||
lbaas.get_api_major_version.return_value = (2, 5)
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.lbaasv2.LBaaSv2Driver.'
|
||||
'get_octavia_version', return_value=(2, 5))
|
||||
def test_add_tags_no_tag(self, _m_get):
|
||||
d = d_lbaasv2.LBaaSv2Driver()
|
||||
req = {}
|
||||
d._add_tags('loadbalancer', req)
|
||||
self.assertEqual({}, req)
|
||||
|
||||
def test_add_tags_no_support(self):
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.lbaasv2.LBaaSv2Driver.'
|
||||
'get_octavia_version', return_value=(2, 4))
|
||||
def test_add_tags_no_support(self, _m_get):
|
||||
CONF.set_override('resource_tags', ['foo'], group='neutron_defaults')
|
||||
self.addCleanup(CONF.clear_override, 'resource_tags',
|
||||
group='neutron_defaults')
|
||||
lbaas = self.useFixture(k_fix.MockLBaaSClient()).client
|
||||
lbaas.get_api_major_version.return_value = (2, 4)
|
||||
d = d_lbaasv2.LBaaSv2Driver()
|
||||
for res in ('loadbalancer', 'listener', 'pool', 'l7policy'):
|
||||
req = {}
|
||||
|
@ -68,12 +92,12 @@ class TestLBaaSv2Driver(test_base.TestCase):
|
|||
self.assertEqual({'description': 'foo'}, req,
|
||||
'No description added to resource %s' % res)
|
||||
|
||||
def test_add_tags_no_support_resource_no_description(self):
|
||||
@mock.patch('kuryr_kubernetes.controller.drivers.lbaasv2.LBaaSv2Driver.'
|
||||
'get_octavia_version', return_value=(2, 4))
|
||||
def test_add_tags_no_support_resource_no_description(self, _m_get):
|
||||
CONF.set_override('resource_tags', ['foo'], group='neutron_defaults')
|
||||
self.addCleanup(CONF.clear_override, 'resource_tags',
|
||||
group='neutron_defaults')
|
||||
lbaas = self.useFixture(k_fix.MockLBaaSClient()).client
|
||||
lbaas.get_api_major_version.return_value = (2, 4)
|
||||
d = d_lbaasv2.LBaaSv2Driver()
|
||||
for res in ('member', 'rule'):
|
||||
req = {}
|
||||
|
@ -81,6 +105,13 @@ class TestLBaaSv2Driver(test_base.TestCase):
|
|||
self.assertEqual({}, req, 'Unnecessary description added to '
|
||||
'resource %s' % res)
|
||||
|
||||
def test_get_octavia_version(self):
|
||||
lbaas = self.useFixture(k_fix.MockLBaaSClient()).client
|
||||
lbaas.get_all_version_data.return_value = OCTAVIA_VERSIONS
|
||||
self.assertEqual((2, 2),
|
||||
d_lbaasv2.LBaaSv2Driver.get_octavia_version(
|
||||
d_lbaasv2.LBaaSv2Driver()))
|
||||
|
||||
def test_ensure_loadbalancer(self):
|
||||
neutron = self.useFixture(k_fix.MockNeutronClient()).client
|
||||
cls = d_lbaasv2.LBaaSv2Driver
|
||||
|
|
Loading…
Reference in New Issue