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

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

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

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

Args:
  parent: string, Required.

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

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

{ # A queue is a container of related tasks. Queues are configured to manage
    # how those tasks are dispatched. Configurable properties include rate limits,
    # retry options, target types, and others.
  "name": "A String", # Caller-specified and required in CreateQueue,
      # after which it becomes output only.
      # 
      # The queue name.
      # 
      # The queue name must have the following format:
      # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
      # 
      # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
      #    hyphens (-), colons (:), or periods (.).
      #    For more information, see
      #    [Identifying
      #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
      # * `LOCATION_ID` is the canonical ID for the queue's location.
      #    The list of available locations can be obtained by calling
      #    ListLocations.
      #    For more information, see https://cloud.google.com/about/locations/.
      # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
      #   hyphens (-). The maximum length is 100 characters.
  "rateLimits": { # Rate limits. # Rate limits for task dispatches.
      # 
      # rate_limits and
      # retry_config are related because they both
      # control task attempts however they control how tasks are
      # attempted 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).
      #
      # 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.
    "maxConcurrentTasks": 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 is output only for
        # pull queues and always -1, which indicates no limit. No other
        # queue types can have `max_concurrent_tasks` set to -1.
        #
        #
        # This field has the same meaning as
        # [max_concurrent_requests in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    "maxBurstSize": 42, # Output only. The max burst size.
        #
        # Max burst size limits how fast tasks in queue are processed when
        # many tasks are in the queue and the rate is high. This field
        # allows the queue to have a high rate so processing starts shortly
        # after a task is enqueued, but still limits resource usage when
        # many tasks are enqueued in a short period of time.
        #
        # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
        # algorithm is used to control the rate of task dispatches. Each
        # queue has a token bucket that holds tokens, up to the maximum
        # specified by `max_burst_size`. Each time a task is dispatched, a
        # token is removed from the bucket. Tasks will be dispatched until
        # the queue's bucket runs out of tokens. The bucket will be
        # continuously refilled with new tokens based on
        # max_tasks_dispatched_per_second.
        #
        # Cloud Tasks will pick the value of `max_burst_size` based on the
        # value of
        # max_tasks_dispatched_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_tasks_dispatched_per_second,
        # regardless of whether
        # max_tasks_dispatched_per_second
        # is updated.
    "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
        #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
        #   LeaseTasks requests are allowed per pull queue.
        #
        #
        # This field has the same meaning as
        # [rate in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
  },
  "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
      # 
      # An App Engine queue is a queue that has an AppEngineHttpTarget.
      #
      # The task will be delivered to the App Engine application hostname
      # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
      # The documentation for AppEngineHttpRequest explains how the
      # task's host URL is constructed.
      #
      # Using AppEngineHttpTarget 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`
    "appEngineRoutingOverride": { # 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).
      "instance": "A String", # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      "host": "A String", # Output only. The host that the task is sent to.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
          #
          # The host is constructed as:
          #
          #
          # * `host = [application_domain_name]`</br>
          #   `| [service] + '.' + [application_domain_name]`</br>
          #   `| [version] + '.' + [application_domain_name]`</br>
          #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
          #   `| [instance] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
          #
          # * `application_domain_name` = The domain name of the app, for
          #   example <app-id>.appspot.com, which is associated with the
          #   queue's project ID. Some tasks which were created using the App Engine
          #   SDK use a custom domain name.
          #
          # * `service =` service
          #
          # * `version =` version
          #
          # * `version_dot_service =`
          #   version `+ '.' +`
          #   service
          #
          # * `instance =` instance
          #
          # * `instance_dot_service =`
          #   instance `+ '.' +`
          #   service
          #
          # * `instance_dot_version =`
          #   instance `+ '.' +`
          #   version
          #
          # * `instance_dot_version_dot_service =`
          #   instance `+ '.' +`
          #   version `+ '.' +`
          #   service
          #
          # If service is empty, then the task will be sent
          # to the service which is the default service when the task is attempted.
          #
          # If version is empty, then the task will be sent
          # to the version which is the default version when the task is attempted.
          #
          # If instance is empty, then the task
          # will be sent to an instance which is available when the task is
          # attempted.
          #
          # If service,
          # version, or
          # instance is invalid, then the task
          # will be sent to the default version of the default service when
          # the task is attempted.
      "version": "A String", # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      "service": "A String", # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
    },
  },
  "pullTarget": { # Pull target. # Pull target.
      # 
      # A pull queue is a queue that has a PullTarget.
  },
  "state": "A String", # Output only. The state of the queue.
      # 
      # `state` can only be changed by called
      # PauseQueue,
      # ResumeQueue, or uploading
      # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
      # UpdateQueue cannot be used to change `state`.
  "purgeTime": "A String", # Output only. The last time this queue was purged.
      # 
      # All tasks that were created before this time
      # were purged.
      # 
      # A queue can be purged using PurgeQueue, the
      # [App Engine Task Queue SDK, or the Cloud
      # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
      # 
      # Purge time will be truncated to the nearest microsecond. Purge
      # time will be unset if the queue has never been purged.
  "retryConfig": { # Retry config. # Settings that determine the retry behavior.
      # 
      # * For tasks created using Cloud Tasks: the queue-level retry settings
      #   apply to all tasks in the queue that were created using Cloud Tasks.
      #   Retry settings cannot be set on individual tasks.
      # * For tasks created using the App Engine SDK: the queue-level retry
      #   settings apply to all tasks in the queue which do not have retry settings
      #   explicitly set on the task and were created by the App Engine SDK. See
      #   [App Engine
      #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
      #
      # These settings determine how a failed task attempt is retried.
    "maxDoublings": 42, # The time between retries will double `max_doublings` times.
        #
        # A task's retry interval starts at
        # min_backoff, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries retries at intervals of
        # max_backoff up to
        # max_attempts times.
        #
        # For example, if min_backoff is 10s,
        # max_backoff is 300s, and
        # `max_doublings` is 3, then the a task will first be retried in
        # 10s. The retry interval will double three times, and then
        # increase linearly by 2^3 * 10s.  Finally, the task will retry at
        # intervals of max_backoff until the
        # task has been attempted max_attempts
        # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
        # 240s, 300s, 300s, ....
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # 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).
    "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
    "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
    "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
        # retrying a failed task, measured from when the task was first
        # attempted. Once `max_retry_duration` time has passed *and* the
        # task has been attempted max_attempts
        # times, no further attempts will be made and the task will be
        # deleted.
        #
        # If zero, then the task age is unlimited.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # `max_retry_duration` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [task_age_limit in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    "minBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue's RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # `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).
    "maxBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue's RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # `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).
  },
}

  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, target types, and others.
    "name": "A String", # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue's location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    "rateLimits": { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and
        # retry_config are related because they both
        # control task attempts however they control how tasks are
        # attempted 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).
        #
        # 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.
      "maxConcurrentTasks": 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 is output only for
          # pull queues and always -1, which indicates no limit. No other
          # queue types can have `max_concurrent_tasks` set to -1.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
      "maxBurstSize": 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue's bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_tasks_dispatched_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_tasks_dispatched_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_tasks_dispatched_per_second,
          # regardless of whether
          # max_tasks_dispatched_per_second
          # is updated.
      "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
          #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
          #   LeaseTasks requests are allowed per pull queue.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    },
    "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
        #
        # An App Engine queue is a queue that has an AppEngineHttpTarget.
        #
        # The task will be delivered to the App Engine application hostname
        # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
        # The documentation for AppEngineHttpRequest explains how the
        # task's host URL is constructed.
        #
        # Using AppEngineHttpTarget 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`
      "appEngineRoutingOverride": { # 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).
        "instance": "A String", # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        "host": "A String", # Output only. The host that the task is sent to.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   queue's project ID. Some tasks which were created using the App Engine
            #   SDK use a custom domain name.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            # If service is empty, then the task will be sent
            # to the service which is the default service when the task is attempted.
            #
            # If version is empty, then the task will be sent
            # to the version which is the default version when the task is attempted.
            #
            # If instance is empty, then the task
            # will be sent to an instance which is available when the task is
            # attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the task
            # will be sent to the default version of the default service when
            # the task is attempted.
        "version": "A String", # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        "service": "A String", # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
      },
    },
    "pullTarget": { # Pull target. # Pull target.
        #
        # A pull queue is a queue that has a PullTarget.
    },
    "state": "A String", # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    "purgeTime": "A String", # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    "retryConfig": { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine how a failed task attempt is retried.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # 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).
      "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
      "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
      "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
    },
  }</pre>
