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
This commit is contained in:
Liam Young 2019-01-11 12:42:34 +00:00
parent 34bc40a2f8
commit d658c0974c
4 changed files with 94 additions and 0 deletions

View File

@ -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",

View File

@ -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)

View File

@ -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

View File

@ -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()