Add script to cleanup stale VM alarms

Change-Id: I7296c0b46d66a55702a4f117f104c021913492e2
This commit is contained in:
Brad Klein 2016-03-11 13:15:23 -07:00
parent 5dfdc23cd8
commit 1e27ee7dfa
2 changed files with 115 additions and 0 deletions

View File

@ -58,6 +58,11 @@ class monasca::alarmdefs(
$notification_assignments = '/tmp/notification_assignments.json'
$script_name = 'bootstrap-alarm-definitions.py'
$script = "${virtual_env}/bin/${script_name}"
$cleanup_script = "${virtual_env}/bin/vm_alarm_cleanup.py"
$sql_host = $::monasca::params::sql_host
$sql_user = $::monasca::params::sql_user
$sql_password = $::monasca::params::sql_password
$sql_port = $::monasca::params::sql_port
if $install_python_deps {
package { ['python-virtualenv', 'python-dev']:
@ -119,4 +124,14 @@ class monasca::alarmdefs(
refreshonly => true,
require => Service['monasca-api'],
}
file { $cleanup_script:
ensure => file,
content => template('monasca/vm_alarm_cleanup.py.erb'),
mode => '0755',
owner => 'root',
group => 'root',
require => Python::Virtualenv[$virtual_env],
}
}

100
templates/vm_alarm_cleanup.py.erb Executable file
View File

@ -0,0 +1,100 @@
#!<%= @virtual_env %>/bin/python
import MySQLdb
import os
import os_client_config
import shade
OS_VARS = ['OS_REGION_NAME',
'OS_USERNAME',
'OS_PASSWORD',
'OS_TENANT_NAME',
'OS_AUTH_URL']
DELETE_SQL = """
DELETE a FROM alarm a WHERE a.id IN (%s); COMMIT;
"""
GET_SQL = """
SELECT
a.id AS alarm_id,
mdg.dimensions AS metric_dimensions
FROM alarm AS a
INNER JOIN alarm_definition ad
ON ad.id = a.alarm_definition_id
INNER JOIN alarm_metric AS am
ON am.alarm_id = a.id
INNER JOIN metric_definition_dimensions AS mdd
ON mdd.id = am.metric_definition_dimensions_id
INNER JOIN metric_definition AS md
ON md.id = mdd.metric_definition_id
LEFT OUTER JOIN (SELECT
dimension_set_id,
name,
value,
group_concat(name, '=', value) AS dimensions
FROM metric_dimension
GROUP BY dimension_set_id) AS mdg
ON mdg.dimension_set_id = mdd.metric_dimension_set_id
WHERE ad.deleted_at IS NULL
AND a.state = 'UNDETERMINED'
AND mdg.dimensions LIKE '%component=vm%'
AND mdg.dimensions LIKE '%region={}%'
ORDER BY a.id;
"""
def validate_env():
for os_var in OS_VARS:
if not os.environ.get(os_var):
print "Error: %s not found." % os_var
sys.exit(1)
def get_cloud():
validate_env()
client_config = os_client_config.OpenStackConfig()
cloud_config = client_config.get_one_cloud()
return shade.OpenStackCloud(cloud_config=cloud_config)
def prune_alarms(active_vm_ids):
db = MySQLdb.connect(user = '<%= sql_user %>',
passwd = '<%= @sql_password %>',
host = '<%= @sql_host %>',
port = <%= @sql_port %>,
db = 'mon')
try:
c = db.cursor()
c.execute(GET_SQL.format(os.environ.get('OS_REGION_NAME')))
alarms = {}
for (alarm_id, dims) in c:
dim_dict = dict(s.split('=') for s in dims.split(','))
if 'resource_id' in dim_dict.keys():
alarms[alarm_id] = dim_dict['resource_id']
alarm_ids_to_delete = []
for (alarm_id, resource_id) in alarms.iteritems():
if resource_id not in active_vm_ids:
alarm_ids_to_delete.append(alarm_id)
print "Deleting alarm id '%s' for deleted vm '%s'" % \
(alarm_id, resource_id)
if len(alarm_ids_to_delete) > 0:
c.execute(DELETE_SQL % str(alarm_ids_to_delete).strip('[]'))
finally:
c.close()
db.close()
def main():
cloud = get_cloud()
servers = cloud.nova_client.servers.list(search_opts={'all_tenants': 1})
prune_alarms(list(server.id for server in servers))
if __name__ == '__main__':
main()