<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="cloudtasks_v2.html">Cloud Tasks API</a> . <a href="cloudtasks_v2.projects.html">projects</a> . <a href="cloudtasks_v2.projects.locations.html">locations</a> . <a href="cloudtasks_v2.projects.locations.queues.html">queues</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="cloudtasks_v2.projects.locations.queues.tasks.html">tasks()</a></code>
</p>
<p class="firstline">Returns the tasks Resource.</p>

<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a queue.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a queue.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a queue.</p>
<p class="toc_element">
  <code><a href="#getIamPolicy">getIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the access control policy for a Queue.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, filter=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists queues.</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="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates a queue.</p>
<p class="toc_element">
  <code><a href="#pause">pause(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Pauses the queue.</p>
<p class="toc_element">
  <code><a href="#purge">purge(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Purges a queue by deleting all of its tasks.</p>
<p class="toc_element">
  <code><a href="#resume">resume(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Resume a queue.</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 for a Queue. Replaces any existing</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 a Queue.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates a queue.

Queues created with this method allow tasks to live for a maximum of 31
days. After a task is 31 days old, the task will be deleted regardless of whether
it was dispatched or not.

WARNING: Using this method may have unintended side effects if you are
using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
Read
[Overview of Queue Management and
queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml) before using
this method.

Args:
  parent: string, Required. The location name in which the queue will be created.
For example: `projects/PROJECT_ID/locations/LOCATION_ID`

The list of allowed locations can be obtained by calling Cloud
Tasks&#x27; implementation of
ListLocations. (required)
  body: object, The request body.
    The object takes the form of:

{ # A queue is a container of related tasks. Queues are configured to manage
    # how those tasks are dispatched. Configurable properties include rate limits,
    # retry options, queue types, and others.
  &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
      # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
      # field is unset, then no logs are written.
      # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
    &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
        # This field may contain any value between 0.0 and 1.0, inclusive.
        # 0.0 is the default and means that no operations are logged.
  },
  &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
      # 
      # All tasks that were created before this time
      # were purged.
      # 
      # A queue can be purged using PurgeQueue, the
      # [App Engine Task Queue SDK, or the Cloud
      # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
      # 
      # Purge time will be truncated to the nearest microsecond. Purge
      # time will be unset if the queue has never been purged.
  &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
      # 
      # rate_limits and retry_config are
      # related because they both control task attempts. However they control task
      # attempts in different ways:
      # 
      # * rate_limits controls the total rate of
      #   dispatches from a queue (i.e. all traffic dispatched from the
      #   queue, regardless of whether the dispatch is from a first
      #   attempt or a retry).
      # * retry_config controls what happens to
      #   particular a task after its first attempt fails. That is,
      #   retry_config controls task retries (the
      #   second attempt, third attempt, etc).
      # 
      # The queue&#x27;s actual dispatch rate is the result of:
      # 
      # * Number of tasks in the queue
      # * User-specified throttling: rate_limits,
      #   retry_config, and the
      #   queue&#x27;s state.
      # * System throttling due to `429` (Too Many Requests) or `503` (Service
      #   Unavailable) responses from the worker, high error rates, or to smooth
      #   sudden large traffic spikes.
      #
      # This message determines the maximum rate that tasks can be dispatched by a
      # queue, regardless of whether the dispatch is a first task attempt or a retry.
      #
      # Note: The debugging command, RunTask, will run a task
      # even if the queue has reached its RateLimits.
    &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
        #
        # Max burst size limits how fast tasks in queue are processed when
        # many tasks are in the queue and the rate is high. This field
        # allows the queue to have a high rate so processing starts shortly
        # after a task is enqueued, but still limits resource usage when
        # many tasks are enqueued in a short period of time.
        #
        # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
        # algorithm is used to control the rate of task dispatches. Each
        # queue has a token bucket that holds tokens, up to the maximum
        # specified by `max_burst_size`. Each time a task is dispatched, a
        # token is removed from the bucket. Tasks will be dispatched until
        # the queue&#x27;s bucket runs out of tokens. The bucket will be
        # continuously refilled with new tokens based on
        # max_dispatches_per_second.
        #
        # Cloud Tasks will pick the value of `max_burst_size` based on the
        # value of
        # max_dispatches_per_second.
        #
        # For queues that were created or updated using
        # `queue.yaml/xml`, `max_burst_size` is equal to
        # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
        # Since `max_burst_size` is output only, if
        # UpdateQueue is called on a queue
        # created by `queue.yaml/xml`, `max_burst_size` will be reset based
        # on the value of
        # max_dispatches_per_second,
        # regardless of whether
        # max_dispatches_per_second
        # is updated.
    &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # * The maximum allowed value is 500.
        #
        #
        # This field has the same meaning as
        # [rate in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
        # to be dispatched for this queue. After this threshold has been
        # reached, Cloud Tasks stops dispatching tasks until the number of
        # concurrent requests decreases.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # The maximum allowed value is 5,000.
        #
        #
        # This field has the same meaning as
        # [max_concurrent_requests in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
  },
  &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
      # task-level app_engine_routing.
      # These settings apply only to
      # App Engine tasks in this queue.
      # Http tasks are not affected.
      # 
      # If set, `app_engine_routing_override` is used for all
      # App Engine tasks in the queue, no matter what the
      # setting is for the
      # task-level app_engine_routing.
      #
      # Defines routing characteristics specific to App Engine - service, version,
      # and instance.
      #
      # For more information about services, versions, and instances see
      # [An Overview of App
      # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
      # [Microservices Architecture on Google App
      # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
      # [App Engine Standard request
      # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
      # and [App Engine Flex request
      # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      #
      # Using AppEngineRouting requires
      # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
      # Google IAM permission for the project
      # and the following scope:
      #
      # `https://www.googleapis.com/auth/cloud-platform`
    &quot;instance&quot;: &quot;A String&quot;, # App instance.
        #
        # By default, the task is sent to an instance which is available when
        # the task is attempted.
        #
        # Requests can only be sent to a specific instance if
        # [manual scaling is used in App Engine
        # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
        # App Engine Flex does not support instances. For more information, see
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
    &quot;version&quot;: &quot;A String&quot;, # App version.
        #
        # By default, the task is sent to the version which is the default
        # version when the task is attempted.
        #
        # For some queues or tasks which were created using the App Engine
        # Task Queue API, host is not parsable
        # into service,
        # version, and
        # instance. For example, some tasks
        # which were created using the App Engine SDK use a custom domain
        # name; custom domains are not parsed by Cloud Tasks. If
        # host is not parsable, then
        # service,
        # version, and
        # instance are the empty string.
    &quot;service&quot;: &quot;A String&quot;, # App service.
        #
        # By default, the task is sent to the service which is the default
        # service when the task is attempted.
        #
        # For some queues or tasks which were created using the App Engine
        # Task Queue API, host is not parsable
        # into service,
        # version, and
        # instance. For example, some tasks
        # which were created using the App Engine SDK use a custom domain
        # name; custom domains are not parsed by Cloud Tasks. If
        # host is not parsable, then
        # service,
        # version, and
        # instance are the empty string.
    &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
        #
        # The host is constructed from the domain name of the app associated with
        # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
        # service, version,
        # and instance. Tasks which were created using
        # the App Engine SDK might have a custom domain name.
        #
        # For more information, see
        # [How Requests are
        # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
  },
  &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
      # after which it becomes output only.
      # 
      # The queue name.
      # 
      # The queue name must have the following format:
      # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
      # 
      # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
      #    hyphens (-), colons (:), or periods (.).
      #    For more information, see
      #    [Identifying
      #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
      # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
      #    The list of available locations can be obtained by calling
      #    ListLocations.
      #    For more information, see https://cloud.google.com/about/locations/.
      # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
      #   hyphens (-). The maximum length is 100 characters.
  &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
      # 
      # `state` can only be changed by called
      # PauseQueue,
      # ResumeQueue, or uploading
      # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
      # UpdateQueue cannot be used to change `state`.
  &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
      # 
      # * For tasks created using Cloud Tasks: the queue-level retry settings
      #   apply to all tasks in the queue that were created using Cloud Tasks.
      #   Retry settings cannot be set on individual tasks.
      # * For tasks created using the App Engine SDK: the queue-level retry
      #   settings apply to all tasks in the queue which do not have retry settings
      #   explicitly set on the task and were created by the App Engine SDK. See
      #   [App Engine
      #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
      #
      # These settings determine when a failed task attempt is retried.
    &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue&#x27;s RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # `max_backoff` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [max_backoff_seconds in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
        #
        # A task&#x27;s retry interval starts at
        # min_backoff, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries at intervals of
        # max_backoff up to
        # max_attempts times.
        #
        # For example, if min_backoff is 10s,
        # max_backoff is 300s, and
        # `max_doublings` is 3, then the a task will first be retried in
        # 10s. The retry interval will double three times, and then
        # increase linearly by 2^3 * 10s.  Finally, the task will retry at
        # intervals of max_backoff until the
        # task has been attempted max_attempts
        # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
        # 240s, 300s, 300s, ....
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # This field has the same meaning as
        # [max_doublings in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
        # retrying a failed task, measured from when the task was first
        # attempted. Once `max_retry_duration` time has passed *and* the
        # task has been attempted max_attempts
        # times, no further attempts will be made and the task will be
        # deleted.
        #
        # If zero, then the task age is unlimited.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # `max_retry_duration` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [task_age_limit in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;maxAttempts&quot;: 42, # Number of attempts per task.
        #
        # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
        # first attempt fails, then there will be `max_attempts - 1` retries). Must
        # be &gt;= -1.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # -1 indicates unlimited attempts.
        #
        # This field has the same meaning as
        # [task_retry_limit in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue&#x27;s RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # `min_backoff` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [min_backoff_seconds in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
  },
}

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

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, queue types, and others.
    &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
        # field is unset, then no logs are written.
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
      &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
          # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          # This field may contain any value between 0.0 and 1.0, inclusive.
          # 0.0 is the default and means that no operations are logged.
    },
    &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and retry_config are
        # related because they both control task attempts. However they control task
        # attempts in different ways:
        #
        # * rate_limits controls the total rate of
        #   dispatches from a queue (i.e. all traffic dispatched from the
        #   queue, regardless of whether the dispatch is from a first
        #   attempt or a retry).
        # * retry_config controls what happens to
        #   particular a task after its first attempt fails. That is,
        #   retry_config controls task retries (the
        #   second attempt, third attempt, etc).
        #
        # The queue&#x27;s actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue&#x27;s state.
        # * System throttling due to `429` (Too Many Requests) or `503` (Service
        #   Unavailable) responses from the worker, high error rates, or to smooth
        #   sudden large traffic spikes.
        #
        # This message determines the maximum rate that tasks can be dispatched by a
        # queue, regardless of whether the dispatch is a first task attempt or a retry.
        #
        # Note: The debugging command, RunTask, will run a task
        # even if the queue has reached its RateLimits.
      &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue&#x27;s bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_dispatches_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_dispatches_per_second.
          #
          # For queues that were created or updated using
          # `queue.yaml/xml`, `max_burst_size` is equal to
          # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
          # Since `max_burst_size` is output only, if
          # UpdateQueue is called on a queue
          # created by `queue.yaml/xml`, `max_burst_size` will be reset based
          # on the value of
          # max_dispatches_per_second,
          # regardless of whether
          # max_dispatches_per_second
          # is updated.
      &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # * The maximum allowed value is 500.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
      &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
          # to be dispatched for this queue. After this threshold has been
          # reached, Cloud Tasks stops dispatching tasks until the number of
          # concurrent requests decreases.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # The maximum allowed value is 5,000.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    },
    &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        # Http tasks are not affected.
        #
        # If set, `app_engine_routing_override` is used for all
        # App Engine tasks in the queue, no matter what the
        # setting is for the
        # task-level app_engine_routing.
        #
        # Defines routing characteristics specific to App Engine - service, version,
        # and instance.
        #
        # For more information about services, versions, and instances see
        # [An Overview of App
        # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
        # [Microservices Architecture on Google App
        # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        #
        # Using AppEngineRouting requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
      &quot;instance&quot;: &quot;A String&quot;, # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      &quot;version&quot;: &quot;A String&quot;, # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;service&quot;: &quot;A String&quot;, # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
          #
          # The host is constructed from the domain name of the app associated with
          # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
          # service, version,
          # and instance. Tasks which were created using
          # the App Engine SDK might have a custom domain name.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
    },
    &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine when a failed task attempt is retried.
      &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [max_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A task&#x27;s retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # This field has the same meaning as
          # [max_doublings in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxAttempts&quot;: 42, # Number of attempts per task.
          #
          # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
          # first attempt fails, then there will be `max_attempts - 1` retries). Must
          # be &gt;= -1.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # -1 indicates unlimited attempts.
          #
          # This field has the same meaning as
          # [task_retry_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `min_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [min_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a queue.

This command will delete the queue even if it has tasks in it.

Note: If you delete a queue, a queue with the same name can&#x27;t be created
for 7 days.

WARNING: Using this method may have unintended side effects if you are
using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
Read
[Overview of Queue Management and
queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml) before using
this method.

Args:
  name: string, Required. The queue name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID` (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(name, x__xgafv=None)</code>
  <pre>Gets a queue.

Args:
  name: string, Required. The resource name of the queue. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID` (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, queue types, and others.
    &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
        # field is unset, then no logs are written.
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
      &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
          # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          # This field may contain any value between 0.0 and 1.0, inclusive.
          # 0.0 is the default and means that no operations are logged.
    },
    &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and retry_config are
        # related because they both control task attempts. However they control task
        # attempts in different ways:
        #
        # * rate_limits controls the total rate of
        #   dispatches from a queue (i.e. all traffic dispatched from the
        #   queue, regardless of whether the dispatch is from a first
        #   attempt or a retry).
        # * retry_config controls what happens to
        #   particular a task after its first attempt fails. That is,
        #   retry_config controls task retries (the
        #   second attempt, third attempt, etc).
        #
        # The queue&#x27;s actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue&#x27;s state.
        # * System throttling due to `429` (Too Many Requests) or `503` (Service
        #   Unavailable) responses from the worker, high error rates, or to smooth
        #   sudden large traffic spikes.
        #
        # This message determines the maximum rate that tasks can be dispatched by a
        # queue, regardless of whether the dispatch is a first task attempt or a retry.
        #
        # Note: The debugging command, RunTask, will run a task
        # even if the queue has reached its RateLimits.
      &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue&#x27;s bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_dispatches_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_dispatches_per_second.
          #
          # For queues that were created or updated using
          # `queue.yaml/xml`, `max_burst_size` is equal to
          # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
          # Since `max_burst_size` is output only, if
          # UpdateQueue is called on a queue
          # created by `queue.yaml/xml`, `max_burst_size` will be reset based
          # on the value of
          # max_dispatches_per_second,
          # regardless of whether
          # max_dispatches_per_second
          # is updated.
      &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # * The maximum allowed value is 500.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
      &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
          # to be dispatched for this queue. After this threshold has been
          # reached, Cloud Tasks stops dispatching tasks until the number of
          # concurrent requests decreases.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # The maximum allowed value is 5,000.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    },
    &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        # Http tasks are not affected.
        #
        # If set, `app_engine_routing_override` is used for all
        # App Engine tasks in the queue, no matter what the
        # setting is for the
        # task-level app_engine_routing.
        #
        # Defines routing characteristics specific to App Engine - service, version,
        # and instance.
        #
        # For more information about services, versions, and instances see
        # [An Overview of App
        # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
        # [Microservices Architecture on Google App
        # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        #
        # Using AppEngineRouting requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
      &quot;instance&quot;: &quot;A String&quot;, # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      &quot;version&quot;: &quot;A String&quot;, # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;service&quot;: &quot;A String&quot;, # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
          #
          # The host is constructed from the domain name of the app associated with
          # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
          # service, version,
          # and instance. Tasks which were created using
          # the App Engine SDK might have a custom domain name.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
    },
    &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine when a failed task attempt is retried.
      &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [max_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A task&#x27;s retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # This field has the same meaning as
          # [max_doublings in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxAttempts&quot;: 42, # Number of attempts per task.
          #
          # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
          # first attempt fails, then there will be `max_attempts - 1` retries). Must
          # be &gt;= -1.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # -1 indicates unlimited attempts.
          #
          # This field has the same meaning as
          # [task_retry_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `min_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [min_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    },
  }</pre>
