Account for ssl port monitoring.
Ensure usage of upstream ceilometer-agent-central ocf (monitors amqp port). Note: previous versions unintentionally used a modified version of the ocf resource file which monitored keystone connections.
This commit is contained in:
@@ -13,6 +13,7 @@ from charmhelpers.core.hookenv import (
|
|||||||
relation_get,
|
relation_get,
|
||||||
relation_set,
|
relation_set,
|
||||||
relation_ids,
|
relation_ids,
|
||||||
|
related_units,
|
||||||
config,
|
config,
|
||||||
Hooks, UnregisteredHookError,
|
Hooks, UnregisteredHookError,
|
||||||
log,
|
log,
|
||||||
@@ -166,6 +167,16 @@ def ha_joined():
|
|||||||
'res_ceilometer_agent_central': 'op monitor interval="30s"'
|
'res_ceilometer_agent_central': 'op monitor interval="30s"'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amqp_ssl_port = None
|
||||||
|
for rel_id in relation_ids('amqp'):
|
||||||
|
for unit in related_units(rel_id):
|
||||||
|
amqp_ssl_port = relation_get('ssl_port', unit, rel_id)
|
||||||
|
|
||||||
|
if amqp_ssl_port:
|
||||||
|
params = ('params amqp_server_port="%s" op monitor interval="30s"' %
|
||||||
|
(amqp_ssl_port))
|
||||||
|
resource_params['res_ceilometer_agent_central'] = params
|
||||||
|
|
||||||
vip_group = []
|
vip_group = []
|
||||||
for vip in cluster_config['vip'].split():
|
for vip in cluster_config['vip'].split():
|
||||||
res_ceilometer_vip = 'ocf:heartbeat:IPaddr2'
|
res_ceilometer_vip = 'ocf:heartbeat:IPaddr2'
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
# OCF_RESKEY_user
|
# OCF_RESKEY_user
|
||||||
# OCF_RESKEY_pid
|
# OCF_RESKEY_pid
|
||||||
# OCF_RESKEY_monitor_binary
|
# OCF_RESKEY_monitor_binary
|
||||||
# OCF_RESKEY_keystone_server_port
|
# OCF_RESKEY_amqp_server_port
|
||||||
# OCF_RESKEY_additional_parameters
|
# OCF_RESKEY_additional_parameters
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# Initialization:
|
# Initialization:
|
||||||
@@ -36,13 +36,13 @@ OCF_RESKEY_binary_default="ceilometer-agent-central"
|
|||||||
OCF_RESKEY_config_default="/etc/ceilometer/ceilometer.conf"
|
OCF_RESKEY_config_default="/etc/ceilometer/ceilometer.conf"
|
||||||
OCF_RESKEY_user_default="ceilometer"
|
OCF_RESKEY_user_default="ceilometer"
|
||||||
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
|
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
|
||||||
OCF_RESKEY_keystone_server_port_default="5000"
|
OCF_RESKEY_amqp_server_port_default="5672"
|
||||||
|
|
||||||
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
|
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
|
||||||
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
|
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
|
||||||
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
|
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
|
||||||
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
|
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
|
||||||
: ${OCF_RESKEY_keystone_server_port=${OCF_RESKEY_keystone_server_port_default}}
|
: ${OCF_RESKEY_amqp_server_port=${OCF_RESKEY_amqp_server_port_default}}
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
|
|
||||||
@@ -109,12 +109,12 @@ The pid file to use for this OpenStack Ceilometer Central Agent Service (ceilome
|
|||||||
<content type="string" default="${OCF_RESKEY_pid_default}" />
|
<content type="string" default="${OCF_RESKEY_pid_default}" />
|
||||||
</parameter>
|
</parameter>
|
||||||
|
|
||||||
<parameter name="keystone_server_port" unique="0" required="0">
|
<parameter name="amqp_server_port" unique="0" required="0">
|
||||||
<longdesc lang="en">
|
<longdesc lang="en">
|
||||||
The listening port number of the keystone server. Use for monitoring purposes
|
The listening port number of the AMQP server. Use for monitoring purposes
|
||||||
</longdesc>
|
</longdesc>
|
||||||
<shortdesc lang="en">keystone listening port</shortdesc>
|
<shortdesc lang="en">AMQP listening port</shortdesc>
|
||||||
<content type="integer" default="${OCF_RESKEY_keystone_server_port_default}" />
|
<content type="integer" default="${OCF_RESKEY_amqp_server_port_default}" />
|
||||||
</parameter>
|
</parameter>
|
||||||
|
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ ceilometer_agent_central_validate() {
|
|||||||
|
|
||||||
check_binary $OCF_RESKEY_binary
|
check_binary $OCF_RESKEY_binary
|
||||||
check_binary netstat
|
check_binary netstat
|
||||||
ceilometer_agent_central_check_port $OCF_RESKEY_keystone_server_port
|
ceilometer_agent_central_check_port $OCF_RESKEY_amqp_server_port
|
||||||
|
|
||||||
# A config file on shared storage that is not available
|
# A config file on shared storage that is not available
|
||||||
# during probes is OK.
|
# during probes is OK.
|
||||||
@@ -213,7 +213,7 @@ ceilometer_agent_central_status() {
|
|||||||
ceilometer_agent_central_monitor() {
|
ceilometer_agent_central_monitor() {
|
||||||
local rc
|
local rc
|
||||||
local pid
|
local pid
|
||||||
local scheduler_keystone_check
|
local scheduler_amqp_check
|
||||||
|
|
||||||
ceilometer_agent_central_status
|
ceilometer_agent_central_status
|
||||||
rc=$?
|
rc=$?
|
||||||
@@ -225,13 +225,13 @@ ceilometer_agent_central_monitor() {
|
|||||||
|
|
||||||
# Check the connections according to the PID.
|
# Check the connections according to the PID.
|
||||||
# We are sure to hit the scheduler process and not other Cinder process with the same connection behavior (for example cinder-api)
|
# We are sure to hit the scheduler process and not other Cinder process with the same connection behavior (for example cinder-api)
|
||||||
pid=`cat $OCF_RESKEY_pid`
|
pid=`cat $OCF_RESKEY_pid`
|
||||||
scheduler_keystone_check=`netstat -punt | grep -s "$OCF_RESKEY_keystone_server_port" | grep -s "$pid" | grep -qs "ESTABLISHED"`
|
scheduler_amqp_check=`netstat -punt | grep -s "$OCF_RESKEY_amqp_server_port" | grep -s "$pid" | grep -qs "ESTABLISHED"`
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
ocf_log err "Central Agent is not connected to the Keystone server : $rc"
|
ocf_log err "Central Agent is not connected to the AMQP server : $rc"
|
||||||
return $OCF_NOT_RUNNING
|
return $OCF_NOT_RUNNING
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ocf_log debug "OpenStack Ceilometer Central Agent (ceilometer-agent-central) monitor succeeded"
|
ocf_log debug "OpenStack Ceilometer Central Agent (ceilometer-agent-central) monitor succeeded"
|
||||||
return $OCF_SUCCESS
|
return $OCF_SUCCESS
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[nosetests]
|
[nosetests]
|
||||||
verbosity=1
|
verbosity=2
|
||||||
with-coverage=1
|
with-coverage=1
|
||||||
cover-erase=1
|
cover-erase=1
|
||||||
cover-package=hooks
|
cover-package=hooks
|
||||||
|
|||||||
@@ -228,6 +228,76 @@ class CeilometerHooksTest(CharmTestCase):
|
|||||||
hooks.hooks.execute(['hooks/ha-relation-joined'])
|
hooks.hooks.execute(['hooks/ha-relation-joined'])
|
||||||
self.assertEquals(self.relation_set.call_count, 2)
|
self.assertEquals(self.relation_set.call_count, 2)
|
||||||
|
|
||||||
|
exp_resources = {
|
||||||
|
'res_ceilometer_haproxy': 'lsb:haproxy',
|
||||||
|
'res_ceilometer_agent_central': ('ocf:openstack:'
|
||||||
|
'ceilometer-agent-central'),
|
||||||
|
'res_ceilometer_eth0_vip': 'ocf:heartbeat:IPaddr2'
|
||||||
|
}
|
||||||
|
exp_resource_params = {
|
||||||
|
'res_ceilometer_haproxy': 'op monitor interval="5s"',
|
||||||
|
'res_ceilometer_agent_central': 'op monitor interval="30s"',
|
||||||
|
'res_ceilometer_eth0_vip': ('params ip="10.0.5.100" '
|
||||||
|
'cidr_netmask="255.255.255.10" '
|
||||||
|
'nic="eth0"')
|
||||||
|
}
|
||||||
|
exp_clones = {'cl_ceilometer_haproxy': 'res_ceilometer_haproxy'}
|
||||||
|
call1 = call(groups={'grp_ceilometer_vips': 'res_ceilometer_eth0_vip'})
|
||||||
|
call2 = call(init_services={'res_ceilometer_haproxy': 'haproxy'},
|
||||||
|
corosync_bindiface='bnd0',
|
||||||
|
corosync_mcastport=5802,
|
||||||
|
resources=exp_resources,
|
||||||
|
resource_params=exp_resource_params,
|
||||||
|
clones=exp_clones)
|
||||||
|
self.relation_set.assert_has_calls([call1, call2], any_order=False)
|
||||||
|
|
||||||
|
@patch('charmhelpers.core.hookenv.config')
|
||||||
|
@patch.object(hooks, 'get_netmask_for_address')
|
||||||
|
@patch.object(hooks, 'get_hacluster_config')
|
||||||
|
@patch.object(hooks, 'get_iface_for_address')
|
||||||
|
@patch.object(hooks, 'relation_ids')
|
||||||
|
@patch.object(hooks, 'related_units')
|
||||||
|
@patch.object(hooks, 'relation_get')
|
||||||
|
def test_ha_joined_ssl(self, mock_rel_get, mock_rel_units, mock_rel_ids,
|
||||||
|
mock_iface, mock_cluster_config, mock_netmask,
|
||||||
|
mock_config):
|
||||||
|
mock_rel_ids.return_value = 'amqp:0'
|
||||||
|
mock_rel_units.return_value = 'rabbitmq-server/0'
|
||||||
|
mock_rel_get.return_value = '5671'
|
||||||
|
|
||||||
|
mock_iface.return_value = 'eth0'
|
||||||
|
mock_netmask.return_value = '255.255.255.10'
|
||||||
|
mock_cluster_config.return_value = {'vip': '10.0.5.100',
|
||||||
|
'ha-bindiface': 'bnd0',
|
||||||
|
'ha-mcastport': 5802}
|
||||||
|
|
||||||
|
hooks.hooks.execute(['hooks/ha-relation-joined'])
|
||||||
|
self.assertEquals(self.relation_set.call_count, 2)
|
||||||
|
|
||||||
|
exp_resources = {
|
||||||
|
'res_ceilometer_haproxy': 'lsb:haproxy',
|
||||||
|
'res_ceilometer_agent_central': ('ocf:openstack:'
|
||||||
|
'ceilometer-agent-central'),
|
||||||
|
'res_ceilometer_eth0_vip': 'ocf:heartbeat:IPaddr2'
|
||||||
|
}
|
||||||
|
exp_resource_params = {
|
||||||
|
'res_ceilometer_haproxy': 'op monitor interval="5s"',
|
||||||
|
'res_ceilometer_agent_central': ('params amqp_server_port="5671" '
|
||||||
|
'op monitor interval="30s"'),
|
||||||
|
'res_ceilometer_eth0_vip': ('params ip="10.0.5.100" '
|
||||||
|
'cidr_netmask="255.255.255.10" '
|
||||||
|
'nic="eth0"')
|
||||||
|
}
|
||||||
|
exp_clones = {'cl_ceilometer_haproxy': 'res_ceilometer_haproxy'}
|
||||||
|
call1 = call(groups={'grp_ceilometer_vips': 'res_ceilometer_eth0_vip'})
|
||||||
|
call2 = call(init_services={'res_ceilometer_haproxy': 'haproxy'},
|
||||||
|
corosync_bindiface='bnd0',
|
||||||
|
corosync_mcastport=5802,
|
||||||
|
resources=exp_resources,
|
||||||
|
resource_params=exp_resource_params,
|
||||||
|
clones=exp_clones)
|
||||||
|
self.relation_set.assert_has_calls([call1, call2], any_order=False)
|
||||||
|
|
||||||
@patch('charmhelpers.core.hookenv.config')
|
@patch('charmhelpers.core.hookenv.config')
|
||||||
@patch.object(hooks, 'keystone_joined')
|
@patch.object(hooks, 'keystone_joined')
|
||||||
def test_ha_changed_not_clustered(self, mock_keystone_joined, mock_config):
|
def test_ha_changed_not_clustered(self, mock_keystone_joined, mock_config):
|
||||||
|
|||||||
Reference in New Issue
Block a user