diff --git a/hooks/neutron_ovs_context.py b/hooks/neutron_ovs_context.py index 02ac0766..83790f9a 100644 --- a/hooks/neutron_ovs_context.py +++ b/hooks/neutron_ovs_context.py @@ -251,6 +251,20 @@ class SharedSecretContext(OSContextGenerator): return ctxt +class RemoteRestartContext(OSContextGenerator): + + def __call__(self): + for rid in relation_ids('neutron-plugin'): + for unit in related_units(rid): + restart_uuid = relation_get( + attribute='restart-trigger', + rid=rid, + unit=unit) + if restart_uuid: + return {'restart_trigger': restart_uuid} + return {} + + class APIIdentityServiceContext(context.IdentityServiceContext): def __init__(self): diff --git a/hooks/neutron_ovs_utils.py b/hooks/neutron_ovs_utils.py index d19355c3..c0381ff6 100644 --- a/hooks/neutron_ovs_utils.py +++ b/hooks/neutron_ovs_utils.py @@ -114,6 +114,7 @@ BASE_RESOURCE_MAP = OrderedDict([ (NEUTRON_CONF, { 'services': ['neutron-plugin-openvswitch-agent'], 'contexts': [neutron_ovs_context.OVSPluginContext(), + neutron_ovs_context.RemoteRestartContext(), context.AMQPContext(ssl_dir=NEUTRON_CONF_DIR), context.ZeroMQContext(), context.NotificationDriverContext()], diff --git a/templates/kilo/neutron.conf b/templates/kilo/neutron.conf index 7d5748de..0f2b398c 100644 --- a/templates/kilo/neutron.conf +++ b/templates/kilo/neutron.conf @@ -3,6 +3,7 @@ # [ WARNING ] # Configuration file maintained by Juju. Local changes may be overwritten. # Config managed by neutron-openvswitch charm +# Service restart triggered by principle using key: {{ restart_trigger }} ############################################################################### [DEFAULT] verbose = {{ verbose }} diff --git a/unit_tests/test_neutron_ovs_context.py b/unit_tests/test_neutron_ovs_context.py index a5ac6115..bbee0eec 100644 --- a/unit_tests/test_neutron_ovs_context.py +++ b/unit_tests/test_neutron_ovs_context.py @@ -13,6 +13,9 @@ TO_PATCH = [ 'network_get_primary_address', 'glob', 'PCINetDevices', + 'relation_ids', + 'relation_get', + 'related_units', ] @@ -464,3 +467,26 @@ class TestDPDKDeviceContext(CharmTestCase): 'driver': 'uio_pci_generic' }) self.config.assert_called_with('dpdk-driver') + + +class TestRemoteRestartContext(CharmTestCase): + + def setUp(self): + super(TestRemoteRestartContext, self).setUp(context, + TO_PATCH) + self.config.side_effect = self.test_config.get + + def test_restart_trigger_present(self): + self.relation_ids.return_value = ['rid1'] + self.related_units.return_value = ['nova-compute/0'] + self.relation_get.return_value = '8f73-f3adb96a90d8' + self.assertEquals( + context.RemoteRestartContext()(), + {'restart_trigger': '8f73-f3adb96a90d8'} + ) + + def test_restart_trigger_absent(self): + self.relation_ids.return_value = ['rid1'] + self.related_units.return_value = ['nova-compute/0'] + self.relation_get.return_value = None + self.assertEquals(context.RemoteRestartContext()(), {})