rewrite create-erasure-profile with ops famework

Change-Id: I27b0e926865ecb39ad4f5ad25de8266e9db75695
This commit is contained in:
Chris MacNaughton 2022-09-29 09:56:49 -04:00 committed by Chris MacNaughton
parent 5ae30304dd
commit 0905362f04
5 changed files with 139 additions and 37 deletions

View File

@ -1 +0,0 @@
create_erasure_profile.py

View File

@ -153,6 +153,9 @@ class CephMonCharm(ops_openstack.core.OSBaseCharm):
ops_actions.copy_pool.copy_pool)
self._observe_action(self.on.create_crush_rule_action,
ops_actions.create_crush_rule.create_crush_rule)
self._observe_action(
self.on.create_erasure_profile_action,
ops_actions.create_erasure_profile.create_erasure_profile_action)
fw.observe(self.on.install, self.on_install)
fw.observe(self.on.config_changed, self.on_config)

View File

@ -16,4 +16,5 @@ from . import ( # noqa: F401
change_osd_weight,
copy_pool,
create_crush_rule,
create_erasure_profile,
)

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
# Copyright 2016 Canonical Ltd
# Copyright 2022 Canonical Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -17,16 +17,18 @@
from subprocess import CalledProcessError
from charmhelpers.contrib.storage.linux.ceph import create_erasure_profile
from charmhelpers.core.hookenv import action_get, log, action_fail
import logging
logger = logging.getLogger(__name__)
def make_erasure_profile():
name = action_get("name")
plugin = action_get("plugin")
failure_domain = action_get("failure-domain")
device_class = action_get("device-class")
k = action_get("data-chunks")
m = action_get("coding-chunks")
def create_erasure_profile_action(event):
name = event.params.get("name")
plugin = event.params.get("plugin")
failure_domain = event.params.get("failure-domain")
device_class = event.params.get("device-class")
k = event.params.get("data-chunks")
m = event.params.get("coding-chunks")
# jerasure requires k+m
# isa requires k+m
@ -43,9 +45,9 @@ def make_erasure_profile():
failure_domain=failure_domain,
device_class=device_class)
except CalledProcessError as e:
log(e)
action_fail("Create erasure profile failed with "
"message: {}".format(str(e)))
logger.warning(e)
event.fail("Create erasure profile failed with "
"message: {}".format(str(e)))
elif plugin == "isa":
try:
create_erasure_profile(service='admin',
@ -56,12 +58,12 @@ def make_erasure_profile():
failure_domain=failure_domain,
device_class=device_class)
except CalledProcessError as e:
log(e)
action_fail("Create erasure profile failed with "
"message: {}".format(str(e)))
logger.warning(e)
event.fail("Create erasure profile failed with "
"message: {}".format(str(e)))
elif plugin == "lrc":
locality_chunks = action_get("locality-chunks")
crush_locality = action_get('crush-locality')
locality_chunks = event.params.get("locality-chunks")
crush_locality = event.params.get('crush-locality')
try:
create_erasure_profile(service='admin',
erasure_plugin_name=plugin,
@ -73,11 +75,11 @@ def make_erasure_profile():
failure_domain=failure_domain,
device_class=device_class)
except CalledProcessError as e:
log(e)
action_fail("Create erasure profile failed with "
"message: {}".format(str(e)))
logger.warning(e)
event.fail("Create erasure profile failed with "
"message: {}".format(str(e)))
elif plugin == "shec":
c = action_get("durability-estimator")
c = event.params.get("durability-estimator")
try:
create_erasure_profile(service='admin',
erasure_plugin_name=plugin,
@ -88,12 +90,12 @@ def make_erasure_profile():
failure_domain=failure_domain,
device_class=device_class)
except CalledProcessError as e:
log(e)
action_fail("Create erasure profile failed with "
"message: {}".format(str(e)))
logger.warning(e)
event.fail("Create erasure profile failed with "
"message: {}".format(str(e)))
elif plugin == "clay":
d = action_get("helper-chunks")
scalar_mds = action_get('scalar-mds')
d = event.params.get("helper-chunks")
scalar_mds = event.params.get('scalar-mds')
try:
create_erasure_profile(service='admin',
erasure_plugin_name=plugin,
@ -105,15 +107,11 @@ def make_erasure_profile():
failure_domain=failure_domain,
device_class=device_class)
except CalledProcessError as e:
log(e)
action_fail("Create erasure profile failed with "
"message: {}".format(str(e)))
logger.warning(e)
event.fail("Create erasure profile failed with "
"message: {}".format(str(e)))
else:
# Unknown erasure plugin
action_fail("Unknown erasure-plugin type of {}. "
"Only jerasure, isa, lrc, shec or clay is "
"allowed".format(plugin))
if __name__ == '__main__':
make_erasure_profile()
event.fail("Unknown erasure-plugin type of {}. "
"Only jerasure, isa, lrc, shec or clay is "
"allowed".format(plugin))