</div>

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

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

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

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

Args:
  name: string, Required.

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

Returns:
  An object of the form:

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

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

Args:
  name: string, Required.

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

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, target types, and others.
    "name": "A String", # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue's location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    "rateLimits": { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and
        # retry_config are related because they both
        # control task attempts however they control how tasks are
        # attempted 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).
        #
        # 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.
      "maxConcurrentTasks": 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 is output only for
          # pull queues and always -1, which indicates no limit. No other
          # queue types can have `max_concurrent_tasks` set to -1.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
      "maxBurstSize": 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue's bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_tasks_dispatched_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_tasks_dispatched_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_tasks_dispatched_per_second,
          # regardless of whether
          # max_tasks_dispatched_per_second
          # is updated.
      "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
          #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
          #   LeaseTasks requests are allowed per pull queue.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    },
    "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
        #
        # An App Engine queue is a queue that has an AppEngineHttpTarget.
        #
        # The task will be delivered to the App Engine application hostname
        # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
        # The documentation for AppEngineHttpRequest explains how the
        # task's host URL is constructed.
        #
        # Using AppEngineHttpTarget 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`
      "appEngineRoutingOverride": { # 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).
        "instance": "A String", # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        "host": "A String", # Output only. The host that the task is sent to.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   queue's project ID. Some tasks which were created using the App Engine
            #   SDK use a custom domain name.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            # If service is empty, then the task will be sent
            # to the service which is the default service when the task is attempted.
            #
            # If version is empty, then the task will be sent
            # to the version which is the default version when the task is attempted.
            #
            # If instance is empty, then the task
            # will be sent to an instance which is available when the task is
            # attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the task
            # will be sent to the default version of the default service when
            # the task is attempted.
        "version": "A String", # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        "service": "A String", # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
      },
    },
    "pullTarget": { # Pull target. # Pull target.
        #
        # A pull queue is a queue that has a PullTarget.
    },
    "state": "A String", # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    "purgeTime": "A String", # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    "retryConfig": { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine how a failed task attempt is retried.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # 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).
      "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
      "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
      "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
    },
  }</pre>
</div>

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

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

* `cloudtasks.queues.getIamPolicy`

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

{ # Request message for `GetIamPolicy` method.
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **JSON Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # **YAML Example**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
      #       role: roles/owner
      #     - members:
      #       - user:sean@example.com
      #       role: roles/viewer
      #
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam/docs).
    "bindings": [ # Associates a list of `members` to a `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@gmail.com` .
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
        "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
            # NOTE: An unsatisfied condition will not allow user access via current
            # binding. Different bindings, including their conditions, are examined
            # independently.
            #
            #     title: "User account presence"
            #     description: "Determines whether the request has a user account"
            #     expression: "size(request.user) > 0"
          "description": "A String", # An optional description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          "expression": "A String", # Textual representation of an expression in
              # Common Expression Language syntax.
              #
              # The application context of the containing message determines which
              # well-known feature set of CEL is supported.
          "location": "A String", # An optional string indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          "title": "A String", # An optional title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
        },
      },
    ],
    "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
    "version": 42, # Deprecated.
  }</pre>
</div>

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

Queues are returned in lexicographical order.

Args:
  parent: string, Required.

The location name.
For example: `projects/PROJECT_ID/locations/LOCATION_ID` (required)
  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
  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.
  filter: string, `filter` can be used to specify a subset of queues. Any Queue
