Example #1
0
    def test_notify(self):
        barrier = threading.Event()

        on_notify = mock.MagicMock()
        on_notify.side_effect = lambda *args, **kwargs: barrier.set()

        handlers = {pr.NOTIFY: dispatcher.Handler(on_notify)}
        p = proxy.Proxy(TEST_TOPIC,
                        TEST_EXCHANGE,
                        handlers,
                        transport='memory',
                        transport_options={
                            'polling_interval': POLLING_INTERVAL,
                        })

        t = threading_utils.daemon_thread(p.start)
        t.start()
        p.wait()
        p.publish(pr.Notify(), TEST_TOPIC)

        self.assertTrue(barrier.wait(test_utils.WAIT_TIMEOUT))
        p.stop()
        t.join()

        self.assertTrue(on_notify.called)
        on_notify.assert_called_with({}, mock.ANY)
Example #2
0
    def discover(self):
        """Publish notify message to each topic to discover new workers

        The response expected from workers is then used to find later
        tasks to fullfill (as the response from a worker contains the
        tasks they can perform).
        """
        if self._messages_published == 0:
            self._proxy.publish(pr.Notify(), self._topics, reply_to=self._uuid)
            self._messages_published += 1
            self._watch.restart()
        else:
            if self._watch.expired():
                self._proxy.publish(pr.Notify(),
                                    self._topics,
                                    reply_to=self._uuid)
                self._messages_published += 1
                self._watch.restart()

        self.clean()
Example #3
0
    def process_response(self, data, message):
        """Process notify message (response) sent from remote side.

        NOTE(harlowja): the message content should already have had
        basic validation performed on it...
        """
        LOG.debug("Started processing notify response message '%s'",
                  ku.DelayedPretty(message))
        response = pr.Notify(**data)
        LOG.debug("Extracted notify response '%s'", response)
        with self._cond:
            worker, new_or_updated = self._add(response.topic, response.tasks)
            if new_or_updated:
                LOG.debug(
                    "Received notification about worker '%s' (%s"
                    " total workers are currently known)", worker,
                    self.available_workers)
                self._cond.notify_all()
            worker.last_seen = timeutils.now()
Example #4
0
 def _process_notify(self, notify, message):
     """Process notify message and reply back."""
     try:
         reply_to = message.properties['reply_to']
     except KeyError:
         LOG.warning(
             "The 'reply_to' message property is missing"
             " in received notify message '%s'",
             ku.DelayedPretty(message),
             exc_info=True)
     else:
         response = pr.Notify(topic=self._topic,
                              tasks=list(self._endpoints.keys()))
         try:
             self._proxy.publish(response, routing_key=reply_to)
         except Exception:
             LOG.critical(
                 "Failed to send reply to '%s' with notify"
                 " response '%s'",
                 reply_to,
                 response,
                 exc_info=True)
Example #5
0
    def test_multi_message(self):
        message_count = 30
        barrier = latch.Latch(message_count)
        countdown = lambda data, message: barrier.countdown()

        on_notify = mock.MagicMock()
        on_notify.side_effect = countdown

        on_response = mock.MagicMock()
        on_response.side_effect = countdown

        on_request = mock.MagicMock()
        on_request.side_effect = countdown

        handlers = {
            pr.NOTIFY: dispatcher.Handler(on_notify),
            pr.RESPONSE: dispatcher.Handler(on_response),
            pr.REQUEST: dispatcher.Handler(on_request),
        }
        p = proxy.Proxy(TEST_TOPIC,
                        TEST_EXCHANGE,
                        handlers,
                        transport='memory',
                        transport_options={
                            'polling_interval': POLLING_INTERVAL,
                        })

        t = threading_utils.daemon_thread(p.start)
        t.start()
        p.wait()

        for i in range(0, message_count):
            j = i % 3
            if j == 0:
                p.publish(pr.Notify(), TEST_TOPIC)
            elif j == 1:
                p.publish(pr.Response(pr.RUNNING), TEST_TOPIC)
            else:
                p.publish(
                    pr.Request(test_utils.DummyTask("dummy_%s" % i),
                               uuidutils.generate_uuid(), pr.EXECUTE, [],
                               None), TEST_TOPIC)

        self.assertTrue(barrier.wait(test_utils.WAIT_TIMEOUT))
        self.assertEqual(0, barrier.needed)
        p.stop()
        t.join()

        self.assertTrue(on_notify.called)
        self.assertTrue(on_response.called)
        self.assertTrue(on_request.called)

        self.assertEqual(10, on_notify.call_count)
        self.assertEqual(10, on_response.call_count)
        self.assertEqual(10, on_request.call_count)

        call_count = sum([
            on_notify.call_count,
            on_response.call_count,
            on_request.call_count,
        ])
        self.assertEqual(message_count, call_count)
Example #6
0
 def test_reply_notify(self):
     msg = pr.Notify(topic="bob", tasks=['a', 'b', 'c'])
     pr.Notify.validate(msg.to_dict(), True)
Example #7
0
 def test_send_notify(self):
     msg = pr.Notify()
     pr.Notify.validate(msg.to_dict(), False)