</div>

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

Authorization requires the following
[Google IAM](https://cloud.google.com/iam) permission on the specified
resource parent:

* `cloudtasks.queues.getIamPolicy`

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)
  body: object, The request body.
    The object takes the form of:

{ # Request message for `GetIamPolicy` method.
    &quot;options&quot;: { # Encapsulates settings provided to GetIamPolicy. # OPTIONAL: A `GetPolicyOptions` object for specifying options to
        # `GetIamPolicy`.
      &quot;requestedPolicyVersion&quot;: 42, # 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;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;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        &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;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;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;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;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.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, pageToken=None, filter=None, pageSize=None, x__xgafv=None)</code>
  <pre>Lists queues.

Queues are returned in lexicographical order.

Args:
  parent: string, Required. The location name.
For example: `projects/PROJECT_ID/locations/LOCATION_ID` (required)
  pageToken: string, A token identifying the page of results to return.

To request the first page results, page_token must be empty. To
request the next page of results, page_token must be the value of
next_page_token returned
from the previous call to ListQueues
method. It is an error to switch the value of the
filter while iterating through pages.
  filter: string, `filter` can be used to specify a subset of queues. Any Queue
field can be used as a filter and several operators as supported.
For example: `&lt;=, &lt;, &gt;=, &gt;, !=, =, :`. The filter syntax is the same as
described in
[Stackdriver&#x27;s Advanced Logs
Filters](https://cloud.google.com/logging/docs/view/advanced_filters).

Sample filter &quot;state: PAUSED&quot;.

Note that using filters might cause fewer queues than the
requested page_size to be returned.
  pageSize: integer, Requested page size.

The maximum page size is 9800. If unspecified, the page size will
be the maximum. Fewer queues than requested might be returned,
even if more queues exist; use the
next_page_token in the
response to determine if more queues exist.
  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 ListQueues.
    &quot;queues&quot;: [ # The list of queues.
      { # A queue is a container of related tasks. Queues are configured to manage
          # how those tasks are dispatched. Configurable properties include rate limits,
          # retry options, queue types, and others.
        &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
            # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
            # field is unset, then no logs are written.
            # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
              # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
              # This field may contain any value between 0.0 and 1.0, inclusive.
              # 0.0 is the default and means that no operations are logged.
        },
        &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
            #
            # All tasks that were created before this time
            # were purged.
            #
            # A queue can be purged using PurgeQueue, the
            # [App Engine Task Queue SDK, or the Cloud
            # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
            #
            # Purge time will be truncated to the nearest microsecond. Purge
            # time will be unset if the queue has never been purged.
        &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
            #
            # rate_limits and retry_config are
            # related because they both control task attempts. However they control task
            # attempts in different ways:
            #
            # * rate_limits controls the total rate of
            #   dispatches from a queue (i.e. all traffic dispatched from the
            #   queue, regardless of whether the dispatch is from a first
            #   attempt or a retry).
            # * retry_config controls what happens to
            #   particular a task after its first attempt fails. That is,
            #   retry_config controls task retries (the
            #   second attempt, third attempt, etc).
            #
            # The queue&#x27;s actual dispatch rate is the result of:
            #
            # * Number of tasks in the queue
            # * User-specified throttling: rate_limits,
            #   retry_config, and the
            #   queue&#x27;s state.
            # * System throttling due to `429` (Too Many Requests) or `503` (Service
            #   Unavailable) responses from the worker, high error rates, or to smooth
            #   sudden large traffic spikes.
            #
            # This message determines the maximum rate that tasks can be dispatched by a
            # queue, regardless of whether the dispatch is a first task attempt or a retry.
            #
            # Note: The debugging command, RunTask, will run a task
            # even if the queue has reached its RateLimits.
          &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
              #
              # Max burst size limits how fast tasks in queue are processed when
              # many tasks are in the queue and the rate is high. This field
              # allows the queue to have a high rate so processing starts shortly
              # after a task is enqueued, but still limits resource usage when
              # many tasks are enqueued in a short period of time.
              #
              # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
              # algorithm is used to control the rate of task dispatches. Each
              # queue has a token bucket that holds tokens, up to the maximum
              # specified by `max_burst_size`. Each time a task is dispatched, a
              # token is removed from the bucket. Tasks will be dispatched until
              # the queue&#x27;s bucket runs out of tokens. The bucket will be
              # continuously refilled with new tokens based on
              # max_dispatches_per_second.
              #
              # Cloud Tasks will pick the value of `max_burst_size` based on the
              # value of
              # max_dispatches_per_second.
              #
              # For queues that were created or updated using
              # `queue.yaml/xml`, `max_burst_size` is equal to
              # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
              # Since `max_burst_size` is output only, if
              # UpdateQueue is called on a queue
              # created by `queue.yaml/xml`, `max_burst_size` will be reset based
              # on the value of
              # max_dispatches_per_second,
              # regardless of whether
              # max_dispatches_per_second
              # is updated.
          &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              # * The maximum allowed value is 500.
              #
              #
              # This field has the same meaning as
              # [rate in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
          &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
              # to be dispatched for this queue. After this threshold has been
              # reached, Cloud Tasks stops dispatching tasks until the number of
              # concurrent requests decreases.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              #
              # The maximum allowed value is 5,000.
              #
              #
              # This field has the same meaning as
              # [max_concurrent_requests in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
        },
        &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
            # task-level app_engine_routing.
            # These settings apply only to
            # App Engine tasks in this queue.
            # Http tasks are not affected.
            #
            # If set, `app_engine_routing_override` is used for all
            # App Engine tasks in the queue, no matter what the
            # setting is for the
            # task-level app_engine_routing.
            #
            # Defines routing characteristics specific to App Engine - service, version,
            # and instance.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
            #
            # Using AppEngineRouting requires
            # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
            # Google IAM permission for the project
            # and the following scope:
            #
            # `https://www.googleapis.com/auth/cloud-platform`
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the task is sent to an instance which is available when
              # the task is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the task is sent to the version which is the default
              # version when the task is attempted.
              #
              # For some queues or tasks which were created using the App Engine
              # Task Queue API, host is not parsable
              # into service,
              # version, and
              # instance. For example, some tasks
              # which were created using the App Engine SDK use a custom domain
              # name; custom domains are not parsed by Cloud Tasks. If
              # host is not parsable, then
              # service,
              # version, and
              # instance are the empty string.
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the task is sent to the service which is the default
              # service when the task is attempted.
              #
              # For some queues or tasks which were created using the App Engine
              # Task Queue API, host is not parsable
              # into service,
              # version, and
              # instance. For example, some tasks
              # which were created using the App Engine SDK use a custom domain
              # name; custom domains are not parsed by Cloud Tasks. If
              # host is not parsable, then
              # service,
              # version, and
              # instance are the empty string.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
              #
              # The host is constructed from the domain name of the app associated with
              # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
              # service, version,
              # and instance. Tasks which were created using
              # the App Engine SDK might have a custom domain name.
              #
              # For more information, see
              # [How Requests are
              # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
        },
        &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
            # after which it becomes output only.
            #
            # The queue name.
            #
            # The queue name must have the following format:
            # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
            #
            # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
            #    hyphens (-), colons (:), or periods (.).
            #    For more information, see
            #    [Identifying
            #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
            # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
            #    The list of available locations can be obtained by calling
            #    ListLocations.
            #    For more information, see https://cloud.google.com/about/locations/.
            # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
            #   hyphens (-). The maximum length is 100 characters.
        &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
            #
            # `state` can only be changed by called
            # PauseQueue,
            # ResumeQueue, or uploading
            # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
            # UpdateQueue cannot be used to change `state`.
        &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
            #
            # * For tasks created using Cloud Tasks: the queue-level retry settings
            #   apply to all tasks in the queue that were created using Cloud Tasks.
            #   Retry settings cannot be set on individual tasks.
            # * For tasks created using the App Engine SDK: the queue-level retry
            #   settings apply to all tasks in the queue which do not have retry settings
            #   explicitly set on the task and were created by the App Engine SDK. See
            #   [App Engine
            #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
            #
            # These settings determine when a failed task attempt is retried.
          &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
              # min_backoff and
              # max_backoff duration after it fails,
              # if the queue&#x27;s RetryConfig specifies that the task should be
              # retried.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              #
              # `max_backoff` will be truncated to the nearest second.
              #
              # This field has the same meaning as
              # [max_backoff_seconds in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
          &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
              #
              # A task&#x27;s retry interval starts at
              # min_backoff, then doubles
              # `max_doublings` times, then increases linearly, and finally
              # retries at intervals of
              # max_backoff up to
              # max_attempts times.
              #
              # For example, if min_backoff is 10s,
              # max_backoff is 300s, and
              # `max_doublings` is 3, then the a task will first be retried in
              # 10s. The retry interval will double three times, and then
              # increase linearly by 2^3 * 10s.  Finally, the task will retry at
              # intervals of max_backoff until the
              # task has been attempted max_attempts
              # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
              # 240s, 300s, 300s, ....
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              #
              # This field has the same meaning as
              # [max_doublings in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
          &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
              # retrying a failed task, measured from when the task was first
              # attempted. Once `max_retry_duration` time has passed *and* the
              # task has been attempted max_attempts
              # times, no further attempts will be made and the task will be
              # deleted.
              #
              # If zero, then the task age is unlimited.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              #
              # `max_retry_duration` will be truncated to the nearest second.
              #
              # This field has the same meaning as
              # [task_age_limit in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
          &quot;maxAttempts&quot;: 42, # Number of attempts per task.
              #
              # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
              # first attempt fails, then there will be `max_attempts - 1` retries). Must
              # be &gt;= -1.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              # -1 indicates unlimited attempts.
              #
              # This field has the same meaning as
              # [task_retry_limit in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
          &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
              # min_backoff and
              # max_backoff duration after it fails,
              # if the queue&#x27;s RetryConfig specifies that the task should be
              # retried.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              #
              # `min_backoff` will be truncated to the nearest second.
              #
              # This field has the same meaning as
              # [min_backoff_seconds in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
        },
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # A token to retrieve next page of results.
        #
        # To return the next page of results, call
        # ListQueues with this value as the
        # page_token.
        #
        # If the next_page_token is empty, there are no more results.
        #
        # The page token is valid for only 2 hours.
  }</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="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates a queue.

