Merge "Adds operator-native mds provides library"

This commit is contained in:
Zuul 2022-10-26 15:45:42 +00:00 committed by Gerrit Code Review
commit 16eb15791a
4 changed files with 156 additions and 20 deletions

66
src/ceph_mds.py Normal file
View File

@ -0,0 +1,66 @@
"""Ceph mds library
"""
import logging
from typing import Dict
from charmhelpers.core.hookenv import leader_get
from ops import model
import charms_ceph.utils as ceph
logger = logging.getLogger(__name__)
import ceph_client
class CephMdsProvides(ceph_client.CephClientProvides):
"""Encapsulate the provides side of the Ceph MDS relation.
Observes the mds-relation-joined hook event
"""
charm = None
_mds_name = None
def __init__(self, charm):
super().__init__(charm, "mds")
self.charm = charm
def _get_mds_name(self, relation: model.Relation, unit: model.Unit) -> str:
"""Retrieve mds-name from relation data."""
unit_data = relation.data[unit]
return unit_data.get("mds-name", relation.app.name)
def _get_custom_relation_init_data(self) -> Dict:
"""Information required for the mds relation.
:returns: Ceph configuration needed for the mds relation
:rtype: dict
"""
return {
"fsid": leader_get("fsid"),
"{}_mds_key".format(self._mds_name): ceph.get_mds_key(
name=self._mds_name
),
}
def _handle_client_relation(
self, relation: model.Relation, unit: model.Unit
) -> None:
"""Handle broker request and set the relation data
:param relation: Operator relation
:type relation: Relation
:param unit: Unit to handle
:type unit: Unit
"""
self._mds_name = self._get_mds_name(relation, unit)
logger.debug(
"mon cluster in quorum and osds bootstrapped"
" - providing mds client with keys"
)
super()._handle_client_relation(relation, unit)

View File

@ -4,6 +4,8 @@ import logging
from ops.main import main
import ceph_status
import ceph_mds
import charms.operator_libs_linux.v0.apt as apt
import charms.operator_libs_linux.v1.systemd as systemd
@ -111,9 +113,6 @@ class CephMonCharm(ops_openstack.core.OSBaseCharm):
if hooks.rbd_mirror_relation():
self.on.notify_clients.emit()
def on_mds_relation(self, event):
hooks.mds_relation_joined()
def on_admin_relation(self, event):
hooks.admin_relation_joined()
@ -149,14 +148,10 @@ class CephMonCharm(ops_openstack.core.OSBaseCharm):
def notify_clients(self, _event):
self.clients.notify_all()
self.mds.notify_all()
for relation in self.model.relations['admin']:
hooks.admin_relation_joined(str(relation.id))
for relation in self.model.relations['mds']:
for unit in relation.units:
hooks.mds_relation_joined(
relid=str(relation.id), unit=unit.name)
def __init__(self, *args):
super().__init__(*args)
self._stored.is_started = True
@ -171,6 +166,7 @@ class CephMonCharm(ops_openstack.core.OSBaseCharm):
self.clients = ceph_client.CephClientProvides(self)
self.metrics_endpoint = ceph_metrics.CephMetricsEndpointProvider(self)
self.ceph_status = ceph_status.StatusAssessor(self)
self.mds = ceph_mds.CephMdsProvides(self)
self._observe_action(self.on.change_osd_weight_action,
ops_actions.change_osd_weight.change_osd_weight)
@ -225,11 +221,6 @@ class CephMonCharm(ops_openstack.core.OSBaseCharm):
fw.observe(self.on.rbd_mirror_relation_joined,
self.on_rbd_mirror_relation)
fw.observe(self.on.mds_relation_changed,
self.on_mds_relation)
fw.observe(self.on.mds_relation_joined,
self.on_mds_relation)
fw.observe(self.on.admin_relation_changed,
self.on_admin_relation)
fw.observe(self.on.admin_relation_joined,

View File

@ -111,16 +111,16 @@ class CephClientTestCase(CharmTestCase):
{'broker_req': '{"request-id": "req"}'})
mock_process_broker_request.assert_not_called()
@mock.patch("src.charm.hooks.mds_relation_joined")
@mock.patch("src.charm.ceph_client.ceph.get_named_key")
@mock.patch("src.charm.ceph_client.get_rbd_features")
@mock.patch("src.charm.ceph_client.get_public_addr")
@mock.patch.object(CephMonCharm, "ready_for_service")
@mock.patch("src.charm.ceph_client.send_osd_settings")
@mock.patch("src.charm.ceph_mds.leader_get", return_value="testfsid")
@mock.patch("src.charm.ceph_mds.ceph")
def test_notify_clients(
self, _send_osd_settings, mock_ready_for_service,
mock_get_public_addr, mock_get_rbd_features, mock_get_named_key,
mock_mds_relation_joined):
self, _ceph, _leader, _send_osd_settings, mock_ready_for_service,
mock_get_public_addr, mock_get_rbd_features, mock_get_named_key):
mock_get_public_addr.return_value = '127.0.0.1'
mock_ready_for_service.return_value = True
mock_get_rbd_features.return_value = None
@ -153,6 +153,4 @@ class CephClientTestCase(CharmTestCase):
'key': 'test key',
'rbd-features': '42',
})
mock_mds_relation_joined.assert_called_with(
relid='1', unit='ceph-fs/0')
self.assertEqual(self.harness.charm.mds._mds_name, "ceph-fs")