field can be used as a filter and several operators as supported.
For example: `<=, <, >=, >, !=, =, :`. The filter syntax is the same as
described in
[Stackdriver's Advanced Logs
Filters](https://cloud.google.com/logging/docs/view/advanced_filters).

Sample filter "app_engine_http_target: *".

Note that using filters might cause fewer queues than the
requested_page size to be returned.

Returns:
  An object of the form:

    { # Response message for ListQueues.
    "nextPageToken": "A String", # A token to retrieve next page of results.
        #
        # To return the next page of results, call
        # ListQueues with this value as the
        # page_token.
        #
        # If the next_page_token is empty, there are no more results.
        #
        # The page token is valid for only 2 hours.
    "queues": [ # The list of queues.
      { # A queue is a container of related tasks. Queues are configured to manage
          # how those tasks are dispatched. Configurable properties include rate limits,
          # retry options, target types, and others.
        "name": "A String", # Caller-specified and required in CreateQueue,
            # after which it becomes output only.
            #
            # The queue name.
            #
            # The queue name must have the following format:
            # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
            #
            # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
            #    hyphens (-), colons (:), or periods (.).
            #    For more information, see
            #    [Identifying
            #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
            # * `LOCATION_ID` is the canonical ID for the queue's location.
            #    The list of available locations can be obtained by calling
            #    ListLocations.
            #    For more information, see https://cloud.google.com/about/locations/.
            # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
            #   hyphens (-). The maximum length is 100 characters.
        "rateLimits": { # Rate limits. # Rate limits for task dispatches.
            #
            # rate_limits and
            # retry_config are related because they both
            # control task attempts however they control how tasks are
            # attempted 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).
            #
            # 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.
          "maxConcurrentTasks": 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 is output only for
              # pull queues and always -1, which indicates no limit. No other
              # queue types can have `max_concurrent_tasks` set to -1.
              #
              #
              # This field has the same meaning as
              # [max_concurrent_requests in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
          "maxBurstSize": 42, # Output only. The max burst size.
              #
              # Max burst size limits how fast tasks in queue are processed when
              # many tasks are in the queue and the rate is high. This field
              # allows the queue to have a high rate so processing starts shortly
              # after a task is enqueued, but still limits resource usage when
              # many tasks are enqueued in a short period of time.
              #
              # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
              # algorithm is used to control the rate of task dispatches. Each
              # queue has a token bucket that holds tokens, up to the maximum
              # specified by `max_burst_size`. Each time a task is dispatched, a
              # token is removed from the bucket. Tasks will be dispatched until
              # the queue's bucket runs out of tokens. The bucket will be
              # continuously refilled with new tokens based on
              # max_tasks_dispatched_per_second.
              #
              # Cloud Tasks will pick the value of `max_burst_size` based on the
              # value of
              # max_tasks_dispatched_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_tasks_dispatched_per_second,
              # regardless of whether
              # max_tasks_dispatched_per_second
              # is updated.
          "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
              #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
              #   LeaseTasks requests are allowed per pull queue.
              #
              #
              # This field has the same meaning as
              # [rate in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
        },
        "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
            #
            # An App Engine queue is a queue that has an AppEngineHttpTarget.
            #
            # The task will be delivered to the App Engine application hostname
            # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
            # The documentation for AppEngineHttpRequest explains how the
            # task's host URL is constructed.
            #
            # Using AppEngineHttpTarget 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`
          "appEngineRoutingOverride": { # 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).
            "instance": "A String", # App instance.
                #
                # By default, the task is sent to an instance which is available when
                # the task is attempted.
                #
                # Requests can only be sent to a specific instance if
                # [manual scaling is used in App Engine
                # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
                # App Engine Flex does not support instances. For more information, see
                # [App Engine Standard request
                # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
                # and [App Engine Flex request
                # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
            "host": "A String", # Output only. The host that the task is sent to.
                #
                # For more information, see
                # [How Requests are
                # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
                #
                # The host is constructed as:
                #
                #
                # * `host = [application_domain_name]`</br>
                #   `| [service] + '.' + [application_domain_name]`</br>
                #   `| [version] + '.' + [application_domain_name]`</br>
                #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
                #   `| [instance] + '.' + [application_domain_name]`</br>
                #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
                #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
                #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
                #
                # * `application_domain_name` = The domain name of the app, for
                #   example <app-id>.appspot.com, which is associated with the
                #   queue's project ID. Some tasks which were created using the App Engine
                #   SDK use a custom domain name.
                #
                # * `service =` service
                #
                # * `version =` version
                #
                # * `version_dot_service =`
                #   version `+ '.' +`
                #   service
                #
                # * `instance =` instance
                #
                # * `instance_dot_service =`
                #   instance `+ '.' +`
                #   service
                #
                # * `instance_dot_version =`
                #   instance `+ '.' +`
                #   version
                #
                # * `instance_dot_version_dot_service =`
                #   instance `+ '.' +`
                #   version `+ '.' +`
                #   service
                #
                # If service is empty, then the task will be sent
                # to the service which is the default service when the task is attempted.
                #
                # If version is empty, then the task will be sent
                # to the version which is the default version when the task is attempted.
                #
                # If instance is empty, then the task
                # will be sent to an instance which is available when the task is
                # attempted.
                #
                # If service,
                # version, or
                # instance is invalid, then the task
                # will be sent to the default version of the default service when
                # the task is attempted.
            "version": "A String", # App version.
                #
                # By default, the task is sent to the version which is the default
                # version when the task is attempted.
                #
                # For some queues or tasks which were created using the App Engine
                # Task Queue API, host is not parsable
                # into service,
                # version, and
                # instance. For example, some tasks
                # which were created using the App Engine SDK use a custom domain
                # name; custom domains are not parsed by Cloud Tasks. If
                # host is not parsable, then
                # service,
                # version, and
                # instance are the empty string.
            "service": "A String", # App service.
                #
                # By default, the task is sent to the service which is the default
                # service when the task is attempted.
                #
                # For some queues or tasks which were created using the App Engine
                # Task Queue API, host is not parsable
                # into service,
                # version, and
                # instance. For example, some tasks
                # which were created using the App Engine SDK use a custom domain
                # name; custom domains are not parsed by Cloud Tasks. If
                # host is not parsable, then
                # service,
                # version, and
                # instance are the empty string.
          },
        },
        "pullTarget": { # Pull target. # Pull target.
            #
            # A pull queue is a queue that has a PullTarget.
        },
        "state": "A String", # Output only. The state of the queue.
            #
            # `state` can only be changed by called
            # PauseQueue,
            # ResumeQueue, or uploading
            # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
            # UpdateQueue cannot be used to change `state`.
        "purgeTime": "A String", # Output only. The last time this queue was purged.
            #
            # All tasks that were created before this time
            # were purged.
            #
            # A queue can be purged using PurgeQueue, the
            # [App Engine Task Queue SDK, or the Cloud
            # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
            #
            # Purge time will be truncated to the nearest microsecond. Purge
            # time will be unset if the queue has never been purged.
        "retryConfig": { # Retry config. # Settings that determine the retry behavior.
            #
            # * For tasks created using Cloud Tasks: the queue-level retry settings
            #   apply to all tasks in the queue that were created using Cloud Tasks.
            #   Retry settings cannot be set on individual tasks.
            # * For tasks created using the App Engine SDK: the queue-level retry
            #   settings apply to all tasks in the queue which do not have retry settings
            #   explicitly set on the task and were created by the App Engine SDK. See
            #   [App Engine
            #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
            #
            # These settings determine how a failed task attempt is retried.
          "maxDoublings": 42, # The time between retries will double `max_doublings` times.
              #
              # A task's retry interval starts at
              # min_backoff, then doubles
              # `max_doublings` times, then increases linearly, and finally
              # retries retries at intervals of
              # max_backoff up to
              # max_attempts times.
              #
              # For example, if min_backoff is 10s,
              # max_backoff is 300s, and
              # `max_doublings` is 3, then the a task will first be retried in
              # 10s. The retry interval will double three times, and then
              # increase linearly by 2^3 * 10s.  Finally, the task will retry at
              # intervals of max_backoff until the
              # task has been attempted max_attempts
              # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
              # 240s, 300s, 300s, ....
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              # This field is output only for pull queues.
              #
              #
              # 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).
          "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
          "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
          "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
              # retrying a failed task, measured from when the task was first
              # attempted. Once `max_retry_duration` time has passed *and* the
              # task has been attempted max_attempts
              # times, no further attempts will be made and the task will be
              # deleted.
              #
              # If zero, then the task age is unlimited.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              # This field is output only for pull queues.
              #
              #
              # `max_retry_duration` will be truncated to the nearest second.
              #
              # This field has the same meaning as
              # [task_age_limit in
              # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
          "minBackoff": "A String", # A task will be scheduled for retry between
              # min_backoff and
              # max_backoff duration after it fails,
              # if the queue's RetryConfig specifies that the task should be
              # retried.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              # This field is output only for pull queues.
              #
              #
              # `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).
          "maxBackoff": "A String", # A task will be scheduled for retry between
              # min_backoff and
              # max_backoff duration after it fails,
              # if the queue's RetryConfig specifies that the task should be
              # retried.
              #
              # If unspecified when the queue is created, Cloud Tasks will pick the
              # default.
              #
              # This field is output only for pull queues.
              #
              #
              # `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).
        },
      },
    ],
  }</pre>
</div>

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

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

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

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

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

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

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

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

The queue name.

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

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

{ # A queue is a container of related tasks. Queues are configured to manage
    # how those tasks are dispatched. Configurable properties include rate limits,
    # retry options, target types, and others.
  "name": "A String", # Caller-specified and required in CreateQueue,
      # after which it becomes output only.
      # 
      # The queue name.
      # 
      # The queue name must have the following format:
      # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
      # 
      # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
      #    hyphens (-), colons (:), or periods (.).
      #    For more information, see
      #    [Identifying
      #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
      # * `LOCATION_ID` is the canonical ID for the queue's location.
      #    The list of available locations can be obtained by calling
      #    ListLocations.
      #    For more information, see https://cloud.google.com/about/locations/.
      # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
      #   hyphens (-). The maximum length is 100 characters.
  "rateLimits": { # Rate limits. # Rate limits for task dispatches.
      # 
      # rate_limits and
      # retry_config are related because they both
      # control task attempts however they control how tasks are
      # attempted 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).
      #
      # 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.
    "maxConcurrentTasks": 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 is output only for
        # pull queues and always -1, which indicates no limit. No other
        # queue types can have `max_concurrent_tasks` set to -1.
        #
        #
        # This field has the same meaning as
        # [max_concurrent_requests in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
    "maxBurstSize": 42, # Output only. The max burst size.
        #
        # Max burst size limits how fast tasks in queue are processed when
        # many tasks are in the queue and the rate is high. This field
        # allows the queue to have a high rate so processing starts shortly
        # after a task is enqueued, but still limits resource usage when
        # many tasks are enqueued in a short period of time.
        #
        # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
        # algorithm is used to control the rate of task dispatches. Each
        # queue has a token bucket that holds tokens, up to the maximum
        # specified by `max_burst_size`. Each time a task is dispatched, a
        # token is removed from the bucket. Tasks will be dispatched until
        # the queue's bucket runs out of tokens. The bucket will be
        # continuously refilled with new tokens based on
        # max_tasks_dispatched_per_second.
        #
        # Cloud Tasks will pick the value of `max_burst_size` based on the
        # value of
        # max_tasks_dispatched_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_tasks_dispatched_per_second,
        # regardless of whether
        # max_tasks_dispatched_per_second
        # is updated.
    "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
        #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
        #   LeaseTasks requests are allowed per pull queue.
        #
        #
        # This field has the same meaning as
        # [rate in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
  },
  "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
      # 
      # An App Engine queue is a queue that has an AppEngineHttpTarget.
      #
      # The task will be delivered to the App Engine application hostname
      # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
      # The documentation for AppEngineHttpRequest explains how the
      # task's host URL is constructed.
      #
      # Using AppEngineHttpTarget 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`
    "appEngineRoutingOverride": { # 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).
      "instance": "A String", # App instance.
          #
          # By default, the task is sent to an instance which is available when
          # the task is attempted.
          #
          # Requests can only be sent to a specific instance if
          # [manual scaling is used in App Engine
          # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
          # App Engine Flex does not support instances. For more information, see
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
      "host": "A String", # Output only. The host that the task is sent to.
          #
          # For more information, see
          # [How Requests are
          # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
          #
          # The host is constructed as:
          #
          #
          # * `host = [application_domain_name]`</br>
          #   `| [service] + '.' + [application_domain_name]`</br>
          #   `| [version] + '.' + [application_domain_name]`</br>
          #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
          #   `| [instance] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
          #
          # * `application_domain_name` = The domain name of the app, for
          #   example <app-id>.appspot.com, which is associated with the
          #   queue's project ID. Some tasks which were created using the App Engine
          #   SDK use a custom domain name.
          #
          # * `service =` service
          #
          # * `version =` version
          #
          # * `version_dot_service =`
          #   version `+ '.' +`
          #   service
          #
          # * `instance =` instance
          #
          # * `instance_dot_service =`
          #   instance `+ '.' +`
          #   service
          #
          # * `instance_dot_version =`
          #   instance `+ '.' +`
          #   version
          #
          # * `instance_dot_version_dot_service =`
          #   instance `+ '.' +`
          #   version `+ '.' +`
          #   service
          #
          # If service is empty, then the task will be sent
          # to the service which is the default service when the task is attempted.
          #
          # If version is empty, then the task will be sent
          # to the version which is the default version when the task is attempted.
          #
          # If instance is empty, then the task
          # will be sent to an instance which is available when the task is
          # attempted.
          #
          # If service,
          # version, or
          # instance is invalid, then the task
          # will be sent to the default version of the default service when
          # the task is attempted.
      "version": "A String", # App version.
          #
          # By default, the task is sent to the version which is the default
          # version when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
      "service": "A String", # App service.
          #
          # By default, the task is sent to the service which is the default
          # service when the task is attempted.
          #
          # For some queues or tasks which were created using the App Engine
          # Task Queue API, host is not parsable
          # into service,
          # version, and
          # instance. For example, some tasks
          # which were created using the App Engine SDK use a custom domain
          # name; custom domains are not parsed by Cloud Tasks. If
          # host is not parsable, then
          # service,
          # version, and
          # instance are the empty string.
    },
  },
  "pullTarget": { # Pull target. # Pull target.
      # 
      # A pull queue is a queue that has a PullTarget.
  },
  "state": "A String", # Output only. The state of the queue.
      # 
      # `state` can only be changed by called
      # PauseQueue,
      # ResumeQueue, or uploading
      # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
      # UpdateQueue cannot be used to change `state`.
  "purgeTime": "A String", # Output only. The last time this queue was purged.
      # 
      # All tasks that were created before this time
      # were purged.
      # 
      # A queue can be purged using PurgeQueue, the
      # [App Engine Task Queue SDK, or the Cloud
      # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
      # 
      # Purge time will be truncated to the nearest microsecond. Purge
      # time will be unset if the queue has never been purged.
  "retryConfig": { # Retry config. # Settings that determine the retry behavior.
      # 
      # * For tasks created using Cloud Tasks: the queue-level retry settings
      #   apply to all tasks in the queue that were created using Cloud Tasks.
      #   Retry settings cannot be set on individual tasks.
      # * For tasks created using the App Engine SDK: the queue-level retry
      #   settings apply to all tasks in the queue which do not have retry settings
      #   explicitly set on the task and were created by the App Engine SDK. See
      #   [App Engine
      #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
      #
      # These settings determine how a failed task attempt is retried.
    "maxDoublings": 42, # The time between retries will double `max_doublings` times.
        #
        # A task's retry interval starts at
        # min_backoff, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries retries at intervals of
        # max_backoff up to
        # max_attempts times.
        #
        # For example, if min_backoff is 10s,
        # max_backoff is 300s, and
        # `max_doublings` is 3, then the a task will first be retried in
        # 10s. The retry interval will double three times, and then
        # increase linearly by 2^3 * 10s.  Finally, the task will retry at
        # intervals of max_backoff until the
        # task has been attempted max_attempts
        # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
        # 240s, 300s, 300s, ....
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # 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).
    "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
    "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
    "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
        # retrying a failed task, measured from when the task was first
        # attempted. Once `max_retry_duration` time has passed *and* the
        # task has been attempted max_attempts
        # times, no further attempts will be made and the task will be
        # deleted.
        #
        # If zero, then the task age is unlimited.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # `max_retry_duration` will be truncated to the nearest second.
        #
        # This field has the same meaning as
        # [task_age_limit in
        # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
    "minBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue's RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # `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).
    "maxBackoff": "A String", # A task will be scheduled for retry between
        # min_backoff and
        # max_backoff duration after it fails,
        # if the queue's RetryConfig specifies that the task should be
        # retried.
        #
        # If unspecified when the queue is created, Cloud Tasks will pick the
        # default.
        #
        # This field is output only for pull queues.
        #
        #
        # `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).
  },
}

  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, target types, and others.
    "name": "A String", # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue's location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    "rateLimits": { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and
        # retry_config are related because they both
        # control task attempts however they control how tasks are
        # attempted 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).
        #
        # 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.
      "maxConcurrentTasks": 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 is output only for
          # pull queues and always -1, which indicates no limit. No other
          # queue types can have `max_concurrent_tasks` set to -1.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
      "maxBurstSize": 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue's bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_tasks_dispatched_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_tasks_dispatched_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_tasks_dispatched_per_second,
          # regardless of whether
          # max_tasks_dispatched_per_second
          # is updated.
      "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
          #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
          #   LeaseTasks requests are allowed per pull queue.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    },
    "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
        #
        # An App Engine queue is a queue that has an AppEngineHttpTarget.
        #
        # The task will be delivered to the App Engine application hostname
        # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
        # The documentation for AppEngineHttpRequest explains how the
        # task's host URL is constructed.
        #
        # Using AppEngineHttpTarget 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`
      "appEngineRoutingOverride": { # 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).
        "instance": "A String", # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        "host": "A String", # Output only. The host that the task is sent to.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   queue's project ID. Some tasks which were created using the App Engine
            #   SDK use a custom domain name.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            # If service is empty, then the task will be sent
            # to the service which is the default service when the task is attempted.
            #
            # If version is empty, then the task will be sent
            # to the version which is the default version when the task is attempted.
            #
            # If instance is empty, then the task
            # will be sent to an instance which is available when the task is
            # attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the task
            # will be sent to the default version of the default service when
            # the task is attempted.
        "version": "A String", # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        "service": "A String", # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
      },
    },
    "pullTarget": { # Pull target. # Pull target.
        #
        # A pull queue is a queue that has a PullTarget.
    },
    "state": "A String", # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    "purgeTime": "A String", # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    "retryConfig": { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine how a failed task attempt is retried.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # 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).
      "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
      "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
      "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
    },
  }</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, target types, and others.
    "name": "A String", # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue's location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    "rateLimits": { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and
        # retry_config are related because they both
        # control task attempts however they control how tasks are
        # attempted 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).
        #
        # 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.
      "maxConcurrentTasks": 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 is output only for
          # pull queues and always -1, which indicates no limit. No other
          # queue types can have `max_concurrent_tasks` set to -1.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
      "maxBurstSize": 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue's bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_tasks_dispatched_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_tasks_dispatched_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_tasks_dispatched_per_second,
          # regardless of whether
          # max_tasks_dispatched_per_second
          # is updated.
      "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
          #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
          #   LeaseTasks requests are allowed per pull queue.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    },
    "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
        #
        # An App Engine queue is a queue that has an AppEngineHttpTarget.
        #
        # The task will be delivered to the App Engine application hostname
        # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
        # The documentation for AppEngineHttpRequest explains how the
        # task's host URL is constructed.
        #
        # Using AppEngineHttpTarget 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`
      "appEngineRoutingOverride": { # 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).
        "instance": "A String", # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        "host": "A String", # Output only. The host that the task is sent to.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   queue's project ID. Some tasks which were created using the App Engine
            #   SDK use a custom domain name.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            # If service is empty, then the task will be sent
            # to the service which is the default service when the task is attempted.
            #
            # If version is empty, then the task will be sent
            # to the version which is the default version when the task is attempted.
            #
            # If instance is empty, then the task
            # will be sent to an instance which is available when the task is
            # attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the task
            # will be sent to the default version of the default service when
            # the task is attempted.
        "version": "A String", # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        "service": "A String", # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
      },
    },
    "pullTarget": { # Pull target. # Pull target.
        #
        # A pull queue is a queue that has a PullTarget.
    },
    "state": "A String", # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    "purgeTime": "A String", # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    "retryConfig": { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine how a failed task attempt is retried.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # 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).
      "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
      "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
      "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
    },
  }</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, target types, and others.
    "name": "A String", # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue's location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    "rateLimits": { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and
        # retry_config are related because they both
        # control task attempts however they control how tasks are
        # attempted 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).
        #
        # 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.
      "maxConcurrentTasks": 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 is output only for
          # pull queues and always -1, which indicates no limit. No other
          # queue types can have `max_concurrent_tasks` set to -1.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
      "maxBurstSize": 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue's bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_tasks_dispatched_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_tasks_dispatched_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_tasks_dispatched_per_second,
          # regardless of whether
          # max_tasks_dispatched_per_second
          # is updated.
      "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
          #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
          #   LeaseTasks requests are allowed per pull queue.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    },
    "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
        #
        # An App Engine queue is a queue that has an AppEngineHttpTarget.
        #
        # The task will be delivered to the App Engine application hostname
        # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
        # The documentation for AppEngineHttpRequest explains how the
        # task's host URL is constructed.
        #
        # Using AppEngineHttpTarget 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`
      "appEngineRoutingOverride": { # 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).
        "instance": "A String", # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        "host": "A String", # Output only. The host that the task is sent to.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   queue's project ID. Some tasks which were created using the App Engine
            #   SDK use a custom domain name.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            # If service is empty, then the task will be sent
            # to the service which is the default service when the task is attempted.
            #
            # If version is empty, then the task will be sent
            # to the version which is the default version when the task is attempted.
            #
            # If instance is empty, then the task
            # will be sent to an instance which is available when the task is
            # attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the task
            # will be sent to the default version of the default service when
            # the task is attempted.
        "version": "A String", # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        "service": "A String", # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
      },
    },
    "pullTarget": { # Pull target. # Pull target.
        #
        # A pull queue is a queue that has a PullTarget.
    },
    "state": "A String", # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    "purgeTime": "A String", # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    "retryConfig": { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine how a failed task attempt is retried.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # 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).
      "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
      "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
      "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
    },
  }</pre>
</div>

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

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

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

Args:
  name: string, Required.

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

{ # Request message for ResumeQueue.
  }

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

Returns:
  An object of the form:

    { # A queue is a container of related tasks. Queues are configured to manage
      # how those tasks are dispatched. Configurable properties include rate limits,
      # retry options, target types, and others.
    "name": "A String", # Caller-specified and required in CreateQueue,
        # after which it becomes output only.
        #
        # The queue name.
        #
        # The queue name must have the following format:
        # `projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID`
        #
        # * `PROJECT_ID` can contain letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), colons (:), or periods (.).
        #    For more information, see
        #    [Identifying
        #    projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects)
        # * `LOCATION_ID` is the canonical ID for the queue's location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `QUEUE_ID` can contain letters ([A-Za-z]), numbers ([0-9]), or
        #   hyphens (-). The maximum length is 100 characters.
    "rateLimits": { # Rate limits. # Rate limits for task dispatches.
        #
        # rate_limits and
        # retry_config are related because they both
        # control task attempts however they control how tasks are
        # attempted 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).
        #
        # 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.
      "maxConcurrentTasks": 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 is output only for
          # pull queues and always -1, which indicates no limit. No other
          # queue types can have `max_concurrent_tasks` set to -1.
          #
          #
          # This field has the same meaning as
          # [max_concurrent_requests in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#max_concurrent_requests).
      "maxBurstSize": 42, # Output only. The max burst size.
          #
          # Max burst size limits how fast tasks in queue are processed when
          # many tasks are in the queue and the rate is high. This field
          # allows the queue to have a high rate so processing starts shortly
          # after a task is enqueued, but still limits resource usage when
          # many tasks are enqueued in a short period of time.
          #
          # The [token bucket](https://wikipedia.org/wiki/Token_Bucket)
          # algorithm is used to control the rate of task dispatches. Each
          # queue has a token bucket that holds tokens, up to the maximum
          # specified by `max_burst_size`. Each time a task is dispatched, a
          # token is removed from the bucket. Tasks will be dispatched until
          # the queue's bucket runs out of tokens. The bucket will be
          # continuously refilled with new tokens based on
          # max_tasks_dispatched_per_second.
          #
          # Cloud Tasks will pick the value of `max_burst_size` based on the
          # value of
          # max_tasks_dispatched_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_tasks_dispatched_per_second,
          # regardless of whether
          # max_tasks_dispatched_per_second
          # is updated.
      "maxTasksDispatchedPerSecond": 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 is output only   for pull queues. In addition to the
          #   `max_tasks_dispatched_per_second` limit, a maximum of 10 QPS of
          #   LeaseTasks requests are allowed per pull queue.
          #
          #
          # This field has the same meaning as
          # [rate in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#rate).
    },
    "appEngineHttpTarget": { # App Engine HTTP target. # App Engine HTTP target.
        #
        # An App Engine queue is a queue that has an AppEngineHttpTarget.
        #
        # The task will be delivered to the App Engine application hostname
        # specified by its AppEngineHttpTarget and AppEngineHttpRequest.
        # The documentation for AppEngineHttpRequest explains how the
        # task's host URL is constructed.
        #
        # Using AppEngineHttpTarget 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`
      "appEngineRoutingOverride": { # 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).
        "instance": "A String", # App instance.
            #
            # By default, the task is sent to an instance which is available when
            # the task is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        "host": "A String", # Output only. The host that the task is sent to.
            #
            # For more information, see
            # [How Requests are
            # Routed](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   queue's project ID. Some tasks which were created using the App Engine
            #   SDK use a custom domain name.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            # If service is empty, then the task will be sent
            # to the service which is the default service when the task is attempted.
            #
            # If version is empty, then the task will be sent
            # to the version which is the default version when the task is attempted.
            #
            # If instance is empty, then the task
            # will be sent to an instance which is available when the task is
            # attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the task
            # will be sent to the default version of the default service when
            # the task is attempted.
        "version": "A String", # App version.
            #
            # By default, the task is sent to the version which is the default
            # version when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
        "service": "A String", # App service.
            #
            # By default, the task is sent to the service which is the default
            # service when the task is attempted.
            #
            # For some queues or tasks which were created using the App Engine
            # Task Queue API, host is not parsable
            # into service,
            # version, and
            # instance. For example, some tasks
            # which were created using the App Engine SDK use a custom domain
            # name; custom domains are not parsed by Cloud Tasks. If
            # host is not parsable, then
            # service,
            # version, and
            # instance are the empty string.
      },
    },
    "pullTarget": { # Pull target. # Pull target.
        #
        # A pull queue is a queue that has a PullTarget.
    },
    "state": "A String", # Output only. The state of the queue.
        #
        # `state` can only be changed by called
        # PauseQueue,
        # ResumeQueue, or uploading
        # [queue.yaml/xml](https://cloud.google.com/appengine/docs/python/config/queueref).
        # UpdateQueue cannot be used to change `state`.
    "purgeTime": "A String", # Output only. The last time this queue was purged.
        #
        # All tasks that were created before this time
        # were purged.
        #
        # A queue can be purged using PurgeQueue, the
        # [App Engine Task Queue SDK, or the Cloud
        # Console](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/deleting-tasks-and-queues#purging_all_tasks_from_a_queue).
        #
        # Purge time will be truncated to the nearest microsecond. Purge
        # time will be unset if the queue has never been purged.
    "retryConfig": { # Retry config. # Settings that determine the retry behavior.
        #
        # * For tasks created using Cloud Tasks: the queue-level retry settings
        #   apply to all tasks in the queue that were created using Cloud Tasks.
        #   Retry settings cannot be set on individual tasks.
        # * For tasks created using the App Engine SDK: the queue-level retry
        #   settings apply to all tasks in the queue which do not have retry settings
        #   explicitly set on the task and were created by the App Engine SDK. See
        #   [App Engine
        #   documentation](https://cloud.google.com/appengine/docs/standard/python/taskqueue/push/retrying-tasks).
        #
        # These settings determine how a failed task attempt is retried.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A task's retry interval starts at
          # min_backoff, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries retries at intervals of
          # max_backoff up to
          # max_attempts times.
          #
          # For example, if min_backoff is 10s,
          # max_backoff is 300s, and
          # `max_doublings` is 3, then the a task will first be retried in
          # 10s. The retry interval will double three times, and then
          # increase linearly by 2^3 * 10s.  Finally, the task will retry at
          # intervals of max_backoff until the
          # task has been attempted max_attempts
          # times. Thus, the requests will retry at 10s, 20s, 40s, 80s, 160s,
          # 240s, 300s, 300s, ....
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # 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).
      "unlimitedAttempts": True or False, # If true, then the number of attempts is unlimited.
      "maxAttempts": 42, # The maximum number of attempts for a 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 > 0.
      "maxRetryDuration": "A String", # If positive, `max_retry_duration` specifies the time limit for
          # retrying a failed task, measured from when the task was first
          # attempted. Once `max_retry_duration` time has passed *and* the
          # task has been attempted max_attempts
          # times, no further attempts will be made and the task will be
          # deleted.
          #
          # If zero, then the task age is unlimited.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `max_retry_duration` will be truncated to the nearest second.
          #
          # This field has the same meaning as
          # [task_age_limit in
          # queue.yaml/xml](https://cloud.google.com/appengine/docs/standard/python/config/queueref#retry_parameters).
      "minBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
      "maxBackoff": "A String", # A task will be scheduled for retry between
          # min_backoff and
          # max_backoff duration after it fails,
          # if the queue's RetryConfig specifies that the task should be
          # retried.
          #
          # If unspecified when the queue is created, Cloud Tasks will pick the
          # default.
          #
          # This field is output only for pull queues.
          #
          #
          # `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).
    },
  }</pre>
