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)
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)