From 66edeaaea36d5991ed974c6b39e8e455784ba378 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Fri, 9 Apr 2021 13:13:02 +0000 Subject: [PATCH] Implementation of deferred restarts Add deferred restart actions and config. Change-Id: I06bea08c19c4aef40c2aae1ad5e8e21d2ef66579 --- src/actions.yaml | 27 +++++++++++++++++++ src/actions/restart-services | 26 ++++++++++++++++++ src/actions/run-deferred-hooks | 26 ++++++++++++++++++ src/actions/show-deferred-events | 26 ++++++++++++++++++ src/config.yaml | 6 +++++ .../charm/openstack/ovn_dedicated_chassis.py | 14 +++++----- .../ovn_dedicated_chassis_handlers.py | 7 +++++ src/tests/tests.yaml | 1 + ...reactive_ovn_dedicated_chassis_handlers.py | 1 + 9 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 src/actions.yaml create mode 100755 src/actions/restart-services create mode 100755 src/actions/run-deferred-hooks create mode 100755 src/actions/show-deferred-events diff --git a/src/actions.yaml b/src/actions.yaml new file mode 100644 index 0000000..54c58d7 --- /dev/null +++ b/src/actions.yaml @@ -0,0 +1,27 @@ +restart-services: + description: | + Restarts services this charm manages. + params: + deferred-only: + type: boolean + default: false + description: | + Restart all deferred services. + services: + type: string + default: "" + description: | + List of services to restart. + run-hooks: + type: boolean + default: true + description: | + Run any hooks which have been deferred. +run-deferred-hooks: + description: | + Run deferable hooks and restart services. + . + NOTE: Service will be restarted as needed irrespective of enable-auto-restarts +show-deferred-events: + descrpition: | + Show the outstanding restarts diff --git a/src/actions/restart-services b/src/actions/restart-services new file mode 100755 index 0000000..09e534c --- /dev/null +++ b/src/actions/restart-services @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# Copyright 2021 Canonical Ltd +# +# 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. + +import sys + + +sys.path.append('actions') + + +import os_deferred_event_actions + + +if __name__ == "__main__": + sys.exit(os_deferred_event_actions.main(sys.argv)) diff --git a/src/actions/run-deferred-hooks b/src/actions/run-deferred-hooks new file mode 100755 index 0000000..09e534c --- /dev/null +++ b/src/actions/run-deferred-hooks @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# Copyright 2021 Canonical Ltd +# +# 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. + +import sys + + +sys.path.append('actions') + + +import os_deferred_event_actions + + +if __name__ == "__main__": + sys.exit(os_deferred_event_actions.main(sys.argv)) diff --git a/src/actions/show-deferred-events b/src/actions/show-deferred-events new file mode 100755 index 0000000..09e534c --- /dev/null +++ b/src/actions/show-deferred-events @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# Copyright 2021 Canonical Ltd +# +# 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. + +import sys + + +sys.path.append('actions') + + +import os_deferred_event_actions + + +if __name__ == "__main__": + sys.exit(os_deferred_event_actions.main(sys.argv)) diff --git a/src/config.yaml b/src/config.yaml index 3a8ec60..f6eb3ae 100644 --- a/src/config.yaml +++ b/src/config.yaml @@ -13,3 +13,9 @@ options: type: string description: | Comma separated list of nagios servicegroups for the service checks. + enable-auto-restarts: + type: boolean + default: True + description: | + Allow the charm and packages to restart services automatically when + required. diff --git a/src/lib/charm/openstack/ovn_dedicated_chassis.py b/src/lib/charm/openstack/ovn_dedicated_chassis.py index 2edab06..1a05a75 100644 --- a/src/lib/charm/openstack/ovn_dedicated_chassis.py +++ b/src/lib/charm/openstack/ovn_dedicated_chassis.py @@ -31,7 +31,8 @@ class OVNDedicatedChassisConfigurationAdapter( enable_hardware_offload = False -class TrainOVNChassisCharm(charms.ovn_charm.BaseTrainOVNChassisCharm): +class TrainOVNChassisCharm(charms.ovn_charm.DeferredEventMixin, + charms.ovn_charm.BaseTrainOVNChassisCharm): # OpenvSwitch and OVN is distributed as part of the Ubuntu Cloud Archive # Pockets get their name from OpenStack releases source_config_key = 'source' @@ -40,12 +41,13 @@ class TrainOVNChassisCharm(charms.ovn_charm.BaseTrainOVNChassisCharm): configuration_class = OVNDedicatedChassisConfigurationAdapter # NOTE(fnordahl): Add this to ``layer-ovn`` - def install(self): + def install(self, check_deferred_events=True): self.configure_source() - super().install() + super().install(check_deferred_events=check_deferred_events) -class UssuriOVNChassisCharm(charms.ovn_charm.BaseUssuriOVNChassisCharm): +class UssuriOVNChassisCharm(charms.ovn_charm.DeferredEventMixin, + charms.ovn_charm.BaseUssuriOVNChassisCharm): # OpenvSwitch and OVN is distributed as part of the Ubuntu Cloud Archive # Pockets get their name from OpenStack releases source_config_key = 'source' @@ -54,6 +56,6 @@ class UssuriOVNChassisCharm(charms.ovn_charm.BaseUssuriOVNChassisCharm): configuration_class = OVNDedicatedChassisConfigurationAdapter # NOTE(fnordahl): Add this to ``layer-ovn`` - def install(self): + def install(self, check_deferred_events=True): self.configure_source() - super().install() + super().install(check_deferred_events=check_deferred_events) diff --git a/src/reactive/ovn_dedicated_chassis_handlers.py b/src/reactive/ovn_dedicated_chassis_handlers.py index dc6600f..8c525c2 100644 --- a/src/reactive/ovn_dedicated_chassis_handlers.py +++ b/src/reactive/ovn_dedicated_chassis_handlers.py @@ -1,6 +1,7 @@ import charms.reactive as reactive from . import ovn_chassis_charm_handlers +import charms_openstack.charm as charm # NOTE: code shared among the chassis charms can be found in the 'ovn' layer. @@ -8,3 +9,9 @@ from . import ovn_chassis_charm_handlers def enable_ovn_chassis_handlers(): reactive.set_flag( ovn_chassis_charm_handlers.OVN_CHASSIS_ENABLE_HANDLERS_FLAG) + + +@reactive.when_not('is-update-status-hook') +def configure_deferred_restarts(): + with charm.provide_charm_instance() as instance: + instance.configure_deferred_restarts() diff --git a/src/tests/tests.yaml b/src/tests/tests.yaml index 693d467..41e58d1 100644 --- a/src/tests/tests.yaml +++ b/src/tests/tests.yaml @@ -23,6 +23,7 @@ target_deploy_status: configure: - zaza.openstack.charm_tests.vault.setup.auto_initialize_no_validation tests: +- zaza.openstack.charm_tests.ovn.tests.OVNDedicatedChassisDeferredRestartTest - zaza.openstack.charm_tests.ovn.tests.ChassisCharmOperationTest tests_options: force_deploy: diff --git a/unit_tests/test_reactive_ovn_dedicated_chassis_handlers.py b/unit_tests/test_reactive_ovn_dedicated_chassis_handlers.py index b8ec6c1..dc75317 100644 --- a/unit_tests/test_reactive_ovn_dedicated_chassis_handlers.py +++ b/unit_tests/test_reactive_ovn_dedicated_chassis_handlers.py @@ -26,6 +26,7 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks): hook_set = { 'when_not': { 'enable_ovn_chassis_handlers': ('MOCKED_FLAG',), + 'configure_deferred_restarts': ('is-update-status-hook',), }, } # test that the hooks were registered via the