</div>

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

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

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

* `cloudtasks.queues.setIamPolicy`

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

{ # Request message for `SetIamPolicy` method.
    "policy": { # Defines an Identity and Access Management (IAM) policy. It is used to # REQUIRED: The complete policy to be applied to the `resource`. The size of
        # the policy is limited to a few 10s of KB. An empty policy is a
        # valid policy but certain Cloud Platform services (such as Projects)
        # might reject them.
        # specify access control policies for Cloud Platform resources.
        #
        #
        # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
        # `members` to a `role`, where the members can be user accounts, Google groups,
        # Google domains, and service accounts. A `role` is a named list of permissions
        # defined by IAM.
        #
        # **JSON Example**
        #
        #     {
        #       "bindings": [
        #         {
        #           "role": "roles/owner",
        #           "members": [
        #             "user:mike@example.com",
        #             "group:admins@example.com",
        #             "domain:google.com",
        #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        #           ]
        #         },
        #         {
        #           "role": "roles/viewer",
        #           "members": ["user:sean@example.com"]
        #         }
        #       ]
        #     }
        #
        # **YAML Example**
        #
        #     bindings:
        #     - members:
        #       - user:mike@example.com
        #       - group:admins@example.com
        #       - domain:google.com
        #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
        #       role: roles/owner
        #     - members:
        #       - user:sean@example.com
        #       role: roles/viewer
        #
        #
        # For a description of IAM and its features, see the
        # [IAM developer's guide](https://cloud.google.com/iam/docs).
      "bindings": [ # Associates a list of `members` to a `role`.
          # `bindings` with no members will result in an error.
        { # Associates `members` with a `role`.
          "role": "A String", # Role that is assigned to `members`.
              # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
          "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
              # `members` can have the following values:
              #
              # * `allUsers`: A special identifier that represents anyone who is
              #    on the internet; with or without a Google account.
              #
              # * `allAuthenticatedUsers`: A special identifier that represents anyone
              #    who is authenticated with a Google account or a service account.
              #
              # * `user:{emailid}`: An email address that represents a specific Google
              #    account. For example, `alice@gmail.com` .
              #
              #
              # * `serviceAccount:{emailid}`: An email address that represents a service
              #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
              #
              # * `group:{emailid}`: An email address that represents a Google group.
              #    For example, `admins@example.com`.
              #
              #
              # * `domain:{domain}`: The G Suite domain (primary) that represents all the
              #    users of that domain. For example, `google.com` or `example.com`.
              #
            "A String",
          ],
          "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
              # NOTE: An unsatisfied condition will not allow user access via current
              # binding. Different bindings, including their conditions, are examined
              # independently.
              #
              #     title: "User account presence"
              #     description: "Determines whether the request has a user account"
              #     expression: "size(request.user) > 0"
            "description": "A String", # An optional description of the expression. This is a longer text which
                # describes the expression, e.g. when hovered over it in a UI.
            "expression": "A String", # Textual representation of an expression in
                # Common Expression Language syntax.
                #
                # The application context of the containing message determines which
                # well-known feature set of CEL is supported.
            "location": "A String", # An optional string indicating the location of the expression for error
                # reporting, e.g. a file name and a position in the file.
            "title": "A String", # An optional title for the expression, i.e. a short string describing
                # its purpose. This can be used e.g. in UIs which allow to enter the
                # expression.
          },
        },
      ],
      "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
          # prevent simultaneous updates of a policy from overwriting each other.
          # It is strongly suggested that systems make use of the `etag` in the
          # read-modify-write cycle to perform policy updates in order to avoid race
          # conditions: An `etag` is returned in the response to `getIamPolicy`, and
          # systems are expected to put that etag in the request to `setIamPolicy` to
          # ensure that their change will be applied to the same version of the policy.
          #
          # If no `etag` is provided in the call to `setIamPolicy`, then the existing
          # policy is overwritten blindly.
      "version": 42, # Deprecated.
    },
  }

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