View File

@ -0,0 +1,81 @@
#!/usr/bin/env python3
# Copyright 2022 Canonical Ltd.
# See LICENSE file for licensing details.
from unittest import mock
from unittest.mock import patch
import unittest
from ops.testing import Harness
import ceph_mds
import charm
from manage_test_relations import (
add_ceph_mds_relation,
)
@patch("charm.hooks")
class TestCephShared(unittest.TestCase):
def setUp(self):
super().setUp()
self.harness = Harness(charm.CephMonCharm)
self.addCleanup(self.harness.cleanup)
def test_init(self, _hooks):
self.harness.begin()
mds = ceph_mds.CephMdsProvides(self.harness.charm)
self.assertTrue(mds.this_unit)
@mock.patch("src.charm.ceph_client.ceph.is_leader")
@mock.patch("src.charm.ceph_mds.leader_get", return_value="test-fsid")
@mock.patch("src.charm.ceph_mds.ceph")
@mock.patch.object(charm.CephMonCharm, "process_broker_request")
@mock.patch("src.charm.ceph_client.ceph.get_named_key")
@mock.patch("src.charm.ceph_client.get_rbd_features")
@mock.patch("src.charm.ceph_client.get_public_addr")
@mock.patch.object(charm.CephMonCharm, "ready_for_service")
@mock.patch("src.charm.ceph_client.send_osd_settings")
def test_client_relation_broker(
self,
_send_osd_settings,
mock_ready_for_service,
mock_get_public_addr,
mock_get_rbd_features,
mock_get_named_key,
mock_process_broker_request,
mock_ceph_utils,
mock_leader_get,
mock_is_leader,
_hooks,
):
mock_get_public_addr.return_value = "127.0.0.1"
mock_ready_for_service.return_value = True
mock_get_rbd_features.return_value = 42
mock_get_named_key.return_value = "test key"
mock_process_broker_request.return_value = "AOK"
mock_ceph_utils.get_mds_key.return_value = "test-mds-key"
mock_is_leader.return_value = True
self.harness.begin()
self.harness.set_leader()
mds = ceph_mds.CephMdsProvides(self.harness.charm)
rel_id = add_ceph_mds_relation(self.harness)
self.harness.update_relation_data(
rel_id, "ceph-fs/0", {"broker_req": '{"request-id": "req"}'}
)
self.assertEqual(mds._mds_name, "ceph-fs")
mock_leader_get.assert_called_with("fsid")
unit_rel_data = self.harness.get_relation_data(rel_id, "ceph-mon/0")
self.assertEqual(
unit_rel_data,
{
"auth": "cephx",
"ceph-public-address": "127.0.0.1",
"key": "test key",
"rbd-features": "42",
"broker-rsp-ceph-fs-0": "AOK",
"broker_rsp": "AOK",
'ceph-fs_mds_key': 'test-mds-key',
'fsid': 'test-fsid',
},
)
mock_process_broker_request.reset_mock()