<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="pubsub_v1.html">Cloud Pub/Sub API</a> . <a href="pubsub_v1.projects.html">projects</a> . <a href="pubsub_v1.projects.subscriptions.html">subscriptions</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#acknowledge">acknowledge(subscription, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Acknowledges the messages associated with the `ack_ids` in the</p>
<p class="toc_element">
  <code><a href="#create">create(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a subscription to a given topic. See the</p>
<p class="toc_element">
  <code><a href="#delete">delete(subscription, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes an existing subscription. All messages retained in the subscription</p>
<p class="toc_element">
  <code><a href="#get">get(subscription, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the configuration details of a subscription.</p>
<p class="toc_element">
  <code><a href="#getIamPolicy">getIamPolicy(resource, options_requestedPolicyVersion=None, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the access control policy for a resource.</p>
<p class="toc_element">
  <code><a href="#list">list(project, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists matching subscriptions.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#modifyAckDeadline">modifyAckDeadline(subscription, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Modifies the ack deadline for a specific message. This method is useful</p>
<p class="toc_element">
  <code><a href="#modifyPushConfig">modifyPushConfig(subscription, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Modifies the `PushConfig` for a specified subscription.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates an existing subscription. Note that certain properties of a</p>
<p class="toc_element">
  <code><a href="#pull">pull(subscription, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Pulls messages from the server. The server may return `UNAVAILABLE` if</p>
<p class="toc_element">
  <code><a href="#seek">seek(subscription, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Seeks an existing subscription to a point in time or to a given snapshot,</p>
<p class="toc_element">
  <code><a href="#setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Sets the access control policy on the specified resource. Replaces any</p>
<p class="toc_element">
  <code><a href="#testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns permissions that a caller has on the specified resource.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="acknowledge">acknowledge(subscription, body=None, x__xgafv=None)</code>
  <pre>Acknowledges the messages associated with the `ack_ids` in the
`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages
from the subscription.

Acknowledging a message whose ack deadline has expired may succeed,
but such a message may be redelivered later. Acknowledging a message more
than once will not result in an error.

Args:
  subscription: string, Required. The subscription whose message is being acknowledged.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for the Acknowledge method.
    &quot;ackIds&quot;: [ # Required. The acknowledgment ID for the messages being acknowledged that was returned
        # by the Pub/Sub system in the `Pull` response. Must not be empty.
      &quot;A String&quot;,
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(name, body=None, x__xgafv=None)</code>
  <pre>Creates a subscription to a given topic. See the
&lt;a href=&quot;https://cloud.google.com/pubsub/docs/admin#resource_names&quot;&gt;
resource name rules&lt;/a&gt;.
If the subscription already exists, returns `ALREADY_EXISTS`.
If the corresponding topic doesn&#x27;t exist, returns `NOT_FOUND`.

If the name is not provided in the request, the server will assign a random
name for this subscription on the same project as the topic, conforming
to the
[resource name
format](https://cloud.google.com/pubsub/docs/admin#resource_names). The
generated name is populated in the returned Subscription object. Note that
for REST API requests, you must specify a name in the request.

Args:
  name: string, Required. The name of the subscription. It must have the format
`&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
start with a letter, and contain only letters (`[A-Za-z]`), numbers
(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
in length, and it must not start with `&quot;goog&quot;`. (required)
  body: object, The request body.
    The object takes the form of:

{ # A subscription resource.
    &quot;retainAckedMessages&quot;: True or False, # Indicates whether to retain acknowledged messages. If true, then
        # messages are not expunged from the subscription&#x27;s backlog, even if they are
        # acknowledged, until they fall out of the `message_retention_duration`
        # window. This must be true if you would like to
        # &lt;a
        # href=&quot;https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time&quot;&gt;
        # Seek to a timestamp&lt;/a&gt;.
    &quot;labels&quot;: { # See &lt;a href=&quot;https://cloud.google.com/pubsub/docs/labels&quot;&gt; Creating and
        # managing labels&lt;/a&gt;.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;expirationPolicy&quot;: { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription&#x27;s expiration.
        # A subscription is considered active as long as any connected subscriber is
        # successfully consuming messages from the subscription or is issuing
        # operations on the subscription. If `expiration_policy` is not set, a
        # *default policy* with `ttl` of 31 days will be used. The minimum allowed
        # value for `expiration_policy.ttl` is 1 day.
        # automatic resource deletion).
      &quot;ttl&quot;: &quot;A String&quot;, # Specifies the &quot;time-to-live&quot; duration for an associated resource. The
          # resource expires if it is not active for a period of `ttl`. The definition
          # of &quot;activity&quot; depends on the type of the associated resource. The minimum
          # and maximum allowed values for `ttl` depend on the type of the associated
          # resource, as well. If `ttl` is not set, the associated resource never
          # expires.
    },
    &quot;deadLetterPolicy&quot;: { # Dead lettering is done on a best effort basis. The same message might be # A policy that specifies the conditions for dead lettering messages in
        # this subscription. If dead_letter_policy is not set, dead lettering
        # is disabled.
        # 
        # The Cloud Pub/Sub service account associated with this subscriptions&#x27;s
        # parent project (i.e.,
        # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
        # permission to Acknowledge() messages on this subscription.
        # dead lettered multiple times.
        #
        # If validation on any of the fields fails at subscription creation/updation,
        # the create/update subscription request will fail.
      &quot;deadLetterTopic&quot;: &quot;A String&quot;, # The name of the topic to which dead letter messages should be published.
          # Format is `projects/{project}/topics/{topic}`.The Cloud Pub/Sub service
          # account associated with the enclosing subscription&#x27;s parent project (i.e.,
          # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
          # permission to Publish() to this topic.
          #
          # The operation will fail if the topic does not exist.
          # Users should ensure that there is a subscription attached to this topic
          # since messages published to a topic with no subscriptions are lost.
      &quot;maxDeliveryAttempts&quot;: 42, # The maximum number of delivery attempts for any message. The value must be
          # between 5 and 100.
          #
          # The number of delivery attempts is defined as 1 + (the sum of number of
          # NACKs and number of times the acknowledgement deadline has been exceeded
          # for the message).
          #
          # A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
          # client libraries may automatically extend ack_deadlines.
          #
          # This field will be honored on a best effort basis.
          #
          # If this parameter is 0, a default value of 5 is used.
    },
    &quot;name&quot;: &quot;A String&quot;, # Required. The name of the subscription. It must have the format
        # `&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
        # start with a letter, and contain only letters (`[A-Za-z]`), numbers
        # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
        # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
        # in length, and it must not start with `&quot;goog&quot;`.
    &quot;topic&quot;: &quot;A String&quot;, # Required. The name of the topic from which this subscription is receiving messages.
        # Format is `projects/{project}/topics/{topic}`.
        # The value of this field will be `_deleted-topic_` if the topic has been
        # deleted.
    &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
        # used to configure it. An empty `pushConfig` signifies that the subscriber
        # will pull and ack messages using API methods.
      &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
          # aspects of the message delivery.
          #
          # The only currently supported attribute is `x-goog-version`, which you can
          # use to change the format of the pushed message. This attribute
          # indicates the version of the data expected by the endpoint. This
          # controls the shape of the pushed message (i.e., its fields and metadata).
          #
          # If not present during the `CreateSubscription` call, it will default to
          # the version of the Pub/Sub API used to make such call. If not present in a
          # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
          # calls will always return a valid version, even if the subscription was
          # created without this attribute.
          #
          # The only supported values for the `x-goog-version` attribute are:
          #
          # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
          # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
          #
          # For example:
          # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use `https://example.com/push`.
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
          # `Authorization` header in the HTTP request for every pushed message.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
            # identifies the recipients that the JWT is intended for. The audience
            # value is a single case-sensitive string. Having multiple values (array)
            # for the audience field is not supported. More info about the OIDC JWT
            # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
            # Note: if not specified, the Push endpoint URL will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
            # email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating the OIDC token. The caller (for
            # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
            # have the iam.serviceAccounts.actAs permission for the service account.
      },
    },
    &quot;filter&quot;: &quot;A String&quot;, # An expression written in the Cloud Pub/Sub filter language. If non-empty,
        # then only `PubsubMessage`s whose `attributes` field matches the filter are
        # delivered on this subscription. If empty, then no messages are filtered
        # out.
        # &lt;b&gt;EXPERIMENTAL:&lt;/b&gt; This feature is part of a closed alpha release. This
        # API might be changed in backward-incompatible ways and is not recommended
        # for production use. It is not subject to any SLA or deprecation policy.
    &quot;ackDeadlineSeconds&quot;: 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
        # the subscriber to acknowledge receipt before resending the message. In the
        # interval after the message is delivered and before it is acknowledged, it
        # is considered to be &lt;i&gt;outstanding&lt;/i&gt;. During that time period, the
        # message will not be redelivered (on a best-effort basis).
        # 
        # For pull subscriptions, this value is used as the initial value for the ack
        # deadline. To override this value for a given message, call
        # `ModifyAckDeadline` with the corresponding `ack_id` if using
        # non-streaming pull or send the `ack_id` in a
        # `StreamingModifyAckDeadlineRequest` if using streaming pull.
        # The minimum custom deadline you can specify is 10 seconds.
        # The maximum custom deadline you can specify is 600 seconds (10 minutes).
        # If this parameter is 0, a default value of 10 seconds is used.
        # 
        # For push delivery, this value is also used to set the request timeout for
        # the call to the push endpoint.
        # 
        # If the subscriber never acknowledges the message, the Pub/Sub
        # system will eventually redeliver the message.
    &quot;messageRetentionDuration&quot;: &quot;A String&quot;, # How long to retain unacknowledged messages in the subscription&#x27;s backlog,
        # from the moment a message is published.
        # If `retain_acked_messages` is true, then this also configures the retention
        # of acknowledged messages, and thus configures how far back in time a `Seek`
        # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
        # minutes.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A subscription resource.
      &quot;retainAckedMessages&quot;: True or False, # Indicates whether to retain acknowledged messages. If true, then
          # messages are not expunged from the subscription&#x27;s backlog, even if they are
          # acknowledged, until they fall out of the `message_retention_duration`
          # window. This must be true if you would like to
          # &lt;a
          # href=&quot;https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time&quot;&gt;
          # Seek to a timestamp&lt;/a&gt;.
      &quot;labels&quot;: { # See &lt;a href=&quot;https://cloud.google.com/pubsub/docs/labels&quot;&gt; Creating and
          # managing labels&lt;/a&gt;.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;expirationPolicy&quot;: { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription&#x27;s expiration.
          # A subscription is considered active as long as any connected subscriber is
          # successfully consuming messages from the subscription or is issuing
          # operations on the subscription. If `expiration_policy` is not set, a
          # *default policy* with `ttl` of 31 days will be used. The minimum allowed
          # value for `expiration_policy.ttl` is 1 day.
          # automatic resource deletion).
        &quot;ttl&quot;: &quot;A String&quot;, # Specifies the &quot;time-to-live&quot; duration for an associated resource. The
            # resource expires if it is not active for a period of `ttl`. The definition
            # of &quot;activity&quot; depends on the type of the associated resource. The minimum
            # and maximum allowed values for `ttl` depend on the type of the associated
            # resource, as well. If `ttl` is not set, the associated resource never
            # expires.
      },
      &quot;deadLetterPolicy&quot;: { # Dead lettering is done on a best effort basis. The same message might be # A policy that specifies the conditions for dead lettering messages in
          # this subscription. If dead_letter_policy is not set, dead lettering
          # is disabled.
          #
          # The Cloud Pub/Sub service account associated with this subscriptions&#x27;s
          # parent project (i.e.,
          # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
          # permission to Acknowledge() messages on this subscription.
          # dead lettered multiple times.
          #
          # If validation on any of the fields fails at subscription creation/updation,
          # the create/update subscription request will fail.
        &quot;deadLetterTopic&quot;: &quot;A String&quot;, # The name of the topic to which dead letter messages should be published.
            # Format is `projects/{project}/topics/{topic}`.The Cloud Pub/Sub service
            # account associated with the enclosing subscription&#x27;s parent project (i.e.,
            # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
            # permission to Publish() to this topic.
            #
            # The operation will fail if the topic does not exist.
            # Users should ensure that there is a subscription attached to this topic
            # since messages published to a topic with no subscriptions are lost.
        &quot;maxDeliveryAttempts&quot;: 42, # The maximum number of delivery attempts for any message. The value must be
            # between 5 and 100.
            #
            # The number of delivery attempts is defined as 1 + (the sum of number of
            # NACKs and number of times the acknowledgement deadline has been exceeded
            # for the message).
            #
            # A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
            # client libraries may automatically extend ack_deadlines.
            #
            # This field will be honored on a best effort basis.
            #
            # If this parameter is 0, a default value of 5 is used.
      },
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the subscription. It must have the format
          # `&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
          # start with a letter, and contain only letters (`[A-Za-z]`), numbers
          # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
          # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
          # in length, and it must not start with `&quot;goog&quot;`.
      &quot;topic&quot;: &quot;A String&quot;, # Required. The name of the topic from which this subscription is receiving messages.
          # Format is `projects/{project}/topics/{topic}`.
          # The value of this field will be `_deleted-topic_` if the topic has been
          # deleted.
      &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
          # used to configure it. An empty `pushConfig` signifies that the subscriber
          # will pull and ack messages using API methods.
        &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
            # aspects of the message delivery.
            #
            # The only currently supported attribute is `x-goog-version`, which you can
            # use to change the format of the pushed message. This attribute
            # indicates the version of the data expected by the endpoint. This
            # controls the shape of the pushed message (i.e., its fields and metadata).
            #
            # If not present during the `CreateSubscription` call, it will default to
            # the version of the Pub/Sub API used to make such call. If not present in a
            # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
            # calls will always return a valid version, even if the subscription was
            # created without this attribute.
            #
            # The only supported values for the `x-goog-version` attribute are:
            #
            # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
            # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
            #
            # For example:
            # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
            # For example, a Webhook endpoint might use `https://example.com/push`.
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
            # `Authorization` header in the HTTP request for every pushed message.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
              # identifies the recipients that the JWT is intended for. The audience
              # value is a single case-sensitive string. Having multiple values (array)
              # for the audience field is not supported. More info about the OIDC JWT
              # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
              # Note: if not specified, the Push endpoint URL will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
              # email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating the OIDC token. The caller (for
              # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
              # have the iam.serviceAccounts.actAs permission for the service account.
        },
      },
      &quot;filter&quot;: &quot;A String&quot;, # An expression written in the Cloud Pub/Sub filter language. If non-empty,
          # then only `PubsubMessage`s whose `attributes` field matches the filter are
          # delivered on this subscription. If empty, then no messages are filtered
          # out.
          # &lt;b&gt;EXPERIMENTAL:&lt;/b&gt; This feature is part of a closed alpha release. This
          # API might be changed in backward-incompatible ways and is not recommended
          # for production use. It is not subject to any SLA or deprecation policy.
      &quot;ackDeadlineSeconds&quot;: 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
          # the subscriber to acknowledge receipt before resending the message. In the
          # interval after the message is delivered and before it is acknowledged, it
          # is considered to be &lt;i&gt;outstanding&lt;/i&gt;. During that time period, the
          # message will not be redelivered (on a best-effort basis).
          #
          # For pull subscriptions, this value is used as the initial value for the ack
          # deadline. To override this value for a given message, call
          # `ModifyAckDeadline` with the corresponding `ack_id` if using
          # non-streaming pull or send the `ack_id` in a
          # `StreamingModifyAckDeadlineRequest` if using streaming pull.
          # The minimum custom deadline you can specify is 10 seconds.
          # The maximum custom deadline you can specify is 600 seconds (10 minutes).
          # If this parameter is 0, a default value of 10 seconds is used.
          #
          # For push delivery, this value is also used to set the request timeout for
          # the call to the push endpoint.
          #
          # If the subscriber never acknowledges the message, the Pub/Sub
          # system will eventually redeliver the message.
      &quot;messageRetentionDuration&quot;: &quot;A String&quot;, # How long to retain unacknowledged messages in the subscription&#x27;s backlog,
          # from the moment a message is published.
          # If `retain_acked_messages` is true, then this also configures the retention
          # of acknowledged messages, and thus configures how far back in time a `Seek`
          # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
          # minutes.
    }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(subscription, x__xgafv=None)</code>
  <pre>Deletes an existing subscription. All messages retained in the subscription
are immediately dropped. Calls to `Pull` after deletion will return
`NOT_FOUND`. After a subscription is deleted, a new one may be created with
the same name, but the new one has no association with the old
subscription or its topic unless the same topic is specified.

Args:
  subscription: string, Required. The subscription to delete.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(subscription, x__xgafv=None)</code>
  <pre>Gets the configuration details of a subscription.

Args:
  subscription: string, Required. The name of the subscription to get.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A subscription resource.
      &quot;retainAckedMessages&quot;: True or False, # Indicates whether to retain acknowledged messages. If true, then
          # messages are not expunged from the subscription&#x27;s backlog, even if they are
          # acknowledged, until they fall out of the `message_retention_duration`
          # window. This must be true if you would like to
          # &lt;a
          # href=&quot;https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time&quot;&gt;
          # Seek to a timestamp&lt;/a&gt;.
      &quot;labels&quot;: { # See &lt;a href=&quot;https://cloud.google.com/pubsub/docs/labels&quot;&gt; Creating and
          # managing labels&lt;/a&gt;.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;expirationPolicy&quot;: { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription&#x27;s expiration.
          # A subscription is considered active as long as any connected subscriber is
          # successfully consuming messages from the subscription or is issuing
          # operations on the subscription. If `expiration_policy` is not set, a
          # *default policy* with `ttl` of 31 days will be used. The minimum allowed
          # value for `expiration_policy.ttl` is 1 day.
          # automatic resource deletion).
        &quot;ttl&quot;: &quot;A String&quot;, # Specifies the &quot;time-to-live&quot; duration for an associated resource. The
            # resource expires if it is not active for a period of `ttl`. The definition
            # of &quot;activity&quot; depends on the type of the associated resource. The minimum
            # and maximum allowed values for `ttl` depend on the type of the associated
            # resource, as well. If `ttl` is not set, the associated resource never
            # expires.
      },
      &quot;deadLetterPolicy&quot;: { # Dead lettering is done on a best effort basis. The same message might be # A policy that specifies the conditions for dead lettering messages in
          # this subscription. If dead_letter_policy is not set, dead lettering
          # is disabled.
          #
          # The Cloud Pub/Sub service account associated with this subscriptions&#x27;s
          # parent project (i.e.,
          # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
          # permission to Acknowledge() messages on this subscription.
          # dead lettered multiple times.
          #
          # If validation on any of the fields fails at subscription creation/updation,
          # the create/update subscription request will fail.
        &quot;deadLetterTopic&quot;: &quot;A String&quot;, # The name of the topic to which dead letter messages should be published.
            # Format is `projects/{project}/topics/{topic}`.The Cloud Pub/Sub service
            # account associated with the enclosing subscription&#x27;s parent project (i.e.,
            # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
            # permission to Publish() to this topic.
            #
            # The operation will fail if the topic does not exist.
            # Users should ensure that there is a subscription attached to this topic
            # since messages published to a topic with no subscriptions are lost.
        &quot;maxDeliveryAttempts&quot;: 42, # The maximum number of delivery attempts for any message. The value must be
            # between 5 and 100.
            #
            # The number of delivery attempts is defined as 1 + (the sum of number of
            # NACKs and number of times the acknowledgement deadline has been exceeded
            # for the message).
            #
            # A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
            # client libraries may automatically extend ack_deadlines.
            #
            # This field will be honored on a best effort basis.
            #
            # If this parameter is 0, a default value of 5 is used.
      },
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the subscription. It must have the format
          # `&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
          # start with a letter, and contain only letters (`[A-Za-z]`), numbers
          # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
          # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
          # in length, and it must not start with `&quot;goog&quot;`.
      &quot;topic&quot;: &quot;A String&quot;, # Required. The name of the topic from which this subscription is receiving messages.
          # Format is `projects/{project}/topics/{topic}`.
          # The value of this field will be `_deleted-topic_` if the topic has been
          # deleted.
      &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
          # used to configure it. An empty `pushConfig` signifies that the subscriber
          # will pull and ack messages using API methods.
        &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
            # aspects of the message delivery.
            #
            # The only currently supported attribute is `x-goog-version`, which you can
            # use to change the format of the pushed message. This attribute
            # indicates the version of the data expected by the endpoint. This
            # controls the shape of the pushed message (i.e., its fields and metadata).
            #
            # If not present during the `CreateSubscription` call, it will default to
            # the version of the Pub/Sub API used to make such call. If not present in a
            # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
            # calls will always return a valid version, even if the subscription was
            # created without this attribute.
            #
            # The only supported values for the `x-goog-version` attribute are:
            #
            # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
            # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
            #
            # For example:
            # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
            # For example, a Webhook endpoint might use `https://example.com/push`.
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
            # `Authorization` header in the HTTP request for every pushed message.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
              # identifies the recipients that the JWT is intended for. The audience
              # value is a single case-sensitive string. Having multiple values (array)
              # for the audience field is not supported. More info about the OIDC JWT
              # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
              # Note: if not specified, the Push endpoint URL will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
              # email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating the OIDC token. The caller (for
              # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
              # have the iam.serviceAccounts.actAs permission for the service account.
        },
      },
      &quot;filter&quot;: &quot;A String&quot;, # An expression written in the Cloud Pub/Sub filter language. If non-empty,
          # then only `PubsubMessage`s whose `attributes` field matches the filter are
          # delivered on this subscription. If empty, then no messages are filtered
          # out.
          # &lt;b&gt;EXPERIMENTAL:&lt;/b&gt; This feature is part of a closed alpha release. This
          # API might be changed in backward-incompatible ways and is not recommended
          # for production use. It is not subject to any SLA or deprecation policy.
      &quot;ackDeadlineSeconds&quot;: 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
          # the subscriber to acknowledge receipt before resending the message. In the
          # interval after the message is delivered and before it is acknowledged, it
          # is considered to be &lt;i&gt;outstanding&lt;/i&gt;. During that time period, the
          # message will not be redelivered (on a best-effort basis).
          #
          # For pull subscriptions, this value is used as the initial value for the ack
          # deadline. To override this value for a given message, call
          # `ModifyAckDeadline` with the corresponding `ack_id` if using
          # non-streaming pull or send the `ack_id` in a
          # `StreamingModifyAckDeadlineRequest` if using streaming pull.
          # The minimum custom deadline you can specify is 10 seconds.
          # The maximum custom deadline you can specify is 600 seconds (10 minutes).
          # If this parameter is 0, a default value of 10 seconds is used.
          #
          # For push delivery, this value is also used to set the request timeout for
          # the call to the push endpoint.
          #
          # If the subscriber never acknowledges the message, the Pub/Sub
          # system will eventually redeliver the message.
      &quot;messageRetentionDuration&quot;: &quot;A String&quot;, # How long to retain unacknowledged messages in the subscription&#x27;s backlog,
          # from the moment a message is published.
          # If `retain_acked_messages` is true, then this also configures the retention
          # of acknowledged messages, and thus configures how far back in time a `Seek`
          # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
          # minutes.
    }</pre>
</div>

<div class="method">
    <code class="details" id="getIamPolicy">getIamPolicy(resource, options_requestedPolicyVersion=None, x__xgafv=None)</code>
  <pre>Gets the access control policy for a resource.
Returns an empty policy if the resource exists and does not have a policy
set.

Args:
  resource: string, REQUIRED: The resource for which the policy is being requested.
See the operation documentation for the appropriate value for this field. (required)
  options_requestedPolicyVersion: integer, Optional. The policy format version to be returned.

Valid values are 0, 1, and 3. Requests specifying an invalid value will be
rejected.

Requests for policies with any conditional bindings must specify version 3.
Policies without any conditional bindings may specify any valid value or
leave the field unset.

To learn which resources support conditions in their IAM policies, see the
[IAM
documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An Identity and Access Management (IAM) policy, which specifies access
      # controls for Google Cloud resources.
      #
      #
      # A `Policy` is a collection of `bindings`. A `binding` binds one or more
      # `members` to a single `role`. Members can be user accounts, service accounts,
      # Google groups, and domains (such as G Suite). A `role` is a named list of
      # permissions; each `role` can be an IAM predefined role or a user-created
      # custom role.
      #
      # For some types of Google Cloud resources, a `binding` can also specify a
      # `condition`, which is a logical expression that allows access to a resource
      # only if the expression evaluates to `true`. A condition can add constraints
      # based on attributes of the request, the resource, or both. To learn which
      # resources support conditions in their IAM policies, see the
      # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
      #
      # **JSON example:**
      #
      #     {
      #       &quot;bindings&quot;: [
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:mike@example.com&quot;,
      #             &quot;group:admins@example.com&quot;,
      #             &quot;domain:google.com&quot;,
      #             &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot;
      #           ]
      #         },
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:eve@example.com&quot;
      #           ],
      #           &quot;condition&quot;: {
      #             &quot;title&quot;: &quot;expirable access&quot;,
      #             &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;,
      #             &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;,
      #           }
      #         }
      #       ],
      #       &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;,
      #       &quot;version&quot;: 3
      #     }
      #
      # **YAML example:**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-project-id@appspot.gserviceaccount.com
      #       role: roles/resourcemanager.organizationAdmin
      #     - members:
      #       - user:eve@example.com
      #       role: roles/resourcemanager.organizationViewer
      #       condition:
      #         title: expirable access
      #         description: Does not grant access after Sep 2020
      #         expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)
      #     - etag: BwWWja0YfJA=
      #     - version: 3
      #
      # For a description of IAM and its features, see the
      # [IAM documentation](https://cloud.google.com/iam/docs/).
    &quot;etag&quot;: &quot;A String&quot;, # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
    &quot;version&quot;: 42, # Specifies the format of the policy.
        #
        # Valid values are `0`, `1`, and `3`. Requests that specify an invalid value
        # are rejected.
        #
        # Any operation that affects conditional role bindings must specify version
        # `3`. This requirement applies to the following operations:
        #
        # * Getting a policy that includes a conditional role binding
        # * Adding a conditional role binding to a policy
        # * Changing a conditional role binding in a policy
        # * Removing any role binding, with or without a condition, from a policy
        #   that includes conditions
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
        #
        # If a policy does not include any conditions, operations on that policy may
        # specify any valid version or leave the field unset.
        #
        # To learn which resources support conditions in their IAM policies, see the
        # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
    &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a
        # `condition` that determines how and when the `bindings` are applied. Each
        # of the `bindings` must contain at least one member.
      { # Associates `members` with a `role`.
        &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) # The condition that is associated with this binding.
            #
            # If the condition evaluates to `true`, then this binding applies to the
            # current request.
            #
            # If the condition evaluates to `false`, then this binding does not apply to
            # the current request. However, a different role binding might grant the same
            # role to one or more of the members in this binding.
            #
            # To learn which resources support conditions in their IAM policies, see the
            # [IAM
            # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
            # syntax. CEL is a C-like expression language. The syntax and semantics of CEL
            # are documented at https://github.com/google/cel-spec.
            #
            # Example (Comparison):
            #
            #     title: &quot;Summary size limit&quot;
            #     description: &quot;Determines if a summary is less than 100 chars&quot;
            #     expression: &quot;document.summary.size() &lt; 100&quot;
            #
            # Example (Equality):
            #
            #     title: &quot;Requestor is owner&quot;
            #     description: &quot;Determines if requestor is the document owner&quot;
            #     expression: &quot;document.owner == request.auth.claims.email&quot;
            #
            # Example (Logic):
            #
            #     title: &quot;Public documents&quot;
            #     description: &quot;Determine whether the document should be publicly visible&quot;
            #     expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot;
            #
            # Example (Data Manipulation):
            #
            #     title: &quot;Notification string&quot;
            #     description: &quot;Create a notification string with a timestamp.&quot;
            #     expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot;
            #
            # The exact variables and functions that may be referenced within an expression
            # are determined by the service that evaluates it. See the service
            # documentation for additional information.
          &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
          &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language
              # syntax.
        },
        &quot;members&quot;: [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@example.com` .
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            # * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a user that has been recently deleted. For
            #    example, `alice@example.com?uid=123456789012345678901`. If the user is
            #    recovered, this value reverts to `user:{emailid}` and the recovered user
            #    retains the role in the binding.
            #
            # * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus
            #    unique identifier) representing a service account that has been recently
            #    deleted. For example,
            #    `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.
            #    If the service account is undeleted, this value reverts to
            #    `serviceAccount:{emailid}` and the undeleted service account retains the
            #    role in the binding.
            #
            # * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a Google group that has been recently
            #    deleted. For example, `admins@example.com?uid=123456789012345678901`. If
            #    the group is recovered, this value reverts to `group:{emailid}` and the
            #    recovered group retains the role in the binding.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          &quot;A String&quot;,
        ],
        &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(project, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Lists matching subscriptions.

Args:
  project: string, Required. The name of the project in which to list subscriptions.
Format is `projects/{project-id}`. (required)
  pageToken: string, The value returned by the last `ListSubscriptionsResponse`; indicates that
this is a continuation of a prior `ListSubscriptions` call, and that the
system should return the next page of data.
  pageSize: integer, Maximum number of subscriptions to return.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for the `ListSubscriptions` method.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # If not empty, indicates that there may be more subscriptions that match
        # the request; this value should be passed in a new
        # `ListSubscriptionsRequest` to get more subscriptions.
    &quot;subscriptions&quot;: [ # The subscriptions that match the request.
      { # A subscription resource.
          &quot;retainAckedMessages&quot;: True or False, # Indicates whether to retain acknowledged messages. If true, then
              # messages are not expunged from the subscription&#x27;s backlog, even if they are
              # acknowledged, until they fall out of the `message_retention_duration`
              # window. This must be true if you would like to
              # &lt;a
              # href=&quot;https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time&quot;&gt;
              # Seek to a timestamp&lt;/a&gt;.
          &quot;labels&quot;: { # See &lt;a href=&quot;https://cloud.google.com/pubsub/docs/labels&quot;&gt; Creating and
              # managing labels&lt;/a&gt;.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;expirationPolicy&quot;: { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription&#x27;s expiration.
              # A subscription is considered active as long as any connected subscriber is
              # successfully consuming messages from the subscription or is issuing
              # operations on the subscription. If `expiration_policy` is not set, a
              # *default policy* with `ttl` of 31 days will be used. The minimum allowed
              # value for `expiration_policy.ttl` is 1 day.
              # automatic resource deletion).
            &quot;ttl&quot;: &quot;A String&quot;, # Specifies the &quot;time-to-live&quot; duration for an associated resource. The
                # resource expires if it is not active for a period of `ttl`. The definition
                # of &quot;activity&quot; depends on the type of the associated resource. The minimum
                # and maximum allowed values for `ttl` depend on the type of the associated
                # resource, as well. If `ttl` is not set, the associated resource never
                # expires.
          },
          &quot;deadLetterPolicy&quot;: { # Dead lettering is done on a best effort basis. The same message might be # A policy that specifies the conditions for dead lettering messages in
              # this subscription. If dead_letter_policy is not set, dead lettering
              # is disabled.
              #
              # The Cloud Pub/Sub service account associated with this subscriptions&#x27;s
              # parent project (i.e.,
              # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
              # permission to Acknowledge() messages on this subscription.
              # dead lettered multiple times.
              #
              # If validation on any of the fields fails at subscription creation/updation,
              # the create/update subscription request will fail.
            &quot;deadLetterTopic&quot;: &quot;A String&quot;, # The name of the topic to which dead letter messages should be published.
                # Format is `projects/{project}/topics/{topic}`.The Cloud Pub/Sub service
                # account associated with the enclosing subscription&#x27;s parent project (i.e.,
                # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
                # permission to Publish() to this topic.
                #
                # The operation will fail if the topic does not exist.
                # Users should ensure that there is a subscription attached to this topic
                # since messages published to a topic with no subscriptions are lost.
            &quot;maxDeliveryAttempts&quot;: 42, # The maximum number of delivery attempts for any message. The value must be
                # between 5 and 100.
                #
                # The number of delivery attempts is defined as 1 + (the sum of number of
                # NACKs and number of times the acknowledgement deadline has been exceeded
                # for the message).
                #
                # A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
                # client libraries may automatically extend ack_deadlines.
                #
                # This field will be honored on a best effort basis.
                #
                # If this parameter is 0, a default value of 5 is used.
          },
          &quot;name&quot;: &quot;A String&quot;, # Required. The name of the subscription. It must have the format
              # `&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
              # start with a letter, and contain only letters (`[A-Za-z]`), numbers
              # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
              # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
              # in length, and it must not start with `&quot;goog&quot;`.
          &quot;topic&quot;: &quot;A String&quot;, # Required. The name of the topic from which this subscription is receiving messages.
              # Format is `projects/{project}/topics/{topic}`.
              # The value of this field will be `_deleted-topic_` if the topic has been
              # deleted.
          &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
              # used to configure it. An empty `pushConfig` signifies that the subscriber
              # will pull and ack messages using API methods.
            &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
                # aspects of the message delivery.
                #
                # The only currently supported attribute is `x-goog-version`, which you can
                # use to change the format of the pushed message. This attribute
                # indicates the version of the data expected by the endpoint. This
                # controls the shape of the pushed message (i.e., its fields and metadata).
                #
                # If not present during the `CreateSubscription` call, it will default to
                # the version of the Pub/Sub API used to make such call. If not present in a
                # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
                # calls will always return a valid version, even if the subscription was
                # created without this attribute.
                #
                # The only supported values for the `x-goog-version` attribute are:
                #
                # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
                # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
                #
                # For example:
                # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
                # For example, a Webhook endpoint might use `https://example.com/push`.
            &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
                # `Authorization` header in the HTTP request for every pushed message.
                # [OpenID Connect
                # token](https://developers.google.com/identity/protocols/OpenIDConnect).
              &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
                  # identifies the recipients that the JWT is intended for. The audience
                  # value is a single case-sensitive string. Having multiple values (array)
                  # for the audience field is not supported. More info about the OIDC JWT
                  # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
                  # Note: if not specified, the Push endpoint URL will be used.
              &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
                  # email](https://cloud.google.com/iam/docs/service-accounts)
                  # to be used for generating the OIDC token. The caller (for
                  # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
                  # have the iam.serviceAccounts.actAs permission for the service account.
            },
          },
          &quot;filter&quot;: &quot;A String&quot;, # An expression written in the Cloud Pub/Sub filter language. If non-empty,
              # then only `PubsubMessage`s whose `attributes` field matches the filter are
              # delivered on this subscription. If empty, then no messages are filtered
              # out.
              # &lt;b&gt;EXPERIMENTAL:&lt;/b&gt; This feature is part of a closed alpha release. This
              # API might be changed in backward-incompatible ways and is not recommended
              # for production use. It is not subject to any SLA or deprecation policy.
          &quot;ackDeadlineSeconds&quot;: 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
              # the subscriber to acknowledge receipt before resending the message. In the
              # interval after the message is delivered and before it is acknowledged, it
              # is considered to be &lt;i&gt;outstanding&lt;/i&gt;. During that time period, the
              # message will not be redelivered (on a best-effort basis).
              #
              # For pull subscriptions, this value is used as the initial value for the ack
              # deadline. To override this value for a given message, call
              # `ModifyAckDeadline` with the corresponding `ack_id` if using
              # non-streaming pull or send the `ack_id` in a
              # `StreamingModifyAckDeadlineRequest` if using streaming pull.
              # The minimum custom deadline you can specify is 10 seconds.
              # The maximum custom deadline you can specify is 600 seconds (10 minutes).
              # If this parameter is 0, a default value of 10 seconds is used.
              #
              # For push delivery, this value is also used to set the request timeout for
              # the call to the push endpoint.
              #
              # If the subscriber never acknowledges the message, the Pub/Sub
              # system will eventually redeliver the message.
          &quot;messageRetentionDuration&quot;: &quot;A String&quot;, # How long to retain unacknowledged messages in the subscription&#x27;s backlog,
              # from the moment a message is published.
              # If `retain_acked_messages` is true, then this also configures the retention
              # of acknowledged messages, and thus configures how far back in time a `Seek`
              # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
              # minutes.
        },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

<div class="method">
    <code class="details" id="modifyAckDeadline">modifyAckDeadline(subscription, body=None, x__xgafv=None)</code>
  <pre>Modifies the ack deadline for a specific message. This method is useful
to indicate that more time is needed to process a message by the
subscriber, or to make the message available for redelivery if the
processing was interrupted. Note that this does not modify the
subscription-level `ackDeadlineSeconds` used for subsequent messages.

Args:
  subscription: string, Required. The name of the subscription.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for the ModifyAckDeadline method.
    &quot;ackIds&quot;: [ # Required. List of acknowledgment IDs.
      &quot;A String&quot;,
    ],
    &quot;ackDeadlineSeconds&quot;: 42, # Required. The new ack deadline with respect to the time this request was sent to
        # the Pub/Sub system. For example, if the value is 10, the new
        # ack deadline will expire 10 seconds after the `ModifyAckDeadline` call
        # was made. Specifying zero might immediately make the message available for
        # delivery to another subscriber client. This typically results in an
        # increase in the rate of message redeliveries (that is, duplicates).
        # The minimum deadline you can specify is 0 seconds.
        # The maximum deadline you can specify is 600 seconds (10 minutes).
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="modifyPushConfig">modifyPushConfig(subscription, body=None, x__xgafv=None)</code>
  <pre>Modifies the `PushConfig` for a specified subscription.

This may be used to change a push subscription to a pull one (signified by
an empty `PushConfig`) or vice versa, or change the endpoint URL and other
attributes of a push subscription. Messages will accumulate for delivery
continuously through the call regardless of changes to the `PushConfig`.

Args:
  subscription: string, Required. The name of the subscription.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for the ModifyPushConfig method.
    &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # Required. The push configuration for future deliveries.
        # 
        # An empty `pushConfig` indicates that the Pub/Sub system should
        # stop pushing messages from the given subscription and allow
        # messages to be pulled and acknowledged - effectively pausing
        # the subscription if `Pull` or `StreamingPull` is not called.
      &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
          # aspects of the message delivery.
          #
          # The only currently supported attribute is `x-goog-version`, which you can
          # use to change the format of the pushed message. This attribute
          # indicates the version of the data expected by the endpoint. This
          # controls the shape of the pushed message (i.e., its fields and metadata).
          #
          # If not present during the `CreateSubscription` call, it will default to
          # the version of the Pub/Sub API used to make such call. If not present in a
          # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
          # calls will always return a valid version, even if the subscription was
          # created without this attribute.
          #
          # The only supported values for the `x-goog-version` attribute are:
          #
          # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
          # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
          #
          # For example:
          # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
          # For example, a Webhook endpoint might use `https://example.com/push`.
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
          # `Authorization` header in the HTTP request for every pushed message.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
            # identifies the recipients that the JWT is intended for. The audience
            # value is a single case-sensitive string. Having multiple values (array)
            # for the audience field is not supported. More info about the OIDC JWT
            # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
            # Note: if not specified, the Push endpoint URL will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
            # email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating the OIDC token. The caller (for
            # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
            # have the iam.serviceAccounts.actAs permission for the service account.
      },
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, x__xgafv=None)</code>
  <pre>Updates an existing subscription. Note that certain properties of a
subscription, such as its topic, are not modifiable.

Args:
  name: string, Required. The name of the subscription. It must have the format
`&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
start with a letter, and contain only letters (`[A-Za-z]`), numbers
(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
in length, and it must not start with `&quot;goog&quot;`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for the UpdateSubscription method.
    &quot;updateMask&quot;: &quot;A String&quot;, # Required. Indicates which fields in the provided subscription to update.
        # Must be specified and non-empty.
    &quot;subscription&quot;: { # A subscription resource. # Required. The updated subscription object.
        &quot;retainAckedMessages&quot;: True or False, # Indicates whether to retain acknowledged messages. If true, then
            # messages are not expunged from the subscription&#x27;s backlog, even if they are
            # acknowledged, until they fall out of the `message_retention_duration`
            # window. This must be true if you would like to
            # &lt;a
            # href=&quot;https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time&quot;&gt;
            # Seek to a timestamp&lt;/a&gt;.
        &quot;labels&quot;: { # See &lt;a href=&quot;https://cloud.google.com/pubsub/docs/labels&quot;&gt; Creating and
            # managing labels&lt;/a&gt;.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;expirationPolicy&quot;: { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription&#x27;s expiration.
            # A subscription is considered active as long as any connected subscriber is
            # successfully consuming messages from the subscription or is issuing
            # operations on the subscription. If `expiration_policy` is not set, a
            # *default policy* with `ttl` of 31 days will be used. The minimum allowed
            # value for `expiration_policy.ttl` is 1 day.
            # automatic resource deletion).
          &quot;ttl&quot;: &quot;A String&quot;, # Specifies the &quot;time-to-live&quot; duration for an associated resource. The
              # resource expires if it is not active for a period of `ttl`. The definition
              # of &quot;activity&quot; depends on the type of the associated resource. The minimum
              # and maximum allowed values for `ttl` depend on the type of the associated
              # resource, as well. If `ttl` is not set, the associated resource never
              # expires.
        },
        &quot;deadLetterPolicy&quot;: { # Dead lettering is done on a best effort basis. The same message might be # A policy that specifies the conditions for dead lettering messages in
            # this subscription. If dead_letter_policy is not set, dead lettering
            # is disabled.
            #
            # The Cloud Pub/Sub service account associated with this subscriptions&#x27;s
            # parent project (i.e.,
            # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
            # permission to Acknowledge() messages on this subscription.
            # dead lettered multiple times.
            #
            # If validation on any of the fields fails at subscription creation/updation,
            # the create/update subscription request will fail.
          &quot;deadLetterTopic&quot;: &quot;A String&quot;, # The name of the topic to which dead letter messages should be published.
              # Format is `projects/{project}/topics/{topic}`.The Cloud Pub/Sub service
              # account associated with the enclosing subscription&#x27;s parent project (i.e.,
              # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
              # permission to Publish() to this topic.
              #
              # The operation will fail if the topic does not exist.
              # Users should ensure that there is a subscription attached to this topic
              # since messages published to a topic with no subscriptions are lost.
          &quot;maxDeliveryAttempts&quot;: 42, # The maximum number of delivery attempts for any message. The value must be
              # between 5 and 100.
              #
              # The number of delivery attempts is defined as 1 + (the sum of number of
              # NACKs and number of times the acknowledgement deadline has been exceeded
              # for the message).
              #
              # A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
              # client libraries may automatically extend ack_deadlines.
              #
              # This field will be honored on a best effort basis.
              #
              # If this parameter is 0, a default value of 5 is used.
        },
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the subscription. It must have the format
            # `&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
            # start with a letter, and contain only letters (`[A-Za-z]`), numbers
            # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
            # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
            # in length, and it must not start with `&quot;goog&quot;`.
        &quot;topic&quot;: &quot;A String&quot;, # Required. The name of the topic from which this subscription is receiving messages.
            # Format is `projects/{project}/topics/{topic}`.
            # The value of this field will be `_deleted-topic_` if the topic has been
            # deleted.
        &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
            # used to configure it. An empty `pushConfig` signifies that the subscriber
            # will pull and ack messages using API methods.
          &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
              # aspects of the message delivery.
              #
              # The only currently supported attribute is `x-goog-version`, which you can
              # use to change the format of the pushed message. This attribute
              # indicates the version of the data expected by the endpoint. This
              # controls the shape of the pushed message (i.e., its fields and metadata).
              #
              # If not present during the `CreateSubscription` call, it will default to
              # the version of the Pub/Sub API used to make such call. If not present in a
              # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
              # calls will always return a valid version, even if the subscription was
              # created without this attribute.
              #
              # The only supported values for the `x-goog-version` attribute are:
              #
              # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
              # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
              #
              # For example:
              # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
              # For example, a Webhook endpoint might use `https://example.com/push`.
          &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
              # `Authorization` header in the HTTP request for every pushed message.
              # [OpenID Connect
              # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
                # identifies the recipients that the JWT is intended for. The audience
                # value is a single case-sensitive string. Having multiple values (array)
                # for the audience field is not supported. More info about the OIDC JWT
                # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
                # Note: if not specified, the Push endpoint URL will be used.
            &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
                # email](https://cloud.google.com/iam/docs/service-accounts)
                # to be used for generating the OIDC token. The caller (for
                # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
                # have the iam.serviceAccounts.actAs permission for the service account.
          },
        },
        &quot;filter&quot;: &quot;A String&quot;, # An expression written in the Cloud Pub/Sub filter language. If non-empty,
            # then only `PubsubMessage`s whose `attributes` field matches the filter are
            # delivered on this subscription. If empty, then no messages are filtered
            # out.
            # &lt;b&gt;EXPERIMENTAL:&lt;/b&gt; This feature is part of a closed alpha release. This
            # API might be changed in backward-incompatible ways and is not recommended
            # for production use. It is not subject to any SLA or deprecation policy.
        &quot;ackDeadlineSeconds&quot;: 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
            # the subscriber to acknowledge receipt before resending the message. In the
            # interval after the message is delivered and before it is acknowledged, it
            # is considered to be &lt;i&gt;outstanding&lt;/i&gt;. During that time period, the
            # message will not be redelivered (on a best-effort basis).
            #
            # For pull subscriptions, this value is used as the initial value for the ack
            # deadline. To override this value for a given message, call
            # `ModifyAckDeadline` with the corresponding `ack_id` if using
            # non-streaming pull or send the `ack_id` in a
            # `StreamingModifyAckDeadlineRequest` if using streaming pull.
            # The minimum custom deadline you can specify is 10 seconds.
            # The maximum custom deadline you can specify is 600 seconds (10 minutes).
            # If this parameter is 0, a default value of 10 seconds is used.
            #
            # For push delivery, this value is also used to set the request timeout for
            # the call to the push endpoint.
            #
            # If the subscriber never acknowledges the message, the Pub/Sub
            # system will eventually redeliver the message.
        &quot;messageRetentionDuration&quot;: &quot;A String&quot;, # How long to retain unacknowledged messages in the subscription&#x27;s backlog,
            # from the moment a message is published.
            # If `retain_acked_messages` is true, then this also configures the retention
            # of acknowledged messages, and thus configures how far back in time a `Seek`
            # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
            # minutes.
      },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A subscription resource.
      &quot;retainAckedMessages&quot;: True or False, # Indicates whether to retain acknowledged messages. If true, then
          # messages are not expunged from the subscription&#x27;s backlog, even if they are
          # acknowledged, until they fall out of the `message_retention_duration`
          # window. This must be true if you would like to
          # &lt;a
          # href=&quot;https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time&quot;&gt;
          # Seek to a timestamp&lt;/a&gt;.
      &quot;labels&quot;: { # See &lt;a href=&quot;https://cloud.google.com/pubsub/docs/labels&quot;&gt; Creating and
          # managing labels&lt;/a&gt;.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;expirationPolicy&quot;: { # A policy that specifies the conditions for resource expiration (i.e., # A policy that specifies the conditions for this subscription&#x27;s expiration.
          # A subscription is considered active as long as any connected subscriber is
          # successfully consuming messages from the subscription or is issuing
          # operations on the subscription. If `expiration_policy` is not set, a
          # *default policy* with `ttl` of 31 days will be used. The minimum allowed
          # value for `expiration_policy.ttl` is 1 day.
          # automatic resource deletion).
        &quot;ttl&quot;: &quot;A String&quot;, # Specifies the &quot;time-to-live&quot; duration for an associated resource. The
            # resource expires if it is not active for a period of `ttl`. The definition
            # of &quot;activity&quot; depends on the type of the associated resource. The minimum
            # and maximum allowed values for `ttl` depend on the type of the associated
            # resource, as well. If `ttl` is not set, the associated resource never
            # expires.
      },
      &quot;deadLetterPolicy&quot;: { # Dead lettering is done on a best effort basis. The same message might be # A policy that specifies the conditions for dead lettering messages in
          # this subscription. If dead_letter_policy is not set, dead lettering
          # is disabled.
          #
          # The Cloud Pub/Sub service account associated with this subscriptions&#x27;s
          # parent project (i.e.,
          # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
          # permission to Acknowledge() messages on this subscription.
          # dead lettered multiple times.
          #
          # If validation on any of the fields fails at subscription creation/updation,
          # the create/update subscription request will fail.
        &quot;deadLetterTopic&quot;: &quot;A String&quot;, # The name of the topic to which dead letter messages should be published.
            # Format is `projects/{project}/topics/{topic}`.The Cloud Pub/Sub service
            # account associated with the enclosing subscription&#x27;s parent project (i.e.,
            # service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
            # permission to Publish() to this topic.
            #
            # The operation will fail if the topic does not exist.
            # Users should ensure that there is a subscription attached to this topic
            # since messages published to a topic with no subscriptions are lost.
        &quot;maxDeliveryAttempts&quot;: 42, # The maximum number of delivery attempts for any message. The value must be
            # between 5 and 100.
            #
            # The number of delivery attempts is defined as 1 + (the sum of number of
            # NACKs and number of times the acknowledgement deadline has been exceeded
            # for the message).
            #
            # A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
            # client libraries may automatically extend ack_deadlines.
            #
            # This field will be honored on a best effort basis.
            #
            # If this parameter is 0, a default value of 5 is used.
      },
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the subscription. It must have the format
          # `&quot;projects/{project}/subscriptions/{subscription}&quot;`. `{subscription}` must
          # start with a letter, and contain only letters (`[A-Za-z]`), numbers
          # (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
          # plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
          # in length, and it must not start with `&quot;goog&quot;`.
      &quot;topic&quot;: &quot;A String&quot;, # Required. The name of the topic from which this subscription is receiving messages.
          # Format is `projects/{project}/topics/{topic}`.
          # The value of this field will be `_deleted-topic_` if the topic has been
          # deleted.
      &quot;pushConfig&quot;: { # Configuration for a push delivery endpoint. # If push delivery is used with this subscription, this field is
          # used to configure it. An empty `pushConfig` signifies that the subscriber
          # will pull and ack messages using API methods.
        &quot;attributes&quot;: { # Endpoint configuration attributes that can be used to control different
            # aspects of the message delivery.
            #
            # The only currently supported attribute is `x-goog-version`, which you can
            # use to change the format of the pushed message. This attribute
            # indicates the version of the data expected by the endpoint. This
            # controls the shape of the pushed message (i.e., its fields and metadata).
            #
            # If not present during the `CreateSubscription` call, it will default to
            # the version of the Pub/Sub API used to make such call. If not present in a
            # `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
            # calls will always return a valid version, even if the subscription was
            # created without this attribute.
            #
            # The only supported values for the `x-goog-version` attribute are:
            #
            # * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
            # * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
            #
            # For example:
            # &lt;pre&gt;&lt;code&gt;attributes { &quot;x-goog-version&quot;: &quot;v1&quot; } &lt;/code&gt;&lt;/pre&gt;
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;pushEndpoint&quot;: &quot;A String&quot;, # A URL locating the endpoint to which messages should be pushed.
            # For example, a Webhook endpoint might use `https://example.com/push`.
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, Pub/Sub will generate and attach an OIDC JWT token as an
            # `Authorization` header in the HTTP request for every pushed message.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. The audience claim
              # identifies the recipients that the JWT is intended for. The audience
              # value is a single case-sensitive string. Having multiple values (array)
              # for the audience field is not supported. More info about the OIDC JWT
              # token audience here: https://tools.ietf.org/html/rfc7519#section-4.1.3
              # Note: if not specified, the Push endpoint URL will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account
              # email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating the OIDC token. The caller (for
              # CreateSubscription, UpdateSubscription, and ModifyPushConfig RPCs) must
              # have the iam.serviceAccounts.actAs permission for the service account.
        },
      },
      &quot;filter&quot;: &quot;A String&quot;, # An expression written in the Cloud Pub/Sub filter language. If non-empty,
          # then only `PubsubMessage`s whose `attributes` field matches the filter are
          # delivered on this subscription. If empty, then no messages are filtered
          # out.
          # &lt;b&gt;EXPERIMENTAL:&lt;/b&gt; This feature is part of a closed alpha release. This
          # API might be changed in backward-incompatible ways and is not recommended
          # for production use. It is not subject to any SLA or deprecation policy.
      &quot;ackDeadlineSeconds&quot;: 42, # The approximate amount of time (on a best-effort basis) Pub/Sub waits for
          # the subscriber to acknowledge receipt before resending the message. In the
          # interval after the message is delivered and before it is acknowledged, it
          # is considered to be &lt;i&gt;outstanding&lt;/i&gt;. During that time period, the
          # message will not be redelivered (on a best-effort basis).
          #
          # For pull subscriptions, this value is used as the initial value for the ack
          # deadline. To override this value for a given message, call
          # `ModifyAckDeadline` with the corresponding `ack_id` if using
          # non-streaming pull or send the `ack_id` in a
          # `StreamingModifyAckDeadlineRequest` if using streaming pull.
          # The minimum custom deadline you can specify is 10 seconds.
          # The maximum custom deadline you can specify is 600 seconds (10 minutes).
          # If this parameter is 0, a default value of 10 seconds is used.
          #
          # For push delivery, this value is also used to set the request timeout for
          # the call to the push endpoint.
          #
          # If the subscriber never acknowledges the message, the Pub/Sub
          # system will eventually redeliver the message.
      &quot;messageRetentionDuration&quot;: &quot;A String&quot;, # How long to retain unacknowledged messages in the subscription&#x27;s backlog,
          # from the moment a message is published.
          # If `retain_acked_messages` is true, then this also configures the retention
          # of acknowledged messages, and thus configures how far back in time a `Seek`
          # can be done. Defaults to 7 days. Cannot be more than 7 days or less than 10
          # minutes.
    }</pre>
</div>

<div class="method">
    <code class="details" id="pull">pull(subscription, body=None, x__xgafv=None)</code>
  <pre>Pulls messages from the server. The server may return `UNAVAILABLE` if
there are too many concurrent pull requests pending for the given
subscription.

Args:
  subscription: string, Required. The subscription from which messages should be pulled.
Format is `projects/{project}/subscriptions/{sub}`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for the `Pull` method.
    &quot;returnImmediately&quot;: True or False, # Optional. If this field set to true, the system will respond immediately even if
        # it there are no messages available to return in the `Pull` response.
        # Otherwise, the system may wait (for a bounded amount of time) until at
        # least one message is available, rather than returning no messages. Warning:
        # setting this field to `true` is discouraged because it adversely impacts
        # the performance of `Pull` operations. We recommend that users do not set
        # this field.
    &quot;maxMessages&quot;: 42, # Required. The maximum number of messages to return for this request. Must be a
        # positive integer. The Pub/Sub system may return fewer than the number
        # specified.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for the `Pull` method.
    &quot;receivedMessages&quot;: [ # Received Pub/Sub messages. The list will be empty if there are no more
        # messages available in the backlog. For JSON, the response can be entirely
        # empty. The Pub/Sub system may return fewer than the `maxMessages` requested
        # even if there are more messages available in the backlog.
      { # A message and its corresponding acknowledgment ID.
        &quot;deliveryAttempt&quot;: 42, # The approximate number of times that Cloud Pub/Sub has attempted to deliver
            # the associated message to a subscriber.
            #
            # More precisely, this is 1 + (number of NACKs) +
            # (number of ack_deadline exceeds) for this message.
            #
            # A NACK is any call to ModifyAckDeadline with a 0 deadline. An ack_deadline
            # exceeds event is whenever a message is not acknowledged within
            # ack_deadline. Note that ack_deadline is initially
            # Subscription.ackDeadlineSeconds, but may get extended automatically by
            # the client library.
            #
            # Upon the first delivery of a given message, `delivery_attempt` will have a
            # value of 1. The value is calculated at best effort and is approximate.
            #
            # If a DeadLetterPolicy is not set on the subscription, this will be 0.
        &quot;message&quot;: { # A message that is published by publishers and consumed by subscribers. The # The message.
            # message must contain either a non-empty data field or at least one attribute.
            # Note that client libraries represent this object differently
            # depending on the language. See the corresponding
            # &lt;a href=&quot;https://cloud.google.com/pubsub/docs/reference/libraries&quot;&gt;client
            # library documentation&lt;/a&gt; for more information. See
            # &lt;a href=&quot;https://cloud.google.com/pubsub/quotas&quot;&gt;Quotas and limits&lt;/a&gt;
            # for more information about message limits.
          &quot;messageId&quot;: &quot;A String&quot;, # ID of this message, assigned by the server when the message is published.
              # Guaranteed to be unique within the topic. This value may be read by a
              # subscriber that receives a `PubsubMessage` via a `Pull` call or a push
              # delivery. It must not be populated by the publisher in a `Publish` call.
          &quot;attributes&quot;: { # Attributes for this message. If this field is empty, the message must
              # contain non-empty data.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;publishTime&quot;: &quot;A String&quot;, # The time at which the message was published, populated by the server when
              # it receives the `Publish` call. It must not be populated by the
              # publisher in a `Publish` call.
          &quot;data&quot;: &quot;A String&quot;, # The message data field. If this field is empty, the message must contain
              # at least one attribute.
        },
        &quot;ackId&quot;: &quot;A String&quot;, # This ID can be used to acknowledge the received message.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="seek">seek(subscription, body=None, x__xgafv=None)</code>
  <pre>Seeks an existing subscription to a point in time or to a given snapshot,
whichever is provided in the request. Snapshots are used in
&lt;a href=&quot;https://cloud.google.com/pubsub/docs/replay-overview&quot;&gt;Seek&lt;/a&gt;
operations, which allow
you to manage message acknowledgments in bulk. That is, you can set the
acknowledgment state of messages in an existing subscription to the state
captured by a snapshot. Note that both the subscription and the snapshot
must be on the same topic.

Args:
  subscription: string, Required. The subscription to affect. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request for the `Seek` method.
    &quot;time&quot;: &quot;A String&quot;, # The time to seek to.
        # Messages retained in the subscription that were published before this
        # time are marked as acknowledged, and messages retained in the
        # subscription that were published after this time are marked as
        # unacknowledged. Note that this operation affects only those messages
        # retained in the subscription (configured by the combination of
        # `message_retention_duration` and `retain_acked_messages`). For example,
        # if `time` corresponds to a point before the message retention
        # window (or to a point before the system&#x27;s notion of the subscription
        # creation time), only retained messages will be marked as unacknowledged,
        # and already-expunged messages will not be restored.
    &quot;snapshot&quot;: &quot;A String&quot;, # The snapshot to seek to. The snapshot&#x27;s topic must be the same as that of
        # the provided subscription.
        # Format is `projects/{project}/snapshots/{snap}`.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for the `Seek` method (this response is empty).
  }</pre>
</div>

<div class="method">
    <code class="details" id="setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</code>
  <pre>Sets the access control policy on the specified resource. Replaces any
existing policy.

Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.

Args:
  resource: string, REQUIRED: The resource for which the policy is being specified.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for `SetIamPolicy` method.
    &quot;policy&quot;: { # An Identity and Access Management (IAM) policy, which specifies access # REQUIRED: The complete policy to be applied to the `resource`. The size of
        # the policy is limited to a few 10s of KB. An empty policy is a
        # valid policy but certain Cloud Platform services (such as Projects)
        # might reject them.
        # controls for Google Cloud resources.
        #
        #
        # A `Policy` is a collection of `bindings`. A `binding` binds one or more
        # `members` to a single `role`. Members can be user accounts, service accounts,
        # Google groups, and domains (such as G Suite). A `role` is a named list of
        # permissions; each `role` can be an IAM predefined role or a user-created
        # custom role.
        #
        # For some types of Google Cloud resources, a `binding` can also specify a
        # `condition`, which is a logical expression that allows access to a resource
        # only if the expression evaluates to `true`. A condition can add constraints
        # based on attributes of the request, the resource, or both. To learn which
        # resources support conditions in their IAM policies, see the
        # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
        #
        # **JSON example:**
        #
        #     {
        #       &quot;bindings&quot;: [
        #         {
        #           &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;,
        #           &quot;members&quot;: [
        #             &quot;user:mike@example.com&quot;,
        #             &quot;group:admins@example.com&quot;,
        #             &quot;domain:google.com&quot;,
        #             &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot;
        #           ]
        #         },
        #         {
        #           &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;,
        #           &quot;members&quot;: [
        #             &quot;user:eve@example.com&quot;
        #           ],
        #           &quot;condition&quot;: {
        #             &quot;title&quot;: &quot;expirable access&quot;,
        #             &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;,
        #             &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;,
        #           }
        #         }
        #       ],
        #       &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;,
        #       &quot;version&quot;: 3
        #     }
        #
        # **YAML example:**
        #
        #     bindings:
        #     - members:
        #       - user:mike@example.com
        #       - group:admins@example.com
        #       - domain:google.com
        #       - serviceAccount:my-project-id@appspot.gserviceaccount.com
        #       role: roles/resourcemanager.organizationAdmin
        #     - members:
        #       - user:eve@example.com
        #       role: roles/resourcemanager.organizationViewer
        #       condition:
        #         title: expirable access
        #         description: Does not grant access after Sep 2020
        #         expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)
        #     - etag: BwWWja0YfJA=
        #     - version: 3
        #
        # For a description of IAM and its features, see the
        # [IAM documentation](https://cloud.google.com/iam/docs/).
      &quot;etag&quot;: &quot;A String&quot;, # `etag` is used for optimistic concurrency control as a way to help
          # prevent simultaneous updates of a policy from overwriting each other.
          # It is strongly suggested that systems make use of the `etag` in the
          # read-modify-write cycle to perform policy updates in order to avoid race
          # conditions: An `etag` is returned in the response to `getIamPolicy`, and
          # systems are expected to put that etag in the request to `setIamPolicy` to
          # ensure that their change will be applied to the same version of the policy.
          #
          # **Important:** If you use IAM Conditions, you must include the `etag` field
          # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
          # you to overwrite a version `3` policy with a version `1` policy, and all of
          # the conditions in the version `3` policy are lost.
      &quot;version&quot;: 42, # Specifies the format of the policy.
          #
          # Valid values are `0`, `1`, and `3`. Requests that specify an invalid value
          # are rejected.
          #
          # Any operation that affects conditional role bindings must specify version
          # `3`. This requirement applies to the following operations:
          #
          # * Getting a policy that includes a conditional role binding
          # * Adding a conditional role binding to a policy
          # * Changing a conditional role binding in a policy
          # * Removing any role binding, with or without a condition, from a policy
          #   that includes conditions
          #
          # **Important:** If you use IAM Conditions, you must include the `etag` field
          # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
          # you to overwrite a version `3` policy with a version `1` policy, and all of
          # the conditions in the version `3` policy are lost.
          #
          # If a policy does not include any conditions, operations on that policy may
          # specify any valid version or leave the field unset.
          #
          # To learn which resources support conditions in their IAM policies, see the
          # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
      &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a
          # `condition` that determines how and when the `bindings` are applied. Each
          # of the `bindings` must contain at least one member.
        { # Associates `members` with a `role`.
          &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) # The condition that is associated with this binding.
              #
              # If the condition evaluates to `true`, then this binding applies to the
              # current request.
              #
              # If the condition evaluates to `false`, then this binding does not apply to
              # the current request. However, a different role binding might grant the same
              # role to one or more of the members in this binding.
              #
              # To learn which resources support conditions in their IAM policies, see the
              # [IAM
              # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
              # syntax. CEL is a C-like expression language. The syntax and semantics of CEL
              # are documented at https://github.com/google/cel-spec.
              #
              # Example (Comparison):
              #
              #     title: &quot;Summary size limit&quot;
              #     description: &quot;Determines if a summary is less than 100 chars&quot;
              #     expression: &quot;document.summary.size() &lt; 100&quot;
              #
              # Example (Equality):
              #
              #     title: &quot;Requestor is owner&quot;
              #     description: &quot;Determines if requestor is the document owner&quot;
              #     expression: &quot;document.owner == request.auth.claims.email&quot;
              #
              # Example (Logic):
              #
              #     title: &quot;Public documents&quot;
              #     description: &quot;Determine whether the document should be publicly visible&quot;
              #     expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot;
              #
              # Example (Data Manipulation):
              #
              #     title: &quot;Notification string&quot;
              #     description: &quot;Create a notification string with a timestamp.&quot;
              #     expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot;
              #
              # The exact variables and functions that may be referenced within an expression
              # are determined by the service that evaluates it. See the service
              # documentation for additional information.
            &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error
                # reporting, e.g. a file name and a position in the file.
            &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing
                # its purpose. This can be used e.g. in UIs which allow to enter the
                # expression.
            &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which
                # describes the expression, e.g. when hovered over it in a UI.
            &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language
                # syntax.
          },
          &quot;members&quot;: [ # Specifies the identities requesting access for a Cloud Platform resource.
              # `members` can have the following values:
              #
              # * `allUsers`: A special identifier that represents anyone who is
              #    on the internet; with or without a Google account.
              #
              # * `allAuthenticatedUsers`: A special identifier that represents anyone
              #    who is authenticated with a Google account or a service account.
              #
              # * `user:{emailid}`: An email address that represents a specific Google
              #    account. For example, `alice@example.com` .
              #
              #
              # * `serviceAccount:{emailid}`: An email address that represents a service
              #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
              #
              # * `group:{emailid}`: An email address that represents a Google group.
              #    For example, `admins@example.com`.
              #
              # * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique
              #    identifier) representing a user that has been recently deleted. For
              #    example, `alice@example.com?uid=123456789012345678901`. If the user is
              #    recovered, this value reverts to `user:{emailid}` and the recovered user
              #    retains the role in the binding.
              #
              # * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus
              #    unique identifier) representing a service account that has been recently
              #    deleted. For example,
              #    `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.
              #    If the service account is undeleted, this value reverts to
              #    `serviceAccount:{emailid}` and the undeleted service account retains the
              #    role in the binding.
              #
              # * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique
              #    identifier) representing a Google group that has been recently
              #    deleted. For example, `admins@example.com?uid=123456789012345678901`. If
              #    the group is recovered, this value reverts to `group:{emailid}` and the
              #    recovered group retains the role in the binding.
              #
              #
              # * `domain:{domain}`: The G Suite domain (primary) that represents all the
              #    users of that domain. For example, `google.com` or `example.com`.
              #
            &quot;A String&quot;,
          ],
          &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        },
      ],
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An Identity and Access Management (IAM) policy, which specifies access
      # controls for Google Cloud resources.
      #
      #
      # A `Policy` is a collection of `bindings`. A `binding` binds one or more
      # `members` to a single `role`. Members can be user accounts, service accounts,
      # Google groups, and domains (such as G Suite). A `role` is a named list of
      # permissions; each `role` can be an IAM predefined role or a user-created
      # custom role.
      #
      # For some types of Google Cloud resources, a `binding` can also specify a
      # `condition`, which is a logical expression that allows access to a resource
      # only if the expression evaluates to `true`. A condition can add constraints
      # based on attributes of the request, the resource, or both. To learn which
      # resources support conditions in their IAM policies, see the
      # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
      #
      # **JSON example:**
      #
      #     {
      #       &quot;bindings&quot;: [
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:mike@example.com&quot;,
      #             &quot;group:admins@example.com&quot;,
      #             &quot;domain:google.com&quot;,
      #             &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot;
      #           ]
      #         },
      #         {
      #           &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;,
      #           &quot;members&quot;: [
      #             &quot;user:eve@example.com&quot;
      #           ],
      #           &quot;condition&quot;: {
      #             &quot;title&quot;: &quot;expirable access&quot;,
      #             &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;,
      #             &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;,
      #           }
      #         }
      #       ],
      #       &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;,
      #       &quot;version&quot;: 3
      #     }
      #
      # **YAML example:**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-project-id@appspot.gserviceaccount.com
      #       role: roles/resourcemanager.organizationAdmin
      #     - members:
      #       - user:eve@example.com
      #       role: roles/resourcemanager.organizationViewer
      #       condition:
      #         title: expirable access
      #         description: Does not grant access after Sep 2020
      #         expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)
      #     - etag: BwWWja0YfJA=
      #     - version: 3
      #
      # For a description of IAM and its features, see the
      # [IAM documentation](https://cloud.google.com/iam/docs/).
    &quot;etag&quot;: &quot;A String&quot;, # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
    &quot;version&quot;: 42, # Specifies the format of the policy.
        #
        # Valid values are `0`, `1`, and `3`. Requests that specify an invalid value
        # are rejected.
        #
        # Any operation that affects conditional role bindings must specify version
        # `3`. This requirement applies to the following operations:
        #
        # * Getting a policy that includes a conditional role binding
        # * Adding a conditional role binding to a policy
        # * Changing a conditional role binding in a policy
        # * Removing any role binding, with or without a condition, from a policy
        #   that includes conditions
        #
        # **Important:** If you use IAM Conditions, you must include the `etag` field
        # whenever you call `setIamPolicy`. If you omit this field, then IAM allows
        # you to overwrite a version `3` policy with a version `1` policy, and all of
        # the conditions in the version `3` policy are lost.
        #
        # If a policy does not include any conditions, operations on that policy may
        # specify any valid version or leave the field unset.
        #
        # To learn which resources support conditions in their IAM policies, see the
        # [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
    &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a
        # `condition` that determines how and when the `bindings` are applied. Each
        # of the `bindings` must contain at least one member.
      { # Associates `members` with a `role`.
        &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) # The condition that is associated with this binding.
            #
            # If the condition evaluates to `true`, then this binding applies to the
            # current request.
            #
            # If the condition evaluates to `false`, then this binding does not apply to
            # the current request. However, a different role binding might grant the same
            # role to one or more of the members in this binding.
            #
            # To learn which resources support conditions in their IAM policies, see the
            # [IAM
            # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
            # syntax. CEL is a C-like expression language. The syntax and semantics of CEL
            # are documented at https://github.com/google/cel-spec.
            #
            # Example (Comparison):
            #
            #     title: &quot;Summary size limit&quot;
            #     description: &quot;Determines if a summary is less than 100 chars&quot;
            #     expression: &quot;document.summary.size() &lt; 100&quot;
            #
            # Example (Equality):
            #
            #     title: &quot;Requestor is owner&quot;
            #     description: &quot;Determines if requestor is the document owner&quot;
            #     expression: &quot;document.owner == request.auth.claims.email&quot;
            #
            # Example (Logic):
            #
            #     title: &quot;Public documents&quot;
            #     description: &quot;Determine whether the document should be publicly visible&quot;
            #     expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot;
            #
            # Example (Data Manipulation):
            #
            #     title: &quot;Notification string&quot;
            #     description: &quot;Create a notification string with a timestamp.&quot;
            #     expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot;
            #
            # The exact variables and functions that may be referenced within an expression
            # are determined by the service that evaluates it. See the service
            # documentation for additional information.
          &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
          &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language
              # syntax.
        },
        &quot;members&quot;: [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@example.com` .
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            # * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a user that has been recently deleted. For
            #    example, `alice@example.com?uid=123456789012345678901`. If the user is
            #    recovered, this value reverts to `user:{emailid}` and the recovered user
            #    retains the role in the binding.
            #
            # * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus
            #    unique identifier) representing a service account that has been recently
            #    deleted. For example,
            #    `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`.
            #    If the service account is undeleted, this value reverts to
            #    `serviceAccount:{emailid}` and the undeleted service account retains the
            #    role in the binding.
            #
            # * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique
            #    identifier) representing a Google group that has been recently
            #    deleted. For example, `admins@example.com?uid=123456789012345678901`. If
            #    the group is recovered, this value reverts to `group:{emailid}` and the
            #    recovered group retains the role in the binding.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          &quot;A String&quot;,
        ],
        &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</code>
  <pre>Returns permissions that a caller has on the specified resource.
If the resource does not exist, this will return an empty set of
permissions, not a `NOT_FOUND` error.

Note: This operation is designed to be used for building permission-aware
UIs and command-line tools, not for authorization checking. This operation
may &quot;fail open&quot; without warning.

Args:
  resource: string, REQUIRED: The resource for which the policy detail is being requested.
See the operation documentation for the appropriate value for this field. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for `TestIamPermissions` method.
    &quot;permissions&quot;: [ # The set of permissions to check for the `resource`. Permissions with
        # wildcards (such as &#x27;*&#x27; or &#x27;storage.*&#x27;) are not allowed. For more
        # information see
        # [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).
      &quot;A String&quot;,
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for `TestIamPermissions` method.
    &quot;permissions&quot;: [ # A subset of `TestPermissionsRequest.permissions` that the caller is
        # allowed.
      &quot;A String&quot;,
    ],
  }</pre>
</div>

</body></html>