From 4529ce7d5e539e42ce9d38d09d3badea3f5247ca Mon Sep 17 00:00:00 2001 From: Nishanth Thomas Date: Tue, 15 Apr 2014 11:53:35 +0530 Subject: Cluster Status: Plugin to display the overall status of cluster This plugin use mk-livestatus to retrieve the status of the all the volumes and provide aggregrate status of the cluster Addressed review comments Change-Id: Ia83b41cfdc6dcfc1f379c024ba6ea33f9ccfe598 Signed-off-by: Nishanth Thomas --- config/gluster-commands.cfg | 5 +++ config/gluster-templates.cfg | 1 + config/glustercluster.cfg.sample | 1 - plugins/Makefile.am | 1 + plugins/check_cluster_status.py | 74 ++++++++++++++++++++++++++++++++++++++++ plugins/config_generator.py | 2 +- tests/test_config_generator.py | 2 +- 7 files changed, 83 insertions(+), 3 deletions(-) create mode 100755 plugins/check_cluster_status.py diff --git a/config/gluster-commands.cfg b/config/gluster-commands.cfg index c2fe324..73b9e7a 100644 --- a/config/gluster-commands.cfg +++ b/config/gluster-commands.cfg @@ -80,3 +80,8 @@ define command { command_name check_vol_quota_status command_line $USER1$/gluster/check_vol_server.py $ARG1$ $ARG2$ -o quota } + +define command{ + command_name check_cluster_status + command_line $USER1$/gluster/check_cluster_status.py $HOSTNAME$ +} diff --git a/config/gluster-templates.cfg b/config/gluster-templates.cfg index eaffcda..a1da860 100644 --- a/config/gluster-templates.cfg +++ b/config/gluster-templates.cfg @@ -18,6 +18,7 @@ define host { use gluster-generic-host register 0 _gluster_entity Cluster + check_command check_cluster_status } define host{ diff --git a/config/glustercluster.cfg.sample b/config/glustercluster.cfg.sample index c7de065..d51688d 100644 --- a/config/glustercluster.cfg.sample +++ b/config/glustercluster.cfg.sample @@ -28,7 +28,6 @@ define host{ host_name test-cluster ; The name of cluster. SHOULD BE SAME AS hostgroup defined above alias test-cluster ; A longer name to be used for display address dummy ; IP address of the host - check_command check_dummy!0 } ################################################################################ diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 78d0d8a..9779c2d 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -1,5 +1,6 @@ dist_glusternagiosplugins_PYTHON = \ constants.py \ + check_cluster_status.py \ check_cluster_vol_usage.py \ check_remote_host.py \ check_vol_server.py \ diff --git a/plugins/check_cluster_status.py b/plugins/check_cluster_status.py new file mode 100755 index 0000000..ab2a484 --- /dev/null +++ b/plugins/check_cluster_status.py @@ -0,0 +1,74 @@ +#!/usr/bin/python +# +# check_cluster_status +# Aggregated status for a gluster cluster +# The plugin reads status data using mk-livestatus +# Assumptions: +# - Volume utilization service names has "Status" +# +# Copyright (C) 2014 Red Hat Inc +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +import sys +from argparse import ArgumentParser +import livestatus +from glusternagios import utils + + +def findClusterStatus(clusterName): + exitStatus = utils.PluginStatusCode.OK + # Write command to socket + cmd = "GET services\nColumns: state\n" \ + "Filter: description ~~ %s\n" \ + "Filter: host_name = %s" % ('Volume Status', clusterName) + table = livestatus.readLiveStatus(cmd) + noOfVolumesInCriticalState = 0 + noOfVolumes = len(table) + for row in table: + if len(row) > 0 and row[0] == '2': + noOfVolumesInCriticalState += 1 + if noOfVolumesInCriticalState == noOfVolumes: + print "Cluster Status CRITICAL: All Volumes are in Critical State " \ + "| noOfVolumes=%s noOfVolumesInCriticalState=%s" \ + % (noOfVolumes, noOfVolumesInCriticalState) + exitStatus = utils.PluginStatusCode.CRITICAL + elif noOfVolumesInCriticalState > 0: + print "Cluster Status WARNING : Some Volumes are in Critical State " \ + "| noOfVolumes=%s noOfVolumesInCriticalState=%s" \ + % (noOfVolumes, noOfVolumesInCriticalState) + exitStatus = utils.PluginStatusCode.WARNING + else: + print "Cluster Status OK : None of the Volumes are in Critical " \ + "State | noOfVolumes=%s noOfVolumesInCriticalState=%s" \ + % (noOfVolumes, noOfVolumesInCriticalState) + return exitStatus + + +def parse_input(): + + parser = ArgumentParser(usage='%(prog)s [-h] ') + parser.add_argument("cluster", help="Name of the cluster") + args = parser.parse_args() + return args + + +# Main method +if __name__ == "__main__": + args = parse_input() + # Find the cluster status + exitStatus = findClusterStatus(args.cluster) + sys.exit(exitStatus) diff --git a/plugins/config_generator.py b/plugins/config_generator.py index 6d725ef..49ea335 100644 --- a/plugins/config_generator.py +++ b/plugins/config_generator.py @@ -167,7 +167,7 @@ class GlusterNagiosConfManager: cluster['name'], cluster['hosts'][-1]['hostip'])) clusterHostConfig = self.createHost( cluster['name'], cluster['name'], "gluster-cluster", - cluster['name'], "", "check_dummy", clusterServices) + cluster['name'], "", "", clusterServices) hostsConfigs.append(clusterHostConfig) for host in cluster['hosts']: brickServices = self.createBrickServices(host) diff --git a/tests/test_config_generator.py b/tests/test_config_generator.py index 21500a9..1161eab 100644 --- a/tests/test_config_generator.py +++ b/tests/test_config_generator.py @@ -50,7 +50,7 @@ class TestGlusterNagiosConfManager(TestCaseBase): self.assertEqual(config['host_name'], clusterData['name']) self.assertEqual(config['alias'], clusterData['name']) self.assertEqual(config['address'], clusterData['name']) - self.assertEqual(config['check_command'], "check_dummy") + self.assertEqual(config['check_command'], "") self.assertEqual(config['use'], 'gluster-cluster') def createBricks(self, count): -- cgit