This method creates the queue if it does not exist and updates
the queue if it does exist.

Queues created with this method allow tasks to live for a maximum of 31
days. After a task is 31 days old, the task will be deleted regardless of whether
it was dispatched or not.

WARNING: Using this method may have unintended side effects if you are
using an App Engine `queue.yaml` or `queue.xml` file to manage your queues.
Read
[Overview of Queue Management and
queue.yaml](https://cloud.google.com/tasks/docs/queue-yaml) before using
this method.

Args:
  name: string, Caller-specified and required in CreateQueue,
after which it becomes output only.

The queue name.

The queue name must have the following format:
`projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`

* `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
   hyphens (-), colons (:), or periods (.).
   For more information, see
   [Identifying
   projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
* `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
   The list of available locations can be obtained by calling
   ListLocations.
   For more information, see https://cloud.google.com/about/locations/.
* `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
  hyphens (-). The maximum length is 100 characters. (required)
  body: object, The request body.
    The object takes the form of:

{ # A queue is a container of related tasks. Queues are configured to manage
    # how those tasks are dispatched. Configurable properties include rate limits,
    # retry options, queue types, and others.
  &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
      # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
      # field is unset, then no logs are written.
      # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
    &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
        # This field may contain any value between 0.0 and 1.0, inclusive.
        # 0.0 is the default and means that no operations are logged.
  },
  &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
      # 
      # All tasks that were created before this time
      # were purged.
      # 
      # A queue can be purged using PurgeQueue, the
      # [App Engine Task Queue SDK, or the Cloud
      # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
      # 
      # Purge time will be truncated to the nearest microsecond. Purge
      # time will be unset if the queue has never been purged.
  &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
      # 
      # rate_limits and retry_config are
      # related because they both control task attempts. However they control task
      # attempts in different ways:
      # 
      # * rate_limits controls the total rate of
      #   dispatches from a queue (i.e. all traffic dispatched from the
      #   queue, regardless of whether the dispatch is from a first
      #   attempt or a retry).
      # * retry_config controls what happens to
      #   particular a task after its first attempt fails. That is,
      #   retry_config controls task retries (the
      #   second attempt, third attempt, etc).
      # 
      # The queue&#x27;s actual dispatch rate is the result of:
      # 
      # * Number of tasks in the queue
      # * User-specified throttling: rate_limits,
      #   retry_config, and the
      #   queue&#x27;s state.
      # * System throttling due to `429` (Too Many Requests) or `503` (Service
      #   Unavailable) responses from the worker, high error rates, or to smooth
      #   sudden large traffic spikes.
      #
      # This message determines the maximum rate that tasks can be dispatched by a
      # queue, regardless of whether the dispatch is a first task attempt or a retry.
      #
      # Note: The debugging command, RunTask, will run a task
      # even if the queue has reached its RateLimits.
    &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
        #
        # Max burst size limits how fast tasks in queue are processed when
        # many tasks are in the queue and the rate is high. This field
        # allows the queue to have a high rate so processing starts shortly
        # after a task is enqueued, but still limits resource usage when
        # many tasks are enqueued in a short period of time.
        #
        # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
        # algorithm is used to control the rate of task dispatches. Each
        # queue has a token bucket that holds tokens, up to the maximum
        # specified by `max_burst_size`. Each time a task is dispatched, a
        # token is removed from the bucket. Tasks will be dispatched until
        # the queue&#x27;s bucket runs out of tokens. The bucket will be
        # continuously refilled with new tokens based on
        # max_dispatches_per_second.
        #
        # Cloud Tasks will pick the value of `max_burst_size` based on the
        # value of
        # max_dispatches_per_second.
        #
        # For queues that were created or updated using
        # `queue.yaml/xml`, `max_burst_size` is equal to
        # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
        # Since `max_burst_size` is output only, if
        # UpdateQueue is called on a queue
        # created by `queue.yaml/xml`, `max_burst_size` will be reset based
        # on the value of
        # max_dispatches_per_second,
        # regardless of whether
        # max_dispatches_per_second
        # is updated.
    &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # * The maximum allowed value is 500.
        #
        #
        # This field has the same meaning as
        # [rate in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
        # to be dispatched for this queue. After this threshold has been
        # reached, Cloud Tasks stops dispatching tasks until the number of
        # concurrent requests decreases.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # The maximum allowed value is 5,000.
        #
        #
        # This field has the same meaning as
        # [max_concurrent_requests in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
  },
  &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
      # task-level app_engine_routing.
      # These settings apply only to
      # App Engine tasks in this queue.
      # Http tasks are not affected.
      # 
      # If set, `app_engine_routing_override` is used for all
      # App Engine tasks in the queue, no matter what the
      # setting is for the
      # task-level app_engine_routing.
      #
      # Defines routing characteristics specific to App Engine - service, version,
      # and instance.
      #
      # For more information about services, versions, and instances see
      # [An Overview of App
      # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
      # [Microservices Architecture on Google App
      # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
      # [App Engine Standard request
      # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
      # and [App Engine Flex request
      # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      #
      # Using AppEngineRouting requires
      # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
      # Google IAM permission for the project
      # and the following scope:
      #
      # `https://www.googleapis.com/auth/cloud-platform`
    &quot;instance&quot;: &quot;A String&quot;, # App instance.
        #
        # By default, the task is sent to an instance which is available when
        # the task is attempted.
        #
        # Requests can only be sent to a specific instance if
        # [manual scaling is used in App Engine
        # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
        # App Engine Flex does not support instances. For more information, see
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
    &quot;version&quot;: &quot;A String&quot;, # App version.
        #
        # By default, the task is sent to the version which is the default
        # version when the task is attempted.
        #
        # For some queues or tasks which were created using the App Engine
        # Task Queue API, host is not parsable
        # into service,
        # version, and
        # instance. For example, some tasks
        # which were created using the App Engine SDK use a custom domain
        # name; custom domains are not parsed by Cloud Tasks. If
        # host is not parsable, then
        # service,
        # version, and
        # instance are the empty string.
    &quot;service&quot;: &quot;A String&quot;, # App service.
        #
        # By default, the task is sent to the service which is the default
        # service when the task is attempted.
        #
        # For some queues or tasks which were created using the App Engine
        # Task Queue API, host is not parsable
        # into service,
        # version, and
        # instance. For example, some tasks
        # which were created using the App Engine SDK use a custom domain
        # name; custom domains are not parsed by Cloud Tasks. If
        # host is not parsable, then
        # service,
        # version, and
        # instance are the empty string.
    &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
        #
        # The host is constructed from the domain name of the app associated with
        # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
        # service, version,
        # and instance. Tasks which were created using
        # the App Engine SDK might have a custom domain name.
        #
        # For more information, see
        # [How Requests are
        # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
  },
  &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
      # after which it becomes output only.
      # 
      # The queue name.
      # 
      # The queue name must have the following format:
      # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
      # 
      # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
      #    hyphens (-), colons (:), or periods (.).
      #    For more information, see
      #    [Identifying
      #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
      # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
      #    The list of available locations can be obtained by calling
      #    ListLocations.
      #    For more information, see https://cloud.google.com/about/locations/.
      # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
      #   hyphens (-). The maximum length is 100 characters.
  &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
      # 
      # `state` can only be changed by called
      # PauseQueue,
      # ResumeQueue, or uploading
      # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
      # UpdateQueue cannot be used to change `state`.
  &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
      # 
      # * For tasks created using Cloud Tasks: the queue-level retry settings
      #   apply to all tasks in the queue that were created using Cloud Tasks.
      #   Retry settings cannot be set on individual tasks.
      # * For tasks created using the App Engine SDK: the queue-level retry
      #   settings apply to all tasks in the queue which do not have retry settings
      #   explicitly set on the task and were created by the App Engine SDK. See
      #   [App Engine
      #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
      #
      # These settings determine when a failed task attempt is retried.
    &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue&#x27;s RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # `max_backoff` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [max_backoff_seconds in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
        #
        # A task&#x27;s retry interval starts at
        # min_backoff, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries at intervals of
        # max_backoff up to
        # max_attempts times.
        #
        # For example, if min_backoff is 10s,
        # max_backoff is 300s, and
        # `max_doublings` is 3, then the a task will first be retried in
        # 10s. The retry interval will double three times, and then
        # increase linearly by 2^3 * 10s.  Finally, the task will retry at
        # intervals of max_backoff until the
        # task has been attempted max_attempts
        # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
        # 240s, 300s, 300s, ....
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # This field has the same meaning as
        # [max_doublings in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
        # retrying a failed task, measured from when the task was first
        # attempted. Once `max_retry_duration` time has passed *and* the
        # task has been attempted max_attempts
        # times, no further attempts will be made and the task will be
        # deleted.
        #
        # If zero, then the task age is unlimited.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # `max_retry_duration` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [task_age_limit in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;maxAttempts&quot;: 42, # Number of attempts per task.
        #
        # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
        # first attempt fails, then there will be `max_attempts - 1` retries). Must
        # be &gt;= -1.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # -1 indicates unlimited attempts.
        #
        # This field has the same meaning as
        # [task_retry_limit in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue&#x27;s RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        #
        # `min_backoff` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [min_backoff_seconds in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
  },
}

  updateMask: string, A mask used to specify which fields of the queue are being updated.

