示例#1
0
 def setUp(self):
     self.event = Mock()
     self.event.source = 'rtucker'
     self.event.target = '#sysadmins'
     self.connection = Mock()
     self.tc = MozillaNagiosStatus(self.connection, [])
     self.my_nick = self.event.source
     self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;db2.foo.mozilla.com;mysql replication;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'
示例#2
0
 def setUp(self):
     self.event = Mock()
     self.event.source = 'rtucker'
     self.event.target = '#sysadmins'
     self.connection = Mock()
     self.tc = MozillaNagiosStatus(self.connection, [])
     self.my_nick = self.event.source
     self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'
     self.ack_line = '[1318870432] SERVICE NOTIFICATION: socorroalertlist;fake-host.mozilla.org;Disk Space /;ACKNOWLEDGEMENT (WARNING);notify-by-email;DISK WARNING - free space: / 60658 MB (29% inode=97%):;ashish;bug 689547'
     self.host_line = "[1313158996] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;DOWN;host-notify-by-email;PING CRITICAL - Packet loss = 100%"
     self.ack_host_line = "[1319720894] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;ACKNOWLEDGEMENT (DOWN);host-notify-by-email;PING CRITICAL - Packet loss = 100%;rtucker;known"
 def setUp(self):
     self.event = Mock()
     self.event.source = 'rtucker'
     self.event.target = '#sysadmins'
     self.connection = Mock()
     self.tc = MozillaNagiosStatus(self.connection, [])
     self.my_nick = self.event.source
class NagiosStatusTest(unittest.TestCase):
    def setUp(self):
        self.event = Mock()
        self.event.source = 'rtucker'
        self.event.target = '#sysadmins'
        self.connection = Mock()
        self.tc = MozillaNagiosStatus(self.connection, [])
        self.my_nick = self.event.source

    def test_empty_host_status(self):
        cmd = "status db2.foo.mozilla.com"
        m = re.search('^status ([^:]+)', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, '%s: db2.foo.mozilla.com is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.91 ms' % self.event.source)

    def test_empty_host_wildcard(self):
        cmd = "status db*:PING"
        m = re.search('^status ([^:]+)', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(len(message), 2)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message[0], '%s: db1.foo.mozilla.com:PING is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.80 ms' % self.event.source)
        self.assertEqual(message[1], '%s: db2.foo.mozilla.com:PING is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.88 ms' % self.event.source)
        
    def test_basic_host_status_wildcard_services(self):
        cmd = "status db2.foo.mozilla.com:*"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(len(message), 11)

    def test_basic_host_status_specific_service(self):
        cmd = "status db2.foo.mozilla.com:swap"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(len(message), 1)
        self.assertEqual(message[0], "%s: db2.foo.mozilla.com:Swap is \x033OK\x03\x03\x03 - SWAP OK - 100%% free (2043 MB out of 2047 MB)" % self.event.source)

    def test_basic_host_status_wildcard_service_from_start(self):
        cmd = "status db2.foo.mozilla.com:Sw*"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message[0], "%s: db2.foo.mozilla.com:Swap is \x033OK\x03\x03\x03 - SWAP OK - 100%% free (2043 MB out of 2047 MB)" % self.event.source)
        self.assertEqual(len(message), 1)
 def setUp(self):
     self.event = Mock()
     self.event.source = 'rtucker'
     self.event.target = '#sysadmins'
     self.connection = Mock()
     self.tc = MozillaNagiosStatus(self.connection, [])
     self.my_nick = self.event.source
     self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;db2.foo.mozilla.com;mysql replication;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'
 def setUp(self):
     self.event = Mock()
     self.event.source = 'rtucker'
     self.event.target = '#sysadmins'
     self.connection = Mock()
     self.tc = MozillaNagiosStatus(self.connection, [])
     self.my_nick = self.event.source
     self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'
     self.ack_line = '[1318870432] SERVICE NOTIFICATION: socorroalertlist;fake-host.mozilla.org;Disk Space /;ACKNOWLEDGEMENT (WARNING);notify-by-email;DISK WARNING - free space: / 60658 MB (29% inode=97%):;ashish;bug 689547'
     self.host_line = "[1313158996] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;DOWN;host-notify-by-email;PING CRITICAL - Packet loss = 100%"
     self.ack_host_line = "[1319720894] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;ACKNOWLEDGEMENT (DOWN);host-notify-by-email;PING CRITICAL - Packet loss = 100%;rtucker;known"
class NagiosStatusTest(unittest.TestCase):
    def setUp(self):
        self.event = Mock()
        self.event.source = 'rtucker'
        self.event.target = '#sysadmins'
        self.connection = Mock()
        self.tc = MozillaNagiosStatus(self.connection, [])
        self.my_nick = self.event.source
        self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;db2.foo.mozilla.com;mysql replication;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'

    def test_empty_host_status(self):
        cmd = "status db2.foo.mozilla.com"
        m = re.search('^status ([^:]+)', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, '%s: db2.foo.mozilla.com is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.91 ms' % self.event.source)

    def test_empty_host_wildcard(self):
        cmd = "status db*:PING"
        m = re.search('^status ([^:]+)', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(len(message), 2)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue('%s: db1.foo.mozilla.com:PING is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.80 ms' % self.event.source in message[0])
        self.assertTrue('%s: db2.foo.mozilla.com:PING is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.88 ms' % self.event.source in message[1])
        
    def test_basic_host_status_wildcard_services(self):
        cmd = "status db2.foo.mozilla.com:*"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(len(message), 11)

    def test_basic_host_status_specific_service(self):
        cmd = "status db2.foo.mozilla.com:swap"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(len(message), 1)
        self.assertTrue("%s: db2.foo.mozilla.com:Swap is \x033OK\x03\x03\x03 - SWAP OK - 100%% free (2043 MB out of 2047 MB)" % self.event.source in message[0] )

    def test_host_service_status_by_index(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "status 100"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue('%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds' % (self.event.source) in message)

    def test_host_service_status_multiple_entriesby_index(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "status 100"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue('%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds' % (self.event.source) in message)
        self.tc.process_line(self.service_line, True)
        self.tc.process_line(self.service_line, True)
        self.tc.process_line(self.service_line, True)
        self.tc.process_line(self.service_line, True)
        cmd = "status 103"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue('%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds' % (self.event.source) in message)
        cmd = "status 105"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s Sorry, but I can't find any matching services" % self.event.source)

    def test_host_only_status_by_index(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        custom_service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;db1.foo.mozilla.com;SWAP;CRITICAL;notify-by-email;FAKE CRITICAL - free space: / 5294 MB (5% inode=99%):'
        self.tc.process_line(custom_service_line, True)
        self.tc.process_line(custom_service_line, True)
        self.tc.process_line(custom_service_line, True)
        self.tc.process_line(self.service_line, True)
        cmd = "status 100"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue("%s: db1.foo.mozilla.com SWAP OK - 99%% free (2023 MB out of 2047 MB)" % self.event.source in message)
        cmd = "status 103"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue("%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds" % self.event.source in message)

    def test_basic_host_status_wildcard_service_from_start(self):
        cmd = "status db2.foo.mozilla.com:Sw*"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue("%s: db2.foo.mozilla.com:Swap is \x033OK\x03\x03\x03 - SWAP OK - 100%% free (2043 MB out of 2047 MB)" % self.event.source in message[0])
        self.assertEqual(len(message), 1)
class MozillaNagiosStatusTest(unittest.TestCase):
    tc = None

    def setUp(self):
        self.event = Mock()
        self.event.source = 'rtucker'
        self.event.target = '#sysadmins'
        self.connection = Mock()
        self.tc = MozillaNagiosStatus(self.connection, [])
        self.my_nick = self.event.source
        self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'
        self.ack_line = '[1318870432] SERVICE NOTIFICATION: socorroalertlist;fake-host.mozilla.org;Disk Space /;ACKNOWLEDGEMENT (WARNING);notify-by-email;DISK WARNING - free space: / 60658 MB (29% inode=97%):;ashish;bug 689547'
        self.host_line = "[1313158996] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;DOWN;host-notify-by-email;PING CRITICAL - Packet loss = 100%"
        self.ack_host_line = "[1319720894] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;ACKNOWLEDGEMENT (DOWN);host-notify-by-email;PING CRITICAL - Packet loss = 100%;rtucker;known"

    def test_get_environment_vars(self):
        self.assertEqual(self.tc.list_offset, 100)
        self.assertEqual(self.tc.list_size, 100)

    def test_ackable_list_bad_host(self):
        self.assertEqual(len(self.tc.ackable_list), 100)
        self.tc.ackable('Test Host-Not Found', 'Test Service', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.assertEqual(len(self.tc.ackable_list), 100)
        self.assertEqual(self.tc.ackable_list[0]['host'], 'Test Host-Not Found')
        self.assertEqual(self.tc.ackable_list[0]['service'], 'Test Service')
        self.assertEqual(self.tc.ackable_list[0]['state'], 'CRITICAL')
        self.assertEqual(self.tc.ackable_list[0]['message'], 'Test Message')

    def test_downtime_by_index_bad_host(self):
        self.tc.ackable('Test Host-Not Found', 'Test Service', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m = re.search('^downtime\s+(\d+)\s+(\d+[dhms])\s+(.*)\s*$', message)
        target, message = self.tc.downtime_by_index(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(message, '%s: Unable to find host' % self.my_nick)

    def test_downtime_by_host_only(self):
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime test-host.fake.mozilla.com 1m blah blah'
        m = re.search('^downtime\s+([^: ]+)(?::(.*))?\s+(\d+[dhms])\s+(.*)\s*$', message)
        target, message = self.tc.downtime(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(message, '%s: Downtime for test-host.fake.mozilla.com scheduled for 0:01:00' % (self.my_nick) )

    def test_downtime_by_host_only_cmd_return(self):
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime test-host.fake.mozilla.com 1m blah blah'
        m = re.search('^downtime\s+([^: ]+)(?::(.*))?\s+(\d+[dhms])\s+(.*)\s*$', message)
        cmd = self.tc.downtime(self.event, message, m, return_cmd=True)
        ### fixup timestamp vars in response
        ### Replace the execution timestamp
        cmd = re.sub('\[\d+\]', '[000000]', cmd)
        ### Replace the start and end timestamp
        cmd = re.sub('\.com;\d+;\d+;', '.com;1234;5678;', cmd)
        ### Confirm that the syntax is correct per:

        self.assertEqual(cmd, '[000000] SCHEDULE_HOST_DOWNTIME;test-host.fake.mozilla.com;1234;5678;2;0;60;%s;blah blah\n' % (self.my_nick ))

    def test_downtime_by_index_host_only(self):
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m = re.search('^downtime\s+(\d+)\s+(\d+[dhms])\s+(.*)\s*$', message)
        target, message = self.tc.downtime_by_index(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(message, '%s: Downtime for test-host.fake.mozilla.com scheduled for 0:01:00' % (self.my_nick) )

    def test_downtime_by_index_with_service(self):
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m = re.search('^downtime\s+(\d+)\s+(\d+[dhms])\s+(.*)\s*$', message)
        target, message = self.tc.downtime_by_index(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(message, '%s: Downtime for test-host.fake.mozilla.com:Test Service scheduled for 0:01:00' % (self.my_nick) )

    def test_increment_ackable_list_correctly(self):
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.assertEqual(len(self.tc.ackable_list), 100)
        self.assertEqual(self.tc.ackable_list[0]['service'], 'Test Service')
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service 2', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.ackable_list[0]['service'], 'Test Service')
        self.assertEqual(self.tc.ackable_list[1]['service'], 'Test Service 2')

    def test_downtime_by_hostname_with_service(self):
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m = re.search('^downtime\s+(\d+)\s+(\d+[dhms])\s+(.*)\s*$', message)
        target, message = self.tc.downtime_by_index(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(message, '%s: Downtime for test-host.fake.mozilla.com:Test Service scheduled for 0:01:00' % (self.my_nick) )

    def test_downtime_by_hostname(self):
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime test-host.fake.mozilla.com 1m blah blah'
        m = re.search('^downtime\s+([^: ]+)(?::(.*))?\s+(\d+[dhms])\s+(.*)\s*$', message)
        target, message = self.tc.downtime(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(message, '%s: Downtime for test-host.fake.mozilla.com scheduled for 0:01:00' % (self.my_nick) )

    def test_mute(self):
        message = "mute"
        m = None
        target, message = self.tc.mute(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: OK I'll mute" % (self.my_nick) )

    def test_already_muted(self):
        message = "mute"
        m = None
        target, message = self.tc.mute(self.event, message, m)
        target, message = self.tc.mute(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: I'm already muted" % (self.my_nick) )

    def test_already_muted_unmute(self):
        message = "mute"
        m = None
        target, message = self.tc.mute(self.event, message, m)
        message = "unmute"
        target, message = self.tc.unmute(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: OK I'll unmute" % (self.my_nick) )

    def test_unmute_when_not_previously_muted(self):
        m = None
        message = "unmute"
        target, message = self.tc.unmute(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: OK I'm not muted" % (self.my_nick) )

    def test_oncall(self):
        m = None
        message = "whoisoncall"
        target, message = self.tc.get_oncall(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: unknown currently has the pager" % (self.my_nick) )

    def test_unack_host(self):
        message = "unack test-host.fake.mozilla.com"
        m = re.search('^unack ([^:]+)\s*$', message)
        target, message = self.tc.unack_by_host(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: ok, acknowledgment (if any) for test-host.fake.mozilla.com has been removed." % (self.my_nick) )

    def test_ack_host_with_service(self):
        message = "ack test-host.fake.mozilla.com:asdf test message"
        m = re.search('^\s*ack ([^:]+):([^:]+)\s(.*)$', message)
        target, message = self.tc.ack_by_host_with_service(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Service test-host.fake.mozilla.com:asdf test has been ack'd" % (self.my_nick) )

    def test_ack_host(self):
        message = "ack test-host.fake.mozilla.com test message"
        m = re.search('^\s*ack ([^:]+)\s(.*)$', message)
        target, message = self.tc.ack_by_host(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Host test-host.fake.mozilla.com test has been ack'd" % (self.my_nick) )

    def test_ack_host_by_index(self):
        self.tc.process_line(self.host_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = "ack 100 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Host fake-host.mozilla.org has been ack'd" % (self.my_nick) )
        self.tc.process_line(self.ack_host_line, True)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Host fake-host.mozilla.org has been ack'd" % (self.my_nick) )
        
    def test_ack_host_by_index_after_one_cycle(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,101):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 100 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Service fake-host.mozilla.org:root partition100 has been ack'd" % (self.my_nick) )
        self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_one_cycle_long_service_message(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,12):
            service_line = "[1334695172] SERVICE NOTIFICATION: sysalertslist;db1.foo.bar.mozilla.com;MySQL Replication;UNKNOWN;notify-by-sms;**ePN /usr/lib64/nagios/plugins/mozilla/check_mysql_replication: DBI connect(host=10.0.0.0:database=,username,...) failed: Cant connect to MySQL server on 10.0.0.0 (111) at (eval 6) line 30."
            self.tc.process_line(service_line, True)
        message = "ack 110 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Service db1.foo.bar.mozilla.com:MySQL Replication has been ack'd" % (self.my_nick) )
        self.tc.process_line(self.ack_host_line, True)
        message = "status db1.foo.mozilla.com:MySQL replication"
        m = re.search('^status ([^:]+):(.+)$', message)
        target, message = self.tc.status_by_host_name(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        #self.assertEqual(message[0], "%s: db1.foo.mozilla.com:mysql Replication is \x033OK\x03\x03\x03 - uptime: 18346  threads: 199  questions: 12026601  slow queries: 1  opens: 496  flush tables: 1  open tables: 489  queries per second avg: 655.543" % (self.my_nick) )

    def test_disallowed_ack_list(self):
        self.assertEqual(self.tc.disallowed_ack[0], 'serverops_bugs')

    def test_ack_service_by_index_disallowed(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,12):
            service_line = "[1334695172] SERVICE NOTIFICATION: sysalertslist;db1.foo.bar.mozilla.com;serverops_bugs;CRITICAL;notify-by-sms;some critical bug that I don't want to ack"
            self.tc.process_line(service_line, True)
        message = "ack 110 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: I'm sorry but you're not allowed to ACK this alert here. Please visit the appropriate nagios webui to ACK it there." % (self.my_nick) )
        self.tc.process_line(self.ack_host_line, True)
        
    def test_ack_host_by_index_after_half_cycle(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,51):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 150 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Service fake-host.mozilla.org:root partition50 has been ack'd" % (self.my_nick) )
        self.assertEqual(self.tc.ackable_list[51], None)

    def test_ack_host_by_index_after_five_cycles(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,501):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 100 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Service fake-host.mozilla.org:root partition500 has been ack'd" % (self.my_nick) )
        self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_five_cycles_with_ack(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,501):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
            message = "ack %i test message" % (i % self.tc.list_size)
            m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
            target, message = self.tc.ack(self.event, message, m)
            self.assertEqual(target, "#sysadmins")
            self.assertEqual(message, "%s: The Service fake-host.mozilla.org:root partition%i has been ack'd" % (self.my_nick, i) )
            self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_five_cycles_with_ack_incorrect_syntax(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,501):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
            message = "%i ack test message" % (i % self.tc.list_size)
            m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
            target, message = self.tc.ack(self.event, message, m)
            self.assertEqual(target, "#sysadmins")
            self.assertEqual(message, "%s: The Service fake-host.mozilla.org:root partition%i has been ack'd" % (self.my_nick, i) )
            self.tc.process_line(self.ack_host_line, True)
    def test_ack_host_by_index_after_hundred_cycles(self):
        self.tc.ackable_list = [None]*self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0,100001):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 100 test message"
        m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
        target, message = self.tc.ack(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Service fake-host.mozilla.org:root partition100000 has been ack'd" % (self.my_nick) )
        self.tc.process_line(self.ack_host_line, True)

    def test_unack_by_index(self):
        cmd = "unack 100"
        m = re.search('^unack (\d+)$', cmd)
        target, message = self.tc.unack(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: Sorry, but no alert exists at this index" % (self.my_nick) )

        #Now add an alert to the list and try to unack
        tmp = self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        target, message = self.tc.unack(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: The Host test-host.fake.mozilla.com has been ack'd" % (self.my_nick) )
    def test_process_line(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.tc.process_line(self.host_line, True)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 102)

    def test_process_line_with_unknown_contacts(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.tc.process_line(self.host_line, True)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 102)
        service_line = "[1318882274] SERVICE NOTIFICATION: unknowncontacthere;fake-host.mozilla.org;root partition;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):"
        self.tc.process_line(service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 102)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 103)

    def test_page_by_index(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "page 100 %s" % (self.event.source)
        m = re.search('^page\s+(\d+)\s+(\w+)\s*$', cmd)
        target, message = self.tc.page_with_alert_number(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: %s has been paged" % (self.my_nick, self.event.source) )

    def test_page_by_bad_index(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "page 101 %s" % (self.event.source)
        m = re.search('^page\s+(\d+)\s+(\w+)\s*$', cmd)
        target, message = self.tc.page_with_alert_number(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: Sorry, but no alert exists at this index" % (self.my_nick) )

    def test_get_channel_group(self):
        self.assertEqual(self.tc.get_channel_group('sysalertslist'), '#sysadmins')

    """
        This test is no longer valid, we did away with a default contact channel
    """
    """def test_get_channel_group_not_found(self):
        self.assertEqual(self.tc.get_channel_group('thisshouldnevermatchblahblah'), '#default')
    """

    def test_get_page_plugin(self):
        plugins = self.tc.return_plugins()
        self.assertEqual('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', plugins[0]['regex']) 
示例#9
0
class NagiosStatusTest(unittest.TestCase):
    def setUp(self):
        self.event = Mock()
        self.event.source = 'rtucker'
        self.event.target = '#sysadmins'
        self.connection = Mock()
        self.tc = MozillaNagiosStatus(self.connection, [])
        self.my_nick = self.event.source
        self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;db2.foo.mozilla.com;mysql replication;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'

    def test_empty_host_status(self):
        cmd = "status db2.foo.mozilla.com"
        m = re.search('^status ([^:]+)', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            '%s: db2.foo.mozilla.com is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.91 ms'
            % self.event.source)

    def test_empty_host_wildcard(self):
        cmd = "status db*:PING"
        m = re.search('^status ([^:]+)', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(len(message), 2)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            '%s: db1.foo.mozilla.com:PING is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.80 ms'
            % self.event.source in message[0])
        self.assertTrue(
            '%s: db2.foo.mozilla.com:PING is \x033OK\x03\x03\x03 - PING OK - Packet loss = 0%%, RTA = 0.88 ms'
            % self.event.source in message[1])

    def test_basic_host_status_wildcard_services(self):
        cmd = "status db2.foo.mozilla.com:*"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(len(message), 11)

    def test_basic_host_status_specific_service(self):
        cmd = "status db2.foo.mozilla.com:swap"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(len(message), 1)
        self.assertTrue(
            "%s: db2.foo.mozilla.com:Swap is \x033OK\x03\x03\x03 - SWAP OK - 100%% free (2043 MB out of 2047 MB)"
            % self.event.source in message[0])

    def test_host_service_status_by_index(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'db2.foo.mozilla.com',
            '0',
            'Replication running.  Lag time: 0 seconds',
            '1324567',
        ]]
        self.tc.ackable_list = [None] * self.tc.list_size
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "status 100"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            '%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds'
            % (self.event.source) in message)

    def test_host_service_status_multiple_entriesby_index(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'db2.foo.mozilla.com', '0',
            'Replication running.  Lag time: 0 seconds', '123456'
        ]]
        self.tc.ackable_list = [None] * self.tc.list_size
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "status 100"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            '%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds'
            % (self.event.source) in message)
        self.tc.process_line(self.service_line, True)
        self.tc.process_line(self.service_line, True)
        self.tc.process_line(self.service_line, True)
        self.tc.process_line(self.service_line, True)
        cmd = "status 103"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            '%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds'
            % (self.event.source) in message)
        cmd = "status 105"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message, "%s Sorry, but I can't find any matching services" %
            self.event.source)

    def test_host_only_status_by_index(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'db1.foo.mozilla.com', '0',
            'SWAP OK - 99% free (2023 MB out of 2047 MB)', '123456'
        ]]
        self.tc.ackable_list = [None] * self.tc.list_size
        custom_service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;db1.foo.mozilla.com;SWAP;CRITICAL;notify-by-email;FAKE CRITICAL - free space: / 5294 MB (5% inode=99%):'
        self.tc.process_line(custom_service_line, True)
        self.tc.process_line(custom_service_line, True)
        self.tc.process_line(custom_service_line, True)
        self.tc.process_line(self.service_line, True)
        cmd = "status 100"
        m = re.search('^status (\d+)$', cmd)
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            "%s: db1.foo.mozilla.com SWAP OK - 99%% free (2023 MB out of 2047 MB)"
            % self.event.source in message)
        cmd = "status 103"
        m = re.search('^status (\d+)$', cmd)
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'db2.foo.mozilla.com', '0',
            'Replication running.  Lag time: 0 seconds', '123456'
        ]]
        target, message = self.tc.status_by_index(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            "%s: db2.foo.mozilla.com Replication running.  Lag time: 0 seconds"
            % self.event.source in message)

    def test_basic_host_status_wildcard_service_from_start(self):
        cmd = "status db2.foo.mozilla.com:Sw*"
        m = re.search('^status ([^:]+):(.+)$', cmd)
        target, message = self.tc.status_by_host_name(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertTrue(
            "%s: db2.foo.mozilla.com:Swap is \x033OK\x03\x03\x03 - SWAP OK - 100%% free (2043 MB out of 2047 MB)"
            % self.event.source in message[0])
        self.assertEqual(len(message), 1)
示例#10
0
class MozillaNagiosStatusTest(unittest.TestCase):
    tc = None

    def setUp(self):
        self.event = Mock()
        self.event.source = 'rtucker'
        self.event.target = '#sysadmins'
        self.connection = Mock()
        self.tc = MozillaNagiosStatus(self.connection, [])
        self.my_nick = self.event.source
        self.service_line = '[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5% inode=99%):'
        self.ack_line = '[1318870432] SERVICE NOTIFICATION: socorroalertlist;fake-host.mozilla.org;Disk Space /;ACKNOWLEDGEMENT (WARNING);notify-by-email;DISK WARNING - free space: / 60658 MB (29% inode=97%):;ashish;bug 689547'
        self.host_line = "[1313158996] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;DOWN;host-notify-by-email;PING CRITICAL - Packet loss = 100%"
        self.ack_host_line = "[1319720894] HOST NOTIFICATION: sysalertslist;fake-host.mozilla.org;ACKNOWLEDGEMENT (DOWN);host-notify-by-email;PING CRITICAL - Packet loss = 100%;rtucker;known"

    def test_get_environment_vars(self):
        self.assertEqual(self.tc.list_offset, 100)
        self.assertEqual(self.tc.list_size, 100)

    def test_ackable_list_bad_host(self):
        self.assertEqual(len(self.tc.ackable_list), 100)
        self.tc.ackable('Test Host-Not Found', 'Test Service', 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.assertEqual(len(self.tc.ackable_list), 100)
        self.assertEqual(self.tc.ackable_list[0]['host'],
                         'Test Host-Not Found')
        self.assertEqual(self.tc.ackable_list[0]['service'], 'Test Service')
        self.assertEqual(self.tc.ackable_list[0]['state'], 'CRITICAL')
        self.assertEqual(self.tc.ackable_list[0]['message'], 'Test Message')

    def test_downtime_by_index_bad_host(self):
        self.tc.use_mklive_status = False
        self.tc.ackable('Test Host-Not Found', 'Test Service', 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message, '%s: Host Not Found Test Host-Not Found' % self.my_nick)

    def test_downtime_by_host_only_with_duration_preceeding(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'test-host.fake.mozilla.com',
            '0',
            'Replication running.  Lag time: 0 seconds',
            '1324567',
        ]]
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 1h test-host.fake.mozilla.com blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for host test-host.fake.mozilla.com scheduled for 1:00:00'
            % (self.my_nick))

    def test_downtime_by_index_host_only_duration_preceeding(self):
        self.tc.use_mklive_status = False
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 1m 100 blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for host test-host.fake.mozilla.com scheduled for 0:01:00'
            % (self.my_nick))

    def test_downtime_by_host_and_service(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'test-host-with-service.fake.mozilla.com',
            '0',
            'Replication running.  Lag time: 0 seconds',
            '1324567',
        ]]
        self.tc.ackable('test-host-with-service.fake.mozilla.com',
                        'Test Service', 'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime test-host-with-service.fake.mozilla.com:MySQL Uptime 1h test comment'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for service test-host-with-service.fake.mozilla.com:MySQL Uptime scheduled for 1:00:00'
            % (self.my_nick))

    def test_downtime_by_host_and_service_with_duration_preceeding(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'test-host.fake.mozilla.com',
            '0',
            'Replication running.  Lag time: 0 seconds',
            '1324567',
        ]]
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service',
                        'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 1h test-host.fake.mozilla.com:Test blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for service test-host.fake.mozilla.com:Test scheduled for 1:00:00'
            % (self.my_nick))

    def test_downtime_by_host_only(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'test-host-without-service.fake.mozilla.com',
            '0',
            'Replication running.  Lag time: 0 seconds',
            '1324567',
        ]]
        self.tc.ackable('test-host-without-service.fake.mozilla.com', None,
                        'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime test-host-without-service.fake.mozilla.com 1m blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for host test-host-without-service.fake.mozilla.com scheduled for 0:01:00'
            % (self.my_nick))

    #def test_downtime_by_host_only_cmd_return(self):
    #    self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL', 'Test Message')
    #    self.assertEqual(self.tc.get_ack_number(), 100)
    #    message = 'downtime test-host.fake.mozilla.com 1m blah blah'
    #    m = re.search('^downtime\s+([^: ]+)(?::(.*))?\s+(\d+[dhms])\s+(.*)\s*$', message)
    #    cmd = self.tc.downtime(self.event, message, m, return_cmd=True)
    #    ### fixup timestamp vars in response
    #    ### Replace the execution timestamp
    #    cmd = re.sub('\[\d+\]', '[000000]', cmd)
    #    ### Replace the start and end timestamp
    #    cmd = re.sub('\.com;\d+;\d+;', '.com;1234;5678;', cmd)
    #    ### Confirm that the syntax is correct per:

    #    self.assertEqual(cmd, '[000000] SCHEDULE_HOST_DOWNTIME;test-host.fake.mozilla.com;1234;5678;2;0;60;%s;blah blah\n' % (self.my_nick ))

    def test_downtime_by_index_host_only(self):
        self.tc.use_mklive_status = False
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for host test-host.fake.mozilla.com scheduled for 0:01:00'
            % (self.my_nick))

    def test_downtime_by_index_host_only_interval_first(self):
        self.tc.use_mklive_status = False
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 1m 100 blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for host test-host.fake.mozilla.com scheduled for 0:01:00'
            % (self.my_nick))

    def test_downtime_by_index_with_service(self):
        self.tc.use_mklive_status = False
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service',
                        'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for service test-host.fake.mozilla.com:Test Service scheduled for 0:01:00'
            % (self.my_nick))

    def test_increment_ackable_list_correctly(self):
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service',
                        'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.assertEqual(len(self.tc.ackable_list), 100)
        self.assertEqual(self.tc.ackable_list[0]['service'], 'Test Service')
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service 2',
                        'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.ackable_list[0]['service'], 'Test Service')
        self.assertEqual(self.tc.ackable_list[1]['service'], 'Test Service 2')

    def test_downtime_by_hostname_with_service(self):
        self.tc.use_mklive_status = False
        self.tc.ackable('test-host.fake.mozilla.com', 'Test Service',
                        'CRITICAL', 'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime 100 1m blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for service test-host.fake.mozilla.com:Test Service scheduled for 0:01:00'
            % (self.my_nick))

    def test_downtime_by_hostname(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'test-host.fake.mozilla.com',
            '0',
            'Replication running.  Lag time: 0 seconds',
        ]]
        self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL',
                        'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = 'downtime test-host.fake.mozilla.com 1m blah blah'
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, '#sysadmins')
        self.assertEqual(
            message,
            '%s: Downtime for host test-host.fake.mozilla.com scheduled for 0:01:00'
            % (self.my_nick))

    def test_mute(self):
        message = "mute"
        m = None
        target, message = self.tc.mute(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: OK I'll mute" % (self.my_nick))

    def test_already_muted(self):
        message = "mute"
        m = None
        target, message = self.tc.mute(self.event, message, m)
        target, message = self.tc.mute(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: I'm already muted" % (self.my_nick))

    def test_already_muted_unmute(self):
        message = "mute"
        m = None
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)

        message = "unmute"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: OK I'll unmute" % (self.my_nick))

    def test_unmute_when_not_previously_muted(self):
        m = None
        message = "unmute"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(message, "%s: OK I'm not muted" % (self.my_nick))

    def test_oncall(self):
        m = None
        message = "whoisoncall"
        target, message = self.tc.get_oncall(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message, "%s: unknown currently has the pager" % (self.my_nick))

    def test_onduty(self):
        m = None
        message = "whoisonduty"
        target, message = self.tc.get_oncall(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message, "%s: unknown currently has the pager" % (self.my_nick))

    def test_unack_host(self):
        message = "unack test-host.fake.mozilla.com"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: removed acknowledgment (if any) for host test-host.fake.mozilla.com"
            % (self.my_nick))

    def test_ack_host_with_service(self):
        message = "ack test-host.fake.mozilla.com:asdf test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged service test-host.fake.mozilla.com:asdf test message"
            % (self.my_nick))

    def test_ack_host(self):
        message = "ack test-host.fake.mozilla.com test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message, "%s: acknowledged host test-host.fake.mozilla.com" %
            (self.my_nick))

    def test_ack_host_by_index(self):
        self.tc.process_line(self.host_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = "ack 100 test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged host fake-host.mozilla.org" % (self.my_nick))
        self.tc.process_line(self.ack_host_line, True)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged host fake-host.mozilla.org" % (self.my_nick))

    def test_ack_host_by_index_with_colon_in_message(self):
        self.tc.execute_query = Mock()
        self.tc.execute_query.return_value = [[
            'fake-host.mozilla.org',
            '0',
            'Replication running.  Lag time: 0 seconds',
            '1324567',
        ]]
        self.tc.process_line(self.host_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        message = "ack 100 test message :)"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged host fake-host.mozilla.org" % (self.my_nick))
        self.tc.process_line(self.ack_host_line, True)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged host fake-host.mozilla.org" % (self.my_nick))

    def test_ack_host_by_index_after_one_cycle(self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 101):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 100 test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged service fake-host.mozilla.org:root partition100"
            % (self.my_nick))
        self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_one_cycle_long_service_message(self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 12):
            service_line = "[1334695172] SERVICE NOTIFICATION: sysalertslist;db1.foo.bar.mozilla.com;MySQL Replication;UNKNOWN;notify-by-sms;**ePN /usr/lib64/nagios/plugins/mozilla/check_mysql_replication: DBI connect(host=10.0.0.0:database=,username,...) failed: Cant connect to MySQL server on 10.0.0.0 (111) at (eval 6) line 30."
            self.tc.process_line(service_line, True)
        message = "ack 110 test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged service db1.foo.bar.mozilla.com:MySQL Replication"
            % (self.my_nick))
        self.tc.process_line(self.ack_host_line, True)
        message = "status db1.foo.mozilla.com:MySQL replication"
        m = re.search('^status ([^:]+):(.+)$', message)
        target, message = self.tc.status_by_host_name(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        #self.assertEqual(message[0], "%s: db1.foo.mozilla.com:mysql Replication is \x033OK\x03\x03\x03 - uptime: 18346  threads: 199  questions: 12026601  slow queries: 1  opens: 496  flush tables: 1  open tables: 489  queries per second avg: 655.543" % (self.my_nick) )

    def test_disallowed_ack_list(self):
        self.assertEqual(self.tc.disallowed_ack[0], 'serverops_bugs')

    def test_ack_service_by_index_disallowed(self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 12):
            service_line = "[1334695172] SERVICE NOTIFICATION: sysalertslist;db1.foo.bar.mozilla.com;serverops_bugs;CRITICAL;notify-by-sms;some critical bug that I don't want to ack"
            self.tc.process_line(service_line, True)
        message = "ack 110 test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: I'm sorry but you're not allowed to ACK this alert here. Please visit the appropriate nagios webui to ACK it there."
            % (self.my_nick))
        self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_half_cycle(self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 51):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 150 test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged service fake-host.mozilla.org:root partition50" %
            (self.my_nick))
        self.assertEqual(self.tc.ackable_list[51], None)

    def test_ack_host_by_index_after_five_cycles(self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 501):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
        message = "ack 100 test message"
        m, callback = self.get_regex_obj_and_callback(message)
        target, message = callback(self.event, message, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: acknowledged service fake-host.mozilla.org:root partition500"
            % (self.my_nick))
        self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_five_cycles_with_ack(self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 501):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
            message = "ack %i test message" % (i % self.tc.list_size)
            m, callback = self.get_regex_obj_and_callback(message)
            target, message = callback(self.event, message, m)
            self.assertEqual(target, "#sysadmins")
            self.assertEqual(
                message,
                "%s: acknowledged service fake-host.mozilla.org:root partition%i"
                % (self.my_nick, i))
            self.tc.process_line(self.ack_host_line, True)

    def test_ack_host_by_index_after_five_cycles_with_ack_incorrect_syntax(
            self):
        self.tc.ackable_list = [None] * self.tc.list_size
        self.assertEqual(len(self.tc.ackable_list), 100)
        for i in range(0, 501):
            service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
            self.tc.process_line(service_line, True)
            message = "%i ack test message" % (i % self.tc.list_size)
            m = re.search(
                '^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
            target, message = self.tc.ack(self.event, message, m)
            self.assertEqual(target, "#sysadmins")
            self.assertEqual(
                message,
                "%s: acknowledged service fake-host.mozilla.org:root partition%i"
                % (self.my_nick, i))
            self.tc.process_line(self.ack_host_line, True)

    #def test_ack_host_by_index_after_hundred_cycles(self):
    #    self.tc.ackable_list = [None]*self.tc.list_size
    #    self.assertEqual(len(self.tc.ackable_list), 100)
    #    for i in range(0,100001):
    #        service_line = "[1318882274] SERVICE NOTIFICATION: sysalertslist;fake-host.mozilla.org;root partition%s;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):" % i
    #        self.tc.process_line(service_line, True)
    #    message = "ack 100 test message"
    #    m = re.search('^(?:\s*ack\s*)?(\d+)(?:\s*ack\s*)?[:\s]+([^:]+)\s*$', message)
    #    target, message = self.tc.ack(self.event, message, m)
    #    self.assertEqual(target, "#sysadmins")
    #    self.assertEqual(message, "%s: acknowledged service fake-host.mozilla.org:root partition100000" % (self.my_nick) )
    #    self.tc.process_line(self.ack_host_line, True)

    def test_unack_by_index(self):
        cmd = "unack 100"
        m, callback = self.get_regex_obj_and_callback(cmd)
        target, message = callback(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: Sorry, but no alert exists at this index" % (self.my_nick))

        #Now add an alert to the list and try to unack
        tmp = self.tc.ackable('test-host.fake.mozilla.com', None, 'CRITICAL',
                              'Test Message')
        self.assertEqual(self.tc.get_ack_number(), 100)
        m, callback = self.get_regex_obj_and_callback(cmd)
        target, message = callback(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: removed acknowledgment (if any) for host test-host.fake.mozilla.com"
            % (self.my_nick))

    def test_process_line(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.tc.process_line(self.host_line, True)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 102)

    def test_process_line_with_unknown_contacts(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        self.tc.process_line(self.host_line, True)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 102)
        service_line = "[1318882274] SERVICE NOTIFICATION: unknowncontacthere;fake-host.mozilla.org;root partition;CRITICAL;notify-by-email;DISK CRITICAL - free space: / 5294 MB (5 inode=99):"
        self.tc.process_line(service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 102)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 103)

    def test_page_by_index(self):
        self.tc.page_with_alert_number = Mock()
        self.tc.page_with_alert_number.return_value = "#sysadmins", "%s: %s has been paged" % (
            self.my_nick, self.event.source)
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "page 100 %s" % (self.event.source)
        m = re.search('^page\s+(\d+)\s+(\w+)\s*$', cmd)
        target, message = self.tc.page_with_alert_number(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: %s has been paged" % (self.my_nick, self.event.source))

    def test_page_by_bad_index(self):
        self.tc.process_line(self.service_line, True)
        self.assertEqual(self.tc.get_ack_number(), 100)
        cmd = "page 101 %s" % (self.event.source)
        m = re.search('^page\s+(\d+)\s+(\w+)\s*$', cmd)
        target, message = self.tc.page_with_alert_number(self.event, cmd, m)
        self.assertEqual(target, "#sysadmins")
        self.assertEqual(
            message,
            "%s: Sorry, but no alert exists at this index" % (self.my_nick))

    def test_get_channel_group(self):
        self.assertEqual(self.tc.get_channel_group('sysalertslist'),
                         '#sysadmins')

    """
        This test is no longer valid, we did away with a default contact channel
    """
    """def test_get_channel_group_not_found(self):
        self.assertEqual(self.tc.get_channel_group('thisshouldnevermatchblahblah'), '#default')
    """

    def test_get_page_plugin(self):
        plugins = self.tc.return_plugins()
        self.assertEqual('^ack (\d+)\s+(.*)$', plugins[0]['regex'])

    def get_regex_obj_and_callback(self, command_string):
        regex_list = [r['regex'] for r in self.tc.message_commands]
        for mc in self.tc.message_commands:
            m = re.match(mc['regex'], command_string)
            if m:
                return m, mc['callback']
        return None