From d658c0974c8600b260e18d0f05672c4fac751e53 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Fri, 11 Jan 2019 12:42:34 +0000 Subject: [PATCH] Charm class and handlers for Cinder plugin Add a charm class to base Cinder plugins from and associated default handlers. Depends-On: Icad5f72939b1e33d15adf2638f8e344235a9318b Change-Id: Ieb5f274c54c693c7c1f5ebbc57bcfe218827ffeb --- charms_openstack/charm/__init__.py | 2 + charms_openstack/charm/classes.py | 51 +++++++++++++++++++ charms_openstack/charm/defaults.py | 11 ++++ .../charms_openstack/charm/test_classes.py | 30 +++++++++++ 4 files changed, 94 insertions(+) diff --git a/charms_openstack/charm/__init__.py b/charms_openstack/charm/__init__.py index 8b802d5..23c633d 100644 --- a/charms_openstack/charm/__init__.py +++ b/charms_openstack/charm/__init__.py @@ -24,12 +24,14 @@ from charms_openstack.charm.core import ( register_os_release_selector, ) from charms_openstack.charm.classes import ( + CinderStoragePluginCharm, OpenStackCharm, OpenStackAPICharm, HAOpenStackCharm, ) __all__ = ( + "CinderStoragePluginCharm", "OpenStackCharm", "OpenStackAPICharm", "HAOpenStackCharm", diff --git a/charms_openstack/charm/classes.py b/charms_openstack/charm/classes.py index 8d9e74f..79e5c55 100644 --- a/charms_openstack/charm/classes.py +++ b/charms_openstack/charm/classes.py @@ -1,5 +1,6 @@ import base64 import contextlib +import json import os import random import re @@ -843,3 +844,53 @@ class HAOpenStackCharm(OpenStackAPICharm): cluster.set_address( os_ip.ADDRESS_MAP[addr_type]['binding'], laddr) + + +class CinderStoragePluginCharm(OpenStackCharm): + + abstract_class = True + + # The name of the charm (for printing, etc.) + name = '' + + # List of packages to install + # XXX execd_preinstall + packages = [] + + version_package = '' + # The list of required services that are checked for assess_status + # e.g. required_relations = ['identity-service', 'shared-db'] + required_relations = [] + + # A dictionary of: + # { + # 'config.file': ['list', 'of', 'services', 'to', 'restart'], + # 'config2.file': ['more', 'services'], + # } + # The files that for the keys of the dict are monitored and if the file + # changes the corresponding services are restarted + # XXX This is more involved in the tradioional charm so we're + # probably missing something herw! + restart_map = {} + + # first_release = this is the first release in which this charm works + release = '' + + @property + def stateless(self): + raise NotImplementedError() + + @property + def service_name(self): + return hookenv.service_name() + + def cinder_configuration(self): + raise NotImplementedError() + + def send_storage_backend_data(self): + cbend = relations.endpoint_from_flag('storage-backend.connected') + cbend.send_plugin_configuration( + backend_name=self.service_name, + subordinate_configuration=json.dumps( + self.cinder_configuration()), + stateless=self.stateless) diff --git a/charms_openstack/charm/defaults.py b/charms_openstack/charm/defaults.py index da8e640..1954ffb 100644 --- a/charms_openstack/charm/defaults.py +++ b/charms_openstack/charm/defaults.py @@ -21,6 +21,7 @@ ALLOWED_DEFAULT_HANDLERS = [ 'update-status', 'upgrade-charm', 'certificates.available', + 'storage-backend.connected', ] # Where to store the default handler functions for each default state @@ -146,6 +147,16 @@ def make_default_certificates_available_handler(): reactive.set_state('charms.openstack.do-default-certificates.available') +@_map_default_handler('storage-backend.connected') +def make_default_storage_backend_connected_handler(): + """Set the default storage-backend.connected state so that the default + handler in layer-openstack can run. + Convoluted, because charms.reactive will only run handlers in the reactive + or hooks directory. + """ + reactive.set_state('charms.openstack.do-default-storage-backend.connected') + + @_map_default_handler('shared-db.connected') def make_default_setup_database_handler(): """Set the default shared-db.connected state so that the default handler in diff --git a/unit_tests/charms_openstack/charm/test_classes.py b/unit_tests/charms_openstack/charm/test_classes.py index 7c028ac..9de8e22 100644 --- a/unit_tests/charms_openstack/charm/test_classes.py +++ b/unit_tests/charms_openstack/charm/test_classes.py @@ -1020,3 +1020,33 @@ class TestHAOpenStackCharm(BaseOpenStackCharmTest): with self.target.update_central_cacerts(['file1']): pass self.assertFalse(self.run_update_certs.called) + + +class TestCinderStoragePluginCharm(BaseOpenStackCharmTest): + + def setUp(self): + super(TestCinderStoragePluginCharm, self).setUp( + chm.CinderStoragePluginCharm, + TEST_CONFIG) + + def test_stateless(self): + with self.assertRaises(NotImplementedError): + self.target.stateless + + def test_service_name(self): + self.patch_object(chm.hookenv, 'service_name', return_value='svc1') + self.assertEqual(self.target.service_name, 'svc1') + + def test_cinder_configuration(self): + with self.assertRaises(NotImplementedError): + self.target.cinder_configuration() + + def test_send_storage_backend_data(self): + self.patch_object(chm.hookenv, 'service_name', return_value='svc1') + ep_mock = mock.MagicMock() + self.patch_object( + chm.relations, + 'endpoint_from_flag', + return_value=ep_mock) + with self.assertRaises(NotImplementedError): + self.target.send_storage_backend_data()