If empty, then all fields will be updated.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, queue types, and others.
    &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
        # field is unset, then no logs are written.
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
      &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
          # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          # This field may contain any value between 0.0 and 1.0, inclusive.
          # 0.0 is the default and means that no operations are logged.
    },
    &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and retry_config are
        # related because they both control task attempts. However they control task
        # attempts in different ways:
        #
        # * rate_limits controls the total rate of
        #   dispatches from a queue (i.e. all traffic dispatched from the
        #   queue, regardless of whether the dispatch is from a first
        #   attempt or a retry).
        # * retry_config controls what happens to
        #   particular a task after its first attempt fails. That is,
        #   retry_config controls task retries (the
        #   second attempt, third attempt, etc).
        #
        # The queue&#x27;s actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue&#x27;s state.
        # * System throttling due to `429` (Too Many Requests) or `503` (Service
        #   Unavailable) responses from the worker, high error rates, or to smooth
        #   sudden large traffic spikes.
        #
        # This message determines the maximum rate that tasks can be dispatched by a
        # queue, regardless of whether the dispatch is a first task attempt or a retry.
        #
        # Note: The debugging command, RunTask, will run a task
        # even if the queue has reached its RateLimits.
      &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue&#x27;s bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_dispatches_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_dispatches_per_second.
          #
          # For queues that were created or updated using
          # `queue.yaml/xml`, `max_burst_size` is equal to
          # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
          # Since `max_burst_size` is output only, if
          # UpdateQueue is called on a queue
          # created by `queue.yaml/xml`, `max_burst_size` will be reset based
          # on the value of
          # max_dispatches_per_second,
          # regardless of whether
          # max_dispatches_per_second
          # is updated.
      &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # * The maximum allowed value is 500.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
      &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
          # to be dispatched for this queue. After this threshold has been
          # reached, Cloud Tasks stops dispatching tasks until the number of
          # concurrent requests decreases.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # The maximum allowed value is 5,000.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    },
    &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        # Http tasks are not affected.
        #
        # If set, `app_engine_routing_override` is used for all
        # App Engine tasks in the queue, no matter what the
        # setting is for the
        # task-level app_engine_routing.
        #
        # Defines routing characteristics specific to App Engine - service, version,
        # and instance.
        #
        # For more information about services, versions, and instances see
        # [An Overview of App
        # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
        # [Microservices Architecture on Google App
        # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        #
        # Using AppEngineRouting requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
      &quot;instance&quot;: &quot;A String&quot;, # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      &quot;version&quot;: &quot;A String&quot;, # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;service&quot;: &quot;A String&quot;, # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
          #
          # The host is constructed from the domain name of the app associated with
          # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
          # service, version,
          # and instance. Tasks which were created using
          # the App Engine SDK might have a custom domain name.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
    },
    &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine when a failed task attempt is retried.
      &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [max_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A task&#x27;s retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # This field has the same meaning as
          # [max_doublings in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxAttempts&quot;: 42, # Number of attempts per task.
          #
          # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
          # first attempt fails, then there will be `max_attempts - 1` retries). Must
          # be &gt;= -1.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # -1 indicates unlimited attempts.
          #
          # This field has the same meaning as
          # [task_retry_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `min_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [min_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="pause">pause(name, body=None, x__xgafv=None)</code>
  <pre>Pauses the queue.

If a queue is paused then the system will stop dispatching tasks
until the queue is resumed via
ResumeQueue. Tasks can still be added
when the queue is paused. A queue is paused if its
state is PAUSED.

Args:
  name: string, Required. The queue name. For example:
`projects/PROJECT_ID/location/LOCATION_ID/queues/QUEUE_ID` (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for PauseQueue.
  }

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

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, queue types, and others.
    &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
        # field is unset, then no logs are written.
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
      &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
          # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          # This field may contain any value between 0.0 and 1.0, inclusive.
          # 0.0 is the default and means that no operations are logged.
    },
    &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and retry_config are
        # related because they both control task attempts. However they control task
        # attempts in different ways:
        #
        # * rate_limits controls the total rate of
        #   dispatches from a queue (i.e. all traffic dispatched from the
        #   queue, regardless of whether the dispatch is from a first
        #   attempt or a retry).
        # * retry_config controls what happens to
        #   particular a task after its first attempt fails. That is,
        #   retry_config controls task retries (the
        #   second attempt, third attempt, etc).
        #
        # The queue&#x27;s actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue&#x27;s state.
        # * System throttling due to `429` (Too Many Requests) or `503` (Service
        #   Unavailable) responses from the worker, high error rates, or to smooth
        #   sudden large traffic spikes.
        #
        # This message determines the maximum rate that tasks can be dispatched by a
        # queue, regardless of whether the dispatch is a first task attempt or a retry.
        #
        # Note: The debugging command, RunTask, will run a task
        # even if the queue has reached its RateLimits.
      &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue&#x27;s bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_dispatches_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_dispatches_per_second.
          #
          # For queues that were created or updated using
          # `queue.yaml/xml`, `max_burst_size` is equal to
          # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
          # Since `max_burst_size` is output only, if
          # UpdateQueue is called on a queue
          # created by `queue.yaml/xml`, `max_burst_size` will be reset based
          # on the value of
          # max_dispatches_per_second,
          # regardless of whether
          # max_dispatches_per_second
          # is updated.
      &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # * The maximum allowed value is 500.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
      &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
          # to be dispatched for this queue. After this threshold has been
          # reached, Cloud Tasks stops dispatching tasks until the number of
          # concurrent requests decreases.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # The maximum allowed value is 5,000.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    },
    &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        # Http tasks are not affected.
        #
        # If set, `app_engine_routing_override` is used for all
        # App Engine tasks in the queue, no matter what the
        # setting is for the
        # task-level app_engine_routing.
        #
        # Defines routing characteristics specific to App Engine - service, version,
        # and instance.
        #
        # For more information about services, versions, and instances see
        # [An Overview of App
        # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
        # [Microservices Architecture on Google App
        # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        #
        # Using AppEngineRouting requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
      &quot;instance&quot;: &quot;A String&quot;, # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      &quot;version&quot;: &quot;A String&quot;, # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;service&quot;: &quot;A String&quot;, # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
          #
          # The host is constructed from the domain name of the app associated with
          # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
          # service, version,
          # and instance. Tasks which were created using
          # the App Engine SDK might have a custom domain name.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
    },
    &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine when a failed task attempt is retried.
      &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [max_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A task&#x27;s retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # This field has the same meaning as
          # [max_doublings in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxAttempts&quot;: 42, # Number of attempts per task.
          #
          # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
          # first attempt fails, then there will be `max_attempts - 1` retries). Must
          # be &gt;= -1.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # -1 indicates unlimited attempts.
          #
          # This field has the same meaning as
          # [task_retry_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `min_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [min_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="purge">purge(name, body=None, x__xgafv=None)</code>
  <pre>Purges a queue by deleting all of its tasks.

All tasks created before this method is called are permanently deleted.

Purge operations can take up to one minute to take effect. Tasks
might be dispatched before the purge takes effect. A purge is irreversible.

Args:
  name: string, Required. The queue name. For example:
`projects/PROJECT_ID/location/LOCATION_ID/queues/QUEUE_ID` (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for PurgeQueue.
  }

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

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, queue types, and others.
    &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
        # field is unset, then no logs are written.
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
      &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
          # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          # This field may contain any value between 0.0 and 1.0, inclusive.
          # 0.0 is the default and means that no operations are logged.
    },
    &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and retry_config are
        # related because they both control task attempts. However they control task
        # attempts in different ways:
        #
        # * rate_limits controls the total rate of
        #   dispatches from a queue (i.e. all traffic dispatched from the
        #   queue, regardless of whether the dispatch is from a first
        #   attempt or a retry).
        # * retry_config controls what happens to
        #   particular a task after its first attempt fails. That is,
        #   retry_config controls task retries (the
        #   second attempt, third attempt, etc).
        #
        # The queue&#x27;s actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue&#x27;s state.
        # * System throttling due to `429` (Too Many Requests) or `503` (Service
        #   Unavailable) responses from the worker, high error rates, or to smooth
        #   sudden large traffic spikes.
        #
        # This message determines the maximum rate that tasks can be dispatched by a
        # queue, regardless of whether the dispatch is a first task attempt or a retry.
        #
        # Note: The debugging command, RunTask, will run a task
        # even if the queue has reached its RateLimits.
      &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue&#x27;s bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_dispatches_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_dispatches_per_second.
          #
          # For queues that were created or updated using
          # `queue.yaml/xml`, `max_burst_size` is equal to
          # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
          # Since `max_burst_size` is output only, if
          # UpdateQueue is called on a queue
          # created by `queue.yaml/xml`, `max_burst_size` will be reset based
          # on the value of
          # max_dispatches_per_second,
          # regardless of whether
          # max_dispatches_per_second
          # is updated.
      &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # * The maximum allowed value is 500.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
      &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
          # to be dispatched for this queue. After this threshold has been
          # reached, Cloud Tasks stops dispatching tasks until the number of
          # concurrent requests decreases.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # The maximum allowed value is 5,000.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    },
    &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        # Http tasks are not affected.
        #
        # If set, `app_engine_routing_override` is used for all
        # App Engine tasks in the queue, no matter what the
        # setting is for the
        # task-level app_engine_routing.
        #
        # Defines routing characteristics specific to App Engine - service, version,
        # and instance.
        #
        # For more information about services, versions, and instances see
        # [An Overview of App
        # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
        # [Microservices Architecture on Google App
        # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        #
        # Using AppEngineRouting requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
      &quot;instance&quot;: &quot;A String&quot;, # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      &quot;version&quot;: &quot;A String&quot;, # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;service&quot;: &quot;A String&quot;, # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
          #
          # The host is constructed from the domain name of the app associated with
          # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
          # service, version,
          # and instance. Tasks which were created using
          # the App Engine SDK might have a custom domain name.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
    },
    &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine when a failed task attempt is retried.
      &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [max_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A task&#x27;s retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # This field has the same meaning as
          # [max_doublings in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxAttempts&quot;: 42, # Number of attempts per task.
          #
          # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
          # first attempt fails, then there will be `max_attempts - 1` retries). Must
          # be &gt;= -1.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # -1 indicates unlimited attempts.
          #
          # This field has the same meaning as
          # [task_retry_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `min_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [min_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="resume">resume(name, body=None, x__xgafv=None)</code>
  <pre>Resume a queue.

This method resumes a queue after it has been
PAUSED or
DISABLED. The state of a queue is stored
in the queue&#x27;s state; after calling this method it
will be set to RUNNING.

WARNING: Resuming many high-QPS queues at the same time can
lead to target overloading. If you are resuming high-QPS
queues, follow the 500/50/5 pattern described in
[Managing Cloud Tasks Scaling
Risks](https://cloud.google.com/tasks/docs/manage-cloud-task-scaling).

Args:
  name: string, Required. The queue name. For example:
`projects/PROJECT_ID/location/LOCATION_ID/queues/QUEUE_ID` (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for ResumeQueue.
  }

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

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, queue types, and others.
    &quot;stackdriverLoggingConfig&quot;: { # Configuration options for writing logs to # Configuration options for writing logs to
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/). If this
        # field is unset, then no logs are written.
        # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
      &quot;samplingRatio&quot;: 3.14, # Specifies the fraction of operations to write to
          # [Stackdriver Logging](https://cloud.google.com/logging/docs/).
          # This field may contain any value between 0.0 and 1.0, inclusive.
          # 0.0 is the default and means that no operations are logged.
    },
    &quot;purgeTime&quot;: &quot;A String&quot;, # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    &quot;rateLimits&quot;: { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and retry_config are
        # related because they both control task attempts. However they control task
        # attempts in different ways:
        #
        # * rate_limits controls the total rate of
        #   dispatches from a queue (i.e. all traffic dispatched from the
        #   queue, regardless of whether the dispatch is from a first
        #   attempt or a retry).
        # * retry_config controls what happens to
        #   particular a task after its first attempt fails. That is,
        #   retry_config controls task retries (the
        #   second attempt, third attempt, etc).
        #
        # The queue&#x27;s actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue&#x27;s state.
        # * System throttling due to `429` (Too Many Requests) or `503` (Service
        #   Unavailable) responses from the worker, high error rates, or to smooth
        #   sudden large traffic spikes.
        #
        # This message determines the maximum rate that tasks can be dispatched by a
        # queue, regardless of whether the dispatch is a first task attempt or a retry.
        #
        # Note: The debugging command, RunTask, will run a task
        # even if the queue has reached its RateLimits.
      &quot;maxBurstSize&quot;: 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue&#x27;s bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_dispatches_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_dispatches_per_second.
          #
          # For queues that were created or updated using
          # `queue.yaml/xml`, `max_burst_size` is equal to
          # [bucket_size](https://cloud.google.com/appengine/docs/standard/python/config/queueref#bucket_size).
          # Since `max_burst_size` is output only, if
          # UpdateQueue is called on a queue
          # created by `queue.yaml/xml`, `max_burst_size` will be reset based
          # on the value of
          # max_dispatches_per_second,
          # regardless of whether
          # max_dispatches_per_second
          # is updated.
      &quot;maxDispatchesPerSecond&quot;: 3.14, # The maximum rate at which tasks are dispatched from this queue.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # * The maximum allowed value is 500.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
      &quot;maxConcurrentDispatches&quot;: 42, # The maximum number of concurrent tasks that Cloud Tasks allows
          # to be dispatched for this queue. After this threshold has been
          # reached, Cloud Tasks stops dispatching tasks until the number of
          # concurrent requests decreases.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # The maximum allowed value is 5,000.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    },
    &quot;appEngineRoutingOverride&quot;: { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        # Http tasks are not affected.
        #
        # If set, `app_engine_routing_override` is used for all
        # App Engine tasks in the queue, no matter what the
        # setting is for the
        # task-level app_engine_routing.
        #
        # Defines routing characteristics specific to App Engine - service, version,
        # and instance.
        #
        # For more information about services, versions, and instances see
        # [An Overview of App
        # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
        # [Microservices Architecture on Google App
        # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
        # [App Engine Standard request
        # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
        # and [App Engine Flex request
        # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        #
        # Using AppEngineRouting requires
        # [`appengine.applications.get`](https://cloud.google.com/appengine/docs/admin-api/access-control)
        # Google IAM permission for the project
        # and the following scope:
        #
        # `https://www.googleapis.com/auth/cloud-platform`
      &quot;instance&quot;: &quot;A String&quot;, # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      &quot;version&quot;: &quot;A String&quot;, # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;service&quot;: &quot;A String&quot;, # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the task is sent to.
          #
          # The host is constructed from the domain name of the app associated with
          # the queue&#x27;s project ID (for example &lt;app-id&gt;.appspot.com), and the
          # service, version,
          # and instance. Tasks which were created using
          # the App Engine SDK might have a custom domain name.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
    },
    &quot;name&quot;: &quot;A String&quot;, # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    &quot;state&quot;: &quot;A String&quot;, # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    &quot;retryConfig&quot;: { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine when a failed task attempt is retried.
      &quot;maxBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [max_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A task&#x27;s retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # This field has the same meaning as
          # [max_doublings in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;maxAttempts&quot;: 42, # Number of attempts per task.
          #
          # Cloud Tasks will attempt the task `max_attempts` times (that is, if the
          # first attempt fails, then there will be `max_attempts - 1` retries). Must
          # be &gt;= -1.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # -1 indicates unlimited attempts.
          #
          # This field has the same meaning as
          # [task_retry_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      &quot;minBackoff&quot;: &quot;A String&quot;, # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue&#x27;s RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          #
          # `min_backoff` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [min_backoff_seconds in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    },
  }</pre>
</div>

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

Note: The Cloud Console does not check queue-level IAM permissions yet.
Project-level permissions are required to use the Cloud Console.

Authorization requires the following
[Google IAM](https://cloud.google.com/iam) permission on the specified
resource parent:

* `cloudtasks.queues.setIamPolicy`

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;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;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
          &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;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;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;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;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.
    },
  }

  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;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;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        &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;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;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;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;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.
  }</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 a Queue.
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>