Returns:
  An object of the form:

    { # Defines an Identity and Access Management (IAM) policy. It is used to
      # specify access control policies for Cloud Platform resources.
      #
      #
      # A `Policy` consists of a list of `bindings`. A `binding` binds a list of
      # `members` to a `role`, where the members can be user accounts, Google groups,
      # Google domains, and service accounts. A `role` is a named list of permissions
      # defined by IAM.
      #
      # **JSON Example**
      #
      #     {
      #       "bindings": [
      #         {
      #           "role": "roles/owner",
      #           "members": [
      #             "user:mike@example.com",
      #             "group:admins@example.com",
      #             "domain:google.com",
      #             "serviceAccount:my-other-app@appspot.gserviceaccount.com"
      #           ]
      #         },
      #         {
      #           "role": "roles/viewer",
      #           "members": ["user:sean@example.com"]
      #         }
      #       ]
      #     }
      #
      # **YAML Example**
      #
      #     bindings:
      #     - members:
      #       - user:mike@example.com
      #       - group:admins@example.com
      #       - domain:google.com
      #       - serviceAccount:my-other-app@appspot.gserviceaccount.com
      #       role: roles/owner
      #     - members:
      #       - user:sean@example.com
      #       role: roles/viewer
      #
      #
      # For a description of IAM and its features, see the
      # [IAM developer's guide](https://cloud.google.com/iam/docs).
    "bindings": [ # Associates a list of `members` to a `role`.
        # `bindings` with no members will result in an error.
      { # Associates `members` with a `role`.
        "role": "A String", # Role that is assigned to `members`.
            # For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
        "members": [ # Specifies the identities requesting access for a Cloud Platform resource.
            # `members` can have the following values:
            #
            # * `allUsers`: A special identifier that represents anyone who is
            #    on the internet; with or without a Google account.
            #
            # * `allAuthenticatedUsers`: A special identifier that represents anyone
            #    who is authenticated with a Google account or a service account.
            #
            # * `user:{emailid}`: An email address that represents a specific Google
            #    account. For example, `alice@gmail.com` .
            #
            #
            # * `serviceAccount:{emailid}`: An email address that represents a service
            #    account. For example, `my-other-app@appspot.gserviceaccount.com`.
            #
            # * `group:{emailid}`: An email address that represents a Google group.
            #    For example, `admins@example.com`.
            #
            #
            # * `domain:{domain}`: The G Suite domain (primary) that represents all the
            #    users of that domain. For example, `google.com` or `example.com`.
            #
          "A String",
        ],
        "condition": { # Represents an expression text. Example: # The condition that is associated with this binding.
            # NOTE: An unsatisfied condition will not allow user access via current
            # binding. Different bindings, including their conditions, are examined
            # independently.
            #
            #     title: "User account presence"
            #     description: "Determines whether the request has a user account"
            #     expression: "size(request.user) > 0"
          "description": "A String", # An optional description of the expression. This is a longer text which
              # describes the expression, e.g. when hovered over it in a UI.
          "expression": "A String", # Textual representation of an expression in
              # Common Expression Language syntax.
              #
              # The application context of the containing message determines which
              # well-known feature set of CEL is supported.
          "location": "A String", # An optional string indicating the location of the expression for error
              # reporting, e.g. a file name and a position in the file.
          "title": "A String", # An optional title for the expression, i.e. a short string describing
              # its purpose. This can be used e.g. in UIs which allow to enter the
              # expression.
        },
      },
    ],
    "etag": "A String", # `etag` is used for optimistic concurrency control as a way to help
        # prevent simultaneous updates of a policy from overwriting each other.
        # It is strongly suggested that systems make use of the `etag` in the
        # read-modify-write cycle to perform policy updates in order to avoid race
        # conditions: An `etag` is returned in the response to `getIamPolicy`, and
        # systems are expected to put that etag in the request to `setIamPolicy` to
        # ensure that their change will be applied to the same version of the policy.
        #
        # If no `etag` is provided in the call to `setIamPolicy`, then the existing
        # policy is overwritten blindly.
    "version": 42, # Deprecated.
  }</pre>
</div>

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

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

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

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

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

Returns:
  An object of the form:

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

</body></html>