def test_message_pull_mode_e2e(self): TOPIC_NAME = 'subscribe-me' topic = Topic(TOPIC_NAME, timestamp_messages=True) self.assertFalse(topic.exists()) topic.create() self.to_delete.append(topic) SUBSCRIPTION_NAME = 'subscribing-now' subscription = Subscription(SUBSCRIPTION_NAME, topic) self.assertFalse(subscription.exists()) subscription.create() self.to_delete.append(subscription) MESSAGE_1 = b'MESSAGE ONE' MESSAGE_2 = b'MESSAGE ONE' EXTRA_1 = 'EXTRA 1' EXTRA_2 = 'EXTRA 2' topic.publish(MESSAGE_1, extra=EXTRA_1) topic.publish(MESSAGE_2, extra=EXTRA_2) received = subscription.pull(max_messages=2) ack_ids = [recv[0] for recv in received] subscription.acknowledge(ack_ids) messages = [recv[1] for recv in received] def _by_timestamp(message): return message.timestamp message1, message2 = sorted(messages, key=_by_timestamp) self.assertEqual(message1.data, MESSAGE_1) self.assertEqual(message1.attributes['extra'], EXTRA_1) self.assertEqual(message2.data, MESSAGE_2) self.assertEqual(message2.attributes['extra'], EXTRA_2)
def list_subscriptions(self, page_size=None, page_token=None, client=None): """List subscriptions for the project associated with this client. See: https://cloud.google.com/pubsub/reference/rest/v1/projects.topics.subscriptions/list :type page_size: int :param page_size: maximum number of topics to return, If not passed, defaults to a value set by the API. :type page_token: string :param page_token: opaque marker for the next "page" of topics. If not passed, the API will return the first page of topics. :type client: :class:`gcloud.pubsub.client.Client` or ``NoneType`` :param client: the client to use. If not passed, falls back to the ``client`` stored on the current topic. :rtype: tuple, (list, str) :returns: list of :class:`gcloud.pubsub.subscription.Subscription`, plus a "next page token" string: if not None, indicates that more topics can be retrieved with another call (pass that value as ``page_token``). """ client = self._require_client(client) api = client.publisher_api sub_paths, next_token = api.topic_list_subscriptions( self.full_name, page_size, page_token) subscriptions = [] for sub_path in sub_paths: sub_name = subscription_name_from_path(sub_path, self.project) subscriptions.append(Subscription(sub_name, self)) return subscriptions, next_token
def test_create_subscription(self): TOPIC_NAME = 'subscribe-me' topic = Topic(TOPIC_NAME) self.assertFalse(topic.exists()) topic.create() self.to_delete.append(topic) SUBSCRIPTION_NAME = 'subscribing-now' subscription = Subscription(SUBSCRIPTION_NAME, topic) self.assertFalse(subscription.exists()) subscription.create() self.to_delete.append(subscription) self.assertTrue(subscription.exists()) self.assertEqual(subscription.name, SUBSCRIPTION_NAME) self.assertTrue(subscription.topic is topic)
def subscription(self, name, ack_deadline=None, push_endpoint=None): """Creates a subscription bound to the current topic. :type name: string :param name: the name of the subscription :type ack_deadline: int :param ack_deadline: the deadline (in seconds) by which messages pulled from the back-end must be acknowledged. :type push_endpoint: string :param push_endpoint: URL to which messages will be pushed by the back-end. If not set, the application must pull messages. """ return Subscription(name, self, ack_deadline=ack_deadline, push_endpoint=push_endpoint)
def list_subscriptions(self, page_size=None, page_token=None, client=None): """List subscriptions for the project associated with this client. See: https://cloud.google.com/pubsub/reference/rest/v1/projects.topics.subscriptions/list :type page_size: int :param page_size: maximum number of topics to return, If not passed, defaults to a value set by the API. :type page_token: string :param page_token: opaque marker for the next "page" of topics. If not passed, the API will return the first page of topics. :type client: :class:`gcloud.pubsub.client.Client` or ``NoneType`` :param client: the client to use. If not passed, falls back to the ``client`` stored on the current topic. :rtype: tuple, (list, str) :returns: list of :class:`gcloud.pubsub.subscription.Subscription`, plus a "next page token" string: if not None, indicates that more topics can be retrieved with another call (pass that value as ``page_token``). """ client = self._require_client(client) params = {} if page_size is not None: params['pageSize'] = page_size if page_token is not None: params['pageToken'] = page_token path = '/projects/%s/topics/%s/subscriptions' % (self.project, self.name) resp = client.connection.api_request(method='GET', path=path, query_params=params) subscriptions = [] for sub_path in resp.get('subscriptions', ()): sub_name = subscription_name_from_path(sub_path, self.project) subscriptions.append(Subscription(sub_name, self)) return subscriptions, resp.get('nextPageToken')
def subscription(self, name, ack_deadline=None, push_endpoint=None): """Creates a subscription bound to the current topic. Example: pull-mode subcription, default paramter values .. literalinclude:: pubsub_snippets.py :start-after: [START topic_subscription_defaults] :end-before: [END topic_subscription_defaults] Example: pull-mode subcription, override ``ack_deadline`` default .. literalinclude:: pubsub_snippets.py :start-after: [START topic_subscription_ack90] :end-before: [END topic_subscription_ack90] Example: push-mode subcription .. literalinclude:: pubsub_snippets.py :start-after: [START topic_subscription_push] :end-before: [END topic_subscription_push] :type name: string :param name: the name of the subscription :type ack_deadline: int :param ack_deadline: the deadline (in seconds) by which messages pulled from the back-end must be acknowledged. :type push_endpoint: string :param push_endpoint: URL to which messages will be pushed by the back-end. If not set, the application must pull messages. :rtype: :class:`Subscription` :returns: The subscription created with the passed in arguments. """ return Subscription(name, self, ack_deadline=ack_deadline, push_endpoint=push_endpoint)
def test_list_subscriptions(self): TOPIC_NAME = 'subscribe-me' topic = Topic(TOPIC_NAME) self.assertFalse(topic.exists()) topic.create() self.to_delete.append(topic) subscriptions_to_create = [ 'new%d' % (1000 * time.time(), ), 'newer%d' % (1000 * time.time(), ), 'newest%d' % (1000 * time.time(), ), ] for subscription_name in subscriptions_to_create: subscription = Subscription(subscription_name, topic) subscription.create() self.to_delete.append(subscription) # Retrieve the subscriptions. all_subscriptions, _ = pubsub.list_subscriptions() created = [ subscription for subscription in all_subscriptions if subscription.name in subscriptions_to_create and subscription.topic.name == TOPIC_NAME ] self.assertEqual(len(created), len(subscriptions_to_create))
def list_subscriptions(self, page_size=None, page_token=None, topic_name=None): """List subscriptions for the project associated with this client. See: https://cloud.google.com/pubsub/reference/rest/v1/projects.topics/list and (where ``topic_name`` is passed): https://cloud.google.com/pubsub/reference/rest/v1/projects.topics.subscriptions/list :type page_size: int :param page_size: maximum number of topics to return, If not passed, defaults to a value set by the API. :type page_token: string :param page_token: opaque marker for the next "page" of topics. If not passed, the API will return the first page of topics. :type topic_name: string :param topic_name: limit results to subscriptions bound to the given topic. :rtype: tuple, (list, str) :returns: list of :class:`gcloud.pubsub.subscription.Subscription`, plus a "next page token" string: if not None, indicates that more topics can be retrieved with another call (pass that value as ``page_token``). """ params = {} if page_size is not None: params['pageSize'] = page_size if page_token is not None: params['pageToken'] = page_token if topic_name is None: path = '/projects/%s/subscriptions' % (self.project, ) else: path = '/projects/%s/topics/%s/subscriptions' % (self.project, topic_name) resp = self.connection.api_request(method='GET', path=path, query_params=params) topics = {} subscriptions = [] for resource in resp['subscriptions']: if isinstance(resource, dict) and 'topic' in resource and len( resource['topic'].split('/')) == 4: subscriptions.append( Subscription.from_api_repr(resource, self, topics=topics)) elif topic_name and len(resource.split('/')) == 4: subscription_name = resource.split('/')[3] subscriptions.append( Subscription(name=subscription_name, topic=self.topic(topic_name))) return subscriptions, resp.get('nextPageToken')