Merge lp:~gnuoy/charms/trusty/glance/add-nrpe-checks into lp:~openstack-charmers-archive/charms/trusty/glance/next

Proposed by Liam Young
Status: Merged
Merged at revision: 92
Proposed branch: lp:~gnuoy/charms/trusty/glance/add-nrpe-checks
Merge into: lp:~openstack-charmers-archive/charms/trusty/glance/next
Diff against target: 655 lines (+516/-1)
9 files modified
charm-helpers-hooks.yaml (+1/-0)
config.yaml (+11/-0)
hooks/charmhelpers/contrib/charmsupport/nrpe.py (+308/-0)
hooks/charmhelpers/contrib/charmsupport/volumes.py (+159/-0)
hooks/charmhelpers/contrib/openstack/utils.py (+6/-0)
hooks/charmhelpers/fetch/__init__.py (+8/-1)
hooks/glance_relations.py (+19/-0)
metadata.yaml (+3/-0)
unit_tests/test_glance_relations.py (+1/-0)
To merge this branch: bzr merge lp:~gnuoy/charms/trusty/glance/add-nrpe-checks
Reviewer Review Type Date Requested Status
Liam Young (community) Approve
Review via email: mp+246151@code.launchpad.net

Description of the change

Add nrpe support. Based on branch from bradm with a few tweaks

To post a comment you must log in.
Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_lint_check #672 glance-next for gnuoy mp246151
    LINT OK: passed

Build: http://10.245.162.77:8080/job/charm_lint_check/672/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_unit_test #701 glance-next for gnuoy mp246151
    UNIT OK: passed

Build: http://10.245.162.77:8080/job/charm_unit_test/701/

Revision history for this message
uosci-testing-bot (uosci-testing-bot) wrote :

charm_amulet_test #857 glance-next for gnuoy mp246151
    AMULET OK: passed

Build: http://10.245.162.77:8080/job/charm_amulet_test/857/

Revision history for this message
Liam Young (gnuoy) wrote :

