Add NRPE checks for services

Adds the nrpe-external-master layer and checks for services managed by
this charm.

func-test-pr: https://github.com/openstack-charmers/zaza-openstack-tests/pull/433

Change-Id: I8f45a612cf4e6df7618edcd8930f2bb199fa69fd
Closes-Bug: #1896674
This commit is contained in:
Xav Paice 2020-09-24 16:56:53 +12:00
parent 71dd75c4cd
commit bf00c7c3a3
14 changed files with 103 additions and 0 deletions

View File

@ -30,3 +30,17 @@ options:
The Open vSwitch ovsdb-server default of 5 seconds may not be sufficient The Open vSwitch ovsdb-server default of 5 seconds may not be sufficient
depending on type and load of the CMS you want to connect to OVN. depending on type and load of the CMS you want to connect to OVN.
nagios_context:
default: "juju"
type: string
description: |
A string that will be prepended to instance name to set the host name
in nagios. So for instance the hostname would be something like:
juju-myservice-0
If you're running multiple environments with the same services in them
this allows you to differentiate between them.
nagios_servicegroups:
default: ""
type: string
description: |
Comma separated list of nagios servicegroups for the service checks.

View File

@ -1,6 +1,7 @@
includes: includes:
- layer:openstack - layer:openstack
- layer:leadership - layer:leadership
- interface:nrpe-external-master
- interface:ovsdb - interface:ovsdb
- interface:ovsdb-cluster - interface:ovsdb-cluster
- interface:ovsdb-cms - interface:ovsdb-cms

View File

@ -17,6 +17,7 @@ import os
import subprocess import subprocess
import charmhelpers.core as ch_core import charmhelpers.core as ch_core
import charmhelpers.contrib.charmsupport.nrpe as nrpe
import charmhelpers.contrib.network.ovs.ovn as ch_ovn import charmhelpers.contrib.network.ovs.ovn as ch_ovn
import charmhelpers.contrib.network.ovs.ovsdb as ch_ovsdb import charmhelpers.contrib.network.ovs.ovsdb as ch_ovsdb
from charmhelpers.contrib.network import ufw as ch_ufw from charmhelpers.contrib.network import ufw as ch_ufw
@ -65,6 +66,7 @@ class BaseOVNCentralCharm(charms_openstack.charm.OpenStackCharm):
name = 'ovn-central' name = 'ovn-central'
packages = ['ovn-central'] packages = ['ovn-central']
services = ['ovn-central'] services = ['ovn-central']
nrpe_check_services = []
release_pkg = 'ovn-central' release_pkg = 'ovn-central'
configuration_class = OVNCentralConfigurationAdapter configuration_class = OVNCentralConfigurationAdapter
required_relations = [PEER_RELATION, CERT_RELATION] required_relations = [PEER_RELATION, CERT_RELATION]
@ -471,6 +473,15 @@ class BaseOVNCentralCharm(charms_openstack.charm.OpenStackCharm):
for rule in sorted(delete_rules, reverse=True): for rule in sorted(delete_rules, reverse=True):
ch_ufw.modify_access(None, dst=None, action='delete', index=rule) ch_ufw.modify_access(None, dst=None, action='delete', index=rule)
def render_nrpe(self):
"""Configure Nagios NRPE checks."""
hostname = nrpe.get_nagios_hostname()
current_unit = nrpe.get_nagios_unit_name()
charm_nrpe = nrpe.NRPE(hostname=hostname)
nrpe.add_init_service_checks(
charm_nrpe, self.nrpe_check_services, current_unit)
charm_nrpe.write()
class TrainOVNCentralCharm(BaseOVNCentralCharm): class TrainOVNCentralCharm(BaseOVNCentralCharm):
# OpenvSwitch and OVN is distributed as part of the Ubuntu Cloud Archive # OpenvSwitch and OVN is distributed as part of the Ubuntu Cloud Archive
@ -507,6 +518,11 @@ class TrainOVNCentralCharm(BaseOVNCentralCharm):
'/lib/systemd/system/ovn-nb-ovsdb.service': [], '/lib/systemd/system/ovn-nb-ovsdb.service': [],
'/lib/systemd/system/ovn-sb-ovsdb.service': [], '/lib/systemd/system/ovn-sb-ovsdb.service': [],
}) })
self.nrpe_check_services = [
'ovn-northd',
'ovn-nb-ovsdb',
'ovn-sb-ovsdb',
]
def install(self): def install(self):
"""Override charm install method. """Override charm install method.
@ -546,6 +562,11 @@ class UssuriOVNCentralCharm(BaseOVNCentralCharm):
'ovn-ovsdb-server-nb', 'ovn-ovsdb-server-nb',
'ovn-ovsdb-server-sb', 'ovn-ovsdb-server-sb',
]) ])
self.nrpe_check_services = [
'ovn-northd',
'ovn-ovsdb-server-nb',
'ovn-ovsdb-server-sb',
]
def install(self): def install(self):
"""Override charm install method.""" """Override charm install method."""

View File

@ -35,6 +35,9 @@ provides:
interface: ovsdb-cms interface: ovsdb-cms
ovsdb-server: ovsdb-server:
interface: ovsdb-cluster interface: ovsdb-cluster
nrpe-external-master:
interface: nrpe-external-master
scope: container
peers: peers:
ovsdb-peer: ovsdb-peer:
interface: ovsdb-cluster interface: ovsdb-cluster

View File

@ -198,3 +198,15 @@ def render():
ovsdb_peer.db_sb_admin_port) ovsdb_peer.db_sb_admin_port)
reactive.set_flag('config.rendered') reactive.set_flag('config.rendered')
ovn_charm.assess_status() ovn_charm.assess_status()
@reactive.when_none('charm.paused', 'is-update-status-hook')
@reactive.when('config.rendered')
@reactive.when_any('config.changed.nagios_context',
'config.changed.nagios_servicegroups',
'endpoint.nrpe-external-master.changed',
'nrpe-external-master.available')
def configure_nrpe():
"""Handle config-changed for NRPE options."""
with charm.provide_charm_instance() as charm_instance:
charm_instance.render_nrpe()

View File

@ -4,6 +4,8 @@ relations:
- mysql:shared-db - mysql:shared-db
- - ovn-central:certificates - - ovn-central:certificates
- vault:certificates - vault:certificates
- - 'nrpe:nrpe-external-master'
- 'ovn-central:nrpe-external-master'
applications: applications:
mysql: mysql:
charm: cs:~openstack-charmers-next/percona-cluster charm: cs:~openstack-charmers-next/percona-cluster
@ -17,3 +19,5 @@ applications:
num_units: 3 num_units: 3
options: options:
source: cloud:bionic-train source: cloud:bionic-train
nrpe:
charm: cs:nrpe

View File

@ -4,6 +4,8 @@ relations:
- mysql:shared-db - mysql:shared-db
- - ovn-central:certificates - - ovn-central:certificates
- vault:certificates - vault:certificates
- - 'nrpe:nrpe-external-master'
- 'ovn-central:nrpe-external-master'
applications: applications:
mysql: mysql:
charm: cs:~openstack-charmers-next/percona-cluster charm: cs:~openstack-charmers-next/percona-cluster
@ -17,3 +19,5 @@ applications:
num_units: 3 num_units: 3
options: options:
source: cloud:bionic-ussuri/proposed source: cloud:bionic-ussuri/proposed
nrpe:
charm: cs:nrpe

View File

@ -48,6 +48,10 @@ applications:
- '5' - '5'
- '6' - '6'
nrpe:
charm: cs:nrpe
relations: relations:
- - 'vault:shared-db' - - 'vault:shared-db'
@ -57,3 +61,5 @@ relations:
- - 'ovn-central:certificates' - - 'ovn-central:certificates'
- 'vault:certificates' - 'vault:certificates'
- - 'nrpe:nrpe-external-master'
- 'ovn-central:nrpe-external-master'

View File

@ -48,6 +48,9 @@ applications:
- '5' - '5'
- '6' - '6'
nrpe:
charm: cs:nrpe
relations: relations:
- - 'vault:shared-db' - - 'vault:shared-db'
@ -57,3 +60,5 @@ relations:
- - 'ovn-central:certificates' - - 'ovn-central:certificates'
- 'vault:certificates' - 'vault:certificates'
- - 'nrpe:nrpe-external-master'
- 'ovn-central:nrpe-external-master'

View File

