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
diff --git a/charmcraft.yaml b/charmcraft.yaml
index a93272d..95623a0 100644
--- a/charmcraft.yaml
+++ b/charmcraft.yaml
@@ -18,3 +18,6 @@ bases:
18 architectures:18 architectures:
19 - amd6419 - amd64
20 - arm6420 - arm64
21parts:
22 charm:
23 build-packages: [git]
diff --git a/requirements.txt b/requirements.txt
index 96faf88..ae051de 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1,2 @@
1ops >= 1.4.01ops >= 1.4.0
2-e git+https://github.com/canonical/ops-lib-nrpe.git#egg=ops-lib-nrpe
diff --git a/src/charm.py b/src/charm.py
index d883217..8ba6a64 100755
--- a/src/charm.py
+++ b/src/charm.py
@@ -26,6 +26,8 @@ from charms.operator_libs_linux.v0.apt import (
26from charms.operator_libs_linux.v0.passwd import group_exists, user_exists26from charms.operator_libs_linux.v0.passwd import group_exists, user_exists
27from charms.operator_libs_linux.v0.systemd import service_reload27from charms.operator_libs_linux.v0.systemd import service_reload
2828
29from nrpe.client import NRPEClient, NRPEAvailable
30
29from ops.charm import (31from ops.charm import (
30 ActionEvent, CharmBase, InstallEvent, LeaderElectedEvent,32 ActionEvent, CharmBase, InstallEvent, LeaderElectedEvent,
31 LeaderSettingsChangedEvent, RelationChangedEvent, RelationJoinedEvent,33 LeaderSettingsChangedEvent, RelationChangedEvent, RelationJoinedEvent,
@@ -47,7 +49,6 @@ DPKG_RECONFIGURE = "/usr/sbin/dpkg-reconfigure"
47HAPROXY_CONFIG_FILE = os.path.join(os.path.dirname(__file__),49HAPROXY_CONFIG_FILE = os.path.join(os.path.dirname(__file__),
48 "haproxy-config.yaml")50 "haproxy-config.yaml")
49LSCTL = "/usr/bin/lsctl"51LSCTL = "/usr/bin/lsctl"
50NRPE_D_DIR = "/etc/nagios/nrpe.d"
51POSTFIX_CF = "/etc/postfix/main.cf"52POSTFIX_CF = "/etc/postfix/main.cf"
52SCHEMA_SCRIPT = "/usr/bin/landscape-schema"53SCHEMA_SCRIPT = "/usr/bin/landscape-schema"
53BOOTSTRAP_ACCOUNT_SCRIPT = "/opt/canonical/landscape/bootstrap-account"54BOOTSTRAP_ACCOUNT_SCRIPT = "/opt/canonical/landscape/bootstrap-account"
@@ -112,8 +113,10 @@ class LandscapeServerCharm(CharmBase):
112 self._website_relation_joined)113 self._website_relation_joined)
113 self.framework.observe(self.on.website_relation_changed,114 self.framework.observe(self.on.website_relation_changed,
114 self._website_relation_changed)115 self._website_relation_changed)
115 self.framework.observe(self.on.nrpe_external_master_relation_joined,116
116 self._nrpe_external_master_relation_joined)117 # NRPE
118 self.nrpe_client = NRPEClient(self, 'nrpe-external-master')
119 self.framework.observe(self.nrpe_client.on.nrpe_available, self._on_nrpe_available)
117120
118 # Leadership/peering121 # Leadership/peering
119 self.framework.observe(self.on.leader_elected, self._leader_elected)122 self.framework.observe(self.on.leader_elected, self._leader_elected)
@@ -605,11 +608,7 @@ class LandscapeServerCharm(CharmBase):
605608
606 self._update_ready_status()609 self._update_ready_status()
607610
608 def _nrpe_external_master_relation_joined(611 def _on_nrpe_available(self, event: NRPEAvailable) -> None:
609 self, event: RelationJoinedEvent) -> None:
610 self._update_nrpe_checks(event.relation)
611
612 def _update_nrpe_checks(self, relation: Relation):
613 logger.debug("Configuring NRPE checks")612 logger.debug("Configuring NRPE checks")
614613
615 if self.unit.is_leader():614 if self.unit.is_leader():
@@ -619,47 +618,19 @@ class LandscapeServerCharm(CharmBase):
619 services_to_add = DEFAULT_SERVICES618 services_to_add = DEFAULT_SERVICES
620 services_to_remove = LEADER_SERVICES619 services_to_remove = LEADER_SERVICES
621620
622 monitors = {
623 "monitors": {
624 "remote": {
625 "nrpe": {
626 s: {"command": f"check_{s}"} for s in services_to_add
627 },
628 },
629 },
630 }
631
632 relation.data[self.unit].update({
633 "monitors": yaml.safe_dump(monitors),
634 })
635
636 if not os.path.exists(NRPE_D_DIR):
637 logger.debug("NRPE directories not ready")
638 return
639
640 for service in services_to_add:621 for service in services_to_add:
641 service_cfg = service.replace("-", "_")622 self.nrpe_client.add_check(
642 cfg_filename = os.path.join(NRPE_D_DIR, f"check_{service_cfg}.cfg")623 command=[
643624 '/usr/local/lib/nagios/plugins/check_systemd.py',
644 if os.path.exists(cfg_filename):625 '{}'.format(service),
645 continue626 ],
646627 name='check_{}'.format(service)
647 with open(cfg_filename, "w") as cfg_fp:628 )
648 cfg_fp.write(f"""# check {service}
649# The following header was added by the landscape-server charm
650# Modifying it will affect nagios monitoring and alerting
651# servicegroups: juju
652command[check_{service}]=/usr/local/lib/nagios/plugins/check_systemd.py {service}
653""")
654629
655 for service in services_to_remove:630 for service in services_to_remove:
656 service_cfg = service.replace("-", "_")631 self.nrpe_client.remote_check(
657 cfg_filename = os.path.join(NRPE_D_DIR, f"check_{service_cfg}.cfg")632 name='check_{}'.format(service),
658633 )
659 if not os.path.exists(cfg_filename):
660 continue
661
662 os.remove(cfg_filename)
663634
664 def _leader_elected(self, event: LeaderElectedEvent) -> None:635 def _leader_elected(self, event: LeaderElectedEvent) -> None:
665 # Just because we received this event does not mean we are636 # Just because we received this event does not mean we are
@@ -672,13 +643,15 @@ command[check_{service}]=/usr/local/lib/nagios/plugins/check_systemd.py {service
672 ip = str(self.model.get_binding(peer_relation).network.bind_address)643 ip = str(self.model.get_binding(peer_relation).network.bind_address)
673 peer_relation.data[self.app].update({"leader-ip": ip})644 peer_relation.data[self.app].update({"leader-ip": ip})
674645
675 update_service_conf({646 self._on_nrpe_available(event)
676 "package-search": {
677 "host": "localhost",
678 },
679 })
680647
648 update_service_conf({
649 "package-search": {
650 "host": "localhost",
651 },
652 })
681 self._leader_changed()653 self._leader_changed()
654 self._on_nrpe_available(event)
682655
683 def _leader_settings_changed(656 def _leader_settings_changed(
684 self, event: LeaderSettingsChangedEvent) -> None:657 self, event: LeaderSettingsChangedEvent) -> None:
@@ -698,18 +671,13 @@ command[check_{service}]=/usr/local/lib/nagios/plugins/check_systemd.py {service
698 })671 })
699672
700 self._leader_changed()673 self._leader_changed()
674 self._on_nrpe_available(event)
701675
702 def _leader_changed(self) -> None:676 def _leader_changed(self) -> None:
703 """677 """
704 Generic updates that need to happen whenever leadership changes,678 Generic updates that need to happen whenever leadership changes,
705 in both leaders and non-leaders.679 in both leaders and non-leaders.
706 """680 """
707 # Update any nrpe checks.
708 nrpe_relations = self.model.relations.get("nrpe-external-master", [])
709
710 for relation in nrpe_relations:
711 self._update_nrpe_checks(relation)
712
713 haproxy_relations = self.model.relations.get("website", [])681 haproxy_relations = self.model.relations.get("website", [])
714 for relation in haproxy_relations:682 for relation in haproxy_relations:
715 self._update_haproxy_connection(relation)683 self._update_haproxy_connection(relation)

Subscribers

People subscribed via source and target branches

to all changes: