Ejemplo n.º 1
0
 def check(r):
     output = client.channel.sent
     msg_perf = json.loads(output[0]["content"].body)
     self.assertEqual(msg_perf["type"], "perf")
     self.assertEqual(msg_perf["datasource"],
                      "changedsvc-dummykey")
     msg_cmd = json.loads(output[1]["content"].body)
     self.assertEqual(msg_cmd["type"], "nagios")
     self.assertTrue(msg_cmd["value"].startswith(
                     "changedhost;changedsvc;"))
Ejemplo n.º 2
0
 def check(r):
     output = client.channel.sent
     print output
     self.assertEqual(len(output), 2)
     msg_perf = json.loads(output[0]["content"].body)
     self.assertEqual(msg_perf["type"], "perf")
     self.assertEqual(msg_perf["host"], self.localhn)
     self.assertEqual(msg_perf["datasource"], "testservice-dummykey")
     self.assertEqual(msg_perf["value"], "dummyvalue")
     msg_cmd = json.loads(output[1]["content"].body)
     self.assertEqual(msg_cmd["type"], "nagios")
     self.assertEqual(msg_cmd["cmdname"],
                      "PROCESS_SERVICE_CHECK_RESULT")
     self.assertTrue(msg_cmd["value"].startswith(
                     "%s;testservice;0;OK:" % self.localhn))
Ejemplo n.º 3
0
    def sendMessage(self, msg):
        """
        Traite un message en l'envoyant sur le bus.

        @param msg: message à traiter
        @type  msg: C{str} ou C{dict}
        @return: le C{Deferred} avec la réponse, ou C{None} si cela n'a pas
            lieu d'être (message envoyé en push)
        """
        self._messages_sent += 1
        if isinstance(msg, basestring):
            msg = json.loads(msg)
        try:
            if isinstance(msg["timestamp"], datetime):
                msg["timestamp"] = time.mktime(msg["timestamp"].timetuple())
        except (KeyError, TypeError):
            pass
        # accumulation des messages de perf
        msg = self._accumulate_perf_msgs(msg)
        if msg is None:
            return defer.succeed(None)
        msg_text = json.dumps(msg)

        msg_type = msg["type"]
        exchange = msg_type
        ttl = None
        if msg_type in self._publications:
            exchange, ttl = self._publications[msg_type]

        routing_key = msg.get("routing_key", msg_type)
        persistent = msg.get("persistent", True)
        result = self.client.send(exchange, str(routing_key), msg_text,
                                  persistent, content_type="application/json",
                                  ttl=ttl)
        return result
Ejemplo n.º 4
0
    def write(self, msg):
        """
        Méthode à appeler pour traiter un message en provenance du bus.

        Si le traitement se passe bien (pas d'I{errback}), le message sera
        acquitté, sinon il sera rejeté, puis le message suivant sera demandé au
        bus.

        @param msg: message à traiter
        @type  msg: C{txamqp.message.Message}
        @deprecated: Remplacée par la fonction L{write_batch} qui prend en
                     charge une liste de messages.
        """
        try:
            content = json.loads(msg.content.body)
        except ValueError:
            LOGGER.warning(_("Received message is not JSON-encoded: %r"),
                           msg.content.body)
            d = defer.succeed(None)
        else:
            if "messages" in content and content["messages"]:
                d = self._processList(content["messages"])
            else:
                d = defer.maybeDeferred(self.processMessage, content)
            d.addCallbacks(self.processingSucceeded, self.processingFailed,
                           callbackArgs=(msg, ), errbackArgs=(msg, ))

        if self.keepProducing:
            d.addBoth(lambda _x: self.producer.resumeProducing())
        return d
Ejemplo n.º 5
0
 def get_from_queue(msg):
     if msg is not None:
         return json.loads(msg) # le backup est prioritaire
     # on dépile la file principale
     try:
         msg = self.queue.popleft()
     except IndexError:
         # plus de messages
         return None
     return msg
Ejemplo n.º 6
0
 def check(r_):
     output = client.channel.sent
     print output
     self.assertEqual(len(output), 3)
     msg_out = [ json.loads(m["content"].body)
                 for m in output ]
     msg_in = []
     for k, v in stats.iteritems():
         m = msg.copy()
         m.update({"datasource": "testsvc-%s" % k, "value": v})
         msg_in.append(m)
     self.assertEqual(msg_in, msg_out)
Ejemplo n.º 7
0
 def test_accumulate_perfs(self):
     yield defer.succeed(None)
     count = 42
     self.bp.batch_send_perf = count
     msg = {"type": "perf", "value": "dummy"}
     # On se connecte
     self.bp.client.stub_connect()
     output = self.bp.client.channel.sent
     # on traite n-1 message, ce qui ne doit rien envoyer sur le bus
     for _i in range(count - 1):
         yield self.bp.write(msg)
     self.assertEqual(output, [])
     # on en envoie un de plus, ce qui doit envoyer un message accumulé
     self.bp.write(msg)
     self.assertEqual(len(output), 1)
     print repr(output[0])
     sent = json.loads(output[0]["content"].body)
     self.assertEqual(len(sent["messages"]), count)
Ejemplo n.º 8
0
    def write_batch(self, msgs):
        """
        Méthode à appeler pour traiter une liste de messages en provenance du
        bus.

        Si le traitement se passe bien (pas d'I{errback}), les messages seront
        acquittés, sinon ils seront rejetés, puis les messages suivants seront
        demandés au bus.

        @param msgs: Liste de messages du type C{txamqp.message.Message}
                     à traiter.
        @type  msgs: C{list}
        """

        contents = []
        for msg in msgs:
            try:
                content = json.loads(msg.content.body)
            except ValueError:
                LOGGER.warning(_("Received message is not JSON-encoded: %r"),
                               msg.content.body)
            else:
                if "messages" in content and content["messages"]:
                    contents.extends(content["messages"])
                else:
                    contents.append(content)
        if contents:
            d = self.processMessages(contents)
        else:
            d = defer.succeed(None)
        d.addCallbacks(self.processingBatchSucceeded,
                               self.processingBatchFailed,
                               callbackArgs=(msgs, ), errbackArgs=(msgs, ))

        if self.keepProducing:
            d.addBoth(lambda _x: self.producer.resumeProducing())
        return d