View File

@ -129,3 +129,104 @@ class CreateCrushRuleTestCase(test_utils.CharmTestCase):
mock_check_call.assert_called_once_with(expected)
event.fail.assert_called_once_with(
'rule creation failed due to exception')
class CreateErasureProfileTestCase(test_utils.CharmTestCase):
"""Run tests for action."""
def setUp(self):
self.harness = Harness(CephMonCharm)
self.addCleanup(self.harness.cleanup)
@mock.patch('ops_actions.create_erasure_profile.create_erasure_profile')
def test_create_jerasure_profile(self, mock_create_erasure_profile):
self.harness.begin()
self.harness.charm.on_create_erasure_profile_action(
test_utils.MockActionEvent({
'name': 'erasure',
'plugin': 'jerasure',
'failure-domain': 'disk',
'k': 6,
'm': 3,
}))
mock_create_erasure_profile.assert_called_once_with(
service='admin', erasure_plugin_name='jerasure',
profile_name='erasure', data_chunks=None,
coding_chunks=None, failure_domain='disk', device_class=None
)
@mock.patch('ops_actions.create_erasure_profile.create_erasure_profile')
def test_create_isa_profile(self, mock_create_erasure_profile):
self.harness.begin()
self.harness.charm.on_create_erasure_profile_action(
test_utils.MockActionEvent({
'name': 'erasure',
'plugin': 'isa',
'failure-domain': 'disk',
'k': 6,
'm': 3,
}))
mock_create_erasure_profile.assert_called_once_with(
service='admin', erasure_plugin_name='isa',
profile_name='erasure', data_chunks=None,
coding_chunks=None, failure_domain='disk', device_class=None
)
@mock.patch('ops_actions.create_erasure_profile.create_erasure_profile')
def test_create_lrc_profile(self, mock_create_erasure_profile):
self.harness.begin()
self.harness.charm.on_create_erasure_profile_action(
test_utils.MockActionEvent({
'name': 'erasure',
'plugin': 'lrc',
'failure-domain': 'disk',
'k': 6,
'm': 3,
'locality-chunks': 2,
'crush-locality': 'host',
}))
mock_create_erasure_profile.assert_called_once_with(
service='admin', erasure_plugin_name='lrc',
profile_name='erasure', data_chunks=None,
coding_chunks=None, locality=2, crush_locality='host',
failure_domain='disk', device_class=None
)
@mock.patch('ops_actions.create_erasure_profile.create_erasure_profile')
def test_create_shec_profile(self, mock_create_erasure_profile):
self.harness.begin()
self.harness.charm.on_create_erasure_profile_action(
test_utils.MockActionEvent({
'name': 'erasure',
'plugin': 'shec',
'failure-domain': 'disk',
'k': 6,
'm': 3,
'durability-estimator': 2
}))
mock_create_erasure_profile.assert_called_once_with(
service='admin', erasure_plugin_name='shec',
profile_name='erasure', data_chunks=None,
coding_chunks=None, durability_estimator=2,
failure_domain='disk', device_class=None
)
@mock.patch('ops_actions.create_erasure_profile.create_erasure_profile')
def test_create_clay_profile(self, mock_create_erasure_profile):
self.harness.begin()
self.harness.charm.on_create_erasure_profile_action(
test_utils.MockActionEvent({
'name': 'erasure',
'plugin': 'clay',
'failure-domain': 'disk',
'k': 6,
'm': 3,
'helper-chunks': 2,
'scalar-mds': 'jerasure'
}))
mock_create_erasure_profile.assert_called_once_with(
service='admin', erasure_plugin_name='clay',
profile_name='erasure', data_chunks=None,
coding_chunks=None, helper_chunks=2,
scalar_mds='jerasure', failure_domain='disk', device_class=None
)