@ -6,6 +6,8 @@ relations:
- vault-mysql-router:shared-db - vault-mysql-router:shared-db
- - ovn-central:certificates - - ovn-central:certificates
- vault:certificates - vault:certificates
- - 'nrpe:nrpe-external-master'
- 'ovn-central:nrpe-external-master'
applications: applications:
mysql-innodb-cluster: mysql-innodb-cluster:
charm: cs:~openstack-charmers-next/mysql-innodb-cluster charm: cs:~openstack-charmers-next/mysql-innodb-cluster
@ -19,3 +21,5 @@ applications:
series: groovy series: groovy
charm: cs:~openstack-charmers-next/ovn-central charm: cs:~openstack-charmers-next/ovn-central
num_units: 3 num_units: 3
nrpe:
charm: cs:nrpe

View File

@ -15,6 +15,10 @@ target_deploy_status:
vault: vault:
workload-status: blocked workload-status: blocked
workload-status-message: Vault needs to be initialized workload-status-message: Vault needs to be initialized
nrpe:
workload-status: blocked
workload-status-message: "Nagios server not configured or related"
# Note that full end to end tests are performed with OVN in the # Note that full end to end tests are performed with OVN in the
# neutron-api-plugin-ovn and octavia charm gates # neutron-api-plugin-ovn and octavia charm gates
configure: configure:

View File

@ -36,6 +36,7 @@ class _fake_decorator(object):
sys.modules['charmhelpers.contrib.network.ovs'] = mock.MagicMock() sys.modules['charmhelpers.contrib.network.ovs'] = mock.MagicMock()
sys.modules['charmhelpers.contrib.network.ovs.ovn'] = mock.MagicMock() sys.modules['charmhelpers.contrib.network.ovs.ovn'] = mock.MagicMock()
sys.modules['charmhelpers.contrib.network.ovs.ovsdb'] = mock.MagicMock() sys.modules['charmhelpers.contrib.network.ovs.ovsdb'] = mock.MagicMock()
sys.modules['charmhelpers.contrib.charmsupport.nrpe'] = mock.MagicMock()
charms = mock.MagicMock() charms = mock.MagicMock()
sys.modules['charms'] = charms sys.modules['charms'] = charms
charms.leadership = mock.MagicMock() charms.leadership = mock.MagicMock()

View File

@ -410,3 +410,19 @@ class TestOVNCentralCharm(Helper):
self.ch_ufw.modify_access.assert_has_calls([ self.ch_ufw.modify_access.assert_has_calls([
mock.call(None, dst=None, action='delete', index=42) mock.call(None, dst=None, action='delete', index=42)
]) ])
def test_render_nrpe(self):
self.patch_object(ovn_central.nrpe, 'NRPE')
self.patch_object(ovn_central.nrpe, 'add_init_service_checks')
self.target.render_nrpe()
# Note that this list is valid for Ussuri
self.add_init_service_checks.assert_has_calls([
mock.call().add_init_service_checks(
mock.ANY,
['ovn-northd', 'ovn-ovsdb-server-nb', 'ovn-ovsdb-server-sb'],
mock.ANY
),
])
self.NRPE.assert_has_calls([
mock.call().write(),
])

View File

@ -45,6 +45,7 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
'maybe_do_upgrade': ('is-update-status-hook',), 'maybe_do_upgrade': ('is-update-status-hook',),
'publish_addr_to_clients': ('is-update-status-hook',), 'publish_addr_to_clients': ('is-update-status-hook',),
'render': ('is-update-status-hook',), 'render': ('is-update-status-hook',),
'configure_nrpe': ('charm.paused', 'is-update-status-hook',),
}, },
'when': { 'when': {
'announce_leader_ready': ('config.rendered', 'announce_leader_ready': ('config.rendered',
@ -71,6 +72,13 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
'leadership.set.sb_cid', 'leadership.set.sb_cid',
'certificates.connected', 'certificates.connected',
'certificates.available',), 'certificates.available',),
'configure_nrpe': ('config.rendered',),
},
'when_any': {
'configure_nrpe': ('config.changed.nagios_context',
'config.changed.nagios_servicegroups',
'endpoint.nrpe-external-master.changed',
'nrpe-external-master.available',),
}, },
} }
# test that the hooks were registered via the # test that the hooks were registered via the