def _get_subscription_by_queue(self, queue: str) -> Subscription:
        """
        Retrieves a `subscription_manager_client.models.Subscription` by its queue
        """
        subscriptions = self.client.get_subscriptions(queue=queue)

        if not subscriptions:
            raise SubscriptionManagerServiceError(
                f"No subscription found for queue '{queue}'")

        return subscriptions[0]
    def unsubscribe(self, queue: str):
        """
        Unsubscribes the client from the topics that corresponds to the given queue
        """
        subscription = self._get_subscription_by_queue(queue)

        try:
            self.client.delete_subscription_by_id(subscription.id)
        except APIError as e:
            raise SubscriptionManagerServiceError(
                f"Error while deleting subscription '{subscription.id}': {str(e)}"
            )
    def resume(self, queue: str):
        """
        Reactivates the subscription that corresponds to the given queue
        """
        subscription = self._get_subscription_by_queue(queue)

        subscription.active = True

        try:
            self.client.put_subscription(subscription.id, subscription)
        except APIError as e:
            raise SubscriptionManagerServiceError(
                f"Error while updating subscription '{subscription.id}': {str(e)}"
            )
    def subscribe(self, topic_name: str) -> str:
        """
        Subscribes the client to the given topics.

        :return: A unique queue corresponding to this subscription
        """
        db_topics = self.client.get_topics()

        try:
            topic = [topic for topic in db_topics
                     if topic.name == topic_name][0]
        except IndexError:
            raise SubscriptionManagerServiceError(
                f"{topic_name} is not registered in Subscription Manager")

        subscription = Subscription(topic_id=topic.id)

        try:
            db_subscription = self.client.post_subscription(subscription)
        except APIError as e:
            raise SubscriptionManagerServiceError(
                f"Error while subscribing to {topic_name}: {str(e)}")

        return db_subscription.queue
예제 #5
0
def test_subscriber__subscribe__sm_api_error__logs_error_and_raises_SubscriptionManagerServiceError(caplog):
    caplog.set_level(logging.DEBUG)

    broker_handler = mock.Mock()
    sm_service = mock.Mock()
    sm_service.subscribe = mock.Mock(side_effect=SubscriptionManagerServiceError('server error'))

    subscriber = Subscriber(broker_handler, sm_service)

    expected_message = f"Error while accessing Subscription Manager: server error"
    with pytest.raises(SubscriptionManagerServiceError) as e:
        subscriber.subscribe('topics', callback=mock.Mock())

    assert "server error" == str(e.value)
    log_message = caplog.records[0]
    assert expected_message == log_message.message
예제 #6
0
def test_subscriber__resume__sm_api_error__logs_message_and_raises_SubscriptionManagerServiceError(caplog):
    caplog.set_level(logging.DEBUG)

    caplog.set_level(logging.DEBUG)

    queue = uuid.uuid4().hex
    topic = 'topics'

    broker_handler = mock.Mock()
    sm_service = mock.Mock()
    sm_service.resume = mock.Mock(side_effect=SubscriptionManagerServiceError('server error'))

    subscriber = Subscriber(broker_handler, sm_service)
    subscriber.subscriptions[topic] = queue

    expected_message = f"Error while accessing Subscription Manager: server error"
    with pytest.raises(SubscriptionManagerServiceError) as e:
        subscriber.resume(topic)

    assert "server error" == str(e.value)
    log_message = caplog.records[0]
    assert expected_message == log_message.message