<jamespage> gnuoy, as they are re-syncs + tweaks to the nrpe stuff in the charms, I'm happy to give a conditional +1 across the board based on osci checking things out OK
<gnuoy> jamespage, I'll take that! thanks
...
<gnuoy> jamespage, osci is still working through. But on the subject of those mps, does your +1 stand for branches with no amulet tests?
<jamespage> gnuoy, yes

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'charm-helpers-hooks.yaml'
--- charm-helpers-hooks.yaml 2014-12-19 09:30:16 +0000
+++ charm-helpers-hooks.yaml 2015-01-12 14:00:01 +0000
@@ -9,3 +9,4 @@
9 - payload.execd9 - payload.execd
10 - contrib.network.ip10 - contrib.network.ip
11 - contrib.python.packages11 - contrib.python.packages
12 - contrib.charmsupport
1213
=== modified file 'config.yaml'
--- config.yaml 2014-12-15 09:17:53 +0000
+++ config.yaml 2015-01-12 14:00:01 +0000
@@ -167,3 +167,14 @@
167 The CPU core multiplier to use when configuring worker processes for167 The CPU core multiplier to use when configuring worker processes for
168 Glance. By default, the number of workers for each daemon is set to168 Glance. By default, the number of workers for each daemon is set to
169 twice the number of CPU cores a service unit has.169 twice the number of CPU cores a service unit has.
170 nagios_context:
171 default: "juju"
172 type: string
173 description: |
174 Used by the nrpe-external-master subordinate charm.
175 A string that will be prepended to instance name to set the host name
176 in nagios. So for instance the hostname would be something like:
177 juju-myservice-0
178 If you're running multiple environments with the same services in them
179 this allows you to differentiate between them.
180
170181
=== added directory 'files'
=== added directory 'hooks/charmhelpers/contrib/charmsupport'
=== added file 'hooks/charmhelpers/contrib/charmsupport/__init__.py'
=== added file 'hooks/charmhelpers/contrib/charmsupport/nrpe.py'
--- hooks/charmhelpers/contrib/charmsupport/nrpe.py 1970-01-01 00:00:00 +0000
+++ hooks/charmhelpers/contrib/charmsupport/nrpe.py 2015-01-12 14:00:01 +0000
@@ -0,0 +1,308 @@
1"""Compatibility with the nrpe-external-master charm"""
2# Copyright 2012 Canonical Ltd.
3#
4# Authors:
5# Matthew Wedgwood <matthew.wedgwood@canonical.com>
6
7import subprocess
8import pwd
9import grp
10import os
11import re
12import shlex
13import yaml
14
15from charmhelpers.core.hookenv import (
16 config,
17 local_unit,
18 log,
19 relation_ids,
20 relation_set,
21 relations_of_type,
22)
23
24from charmhelpers.core.host import service
25
26# This module adds compatibility with the nrpe-external-master and plain nrpe
27# subordinate charms. To use it in your charm:
28#
29# 1. Update metadata.yaml
30#
31# provides:
32# (...)
33# nrpe-external-master:
34# interface: nrpe-external-master
35# scope: container
36#
37# and/or
38#
39# provides:
40# (...)
41# local-monitors:
42# interface: local-monitors
43# scope: container
44
45#
46# 2. Add the following to config.yaml
47#
48# nagios_context:
49# default: "juju"
50# type: string
51# description: |
52# Used by the nrpe subordinate charms.
53# A string that will be prepended to instance name to set the host name
54# in nagios. So for instance the hostname would be something like:
55# juju-myservice-0
56# If you're running multiple environments with the same services in them
57# this allows you to differentiate between them.
58# nagios_servicegroups:
59# default: ""
60# type: string
61# description: |
62# A comma-separated list of nagios servicegroups.
63# If left empty, the nagios_context will be used as the servicegroup
64#
65# 3. Add custom checks (Nagios plugins) to files/nrpe-external-master
66#
67# 4. Update your hooks.py with something like this:
68#
69# from charmsupport.nrpe import NRPE
70# (...)
71# def update_nrpe_config():
72# nrpe_compat = NRPE()
73# nrpe_compat.add_check(
74# shortname = "myservice",
75# description = "Check MyService",
76# check_cmd = "check_http -w 2 -c 10 http://localhost"
77# )
78# nrpe_compat.add_check(
79# "myservice_other",
80# "Check for widget failures",
81# check_cmd = "/srv/myapp/scripts/widget_check"
82# )
83# nrpe_compat.write()
84#
85# def config_changed():
86# (...)
87# update_nrpe_config()
88#
89# def nrpe_external_master_relation_changed():
90# update_nrpe_config()
91#
92# def local_monitors_relation_changed():
93# update_nrpe_config()
94#
95# 5. ln -s hooks.py nrpe-external-master-relation-changed
96# ln -s hooks.py local-monitors-relation-changed
97
98
99class CheckException(Exception):
100 pass
101
102
103class Check(object):
104 shortname_re = '[A-Za-z0-9-_]+$'
105 service_template = ("""
106#---------------------------------------------------
107# This file is Juju managed
108#---------------------------------------------------
109define service {{
110 use active-service
111 host_name {nagios_hostname}
112 service_description {nagios_hostname}[{shortname}] """
113 """{description}
114 check_command check_nrpe!{command}
115 servicegroups {nagios_servicegroup}
116}}
117""")
118
119 def __init__(self, shortname, description, check_cmd):
120 super(Check, self).__init__()
121 # XXX: could be better to calculate this from the service name
122 if not re.match(self.shortname_re, shortname):
123 raise CheckException("shortname must match {}".format(
124 Check.shortname_re))
125 self.shortname = shortname
126 self.command = "check_{}".format(shortname)
127 # Note: a set of invalid characters is defined by the
128 # Nagios server config
129 # The default is: illegal_object_name_chars=`~!$%^&*"|'<>?,()=
130 self.description = description
131 self.check_cmd = self._locate_cmd(check_cmd)
132
133 def _locate_cmd(self, check_cmd):
134 search_path = (
135 '/usr/lib/nagios/plugins',
136 '/usr/local/lib/nagios/plugins',
137 )
138 parts = shlex.split(check_cmd)
139 for path in search_path:
140 if os.path.exists(os.path.join(path, parts[0])):
141 command = os.path.join(path, parts[0])
142 if len(parts) > 1:
143 command += " " + " ".join(parts[1:])
144 return command
145 log('Check command not found: {}'.format(parts[0]))
146 return ''
147
148 def write(self, nagios_context, hostname, nagios_servicegroups=None):
149 nrpe_check_file = '/etc/nagios/nrpe.d/{}.cfg'.format(
150 self.command)
151 with open(nrpe_check_file, 'w') as nrpe_check_config:
152 nrpe_check_config.write("# check {}\n".format(self.shortname))
153 nrpe_check_config.write("command[{}]={}\n".format(
154 self.command, self.check_cmd))
155
156 if not os.path.exists(NRPE.nagios_exportdir):
157 log('Not writing service config as {} is not accessible'.format(
158 NRPE.nagios_exportdir))
159 else:
160 self.write_service_config(nagios_context, hostname,
161 nagios_servicegroups)
162
163 def write_service_config(self, nagios_context, hostname,
164 nagios_servicegroups=None):
165 for f in os.listdir(NRPE.nagios_exportdir):
166 if re.search('.*{}.cfg'.format(self.command), f):
167 os.remove(os.path.join(NRPE.nagios_exportdir, f))
168
169 if not nagios_servicegroups:
170 nagios_servicegroups = nagios_context
171
172 templ_vars = {
173 'nagios_hostname': hostname,
174 'nagios_servicegroup': nagios_servicegroups,
175 'description': self.description,
176 'shortname': self.shortname,
177 'command': self.command,
178 }
179 nrpe_service_text = Check.service_template.format(**templ_vars)
180 nrpe_service_file = '{}/service__{}_{}.cfg'.format(
181 NRPE.nagios_exportdir, hostname, self.command)
182 with open(nrpe_service_file, 'w') as nrpe_service_config:
183 nrpe_service_config.write(str(nrpe_service_text))
184
185 def run(self):
186 subprocess.call(self.check_cmd)
187
188
189class NRPE(object):
190 nagios_logdir = '/var/log/nagios'
191 nagios_exportdir = '/var/lib/nagios/export'
192 nrpe_confdir = '/etc/nagios/nrpe.d'
193
194 def __init__(self, hostname=None):
195 super(NRPE, self).__init__()
196 self.config = config()
197 self.nagios_context = self.config['nagios_context']
198 if 'nagios_servicegroups' in self.config:
199 self.nagios_servicegroups = self.config['nagios_servicegroups']
200 else:
201 self.nagios_servicegroups = 'juju'
202 self.unit_name = local_unit().replace('/', '-')
203 if hostname:
204 self.hostname = hostname
205 else:
206 self.hostname = "{}-{}".format(self.nagios_context, self.unit_name)
207 self.checks = []
208
209 def add_check(self, *args, **kwargs):
210 self.checks.append(Check(*args, **kwargs))
211
212 def write(self):
213 try:
214 nagios_uid = pwd.getpwnam('nagios').pw_uid
215 nagios_gid = grp.getgrnam('nagios').gr_gid
216 except:
217 log("Nagios user not set up, nrpe checks not updated")
218 return
219
220 if not os.path.exists(NRPE.nagios_logdir):
221 os.mkdir(NRPE.nagios_logdir)
222 os.chown(NRPE.nagios_logdir, nagios_uid, nagios_gid)
223
224 nrpe_monitors = {}
225 monitors = {"monitors": {"remote": {"nrpe": nrpe_monitors}}}
226 for nrpecheck in self.checks:
227 nrpecheck.write(self.nagios_context, self.hostname,
228 self.nagios_servicegroups)
229 nrpe_monitors[nrpecheck.shortname] = {
230 "command": nrpecheck.command,
231 }
232
233 service('restart', 'nagios-nrpe-server')
234
235 for rid in relation_ids("local-monitors"):
236 relation_set(relation_id=rid, monitors=yaml.dump(monitors))
237
238
239def get_nagios_hostcontext(relation_name='nrpe-external-master'):
240 """
241 Query relation with nrpe subordinate, return the nagios_host_context
242
243 :param str relation_name: Name of relation nrpe sub joined to
244 """
245 for rel in relations_of_type(relation_name):
246 if 'nagios_hostname' in rel:
247 return rel['nagios_host_context']
248
249
250def get_nagios_hostname(relation_name='nrpe-external-master'):
251 """
252 Query relation with nrpe subordinate, return the nagios_hostname
253
254 :param str relation_name: Name of relation nrpe sub joined to
255 """
256 for rel in relations_of_type(relation_name):
257 if 'nagios_hostname' in rel:
258 return rel['nagios_hostname']
259
260
261def get_nagios_unit_name(relation_name='nrpe-external-master'):
262 """
263 Return the nagios unit name prepended with host_context if needed
264
265 :param str relation_name: Name of relation nrpe sub joined to
266 """
267 host_context = get_nagios_hostcontext(relation_name)
268 if host_context:
269 unit = "%s:%s" % (host_context, local_unit())
270 else:
271 unit = local_unit()
272 return unit
273
274
275def add_init_service_checks(nrpe, services, unit_name):
276 """
277 Add checks for each service in list
278
279 :param NRPE nrpe: NRPE object to add check to
280 :param list services: List of services to check
281 :param str unit_name: Unit name to use in check description
282 """
283 for svc in services:
284 upstart_init = '/etc/init/%s.conf' % svc
285 sysv_init = '/etc/init.d/%s' % svc
286 if os.path.exists(upstart_init):
287 nrpe.add_check(
288 shortname=svc,
289 description='process check {%s}' % unit_name,
290 check_cmd='check_upstart_job %s' % svc
291 )
292 elif os.path.exists(sysv_init):
293 cronpath = '/etc/cron.d/nagios-service-check-%s' % svc
294 cron_file = ('*/5 * * * * root '
295 '/usr/local/lib/nagios/plugins/check_exit_status.pl '
296 '-s /etc/init.d/%s status > '
297 '/var/lib/nagios/service-check-%s.txt\n' % (svc,
298 svc)
299 )
300 f = open(cronpath, 'w')
301 f.write(cron_file)
302 f.close()
303 nrpe.add_check(
304 shortname=svc,
305 description='process check {%s}' % unit_name,
306 check_cmd='check_status_file.py -f '
307 '/var/lib/nagios/service-check-%s.txt' % svc,
308 )
0309
=== added file 'hooks/charmhelpers/contrib/charmsupport/volumes.py'
--- hooks/charmhelpers/contrib/charmsupport/volumes.py 1970-01-01 00:00:00 +0000
+++ hooks/charmhelpers/contrib/charmsupport/volumes.py 2015-01-12 14:00:01 +0000
@@ -0,0 +1,159 @@
1'''
2Functions for managing volumes in juju units. One volume is supported per unit.
3Subordinates may have their own storage, provided it is on its own partition.
4
5Configuration stanzas::
6
7 volume-ephemeral:
8 type: boolean
9 default: true
10 description: >
11 If false, a volume is mounted as sepecified in "volume-map"
12 If true, ephemeral storage will be used, meaning that log data
13 will only exist as long as the machine. YOU HAVE BEEN WARNED.
14 volume-map:
15 type: string
16 default: {}
17 description: >
18 YAML map of units to device names, e.g:
19 "{ rsyslog/0: /dev/vdb, rsyslog/1: /dev/vdb }"
20 Service units will raise a configure-error if volume-ephemeral
21 is 'true' and no volume-map value is set. Use 'juju set' to set a
22 value and 'juju resolved' to complete configuration.
23
24Usage::
25
26 from charmsupport.volumes import configure_volume, VolumeConfigurationError
27 from charmsupport.hookenv import log, ERROR
28 def post_mount_hook():
29 stop_service('myservice')
30 def post_mount_hook():
31 start_service('myservice')
32
33 if __name__ == '__main__':
34 try:
35 configure_volume(before_change=pre_mount_hook,
36 after_change=post_mount_hook)
37 except VolumeConfigurationError:
38 log('Storage could not be configured', ERROR)
39
40'''
41
42# XXX: Known limitations
43# - fstab is neither consulted nor updated
44
45import os
46from charmhelpers.core import hookenv
47from charmhelpers.core import host
48import yaml
49
50
51MOUNT_BASE = '/srv/juju/volumes'
52
53
54class VolumeConfigurationError(Exception):
55 '''Volume configuration data is missing or invalid'''
56 pass
57
58
59def get_config():
60 '''Gather and sanity-check volume configuration data'''
61 volume_config = {}
62 config = hookenv.config()
63
64 errors = False
65
66 if config.get('volume-ephemeral') in (True, 'True', 'true', 'Yes', 'yes'):
67 volume_config['ephemeral'] = True
68 else:
69 volume_config['ephemeral'] = False
70
71 try:
72 volume_map = yaml.safe_load(config.get('volume-map', '{}'))
73 except yaml.YAMLError as e:
74 hookenv.log("Error parsing YAML volume-map: {}".format(e),
75 hookenv.ERROR)
76 errors = True
77 if volume_map is None:
78 # probably an empty string
79 volume_map = {}
80 elif not isinstance(volume_map, dict):
81 hookenv.log("Volume-map should be a dictionary, not {}".format(
82 type(volume_map)))
83 errors = True
84
85 volume_config['device'] = volume_map.get(os.environ['JUJU_UNIT_NAME'])
86 if volume_config['device'] and volume_config['ephemeral']:
87 # asked for ephemeral storage but also defined a volume ID
88 hookenv.log('A volume is defined for this unit, but ephemeral '
89 'storage was requested', hookenv.ERROR)
90 errors = True
91 elif not volume_config['device'] and not volume_config['ephemeral']:
92 # asked for permanent storage but did not define volume ID
93 hookenv.log('Ephemeral storage was requested, but there is no volume '
94 'defined for this unit.', hookenv.ERROR)
95 errors = True
96
97 unit_mount_name = hookenv.local_unit().replace('/', '-')
98 volume_config['mountpoint'] = os.path.join(MOUNT_BASE, unit_mount_name)
99
100 if errors:
101 return None
102 return volume_config
103
104
105def mount_volume(config):
106 if os.path.exists(config['mountpoint']):
107 if not os.path.isdir(config['mountpoint']):
108 hookenv.log('Not a directory: {}'.format(config['mountpoint']))
109 raise VolumeConfigurationError()
110 else:
111 host.mkdir(config['mountpoint'])
112 if os.path.ismount(config['mountpoint']):
113 unmount_volume(config)
114 if not host.mount(config['device'], config['mountpoint'], persist=True):
115 raise VolumeConfigurationError()
116
117
118def unmount_volume(config):
119 if os.path.ismount(config['mountpoint']):
120 if not host.umount(config['mountpoint'], persist=True):
121 raise VolumeConfigurationError()
122
123
124def managed_mounts():
125 '''List of all mounted managed volumes'''
126 return filter(lambda mount: mount[0].startswith(MOUNT_BASE), host.mounts())
127
128
129def configure_volume(before_change=lambda: None, after_change=lambda: None):
130 '''Set up storage (or don't) according to the charm's volume configuration.
131 Returns the mount point or "ephemeral". before_change and after_change
132 are optional functions to be called if the volume configuration changes.
133 '''
134
135 config = get_config()
136 if not config:
137 hookenv.log('Failed to read volume configuration', hookenv.CRITICAL)
138 raise VolumeConfigurationError()
139
140 if config['ephemeral']:
141 if os.path.ismount(config['mountpoint']):
142 before_change()
143 unmount_volume(config)
144 after_change()
145 return 'ephemeral'
146 else:
147 # persistent storage
148 if os.path.ismount(config['mountpoint']):
149 mounts = dict(managed_mounts())
150 if mounts.get(config['mountpoint']) != config['device']:
151 before_change()
152 unmount_volume(config)
153 mount_volume(config)
154 after_change()
155 else:
156 before_change()
157 mount_volume(config)
158 after_change()
159 return config['mountpoint']
0160
=== modified file 'hooks/charmhelpers/contrib/openstack/utils.py'
--- hooks/charmhelpers/contrib/openstack/utils.py 2014-12-19 09:30:16 +0000
+++ hooks/charmhelpers/contrib/openstack/utils.py 2015-01-12 14:00:01 +0000
@@ -53,6 +53,7 @@
53 ('saucy', 'havana'),53 ('saucy', 'havana'),
54 ('trusty', 'icehouse'),54 ('trusty', 'icehouse'),
55 ('utopic', 'juno'),55 ('utopic', 'juno'),
56 ('vivid', 'kilo'),
56])57])
5758
5859
@@ -64,6 +65,7 @@
64 ('2013.2', 'havana'),65 ('2013.2', 'havana'),
65 ('2014.1', 'icehouse'),66 ('2014.1', 'icehouse'),
66 ('2014.2', 'juno'),67 ('2014.2', 'juno'),
68 ('2015.1', 'kilo'),
67])69])
6870
69# The ugly duckling71# The ugly duckling
@@ -84,6 +86,7 @@
84 ('2.0.0', 'juno'),86 ('2.0.0', 'juno'),
85 ('2.1.0', 'juno'),87 ('2.1.0', 'juno'),
86 ('2.2.0', 'juno'),88 ('2.2.0', 'juno'),
89 ('2.2.1', 'kilo'),
87])90])
8891
89DEFAULT_LOOPBACK_SIZE = '5G'92DEFAULT_LOOPBACK_SIZE = '5G'
@@ -289,6 +292,9 @@
289 'juno': 'trusty-updates/juno',292 'juno': 'trusty-updates/juno',
290 'juno/updates': 'trusty-updates/juno',293 'juno/updates': 'trusty-updates/juno',
291 'juno/proposed': 'trusty-proposed/juno',294 'juno/proposed': 'trusty-proposed/juno',
295 'kilo': 'trusty-updates/kilo',
296 'kilo/updates': 'trusty-updates/kilo',
297 'kilo/proposed': 'trusty-proposed/kilo',
292 }298 }
293299
294 try:300 try:
295301
=== modified file 'hooks/charmhelpers/fetch/__init__.py'
--- hooks/charmhelpers/fetch/__init__.py 2014-12-19 09:30:16 +0000
+++ hooks/charmhelpers/fetch/__init__.py 2015-01-12 14:00:01 +0000
@@ -64,9 +64,16 @@
64 'trusty-juno/updates': 'trusty-updates/juno',64 'trusty-juno/updates': 'trusty-updates/juno',
65 'trusty-updates/juno': 'trusty-updates/juno',65 'trusty-updates/juno': 'trusty-updates/juno',
66 'juno/proposed': 'trusty-proposed/juno',66 'juno/proposed': 'trusty-proposed/juno',
67 'juno/proposed': 'trusty-proposed/juno',
68 'trusty-juno/proposed': 'trusty-proposed/juno',67 'trusty-juno/proposed': 'trusty-proposed/juno',
69 'trusty-proposed/juno': 'trusty-proposed/juno',68 'trusty-proposed/juno': 'trusty-proposed/juno',
69 # Kilo
70 'kilo': 'trusty-updates/kilo',
71 'trusty-kilo': 'trusty-updates/kilo',
72 'trusty-kilo/updates': 'trusty-updates/kilo',
73 'trusty-updates/kilo': 'trusty-updates/kilo',
74 'kilo/proposed': 'trusty-proposed/kilo',
75 'trusty-kilo/proposed': 'trusty-proposed/kilo',
76 'trusty-proposed/kilo': 'trusty-proposed/kilo',
70}77}
7178
72# The order of this list is very important. Handlers should be listed in from79# The order of this list is very important. Handlers should be listed in from
7380
=== modified file 'hooks/glance_relations.py'
--- hooks/glance_relations.py 2014-12-15 10:48:33 +0000
+++ hooks/glance_relations.py 2015-01-12 14:00:01 +0000
@@ -10,6 +10,7 @@
10 migrate_database,10 migrate_database,
11 register_configs,11 register_configs,
12 restart_map,12 restart_map,
13 services,
13 CLUSTER_RES,14 CLUSTER_RES,
14 PACKAGES,15 PACKAGES,
15 SERVICES,16 SERVICES,
@@ -80,6 +81,8 @@
80from charmhelpers.contrib.openstack.context import (81from charmhelpers.contrib.openstack.context import (
81 ADDRESS_TYPES82 ADDRESS_TYPES
82)83)
84from charmhelpers.contrib.charmsupport import nrpe
85
8386
84hooks = Hooks()87hooks = Hooks()
85CONFIGS = register_configs()88CONFIGS = register_configs()
@@ -312,6 +315,8 @@
312 open_port(9292)315 open_port(9292)
313 configure_https()316 configure_https()
314317
318 update_nrpe_config()
319
315 # Pickup and changes due to network reference architecture320 # Pickup and changes due to network reference architecture
316 # configuration321 # configuration
317 [keystone_joined(rid) for rid in relation_ids('identity-service')]322 [keystone_joined(rid) for rid in relation_ids('identity-service')]
@@ -349,6 +354,7 @@
349def upgrade_charm():354def upgrade_charm():
350 apt_install(filter_installed_packages(PACKAGES), fatal=True)355 apt_install(filter_installed_packages(PACKAGES), fatal=True)
351 configure_https()356 configure_https()
357 update_nrpe_config()
352 CONFIGS.write_all()358 CONFIGS.write_all()
353359
354360
@@ -461,6 +467,19 @@
461 return467 return
462 CONFIGS.write(GLANCE_API_CONF)468 CONFIGS.write(GLANCE_API_CONF)
463469
470
471@hooks.hook('nrpe-external-master-relation-joined',
472 'nrpe-external-master-relation-changed')
473def update_nrpe_config():
474 # python-dbus is used by check_upstart_job
475 apt_install('python-dbus')
476 hostname = nrpe.get_nagios_hostname()
477 current_unit = nrpe.get_nagios_unit_name()
478 nrpe_setup = nrpe.NRPE(hostname=hostname)
479 nrpe.add_init_service_checks(nrpe_setup, services(), current_unit)
480 nrpe_setup.write()
481
482
464if __name__ == '__main__':483if __name__ == '__main__':
465 try:484 try:
466 hooks.execute(sys.argv)485 hooks.execute(sys.argv)
467486
=== added symlink 'hooks/nrpe-external-master-relation-changed'
=== target is u'glance_relations.py'
=== added symlink 'hooks/nrpe-external-master-relation-joined'
=== target is u'glance_relations.py'
=== modified file 'metadata.yaml'
--- metadata.yaml 2014-09-11 07:05:30 +0000
+++ metadata.yaml 2015-01-12 14:00:01 +0000
@@ -9,6 +9,9 @@
9categories:9categories:
10 - miscellaneous10 - miscellaneous
11provides:11provides:
12 nrpe-external-master:
13 interface: nrpe-external-master
14 scope: container
12 image-service:15 image-service:
13 interface: glance16 interface: glance
14requires:17requires:
1518
=== modified file 'unit_tests/test_glance_relations.py'
--- unit_tests/test_glance_relations.py 2014-12-17 18:06:08 +0000
+++ unit_tests/test_glance_relations.py 2015-01-12 14:00:01 +0000
@@ -52,6 +52,7 @@
52 'migrate_database',52 'migrate_database',
53 'ensure_ceph_keyring',53 'ensure_ceph_keyring',
54 'ceph_config_file',54 'ceph_config_file',
55 'update_nrpe_config',
55 # other56 # other
56 'call',57 'call',
57 'check_call',58 'check_call',

Subscribers

People subscribed via source and target branches