Files
kuryr-kubernetes/kuryr_kubernetes/tests/unit/controller/drivers/test_utils.py
Roman Dobosz 5afa4925fc Fix potential issue with network/subnet name length.
In OpenStack Neutron and Octavia, name and descriptions of the objects
are limited to the 255 characters, while on Kubernetes names are limited
to the 253 characters. Kuryr often creates names for the networks and
subnets using Kubernetes object name with additional prefix and suffix,
which may exceed allowed character limit. In this patch there is
proposed solution for this issue by simply truncate kubernetes resource
name, while keeping prefix and suffix intact, to fit the Neutron name
limit.

Change-Id: I6e404104034f11593fc313797ad464458bbdf82d
2022-04-07 15:57:50 +02:00

163 lines
5.7 KiB
Python

# Copyright 2019 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from unittest import mock
from oslo_config import cfg
from kuryr_kubernetes import constants
from kuryr_kubernetes.controller.drivers import utils
from kuryr_kubernetes import exceptions
from kuryr_kubernetes.tests import base as test_base
from kuryr_kubernetes.tests.unit import kuryr_fixtures as k_fix
CONF = cfg.CONF
class TestUtils(test_base.TestCase):
def test_get_namespace_not_found(self):
namespace_name = mock.sentinel.namespace_name
kubernetes = self.useFixture(k_fix.MockK8sClient()).client
kubernetes.get.side_effect = exceptions.K8sResourceNotFound(
mock.sentinel.resource)
resp = utils.get_namespace(namespace_name)
self.assertIsNone(resp)
kubernetes.get.assert_called_once_with('{}/namespaces/{}'.format(
constants.K8S_API_BASE, namespace_name))
def test_get_network_id(self):
id_a = mock.sentinel.id_a
net1 = mock.Mock()
net1.id = id_a
net2 = mock.Mock()
net2.id = id_a
subnets = {1: net1, 2: net2}
ret = utils.get_network_id(subnets)
self.assertEqual(ret, id_a)
def test_get_network_id_invalid(self):
id_a = mock.sentinel.id_a
id_b = mock.sentinel.id_b
net1 = mock.Mock()
net1.id = id_a
net2 = mock.Mock()
net2.id = id_b
net3 = mock.Mock()
net3.id = id_a
subnets = {1: net1, 2: net2, 3: net3}
self.assertRaises(exceptions.IntegrityError, utils.get_network_id,
subnets)
def test_get_network_id_empty(self):
self.assertRaises(exceptions.IntegrityError, utils.get_network_id, {})
def test_match_selector(self):
self.assertFalse(
utils.match_selector({'matchLabels': {'app': 'demo'}}, None))
self.assertFalse(
utils.match_selector({'matchLabels': {'app': 'demo'}}, {}))
self.assertFalse(
utils.match_selector({'matchLabels': {'app': 'demo'}},
{'app': 'foobar'}))
self.assertTrue(
utils.match_selector({'matchLabels': {'app': 'demo'}},
{'app': 'demo'}))
self.assertTrue(
utils.match_selector({'matchLabels': {'app': 'demo'}},
{'app': 'demo', 'foo': 'bar'}))
self.assertTrue(
utils.match_selector({'matchLabels': {'app': 'demo',
'foo': 'bar'}},
{'app': 'demo', 'foo': 'bar'}))
self.assertFalse(
utils.match_selector({'matchLabels': {'app': 'demo',
'foo': 'bar'}},
{'app': 'demo'}))
def test_is_network_policy_enabled(self):
CONF.set_override('enabled_handlers', ['fake_handler'],
group='kubernetes')
CONF.set_override('service_security_groups_driver', 'foo',
group='kubernetes')
self.assertFalse(utils.is_network_policy_enabled())
CONF.set_override('enabled_handlers', ['policy'],
group='kubernetes')
CONF.set_override('service_security_groups_driver', 'foo',
group='kubernetes')
self.assertFalse(utils.is_network_policy_enabled())
CONF.set_override('enabled_handlers', ['policy'],
group='kubernetes')
self.addCleanup(CONF.clear_override, 'enabled_handlers',
group='kubernetes')
CONF.set_override('service_security_groups_driver', 'policy',
group='kubernetes')
self.addCleanup(CONF.clear_override, 'service_security_groups_driver',
group='kubernetes')
self.assertTrue(utils.is_network_policy_enabled())
def test_get_resource_name_with_too_long_name(self):
name = 253 * "a"
prefix = 'ns/'
suffix = '-net'
new_name = utils.get_resource_name(name, prefix, suffix)
self.assertEqual(new_name,
prefix + 248 * 'a' + suffix)
self.assertEqual(len(new_name), 255)
def test_get_resource_name_with_sane_name(self):
name = 'myns'
prefix = 'ns/'
suffix = '-foo'
new_name = utils.get_resource_name(name, prefix, suffix)
self.assertEqual(new_name, f'{prefix}{name}{suffix}')
def test_get_resource_name_with_prefix(self):
name = 'fun_name'
prefix = 'something/'
new_name = utils.get_resource_name(name, prefix)
self.assertEqual(new_name, f'{prefix}{name}')
def test_get_resource_name_with_sufix(self):
name = 'another'
suffix = '/something-else'
new_name = utils.get_resource_name(name, suffix=suffix)
self.assertEqual(new_name, f'{name}{suffix}')
def test_get_resource_name_non_ascii(self):
name = 'Ру́сский вое́нный кора́бль, иди́ на хуй!'
prefix = 'bar:'
suffix = ':baz'
new_name = utils.get_resource_name(name, prefix, suffix)
self.assertEqual(new_name, f'{prefix}{name}{suffix}')