<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, 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, pageSize=None, pageToken=None, x__xgafv=None, filter=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, 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, 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, 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, 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' implementation of
ListLocations. (required)
  body: object, The request body. (required)
    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.
  "name": "A 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'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.
  "rateLimits": { # 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's actual dispatch rate is the result of:
      # 
      # * Number of tasks in the queue
      # * User-specified throttling: rate_limits,
      #   retry_config, and the
      #   queue'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.
    "maxConcurrentDispatches": 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).
    "maxBurstSize": 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'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 App Engine 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.
    "maxDispatchesPerSecond": 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.
        #
        # * For App Engine queues, 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).
  },
  "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
      # task-level app_engine_routing.
      # These settings apply only to
      # App Engine tasks in this queue.
      # 
      # 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).
    "instance": "A String", # 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).
    "host": "A String", # 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's project ID (for example <app-id>.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).
    "version": "A String", # 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.
    "service": "A String", # 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.
  },
  "state": "A String", # 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`.
  "purgeTime": "A String", # 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.
  "retryConfig": { # 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.
    "maxBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue'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).
    "maxDoublings": 42, # The time between retries will double `max_doublings` times.
        #
        # A task's retry interval starts at
        # min_backoff, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries 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).
    "maxAttempts": 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 >= -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).
    "maxRetryDuration": "A String", # 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).
    "minBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue'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.
    "name": "A 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'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.
    "rateLimits": { # 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's actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue'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.
      "maxConcurrentDispatches": 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).
      "maxBurstSize": 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'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 App Engine 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.
      "maxDispatchesPerSecond": 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.
          #
          # * For App Engine queues, 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).
    },
    "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        #
        # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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's project ID (for example <app-id>.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).
      "version": "A String", # 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.
      "service": "A String", # 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.
    },
    "state": "A String", # 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`.
    "purgeTime": "A String", # 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.
    "retryConfig": { # 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.
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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).
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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).
      "maxAttempts": 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 >= -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).
      "maxRetryDuration": "A String", # 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).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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'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.
    "name": "A 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'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.
    "rateLimits": { # 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's actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue'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.
      "maxConcurrentDispatches": 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).
      "maxBurstSize": 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'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 App Engine 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.
      "maxDispatchesPerSecond": 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.
          #
          # * For App Engine queues, 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).
    },
    "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        #
        # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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's project ID (for example <app-id>.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).
      "version": "A String", # 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.
      "service": "A String", # 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.
    },
    "state": "A String", # 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`.
    "purgeTime": "A String", # 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.
    "retryConfig": { # 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.
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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).
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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).
      "maxAttempts": 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 >= -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).
      "maxRetryDuration": "A String", # 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).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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.
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **JSON Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # **YAML Example**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
      #       role: roles/owner
      #     - members:
      #       - user:sean@example.com
      #       role: roles/viewer
      #
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam/docs).
    "bindings": [ # Associates a list of `members` to a `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        "members": [ # 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@gmail.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`.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
        "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
            # NOTE: An unsatisfied condition will not allow user access via current
            # binding. Different bindings, including their conditions, are examined
            # independently.
            #
            #     title: "User account presence"
            #     description: "Determines whether the request has a user account"
            #     expression: "size(request.user) > 0"
          "description": "A String", # An optional description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          "expression": "A String", # Textual representation of an expression in
              # Common Expression Language syntax.
              #
              # The application context of the containing message determines which
              # well-known feature set of CEL is supported.
          "location": "A String", # An optional string indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          "title": "A String", # An 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.
        },
      },
    ],
    "version": 42, # Deprecated.
    "etag": "A String", # `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.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None, filter=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)
  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.
  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.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format
  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: `<=, <, >=, >, !=, =, :`. The filter syntax is the same as
