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

<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a queue.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a queue.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a queue.</p>
<p class="toc_element">
  <code><a href="#getIamPolicy">getIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the access control policy for a Queue.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, filter=None, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists queues.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates a queue.</p>
<p class="toc_element">
  <code><a href="#pause">pause(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Pauses the queue.</p>
<p class="toc_element">
  <code><a href="#purge">purge(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Purges a queue by deleting all of its tasks.</p>
<p class="toc_element">
  <code><a href="#resume">resume(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Resume a queue.</p>
<p class="toc_element">
  <code><a href="#setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Sets the access control policy for a Queue. Replaces any existing</p>
<p class="toc_element">
  <code><a href="#testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns permissions that a caller has on a Queue.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates a queue.

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

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

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

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

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

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

Returns:
  An object of the form:

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

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

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

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

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

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

Returns:
  An object of the form:

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

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

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

Returns:
  An object of the form:

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

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

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

* `cloudtasks.queues.getIamPolicy`

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

{ # Request message for `GetIamPolicy` method.
    &quot;options&quot;: { # Encapsulates settings provided to GetIamPolicy. # OPTIONAL: A `GetPolicyOptions` object for specifying options to
        # `GetIamPolicy`.
      &quot;requestedPolicyVersion&quot;: 42, # Optional. The policy format version to be returned.
          #
          # Valid values are 0, 1, and 3. Requests specifying an invalid value will be
          # rejected.
          #
          # Requests for policies with any conditional bindings must specify version 3.
          # Policies without any conditional bindings may specify any valid value or
          # leave the field unset.
          #
          # To learn which resources support conditions in their IAM policies, see the
          # [IAM
          # documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
    },
  }

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

Returns:
  An object of the form:

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

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

Queues are returned in lexicographical order.

Args:
  parent: string, Required. The location name.
For example: `projects/PROJECT_ID/locations/LOCATION_ID` (required)
  filter: string, `filter` can be used to specify a subset of queues. Any Queue
field can be used as a filter and several operators as supported.
For example: `&lt;=, &lt;, &gt;=, &gt;, !=, =, :`. The filter syntax is the same as
described in
[Stackdriver&#x27;s Advanced Logs
Filters](https://cloud.google.com/logging/docs/view/advanced_filters).

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

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

The maximum page size is 9800. If unspecified, the page size will
be the maximum. Fewer queues than requested might be returned,
even if more queues exist; use the
next_page_token in the
response to determine if more queues exist.
  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

Returns:
  An object of the form:

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

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

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

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

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

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

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

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

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

The queue name.

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

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

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

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

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

Returns:
  An object of the form:

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

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

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

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

{ # Request message for PauseQueue.
  }

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

Returns:
  An object of the form:

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

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

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

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

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

{ # Request message for PurgeQueue.
  }

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

Returns:
  An object of the form:

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

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

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

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

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

{ # Request message for ResumeQueue.
  }

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

Returns:
  An object of the form:

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

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

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

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

* `cloudtasks.queues.setIamPolicy`

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

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

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

Returns:
  An object of the form:

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

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

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

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

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

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

Returns:
  An object of the form:

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

</body></html>