Merge ~barryprice/landscape-charm/+git/landscape-charm:main into landscape-charm:main

Proposed by Barry Price
Status: Work in progress
Proposed branch: ~barryprice/landscape-charm/+git/landscape-charm:main
Merge into: landscape-charm:main
Diff against target: 164 lines (+29/-57)
3 files modified
charmcraft.yaml (+3/-0)
requirements.txt (+1/-0)
src/charm.py (+25/-57)
Reviewer Review Type Date Requested Status
Landscape Pending
Review via email: mp+439657@code.launchpad.net

Commit message

WIP, DO NOT MERGE. First pass at LP:2012693

To post a comment you must log in.

Unmerged commits

fb5aef2... by Barry Price

WIP, DO NOT MERGE. First pass at LP:2012693

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/charmcraft.yaml b/charmcraft.yaml
2index a93272d..95623a0 100644
3--- a/charmcraft.yaml
4+++ b/charmcraft.yaml
5@@ -18,3 +18,6 @@ bases:
6 architectures:
7 - amd64
8 - arm64
9+parts:
10+ charm:
11+ build-packages: [git]
12diff --git a/requirements.txt b/requirements.txt
13index 96faf88..ae051de 100644
14--- a/requirements.txt
15+++ b/requirements.txt
16@@ -1 +1,2 @@
17 ops >= 1.4.0
18+-e git+https://github.com/canonical/ops-lib-nrpe.git#egg=ops-lib-nrpe
19diff --git a/src/charm.py b/src/charm.py
20index d883217..8ba6a64 100755
21--- a/src/charm.py
22+++ b/src/charm.py
23@@ -26,6 +26,8 @@ from charms.operator_libs_linux.v0.apt import (
24 from charms.operator_libs_linux.v0.passwd import group_exists, user_exists
25 from charms.operator_libs_linux.v0.systemd import service_reload
26
27+from nrpe.client import NRPEClient, NRPEAvailable
28+
29 from ops.charm import (
30 ActionEvent, CharmBase, InstallEvent, LeaderElectedEvent,
31 LeaderSettingsChangedEvent, RelationChangedEvent, RelationJoinedEvent,
32@@ -47,7 +49,6 @@ DPKG_RECONFIGURE = "/usr/sbin/dpkg-reconfigure"
33 HAPROXY_CONFIG_FILE = os.path.join(os.path.dirname(__file__),
34 "haproxy-config.yaml")
35 LSCTL = "/usr/bin/lsctl"
36-NRPE_D_DIR = "/etc/nagios/nrpe.d"
37 POSTFIX_CF = "/etc/postfix/main.cf"
38 SCHEMA_SCRIPT = "/usr/bin/landscape-schema"
39 BOOTSTRAP_ACCOUNT_SCRIPT = "/opt/canonical/landscape/bootstrap-account"
40@@ -112,8 +113,10 @@ class LandscapeServerCharm(CharmBase):
41 self._website_relation_joined)
42 self.framework.observe(self.on.website_relation_changed,
43 self._website_relation_changed)
44- self.framework.observe(self.on.nrpe_external_master_relation_joined,
45- self._nrpe_external_master_relation_joined)
46+
47+ # NRPE
48+ self.nrpe_client = NRPEClient(self, 'nrpe-external-master')
49+ self.framework.observe(self.nrpe_client.on.nrpe_available, self._on_nrpe_available)
50
51 # Leadership/peering
52 self.framework.observe(self.on.leader_elected, self._leader_elected)
53@@ -605,11 +608,7 @@ class LandscapeServerCharm(CharmBase):
54
55 self._update_ready_status()
56
57- def _nrpe_external_master_relation_joined(
58- self, event: RelationJoinedEvent) -> None:
59- self._update_nrpe_checks(event.relation)
60-
61- def _update_nrpe_checks(self, relation: Relation):
62+ def _on_nrpe_available(self, event: NRPEAvailable) -> None:
63 logger.debug("Configuring NRPE checks")
64
65 if self.unit.is_leader():
66@@ -619,47 +618,19 @@ class LandscapeServerCharm(CharmBase):
67 services_to_add = DEFAULT_SERVICES
68 services_to_remove = LEADER_SERVICES
69
70- monitors = {
71- "monitors": {
72- "remote": {
73- "nrpe": {
74- s: {"command": f"check_{s}"} for s in services_to_add
75- },
76- },
77- },
78- }
79-
80- relation.data[self.unit].update({
81- "monitors": yaml.safe_dump(monitors),
82- })
83-
84- if not os.path.exists(NRPE_D_DIR):
85- logger.debug("NRPE directories not ready")
86- return
87-
88 for service in services_to_add:
89- service_cfg = service.replace("-", "_")
90- cfg_filename = os.path.join(NRPE_D_DIR, f"check_{service_cfg}.cfg")
91-
92- if os.path.exists(cfg_filename):
93- continue
94-
95- with open(cfg_filename, "w") as cfg_fp:
96- cfg_fp.write(f"""# check {service}
97-# The following header was added by the landscape-server charm
98-# Modifying it will affect nagios monitoring and alerting
99-# servicegroups: juju
100-command[check_{service}]=/usr/local/lib/nagios/plugins/check_systemd.py {service}
101-""")
102+ self.nrpe_client.add_check(
103+ command=[
104+ '/usr/local/lib/nagios/plugins/check_systemd.py',
105+ '{}'.format(service),
106+ ],
107+ name='check_{}'.format(service)
108+ )
109
110 for service in services_to_remove:
111- service_cfg = service.replace("-", "_")
112- cfg_filename = os.path.join(NRPE_D_DIR, f"check_{service_cfg}.cfg")
113-
114- if not os.path.exists(cfg_filename):
115- continue
116-
117- os.remove(cfg_filename)
118+ self.nrpe_client.remote_check(
119+ name='check_{}'.format(service),
120+ )
121
122 def _leader_elected(self, event: LeaderElectedEvent) -> None:
123 # Just because we received this event does not mean we are
124@@ -672,13 +643,15 @@ command[check_{service}]=/usr/local/lib/nagios/plugins/check_systemd.py {service
125 ip = str(self.model.get_binding(peer_relation).network.bind_address)
126 peer_relation.data[self.app].update({"leader-ip": ip})
127
128- update_service_conf({
129- "package-search": {
130- "host": "localhost",
131- },
132- })
133+ self._on_nrpe_available(event)
134
135+ update_service_conf({
136+ "package-search": {
137+ "host": "localhost",
138+ },
139+ })
140 self._leader_changed()
141+ self._on_nrpe_available(event)
142
143 def _leader_settings_changed(
144 self, event: LeaderSettingsChangedEvent) -> None:
145@@ -698,18 +671,13 @@ command[check_{service}]=/usr/local/lib/nagios/plugins/check_systemd.py {service
146 })
147
148 self._leader_changed()
149+ self._on_nrpe_available(event)
150
151 def _leader_changed(self) -> None:
152 """
153 Generic updates that need to happen whenever leadership changes,
154 in both leaders and non-leaders.
155 """
156- # Update any nrpe checks.
157- nrpe_relations = self.model.relations.get("nrpe-external-master", [])
158-
159- for relation in nrpe_relations:
160- self._update_nrpe_checks(relation)
161-
162 haproxy_relations = self.model.relations.get("website", [])
163 for relation in haproxy_relations:
164 self._update_haproxy_connection(relation)

Subscribers

People subscribed via source and target branches

to all changes: