def testMultipleTopicsDeletionWithOutput(self): topic_to_succeed = util.ParseTopic('topic1', self.Project()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsDeleteRequest( topic=topic_to_succeed.RelativeName()), response='') topic_to_fail = util.ParseTopic('not_there', self.Project()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsDeleteRequest( topic=topic_to_fail.RelativeName()), response='', exception=http_error.MakeHttpError(message='Topic does not exist.')) with self.AssertRaisesExceptionMatches( util.RequestsFailedError, 'Failed to delete the following: [not_there].'): self.Run('pubsub topics delete topic1 not_there' ' --format=csv[no-heading](name)') self.AssertErrContains( 'Deleted topic [{}].'.format(topic_to_succeed.RelativeName())) self.AssertErrContains( 'Failed to delete topic [{}]: Topic does not exist.' .format(topic_to_fail.RelativeName())) self.AssertErrContains( 'Failed to delete the following: [{}].'.format(topic_to_fail.Name()))
def SetUp(self): self.track = calliope_base.ReleaseTrack.GA properties.VALUES.core.user_output_enabled.Set(True) self.svc = self.client.projects_snapshots.List self.project_ref = util.ParseProject(self.Project()) self.snapshot_refs = [ util.ParseSnapshot('snap{}'.format(i + 1), self.Project()) for i in range(3) ] self.topic_refs = [ util.ParseTopic('topic1', self.Project()), util.ParseTopic('topic2', self.Project()) ] self.snapshots = [ self.msgs.Snapshot( name=self.snapshot_refs[0].RelativeName(), topic=self.topic_refs[0].RelativeName(), expireTime='2016-10-31T12:34:56.000000Z', ), self.msgs.Snapshot(name=self.snapshot_refs[1].RelativeName(), topic=self.topic_refs[1].RelativeName(), expireTime='2015-02-12T09:08:07.000000Z'), self.msgs.Snapshot(name=self.snapshot_refs[2].RelativeName(), topic=self.topic_refs[1].RelativeName(), expireTime='2015-02-13T09:08:07.000000Z') ]
def testCreate(self): sub_ref = util.ParseSubscription('sub1', self.Project()) topic_ref = util.ParseTopic('topic1', self.Project()) labels = self.msgs.Subscription.LabelsValue(additionalProperties=[ self.msgs.Subscription.LabelsValue.AdditionalProperty( key='label1', value='value1') ]) subscription = self.msgs.Subscription( name=sub_ref.RelativeName(), topic=topic_ref.RelativeName(), ackDeadlineSeconds=20, enableMessageOrdering=True, deadLetterPolicy=self.msgs.DeadLetterPolicy( deadLetterTopic='topic2', maxDeliveryAttempts=5), retryPolicy=self.msgs.RetryPolicy(minimumBackoff='20s', maximumBackoff='500s'), labels=labels) self.subscriptions_service.Create.Expect(subscription, subscription) result = self.subscriptions_client.Create(sub_ref, topic_ref, 20, labels=labels, enable_message_ordering=True, dead_letter_topic='topic2', max_delivery_attempts=5, min_retry_delay='20s', max_retry_delay='500s') self.assertEqual(result, subscription)
def testGet(self): topic_ref = util.ParseTopic('topic1', self.Project()) topic = self.msgs.Topic(name=topic_ref.RelativeName()) self.topics_service.Get.Expect( self.msgs.PubsubProjectsTopicsGetRequest( topic=topic_ref.RelativeName()), topic) self.assertEqual(self.topics_client.Get(topic_ref), topic)
def testPushSubscriptionsCreateWithOutputAndFormat(self): properties.VALUES.core.user_output_enabled.Set(True) sub_refs = [ util.ParseSubscription('subs2', self.Project()), util.ParseSubscription('subs3', self.Project()) ] topic_ref = util.ParseTopic('topic2', self.Project()) req_subscriptions = [ self.msgs.Subscription( name=sub_ref.RelativeName(), topic=topic_ref.RelativeName(), pushConfig=self.msgs.PushConfig( pushEndpoint='https://my.appspot.com/push')) for sub_ref in sub_refs ] self.ExpectCreatedSubscriptions( ('pubsub subscriptions create subs2 subs3 --topic topic2' ' --push-endpoint https://my.appspot.com/push' ' --format=csv[no-heading]' '(name,pushConfig.pushEndpoint,ackDeadlineSeconds)'), req_subscriptions) self.AssertOutputEquals("""\ {},https://my.appspot.com/push,10 {},https://my.appspot.com/push,10 """.format(sub_refs[0].RelativeName(), sub_refs[1].RelativeName())) self.AssertErrEquals("""\ Created subscription [{}]. Created subscription [{}]. """.format(sub_refs[0].RelativeName(), sub_refs[1].RelativeName()))
def testPushSubscriptionsCreateNoOutput(self): sub_refs = [ util.ParseSubscription('subs2', self.Project()), util.ParseSubscription('subs3', self.Project()) ] topic_ref = util.ParseTopic('topic2', self.Project()) req_subscriptions = [ self.msgs.Subscription( name=sub_ref.RelativeName(), topic=topic_ref.RelativeName(), pushConfig=self.msgs.PushConfig( pushEndpoint='https://my.appspot.com/push')) for sub_ref in sub_refs ] result = self.ExpectCreatedSubscriptions( ('pubsub subscriptions create subs2 subs3 --topic topic2' ' --push-endpoint https://my.appspot.com/push'), req_subscriptions) self.assertEqual(2, len(result)) for idx, sub_ref in enumerate(sub_refs): self.assertEqual(result[idx].ackDeadlineSeconds, 10) self.assertEqual(result[idx].name, sub_ref.RelativeName()) self.assertEqual(result[idx].topic, topic_ref.RelativeName()) self.assertEqual(result[idx].pushConfig.pushEndpoint, 'https://my.appspot.com/push') self.AssertOutputEquals('') self.AssertErrEquals('')
def testSubscriptionsCreateAuthenticatedPush(self): sub_ref = util.ParseSubscription('subs1', self.Project()) topic_ref = util.ParseTopic('topic1', self.Project()) req_subscription = self.msgs.Subscription( name=sub_ref.RelativeName(), topic=topic_ref.RelativeName(), pushConfig=self.msgs.PushConfig( pushEndpoint='https://example.com/push', oidcToken=self.msgs.OidcToken( serviceAccountEmail='*****@*****.**', audience='my-audience'))) result = self.ExpectCreatedSubscriptions( 'pubsub subscriptions create subs1 --topic topic1 ' '--push-endpoint=https://example.com/push ' '[email protected] ' '--push-auth-token-audience=my-audience', [req_subscription]) self.assertEqual(result[0].name, sub_ref.RelativeName()) self.assertEqual(result[0].topic, topic_ref.RelativeName()) self.assertEqual(result[0].pushConfig.pushEndpoint, 'https://example.com/push') self.assertEqual(result[0].pushConfig.oidcToken.serviceAccountEmail, '*****@*****.**') self.assertEqual(result[0].pushConfig.oidcToken.audience, 'my-audience')
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace. All the arguments that were provided to this command invocation. Returns: A serialized object (dict) describing the results of the operation. Raises: An HttpException if there was a problem calling the API topics.Patch command. """ client = topics.TopicsClient() topic_ref = util.ParseTopic(args.topic) labels_diff = labels_util.Diff.FromUpdateArgs(args) if labels_diff.MayHaveUpdates(): original_topic = client.Get(topic_ref) labels = labels_diff.Apply(client.messages.Topic.LabelsValue, original_topic.labels) else: labels = None result = client.Patch(topic_ref, labels=labels) log.UpdatedResource(topic_ref.RelativeName(), kind='topic') return result
def testUpdateAll(self): sub_ref = util.ParseSubscription('sub', self.Project()) new_sub = self.msgs.Subscription( name=sub_ref.RelativeName(), ackDeadlineSeconds=100, pushConfig=self.msgs.PushConfig( pushEndpoint='https://my.appspot.com/push'), retainAckedMessages=True, messageRetentionDuration='259200s', deadLetterPolicy=self.msgs.DeadLetterPolicy( deadLetterTopic=util.ParseTopic('topic2', self.Project()).RelativeName(), maxDeliveryAttempts=5)) update_req = self.msgs.PubsubProjectsSubscriptionsPatchRequest( updateSubscriptionRequest=self.msgs.UpdateSubscriptionRequest( subscription=new_sub, updateMask=('ackDeadlineSeconds,pushConfig,retainAckedMessages,' 'messageRetentionDuration,deadLetterPolicy')), name=sub_ref.RelativeName()) self.svc.Expect( request=update_req, response=self.msgs.Subscription()) # Ignore self.Run('pubsub subscriptions update sub --ack-deadline 100' ' --push-endpoint https://my.appspot.com/push' ' --retain-acked-messages --message-retention-duration 3d' ' --dead-letter-topic topic2 --max-delivery-attempts 5') self.AssertErrEquals('Updated subscription [{0}].\n'.format( sub_ref.RelativeName()))
def testSnapshotsCreateLabels(self): snap_ref = util.ParseSnapshot('snap1', self.Project()) sub_ref = util.ParseSubscription('subs1', self.Project()) topic_ref = util.ParseTopic('topic1', self.Project()) labels = self.msgs.CreateSnapshotRequest.LabelsValue(additionalProperties=[ self.msgs.CreateSnapshotRequest.LabelsValue.AdditionalProperty( key='key1', value='value1'), self.msgs.CreateSnapshotRequest.LabelsValue.AdditionalProperty( key='key2', value='value2')]) create_req = self.msgs.PubsubProjectsSnapshotsCreateRequest( createSnapshotRequest=self.msgs.CreateSnapshotRequest( subscription=sub_ref.RelativeName(), labels=labels), name=snap_ref.RelativeName() ) create_resp = self.msgs.Snapshot( name=snap_ref.RelativeName(), topic=topic_ref.RelativeName(), expireTime='sometime') self.svc.Expect(request=create_req, response=create_resp) result = list(self.Run( 'pubsub snapshots create snap1 ' '--labels key1=value1,key2=value2 ' '--subscription subs1')) self.assertEqual(result[0]['snapshotId'], snap_ref.RelativeName()) self.assertEqual(result[0]['topic'], topic_ref.RelativeName()) self.assertEqual(result[0]['expireTime'], 'sometime')
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace. All the arguments that were provided to this command invocation. Returns: PublishResponse with the response of the Publish operation. Raises: topics.EmptyMessageException: if neither message or attributes is specified. topics.PublishOperationException: When something went wrong with the publish operation. """ client = topics.TopicsClient() attributes = util.ParseAttributes(args.attribute, messages=client.messages) topic_ref = util.ParseTopic(args.topic) result = client.Publish(topic_ref, args.message_body, attributes) # We only allow to publish one message at a time, so do not return a # list of messageId. resource = resource_projector.MakeSerializable(result) resource['messageIds'] = result.messageIds[0] return resource
def Run(self, args): """This is what gets called when the user runs this command. Args: args: an argparse namespace. All the arguments that were provided to this command invocation. Yields: A serialized object (dict) describing the results of the operation. This description fits the Resource described in the ResourceRegistry under 'pubsub.projects.subscriptions'. Raises: util.RequestFailedError: if any of the requests to the API failed. """ client = subscriptions.SubscriptionsClient() topic_ref = util.ParseTopic(args.topic, args.topic_project) push_config = util.ParsePushConfig(args.push_endpoint) retain_acked_messages = getattr(args, 'retain_acked_messages', None) retention_duration = getattr(args, 'message_retention_duration', None) if retention_duration: retention_duration = util.FormatDuration(retention_duration) labels = labels_util.UpdateLabels( None, client.messages.Subscription.LabelsValue, update_labels=labels_util.GetUpdateLabelsDictFromArgs(args)) failed = [] for subscription_name in args.subscription: subscription_ref = util.ParseSubscription(subscription_name) try: result = client.Create(subscription_ref, topic_ref, args.ack_deadline, push_config, retain_acked_messages, retention_duration, labels=labels) except api_ex.HttpError as error: exc = exceptions.HttpException(error) log.CreatedResource(subscription_ref.RelativeName(), kind='subscription', failed=exc.payload.status_message) failed.append(subscription_name) continue result = util.SubscriptionDisplayDict(result) log.CreatedResource(subscription_ref.RelativeName(), kind='subscription') yield result if failed: raise util.RequestsFailedError(failed, 'create')
def testSingleTopicDeleteFullUri(self): topic_to_delete = util.ParseTopic('topic1', self.Project()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsDeleteRequest( topic=topic_to_delete.RelativeName()), response='') self.Run('pubsub topics delete {}'.format(topic_to_delete.SelfLink())) self.AssertErrContains( 'Deleted topic [{}]'.format(topic_to_delete.RelativeName()))
def testCreateLabels(self): topic_ref = util.ParseTopic('topic1', self.Project()) labels = self.msgs.Topic.LabelsValue(additionalProperties=[ self.msgs.Topic.LabelsValue.AdditionalProperty(key='label1', value='value1') ]) topic = self.msgs.Topic(name=topic_ref.RelativeName(), labels=labels) self.topics_service.Create.Expect(topic, topic) result = self.topics_client.Create(topic_ref, labels=labels) self.assertEqual(result, topic)
def testGetIamPolicy(self): topic_ref = util.ParseTopic('topic1', self.Project()) self.svc.Expect( self.msgs.PubsubProjectsTopicsGetIamPolicyRequest( resource=topic_ref.RelativeName()), self.policy) result = self.Run( 'pubsub topics get-iam-policy topic1') self.assertEqual(result, self.policy)
def testTopicsAcknowledge(self): topic_ref = util.ParseTopic('topic1', self.Project()) topic = self.msgs.Topic(name=topic_ref.RelativeName()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsGetRequest( topic=topic_ref.RelativeName()), response=topic) result = self.Run('pubsub topics describe topic1') self.assertEqual(result, topic)
def testMalformedResponseFails(self): topic_ref = util.ParseTopic('topic1', self.Project()) topic = topic_ref.RelativeName() self.svc.Expect(request=self.msgs.PubsubProjectsTopicsPublishRequest( publishRequest=self.msgs.PublishRequest( messages=self.messages[0:1]), topic=topic), response=self.msgs.PublishResponse(messageIds=[])) with self.assertRaises(topics.PublishOperationException): self.Run('pubsub topics publish topic1' ' --message "{0}"'.format(self.message_data[0]))
def testTopicsDeleteNoLegacyOutput(self): properties.VALUES.pubsub.legacy_output.Set(True) properties.VALUES.core.user_output_enabled.Set(False) topic_to_delete = util.ParseTopic('topic1', self.Project()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsDeleteRequest( topic=topic_to_delete.RelativeName()), response=self.msgs.Empty()) result = list(self.Run('pubsub topics delete topic1')) self.assertEqual(result[0], self.msgs.Empty())
def testTopicsDescribeFullUri(self): topic_ref = util.ParseTopic('topic1', self.Project()) topic = self.msgs.Topic(name=topic_ref.RelativeName()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsGetRequest( topic=topic_ref.RelativeName()), response=topic) result = self.Run( 'pubsub topics describe {}'.format(topic_ref.SelfLink())) self.assertEqual(result, topic)
def SetUp(self): properties.VALUES.core.user_output_enabled.Set(True) self.track = calliope_base.ReleaseTrack.GA self.svc = self.client.projects_topics.List self.topic_refs = [ util.ParseTopic('topic{}'.format(i), self.Project) for i in (1, 2, 3) ] self.topics = [ self.msgs.Topic(name=topic_ref.RelativeName()) for topic_ref in self.topic_refs ]
def testDeadLetterPolicyPullSubscriptionsCreate(self, dead_letter_flags, dead_letter_topic, max_delivery_attempts): sub_ref = util.ParseSubscription('subs1', self.Project()) topic_ref = util.ParseTopic('topic1', self.Project()) dead_letter_policy = self.msgs.DeadLetterPolicy( deadLetterTopic=util.ParseTopic(dead_letter_topic, self.Project()).RelativeName(), maxDeliveryAttempts=max_delivery_attempts) req_subscription = self.msgs.Subscription( name=sub_ref.RelativeName(), topic=topic_ref.RelativeName(), deadLetterPolicy=dead_letter_policy) result = self.ExpectCreatedSubscriptions( ('pubsub subscriptions create subs1 --topic topic1' + dead_letter_flags), [req_subscription]) self.assertEqual(result[0].name, sub_ref.RelativeName()) self.assertEqual(result[0].topic, topic_ref.RelativeName()) self.assertEqual(result[0].deadLetterPolicy, dead_letter_policy)
def testTopicsDeleteNonExistent(self): topic_to_delete = util.ParseTopic('not_there', self.Project()) self.svc.Expect( request=self.msgs.PubsubProjectsTopicsDeleteRequest( topic=topic_to_delete.RelativeName()), response='', exception=http_error.MakeHttpError(message='Topic does not exist.')) with self.AssertRaisesExceptionMatches( util.RequestsFailedError, 'Failed to delete the following: [not_there].'): self.Run('pubsub topics delete not_there')
def Run(self, args): client = topics.TopicsClient() messages = client.messages topic_ref = util.ParseTopic(args.topic) policy = iam_util.ParsePolicyFile(args.policy_file, messages.Policy) response = client.SetIamPolicy( topic_ref, policy=policy) log.status.Print( 'Set IAM policy for Topic [{}].'.format(topic_ref.Name())) return response
def testGetIamPolicy_Filter(self): topic_ref = util.ParseTopic('topic1', self.Project()) self.svc.Expect( self.msgs.PubsubProjectsTopicsGetIamPolicyRequest( resource=topic_ref.RelativeName()), self.policy) self.Run( 'pubsub topics get-iam-policy topic1 ' '--flatten=bindings[].members ' '--filter=bindings.role:roles/owner ' '--format=value(bindings.members)') self.AssertOutputEquals('user:[email protected]\n')
def testPatch(self): topic_ref = util.ParseTopic('topic1', self.Project()) labels = self.msgs.Topic.LabelsValue(additionalProperties=[ self.msgs.Topic.LabelsValue.AdditionalProperty(key='label', value='value') ]) topic = self.msgs.Topic(name=topic_ref.RelativeName(), labels=labels) self.topics_service.Patch.Expect( self.msgs.PubsubProjectsTopicsPatchRequest( name=topic_ref.RelativeName(), updateTopicRequest=self.msgs.UpdateTopicRequest( topic=topic, updateMask='labels')), topic) self.assertEqual(self.topics_client.Patch(topic_ref, labels), topic)
def testPatchKmsKey(self): topic_ref = util.ParseTopic('topic1', self.Project()) kms_key_name = 'projects/foo/locations/global/keyRings/baz/cryptoKeys/qux' topic = self.msgs.Topic(name=topic_ref.RelativeName(), kmsKeyName=kms_key_name) self.topics_service.Patch.Expect( self.msgs.PubsubProjectsTopicsPatchRequest( name=topic_ref.RelativeName(), updateTopicRequest=self.msgs.UpdateTopicRequest( topic=topic, updateMask='kmsKeyName')), topic) self.assertEqual( self.topics_client.Patch(topic_ref, kms_key_name=kms_key_name), topic)
def SetUp(self): properties.VALUES.core.user_output_enabled.Set(True) self.svc = self.client.projects_subscriptions.List # List of test Cloud Pub/Sub resource objects self.project_ref = util.ParseProject(self.Project()) self.subscription_refs = [ util.ParseSubscription('subs{}'.format(i + 1), self.Project()) for i in range(3) ] self.topic_refs = [ util.ParseTopic('topic1', self.Project()), util.ParseTopic('topic2', self.Project()) ] self.subscriptions = [ self.msgs.Subscription( name=self.subscription_refs[0].RelativeName(), ackDeadlineSeconds=180, messageRetentionDuration='604800s', retainAckedMessages=False, topic=self.topic_refs[0].RelativeName(), pushConfig=self.msgs.PushConfig(pushEndpoint=None)), self.msgs.Subscription( name=self.subscription_refs[1].RelativeName(), ackDeadlineSeconds=10, messageRetentionDuration='604800s', retainAckedMessages=False, topic=self.topic_refs[1].RelativeName(), pushConfig=self.msgs.PushConfig( pushEndpoint='https://my.appspot.com/push')), self.msgs.Subscription( name=self.subscription_refs[2].RelativeName(), ackDeadlineSeconds=10, messageRetentionDuration='604800s', retainAckedMessages=False, topic=self.topic_refs[1].RelativeName(), pushConfig=self.msgs.PushConfig( pushEndpoint='https://my.appspot.com/push')) ]
def testSubscriptionFormatsProjectsPathsCorrectly(self): sub_ref = util.ParseSubscription('subs1', self.Project()) topic_ref = util.ParseTopic('topic1', 'my_project') req_subscription = self.msgs.Subscription( name=sub_ref.RelativeName(), ackDeadlineSeconds=180, topic=topic_ref.RelativeName()) result = self.ExpectCreatedSubscriptions(( 'pubsub subscriptions create subs1 --ack-deadline 180 --topic topic1' ' --topic-project my_project'), [req_subscription]) self.assertEqual(result[0].name, sub_ref.RelativeName()) self.assertEqual(result[0].topic, topic_ref.RelativeName())
def testSimpleTopicsPublishFullUri(self): topic_ref = util.ParseTopic('topic1', self.Project()) topic = topic_ref.RelativeName() self.svc.Expect(request=self.msgs.PubsubProjectsTopicsPublishRequest( publishRequest=self.msgs.PublishRequest( messages=self.messages[0:1]), topic=topic), response=self.msgs.PublishResponse( messageIds=self.message_ids[0:1])) result = self.Run('pubsub topics publish {0} --message "{1}"'.format( topic_ref.SelfLink(), self.message_data[0])) self.assertEqual(result.messageIds, ['123456'])
def testSubscriptionProjectFlags(self): sub_ref = util.ParseSubscription('subs1', 'proj1') topic_ref = util.ParseTopic('topic1', 'proj2') req_subscription = self.msgs.Subscription( name=sub_ref.RelativeName(), ackDeadlineSeconds=180, topic=topic_ref.RelativeName()) result = self.ExpectCreatedSubscriptions(( 'pubsub subscriptions create subs1 --ack-deadline 180 --topic topic1' ' --topic-project proj2 --project proj1'), [req_subscription]) self.assertEqual(result[0].name, sub_ref.RelativeName()) self.assertEqual(result[0].topic, topic_ref.RelativeName())