described in
[Stackdriver's Advanced Logs
Filters](https://cloud.google.com/logging/docs/view/advanced_filters).

Sample filter "state: PAUSED".

Note that using filters might cause fewer queues than the
requested page_size to be returned.

Returns:
  An object of the form:

    { # Response message for ListQueues.
    "nextPageToken": "A String", # 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.
    "queues": [ # 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.
        "name": "A 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'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.
        "rateLimits": { # 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's actual dispatch rate is the result of:
            #
            # * Number of tasks in the queue
            # * User-specified throttling: rate_limits,
            #   retry_config, and the
            #   queue'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.
          "maxConcurrentDispatches": 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).
          "maxBurstSize": 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'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 App Engine 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.
          "maxDispatchesPerSecond": 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.
              #
              # * For App Engine queues, 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).
        },
        "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
            # task-level app_engine_routing.
            # These settings apply only to
            # App Engine tasks in this queue.
            #
            # 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).
          "instance": "A String", # 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).
          "host": "A String", # 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's project ID (for example <app-id>.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).
          "version": "A String", # 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.
          "service": "A String", # 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.
        },
        "state": "A String", # 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`.
        "purgeTime": "A String", # 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.
        "retryConfig": { # 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.
          "maxBackoff": "A String", # A task will be scheduled for retry between
              # min_backoff and
              # max_backoff duration after it fails,
              # if the queue'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).
          "maxDoublings": 42, # The time between retries will double `max_doublings` times.
              #
              # A task's retry interval starts at
              # min_backoff, then doubles
              # `max_doublings` times, then increases linearly, and finally
              # retries 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).
          "maxAttempts": 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 >= -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).
          "maxRetryDuration": "A String", # 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).
          "minBackoff": "A String", # A task will be scheduled for retry between
              # min_backoff and
              # max_backoff duration after it fails,
              # if the queue'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="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 'execute()' 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, 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'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. (required)
    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.
  "name": "A 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'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.
  "rateLimits": { # 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's actual dispatch rate is the result of:
      # 
      # * Number of tasks in the queue
      # * User-specified throttling: rate_limits,
      #   retry_config, and the
      #   queue'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.
    "maxConcurrentDispatches": 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).
    "maxBurstSize": 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'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 App Engine 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.
    "maxDispatchesPerSecond": 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.
        #
        # * For App Engine queues, 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).
  },
  "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
      # task-level app_engine_routing.
      # These settings apply only to
      # App Engine tasks in this queue.
      # 
      # 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).
    "instance": "A String", # 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).
    "host": "A String", # 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's project ID (for example <app-id>.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).
    "version": "A String", # 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.
    "service": "A String", # 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.
  },
  "state": "A String", # 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`.
  "purgeTime": "A String", # 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.
  "retryConfig": { # 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.
    "maxBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue'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).
    "maxDoublings": 42, # The time between retries will double `max_doublings` times.
        #
        # A task's retry interval starts at
        # min_backoff, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries 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).
    "maxAttempts": 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 >= -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).
    "maxRetryDuration": "A String", # 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).
    "minBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue'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.
    "name": "A 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'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.
    "rateLimits": { # 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's actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue'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.
      "maxConcurrentDispatches": 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).
      "maxBurstSize": 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'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 App Engine 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.
      "maxDispatchesPerSecond": 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.
          #
          # * For App Engine queues, 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).
    },
    "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        #
        # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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's project ID (for example <app-id>.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).
      "version": "A String", # 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.
      "service": "A String", # 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.
    },
    "state": "A String", # 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`.
    "purgeTime": "A String", # 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.
    "retryConfig": { # 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.
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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).
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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).
      "maxAttempts": 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 >= -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).
      "maxRetryDuration": "A String", # 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).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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.
    "name": "A 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'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.
    "rateLimits": { # 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's actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue'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.
      "maxConcurrentDispatches": 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).
      "maxBurstSize": 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'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 App Engine 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.
      "maxDispatchesPerSecond": 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.
          #
          # * For App Engine queues, 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).
    },
    "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        #
        # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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's project ID (for example <app-id>.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).
      "version": "A String", # 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.
      "service": "A String", # 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.
    },
    "state": "A String", # 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`.
    "purgeTime": "A String", # 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.
    "retryConfig": { # 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.
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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).
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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).
      "maxAttempts": 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 >= -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).
      "maxRetryDuration": "A String", # 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).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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.
    "name": "A 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'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.
    "rateLimits": { # 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's actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue'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.
      "maxConcurrentDispatches": 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).
      "maxBurstSize": 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'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 App Engine 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.
      "maxDispatchesPerSecond": 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.
          #
          # * For App Engine queues, 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).
    },
    "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        #
        # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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's project ID (for example <app-id>.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).
      "version": "A String", # 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.
      "service": "A String", # 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.
    },
    "state": "A String", # 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`.
    "purgeTime": "A String", # 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.
    "retryConfig": { # 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.
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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).
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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).
      "maxAttempts": 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 >= -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).
      "maxRetryDuration": "A String", # 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).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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'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.
    "name": "A 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'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.
    "rateLimits": { # 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's actual dispatch rate is the result of:
        #
        # * Number of tasks in the queue
        # * User-specified throttling: rate_limits,
        #   retry_config, and the
        #   queue'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.
      "maxConcurrentDispatches": 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).
      "maxBurstSize": 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'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 App Engine 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.
      "maxDispatchesPerSecond": 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.
          #
          # * For App Engine queues, 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).
    },
    "appEngineRoutingOverride": { # App Engine Routing. # Overrides for
        # task-level app_engine_routing.
        # These settings apply only to
        # App Engine tasks in this queue.
        #
        # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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's project ID (for example <app-id>.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).
      "version": "A String", # 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.
      "service": "A String", # 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.
    },
    "state": "A String", # 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`.
    "purgeTime": "A String", # 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.
    "retryConfig": { # 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.
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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).
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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).
      "maxAttempts": 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 >= -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).
      "maxRetryDuration": "A String", # 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).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue'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, 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. (required)
    The object takes the form of:

{ # Request message for `SetIamPolicy` method.
    "policy": { # Defines an Identity and Access Management (IAM) policy. It is used to # 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.
        # specify access control policies for Cloud Platform resources.
        #
        #
        # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
        # `members` to a `role`, where the members can be user accounts, Google groups,
        # Google domains, and service accounts. A `role` is a named list of permissions
        # defined by IAM.
        #
        # **JSON Example**
        #
        #     {
        #       "bindings": [
        #         {
        #           "role": "roles/owner",
        #           "members": [
        #             "user:mike@example.com",
        #             "group:admins@example.com",
        #             "domain:google.com",
        #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        #           ]
        #         },
        #         {
        #           "role": "roles/viewer",
        #           "members": ["user:sean@example.com"]
        #         }
        #       ]
        #     }
        #
        # **YAML Example**
        #
        #     bindings:
        #     - members:
        #       - user:mike@example.com
        #       - group:admins@example.com
        #       - domain:google.com
        #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
        #       role: roles/owner
        #     - members:
        #       - user:sean@example.com
        #       role: roles/viewer
        #
        #
        # For a description of IAM and its features, see the
        # [IAM developer's guide](https://cloud.google.com/iam/docs).
      "bindings": [ # Associates a list of `members` to a `role`.
          # `bindings` with no members will result in an error.
        { # Associates `members` with a `role`.
          "role": "A String", # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
          "members": [ # 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@gmail.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`.
              #
              #
              # * `domain:{domain}`: The G Suite domain (primary) that represents all the
              #    users of that domain. For example, `google.com` or `example.com`.
              #
            "A String",
          ],
          "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
              # NOTE: An unsatisfied condition will not allow user access via current
              # binding. Different bindings, including their conditions, are examined
              # independently.
              #
              #     title: "User account presence"
              #     description: "Determines whether the request has a user account"
              #     expression: "size(request.user) > 0"
            "description": "A String", # An optional description of the expression. This is a longer text which
                # describes the expression, e.g. when hovered over it in a UI.
            "expression": "A String", # Textual representation of an expression in
                # Common Expression Language syntax.
                #
                # The application context of the containing message determines which
                # well-known feature set of CEL is supported.
            "location": "A String", # An optional string indicating the location of the expression for error
                # reporting, e.g. a file name and a position in the file.
            "title": "A String", # An 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.
          },
        },
      ],
      "version": 42, # Deprecated.
      "etag": "A String", # `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.
          #
          # If no `etag` is provided in the call to `setIamPolicy`, then the existing
          # policy is overwritten blindly.
    },
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **JSON Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # **YAML Example**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
      #       role: roles/owner
      #     - members:
      #       - user:sean@example.com
      #       role: roles/viewer
      #
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam/docs).
    "bindings": [ # Associates a list of `members` to a `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        "members": [ # 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@gmail.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`.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
        "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
            # NOTE: An unsatisfied condition will not allow user access via current
            # binding. Different bindings, including their conditions, are examined
            # independently.
            #
            #     title: "User account presence"
            #     description: "Determines whether the request has a user account"
            #     expression: "size(request.user) > 0"
          "description": "A String", # An optional description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          "expression": "A String", # Textual representation of an expression in
              # Common Expression Language syntax.
              #
              # The application context of the containing message determines which
              # well-known feature set of CEL is supported.
          "location": "A String", # An optional string indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          "title": "A String", # An 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.
        },
      },
    ],
    "version": 42, # Deprecated.
    "etag": "A String", # `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.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
  }</pre>
</div>

<div class="method">
    <code class="details" id="testIamPermissions">testIamPermissions(resource, body, 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 "fail open" 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. (required)
    The object takes the form of:

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

  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.
    "permissions": [ # A subset of `TestPermissionsRequest.permissions` that the caller is
        # allowed.
      "A String",
    ],
  }</pre>
</div>

</body></html>