synced /next
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from mock import MagicMock, patch, call
|
||||
import yaml
|
||||
from test_utils import CharmTestCase
|
||||
|
||||
|
||||
@@ -32,22 +33,36 @@ TO_PATCH = [
|
||||
'determine_packages',
|
||||
'determine_ports',
|
||||
'do_openstack_upgrade',
|
||||
'dvr_router_present',
|
||||
'local_unit',
|
||||
'l3ha_router_present',
|
||||
'execd_preinstall',
|
||||
'filter_installed_packages',
|
||||
'get_dvr',
|
||||
'get_l3ha',
|
||||
'get_l2population',
|
||||
'get_overlay_network_type',
|
||||
'git_install',
|
||||
'is_elected_leader',
|
||||
'is_relation_made',
|
||||
'log',
|
||||
'migrate_neutron_database',
|
||||
'neutron_ready',
|
||||
'open_port',
|
||||
'openstack_upgrade_available',
|
||||
'os_release',
|
||||
'os_requires_version',
|
||||
'relation_get',
|
||||
'relation_ids',
|
||||
'relation_set',
|
||||
'service_restart',
|
||||
'unit_get',
|
||||
'get_iface_for_address',
|
||||
'get_netmask_for_address',
|
||||
'get_address_in_network',
|
||||
'update_nrpe_config',
|
||||
'service_reload',
|
||||
'IdentityServiceContext',
|
||||
'force_etcd_restart',
|
||||
]
|
||||
NEUTRON_CONF_DIR = "/etc/neutron"
|
||||
@@ -57,6 +72,15 @@ NEUTRON_CONF = '%s/neutron.conf' % NEUTRON_CONF_DIR
|
||||
from random import randrange
|
||||
|
||||
|
||||
class DummyContext():
|
||||
|
||||
def __init__(self, return_value):
|
||||
self.return_value = return_value
|
||||
|
||||
def __call__(self):
|
||||
return self.return_value
|
||||
|
||||
|
||||
class NeutronAPIHooksTests(CharmTestCase):
|
||||
|
||||
def setUp(self):
|
||||
@@ -74,7 +98,9 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
hooks.hooks.execute([
|
||||
'hooks/{}'.format(hookname)])
|
||||
|
||||
def test_install_hook(self):
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
def test_install_hook(self, git_requested):
|
||||
git_requested.return_value = False
|
||||
_pkgs = ['foo', 'bar']
|
||||
_ports = [80, 81, 82]
|
||||
_port_calls = [call(port) for port in _ports]
|
||||
@@ -91,9 +117,47 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
self.open_port.assert_has_calls(_port_calls)
|
||||
self.assertTrue(self.execd_preinstall.called)
|
||||
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
def test_install_hook_git(self, git_requested):
|
||||
git_requested.return_value = True
|
||||
_pkgs = ['foo', 'bar']
|
||||
_ports = [80, 81, 82]
|
||||
_port_calls = [call(port) for port in _ports]
|
||||
self.determine_packages.return_value = _pkgs
|
||||
self.determine_ports.return_value = _ports
|
||||
repo = 'cloud:trusty-juno'
|
||||
openstack_origin_git = {
|
||||
'repositories': [
|
||||
{'name': 'requirements',
|
||||
'repository': 'git://git.openstack.org/openstack/requirements', # noqa
|
||||
'branch': 'stable/juno'},
|
||||
{'name': 'neutron',
|
||||
'repository': 'git://git.openstack.org/openstack/neutron',
|
||||
'branch': 'stable/juno'}
|
||||
],
|
||||
'directory': '/mnt/openstack-git',
|
||||
}
|
||||
projects_yaml = yaml.dump(openstack_origin_git)
|
||||
self.test_config.set('openstack-origin', repo)
|
||||
self.test_config.set('openstack-origin-git', projects_yaml)
|
||||
self._call_hook('install')
|
||||
self.assertTrue(self.execd_preinstall.called)
|
||||
self.configure_installation_source.assert_called_with(repo)
|
||||
self.apt_update.assert_called_with()
|
||||
self.apt_install.assert_has_calls([
|
||||
call(_pkgs, fatal=True),
|
||||
])
|
||||
self.git_install.assert_called_with(projects_yaml)
|
||||
self.open_port.assert_has_calls(_port_calls)
|
||||
|
||||
@patch.object(hooks, 'configure_https')
|
||||
def test_config_changed(self, conf_https):
|
||||
@patch.object(hooks, 'git_install_requested')
|
||||
def test_config_changed(self, git_requested, conf_https):
|
||||
git_requested.return_value = False
|
||||
self.neutron_ready.return_value = True
|
||||
self.openstack_upgrade_available.return_value = True
|
||||
self.dvr_router_present.return_value = False
|
||||
self.l3ha_router_present.return_value = False
|
||||
self.relation_ids.side_effect = self._fake_relids
|
||||
_n_api_rel_joined = self.patch('neutron_api_relation_joined')
|
||||
_n_plugin_api_rel_joined =\
|
||||
@@ -101,16 +165,86 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
_amqp_rel_joined = self.patch('amqp_joined')
|
||||
_id_rel_joined = self.patch('identity_joined')
|
||||
_id_cluster_joined = self.patch('cluster_joined')
|
||||
_zmq_joined = self.patch('zeromq_configuration_relation_joined')
|
||||
self._call_hook('config-changed')
|
||||
self.assertTrue(_n_api_rel_joined.called)
|
||||
self.assertTrue(_n_plugin_api_rel_joined.called)
|
||||
self.assertTrue(_amqp_rel_joined.called)
|
||||
self.assertTrue(_id_rel_joined.called)
|
||||
self.assertTrue(_id_cluster_joined.called)
|
||||
self.assertTrue(_zmq_joined.called)
|
||||
self.assertTrue(self.CONFIGS.write_all.called)
|
||||
self.assertTrue(self.do_openstack_upgrade.called)
|
||||
self.assertTrue(self.apt_install.called)
|
||||
|
||||
def test_config_changed_nodvr_disprouters(self):
|
||||
self.neutron_ready.return_value = True
|
||||
self.dvr_router_present.return_value = True
|
||||
self.get_dvr.return_value = False
|
||||
with self.assertRaises(Exception) as context:
|
||||
self._call_hook('config-changed')
|
||||
self.assertEqual(context.exception.message,
|
||||
'Cannot disable dvr while dvr enabled routers exist.'
|
||||
' Please remove any distributed routers')
|
||||
|
||||
def test_config_changed_nol3ha_harouters(self):
|
||||
self.neutron_ready.return_value = True
|
||||
self.dvr_router_present.return_value = False
|
||||
self.l3ha_router_present.return_value = True
|
||||
self.get_l3ha.return_value = False
|
||||
with self.assertRaises(Exception) as context:
|
||||
self._call_hook('config-changed')
|
||||
self.assertEqual(context.exception.message,
|
||||
'Cannot disable Router HA while ha enabled routers'
|
||||
' exist. Please remove any ha routers')
|
||||
|
||||
@patch.object(hooks, 'configure_https')
|
||||
@patch.object(hooks, 'git_install_requested')
|
||||
@patch.object(hooks, 'config_value_changed')
|
||||
def test_config_changed_git(self, config_val_changed, git_requested,
|
||||
configure_https):
|
||||
git_requested.return_value = True
|
||||
self.neutron_ready.return_value = True
|
||||
self.dvr_router_present.return_value = False
|
||||
self.l3ha_router_present.return_value = False
|
||||
self.relation_ids.side_effect = self._fake_relids
|
||||
_n_api_rel_joined = self.patch('neutron_api_relation_joined')
|
||||
_n_plugin_api_rel_joined =\
|
||||
self.patch('neutron_plugin_api_relation_joined')
|
||||
_amqp_rel_joined = self.patch('amqp_joined')
|
||||
_id_rel_joined = self.patch('identity_joined')
|
||||
_id_cluster_joined = self.patch('cluster_joined')
|
||||
_zmq_joined = self.patch('zeromq_configuration_relation_joined')
|
||||
repo = 'cloud:trusty-juno'
|
||||
openstack_origin_git = {
|
||||
'repositories': [
|
||||
{'name': 'requirements',
|
||||
'repository':
|
||||
'git://git.openstack.org/openstack/requirements',
|
||||
'branch': 'stable/juno'},
|
||||
{'name': 'neutron',
|
||||
'repository': 'git://git.openstack.org/openstack/neutron',
|
||||
'branch': 'stable/juno'}
|
||||
],
|
||||
'directory': '/mnt/openstack-git',
|
||||
}
|
||||
projects_yaml = yaml.dump(openstack_origin_git)
|
||||
self.test_config.set('openstack-origin', repo)
|
||||
self.test_config.set('openstack-origin-git', projects_yaml)
|
||||
self._call_hook('config-changed')
|
||||
self.git_install.assert_called_with(projects_yaml)
|
||||
self.assertFalse(self.do_openstack_upgrade.called)
|
||||
self.assertTrue(self.apt_install.called)
|
||||
self.assertTrue(configure_https.called)
|
||||
self.assertTrue(self.update_nrpe_config.called)
|
||||
self.assertTrue(self.CONFIGS.write_all.called)
|
||||
self.assertTrue(_n_api_rel_joined.called)
|
||||
self.assertTrue(_n_plugin_api_rel_joined.called)
|
||||
self.assertTrue(_amqp_rel_joined.called)
|
||||
self.assertTrue(_id_rel_joined.called)
|
||||
self.assertTrue(_zmq_joined.called)
|
||||
self.assertTrue(_id_cluster_joined.called)
|
||||
|
||||
def test_amqp_joined(self):
|
||||
self._call_hook('amqp-relation-joined')
|
||||
self.relation_set.assert_called_with(
|
||||
@@ -164,19 +298,23 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
'Attempting to associate a postgresql database when'
|
||||
' there is already associated a mysql one')
|
||||
|
||||
def test_shared_db_changed(self):
|
||||
@patch.object(hooks, 'conditional_neutron_migration')
|
||||
def test_shared_db_changed(self, cond_neutron_mig):
|
||||
self.CONFIGS.complete_contexts.return_value = ['shared-db']
|
||||
self._call_hook('shared-db-relation-changed')
|
||||
self.assertTrue(self.CONFIGS.write_all.called)
|
||||
cond_neutron_mig.assert_called_with()
|
||||
|
||||
def test_shared_db_changed_partial_ctxt(self):
|
||||
self.CONFIGS.complete_contexts.return_value = []
|
||||
self._call_hook('shared-db-relation-changed')
|
||||
self.assertFalse(self.CONFIGS.write_all.called)
|
||||
|
||||
def test_pgsql_db_changed(self):
|
||||
@patch.object(hooks, 'conditional_neutron_migration')
|
||||
def test_pgsql_db_changed(self, cond_neutron_mig):
|
||||
self._call_hook('pgsql-db-relation-changed')
|
||||
self.assertTrue(self.CONFIGS.write.called)
|
||||
cond_neutron_mig.assert_called_with()
|
||||
|
||||
def test_amqp_broken(self):
|
||||
self._call_hook('amqp-relation-broken')
|
||||
@@ -274,12 +412,126 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
|
||||
def test_neutron_plugin_api_relation_joined_nol2(self):
|
||||
self.unit_get.return_value = '172.18.18.18'
|
||||
self.IdentityServiceContext.return_value = \
|
||||
DummyContext(return_value={})
|
||||
_relation_data = {
|
||||
'neutron-security-groups': False,
|
||||
'enable-dvr': False,
|
||||
'enable-l3ha': False,
|
||||
'addr': '172.18.18.18',
|
||||
'l2-population': False,
|
||||
'overlay-network-type': 'vxlan',
|
||||
'service_protocol': None,
|
||||
'auth_protocol': None,
|
||||
'service_tenant': None,
|
||||
'service_port': None,
|
||||
'region': 'RegionOne',
|
||||
'service_password': None,
|
||||
'auth_port': None,
|
||||
'auth_host': None,
|
||||
'service_username': None,
|
||||
'service_host': None
|
||||
}
|
||||
self.get_dvr.return_value = False
|
||||
self.get_l3ha.return_value = False
|
||||
self.get_l2population.return_value = False
|
||||
self.get_overlay_network_type.return_value = 'vxlan'
|
||||
self._call_hook('neutron-plugin-api-relation-joined')
|
||||
self.relation_set.assert_called_with(
|
||||
relation_id=None,
|
||||
**_relation_data
|
||||
)
|
||||
|
||||
def test_neutron_plugin_api_relation_joined_dvr(self):
|
||||
self.unit_get.return_value = '172.18.18.18'
|
||||
self.IdentityServiceContext.return_value = \
|
||||
DummyContext(return_value={})
|
||||
_relation_data = {
|
||||
'neutron-security-groups': False,
|
||||
'enable-dvr': True,
|
||||
'enable-l3ha': False,
|
||||
'addr': '172.18.18.18',
|
||||
'l2-population': True,
|
||||
'overlay-network-type': 'vxlan',
|
||||
'service_protocol': None,
|
||||
'auth_protocol': None,
|
||||
'service_tenant': None,
|
||||
'service_port': None,
|
||||
'region': 'RegionOne',
|
||||
'service_password': None,
|
||||
'auth_port': None,
|
||||
'auth_host': None,
|
||||
'service_username': None,
|
||||
'service_host': None
|
||||
}
|
||||
self.get_dvr.return_value = True
|
||||
self.get_l3ha.return_value = False
|
||||
self.get_l2population.return_value = True
|
||||
self.get_overlay_network_type.return_value = 'vxlan'
|
||||
self._call_hook('neutron-plugin-api-relation-joined')
|
||||
self.relation_set.assert_called_with(
|
||||
relation_id=None,
|
||||
**_relation_data
|
||||
)
|
||||
|
||||
def test_neutron_plugin_api_relation_joined_l3ha(self):
|
||||
self.unit_get.return_value = '172.18.18.18'
|
||||
self.IdentityServiceContext.return_value = \
|
||||
DummyContext(return_value={})
|
||||
_relation_data = {
|
||||
'neutron-security-groups': False,
|
||||
'enable-dvr': False,
|
||||
'enable-l3ha': True,
|
||||
'addr': '172.18.18.18',
|
||||
'l2-population': False,
|
||||
'overlay-network-type': 'vxlan',
|
||||
'service_protocol': None,
|
||||
'auth_protocol': None,
|
||||
'service_tenant': None,
|
||||
'service_port': None,
|
||||
'region': 'RegionOne',
|
||||
'service_password': None,
|
||||
'auth_port': None,
|
||||
'auth_host': None,
|
||||
'service_username': None,
|
||||
'service_host': None
|
||||
}
|
||||
self.get_dvr.return_value = False
|
||||
self.get_l3ha.return_value = True
|
||||
self.get_l2population.return_value = False
|
||||
self.get_overlay_network_type.return_value = 'vxlan'
|
||||
self._call_hook('neutron-plugin-api-relation-joined')
|
||||
self.relation_set.assert_called_with(
|
||||
relation_id=None,
|
||||
**_relation_data
|
||||
)
|
||||
|
||||
def test_neutron_plugin_api_relation_joined_w_mtu(self):
|
||||
self.unit_get.return_value = '172.18.18.18'
|
||||
self.IdentityServiceContext.return_value = \
|
||||
DummyContext(return_value={})
|
||||
self.test_config.set('network-device-mtu', 1500)
|
||||
_relation_data = {
|
||||
'neutron-security-groups': False,
|
||||
'addr': '172.18.18.18',
|
||||
'l2-population': False,
|
||||
'overlay-network-type': 'vxlan',
|
||||
'network-device-mtu': 1500,
|
||||
'enable-l3ha': True,
|
||||
'enable-dvr': True,
|
||||
'service_protocol': None,
|
||||
'auth_protocol': None,
|
||||
'service_tenant': None,
|
||||
'service_port': None,
|
||||
'region': 'RegionOne',
|
||||
'service_password': None,
|
||||
'auth_port': None,
|
||||
'auth_host': None,
|
||||
'service_username': None,
|
||||
'service_host': None
|
||||
}
|
||||
self.get_dvr.return_value = True
|
||||
self.get_l3ha.return_value = True
|
||||
self.get_l2population.return_value = False
|
||||
self.get_overlay_network_type.return_value = 'vxlan'
|
||||
self._call_hook('neutron-plugin-api-relation-joined')
|
||||
@@ -420,8 +672,9 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
self.relation_ids.side_effect = self._fake_relids
|
||||
_id_rel_joined = self.patch('identity_joined')
|
||||
hooks.configure_https()
|
||||
self.check_call.assert_called_with(['a2ensite',
|
||||
'openstack_https_frontend'])
|
||||
calls = [call('a2dissite', 'openstack_https_frontend'),
|
||||
call('service', 'apache2', 'reload')]
|
||||
self.check_call.assert_called_has_calls(calls)
|
||||
self.assertTrue(_id_rel_joined.called)
|
||||
|
||||
def test_configure_https_nohttps(self):
|
||||
@@ -429,10 +682,54 @@ class NeutronAPIHooksTests(CharmTestCase):
|
||||
self.relation_ids.side_effect = self._fake_relids
|
||||
_id_rel_joined = self.patch('identity_joined')
|
||||
hooks.configure_https()
|
||||
self.check_call.assert_called_with(['a2dissite',
|
||||
'openstack_https_frontend'])
|
||||
calls = [call('a2dissite', 'openstack_https_frontend'),
|
||||
call('service', 'apache2', 'reload')]
|
||||
self.check_call.assert_called_has_calls(calls)
|
||||
self.assertTrue(_id_rel_joined.called)
|
||||
|
||||
def test_conditional_neutron_migration_icehouse(self):
|
||||
self.os_release.return_value = 'icehouse'
|
||||
hooks.conditional_neutron_migration()
|
||||
self.log.assert_called_with(
|
||||
'Not running neutron database migration as migrations are handled '
|
||||
'by the neutron-server process or nova-cloud-controller charm.'
|
||||
)
|
||||
|
||||
def test_conditional_neutron_migration_ncc_rel_leader_juno(self):
|
||||
self.test_relation.set({
|
||||
'allowed_units': 'neutron-api/0 neutron-api/1 neutron-api/4',
|
||||
})
|
||||
self.local_unit.return_value = 'neutron-api/1'
|
||||
self.is_elected_leader.return_value = True
|
||||
self.os_release.return_value = 'juno'
|
||||
hooks.conditional_neutron_migration()
|
||||
self.log.assert_called_with(
|
||||
'Not running neutron database migration as migrations are handled'
|
||||
' by the neutron-server process or nova-cloud-controller charm.'
|
||||
)
|
||||
|
||||
def test_conditional_neutron_migration_ncc_rel_leader_kilo(self):
|
||||
self.test_relation.set({
|
||||
'allowed_units': 'neutron-api/0 neutron-api/1 neutron-api/4',
|
||||
})
|
||||
self.local_unit.return_value = 'neutron-api/1'
|
||||
self.is_elected_leader.return_value = True
|
||||
self.os_release.return_value = 'kilo'
|
||||
hooks.conditional_neutron_migration()
|
||||
self.migrate_neutron_database.assert_called_with()
|
||||
self.service_restart.assert_called_with('neutron-server')
|
||||
|
||||
def test_conditional_neutron_migration_ncc_rel_notleader(self):
|
||||
self.is_elected_leader.return_value = False
|
||||
self.os_release.return_value = 'juno'
|
||||
hooks.conditional_neutron_migration()
|
||||
self.assertFalse(self.migrate_neutron_database.called)
|
||||
self.assertFalse(self.service_restart.called)
|
||||
self.log.assert_called_with(
|
||||
'Not running neutron database migration as migrations are handled '
|
||||
'by the neutron-server process or nova-cloud-controller charm.'
|
||||
)
|
||||
|
||||
def test_etcd_peer_joined(self):
|
||||
self._call_hook('etcd-peer-relation-joined')
|
||||
self.assertTrue(self.CONFIGS.register.called)
|
||||
|
||||
Reference in New Issue
Block a user