Merge "Update NRPE logic to add/remove checks and files"
This commit is contained in:
commit
39780d9e09
|
@ -22,6 +22,7 @@ import tempfile
|
||||||
import time
|
import time
|
||||||
import shutil
|
import shutil
|
||||||
import socket
|
import socket
|
||||||
|
import yaml
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
@ -29,8 +30,10 @@ from rabbitmq_context import (
|
||||||
RabbitMQSSLContext,
|
RabbitMQSSLContext,
|
||||||
RabbitMQClusterContext,
|
RabbitMQClusterContext,
|
||||||
RabbitMQEnvContext,
|
RabbitMQEnvContext,
|
||||||
|
SSL_CA_FILE,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from charmhelpers.contrib.charmsupport import nrpe
|
||||||
from charmhelpers.core.templating import render
|
from charmhelpers.core.templating import render
|
||||||
|
|
||||||
from charmhelpers.contrib.openstack.utils import (
|
from charmhelpers.contrib.openstack.utils import (
|
||||||
|
@ -63,6 +66,7 @@ from charmhelpers.core.hookenv import (
|
||||||
is_leader,
|
is_leader,
|
||||||
leader_get,
|
leader_get,
|
||||||
local_unit,
|
local_unit,
|
||||||
|
charm_dir
|
||||||
)
|
)
|
||||||
|
|
||||||
from charmhelpers.core.host import (
|
from charmhelpers.core.host import (
|
||||||
|
@ -72,6 +76,7 @@ from charmhelpers.core.host import (
|
||||||
cmp_pkgrevno,
|
cmp_pkgrevno,
|
||||||
path_hash,
|
path_hash,
|
||||||
service as system_service,
|
service as system_service,
|
||||||
|
rsync,
|
||||||
)
|
)
|
||||||
|
|
||||||
from charmhelpers.contrib.peerstorage import (
|
from charmhelpers.contrib.peerstorage import (
|
||||||
|
@ -100,6 +105,11 @@ ENABLED_PLUGINS = '/etc/rabbitmq/enabled_plugins'
|
||||||
RABBIT_USER = 'rabbitmq'
|
RABBIT_USER = 'rabbitmq'
|
||||||
LIB_PATH = '/var/lib/rabbitmq/'
|
LIB_PATH = '/var/lib/rabbitmq/'
|
||||||
HOSTS_FILE = '/etc/hosts'
|
HOSTS_FILE = '/etc/hosts'
|
||||||
|
NAGIOS_PLUGINS = '/usr/local/lib/nagios/plugins'
|
||||||
|
SCRIPTS_DIR = '/usr/local/bin'
|
||||||
|
STATS_CRONFILE = '/etc/cron.d/rabbitmq-stats'
|
||||||
|
CRONJOB_CMD = ("{schedule} root timeout -k 10s -s SIGINT {timeout} "
|
||||||
|
"{command} 2>&1 | logger -p local0.notice\n")
|
||||||
|
|
||||||
_named_passwd = '/var/lib/charm/{}/{}.passwd'
|
_named_passwd = '/var/lib/charm/{}/{}.passwd'
|
||||||
_local_named_passwd = '/var/lib/charm/{}/{}.local_passwd'
|
_local_named_passwd = '/var/lib/charm/{}/{}.local_passwd'
|
||||||
|
@ -1200,3 +1210,236 @@ def install_or_upgrade_packages():
|
||||||
status_set('maintenance', 'Installing/upgrading RabbitMQ packages')
|
status_set('maintenance', 'Installing/upgrading RabbitMQ packages')
|
||||||
apt_update(fatal=True)
|
apt_update(fatal=True)
|
||||||
apt_install(PACKAGES, fatal=True)
|
apt_install(PACKAGES, fatal=True)
|
||||||
|
|
||||||
|
|
||||||
|
def remove_file(path):
|
||||||
|
"""Delete the file or skip it if not exist.
|
||||||
|
|
||||||
|
:param path: the file to delete
|
||||||
|
:type path: str
|
||||||
|
"""
|
||||||
|
if os.path.isfile(path):
|
||||||
|
os.remove(path)
|
||||||
|
elif os.path.exists(path):
|
||||||
|
log('{} path is not file'.format(path), level='ERROR')
|
||||||
|
else:
|
||||||
|
log('{} file does not exist'.format(path), level='DEBUG')
|
||||||
|
|
||||||
|
|
||||||
|
def sync_nrpe_files():
|
||||||
|
"""Sync all NRPE-related files.
|
||||||
|
|
||||||
|
Copy all the custom NRPE scripts and create the cron file to run
|
||||||
|
rabbitmq stats collection
|
||||||
|
"""
|
||||||
|
if not os.path.exists(NAGIOS_PLUGINS):
|
||||||
|
os.makedirs(NAGIOS_PLUGINS, exist_ok=True)
|
||||||
|
|
||||||
|
if config('ssl'):
|
||||||
|
rsync(os.path.join(charm_dir(), 'files', 'check_rabbitmq.py'),
|
||||||
|
os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq.py'))
|
||||||
|
if config('queue_thresholds') and config('stats_cron_schedule'):
|
||||||
|
rsync(os.path.join(charm_dir(), 'files', 'check_rabbitmq_queues.py'),
|
||||||
|
os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq_queues.py'))
|
||||||
|
if config('management_plugin'):
|
||||||
|
rsync(os.path.join(charm_dir(), 'files', 'check_rabbitmq_cluster.py'),
|
||||||
|
os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq_cluster.py'))
|
||||||
|
|
||||||
|
if config('stats_cron_schedule'):
|
||||||
|
rsync(os.path.join(charm_dir(), 'files', 'collect_rabbitmq_stats.sh'),
|
||||||
|
os.path.join(SCRIPTS_DIR, 'collect_rabbitmq_stats.sh'))
|
||||||
|
cronjob = CRONJOB_CMD.format(
|
||||||
|
schedule=config('stats_cron_schedule'),
|
||||||
|
timeout=config('cron-timeout'),
|
||||||
|
command=os.path.join(SCRIPTS_DIR, 'collect_rabbitmq_stats.sh'))
|
||||||
|
write_file(STATS_CRONFILE, cronjob)
|
||||||
|
|
||||||
|
|
||||||
|
def remove_nrpe_files():
|
||||||
|
"""Remove the cron file and all the custom NRPE scripts."""
|
||||||
|
if not config('stats_cron_schedule'):
|
||||||
|
# These scripts are redundant if the value `stats_cron_schedule`
|
||||||
|
# isn't in the config
|
||||||
|
remove_file(STATS_CRONFILE)
|
||||||
|
remove_file(os.path.join(SCRIPTS_DIR, 'collect_rabbitmq_stats.sh'))
|
||||||
|
|
||||||
|
if not config('ssl'):
|
||||||
|
# This script is redundant if the value `ssl` isn't in the config
|
||||||
|
remove_file(os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq.py'))
|
||||||
|
|
||||||
|
if not config('queue_thresholds') or not config('stats_cron_schedule'):
|
||||||
|
# This script is redundant if the value `queue_thresholds` or
|
||||||
|
# `stats_cron_schedule` isn't in the config
|
||||||
|
remove_file(os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq_queues.py'))
|
||||||
|
|
||||||
|
if not config('management_plugin'):
|
||||||
|
# This script is redundant if the value `management_plugin` isn't
|
||||||
|
# in the config
|
||||||
|
remove_file(os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq_cluster.py'))
|
||||||
|
|
||||||
|
|
||||||
|
def get_nrpe_credentials():
|
||||||
|
"""Get the NRPE hostname, unit and user details.
|
||||||
|
|
||||||
|
:returns: (hostname, unit, vhosts, user, password)
|
||||||
|
:rtype: Tuple[str, str, List[Dict[str, str]], str, str]
|
||||||
|
"""
|
||||||
|
# Find out if nrpe set nagios_hostname
|
||||||
|
hostname = nrpe.get_nagios_hostname()
|
||||||
|
unit = nrpe.get_nagios_unit_name()
|
||||||
|
|
||||||
|
# create unique user and vhost for each unit
|
||||||
|
current_unit = local_unit().replace('/', '-')
|
||||||
|
user = 'nagios-{}'.format(current_unit)
|
||||||
|
vhosts = [{'vhost': user, 'shortname': RABBIT_USER}]
|
||||||
|
password = get_rabbit_password(user, local=True)
|
||||||
|
create_user(user, password, ['monitoring'])
|
||||||
|
|
||||||
|
if config('check-vhosts'):
|
||||||
|
for other_vhost in config('check-vhosts').split(' '):
|
||||||
|
if other_vhost:
|
||||||
|
item = {'vhost': other_vhost,
|
||||||
|
'shortname': 'rabbit_{}'.format(other_vhost)}
|
||||||
|
vhosts.append(item)
|
||||||
|
|
||||||
|
return hostname, unit, vhosts, user, password
|
||||||
|
|
||||||
|
|
||||||
|
def nrpe_update_vhost_check(nrpe_compat, unit, user, password, vhost):
|
||||||
|
"""Add/Remove the RabbitMQ non-SSL check
|
||||||
|
|
||||||
|
If the SSL is set to `off` or `on`, it will add the non-SSL RabbitMQ check,
|
||||||
|
otherwise it will remove it.
|
||||||
|
|
||||||
|
:param nrpe_compat: the NRPE class object
|
||||||
|
:type: nrpe.NRPE
|
||||||
|
:param unit: NRPE unit
|
||||||
|
:type: str
|
||||||
|
:param user: username of NRPE user
|
||||||
|
:type: str
|
||||||
|
:param password: password of NRPE user
|
||||||
|
:type: str
|
||||||
|
:param vhost: dictionary with vhost and shortname
|
||||||
|
:type: Dict[str, str]
|
||||||
|
"""
|
||||||
|
ssl_config = config('ssl') or ''
|
||||||
|
if ssl_config.lower() in ['off', 'on']:
|
||||||
|
log('Adding rabbitmq non-SSL check for {}'.format(vhost['vhost']),
|
||||||
|
level=DEBUG)
|
||||||
|
nrpe_compat.add_check(
|
||||||
|
shortname=vhost['shortname'],
|
||||||
|
description='Check RabbitMQ {} {}'.format(unit, vhost['vhost']),
|
||||||
|
check_cmd='{}/check_rabbitmq.py --user {} --password {} '
|
||||||
|
'--vhost {}'.format(
|
||||||
|
NAGIOS_PLUGINS, user, password, vhost['vhost']))
|
||||||
|
else:
|
||||||
|
log('Removing rabbitmq non-SSL check for {}'.format(vhost['vhost']),
|
||||||
|
level=DEBUG)
|
||||||
|
nrpe_compat.remove_check(
|
||||||
|
shortname=vhost['shortname'],
|
||||||
|
description='Remove check RabbitMQ {} {}'.format(
|
||||||
|
unit, vhost['vhost']),
|
||||||
|
check_cmd='{}/check_rabbitmq.py'.format(NAGIOS_PLUGINS))
|
||||||
|
|
||||||
|
|
||||||
|
def nrpe_update_vhost_ssl_check(nrpe_compat, unit, user, password, vhost):
|
||||||
|
"""Add/Remove the RabbitMQ SSL check
|
||||||
|
|
||||||
|
If the SSL is set to `only` or `on`, it will add the SSL RabbitMQ check,
|
||||||
|
otherwise it will remove it.
|
||||||
|
|
||||||
|
:param nrpe_compat: the NRPE class object
|
||||||
|
:type: nrpe.NRPE
|
||||||
|
:param unit: NRPE unit
|
||||||
|
:type: str
|
||||||
|
:param user: username of NRPE user
|
||||||
|
:type: str
|
||||||
|
:param password: password of NRPE user
|
||||||
|
:type: str
|
||||||
|
:param vhost: dictionary with vhost and shortname
|
||||||
|
:type: Dict[str, str]
|
||||||
|
"""
|
||||||
|
ssl_config = config('ssl') or ''
|
||||||
|
if ssl_config.lower() in ['only', 'on']:
|
||||||
|
log('Adding rabbitmq SSL check for {}'.format(vhost['vhost']),
|
||||||
|
level=DEBUG)
|
||||||
|
nrpe_compat.add_check(
|
||||||
|
shortname=vhost['shortname'] + "_ssl",
|
||||||
|
description='Check RabbitMQ (SSL) {} {}'.format(
|
||||||
|
unit, vhost['vhost']),
|
||||||
|
check_cmd='{}/check_rabbitmq.py --user {} --password {} '
|
||||||
|
'--vhost {} --ssl --ssl-ca {} --port {}'.format(
|
||||||
|
NAGIOS_PLUGINS, user, password, vhost['vhost'],
|
||||||
|
SSL_CA_FILE, int(config('ssl_port'))))
|
||||||
|
else:
|
||||||
|
log('Removing rabbitmq SSL check for {}'.format(vhost['vhost']),
|
||||||
|
level=DEBUG)
|
||||||
|
nrpe_compat.remove_check(
|
||||||
|
shortname=vhost['shortname'] + "_ssl",
|
||||||
|
description='Remove check RabbitMQ (SSL) {} {}'.format(
|
||||||
|
unit, vhost['vhost']),
|
||||||
|
check_cmd='{}/check_rabbitmq.py'.format(NAGIOS_PLUGINS))
|
||||||
|
|
||||||
|
|
||||||
|
def nrpe_update_queues_check(nrpe_compat, rabbit_dir):
|
||||||
|
"""Add/Remove the RabbitMQ queues check
|
||||||
|
|
||||||
|
The RabbitMQ Queues check should be added if the `queue_thresholds` and
|
||||||
|
the `stats_cron_schedule` variables are in the configuration. Otherwise,
|
||||||
|
this check should be removed.
|
||||||
|
The cron job configured with the `stats_cron_schedule`
|
||||||
|
variable is responsible for creating the data files read by this check.
|
||||||
|
|
||||||
|
:param nrpe_compat: the NRPE class object
|
||||||
|
:type: nrpe.NRPE
|
||||||
|
:param rabbit_dir: path to the RabbitMQ directory
|
||||||
|
:type: str
|
||||||
|
"""
|
||||||
|
stats_datafile = os.path.join(
|
||||||
|
rabbit_dir, 'data', '{}_queue_stats.dat'.format(get_unit_hostname()))
|
||||||
|
|
||||||
|
if config('queue_thresholds') and config('stats_cron_schedule'):
|
||||||
|
cmd = ""
|
||||||
|
# If value of queue_thresholds is incorrect we want the hook to fail
|
||||||
|
for item in yaml.safe_load(config('queue_thresholds')):
|
||||||
|
cmd += ' -c "{}" "{}" {} {}'.format(*item)
|
||||||
|
nrpe_compat.add_check(
|
||||||
|
shortname=RABBIT_USER + '_queue',
|
||||||
|
description='Check RabbitMQ Queues',
|
||||||
|
check_cmd='{}/check_rabbitmq_queues.py{} {}'.format(
|
||||||
|
NAGIOS_PLUGINS, cmd, stats_datafile))
|
||||||
|
else:
|
||||||
|
log('Removing rabbitmq Queues check', level=DEBUG)
|
||||||
|
nrpe_compat.remove_check(
|
||||||
|
shortname=RABBIT_USER + '_queue',
|
||||||
|
description='Remove check RabbitMQ Queues',
|
||||||
|
check_cmd='{}/check_rabbitmq_queues.py'.format(NAGIOS_PLUGINS))
|
||||||
|
|
||||||
|
|
||||||
|
def nrpe_update_cluster_check(nrpe_compat, user, password):
|
||||||
|
"""Add/Remove the RabbitMQ cluster check
|
||||||
|
|
||||||
|
If the management_plugin is set to `True`, it will add the cluster RabbitMQ
|
||||||
|
check, otherwise it will remove it.
|
||||||
|
|
||||||
|
:param nrpe_compat: the NRPE class object
|
||||||
|
:type: nrpe.NRPE
|
||||||
|
:param user: username of NRPE user
|
||||||
|
:type: str
|
||||||
|
:param password: password of NRPE user
|
||||||
|
:type: str
|
||||||
|
"""
|
||||||
|
if config('management_plugin'):
|
||||||
|
cmd = '{}/check_rabbitmq_cluster.py --port {} ' \
|
||||||
|
'--user {} --password {}'.format(
|
||||||
|
NAGIOS_PLUGINS, get_managment_port(), user, password)
|
||||||
|
nrpe_compat.add_check(
|
||||||
|
shortname=RABBIT_USER + '_cluster',
|
||||||
|
description='Check RabbitMQ Cluster',
|
||||||
|
check_cmd=cmd)
|
||||||
|
else:
|
||||||
|
log('Removing rabbitmq Cluster check', level=DEBUG)
|
||||||
|
nrpe_compat.remove_check(
|
||||||
|
shortname=RABBIT_USER + '_cluster',
|
||||||
|
description='Remove check RabbitMQ Cluster',
|
||||||
|
check_cmd='{}/check_rabbitmq_cluster.py'.format(NAGIOS_PLUGINS))
|
||||||
|
|
|
@ -33,38 +33,18 @@ def _add_path(path):
|
||||||
_add_path(_root)
|
_add_path(_root)
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
import yaml # flake8: noqa
|
|
||||||
except ImportError:
|
|
||||||
if sys.version_info.major == 2:
|
|
||||||
subprocess.check_call(['apt-get', 'install', '-y', 'python-yaml'])
|
|
||||||
else:
|
|
||||||
subprocess.check_call(['apt-get', 'install', '-y', 'python3-yaml'])
|
|
||||||
import yaml # flake8: noqa
|
|
||||||
|
|
||||||
try:
|
|
||||||
import requests # flake8: noqa
|
|
||||||
except ImportError:
|
|
||||||
if sys.version_info.major == 2:
|
|
||||||
subprocess.check_call(['apt-get', 'install', '-y',
|
|
||||||
'python-requests'])
|
|
||||||
else:
|
|
||||||
subprocess.check_call(['apt-get', 'install', '-y',
|
|
||||||
'python3-requests'])
|
|
||||||
import requests # noqa: F401
|
|
||||||
|
|
||||||
import rabbit_net_utils
|
import rabbit_net_utils
|
||||||
import rabbit_utils as rabbit
|
import rabbit_utils as rabbit
|
||||||
import ssl_utils
|
import ssl_utils
|
||||||
from rabbitmq_context import SSL_CA_FILE
|
|
||||||
|
|
||||||
from lib.utils import (
|
from lib.utils import (
|
||||||
chown, chmod,
|
chown, chmod,
|
||||||
is_newer,
|
is_newer,
|
||||||
)
|
)
|
||||||
|
from charmhelpers.contrib.charmsupport import nrpe
|
||||||
from charmhelpers.contrib.hahelpers.cluster import (
|
from charmhelpers.contrib.hahelpers.cluster import (
|
||||||
is_clustered,
|
is_clustered,
|
||||||
is_elected_leader
|
is_elected_leader,
|
||||||
)
|
)
|
||||||
from charmhelpers.contrib.openstack.utils import (
|
from charmhelpers.contrib.openstack.utils import (
|
||||||
is_unit_paused_set,
|
is_unit_paused_set,
|
||||||
|
@ -108,18 +88,14 @@ from charmhelpers.core.hookenv import (
|
||||||
Hooks,
|
Hooks,
|
||||||
UnregisteredHookError,
|
UnregisteredHookError,
|
||||||
is_leader,
|
is_leader,
|
||||||
charm_dir,
|
|
||||||
status_set,
|
status_set,
|
||||||
unit_private_ip,
|
unit_private_ip,
|
||||||
)
|
)
|
||||||
from charmhelpers.core.host import (
|
from charmhelpers.core.host import (
|
||||||
cmp_pkgrevno,
|
cmp_pkgrevno,
|
||||||
rsync,
|
|
||||||
service_stop,
|
service_stop,
|
||||||
service_restart,
|
service_restart,
|
||||||
write_file,
|
|
||||||
)
|
)
|
||||||
from charmhelpers.contrib.charmsupport import nrpe
|
|
||||||
|
|
||||||
from charmhelpers.contrib.peerstorage import (
|
from charmhelpers.contrib.peerstorage import (
|
||||||
peer_echo,
|
peer_echo,
|
||||||
|
@ -142,14 +118,6 @@ POOL_NAME = SERVICE_NAME
|
||||||
RABBIT_DIR = '/var/lib/rabbitmq'
|
RABBIT_DIR = '/var/lib/rabbitmq'
|
||||||
RABBIT_USER = 'rabbitmq'
|
RABBIT_USER = 'rabbitmq'
|
||||||
RABBIT_GROUP = 'rabbitmq'
|
RABBIT_GROUP = 'rabbitmq'
|
||||||
NAGIOS_PLUGINS = '/usr/local/lib/nagios/plugins'
|
|
||||||
SCRIPTS_DIR = '/usr/local/bin'
|
|
||||||
STATS_CRONFILE = '/etc/cron.d/rabbitmq-stats'
|
|
||||||
STATS_DATAFILE = os.path.join(RABBIT_DIR, 'data',
|
|
||||||
'{}_queue_stats.dat'
|
|
||||||
''.format(rabbit.get_unit_hostname()))
|
|
||||||
CRONJOB_CMD = ("{schedule} root timeout -k 10s -s SIGINT {timeout} "
|
|
||||||
"{command} 2>&1 | logger -p local0.notice\n")
|
|
||||||
INITIAL_CLIENT_UPDATE_KEY = 'initial_client_update_done'
|
INITIAL_CLIENT_UPDATE_KEY = 'initial_client_update_done'
|
||||||
|
|
||||||
|
|
||||||
|
@ -647,103 +615,38 @@ def ceph_changed():
|
||||||
|
|
||||||
@hooks.hook('nrpe-external-master-relation-changed')
|
@hooks.hook('nrpe-external-master-relation-changed')
|
||||||
def update_nrpe_checks():
|
def update_nrpe_checks():
|
||||||
if os.path.isdir(NAGIOS_PLUGINS):
|
# NOTE (rgildein): This function has been changed to remove redundant
|
||||||
rsync(os.path.join(charm_dir(), 'files',
|
# checks and scripts based on rabbitmq configuration, but the main logic
|
||||||
'check_rabbitmq.py'),
|
# was unchanged.
|
||||||
os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq.py'))
|
#
|
||||||
rsync(os.path.join(charm_dir(), 'files',
|
# The function logic is based on these three functions:
|
||||||
'check_rabbitmq_queues.py'),
|
# 1) copy all the custom NRPE scripts and create cron file
|
||||||
os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq_queues.py'))
|
# 2) add NRPE checks and remove redundant
|
||||||
if config('management_plugin'):
|
# 2.a) update the NRPE vhost check for TLS and non-TLS
|
||||||
rsync(os.path.join(charm_dir(), 'files',
|
# 2.b) update the NRPE queues check
|
||||||
'check_rabbitmq_cluster.py'),
|
# 2.c) update the NRPE cluster check
|
||||||
os.path.join(NAGIOS_PLUGINS, 'check_rabbitmq_cluster.py'))
|
# 3) remove redundant scripts - this must be done after removing
|
||||||
|
# the relevant check
|
||||||
if config('stats_cron_schedule'):
|
rabbit.sync_nrpe_files()
|
||||||
script = os.path.join(SCRIPTS_DIR, 'collect_rabbitmq_stats.sh')
|
|
||||||
cronjob = CRONJOB_CMD.format(schedule=config('stats_cron_schedule'),
|
|
||||||
timeout=config('cron-timeout'),
|
|
||||||
command=script)
|
|
||||||
rsync(os.path.join(charm_dir(), 'files',
|
|
||||||
'collect_rabbitmq_stats.sh'), script)
|
|
||||||
write_file(STATS_CRONFILE, cronjob)
|
|
||||||
elif os.path.isfile(STATS_CRONFILE):
|
|
||||||
os.remove(STATS_CRONFILE)
|
|
||||||
|
|
||||||
# Find out if nrpe set nagios_hostname
|
|
||||||
hostname = nrpe.get_nagios_hostname()
|
|
||||||
myunit = nrpe.get_nagios_unit_name()
|
|
||||||
|
|
||||||
# create unique user and vhost for each unit
|
|
||||||
current_unit = local_unit().replace('/', '-')
|
|
||||||
user = 'nagios-{}'.format(current_unit)
|
|
||||||
vhosts = [{'vhost': user, 'shortname': rabbit.RABBIT_USER}]
|
|
||||||
password = rabbit.get_rabbit_password(user, local=True)
|
|
||||||
|
|
||||||
|
hostname, unit, vhosts, user, password = rabbit.get_nrpe_credentials()
|
||||||
nrpe_compat = nrpe.NRPE(hostname=hostname)
|
nrpe_compat = nrpe.NRPE(hostname=hostname)
|
||||||
rabbit.create_user(user, password, ['monitoring'])
|
|
||||||
|
|
||||||
if config('check-vhosts'):
|
|
||||||
for other_vhost in config('check-vhosts').split(' '):
|
|
||||||
if other_vhost:
|
|
||||||
item = {'vhost': other_vhost,
|
|
||||||
'shortname': 'rabbit_{}'.format(other_vhost)}
|
|
||||||
vhosts.append(item)
|
|
||||||
|
|
||||||
for vhost in vhosts:
|
for vhost in vhosts:
|
||||||
rabbit.create_vhost(vhost['vhost'])
|
rabbit.create_vhost(vhost['vhost'])
|
||||||
rabbit.grant_permissions(user, vhost['vhost'])
|
rabbit.grant_permissions(user, vhost['vhost'])
|
||||||
if config('ssl') in ['off', 'on']:
|
|
||||||
cmd = ('{}/check_rabbitmq.py --user {} --password {} '
|
|
||||||
'--vhost {}'.format(NAGIOS_PLUGINS, user,
|
|
||||||
password, vhost['vhost']))
|
|
||||||
log('Adding rabbitmq non-SSL check for {}'.format(vhost['vhost']),
|
|
||||||
level=DEBUG)
|
|
||||||
description = 'Check RabbitMQ {} {}'.format(myunit, vhost['vhost'])
|
|
||||||
nrpe_compat.add_check(
|
|
||||||
shortname=vhost['shortname'],
|
|
||||||
description=description,
|
|
||||||
check_cmd=cmd)
|
|
||||||
|
|
||||||
if config('ssl') in ['only', 'on']:
|
rabbit.nrpe_update_vhost_check(
|
||||||
cmd = ('{}/check_rabbitmq.py --user {} --password {} '
|
nrpe_compat, unit, user, password, vhost)
|
||||||
'--vhost {} --ssl --ssl-ca {} --port {}'.format(
|
rabbit.nrpe_update_vhost_ssl_check(
|
||||||
NAGIOS_PLUGINS, user, password, vhost['vhost'],
|
nrpe_compat, unit, user, password, vhost)
|
||||||
SSL_CA_FILE, int(config('ssl_port'))))
|
|
||||||
log('Adding rabbitmq SSL check for {}'.format(vhost['vhost']),
|
|
||||||
level=DEBUG)
|
|
||||||
description = ('Check RabbitMQ (SSL) {} {}'
|
|
||||||
.format(myunit, vhost['vhost']))
|
|
||||||
nrpe_compat.add_check(
|
|
||||||
shortname=vhost['shortname'] + "_ssl",
|
|
||||||
description=description,
|
|
||||||
check_cmd=cmd)
|
|
||||||
|
|
||||||
if config('queue_thresholds') and config('stats_cron_schedule'):
|
|
||||||
# Only add queue check if there's also a cronjob for creating stats
|
|
||||||
cmd = ""
|
|
||||||
# If value of queue_thresholds is incorrect we want the hook to fail
|
|
||||||
for item in yaml.safe_load(config('queue_thresholds')):
|
|
||||||
cmd += ' -c "{}" "{}" {} {}'.format(*item)
|
|
||||||
nrpe_compat.add_check(
|
|
||||||
shortname=rabbit.RABBIT_USER + '_queue',
|
|
||||||
description='Check RabbitMQ Queues',
|
|
||||||
check_cmd='{}/check_rabbitmq_queues.py{} {}'.format(
|
|
||||||
NAGIOS_PLUGINS, cmd, STATS_DATAFILE)
|
|
||||||
)
|
|
||||||
if config('management_plugin'):
|
|
||||||
# add NRPE check
|
|
||||||
_check_cmd = (
|
|
||||||
'{}/check_rabbitmq_cluster.py --port {} --user {} --password {}'
|
|
||||||
.format(NAGIOS_PLUGINS, rabbit.get_managment_port(),
|
|
||||||
user, password))
|
|
||||||
nrpe_compat.add_check(
|
|
||||||
shortname=rabbit.RABBIT_USER + '_cluster',
|
|
||||||
description='Check RabbitMQ Cluster',
|
|
||||||
check_cmd=_check_cmd)
|
|
||||||
|
|
||||||
|
rabbit.nrpe_update_queues_check(nrpe_compat, RABBIT_DIR)
|
||||||
|
rabbit.nrpe_update_cluster_check(nrpe_compat, user, password)
|
||||||
nrpe_compat.write()
|
nrpe_compat.write()
|
||||||
|
|
||||||
|
rabbit.remove_nrpe_files()
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('upgrade-charm')
|
@hooks.hook('upgrade-charm')
|
||||||
@harden()
|
@harden()
|
||||||
|
|
|
@ -152,6 +152,14 @@ class UtilsTests(CharmTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(UtilsTests, self).setUp(rabbit_utils,
|
super(UtilsTests, self).setUp(rabbit_utils,
|
||||||
TO_PATCH)
|
TO_PATCH)
|
||||||
|
self.tmp_dir = tempfile.mkdtemp()
|
||||||
|
self.nrpe_compat = mock.MagicMock()
|
||||||
|
self.nrpe_compat.add_check = mock.MagicMock()
|
||||||
|
self.nrpe_compat.remove_check = mock.MagicMock()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
super(UtilsTests, self).tearDown()
|
||||||
|
self.nrpe_compat.reset_mock()
|
||||||
|
|
||||||
@mock.patch("rabbit_utils.log")
|
@mock.patch("rabbit_utils.log")
|
||||||
def test_update_empty_hosts_file(self, mock_log):
|
def test_update_empty_hosts_file(self, mock_log):
|
||||||
|
@ -948,3 +956,264 @@ class UtilsTests(CharmTestCase):
|
||||||
"active",
|
"active",
|
||||||
"message is ignored")
|
"message is ignored")
|
||||||
self.assertEqual(_expected, rabbit_utils.assess_cluster_status())
|
self.assertEqual(_expected, rabbit_utils.assess_cluster_status())
|
||||||
|
|
||||||
|
@mock.patch("rabbit_utils.log")
|
||||||
|
def test_remove_file(self, mock_log):
|
||||||
|
"""test delete existing and non-existent file"""
|
||||||
|
with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
|
||||||
|
rabbit_utils.remove_file(tmpfile.name)
|
||||||
|
mock_log.asset_not_called()
|
||||||
|
|
||||||
|
mock_log.reset_mock()
|
||||||
|
rabbit_utils.remove_file(tmpfile.name)
|
||||||
|
mock_log.assert_has_calls([
|
||||||
|
mock.call('{} file does not exist'.format(tmpfile.name),
|
||||||
|
level='DEBUG')
|
||||||
|
])
|
||||||
|
|
||||||
|
@mock.patch('os.path.isdir')
|
||||||
|
@mock.patch('rabbit_utils.charm_dir')
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
@mock.patch('rabbit_utils.rsync')
|
||||||
|
@mock.patch("rabbit_utils.write_file")
|
||||||
|
def test_sync_nrpe_files(self,
|
||||||
|
mock_write_file,
|
||||||
|
mock_rsync,
|
||||||
|
mock_config,
|
||||||
|
mock_charm_dir,
|
||||||
|
mock_isdir):
|
||||||
|
"""Testing copy the NRPE files"""
|
||||||
|
self.test_config.set('stats_cron_schedule', '*/1 * * * *')
|
||||||
|
self.test_config.set('cron-timeout', '300')
|
||||||
|
self.test_config.unset('management_plugin')
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = self.tmp_dir
|
||||||
|
rabbit_utils.SCRIPTS_DIR = self.tmp_dir
|
||||||
|
rabbit_utils.STATS_CRONFILE = os.path.join(self.tmp_dir, 'cronfile')
|
||||||
|
rabbit_utils.CRONJOB_CMD = '{schedule} {timeout} {command}'
|
||||||
|
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
mock_isdir.return_value = True
|
||||||
|
mock_charm_dir.side_effect = lambda: self.tmp_dir
|
||||||
|
rabbit_utils.sync_nrpe_files()
|
||||||
|
mock_rsync.assert_has_calls([
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'files', 'check_rabbitmq.py'),
|
||||||
|
os.path.join(self.tmp_dir, 'check_rabbitmq.py')),
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'files',
|
||||||
|
'check_rabbitmq_queues.py'),
|
||||||
|
os.path.join(self.tmp_dir, 'check_rabbitmq_queues.py')),
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'files',
|
||||||
|
'collect_rabbitmq_stats.sh'),
|
||||||
|
os.path.join(self.tmp_dir, 'collect_rabbitmq_stats.sh'))
|
||||||
|
])
|
||||||
|
mock_write_file.assert_has_calls([
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'cronfile'),
|
||||||
|
'*/1 * * * * 300 {}/collect_rabbitmq_stats.sh'.format(
|
||||||
|
self.tmp_dir))
|
||||||
|
])
|
||||||
|
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
@mock.patch('rabbit_utils.remove_file')
|
||||||
|
def test_remove_nrpe_files(self, mock_remove_file, mock_config):
|
||||||
|
"""Testing remove the NRPE scripts and the cron file"""
|
||||||
|
self.test_config.unset('stats_cron_schedule')
|
||||||
|
self.test_config.unset('management_plugin')
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = self.tmp_dir
|
||||||
|
rabbit_utils.SCRIPTS_DIR = self.tmp_dir
|
||||||
|
rabbit_utils.STATS_CRONFILE = os.path.join(self.tmp_dir, 'cronfile')
|
||||||
|
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
rabbit_utils.remove_nrpe_files()
|
||||||
|
mock_remove_file.assert_has_calls([
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'cronfile')),
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'collect_rabbitmq_stats.sh')),
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'check_rabbitmq_queues.py')),
|
||||||
|
mock.call(os.path.join(self.tmp_dir, 'check_rabbitmq_cluster.py')),
|
||||||
|
])
|
||||||
|
|
||||||
|
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_hostname')
|
||||||
|
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_unit_name')
|
||||||
|
@mock.patch('rabbit_utils.create_user')
|
||||||
|
@mock.patch('rabbit_utils.get_rabbit_password_on_disk')
|
||||||
|
@mock.patch('rabbit_utils.local_unit')
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
def test_get_nrpe_credentials(self,
|
||||||
|
mock_config,
|
||||||
|
mock_local_unit,
|
||||||
|
mock_get_rabbit_password_on_disk,
|
||||||
|
mock_create_user,
|
||||||
|
mock_get_nagios_unit_name,
|
||||||
|
mock_get_nagios_hostname):
|
||||||
|
"""Testing get the NRPE credentials"""
|
||||||
|
self.test_config.unset('check-vhosts')
|
||||||
|
|
||||||
|
mock_get_nagios_hostname.return_value = "foo-0"
|
||||||
|
mock_get_nagios_unit_name.return_value = "bar-0"
|
||||||
|
mock_local_unit.return_value = 'unit/0'
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
mock_get_rabbit_password_on_disk.return_value = "qwerty"
|
||||||
|
|
||||||
|
nrpe_credentials = rabbit_utils.get_nrpe_credentials()
|
||||||
|
self.assertTupleEqual(nrpe_credentials,
|
||||||
|
('foo-0',
|
||||||
|
'bar-0',
|
||||||
|
[{'vhost': 'nagios-unit-0',
|
||||||
|
'shortname': 'rabbitmq'}],
|
||||||
|
'nagios-unit-0',
|
||||||
|
'qwerty'))
|
||||||
|
|
||||||
|
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.config')
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
def test_nrpe_update_vhost_check(self, mock_config, mock_config2):
|
||||||
|
"""Testing add and remove RabbitMQ non-SSL check"""
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
mock_config2.side_effect = self.test_config
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = self.tmp_dir
|
||||||
|
|
||||||
|
# call with ssl set to 'on'
|
||||||
|
self.test_config.set('ssl', 'on')
|
||||||
|
rabbit_utils.nrpe_update_vhost_check(
|
||||||
|
nrpe_compat=self.nrpe_compat,
|
||||||
|
unit='bar-0',
|
||||||
|
user='nagios-unit-0',
|
||||||
|
password='qwerty',
|
||||||
|
vhost={'vhost': 'nagios-unit-0', 'shortname': 'rabbitmq'})
|
||||||
|
self.nrpe_compat.add_check.assert_called_with(
|
||||||
|
shortname='rabbitmq',
|
||||||
|
description='Check RabbitMQ bar-0 nagios-unit-0',
|
||||||
|
check_cmd='{}/check_rabbitmq.py --user nagios-unit-0 '
|
||||||
|
'--password qwerty '
|
||||||
|
'--vhost nagios-unit-0'.format(self.tmp_dir))
|
||||||
|
self.nrpe_compat.remove_check.assert_not_called()
|
||||||
|
|
||||||
|
self.nrpe_compat.reset_mock()
|
||||||
|
|
||||||
|
# call with ssl set to 'only'
|
||||||
|
self.test_config.set('ssl', 'only')
|
||||||
|
rabbit_utils.nrpe_update_vhost_check(
|
||||||
|
nrpe_compat=self.nrpe_compat,
|
||||||
|
unit='bar-0',
|
||||||
|
user='nagios-unit-0',
|
||||||
|
password='qwerty',
|
||||||
|
vhost={'vhost': 'nagios-unit-0', 'shortname': 'rabbitmq'})
|
||||||
|
self.nrpe_compat.add_check.assert_not_called()
|
||||||
|
self.nrpe_compat.remove_check.assert_called_with(
|
||||||
|
shortname='rabbitmq',
|
||||||
|
description='Remove check RabbitMQ bar-0 nagios-unit-0',
|
||||||
|
check_cmd='{}/check_rabbitmq.py'.format(self.tmp_dir))
|
||||||
|
|
||||||
|
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.config')
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
def test_nrpe_update_vhost_ssl_check(self, mock_config, mock_config2):
|
||||||
|
"""Testing add and remove RabbitMQ SSL check"""
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
mock_config2.side_effect = self.test_config
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = self.tmp_dir
|
||||||
|
|
||||||
|
# call with ssl set to 'on'
|
||||||
|
self.test_config.set('ssl', 'on')
|
||||||
|
rabbit_utils.nrpe_update_vhost_ssl_check(
|
||||||
|
nrpe_compat=self.nrpe_compat,
|
||||||
|
unit='bar-0',
|
||||||
|
user='nagios-unit-0',
|
||||||
|
password='qwerty',
|
||||||
|
vhost={'vhost': 'nagios-unit-0', 'shortname': 'rabbitmq'})
|
||||||
|
self.nrpe_compat.add_check.assert_called_with(
|
||||||
|
shortname='rabbitmq_ssl',
|
||||||
|
description='Check RabbitMQ (SSL) bar-0 nagios-unit-0',
|
||||||
|
check_cmd='{}/check_rabbitmq.py --user nagios-unit-0 '
|
||||||
|
'--password qwerty --vhost nagios-unit-0 --ssl '
|
||||||
|
'--ssl-ca /etc/rabbitmq/rabbit-server-ca.pem '
|
||||||
|
'--port 5671'.format(self.tmp_dir))
|
||||||
|
self.nrpe_compat.remove_check.assert_not_called()
|
||||||
|
|
||||||
|
self.nrpe_compat.reset_mock()
|
||||||
|
|
||||||
|
# call with ssl set to 'off'
|
||||||
|
self.test_config.set('ssl', 'off')
|
||||||
|
rabbit_utils.nrpe_update_vhost_ssl_check(
|
||||||
|
nrpe_compat=self.nrpe_compat,
|
||||||
|
unit='bar-0',
|
||||||
|
user='nagios-unit-0',
|
||||||
|
password='qwerty',
|
||||||
|
vhost={'vhost': 'nagios-unit-0', 'shortname': 'rabbitmq'})
|
||||||
|
self.nrpe_compat.add_check.assert_not_called()
|
||||||
|
self.nrpe_compat.remove_check.assert_called_with(
|
||||||
|
shortname='rabbitmq_ssl',
|
||||||
|
description='Remove check RabbitMQ (SSL) bar-0 nagios-unit-0',
|
||||||
|
check_cmd='{}/check_rabbitmq.py'.format(self.tmp_dir))
|
||||||
|
|
||||||
|
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.config')
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
@mock.patch('rabbit_utils.get_unit_hostname')
|
||||||
|
def test_nrpe_update_queues_check(self,
|
||||||
|
mock_get_unit_hostname,
|
||||||
|
mock_config,
|
||||||
|
mock_config2):
|
||||||
|
"""Testing add and remove RabbitMQ queues check"""
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
mock_config2.side_effect = self.test_config
|
||||||
|
mock_get_unit_hostname.return_value = 'test'
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = self.tmp_dir
|
||||||
|
|
||||||
|
# call with stats_cron_schedule set to '*/5 * * * *'
|
||||||
|
self.test_config.set('stats_cron_schedule', '*/5 * * * *')
|
||||||
|
rabbit_utils.nrpe_update_queues_check(self.nrpe_compat, self.tmp_dir)
|
||||||
|
self.nrpe_compat.add_check.assert_called_with(
|
||||||
|
shortname='rabbitmq_queue',
|
||||||
|
description='Check RabbitMQ Queues',
|
||||||
|
check_cmd='{}/check_rabbitmq_queues.py -c "\\*" "\\*" 100 200 '
|
||||||
|
'{}/data/test_queue_stats.dat'.format(self.tmp_dir,
|
||||||
|
self.tmp_dir))
|
||||||
|
self.nrpe_compat.remove_check.assert_not_called()
|
||||||
|
|
||||||
|
self.nrpe_compat.reset_mock()
|
||||||
|
|
||||||
|
# call with unset stats_cron_schedule
|
||||||
|
self.test_config.unset('stats_cron_schedule')
|
||||||
|
rabbit_utils.nrpe_update_queues_check(self.nrpe_compat, self.tmp_dir)
|
||||||
|
self.nrpe_compat.add_check.assert_not_called()
|
||||||
|
self.nrpe_compat.remove_check.assert_called_with(
|
||||||
|
shortname='rabbitmq_queue',
|
||||||
|
description='Remove check RabbitMQ Queues',
|
||||||
|
check_cmd='{}/check_rabbitmq_queues.py'.format(self.tmp_dir))
|
||||||
|
|
||||||
|
@mock.patch('charmhelpers.contrib.charmsupport.nrpe.config')
|
||||||
|
@mock.patch('rabbit_utils.config')
|
||||||
|
@mock.patch('rabbit_utils.get_managment_port')
|
||||||
|
def test_nrpe_update_cluster_check(self,
|
||||||
|
mock_get_managment_port,
|
||||||
|
mock_config,
|
||||||
|
mock_config2):
|
||||||
|
"""Testing add and remove RabbitMQ cluster check"""
|
||||||
|
mock_config.side_effect = self.test_config
|
||||||
|
mock_config2.side_effect = self.test_config
|
||||||
|
mock_get_managment_port.return_value = '1234'
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = self.tmp_dir
|
||||||
|
|
||||||
|
# call with management_plugin set to True
|
||||||
|
self.test_config.set('management_plugin', True)
|
||||||
|
rabbit_utils.nrpe_update_cluster_check(
|
||||||
|
nrpe_compat=self.nrpe_compat,
|
||||||
|
user='nagios-unit-0',
|
||||||
|
password='qwerty')
|
||||||
|
self.nrpe_compat.add_check.assert_called_with(
|
||||||
|
shortname='rabbitmq_cluster',
|
||||||
|
description='Check RabbitMQ Cluster',
|
||||||
|
check_cmd='{}/check_rabbitmq_cluster.py --port 1234 '
|
||||||
|
'--user nagios-unit-0 --password qwerty'.format(
|
||||||
|
self.tmp_dir))
|
||||||
|
self.nrpe_compat.remove_check.assert_not_called()
|
||||||
|
|
||||||
|
self.nrpe_compat.reset_mock()
|
||||||
|
|
||||||
|
# call with management_plugin set to False
|
||||||
|
self.test_config.set('management_plugin', False)
|
||||||
|
rabbit_utils.nrpe_update_cluster_check(
|
||||||
|
nrpe_compat=self.nrpe_compat,
|
||||||
|
user='nagios-unit-0',
|
||||||
|
password='qwerty')
|
||||||
|
self.nrpe_compat.add_check.assert_not_called()
|
||||||
|
self.nrpe_compat.remove_check.assert_called_with(
|
||||||
|
shortname='rabbitmq_cluster',
|
||||||
|
description='Remove check RabbitMQ Cluster',
|
||||||
|
check_cmd='{}/check_rabbitmq_cluster.py'.format(self.tmp_dir))
|
||||||
|
|
|
@ -307,8 +307,9 @@ class RelationUtil(CharmTestCase):
|
||||||
shutil.rmtree(tmpdir)
|
shutil.rmtree(tmpdir)
|
||||||
|
|
||||||
@patch('rabbit_utils.create_user')
|
@patch('rabbit_utils.create_user')
|
||||||
@patch('rabbitmq_server_relations.local_unit')
|
@patch('rabbit_utils.local_unit')
|
||||||
@patch('charmhelpers.contrib.charmsupport.nrpe.NRPE.add_check')
|
@patch('rabbit_utils.nrpe.NRPE.add_check')
|
||||||
|
@patch('rabbit_utils.nrpe.NRPE.remove_check')
|
||||||
@patch('subprocess.check_call')
|
@patch('subprocess.check_call')
|
||||||
@patch('rabbit_utils.get_rabbit_password_on_disk')
|
@patch('rabbit_utils.get_rabbit_password_on_disk')
|
||||||
@patch('charmhelpers.contrib.charmsupport.nrpe.relation_ids')
|
@patch('charmhelpers.contrib.charmsupport.nrpe.relation_ids')
|
||||||
|
@ -316,10 +317,14 @@ class RelationUtil(CharmTestCase):
|
||||||
@patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_unit_name')
|
@patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_unit_name')
|
||||||
@patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_hostname')
|
@patch('charmhelpers.contrib.charmsupport.nrpe.get_nagios_hostname')
|
||||||
@patch('os.fchown')
|
@patch('os.fchown')
|
||||||
@patch('rabbitmq_server_relations.charm_dir')
|
@patch('rabbit_utils.charm_dir')
|
||||||
@patch('subprocess.check_output')
|
@patch('subprocess.check_output')
|
||||||
@patch('rabbitmq_server_relations.config')
|
@patch('rabbitmq_server_relations.config')
|
||||||
|
@patch('rabbit_utils.config')
|
||||||
|
@patch('rabbit_utils.remove_file')
|
||||||
def test_update_nrpe_checks(self,
|
def test_update_nrpe_checks(self,
|
||||||
|
mock_remove_file,
|
||||||
|
mock_config3,
|
||||||
mock_config,
|
mock_config,
|
||||||
mock_check_output,
|
mock_check_output,
|
||||||
mock_charm_dir, mock_fchown,
|
mock_charm_dir, mock_fchown,
|
||||||
|
@ -327,7 +332,8 @@ class RelationUtil(CharmTestCase):
|
||||||
mock_get_nagios_unit_name, mock_config2,
|
mock_get_nagios_unit_name, mock_config2,
|
||||||
mock_nrpe_relation_ids,
|
mock_nrpe_relation_ids,
|
||||||
mock_get_rabbit_password_on_disk,
|
mock_get_rabbit_password_on_disk,
|
||||||
mock_check_call, mock_add_check,
|
mock_check_call,
|
||||||
|
mock_remove_check, mock_add_check,
|
||||||
mock_local_unit,
|
mock_local_unit,
|
||||||
mock_create_user):
|
mock_create_user):
|
||||||
|
|
||||||
|
@ -336,8 +342,13 @@ class RelationUtil(CharmTestCase):
|
||||||
mock_charm_dir.side_effect = lambda: self.tmp_dir
|
mock_charm_dir.side_effect = lambda: self.tmp_dir
|
||||||
mock_config.side_effect = self.test_config
|
mock_config.side_effect = self.test_config
|
||||||
mock_config2.side_effect = self.test_config
|
mock_config2.side_effect = self.test_config
|
||||||
rabbitmq_server_relations.STATS_CRONFILE = os.path.join(
|
mock_config3.side_effect = self.test_config
|
||||||
self.tmp_dir, "rabbitmq-stats")
|
stats_confile = os.path.join(self.tmp_dir, "rabbitmq-stats")
|
||||||
|
rabbit_utils.STATS_CRONFILE = stats_confile
|
||||||
|
nagios_plugins = os.path.join(self.tmp_dir, "nagios_plugins")
|
||||||
|
rabbit_utils.NAGIOS_PLUGINS = nagios_plugins
|
||||||
|
scripts_dir = os.path.join(self.tmp_dir, "scripts_dir")
|
||||||
|
rabbit_utils.SCRIPTS_DIR = scripts_dir
|
||||||
mock_get_nagios_hostname.return_value = "foo-0"
|
mock_get_nagios_hostname.return_value = "foo-0"
|
||||||
mock_get_nagios_unit_name.return_value = "bar-0"
|
mock_get_nagios_unit_name.return_value = "bar-0"
|
||||||
mock_get_rabbit_password_on_disk.return_value = "qwerty"
|
mock_get_rabbit_password_on_disk.return_value = "qwerty"
|
||||||
|
@ -348,35 +359,66 @@ class RelationUtil(CharmTestCase):
|
||||||
rabbitmq_server_relations.update_nrpe_checks()
|
rabbitmq_server_relations.update_nrpe_checks()
|
||||||
mock_check_output.assert_any_call(
|
mock_check_output.assert_any_call(
|
||||||
['/usr/bin/rsync', '-r', '--delete', '--executability',
|
['/usr/bin/rsync', '-r', '--delete', '--executability',
|
||||||
'%s/files/collect_rabbitmq_stats.sh' % self.tmp_dir,
|
'{}/files/collect_rabbitmq_stats.sh'.format(self.tmp_dir),
|
||||||
'/usr/local/bin/collect_rabbitmq_stats.sh'],
|
'{}/collect_rabbitmq_stats.sh'.format(scripts_dir)],
|
||||||
stderr=subprocess.STDOUT)
|
stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
# regular check on 5672
|
# regular check on 5672
|
||||||
cmd = ('{plugins_dir}/check_rabbitmq.py --user {user} '
|
cmd_5672 = ('{plugins_dir}/check_rabbitmq.py --user {user} '
|
||||||
'--password {password} --vhost {vhost}').format(
|
'--password {password} --vhost {vhost}').format(
|
||||||
plugins_dir=rabbitmq_server_relations.NAGIOS_PLUGINS,
|
plugins_dir=nagios_plugins,
|
||||||
user='nagios-unit-0', vhost='nagios-unit-0',
|
user='nagios-unit-0', vhost='nagios-unit-0',
|
||||||
password='qwerty')
|
password='qwerty')
|
||||||
|
|
||||||
mock_add_check.assert_any_call(
|
mock_add_check.assert_any_call(
|
||||||
shortname=rabbit_utils.RABBIT_USER,
|
shortname=rabbit_utils.RABBIT_USER,
|
||||||
description='Check RabbitMQ {} {}'.format('bar-0',
|
description='Check RabbitMQ {} {}'.format('bar-0',
|
||||||
'nagios-unit-0'),
|
'nagios-unit-0'),
|
||||||
check_cmd=cmd)
|
check_cmd=cmd_5672)
|
||||||
|
|
||||||
# check on ssl port 5671
|
# check on ssl port 5671
|
||||||
cmd = ('{plugins_dir}/check_rabbitmq.py --user {user} '
|
cmd_5671 = ('{plugins_dir}/check_rabbitmq.py --user {user} '
|
||||||
'--password {password} --vhost {vhost} '
|
'--password {password} --vhost {vhost} '
|
||||||
'--ssl --ssl-ca {ssl_ca} --port {port}').format(
|
'--ssl --ssl-ca {ssl_ca} --port {port}').format(
|
||||||
plugins_dir=rabbitmq_server_relations.NAGIOS_PLUGINS,
|
plugins_dir=nagios_plugins,
|
||||||
user='nagios-unit-0',
|
user='nagios-unit-0',
|
||||||
password='qwerty',
|
password='qwerty',
|
||||||
port=int(self.test_config['ssl_port']),
|
port=int(self.test_config['ssl_port']),
|
||||||
vhost='nagios-unit-0',
|
vhost='nagios-unit-0',
|
||||||
ssl_ca=rabbitmq_server_relations.SSL_CA_FILE)
|
ssl_ca=rabbit_utils.SSL_CA_FILE)
|
||||||
mock_add_check.assert_any_call(
|
mock_add_check.assert_any_call(
|
||||||
shortname=rabbit_utils.RABBIT_USER + "_ssl",
|
shortname=rabbit_utils.RABBIT_USER + "_ssl",
|
||||||
description='Check RabbitMQ (SSL) {} {}'.format('bar-0',
|
description='Check RabbitMQ (SSL) {} {}'.format('bar-0',
|
||||||
'nagios-unit-0'),
|
'nagios-unit-0'),
|
||||||
check_cmd=cmd)
|
check_cmd=cmd_5671)
|
||||||
|
|
||||||
|
# test stats_cron_schedule has been removed
|
||||||
|
mock_remove_file.reset_mock()
|
||||||
|
mock_add_check.reset_mock()
|
||||||
|
mock_remove_check.reset_mock()
|
||||||
|
self.test_config.unset('stats_cron_schedule')
|
||||||
|
rabbitmq_server_relations.update_nrpe_checks()
|
||||||
|
mock_remove_file.assert_has_calls([
|
||||||
|
call(stats_confile),
|
||||||
|
call('{}/collect_rabbitmq_stats.sh'.format(scripts_dir)),
|
||||||
|
call('{}/check_rabbitmq_queues.py'.format(nagios_plugins)),
|
||||||
|
call('{}/check_rabbitmq_cluster.py'.format(nagios_plugins))])
|
||||||
|
mock_add_check.assert_has_calls([
|
||||||
|
call(shortname=rabbit_utils.RABBIT_USER,
|
||||||
|
description='Check RabbitMQ {} {}'.format('bar-0',
|
||||||
|
'nagios-unit-0'),
|
||||||
|
check_cmd=cmd_5672),
|
||||||
|
call(shortname=rabbit_utils.RABBIT_USER + "_ssl",
|
||||||
|
description='Check RabbitMQ (SSL) {} {}'.format(
|
||||||
|
'bar-0', 'nagios-unit-0'),
|
||||||
|
check_cmd=cmd_5671),
|
||||||
|
])
|
||||||
|
mock_remove_check.assert_has_calls([
|
||||||
|
call(shortname=rabbit_utils.RABBIT_USER + '_queue',
|
||||||
|
description='Remove check RabbitMQ Queues',
|
||||||
|
check_cmd='{}/check_rabbitmq_queues.py'.format(
|
||||||
|
nagios_plugins)),
|
||||||
|
call(shortname=rabbit_utils.RABBIT_USER + '_cluster',
|
||||||
|
description='Remove check RabbitMQ Cluster',
|
||||||
|
check_cmd='{}/check_rabbitmq_cluster.py'.format(
|
||||||
|
nagios_plugins))])
|
||||||
|
|
|
@ -115,6 +115,9 @@ class TestConfig(object):
|
||||||
raise KeyError
|
raise KeyError
|
||||||
self.config[attr] = value
|
self.config[attr] = value
|
||||||
|
|
||||||
|
def unset(self, attr):
|
||||||
|
self.config.pop(attr)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self.get(key)
|
return self.get(key)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue