|
@@ -1,4 +1,4 @@
|
|
|
-# Copyright (C) 2010, 2011 Internet Systems Consortium.
|
|
|
+# Copyright (C) 2010, 2011, 2012 Internet Systems Consortium.
|
|
|
#
|
|
|
# Permission to use, copy, modify, and distribute this software for any
|
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
@@ -100,6 +100,44 @@ class TestUtilties(unittest.TestCase):
|
|
|
self.assertNotEqual(stats.get_datetime(
|
|
|
(2011, 6, 22, 8, 23, 40, 2, 173, 0)), self.const_datetime)
|
|
|
|
|
|
+ def test__accum(self):
|
|
|
+ self.assertEqual(stats._accum(None, None), None)
|
|
|
+ self.assertEqual(stats._accum(None, "b"), "b")
|
|
|
+ self.assertEqual(stats._accum("a", None), "a")
|
|
|
+ self.assertEqual(stats._accum(1, 2), 3)
|
|
|
+ self.assertEqual(stats._accum(0.5, 0.3), 0.8)
|
|
|
+ self.assertEqual(stats._accum('aa','bb'), 'bb')
|
|
|
+ self.assertEqual(stats._accum('1970-01-01T09:00:00Z','2012-08-09T09:33:31Z'),
|
|
|
+ '2012-08-09T09:33:31Z')
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [1, 2, 3], [4, 5]), [5, 7, 3])
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [4, 5], [1, 2, 3]), [5, 7, 3])
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [1, 2, 3], [None, 5, 6]), [1, 7, 9])
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [None, 5, 6], [1, 2, 3]), [1, 7, 9])
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [1, 2, 3], [None, None, None, None]), [1,2,3,None])
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [[1,2],3],[[],5,6]), [[1,2],8,6])
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ {'one': 1, 'two': 2, 'three': 3},
|
|
|
+ {'one': 4, 'two': 5}),
|
|
|
+ {'one': 5, 'two': 7, 'three': 3})
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ {'one': 1, 'two': 2, 'three': 3},
|
|
|
+ {'four': 4, 'five': 5}),
|
|
|
+ {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5})
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ {'one': [1, 2], 'two': [3, None, 5], 'three': [None, 3, None]},
|
|
|
+ {'one': [2], 'two': [4, 5], 'three': [None, None, None], 'four': 'FOUR'}),
|
|
|
+ {'one':[3,2], 'two':[7,5,5], 'three':[None,3,None], 'four': 'FOUR'})
|
|
|
+ self.assertEqual(stats._accum(
|
|
|
+ [ {'one': 1, 'two': 2, 'three': 3}, {'four': 4, 'five': 5, 'six': 6} ],
|
|
|
+ [ {}, {'four': 1, 'five': 2, 'six': 3} ]),
|
|
|
+ [ {'one': 1, 'two': 2, 'three': 3}, {'four': 5, 'five': 7, 'six': 9} ])
|
|
|
+
|
|
|
class TestCallback(unittest.TestCase):
|
|
|
def setUp(self):
|
|
|
self.dummy_func = lambda *x, **y : (x, y)
|
|
@@ -150,7 +188,6 @@ class TestStats(unittest.TestCase):
|
|
|
# set the signal handler for deadlock
|
|
|
self.sig_handler = SignalHandler(self.fail)
|
|
|
self.base = BaseModules()
|
|
|
- self.stats = stats.Stats()
|
|
|
self.const_timestamp = 1308730448.965706
|
|
|
self.const_datetime = '2011-06-22T08:14:08Z'
|
|
|
self.const_default_datetime = '1970-01-01T00:00:00Z'
|
|
@@ -161,6 +198,7 @@ class TestStats(unittest.TestCase):
|
|
|
self.sig_handler.reset()
|
|
|
|
|
|
def test_init(self):
|
|
|
+ self.stats = stats.Stats()
|
|
|
self.assertEqual(self.stats.module_name, 'Stats')
|
|
|
self.assertFalse(self.stats.running)
|
|
|
self.assertTrue('command_show' in self.stats.callbacks)
|
|
@@ -168,7 +206,7 @@ class TestStats(unittest.TestCase):
|
|
|
self.assertTrue('command_shutdown' in self.stats.callbacks)
|
|
|
self.assertTrue('command_show' in self.stats.callbacks)
|
|
|
self.assertTrue('command_showschema' in self.stats.callbacks)
|
|
|
- self.assertTrue('command_set' in self.stats.callbacks)
|
|
|
+ self.assertEqual(self.stats.config['poll-interval'], 60)
|
|
|
|
|
|
def test_init_undefcmd(self):
|
|
|
spec_str = """\
|
|
@@ -217,22 +255,12 @@ class TestStats(unittest.TestCase):
|
|
|
# Also temporarily disabled for #1668, see above
|
|
|
#self.assertTrue(self.stats.mccs.stopped)
|
|
|
|
|
|
- # start with err
|
|
|
- self.stats = stats.Stats()
|
|
|
- self.stats.update_statistics_data = lambda x,**y: ['an error']
|
|
|
- self.assertRaises(stats.StatsError, self.stats.start)
|
|
|
-
|
|
|
def test_handlers(self):
|
|
|
self.stats_server = ThreadingServerManager(MyStats)
|
|
|
self.stats = self.stats_server.server
|
|
|
self.stats_server.run()
|
|
|
- # config_handler
|
|
|
- self.assertEqual(self.stats.config_handler({'foo':'bar'}),
|
|
|
- isc.config.create_answer(0))
|
|
|
|
|
|
# command_handler
|
|
|
- self.base.boss.server._started.wait()
|
|
|
- self.base.boss.server._started.clear()
|
|
|
self.assertEqual(
|
|
|
send_command(
|
|
|
'show', 'Stats',
|
|
@@ -241,12 +269,6 @@ class TestStats(unittest.TestCase):
|
|
|
(0, {'Boss': {'boot_time': self.const_datetime}}))
|
|
|
self.assertEqual(
|
|
|
send_command(
|
|
|
- 'set', 'Stats',
|
|
|
- params={ 'owner' : 'Boss',
|
|
|
- 'data' : { 'boot_time' : self.const_datetime } }),
|
|
|
- (0, None))
|
|
|
- self.assertEqual(
|
|
|
- send_command(
|
|
|
'show', 'Stats',
|
|
|
params={ 'owner' : 'Boss',
|
|
|
'name' : 'boot_time' }),
|
|
@@ -305,7 +327,8 @@ class TestStats(unittest.TestCase):
|
|
|
self.stats_server.shutdown()
|
|
|
|
|
|
def test_update_modules(self):
|
|
|
- self.assertEqual(len(self.stats.modules), 0)
|
|
|
+ self.stats = stats.Stats()
|
|
|
+ self.assertEqual(len(self.stats.modules), 3) # Auth, Boss, Stats
|
|
|
self.stats.update_modules()
|
|
|
self.assertTrue('Stats' in self.stats.modules)
|
|
|
self.assertTrue('Boss' in self.stats.modules)
|
|
@@ -330,6 +353,7 @@ class TestStats(unittest.TestCase):
|
|
|
stats.isc.config.ccsession.parse_answer = orig_parse_answer
|
|
|
|
|
|
def test_get_statistics_data(self):
|
|
|
+ self.stats = stats.Stats()
|
|
|
my_statistics_data = self.stats.get_statistics_data()
|
|
|
self.assertTrue('Stats' in my_statistics_data)
|
|
|
self.assertTrue('Boss' in my_statistics_data)
|
|
@@ -345,13 +369,13 @@ class TestStats(unittest.TestCase):
|
|
|
my_statistics_data = self.stats.get_statistics_data(owner='Stats', name='report_time')
|
|
|
self.assertEqual(my_statistics_data['Stats']['report_time'], self.const_default_datetime)
|
|
|
my_statistics_data = self.stats.get_statistics_data(owner='Stats', name='boot_time')
|
|
|
- self.assertEqual(my_statistics_data['Stats']['boot_time'], self.const_default_datetime)
|
|
|
+ self.assertTrue('boot_time' in my_statistics_data['Stats'])
|
|
|
my_statistics_data = self.stats.get_statistics_data(owner='Stats', name='last_update_time')
|
|
|
- self.assertEqual(my_statistics_data['Stats']['last_update_time'], self.const_default_datetime)
|
|
|
+ self.assertTrue('last_update_time' in my_statistics_data['Stats'])
|
|
|
my_statistics_data = self.stats.get_statistics_data(owner='Stats', name='timestamp')
|
|
|
self.assertEqual(my_statistics_data['Stats']['timestamp'], 0.0)
|
|
|
my_statistics_data = self.stats.get_statistics_data(owner='Stats', name='lname')
|
|
|
- self.assertEqual(my_statistics_data, {'Stats': {'lname':''}})
|
|
|
+ self.assertTrue(len(my_statistics_data['Stats']['lname']) >0)
|
|
|
self.assertRaises(stats.StatsError, self.stats.get_statistics_data,
|
|
|
owner='Stats', name='Bar')
|
|
|
self.assertRaises(stats.StatsError, self.stats.get_statistics_data,
|
|
@@ -360,82 +384,144 @@ class TestStats(unittest.TestCase):
|
|
|
name='Bar')
|
|
|
|
|
|
def test_update_statistics_data(self):
|
|
|
- self.stats.update_statistics_data(owner='Stats', lname='foo@bar')
|
|
|
- self.assertTrue('Stats' in self.stats.statistics_data)
|
|
|
- my_statistics_data = self.stats.statistics_data['Stats']
|
|
|
- self.assertEqual(my_statistics_data['lname'], 'foo@bar')
|
|
|
- self.stats.update_statistics_data(owner='Stats', last_update_time=self.const_datetime)
|
|
|
- self.assertTrue('Stats' in self.stats.statistics_data)
|
|
|
- my_statistics_data = self.stats.statistics_data['Stats']
|
|
|
- self.assertEqual(my_statistics_data['last_update_time'], self.const_datetime)
|
|
|
- self.assertEqual(self.stats.update_statistics_data(owner='Stats', lname=0.0),
|
|
|
+ self.stats = stats.Stats()
|
|
|
+
|
|
|
+ # success
|
|
|
+ self.assertEqual(self.stats.statistics_data['Stats']['lname'],
|
|
|
+ self.stats.cc_session.lname)
|
|
|
+ self.stats.update_statistics_data(
|
|
|
+ 'Stats', self.stats.cc_session.lname,
|
|
|
+ {'lname': 'foo@bar'})
|
|
|
+ self.assertEqual(self.stats.statistics_data['Stats']['lname'],
|
|
|
+ 'foo@bar')
|
|
|
+ # error case
|
|
|
+ self.assertEqual(self.stats.update_statistics_data('Stats', None,
|
|
|
+ {'lname': 0.0}),
|
|
|
['0.0 should be a string'])
|
|
|
- self.assertEqual(self.stats.update_statistics_data(owner='Dummy', foo='bar'),
|
|
|
+ self.assertEqual(self.stats.update_statistics_data('Dummy', None,
|
|
|
+ {'foo': 'bar'}),
|
|
|
['unknown module name: Dummy'])
|
|
|
|
|
|
- def test_update_statistics_data_withpid(self):
|
|
|
- # one pid of Auth
|
|
|
- self.stats.update_statistics_data(owner='Auth',
|
|
|
- pid=9999,
|
|
|
- **{'queries.tcp':1001})
|
|
|
+ def test_update_statistics_data_withmid(self):
|
|
|
+ self.stats = stats.Stats()
|
|
|
+ self.stats.do_polling()
|
|
|
+ # samples of query number
|
|
|
+ bar1_tcp = 1001
|
|
|
+ bar2_tcp = 2001
|
|
|
+ bar3_tcp = 1002
|
|
|
+ bar3_udp = 1003
|
|
|
+ # two auth instances invoked
|
|
|
+ list_auth = [ self.base.auth.server,
|
|
|
+ self.base.auth2.server ]
|
|
|
+ sum_qtcp = 0
|
|
|
+ for a in list_auth:
|
|
|
+ sum_qtcp += a.queries_tcp
|
|
|
+ sum_qudp = 0
|
|
|
+ for a in list_auth:
|
|
|
+ sum_qudp += a.queries_udp
|
|
|
+ self.stats.update_statistics_data('Auth', "bar1@foo",
|
|
|
+ {'queries.tcp':bar1_tcp})
|
|
|
self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 1001)
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data_bypid)
|
|
|
- self.assertTrue(9999 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data_bypid['Auth'][9999])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9999]['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid,
|
|
|
- {'Auth': {9999: {'queries.tcp': 1001}}})
|
|
|
- # non-existent pid of Auth, but no changes in statistics data
|
|
|
- self.stats.update_statistics_data(owner='Auth',
|
|
|
- pid=10000,
|
|
|
- **{'queries.tcp':2001})
|
|
|
+ self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'],
|
|
|
+ bar1_tcp + sum_qtcp)
|
|
|
+ self.assertTrue('Auth' in self.stats.statistics_data_bymid)
|
|
|
+ self.assertTrue('bar1@foo' in self.stats.statistics_data_bymid['Auth'])
|
|
|
+ self.assertTrue('queries.tcp' in self.stats.statistics_data_bymid['Auth']['bar1@foo'])
|
|
|
+ self.assertEqual(self.stats.statistics_data_bymid['Auth']['bar1@foo'],
|
|
|
+ {'queries.tcp': bar1_tcp})
|
|
|
+ # check consolidation of statistics data even if there is
|
|
|
+ # non-existent mid of Auth
|
|
|
+ self.stats.update_statistics_data('Auth', "bar2@foo",
|
|
|
+ {'queries.tcp': bar2_tcp})
|
|
|
self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 1001)
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data_bypid)
|
|
|
- self.assertTrue(9999 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data_bypid['Auth'][9999])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9999]['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid,
|
|
|
- {'Auth': {9999: {'queries.tcp': 1001}}})
|
|
|
- # kill running Auth, then statistics is reset
|
|
|
- self.assertEqual(self.base.boss.server.pid_list[0][0], 9999)
|
|
|
- killed = self.base.boss.server.pid_list.pop(0)
|
|
|
+ self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'],
|
|
|
+ bar1_tcp + bar2_tcp + sum_qtcp)
|
|
|
+ self.assertTrue('Auth' in self.stats.statistics_data_bymid)
|
|
|
+ self.assertTrue('bar1@foo' in self.stats.statistics_data_bymid['Auth'])
|
|
|
+ self.assertTrue('queries.tcp' in self.stats.statistics_data_bymid['Auth']['bar1@foo'])
|
|
|
+ self.assertEqual(self.stats.statistics_data_bymid['Auth']['bar1@foo'],
|
|
|
+ {'queries.tcp': bar1_tcp})
|
|
|
+ self.assertEqual(self.stats.statistics_data_bymid['Auth']['bar2@foo'],
|
|
|
+ {'queries.tcp': bar2_tcp})
|
|
|
+ # kill running Auth but the statistics data doesn't change
|
|
|
+ self.base.auth2.server.shutdown()
|
|
|
self.stats.update_statistics_data()
|
|
|
self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
self.assertTrue('queries.udp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 0)
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.udp'], 0)
|
|
|
- self.assertFalse('Auth' in self.stats.statistics_data_bypid)
|
|
|
+ self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'],
|
|
|
+ bar1_tcp + bar2_tcp + sum_qtcp)
|
|
|
+ self.assertEqual(self.stats.statistics_data['Auth']['queries.udp'], sum_qudp)
|
|
|
+ self.assertTrue('Auth' in self.stats.statistics_data_bymid)
|
|
|
# restore statistics data of killed auth
|
|
|
- self.base.boss.server.pid_list = [ killed ] + self.base.boss.server.pid_list[:]
|
|
|
- self.stats.update_statistics_data(owner='Auth',
|
|
|
- pid=9999,
|
|
|
- **{'queries.tcp':1001})
|
|
|
- # another pid of Auth
|
|
|
- self.stats.update_statistics_data(owner='Auth',
|
|
|
- pid=9998,
|
|
|
- **{'queries.tcp':1002,
|
|
|
- 'queries.udp':1003})
|
|
|
+ # self.base.boss.server.pid_list = [ killed ] + self.base.boss.server.pid_list[:]
|
|
|
+ self.stats.update_statistics_data('Auth',
|
|
|
+ "bar1@foo",
|
|
|
+ {'queries.tcp': bar1_tcp})
|
|
|
+ # set another mid of Auth
|
|
|
+ self.stats.update_statistics_data('Auth',
|
|
|
+ "bar3@foo",
|
|
|
+ {'queries.tcp':bar3_tcp,
|
|
|
+ 'queries.udp':bar3_udp})
|
|
|
self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
self.assertTrue('queries.udp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 2003)
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.udp'], 1003)
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data_bypid)
|
|
|
- self.assertTrue(9999 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue(9998 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data_bypid['Auth'][9999])
|
|
|
- self.assertTrue('queries.udp' in self.stats.statistics_data_bypid['Auth'][9998])
|
|
|
- self.assertTrue('queries.udp' in self.stats.statistics_data_bypid['Auth'][9998])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9999]['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9998]['queries.tcp'], 1002)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9998]['queries.udp'], 1003)
|
|
|
+ self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'],
|
|
|
+ bar1_tcp + bar2_tcp + bar3_tcp + sum_qtcp)
|
|
|
+ self.assertEqual(self.stats.statistics_data['Auth']['queries.udp'],
|
|
|
+ bar3_udp + sum_qudp)
|
|
|
+ self.assertTrue('Auth' in self.stats.statistics_data_bymid)
|
|
|
+ self.assertTrue('bar1@foo' in self.stats.statistics_data_bymid['Auth'])
|
|
|
+ self.assertTrue('bar3@foo' in self.stats.statistics_data_bymid['Auth'])
|
|
|
+ self.assertTrue('queries.tcp' in self.stats.statistics_data_bymid['Auth']['bar1@foo'])
|
|
|
+ self.assertTrue('queries.udp' in self.stats.statistics_data_bymid['Auth']['bar3@foo'])
|
|
|
+ self.assertTrue('queries.udp' in self.stats.statistics_data_bymid['Auth']['bar3@foo'])
|
|
|
+ self.assertEqual(self.stats.statistics_data_bymid['Auth']['bar1@foo']['queries.tcp'], bar1_tcp)
|
|
|
+ self.assertEqual(self.stats.statistics_data_bymid['Auth']['bar3@foo']['queries.tcp'], bar3_tcp)
|
|
|
+ self.assertEqual(self.stats.statistics_data_bymid['Auth']['bar3@foo']['queries.udp'], bar3_udp)
|
|
|
+
|
|
|
+ def test_config(self):
|
|
|
+ orig_get_timestamp = stats.get_timestamp
|
|
|
+ stats.get_timestamp = lambda : self.const_timestamp
|
|
|
+ stats_server = ThreadingServerManager(MyStats)
|
|
|
+ stat = stats_server.server
|
|
|
+ # test updating poll-interval
|
|
|
+ self.assertEqual(stat.config['poll-interval'], 60)
|
|
|
+ self.assertEqual(stat.get_interval(), 60)
|
|
|
+ self.assertEqual(stat.next_polltime, self.const_timestamp + 60)
|
|
|
+ self.assertEqual(stat.config_handler({'poll-interval': 120}),
|
|
|
+ isc.config.create_answer(0))
|
|
|
+ self.assertEqual(stat.config['poll-interval'], 120)
|
|
|
+ self.assertEqual(stat.get_interval(), 120)
|
|
|
+ self.assertEqual(stat.next_polltime, self.const_timestamp + 120)
|
|
|
+ stats.get_timestamp = orig_get_timestamp
|
|
|
+ self.assertEqual(stat.config_handler({'poll-interval': "foo"}),
|
|
|
+ isc.config.create_answer(1, 'foo should be an integer'))
|
|
|
+ self.assertEqual(stat.config_handler({'poll-interval': -1}),
|
|
|
+ isc.config.create_answer(1, 'Negative integer ignored'))
|
|
|
+ # unknown item
|
|
|
+ self.assertEqual(
|
|
|
+ stat.config_handler({'_UNKNOWN_KEY_': None}),
|
|
|
+ isc.config.ccsession.create_answer(
|
|
|
+ 1, "unknown item _UNKNOWN_KEY_"))
|
|
|
+ # test no change if zero interval time
|
|
|
+ self.assertEqual(stat.config_handler({'poll-interval': 0}),
|
|
|
+ isc.config.create_answer(0))
|
|
|
+ self.assertEqual(stat.config['poll-interval'], 0)
|
|
|
+ stats_server.run()
|
|
|
+ self.assertEqual(
|
|
|
+ send_command(
|
|
|
+ 'show', 'Stats',
|
|
|
+ params={ 'owner' : 'Boss',
|
|
|
+ 'name' : 'boot_time' }),
|
|
|
+ (0, {'Boss': {'boot_time': self.const_datetime}}))
|
|
|
+ stats_server.shutdown()
|
|
|
|
|
|
def test_commands(self):
|
|
|
+ self.stats = stats.Stats()
|
|
|
+
|
|
|
# status
|
|
|
self.assertEqual(self.stats.command_status(),
|
|
|
isc.config.create_answer(
|
|
@@ -448,6 +534,14 @@ class TestStats(unittest.TestCase):
|
|
|
self.assertFalse(self.stats.running)
|
|
|
|
|
|
def test_command_show(self):
|
|
|
+ # two auth instances invoked
|
|
|
+ list_auth = [ self.base.auth.server,
|
|
|
+ self.base.auth2.server ]
|
|
|
+ sum_qtcp = 0
|
|
|
+ sum_qudp = 0
|
|
|
+ sum_qtcp_perzone = 0
|
|
|
+ sum_qudp_perzone = 0
|
|
|
+ self.stats = stats.Stats()
|
|
|
self.assertEqual(self.stats.command_show(owner='Foo', name=None),
|
|
|
isc.config.create_answer(
|
|
|
1, "specified arguments are incorrect: owner: Foo, name: None"))
|
|
@@ -457,46 +551,50 @@ class TestStats(unittest.TestCase):
|
|
|
self.assertEqual(self.stats.command_show(owner='Foo', name='bar'),
|
|
|
isc.config.create_answer(
|
|
|
1, "specified arguments are incorrect: owner: Foo, name: bar"))
|
|
|
+
|
|
|
+ for a in list_auth:
|
|
|
+ sum_qtcp += a.queries_tcp
|
|
|
+ sum_qudp += a.queries_udp
|
|
|
+ zonename = a.queries_per_zone[0]['zonename']
|
|
|
+ sum_qtcp_perzone += a.queries_per_zone[0]['queries.tcp']
|
|
|
+ sum_qudp_perzone += a.queries_per_zone[0]['queries.udp']
|
|
|
+
|
|
|
self.assertEqual(self.stats.command_show(owner='Auth'),
|
|
|
isc.config.create_answer(
|
|
|
- 0, {'Auth':{ 'queries.udp': 0,
|
|
|
- 'queries.tcp': 0,
|
|
|
+ 0, {'Auth':{ 'queries.udp': sum_qudp,
|
|
|
+ 'queries.tcp': sum_qtcp,
|
|
|
'queries.perzone': [{ 'zonename': 'test1.example',
|
|
|
- 'queries.udp': 1,
|
|
|
- 'queries.tcp': 2 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.udp': 3,
|
|
|
- 'queries.tcp': 4 }] }}))
|
|
|
+ 'queries.udp': sum_qudp_perzone,
|
|
|
+ 'queries.tcp': sum_qtcp_perzone }
|
|
|
+ ]}}))
|
|
|
self.assertEqual(self.stats.command_show(owner='Auth', name='queries.udp'),
|
|
|
isc.config.create_answer(
|
|
|
- 0, {'Auth': {'queries.udp':0}}))
|
|
|
+ 0, {'Auth': {'queries.udp': sum_qudp}}))
|
|
|
self.assertEqual(self.stats.command_show(owner='Auth', name='queries.perzone'),
|
|
|
isc.config.create_answer(
|
|
|
0, {'Auth': {'queries.perzone': [{ 'zonename': 'test1.example',
|
|
|
- 'queries.udp': 1,
|
|
|
- 'queries.tcp': 2 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.udp': 3,
|
|
|
- 'queries.tcp': 4 }]}}))
|
|
|
- orig_get_timestamp = stats.get_timestamp
|
|
|
+ 'queries.udp': sum_qudp_perzone,
|
|
|
+ 'queries.tcp': sum_qtcp_perzone }]}}))
|
|
|
orig_get_datetime = stats.get_datetime
|
|
|
+ orig_get_timestamp = stats.get_timestamp
|
|
|
+ stats.get_datetime = lambda x=None: self.const_datetime
|
|
|
stats.get_timestamp = lambda : self.const_timestamp
|
|
|
- stats.get_datetime = lambda : self.const_datetime
|
|
|
- self.assertEqual(stats.get_timestamp(), self.const_timestamp)
|
|
|
- self.assertEqual(stats.get_datetime(), self.const_datetime)
|
|
|
- self.assertEqual(self.stats.command_show(owner='Stats', name='report_time'), \
|
|
|
- isc.config.create_answer(0, {'Stats': {'report_time':self.const_datetime}}))
|
|
|
- self.assertEqual(self.stats.statistics_data['Stats']['timestamp'], self.const_timestamp)
|
|
|
- self.assertEqual(self.stats.statistics_data['Stats']['boot_time'], self.const_default_datetime)
|
|
|
- stats.get_timestamp = orig_get_timestamp
|
|
|
+ self.assertEqual(self.stats.command_show(owner='Stats', name='report_time'),
|
|
|
+ isc.config.create_answer(
|
|
|
+ 0, {'Stats': {'report_time':self.const_datetime}}))
|
|
|
+ self.assertEqual(self.stats.command_show(owner='Stats', name='timestamp'),
|
|
|
+ isc.config.create_answer(
|
|
|
+ 0, {'Stats': {'timestamp':self.const_timestamp}}))
|
|
|
stats.get_datetime = orig_get_datetime
|
|
|
- self.stats.mccs.specification = isc.config.module_spec.ModuleSpec(
|
|
|
+ stats.get_timestamp = orig_get_timestamp
|
|
|
+ self.stats.modules[self.stats.module_name] = isc.config.module_spec.ModuleSpec(
|
|
|
{ "module_name": self.stats.module_name,
|
|
|
"statistics": [] } )
|
|
|
self.assertRaises(
|
|
|
- stats.StatsError, self.stats.command_show, owner='Foo', name='bar')
|
|
|
+ stats.StatsError, self.stats.command_show, owner=self.stats.module_name, name='bar')
|
|
|
|
|
|
def test_command_showchema(self):
|
|
|
+ self.stats = stats.Stats()
|
|
|
(rcode, value) = isc.config.ccsession.parse_answer(
|
|
|
self.stats.command_showschema())
|
|
|
self.assertEqual(rcode, 0)
|
|
@@ -724,170 +822,78 @@ class TestStats(unittest.TestCase):
|
|
|
isc.config.create_answer(
|
|
|
1, "module name is not specified"))
|
|
|
|
|
|
- def test_command_set(self):
|
|
|
- orig_get_datetime = stats.get_datetime
|
|
|
- stats.get_datetime = lambda : self.const_datetime
|
|
|
- (rcode, value) = isc.config.ccsession.parse_answer(
|
|
|
- self.stats.command_set(owner='Boss',
|
|
|
- data={ 'boot_time' : self.const_datetime }))
|
|
|
- stats.get_datetime = orig_get_datetime
|
|
|
- self.assertEqual(rcode, 0)
|
|
|
- self.assertTrue(value is None)
|
|
|
- self.assertEqual(self.stats.statistics_data['Boss']['boot_time'],
|
|
|
- self.const_datetime)
|
|
|
- self.assertEqual(self.stats.statistics_data['Stats']['last_update_time'],
|
|
|
- self.const_datetime)
|
|
|
- self.assertEqual(self.stats.command_set(owner='Stats',
|
|
|
- data={ 'lname' : 'foo@bar' }),
|
|
|
- isc.config.create_answer(0, None))
|
|
|
- self.stats.statistics_data['Stats'] = {}
|
|
|
- self.stats.mccs.specification = isc.config.module_spec.ModuleSpec(
|
|
|
- { "module_name": self.stats.module_name,
|
|
|
- "statistics": [] } )
|
|
|
- self.assertEqual(self.stats.command_set(owner='Stats',
|
|
|
- data={ 'lname' : '_foo_@_bar_' }),
|
|
|
- isc.config.create_answer(
|
|
|
- 1,
|
|
|
- "errors while setting statistics data: unknown item lname"))
|
|
|
- self.stats.statistics_data['Stats'] = {}
|
|
|
- self.stats.mccs.specification = isc.config.module_spec.ModuleSpec(
|
|
|
- { "module_name": self.stats.module_name } )
|
|
|
- self.assertEqual(self.stats.command_set(owner='Stats',
|
|
|
- data={ 'lname' : '_foo_@_bar_' }),
|
|
|
- isc.config.create_answer(
|
|
|
- 1,
|
|
|
- "errors while setting statistics data: No statistics specification"))
|
|
|
- self.stats.statistics_data['Stats'] = {}
|
|
|
- self.stats.mccs.specification = isc.config.module_spec.ModuleSpec(
|
|
|
- { "module_name": self.stats.module_name,
|
|
|
- "statistics": [
|
|
|
- {
|
|
|
- "item_name": "dummy",
|
|
|
- "item_type": "string",
|
|
|
- "item_optional": False,
|
|
|
- "item_default": "",
|
|
|
- "item_title": "Local Name",
|
|
|
- "item_description": "brabra"
|
|
|
- } ] } )
|
|
|
- self.assertRaises(stats.StatsError,
|
|
|
- self.stats.command_set, owner='Stats', data={ 'dummy' : '_xxxx_yyyy_zzz_' })
|
|
|
-
|
|
|
- def test_command_set_withpid(self):
|
|
|
- # one pid of Auth
|
|
|
- retval = isc.config.ccsession.parse_answer(
|
|
|
- self.stats.command_set(owner='Auth',
|
|
|
- pid=9997,
|
|
|
- data={ 'queries.tcp' : 1001,
|
|
|
- 'queries.perzone':
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 1 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 2,
|
|
|
- 'queries.udp': 3 }]}))
|
|
|
- self.assertEqual(retval, (0,None))
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 1 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 2,
|
|
|
- 'queries.udp': 3 }])
|
|
|
- self.assertTrue('Stats' in self.stats.statistics_data)
|
|
|
- self.assertTrue('last_update_time' in self.stats.statistics_data['Stats'])
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data_bypid)
|
|
|
- self.assertTrue(9997 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data_bypid['Auth'][9997])
|
|
|
- self.assertTrue('queries.perzone' in self.stats.statistics_data_bypid['Auth'][9997])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9997]['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9997]['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 1 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 2,
|
|
|
- 'queries.udp': 3 }])
|
|
|
- # non-existent pid of Auth, but no changes in statistics data
|
|
|
- retval = isc.config.ccsession.parse_answer(
|
|
|
- self.stats.command_set(owner='Auth',
|
|
|
- pid=10000,
|
|
|
- data={ 'queries.tcp' : 2001,
|
|
|
- 'queries.perzone':
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 101 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 102,
|
|
|
- 'queries.udp': 103 }]}))
|
|
|
- self.assertEqual(retval, (0,None))
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 1 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 2,
|
|
|
- 'queries.udp': 3 }])
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data_bypid)
|
|
|
- self.assertTrue(9997 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data_bypid['Auth'][9997])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9997]['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9997]['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 1 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 2,
|
|
|
- 'queries.udp': 3 }])
|
|
|
- # another pid of Auth
|
|
|
- retval = isc.config.ccsession.parse_answer(
|
|
|
- self.stats.command_set(owner='Auth',
|
|
|
- pid=9996,
|
|
|
- data={ 'queries.tcp' : 1002,
|
|
|
- 'queries.udp' : 1003,
|
|
|
- 'queries.perzone':
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 10,
|
|
|
- 'queries.udp': 11},
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 12,
|
|
|
- 'queries.udp': 13 }]}))
|
|
|
- self.assertEqual(retval, (0,None))
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data)
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertTrue('queries.udp' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertTrue('queries.perzone' in self.stats.statistics_data['Auth'])
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.tcp'], 2003)
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.udp'], 1003)
|
|
|
- self.assertEqual(self.stats.statistics_data['Auth']['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 11,
|
|
|
- 'queries.udp': 11},
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 14,
|
|
|
- 'queries.udp': 16 }])
|
|
|
- self.assertTrue('Auth' in self.stats.statistics_data_bypid)
|
|
|
- self.assertTrue(9997 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue(9996 in self.stats.statistics_data_bypid['Auth'])
|
|
|
- self.assertTrue('queries.tcp' in self.stats.statistics_data_bypid['Auth'][9997])
|
|
|
- self.assertTrue('queries.udp' in self.stats.statistics_data_bypid['Auth'][9996])
|
|
|
- self.assertTrue('queries.udp' in self.stats.statistics_data_bypid['Auth'][9996])
|
|
|
- self.assertTrue('queries.perzone' in self.stats.statistics_data_bypid['Auth'][9996])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9997]['queries.tcp'], 1001)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9997]['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 1 },
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 2,
|
|
|
- 'queries.udp': 3 }])
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9996]['queries.tcp'], 1002)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9996]['queries.udp'], 1003)
|
|
|
- self.assertEqual(self.stats.statistics_data_bypid['Auth'][9996]['queries.perzone'],
|
|
|
- [{ 'zonename': 'test1.example',
|
|
|
- 'queries.tcp': 10,
|
|
|
- 'queries.udp': 11},
|
|
|
- { 'zonename': 'test2.example',
|
|
|
- 'queries.tcp': 12,
|
|
|
- 'queries.udp': 13 }])
|
|
|
+ def test_polling(self):
|
|
|
+ stats_server = ThreadingServerManager(MyStats)
|
|
|
+ stat = stats_server.server
|
|
|
+ stats_server.run()
|
|
|
+ self.assertEqual(
|
|
|
+ send_command('show', 'Stats'),
|
|
|
+ (0, stat.statistics_data))
|
|
|
+ # check statistics data of 'Boss'
|
|
|
+ boss = self.base.boss.server
|
|
|
+ self.assertEqual(
|
|
|
+ stat.statistics_data_bymid['Boss'][boss.cc_session.lname],
|
|
|
+ {'boot_time': self.const_datetime})
|
|
|
+ self.assertEqual(
|
|
|
+ len(stat.statistics_data_bymid['Boss']), 1)
|
|
|
+ self.assertEqual(
|
|
|
+ stat.statistics_data['Boss'],
|
|
|
+ {'boot_time': self.const_datetime})
|
|
|
+ # check statistics data of each 'Auth' instances
|
|
|
+ list_auth = ['', '2']
|
|
|
+ for i in list_auth:
|
|
|
+ auth = getattr(self.base,"auth"+i).server
|
|
|
+ for s in stat.statistics_data_bymid['Auth'].values():
|
|
|
+ self.assertEqual(
|
|
|
+ s, {'queries.perzone': auth.queries_per_zone,
|
|
|
+ 'queries.tcp': auth.queries_tcp,
|
|
|
+ 'queries.udp': auth.queries_udp})
|
|
|
+ n = len(stat.statistics_data_bymid['Auth'])
|
|
|
+ self.assertEqual(n, len(list_auth))
|
|
|
+ # check consolidation of statistics data of the auth
|
|
|
+ # instances
|
|
|
+ self.assertEqual(
|
|
|
+ stat.statistics_data['Auth'],
|
|
|
+ {'queries.perzone': [
|
|
|
+ {'zonename':
|
|
|
+ auth.queries_per_zone[0]['zonename'],
|
|
|
+ 'queries.tcp':
|
|
|
+ auth.queries_per_zone[0]['queries.tcp']*n,
|
|
|
+ 'queries.udp':
|
|
|
+ auth.queries_per_zone[0]['queries.udp']*n}],
|
|
|
+ 'queries.tcp': auth.queries_tcp*n,
|
|
|
+ 'queries.udp': auth.queries_udp*n})
|
|
|
+ # check statistics data of 'Stats'
|
|
|
+ self.assertEqual(
|
|
|
+ len(stat.statistics_data['Stats']), 5)
|
|
|
+ self.assertTrue('boot_time' in
|
|
|
+ stat.statistics_data['Stats'])
|
|
|
+ self.assertTrue('last_update_time' in
|
|
|
+ stat.statistics_data['Stats'])
|
|
|
+ self.assertTrue('report_time' in
|
|
|
+ stat.statistics_data['Stats'])
|
|
|
+ self.assertTrue('timestamp' in
|
|
|
+ stat.statistics_data['Stats'])
|
|
|
+ self.assertEqual(
|
|
|
+ stat.statistics_data['Stats']['lname'],
|
|
|
+ stat.mccs._session.lname)
|
|
|
+ stats_server.shutdown()
|
|
|
+
|
|
|
+ def test_polling2(self):
|
|
|
+ # set invalid statistics
|
|
|
+ boss = self.base.boss.server
|
|
|
+ boss.statistics_data = {'boot_time':1}
|
|
|
+ stats_server = ThreadingServerManager(MyStats)
|
|
|
+ stat = stats_server.server
|
|
|
+ stats_server.run()
|
|
|
+ self.assertEqual(
|
|
|
+ send_command('status', 'Stats'),
|
|
|
+ (0, "Stats is up. (PID " + str(os.getpid()) + ")"))
|
|
|
+ # check default statistics data of 'Boss'
|
|
|
+ self.assertEqual(
|
|
|
+ stat.statistics_data['Boss'],
|
|
|
+ {'boot_time': self.const_default_datetime})
|
|
|
+ stats_server.shutdown()
|
|
|
|
|
|
class TestOSEnv(unittest.TestCase):
|
|
|
def test_osenv(self):
|