charm-layer-openstack/unit_tests/test_charm_openstack_ip.py

109 lines
4.2 KiB
Python

# Note that the unit_tests/__init__.py has the following lines to stop
# side effects from the imorts from charm helpers.
# sys.path.append('./lib')
# mock out some charmhelpers libraries as they have apt install side effects
# sys.modules['charmhelpers.contrib.openstack.utils'] = mock.MagicMock()
# sys.modules['charmhelpers.contrib.network.ip'] = mock.MagicMock()
import utils
import charm.openstack.ip as ip
class TestCharmOpenStackIp(utils.BaseTestCase):
def test_canonical_url(self):
self.patch_object(ip, 'resolve_address', return_value='address1')
self.patch_object(ip, 'is_ipv6', return_value=False)
# not ipv6
url = ip.canonical_url()
self.assertEqual(url, 'http://address1')
self.resolve_address.assert_called_once_with(ip.PUBLIC)
# is ipv6
self.is_ipv6.return_value = True
self.resolve_address.reset_mock()
url = ip.canonical_url()
self.assertEqual(url, 'http://[address1]')
self.resolve_address.assert_called_once_with(ip.PUBLIC)
# test we check for enpoint type
self.is_ipv6.return_value = False
self.resolve_address.reset_mock()
url = ip.canonical_url(ip.INTERNAL)
self.resolve_address.assert_called_once_with(ip.INTERNAL)
def test_resolve_address(self):
self.patch_object(ip, 'is_clustered')
self.patch_object(ip, 'config')
self.patch_object(ip, 'is_address_in_network')
self.patch_object(ip, 'get_ipv6_addr')
self.patch_object(ip, 'unit_get')
self.patch_object(ip, 'get_address_in_network')
# define a fake_config() that returns predictable results and remembers
# what it was called with.
calls_list = []
_config = {
'vip': 'vip-address',
'prefer-ipv6': False,
'os-public-network': 'the-public-network',
'os-internal-network': 'the-internal-network',
'os-admin-network': 'the-admin-network',
}
def fake_config(*args):
calls_list.append(args)
return _config[args[0]]
self.config.side_effect = fake_config
# first test, if not clustered, that the function uses unit_get() and
# get_address_in_network to get a real address.
# for the default PUBLIC endpoint
self.is_clustered.return_value = False
self.get_address_in_network.return_value = 'got-address'
self.unit_get.return_value = 'unit-get-address'
addr = ip.resolve_address()
self.assertEqual(addr, 'got-address')
self.assertEqual(calls_list,
[('prefer-ipv6',), ('os-public-network',)])
self.unit_get.assert_called_once_with('public-address')
self.get_address_in_network.assert_called_once_with(
'the-public-network', 'unit-get-address')
# second test: not clusted, prefer-ipv6 is True
_config['prefer-ipv6'] = True
calls_list = []
self.get_ipv6_addr.return_value = ['ipv6-addr']
self.get_address_in_network.reset_mock()
addr = ip.resolve_address()
self.get_ipv6_addr.assert_called_once_with(exc_list=['vip-address'])
self.get_address_in_network.assert_called_once_with(
'the-public-network', 'ipv6-addr')
# Third test: clustered, and config(...) returns None
self.is_clustered.return_value = True
_config['os-public-network'] = None
calls_list = []
addr = ip.resolve_address()
self.assertEqual(calls_list, [('os-public-network',), ('vip',)])
# Fourth test: clustered, and config(...) returns not None
_config['os-public-network'] = 'the-public-network'
calls_list = []
_config['vip'] = 'vip1 vip2'
self.is_address_in_network.return_value = (False, True)
addr = ip.resolve_address()
self.assertEqual(calls_list, [
('os-public-network',),
('vip',),
('os-public-network',),
('os-public-network',)])
self.assertEqual(addr, 'vip2')
# Finally resolved_address returns None -> ValueError()
# allow vip to not be found:
self.is_address_in_network.return_value = False
with self.assertRaises(ValueError):
addr = ip.resolve_address()