Merge "Adds operator-native mds provides library"
This commit is contained in:
commit
16eb15791a
|
@ -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)
|
17
src/charm.py
17
src/charm.py
|
@ -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,
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue