def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix="test-connector-metro-") self.rrd_base_dir = os.path.join(self.tmpdir, "rrds") os.mkdir(self.rrd_base_dir) confdb = MetroConfDB(os.path.join(os.path.dirname(__file__), "connector-metro.db")) confdb.reload() rrdtool = Mock() rrdtool.run.side_effect = lambda *a, **kw: defer.succeed(None) rrdtool.rrd_base_dir = self.rrd_base_dir rrdtool.rrd_path_mode = "flat" self.mgr = RRDToolManager(rrdtool, confdb) self.mgr._fixperms = Mock()
class RRDToolManagerTestCase(unittest.TestCase): def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix="test-connector-metro-") self.rrd_base_dir = os.path.join(self.tmpdir, "rrds") os.mkdir(self.rrd_base_dir) confdb = MetroConfDB(os.path.join(os.path.dirname(__file__), "connector-metro.db")) confdb.reload() rrdtool = Mock() rrdtool.run.side_effect = lambda *a, **kw: defer.succeed(None) rrdtool.rrd_base_dir = self.rrd_base_dir rrdtool.rrd_path_mode = "flat" self.mgr = RRDToolManager(rrdtool, confdb) self.mgr._fixperms = Mock() def tearDown(self): self.mgr.confdb._db.close() rmtree(self.tmpdir) @deferred(timeout=30) def test_create_needed(self): msg = { "type": "perf", "timestamp": "1165939739", "host": "server1.example.com", "datasource": "Load", "value": "12", } d = self.mgr.createIfNeeded(msg) def check(_ignored): print self.mgr.rrdtool.run.call_args_list self.assertEqual(len(self.mgr.rrdtool.run.call_args_list), 1) self.assertEqual(self.mgr.rrdtool.run.call_args_list[0][0], ('create', self.rrd_base_dir+"/server1.example.com/Load.rrd", ['--step', '300', '--start', '1165939729', 'RRA:AVERAGE:0.5:1:600', 'RRA:AVERAGE:0.5:6:700', 'RRA:AVERAGE:0.5:24:775', 'RRA:AVERAGE:0.5:288:732', 'DS:DS:GAUGE:600:U:U'])) d.addCallback(check) return d @deferred(timeout=30) def test_already_created(self): """Pas de création si le fichier existe déjà""" rrdfile = os.path.join(self.rrd_base_dir, "server1.example.com", "Load.rrd") os.makedirs(os.path.dirname(rrdfile)) open(rrdfile, "w").close() msg = { "type": "perf", "timestamp": "123456789", "host": "server1.example.com", "datasource": "Load", "value": "42", } d = self.mgr.createIfNeeded(msg) def check(r): self.assertFalse(self.mgr.rrdtool.run.called) d.addCallback(check) return d @deferred(timeout=30) def test_update(self): msg = { "type": "perf", "timestamp": "1165939739", "host": "server1.example.com", "datasource": "Load", "value": "12", "has_thresholds": False, } #self.mgr.getFilename = Mock(return_value=self.rrd_base_dir+"") #self.mgr.getOldFilename = Mock(return_value=self.rrd_base_dir+"") d = self.mgr.processMessage(msg) def check(_ignored): print self.mgr.rrdtool.run.call_args_list self.assertEqual(len(self.mgr.rrdtool.run.call_args_list), 1) self.assertEqual(self.mgr.rrdtool.run.call_args_list[0][0], ('update', self.rrd_base_dir+"/server1.example.com/Load.rrd", '1165939739:12')) d.addCallback(check) return d def test_special_chars_in_pds_name(self): msg = { "type": "perf", "timestamp": "1165939739", "host": "server1.example.com", "datasource": "A B/C\\D.E%F", "value": "42", } print self.mgr.getFilename(msg) expected = (self.rrd_base_dir+"/server1.example.com/" "A+B%2FC%5CD.E%25F.rrd") self.assertEqual(expected, self.mgr.getFilename(msg)) def test_special_chars_in_host_name(self): """Caractères spéciaux dans le nom de l'hôte (#454).""" msg = { "type": "perf", "timestamp": "1165939739", "host": "A b/c.example.com", "datasource": "Load", "value": "42", } print self.mgr.getFilename(msg) expected = self.rrd_base_dir+"/A+b%2Fc.example.com/Load.rrd" self.assertEqual(expected, self.mgr.getFilename(msg)) @deferred(timeout=30) def test_non_existing_host(self): """Reception d'un message pour un hôte absent du fichier de conf""" msg = {"type": "perf", "timestamp": "123456789", "host": "dummy_host", "datasource": "dummy_datasource", "value": "dummy_value", } d = self.mgr._create(self.rrd_base_dir+"/nonexistant", msg) def check_failure(f): if not isinstance(f.value, NotInConfiguration): self.fail("Raised exeception is not of the right type (got %s)" % type(f.value)) d.addCallbacks(lambda x: self.fail("No exception raised"), check_failure) return d @deferred(timeout=30) def test_missing_ds_data(self): msg = {"host": "dummy_host", "datasource": "dummy_datasource"} full_ds = {"host": "dummy_host", "datasource": "dummy_datasource", "step": 300, "warning_threshold": "42", "critical_threshold": "43", "nagiosname": "Dummy Service", "ventilation": "ventilation_group", } required_attrs = [ 'warning_threshold', 'critical_threshold', 'nagiosname', 'ventilation', ] def check_failure(f): if not isinstance(f.value, MissingConfigurationData): self.fail("Raised exeception is not of the right type (got %s)" % type(f.value)) dl = [] for attr in required_attrs: ds = full_ds.copy() ds[attr] = None d = self.mgr.getLastValue(ds, msg) d.addCallbacks(lambda x: self.fail( "l'attribut %s devrait être obligatoire" % attr), check_failure) dl.append(d) return defer.DeferredList(dl, fireOnOneErrback=True) @deferred(timeout=30) def test_last_value(self): msg = {"host": "dummy_host éçà", "datasource": "dummy_datasource éçà"} ds = {"host": "dummy_host éçà", "datasource": "dummy_datasource éçà", "step": 300, "warning_threshold": "42", "critical_threshold": "43", "nagiosname": "Dummy Service", "ventilation": "ventilation_group", } self.mgr.rrdtool.run.side_effect = lambda *a, **kw: defer.succeed( "DS\n\ntimestamp: 42\n") d = self.mgr.getLastValue(ds, msg) def check(r): print r self.assertEqual(r, 42) d.addCallback(check) return d @deferred(timeout=30) def test_last_value_no_rrdcached(self): """Ne pas utiliser RRDCached s'il y a des seuils""" msg = {"host": "dummy_host éçà", "datasource": "dummy_datasource éçà"} ds = {"host": "dummy_host éçà", "datasource": "dummy_datasource éçà", "step": 300, "warning_threshold": "42", "critical_threshold": "43", "nagiosname": "Dummy Service", "ventilation": "ventilation_group", } self.mgr.rrdtool.run.side_effect = lambda *a, **kw: defer.succeed( "DS\n\ntimestamp: 42\n") d = self.mgr.getLastValue(ds, msg) def check_no_rrdcached(r): print self.mgr.rrdtool.run.call_args_list for cmd in self.mgr.rrdtool.run.call_args_list: print cmd self.assertTrue("no_rrdcached" in cmd[1]) self.assertTrue(cmd[1]["no_rrdcached"]) d.addCallback(check_no_rrdcached) return d