From d0331abc38b4713b710014d633333dfc95aafc58 Mon Sep 17 00:00:00 2001 From: Sunday Mgbogu Date: Fri, 9 Apr 2021 21:56:59 +0100 Subject: [PATCH] Include proper log when Kuryr cannot reach Octavia API This is not the proper way of informing user that Octavia returns 503, we should have a nice message or we'll start getting bug reports on us Closes-bug: 1918708 Change-Id: I871c3998edb5b1d594067b60e908c453ad122dde --- .../controller/drivers/lbaasv2.py | 6 +++++- kuryr_kubernetes/exceptions.py | 11 ++++++++++ .../unit/controller/drivers/test_lbaasv2.py | 20 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/kuryr_kubernetes/controller/drivers/lbaasv2.py b/kuryr_kubernetes/controller/drivers/lbaasv2.py index 154a6f265..fddb7fa8e 100644 --- a/kuryr_kubernetes/controller/drivers/lbaasv2.py +++ b/kuryr_kubernetes/controller/drivers/lbaasv2.py @@ -29,6 +29,7 @@ from kuryr_kubernetes.controller.drivers import base from kuryr_kubernetes import exceptions as k_exc from kuryr_kubernetes import utils + CONF = cfg.CONF LOG = logging.getLogger(__name__) @@ -118,7 +119,10 @@ class LBaaSv2Driver(base.LBaaSDriver): # 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 version.get('version') is None: + raise k_exc.UnreachableOctavia('Unable to reach Octavia API') + v_tuple = versionutils.convert_version_to_tuple( + version['version']) if v_tuple > max_ver: max_ver = v_tuple diff --git a/kuryr_kubernetes/exceptions.py b/kuryr_kubernetes/exceptions.py index e6311cf3c..b6a7f5e08 100644 --- a/kuryr_kubernetes/exceptions.py +++ b/kuryr_kubernetes/exceptions.py @@ -116,3 +116,14 @@ class CNIBindingFailure(Exception): """Exception indicates a binding/unbinding VIF failure in CNI""" def __init__(self, message): super(CNIBindingFailure, self).__init__(message) + + +class UnreachableOctavia(Exception): + """Exception indicates Octavia API failure and can not be reached + + This exception is raised when Kuryr can not reach Octavia. The Octavia + API call returns 'None' on the version field and we need to properly log + a message informing the user + """ + def __init__(self, message): + super(UnreachableOctavia, self).__init__(message) diff --git a/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py b/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py index fa21f55e7..43421dc0d 100644 --- a/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py +++ b/kuryr_kubernetes/tests/unit/controller/drivers/test_lbaasv2.py @@ -57,6 +57,20 @@ OCTAVIA_VERSIONS = { }, } +BAD_OCTAVIA_VERSIONS = { + 'regionOne': { + 'public': { + 'load-balancer': [ + { + 'status': 'CURRENT', + 'version': None, + 'raw_status': u'CURRENT', + }, + ], + }, + }, +} + class TestLBaaSv2Driver(test_base.TestCase): @mock.patch('kuryr_kubernetes.controller.drivers.lbaasv2.LBaaSv2Driver.' @@ -110,6 +124,12 @@ class TestLBaaSv2Driver(test_base.TestCase): self.assertEqual((2, 2), d_lbaasv2.LBaaSv2Driver.get_octavia_version(None)) + def test_get_octavia_version_is_none(self): + lbaas = self.useFixture(k_fix.MockLBaaSClient()).client + lbaas.get_all_version_data.return_value = BAD_OCTAVIA_VERSIONS + self.assertRaises(k_exc.UnreachableOctavia, + d_lbaasv2.LBaaSv2Driver.get_octavia_version, None) + def test_ensure_loadbalancer(self): os_net = self.useFixture(k_fix.MockNetworkClient()).client cls = d_lbaasv2.LBaaSv2Driver