281 lines
10 KiB
Python
Raw Normal View History

from mock import (
Mock,
MagicMock,
patch
)
import neutron_contexts
import sys
2013-07-22 16:39:07 +01:00
from contextlib import contextmanager
from test_utils import (
CharmTestCase
)
TO_PATCH = [
'apt_install',
2013-07-22 16:39:07 +01:00
'config',
'eligible_leader',
'get_os_codename_install_source',
2013-07-22 16:39:07 +01:00
'unit_get',
]
@contextmanager
def patch_open():
'''Patch open() to allow mocking both open() itself and the file that is
yielded.
Yields the mock for "open" and "file", respectively.'''
mock_open = MagicMock(spec=open)
mock_file = MagicMock(spec=file)
@contextmanager
def stub_open(*args, **kwargs):
mock_open(*args, **kwargs)
yield mock_file
with patch('__builtin__.open', stub_open):
yield mock_open, mock_file
2015-03-31 08:48:28 +01:00
class DummyNeutronAPIContext():
def __init__(self, return_value):
self.return_value = return_value
def __call__(self):
return self.return_value
2013-11-06 13:37:11 +00:00
class TestL3AgentContext(CharmTestCase):
2014-02-24 17:47:55 +00:00
2013-11-06 13:37:11 +00:00
def setUp(self):
super(TestL3AgentContext, self).setUp(neutron_contexts,
2013-11-06 13:37:11 +00:00
TO_PATCH)
self.config.side_effect = self.test_config.get
@patch('neutron_contexts.NeutronAPIContext')
2016-02-23 17:55:02 +00:00
def test_no_ext_netid(self, _NeutronAPIContext):
2015-03-31 08:48:28 +01:00
_NeutronAPIContext.return_value = \
DummyNeutronAPIContext(return_value={'enable_dvr': False})
self.test_config.set('run-internal-router', 'none')
self.test_config.set('external-network-id', '')
2013-11-06 13:37:11 +00:00
self.eligible_leader.return_value = False
self.assertEquals(neutron_contexts.L3AgentContext()(),
2015-02-19 16:16:07 +00:00
{'agent_mode': 'legacy',
'handle_internal_only_router': False,
2014-08-21 00:02:19 +00:00
'plugin': 'ovs'})
2013-11-06 13:37:11 +00:00
@patch('neutron_contexts.NeutronAPIContext')
2015-03-31 08:48:28 +01:00
def test_hior_leader(self, _NeutronAPIContext):
_NeutronAPIContext.return_value = \
DummyNeutronAPIContext(return_value={'enable_dvr': False})
self.test_config.set('run-internal-router', 'leader')
self.test_config.set('external-network-id', 'netid')
2013-11-06 13:37:11 +00:00
self.eligible_leader.return_value = True
self.assertEquals(neutron_contexts.L3AgentContext()(),
2015-02-19 16:16:07 +00:00
{'agent_mode': 'legacy',
'handle_internal_only_router': True,
2014-08-21 00:02:19 +00:00
'ext_net_id': 'netid',
'plugin': 'ovs'})
2013-11-06 13:37:11 +00:00
@patch('neutron_contexts.NeutronAPIContext')
2015-03-31 08:48:28 +01:00
def test_hior_all(self, _NeutronAPIContext):
_NeutronAPIContext.return_value = \
DummyNeutronAPIContext(return_value={'enable_dvr': False})
self.test_config.set('run-internal-router', 'all')
self.test_config.set('external-network-id', 'netid')
2013-11-06 13:37:11 +00:00
self.eligible_leader.return_value = True
self.assertEquals(neutron_contexts.L3AgentContext()(),
2015-02-19 16:16:07 +00:00
{'agent_mode': 'legacy',
'handle_internal_only_router': True,
2014-08-21 00:02:19 +00:00
'ext_net_id': 'netid',
'plugin': 'ovs'})
2013-11-06 13:37:11 +00:00
@patch('neutron_contexts.NeutronAPIContext')
2015-03-31 08:48:28 +01:00
def test_dvr(self, _NeutronAPIContext):
_NeutronAPIContext.return_value = \
DummyNeutronAPIContext(return_value={'enable_dvr': True})
self.assertEquals(neutron_contexts.L3AgentContext()()['agent_mode'],
2015-02-26 09:09:27 +00:00
'dvr_snat')
2013-11-06 13:37:11 +00:00
2015-05-07 10:33:38 +01:00
class TestNeutronGatewayContext(CharmTestCase):
2014-02-24 17:47:55 +00:00
2013-07-22 16:39:07 +01:00
def setUp(self):
2015-05-07 10:33:38 +01:00
super(TestNeutronGatewayContext, self).setUp(neutron_contexts,
2013-07-22 16:39:07 +01:00
TO_PATCH)
2013-12-18 09:50:58 +00:00
self.config.side_effect = self.test_config.get
2015-03-25 07:58:50 +00:00
self.maxDiff = None
2013-07-22 16:39:07 +01:00
2015-03-24 12:07:21 +00:00
@patch('charmhelpers.contrib.openstack.context.relation_get')
@patch('charmhelpers.contrib.openstack.context.related_units')
@patch('charmhelpers.contrib.openstack.context.relation_ids')
@patch.object(neutron_contexts, 'get_shared_secret')
@patch.object(neutron_contexts, 'get_host_ip')
2015-03-24 12:07:21 +00:00
def test_all(self, _host_ip, _secret, _rids, _runits, _rget):
2015-03-23 18:25:01 +00:00
rdata = {'l2-population': 'True',
'enable-dvr': 'True',
'overlay-network-type': 'gre',
'enable-l3ha': 'True',
'network-device-mtu': 9000}
2013-12-18 09:50:58 +00:00
self.test_config.set('plugin', 'ovs')
self.test_config.set('debug', False)
self.test_config.set('verbose', True)
2014-03-14 14:41:45 +00:00
self.test_config.set('instance-mtu', 1420)
self.test_config.set('dnsmasq-flags', 'dhcp-userclass=set:ipxe,iPXE,'
'dhcp-match=set:ipxe,175')
2015-03-16 18:44:02 +00:00
self.test_config.set('vlan-ranges',
'physnet1:1000:2000 physnet2:2001:3000')
self.test_config.set('flat-network-providers', 'physnet3 physnet4')
2015-03-16 18:44:02 +00:00
# Provided by neutron-api relation
2015-03-24 12:07:21 +00:00
_rids.return_value = ['neutron-plugin-api:0']
_runits.return_value = ['neutron-api/0']
_rget.side_effect = lambda *args, **kwargs: rdata
2013-09-04 11:38:36 +01:00
self.get_os_codename_install_source.return_value = 'folsom'
2013-07-22 16:39:07 +01:00
_host_ip.return_value = '10.5.0.1'
_secret.return_value = 'testsecret'
2015-05-07 10:33:38 +01:00
ctxt = neutron_contexts.NeutronGatewayContext()()
2015-03-16 18:44:02 +00:00
self.assertEquals(ctxt, {
'shared_secret': 'testsecret',
2015-02-26 09:09:27 +00:00
'enable_dvr': True,
'enable_l3ha': True,
'local_ip': '10.5.0.1',
'instance_mtu': 1420,
'core_plugin': "quantum.plugins.openvswitch.ovs_quantum_plugin."
"OVSQuantumPluginV2",
2013-12-18 09:50:58 +00:00
'plugin': 'ovs',
'debug': False,
2014-09-04 15:24:27 +00:00
'verbose': True,
2015-02-26 09:09:27 +00:00
'l2_population': True,
2014-10-02 14:02:31 +00:00
'overlay_network_type': 'gre',
2015-02-12 11:18:46 +00:00
'bridge_mappings': 'physnet1:br-data',
'network_providers': 'physnet3,physnet4',
2015-04-10 16:45:07 +01:00
'vlan_ranges': 'physnet1:1000:2000,physnet2:2001:3000',
2015-03-16 18:44:02 +00:00
'network_device_mtu': 9000,
'veth_mtu': 9000,
'dnsmasq_flags': {
'dhcp-userclass': 'set:ipxe,iPXE',
'dhcp-match': 'set:ipxe,175'
}
})
2013-07-22 16:39:07 +01:00
class TestSharedSecret(CharmTestCase):
2014-02-24 17:47:55 +00:00
2013-07-22 16:39:07 +01:00
def setUp(self):
super(TestSharedSecret, self).setUp(neutron_contexts,
2013-07-22 16:39:07 +01:00
TO_PATCH)
2013-09-04 11:38:36 +01:00
self.config.side_effect = self.test_config.get
2013-07-22 16:39:07 +01:00
@patch('os.path')
@patch('uuid.uuid4')
def test_secret_created_stored(self, _uuid4, _path):
_path.exists.return_value = False
_uuid4.return_value = 'secret_thing'
with patch_open() as (_open, _file):
self.assertEquals(neutron_contexts.get_shared_secret(),
2013-07-22 16:39:07 +01:00
'secret_thing')
2013-09-04 12:00:08 +01:00
_open.assert_called_with(
neutron_contexts.SHARED_SECRET.format('quantum'), 'w')
2013-07-22 16:39:07 +01:00
_file.write.assert_called_with('secret_thing')
@patch('os.path')
def test_secret_retrieved(self, _path):
_path.exists.return_value = True
with patch_open() as (_open, _file):
_file.read.return_value = 'secret_thing\n'
self.assertEquals(neutron_contexts.get_shared_secret(),
2013-07-22 16:39:07 +01:00
'secret_thing')
2013-09-04 12:00:08 +01:00
_open.assert_called_with(
neutron_contexts.SHARED_SECRET.format('quantum'), 'r')
2013-07-22 16:39:07 +01:00
class TestHostIP(CharmTestCase):
2014-02-24 17:47:55 +00:00
2013-07-22 16:39:07 +01:00
def setUp(self):
super(TestHostIP, self).setUp(neutron_contexts,
2013-07-22 16:39:07 +01:00
TO_PATCH)
2013-09-04 11:38:36 +01:00
self.config.side_effect = self.test_config.get
# Save and inject
self.mods = {'dns': None, 'dns.resolver': None}
for mod in self.mods:
if mod not in sys.modules:
sys.modules[mod] = Mock()
else:
del self.mods[mod]
def tearDown(self):
super(TestHostIP, self).tearDown()
# Cleanup
for mod in self.mods.keys():
del sys.modules[mod]
2013-07-22 16:39:07 +01:00
def test_get_host_ip_already_ip(self):
self.assertEquals(neutron_contexts.get_host_ip('10.5.0.1'),
2013-07-22 16:39:07 +01:00
'10.5.0.1')
def test_get_host_ip_noarg(self):
self.unit_get.return_value = "10.5.0.1"
self.assertEquals(neutron_contexts.get_host_ip(),
2013-07-22 16:39:07 +01:00
'10.5.0.1')
@patch('dns.resolver.query')
def test_get_host_ip_hostname_unresolvable(self, _query):
class NXDOMAIN(Exception):
pass
_query.side_effect = NXDOMAIN()
self.assertRaises(NXDOMAIN, neutron_contexts.get_host_ip,
2013-07-22 16:39:07 +01:00
'missing.example.com')
@patch('dns.resolver.query')
def test_get_host_ip_hostname_resolvable(self, _query):
data = MagicMock()
data.address = '10.5.0.1'
_query.return_value = [data]
self.assertEquals(neutron_contexts.get_host_ip('myhost.example.com'),
2013-07-22 16:39:07 +01:00
'10.5.0.1')
_query.assert_called_with('myhost.example.com', 'A')
2013-09-04 11:38:36 +01:00
class TestMisc(CharmTestCase):
2014-02-24 17:47:55 +00:00
2013-09-04 11:38:36 +01:00
def setUp(self):
super(TestMisc,
self).setUp(neutron_contexts,
2013-09-04 11:38:36 +01:00
TO_PATCH)
def test_lt_havana(self):
self.get_os_codename_install_source.return_value = 'folsom'
self.assertEquals(neutron_contexts.networking_name(), 'quantum')
2013-09-04 11:38:36 +01:00
def test_ge_havana(self):
self.get_os_codename_install_source.return_value = 'havana'
self.assertEquals(neutron_contexts.networking_name(), 'neutron')
def test_remap_plugin(self):
self.get_os_codename_install_source.return_value = 'havana'
self.assertEquals(neutron_contexts.remap_plugin('nvp'), 'nvp')
self.assertEquals(neutron_contexts.remap_plugin('nsx'), 'nvp')
def test_remap_plugin_icehouse(self):
self.get_os_codename_install_source.return_value = 'icehouse'
self.assertEquals(neutron_contexts.remap_plugin('nvp'), 'nsx')
self.assertEquals(neutron_contexts.remap_plugin('nsx'), 'nsx')
def test_remap_plugin_noop(self):
self.get_os_codename_install_source.return_value = 'icehouse'
self.assertEquals(neutron_contexts.remap_plugin('ovs'), 'ovs')
def test_core_plugin(self):
self.get_os_codename_install_source.return_value = 'havana'
self.config.return_value = 'ovs'
self.assertEquals(neutron_contexts.core_plugin(),
neutron_contexts.NEUTRON_OVS_PLUGIN)
def test_core_plugin_ml2(self):
self.get_os_codename_install_source.return_value = 'icehouse'
self.config.return_value = 'ovs'
self.assertEquals(neutron_contexts.core_plugin(),
neutron_contexts.NEUTRON_ML2_PLUGIN)