Exemplo n.º 1
0
    def test_add_to_agregate(self):
        """Ajout d'un événement brut à un évènement corrélé déjà existant"""
        # On crée 2 couples host/service.
        host1 = functions.add_host(u'messagerie')
        service1 = functions.add_lowlevelservice(host1, u'Processes')
        service2 = functions.add_lowlevelservice(host1, u'CPU')

        # On ajoute 1 couple événement/agrégat à la BDD.
        event2 = functions.add_event(service2, u'WARNING', 'WARNING: CPU is overloaded')
        events_aggregate1 = functions.add_correvent([event2])

        # On ajoute un nouvel événement à la BDD.
        event1 = functions.add_event(service1, u'WARNING', 'WARNING: Processes are not responding')

        # On ajoute ce nouvel événement à l'agrégat existant.
        ctx = helpers.ContextStub(42)
        yield add_to_aggregate(
            event1.idevent,
            events_aggregate1.idcorrevent,
            DummyDatabaseWrapper(True),
            ctx,
            123,
            False
        )
        DBSession.flush()

        # On vérifie que l'événement a bien été ajouté à l'agrégat.
        DBSession.refresh(events_aggregate1)
        expected = sorted([event1.idevent, event2.idevent])
        actual = sorted([event.idevent for event in events_aggregate1.events])
        print "actual = %r, expected = %r" % (actual, expected)
        self.assertEquals(actual, expected)
Exemplo n.º 2
0
    def test_reuse_correvent_if_possible(self):
        """Privilégier la réutilisation des CorrEvents (#908)."""
        self.make_dependencies()
        host = DBSession.query(Host).first()
        ts = int(time.time())

        # On crée un événement brut, qu'on ne rattache
        # à aucun événement corrélé.
        DBSession.add(
            Event(
                supitem=host,
                current_state=StateName.statename_to_value(u"WARNING"),
                message="WARNING: ping",
                timestamp=datetime.fromtimestamp(ts - 42),
            )
        )
        DBSession.flush()

        # On crée un deuxième événement brut correspondant au même
        # élément supervisé, cette fois rattaché à un événement corrélé.
        event = Event(
            supitem=host,
            current_state=StateName.statename_to_value(u"WARNING"),
            message="WARNING: ping2",
            timestamp=datetime.fromtimestamp(ts - 21),
        )
        correvent = CorrEvent(
            cause=event,
            priority=1,
            trouble_ticket=u"azerty1234",
            ack=CorrEvent.ACK_CLOSED,
            occurrence=1,
            timestamp_active=datetime.fromtimestamp(ts - 21),
        )
        correvent.events = [event]
        DBSession.add(event)
        DBSession.add(correvent)
        DBSession.flush()

        # Préparation des informations du messages
        # et mise à jour de l'événement brut en base.
        info_dictionary = {
            "timestamp": datetime.fromtimestamp(ts),
            "host": host.name,
            "service": None,
            "state": u"CRITICAL",
            "message": u"CRITICAL: even worse",
            "idsupitem": SupItem.get_supitem(host.name, None),
        }
        insert_event(info_dictionary)

        # On doit toujours avoir 2 événements bruts en base.
        self.assertEquals(2, DBSession.query(Event).count())
        # On doit avoir un seul événement corrélé.
        correvent = DBSession.query(CorrEvent).one()
        # La cause de cet événement corrélé
        # doit toujours être la même.
        DBSession.refresh(event)
        self.assertEquals(event, correvent.cause)

        # L'événement brut associé à l'événement
        # corrélé doit avoir été mis à jour.
        self.assertEquals(datetime.fromtimestamp(ts), event.timestamp)
        self.assertEquals(StateName.statename_to_value(u"CRITICAL"), event.current_state)
        self.assertEquals(StateName.statename_to_value(u"CRITICAL"), event.peak_state)
        self.assertEquals(StateName.statename_to_value(u"WARNING"), event.initial_state)
        self.assertEquals(info_dictionary["message"], event.message)

        # L'autre événement brut ne doit pas avoir changé.
        event = DBSession.query(Event).filter(Event.idevent != event.idevent).one()
        self.assertEquals(datetime.fromtimestamp(ts - 42), event.timestamp)
        self.assertEquals(StateName.statename_to_value(u"WARNING"), event.current_state)
        self.assertEquals(StateName.statename_to_value(u"WARNING"), event.peak_state)
        self.assertEquals(StateName.statename_to_value(u"WARNING"), event.initial_state)
        self.assertEquals("WARNING: ping", event.message)