<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="cloudscheduler_v1beta1.html">Cloud Scheduler API</a> . <a href="cloudscheduler_v1beta1.projects.html">projects</a> . <a href="cloudscheduler_v1beta1.projects.locations.html">locations</a> . <a href="cloudscheduler_v1beta1.projects.locations.jobs.html">jobs</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a job.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a job.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a job.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists jobs.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates a job.</p>
<p class="toc_element">
  <code><a href="#pause">pause(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Pauses a job.</p>
<p class="toc_element">
  <code><a href="#resume">resume(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Resume a job.</p>
<p class="toc_element">
  <code><a href="#run">run(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Forces a job to run now.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Creates a job.

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

{ # Configuration for a job.
      # The maximum allowed size for a job is 100KB.
    &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
        # of an HTTP request via an http_method such
        # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
        # HTTP response code in the range [200 - 299]. Error 503 is
        # considered an App Engine system error instead of an application
        # error. Requests returning error 503 will be retried regardless of
        # retry configuration and not counted against retry counts. Any other
        # response code, or a failure to receive a response before the
        # deadline, constitutes a failed attempt.
      &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
          #
          # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
          # It can contain a path, query string arguments, and `#` fragments.
          # If the relative URL is empty, then the root path &quot;/&quot; will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      &quot;body&quot;: &quot;A String&quot;, # Body.
          #
          # HTTP request body. A request body is allowed only if the HTTP method is
          # POST or PUT. It will result in invalid argument error to set a body on a
          # job with an incompatible HttpMethod.
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values. Headers can be set
          # when the job is created.
          #
          # Cloud Scheduler sets some headers to default values:
          #
          # * `User-Agent`: By default, this header is
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
          #   modified `User-Agent`.
          # * `X-CloudScheduler`: This header will be set to true.
          #
          # If the job has an body, Cloud Scheduler sets
          # the following headers:
          #
          # * `Content-Type`: By default, the `Content-Type` header is set to
          #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
          #   setting `Content-Type` to a particular media type when the job is
          #   created.
          #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
          # * `Content-Length`: This is computed by Cloud Scheduler. This value is
          #   output only. It cannot be changed.
          #
          # The headers below are output only. They cannot be set or overridden:
          #
          # * `X-Google-*`: For Google internal use only.
          # * `X-AppEngine-*`: For Google internal use only.
          #
          # In addition, some App Engine headers, which contain
          # job-specific information, are also be sent to the job handler.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
          #
          # For more information about services, versions, and instances see
          # [An Overview of App
          # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
          # [Microservices Architecture on Google App
          # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;instance&quot;: &quot;A String&quot;, # App instance.
            #
            # By default, the job is sent to an instance which is available when
            # the job is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;service&quot;: &quot;A String&quot;, # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
        &quot;version&quot;: &quot;A String&quot;, # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
            #
            # For more information about how App Engine requests are routed, see
            # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`&lt;/br&gt;
            #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example &lt;app-id&gt;.appspot.com, which is associated with the
            #   job&#x27;s project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ &#x27;.&#x27; +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ &#x27;.&#x27; +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ &#x27;.&#x27; +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ &#x27;.&#x27; +`
            #   version `+ &#x27;.&#x27; +`
            #   service
            #
            #
            # If service is empty, then the job will be sent
            # to the service which is the default service when the job is attempted.
            #
            # If version is empty, then the job will be sent
            # to the version which is the default version when the job is attempted.
            #
            # If instance is empty, then the job will be
            # sent to an instance which is available when the job is attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the job will be sent
            # to the default version of the default service when the job is attempted.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
    &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
        # which it becomes output only.
        # 
        # The job name. For example:
        # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), or underscores (_). The maximum length is 500 characters.
    &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
    &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
        # UpdateJob.
        # 
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      &quot;attributes&quot;: { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
          # be published when a job is delivered. The topic name must be in the
          # same format as required by PubSub&#x27;s
          # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
          # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
          #
          # The topic must be in the same project as the Cloud Scheduler job.
      &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
    },
    &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
        # retry of a previously failed attempt or the next execution time
        # according to the schedule.
    &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
        # schedule. The value of this field must be a time
        # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
        # 
        # Note that some time zones include a provision for
        # daylight savings time. The rules for daylight saving time are
        # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
        # an HTTP request via an http_method such as HTTP
        # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
        # response code in the range [200 - 299]. A failure to receive a response
        # constitutes a failed execution. For a redirected request, the response
        # returned by the redirected request is considered.
      &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
          # will be generated and attached as an `Authorization` header in the HTTP
          # request.
          #
          # This type of authorization should generally only be used when calling
          # Google APIs hosted on *.googleapis.com.
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
          # This type of authorization should generally only be used when calling Google
          # APIs hosted on *.googleapis.com.
        &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
            # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
            # will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OAuth token.
            # The service account must be within the same project as the job. The caller
            # must have iam.serviceAccounts.actAs permission for the service account.
      },
      &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
          # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
          # valid values for uri are:
          # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
          # encode some characters for safety and compatibility. The maximum allowed
          # URL length is 2083 characters after encoding.
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
          # method is POST, PUT, or PATCH. It is an error to set body on a job with an
          # incompatible HttpMethod.
      &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
          # HTTP request. This map contains the header field names and
          # values. Repeated headers are not supported, but a header value can
          # contain commas. These headers represent a subset of the headers
          # that will accompany the job&#x27;s HTTP request. Some HTTP request
          # headers will be ignored or replaced. A partial list of headers that
          # will be ignored or replaced is below:
          # - Host: This will be computed by Cloud Scheduler and derived from
          # uri.
          # * `Content-Length`: This will be computed by Cloud Scheduler.
          # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
          # token will be generated and attached as an `Authorization` header in the
          # HTTP request.
          #
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OIDC token.
            # The service account must be within the same project as the job. The caller
            # must have iam.serviceAccounts.actAs permission for the service account.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
    },
    &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
        # 
        # Describes the schedule on which the job will be executed.
        # 
        # The schedule can be either of the following types:
        # 
        # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
        # * English-like
        # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
        # 
        # As a general rule, execution `n + 1` of a job will not begin
        # until execution `n` has finished. Cloud Scheduler will never
        # allow two simultaneously outstanding executions. For example,
        # this implies that if the `n+1`th execution is scheduled to run at
        # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
        # execution will not start until `16:15`.
        # A scheduled start time will be delayed if the previous
        # execution has not ended when its scheduled time occurs.
        # 
        # If retry_count &gt; 0 and a job attempt fails,
        # the job will be tried a total of retry_count
        # times, with exponential backoff, until the next scheduled start
        # time.
    &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
        #
        # By default, if a job does not complete successfully (meaning that
        # an acknowledgement is not received from the handler, then it will be retried
        # with exponential backoff according to the settings in RetryConfig.
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
          # execution was first attempted. If specified with
          # retry_count, the job will be retried until both
          # limits are reached.
          #
          # The default value for max_retry_duration is zero, which means retry
          # duration is unlimited.
      &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
      &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
          # exponential backoff procedure described by
          # max_doublings.
          #
          # The default value of retry_count is zero.
          #
          # If retry_count is zero, a job attempt will *not* be retried if
          # it fails. Instead the Cloud Scheduler system will wait for the
          # next scheduled execution time.
          #
          # If retry_count is set to a non-zero number then Cloud Scheduler
          # will retry failed attempts, using exponential backoff,
          # retry_count times, or until the next scheduled execution time,
          # whichever comes first.
          #
          # Values greater than 5 and negative values are not allowed.
      &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A job&#x27;s retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff_duration up to
          # retry_count times.
          #
          # For example, if min_backoff_duration is
          # 10s, max_backoff_duration is 300s, and
          # `max_doublings` is 3, then the a job will first be retried in 10s. The
          # retry interval will double three times, and then increase linearly by
          # 2^3 * 10s.  Finally, the job will retry at intervals of
          # max_backoff_duration until the job has
          # been attempted retry_count times. Thus, the
          # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
          #
          # The default value of this field is 5.
    },
    &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
        # this deadline then the request is cancelled and the attempt is marked as a
        # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
        # execution logs. Cloud Scheduler will retry the job according
        # to the RetryConfig.
        # 
        # The allowed duration for this deadline is:
        # 
        # * For HTTP targets, between 15 seconds and 30 minutes.
        # * For App Engine HTTP targets, between 15
        #   seconds and 24 hours.
        # * For PubSub targets, this field is ignored.
    &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
  }

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

Returns:
  An object of the form:

    { # Configuration for a job.
        # The maximum allowed size for a job is 100KB.
      &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
          # of an HTTP request via an http_method such
          # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
          # HTTP response code in the range [200 - 299]. Error 503 is
          # considered an App Engine system error instead of an application
          # error. Requests returning error 503 will be retried regardless of
          # retry configuration and not counted against retry counts. Any other
          # response code, or a failure to receive a response before the
          # deadline, constitutes a failed attempt.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
            # It can contain a path, query string arguments, and `#` fragments.
            # If the relative URL is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
        &quot;body&quot;: &quot;A String&quot;, # Body.
            #
            # HTTP request body. A request body is allowed only if the HTTP method is
            # POST or PUT. It will result in invalid argument error to set a body on a
            # job with an incompatible HttpMethod.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values. Headers can be set
            # when the job is created.
            #
            # Cloud Scheduler sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Scheduler will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            # * `X-CloudScheduler`: This header will be set to true.
            #
            # If the job has an body, Cloud Scheduler sets
            # the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
            #   setting `Content-Type` to a particular media type when the job is
            #   created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Scheduler. This value is
            #   output only. It cannot be changed.
            #
            # The headers below are output only. They cannot be set or overridden:
            #
            # * `X-Google-*`: For Google internal use only.
            # * `X-AppEngine-*`: For Google internal use only.
            #
            # In addition, some App Engine headers, which contain
            # job-specific information, are also be sent to the job handler.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the job is sent to an instance which is available when
              # the job is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the job is sent to the service which is the default
              # service when the job is attempted.
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the job is sent to the version which is the default
              # version when the job is attempted.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
              #
              # For more information about how App Engine requests are routed, see
              # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
              #
              # The host is constructed as:
              #
              #
              # * `host = [application_domain_name]`&lt;/br&gt;
              #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
              #
              # * `application_domain_name` = The domain name of the app, for
              #   example &lt;app-id&gt;.appspot.com, which is associated with the
              #   job&#x27;s project ID.
              #
              # * `service =` service
              #
              # * `version =` version
              #
              # * `version_dot_service =`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance =` instance
              #
              # * `instance_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance_dot_version =`
              #   instance `+ &#x27;.&#x27; +`
              #   version
              #
              # * `instance_dot_version_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              #
              # If service is empty, then the job will be sent
              # to the service which is the default service when the job is attempted.
              #
              # If version is empty, then the job will be sent
              # to the version which is the default version when the job is attempted.
              #
              # If instance is empty, then the job will be
              # sent to an instance which is available when the job is attempted.
              #
              # If service,
              # version, or
              # instance is invalid, then the job will be sent
              # to the default version of the default service when the job is attempted.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
            # permitted.
      },
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
          # which it becomes output only.
          #
          # The job name. For example:
          # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
      &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
          # UpdateJob.
          #
          # A human-readable description for the job. This string must not contain
          # more than 500 characters.
      &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
          # the given Pub/Sub topic.
        &quot;attributes&quot;: { # Attributes for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
            # be published when a job is delivered. The topic name must be in the
            # same format as required by PubSub&#x27;s
            # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
            # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
            #
            # The topic must be in the same project as the Cloud Scheduler job.
        &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
          # retry of a previously failed attempt or the next execution time
          # according to the schedule.
      &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
          # schedule. The value of this field must be a time
          # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
          #
          # Note that some time zones include a provision for
          # daylight savings time. The rules for daylight saving time are
          # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
          # time zone is not specified, the default will be in UTC (also known
          # as GMT).
      &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
          # an HTTP request via an http_method such as HTTP
          # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
          # response code in the range [200 - 299]. A failure to receive a response
          # constitutes a failed execution. For a redirected request, the response
          # returned by the redirected request is considered.
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
            # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
            # valid values for uri are:
            # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
            # method is POST, PUT, or PATCH. It is an error to set body on a job with an
            # incompatible HttpMethod.
        &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
            # HTTP request. This map contains the header field names and
            # values. Repeated headers are not supported, but a header value can
            # contain commas. These headers represent a subset of the headers
            # that will accompany the job&#x27;s HTTP request. Some HTTP request
            # headers will be ignored or replaced. A partial list of headers that
            # will be ignored or replaced is below:
            # - Host: This will be computed by Cloud Scheduler and derived from
            # uri.
            # * `Content-Length`: This will be computed by Cloud Scheduler.
            # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
            # * `X-Google-*`: Google internal use only.
            # * `X-AppEngine-*`: Google internal use only.
            #
            # The total size of headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
      },
      &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
          #
          # Describes the schedule on which the job will be executed.
          #
          # The schedule can be either of the following types:
          #
          # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
          # * English-like
          # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
          #
          # As a general rule, execution `n + 1` of a job will not begin
          # until execution `n` has finished. Cloud Scheduler will never
          # allow two simultaneously outstanding executions. For example,
          # this implies that if the `n+1`th execution is scheduled to run at
          # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
          # execution will not start until `16:15`.
          # A scheduled start time will be delayed if the previous
          # execution has not ended when its scheduled time occurs.
          #
          # If retry_count &gt; 0 and a job attempt fails,
          # the job will be tried a total of retry_count
          # times, with exponential backoff, until the next scheduled start
          # time.
      &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
          #
          # By default, if a job does not complete successfully (meaning that
          # an acknowledgement is not received from the handler, then it will be retried
          # with exponential backoff according to the settings in RetryConfig.
        &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
            # execution was first attempted. If specified with
            # retry_count, the job will be retried until both
            # limits are reached.
            #
            # The default value for max_retry_duration is zero, which means retry
            # duration is unlimited.
        &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 5 seconds.
        &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
            # exponential backoff procedure described by
            # max_doublings.
            #
            # The default value of retry_count is zero.
            #
            # If retry_count is zero, a job attempt will *not* be retried if
            # it fails. Instead the Cloud Scheduler system will wait for the
            # next scheduled execution time.
            #
            # If retry_count is set to a non-zero number then Cloud Scheduler
            # will retry failed attempts, using exponential backoff,
            # retry_count times, or until the next scheduled execution time,
            # whichever comes first.
            #
            # Values greater than 5 and negative values are not allowed.
        &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 1 hour.
        &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
            #
            # A job&#x27;s retry interval starts at
            # min_backoff_duration, then doubles
            # `max_doublings` times, then increases linearly, and finally
            # retries at intervals of
            # max_backoff_duration up to
            # retry_count times.
            #
            # For example, if min_backoff_duration is
            # 10s, max_backoff_duration is 300s, and
            # `max_doublings` is 3, then the a job will first be retried in 10s. The
            # retry interval will double three times, and then increase linearly by
            # 2^3 * 10s.  Finally, the job will retry at intervals of
            # max_backoff_duration until the job has
            # been attempted retry_count times. Thus, the
            # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
            #
            # The default value of this field is 5.
      },
      &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
      },
      &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
          # this deadline then the request is cancelled and the attempt is marked as a
          # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
          # execution logs. Cloud Scheduler will retry the job according
          # to the RetryConfig.
          #
          # The allowed duration for this deadline is:
          #
          # * For HTTP targets, between 15 seconds and 30 minutes.
          # * For App Engine HTTP targets, between 15
          #   seconds and 24 hours.
          # * For PubSub targets, this field is ignored.
      &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
    }</pre>
</div>

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

Args:
  name: string, Required. The job name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job.

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

Returns:
  An object of the form:

    { # Configuration for a job.
        # The maximum allowed size for a job is 100KB.
      &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
          # of an HTTP request via an http_method such
          # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
          # HTTP response code in the range [200 - 299]. Error 503 is
          # considered an App Engine system error instead of an application
          # error. Requests returning error 503 will be retried regardless of
          # retry configuration and not counted against retry counts. Any other
          # response code, or a failure to receive a response before the
          # deadline, constitutes a failed attempt.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
            # It can contain a path, query string arguments, and `#` fragments.
            # If the relative URL is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
        &quot;body&quot;: &quot;A String&quot;, # Body.
            #
            # HTTP request body. A request body is allowed only if the HTTP method is
            # POST or PUT. It will result in invalid argument error to set a body on a
            # job with an incompatible HttpMethod.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values. Headers can be set
            # when the job is created.
            #
            # Cloud Scheduler sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Scheduler will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            # * `X-CloudScheduler`: This header will be set to true.
            #
            # If the job has an body, Cloud Scheduler sets
            # the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
            #   setting `Content-Type` to a particular media type when the job is
            #   created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Scheduler. This value is
            #   output only. It cannot be changed.
            #
            # The headers below are output only. They cannot be set or overridden:
            #
            # * `X-Google-*`: For Google internal use only.
            # * `X-AppEngine-*`: For Google internal use only.
            #
            # In addition, some App Engine headers, which contain
            # job-specific information, are also be sent to the job handler.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the job is sent to an instance which is available when
              # the job is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the job is sent to the service which is the default
              # service when the job is attempted.
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the job is sent to the version which is the default
              # version when the job is attempted.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
              #
              # For more information about how App Engine requests are routed, see
              # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
              #
              # The host is constructed as:
              #
              #
              # * `host = [application_domain_name]`&lt;/br&gt;
              #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
              #
              # * `application_domain_name` = The domain name of the app, for
              #   example &lt;app-id&gt;.appspot.com, which is associated with the
              #   job&#x27;s project ID.
              #
              # * `service =` service
              #
              # * `version =` version
              #
              # * `version_dot_service =`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance =` instance
              #
              # * `instance_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance_dot_version =`
              #   instance `+ &#x27;.&#x27; +`
              #   version
              #
              # * `instance_dot_version_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              #
              # If service is empty, then the job will be sent
              # to the service which is the default service when the job is attempted.
              #
              # If version is empty, then the job will be sent
              # to the version which is the default version when the job is attempted.
              #
              # If instance is empty, then the job will be
              # sent to an instance which is available when the job is attempted.
              #
              # If service,
              # version, or
              # instance is invalid, then the job will be sent
              # to the default version of the default service when the job is attempted.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
            # permitted.
      },
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
          # which it becomes output only.
          #
          # The job name. For example:
          # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
      &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
          # UpdateJob.
          #
          # A human-readable description for the job. This string must not contain
          # more than 500 characters.
      &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
          # the given Pub/Sub topic.
        &quot;attributes&quot;: { # Attributes for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
            # be published when a job is delivered. The topic name must be in the
            # same format as required by PubSub&#x27;s
            # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
            # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
            #
            # The topic must be in the same project as the Cloud Scheduler job.
        &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
          # retry of a previously failed attempt or the next execution time
          # according to the schedule.
      &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
          # schedule. The value of this field must be a time
          # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
          #
          # Note that some time zones include a provision for
          # daylight savings time. The rules for daylight saving time are
          # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
          # time zone is not specified, the default will be in UTC (also known
          # as GMT).
      &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
          # an HTTP request via an http_method such as HTTP
          # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
          # response code in the range [200 - 299]. A failure to receive a response
          # constitutes a failed execution. For a redirected request, the response
          # returned by the redirected request is considered.
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
            # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
            # valid values for uri are:
            # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
            # method is POST, PUT, or PATCH. It is an error to set body on a job with an
            # incompatible HttpMethod.
        &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
            # HTTP request. This map contains the header field names and
            # values. Repeated headers are not supported, but a header value can
            # contain commas. These headers represent a subset of the headers
            # that will accompany the job&#x27;s HTTP request. Some HTTP request
            # headers will be ignored or replaced. A partial list of headers that
            # will be ignored or replaced is below:
            # - Host: This will be computed by Cloud Scheduler and derived from
            # uri.
            # * `Content-Length`: This will be computed by Cloud Scheduler.
            # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
            # * `X-Google-*`: Google internal use only.
            # * `X-AppEngine-*`: Google internal use only.
            #
            # The total size of headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
      },
      &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
          #
          # Describes the schedule on which the job will be executed.
          #
          # The schedule can be either of the following types:
          #
          # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
          # * English-like
          # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
          #
          # As a general rule, execution `n + 1` of a job will not begin
          # until execution `n` has finished. Cloud Scheduler will never
          # allow two simultaneously outstanding executions. For example,
          # this implies that if the `n+1`th execution is scheduled to run at
          # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
          # execution will not start until `16:15`.
          # A scheduled start time will be delayed if the previous
          # execution has not ended when its scheduled time occurs.
          #
          # If retry_count &gt; 0 and a job attempt fails,
          # the job will be tried a total of retry_count
          # times, with exponential backoff, until the next scheduled start
          # time.
      &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
          #
          # By default, if a job does not complete successfully (meaning that
          # an acknowledgement is not received from the handler, then it will be retried
          # with exponential backoff according to the settings in RetryConfig.
        &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
            # execution was first attempted. If specified with
            # retry_count, the job will be retried until both
            # limits are reached.
            #
            # The default value for max_retry_duration is zero, which means retry
            # duration is unlimited.
        &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 5 seconds.
        &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
            # exponential backoff procedure described by
            # max_doublings.
            #
            # The default value of retry_count is zero.
            #
            # If retry_count is zero, a job attempt will *not* be retried if
            # it fails. Instead the Cloud Scheduler system will wait for the
            # next scheduled execution time.
            #
            # If retry_count is set to a non-zero number then Cloud Scheduler
            # will retry failed attempts, using exponential backoff,
            # retry_count times, or until the next scheduled execution time,
            # whichever comes first.
            #
            # Values greater than 5 and negative values are not allowed.
        &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 1 hour.
        &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
            #
            # A job&#x27;s retry interval starts at
            # min_backoff_duration, then doubles
            # `max_doublings` times, then increases linearly, and finally
            # retries at intervals of
            # max_backoff_duration up to
            # retry_count times.
            #
            # For example, if min_backoff_duration is
            # 10s, max_backoff_duration is 300s, and
            # `max_doublings` is 3, then the a job will first be retried in 10s. The
            # retry interval will double three times, and then increase linearly by
            # 2^3 * 10s.  Finally, the job will retry at intervals of
            # max_backoff_duration until the job has
            # been attempted retry_count times. Thus, the
            # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
            #
            # The default value of this field is 5.
      },
      &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
      },
      &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
          # this deadline then the request is cancelled and the attempt is marked as a
          # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
          # execution logs. Cloud Scheduler will retry the job according
          # to the RetryConfig.
          #
          # The allowed duration for this deadline is:
          #
          # * For HTTP targets, between 15 seconds and 30 minutes.
          # * For App Engine HTTP targets, between 15
          #   seconds and 24 hours.
          # * For PubSub targets, this field is ignored.
      &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
    }</pre>
</div>

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

Args:
  parent: string, Required. The location name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID`. (required)
  pageToken: string, A token identifying a page of results the server will 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 ListJobs. It is an error to
switch the value of filter or
order_by while iterating through pages.
  pageSize: integer, Requested page size.

The maximum page size is 500. If unspecified, the page size will
be the maximum. Fewer jobs than requested might be returned,
even if more jobs exist; use next_page_token to determine if more
jobs exist.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for listing jobs using ListJobs.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # A token to retrieve next page of results. Pass this value in the
        # page_token field in the subsequent call to
        # ListJobs to retrieve the next page of results.
        # If this is empty it indicates that there are no more results
        # through which to paginate.
        #
        # The page token is valid for only 2 hours.
    &quot;jobs&quot;: [ # The list of jobs.
      { # Configuration for a job.
            # The maximum allowed size for a job is 100KB.
          &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
              # of an HTTP request via an http_method such
              # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
              # HTTP response code in the range [200 - 299]. Error 503 is
              # considered an App Engine system error instead of an application
              # error. Requests returning error 503 will be retried regardless of
              # retry configuration and not counted against retry counts. Any other
              # response code, or a failure to receive a response before the
              # deadline, constitutes a failed attempt.
            &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
                #
                # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
                # It can contain a path, query string arguments, and `#` fragments.
                # If the relative URL is empty, then the root path &quot;/&quot; will be used.
                # No spaces are allowed, and the maximum length allowed is 2083 characters.
            &quot;body&quot;: &quot;A String&quot;, # Body.
                #
                # HTTP request body. A request body is allowed only if the HTTP method is
                # POST or PUT. It will result in invalid argument error to set a body on a
                # job with an incompatible HttpMethod.
            &quot;headers&quot;: { # HTTP request headers.
                #
                # This map contains the header field names and values. Headers can be set
                # when the job is created.
                #
                # Cloud Scheduler sets some headers to default values:
                #
                # * `User-Agent`: By default, this header is
                #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
                #   This header can be modified, but Cloud Scheduler will append
                #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
                #   modified `User-Agent`.
                # * `X-CloudScheduler`: This header will be set to true.
                #
                # If the job has an body, Cloud Scheduler sets
                # the following headers:
                #
                # * `Content-Type`: By default, the `Content-Type` header is set to
                #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
                #   setting `Content-Type` to a particular media type when the job is
                #   created.
                #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
                # * `Content-Length`: This is computed by Cloud Scheduler. This value is
                #   output only. It cannot be changed.
                #
                # The headers below are output only. They cannot be set or overridden:
                #
                # * `X-Google-*`: For Google internal use only.
                # * `X-AppEngine-*`: For Google internal use only.
                #
                # In addition, some App Engine headers, which contain
                # job-specific information, are also be sent to the job handler.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
                #
                # For more information about services, versions, and instances see
                # [An Overview of App
                # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
                # [Microservices Architecture on Google App
                # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
                # [App Engine Standard request
                # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
                # and [App Engine Flex request
                # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
              &quot;instance&quot;: &quot;A String&quot;, # App instance.
                  #
                  # By default, the job is sent to an instance which is available when
                  # the job is attempted.
                  #
                  # Requests can only be sent to a specific instance if
                  # [manual scaling is used in App Engine
                  # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
                  # App Engine Flex does not support instances. For more information, see
                  # [App Engine Standard request
                  # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
                  # and [App Engine Flex request
                  # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
              &quot;service&quot;: &quot;A String&quot;, # App service.
                  #
                  # By default, the job is sent to the service which is the default
                  # service when the job is attempted.
              &quot;version&quot;: &quot;A String&quot;, # App version.
                  #
                  # By default, the job is sent to the version which is the default
                  # version when the job is attempted.
              &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
                  #
                  # For more information about how App Engine requests are routed, see
                  # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
                  #
                  # The host is constructed as:
                  #
                  #
                  # * `host = [application_domain_name]`&lt;/br&gt;
                  #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
                  #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
                  #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
                  #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
                  #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
                  #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
                  #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
                  #
                  # * `application_domain_name` = The domain name of the app, for
                  #   example &lt;app-id&gt;.appspot.com, which is associated with the
                  #   job&#x27;s project ID.
                  #
                  # * `service =` service
                  #
                  # * `version =` version
                  #
                  # * `version_dot_service =`
                  #   version `+ &#x27;.&#x27; +`
                  #   service
                  #
                  # * `instance =` instance
                  #
                  # * `instance_dot_service =`
                  #   instance `+ &#x27;.&#x27; +`
                  #   service
                  #
                  # * `instance_dot_version =`
                  #   instance `+ &#x27;.&#x27; +`
                  #   version
                  #
                  # * `instance_dot_version_dot_service =`
                  #   instance `+ &#x27;.&#x27; +`
                  #   version `+ &#x27;.&#x27; +`
                  #   service
                  #
                  #
                  # If service is empty, then the job will be sent
                  # to the service which is the default service when the job is attempted.
                  #
                  # If version is empty, then the job will be sent
                  # to the version which is the default version when the job is attempted.
                  #
                  # If instance is empty, then the job will be
                  # sent to an instance which is available when the job is attempted.
                  #
                  # If service,
                  # version, or
                  # instance is invalid, then the job will be sent
                  # to the default version of the default service when the job is attempted.
            },
            &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
                # permitted.
          },
          &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
          &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
              # which it becomes output only.
              #
              # The job name. For example:
              # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
              #    The list of available locations can be obtained by calling
              #    ListLocations.
              #    For more information, see https://cloud.google.com/about/locations/.
              # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
              #    hyphens (-), or underscores (_). The maximum length is 500 characters.
          &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
          &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
              # UpdateJob.
              #
              # A human-readable description for the job. This string must not contain
              # more than 500 characters.
          &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
              # the given Pub/Sub topic.
            &quot;attributes&quot;: { # Attributes for PubsubMessage.
                #
                # Pubsub message must contain either non-empty data, or at least one
                # attribute.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
                # be published when a job is delivered. The topic name must be in the
                # same format as required by PubSub&#x27;s
                # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
                # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
                #
                # The topic must be in the same project as the Cloud Scheduler job.
            &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
                #
                # Pubsub message must contain either non-empty data, or at least one
                # attribute.
          },
          &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
              # retry of a previously failed attempt or the next execution time
              # according to the schedule.
          &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
              # schedule. The value of this field must be a time
              # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
              #
              # Note that some time zones include a provision for
              # daylight savings time. The rules for daylight saving time are
              # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
              # time zone is not specified, the default will be in UTC (also known
              # as GMT).
          &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
              # an HTTP request via an http_method such as HTTP
              # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
              # response code in the range [200 - 299]. A failure to receive a response
              # constitutes a failed execution. For a redirected request, the response
              # returned by the redirected request is considered.
            &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
                # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
                # will be generated and attached as an `Authorization` header in the HTTP
                # request.
                #
                # This type of authorization should generally only be used when calling
                # Google APIs hosted on *.googleapis.com.
                # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
                # This type of authorization should generally only be used when calling Google
                # APIs hosted on *.googleapis.com.
              &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
                  # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
                  # will be used.
              &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
                  # to be used for generating OAuth token.
                  # The service account must be within the same project as the job. The caller
                  # must have iam.serviceAccounts.actAs permission for the service account.
            },
            &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
                # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
                # valid values for uri are:
                # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
                # encode some characters for safety and compatibility. The maximum allowed
                # URL length is 2083 characters after encoding.
            &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
                # method is POST, PUT, or PATCH. It is an error to set body on a job with an
                # incompatible HttpMethod.
            &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
                # HTTP request. This map contains the header field names and
                # values. Repeated headers are not supported, but a header value can
                # contain commas. These headers represent a subset of the headers
                # that will accompany the job&#x27;s HTTP request. Some HTTP request
                # headers will be ignored or replaced. A partial list of headers that
                # will be ignored or replaced is below:
                # - Host: This will be computed by Cloud Scheduler and derived from
                # uri.
                # * `Content-Length`: This will be computed by Cloud Scheduler.
                # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
                # * `X-Google-*`: Google internal use only.
                # * `X-AppEngine-*`: Google internal use only.
                #
                # The total size of headers must be less than 80KB.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
                # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
                # token will be generated and attached as an `Authorization` header in the
                # HTTP request.
                #
                # This type of authorization can be used for many scenarios, including
                # calling Cloud Run, or endpoints where you intend to validate the token
                # yourself.
                # [OpenID Connect
                # token](https://developers.google.com/identity/protocols/OpenIDConnect).
                # This type of authorization can be used for many scenarios, including
                # calling Cloud Run, or endpoints where you intend to validate the token
                # yourself.
              &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
                  # specified in target will be used.
              &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
                  # to be used for generating OIDC token.
                  # The service account must be within the same project as the job. The caller
                  # must have iam.serviceAccounts.actAs permission for the service account.
            },
            &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
          },
          &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
              #
              # Describes the schedule on which the job will be executed.
              #
              # The schedule can be either of the following types:
              #
              # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
              # * English-like
              # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
              #
              # As a general rule, execution `n + 1` of a job will not begin
              # until execution `n` has finished. Cloud Scheduler will never
              # allow two simultaneously outstanding executions. For example,
              # this implies that if the `n+1`th execution is scheduled to run at
              # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
              # execution will not start until `16:15`.
              # A scheduled start time will be delayed if the previous
              # execution has not ended when its scheduled time occurs.
              #
              # If retry_count &gt; 0 and a job attempt fails,
              # the job will be tried a total of retry_count
              # times, with exponential backoff, until the next scheduled start
              # time.
          &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
              #
              # By default, if a job does not complete successfully (meaning that
              # an acknowledgement is not received from the handler, then it will be retried
              # with exponential backoff according to the settings in RetryConfig.
            &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
                # execution was first attempted. If specified with
                # retry_count, the job will be retried until both
                # limits are reached.
                #
                # The default value for max_retry_duration is zero, which means retry
                # duration is unlimited.
            &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
                # it fails.
                #
                # The default value of this field is 5 seconds.
            &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
                # exponential backoff procedure described by
                # max_doublings.
                #
                # The default value of retry_count is zero.
                #
                # If retry_count is zero, a job attempt will *not* be retried if
                # it fails. Instead the Cloud Scheduler system will wait for the
                # next scheduled execution time.
                #
                # If retry_count is set to a non-zero number then Cloud Scheduler
                # will retry failed attempts, using exponential backoff,
                # retry_count times, or until the next scheduled execution time,
                # whichever comes first.
                #
                # Values greater than 5 and negative values are not allowed.
            &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
                # it fails.
                #
                # The default value of this field is 1 hour.
            &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
                #
                # A job&#x27;s retry interval starts at
                # min_backoff_duration, then doubles
                # `max_doublings` times, then increases linearly, and finally
                # retries at intervals of
                # max_backoff_duration up to
                # retry_count times.
                #
                # For example, if min_backoff_duration is
                # 10s, max_backoff_duration is 300s, and
                # `max_doublings` is 3, then the a job will first be retried in 10s. The
                # retry interval will double three times, and then increase linearly by
                # 2^3 * 10s.  Finally, the job will retry at intervals of
                # max_backoff_duration until the job has
                # been attempted retry_count times. Thus, the
                # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
                #
                # The default value of this field is 5.
          },
          &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
              # different programming environments, including REST APIs and RPC APIs. It is
              # used by [gRPC](https://github.com/grpc). Each `Status` message contains
              # three pieces of data: error code, error message, and error details.
              #
              # You can find out more about this error model and how to work with it in the
              # [API Design Guide](https://cloud.google.com/apis/design/errors).
            &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
            &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
                # user-facing error message should be localized and sent in the
                # google.rpc.Status.details field, or localized by the client.
            &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
                # message types for APIs to use.
              {
                &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
              },
            ],
          },
          &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
              # this deadline then the request is cancelled and the attempt is marked as a
              # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
              # execution logs. Cloud Scheduler will retry the job according
              # to the RetryConfig.
              #
              # The allowed duration for this deadline is:
              #
              # * For HTTP targets, between 15 seconds and 30 minutes.
              # * For App Engine HTTP targets, between 15
              #   seconds and 24 hours.
              # * For PubSub targets, this field is ignored.
          &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
        },
    ],
  }</pre>
</div>

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

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

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

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

If successful, the updated Job is returned. If the job does
not exist, `NOT_FOUND` is returned.

If UpdateJob does not successfully return, it is possible for the
job to be in an Job.State.UPDATE_FAILED state. A job in this state may
not be executed. If this happens, retry the UpdateJob request
until a successful response is received.

Args:
  name: string, Optionally caller-specified in CreateJob, after
which it becomes output only.

The job name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
   The list of available locations can be obtained by calling
   ListLocations.
   For more information, see https://cloud.google.com/about/locations/.
* `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
   hyphens (-), or underscores (_). The maximum length is 500 characters. (required)
  body: object, The request body.
    The object takes the form of:

{ # Configuration for a job.
      # The maximum allowed size for a job is 100KB.
    &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
        # of an HTTP request via an http_method such
        # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
        # HTTP response code in the range [200 - 299]. Error 503 is
        # considered an App Engine system error instead of an application
        # error. Requests returning error 503 will be retried regardless of
        # retry configuration and not counted against retry counts. Any other
        # response code, or a failure to receive a response before the
        # deadline, constitutes a failed attempt.
      &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
          #
          # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
          # It can contain a path, query string arguments, and `#` fragments.
          # If the relative URL is empty, then the root path &quot;/&quot; will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      &quot;body&quot;: &quot;A String&quot;, # Body.
          #
          # HTTP request body. A request body is allowed only if the HTTP method is
          # POST or PUT. It will result in invalid argument error to set a body on a
          # job with an incompatible HttpMethod.
      &quot;headers&quot;: { # HTTP request headers.
          #
          # This map contains the header field names and values. Headers can be set
          # when the job is created.
          #
          # Cloud Scheduler sets some headers to default values:
          #
          # * `User-Agent`: By default, this header is
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
          #   modified `User-Agent`.
          # * `X-CloudScheduler`: This header will be set to true.
          #
          # If the job has an body, Cloud Scheduler sets
          # the following headers:
          #
          # * `Content-Type`: By default, the `Content-Type` header is set to
          #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
          #   setting `Content-Type` to a particular media type when the job is
          #   created.
          #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
          # * `Content-Length`: This is computed by Cloud Scheduler. This value is
          #   output only. It cannot be changed.
          #
          # The headers below are output only. They cannot be set or overridden:
          #
          # * `X-Google-*`: For Google internal use only.
          # * `X-AppEngine-*`: For Google internal use only.
          #
          # In addition, some App Engine headers, which contain
          # job-specific information, are also be sent to the job handler.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
          #
          # For more information about services, versions, and instances see
          # [An Overview of App
          # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
          # [Microservices Architecture on Google App
          # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
          # [App Engine Standard request
          # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
          # and [App Engine Flex request
          # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;instance&quot;: &quot;A String&quot;, # App instance.
            #
            # By default, the job is sent to an instance which is available when
            # the job is attempted.
            #
            # Requests can only be sent to a specific instance if
            # [manual scaling is used in App Engine
            # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
            # App Engine Flex does not support instances. For more information, see
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
        &quot;service&quot;: &quot;A String&quot;, # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
        &quot;version&quot;: &quot;A String&quot;, # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
            #
            # For more information about how App Engine requests are routed, see
            # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
            #
            # The host is constructed as:
            #
            #
            # * `host = [application_domain_name]`&lt;/br&gt;
            #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
            #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example &lt;app-id&gt;.appspot.com, which is associated with the
            #   job&#x27;s project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ &#x27;.&#x27; +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ &#x27;.&#x27; +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ &#x27;.&#x27; +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ &#x27;.&#x27; +`
            #   version `+ &#x27;.&#x27; +`
            #   service
            #
            #
            # If service is empty, then the job will be sent
            # to the service which is the default service when the job is attempted.
            #
            # If version is empty, then the job will be sent
            # to the version which is the default version when the job is attempted.
            #
            # If instance is empty, then the job will be
            # sent to an instance which is available when the job is attempted.
            #
            # If service,
            # version, or
            # instance is invalid, then the job will be sent
            # to the default version of the default service when the job is attempted.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
    &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
        # which it becomes output only.
        # 
        # The job name. For example:
        # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
        #    The list of available locations can be obtained by calling
        #    ListLocations.
        #    For more information, see https://cloud.google.com/about/locations/.
        # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
        #    hyphens (-), or underscores (_). The maximum length is 500 characters.
    &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
    &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
        # UpdateJob.
        # 
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      &quot;attributes&quot;: { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
          # be published when a job is delivered. The topic name must be in the
          # same format as required by PubSub&#x27;s
          # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
          # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
          #
          # The topic must be in the same project as the Cloud Scheduler job.
      &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
    },
    &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
        # retry of a previously failed attempt or the next execution time
        # according to the schedule.
    &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
        # schedule. The value of this field must be a time
        # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
        # 
        # Note that some time zones include a provision for
        # daylight savings time. The rules for daylight saving time are
        # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
        # an HTTP request via an http_method such as HTTP
        # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
        # response code in the range [200 - 299]. A failure to receive a response
        # constitutes a failed execution. For a redirected request, the response
        # returned by the redirected request is considered.
      &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
          # will be generated and attached as an `Authorization` header in the HTTP
          # request.
          #
          # This type of authorization should generally only be used when calling
          # Google APIs hosted on *.googleapis.com.
          # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
          # This type of authorization should generally only be used when calling Google
          # APIs hosted on *.googleapis.com.
        &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
            # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
            # will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OAuth token.
            # The service account must be within the same project as the job. The caller
            # must have iam.serviceAccounts.actAs permission for the service account.
      },
      &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
          # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
          # valid values for uri are:
          # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
          # encode some characters for safety and compatibility. The maximum allowed
          # URL length is 2083 characters after encoding.
      &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
          # method is POST, PUT, or PATCH. It is an error to set body on a job with an
          # incompatible HttpMethod.
      &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
          # HTTP request. This map contains the header field names and
          # values. Repeated headers are not supported, but a header value can
          # contain commas. These headers represent a subset of the headers
          # that will accompany the job&#x27;s HTTP request. Some HTTP request
          # headers will be ignored or replaced. A partial list of headers that
          # will be ignored or replaced is below:
          # - Host: This will be computed by Cloud Scheduler and derived from
          # uri.
          # * `Content-Length`: This will be computed by Cloud Scheduler.
          # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
          # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
          # token will be generated and attached as an `Authorization` header in the
          # HTTP request.
          #
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
          # [OpenID Connect
          # token](https://developers.google.com/identity/protocols/OpenIDConnect).
          # This type of authorization can be used for many scenarios, including
          # calling Cloud Run, or endpoints where you intend to validate the token
          # yourself.
        &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
            # to be used for generating OIDC token.
            # The service account must be within the same project as the job. The caller
            # must have iam.serviceAccounts.actAs permission for the service account.
      },
      &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
    },
    &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
        # 
        # Describes the schedule on which the job will be executed.
        # 
        # The schedule can be either of the following types:
        # 
        # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
        # * English-like
        # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
        # 
        # As a general rule, execution `n + 1` of a job will not begin
        # until execution `n` has finished. Cloud Scheduler will never
        # allow two simultaneously outstanding executions. For example,
        # this implies that if the `n+1`th execution is scheduled to run at
        # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
        # execution will not start until `16:15`.
        # A scheduled start time will be delayed if the previous
        # execution has not ended when its scheduled time occurs.
        # 
        # If retry_count &gt; 0 and a job attempt fails,
        # the job will be tried a total of retry_count
        # times, with exponential backoff, until the next scheduled start
        # time.
    &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
        #
        # By default, if a job does not complete successfully (meaning that
        # an acknowledgement is not received from the handler, then it will be retried
        # with exponential backoff according to the settings in RetryConfig.
      &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
          # execution was first attempted. If specified with
          # retry_count, the job will be retried until both
          # limits are reached.
          #
          # The default value for max_retry_duration is zero, which means retry
          # duration is unlimited.
      &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
      &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
          # exponential backoff procedure described by
          # max_doublings.
          #
          # The default value of retry_count is zero.
          #
          # If retry_count is zero, a job attempt will *not* be retried if
          # it fails. Instead the Cloud Scheduler system will wait for the
          # next scheduled execution time.
          #
          # If retry_count is set to a non-zero number then Cloud Scheduler
          # will retry failed attempts, using exponential backoff,
          # retry_count times, or until the next scheduled execution time,
          # whichever comes first.
          #
          # Values greater than 5 and negative values are not allowed.
      &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
          #
          # A job&#x27;s retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries at intervals of
          # max_backoff_duration up to
          # retry_count times.
          #
          # For example, if min_backoff_duration is
          # 10s, max_backoff_duration is 300s, and
          # `max_doublings` is 3, then the a job will first be retried in 10s. The
          # retry interval will double three times, and then increase linearly by
          # 2^3 * 10s.  Finally, the job will retry at intervals of
          # max_backoff_duration until the job has
          # been attempted retry_count times. Thus, the
          # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
          #
          # The default value of this field is 5.
    },
    &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
        # this deadline then the request is cancelled and the attempt is marked as a
        # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
        # execution logs. Cloud Scheduler will retry the job according
        # to the RetryConfig.
        # 
        # The allowed duration for this deadline is:
        # 
        # * For HTTP targets, between 15 seconds and 30 minutes.
        # * For App Engine HTTP targets, between 15
        #   seconds and 24 hours.
        # * For PubSub targets, this field is ignored.
    &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
  }

  updateMask: string, A  mask used to specify which fields of the job are being updated.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Configuration for a job.
        # The maximum allowed size for a job is 100KB.
      &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
          # of an HTTP request via an http_method such
          # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
          # HTTP response code in the range [200 - 299]. Error 503 is
          # considered an App Engine system error instead of an application
          # error. Requests returning error 503 will be retried regardless of
          # retry configuration and not counted against retry counts. Any other
          # response code, or a failure to receive a response before the
          # deadline, constitutes a failed attempt.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
            # It can contain a path, query string arguments, and `#` fragments.
            # If the relative URL is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
        &quot;body&quot;: &quot;A String&quot;, # Body.
            #
            # HTTP request body. A request body is allowed only if the HTTP method is
            # POST or PUT. It will result in invalid argument error to set a body on a
            # job with an incompatible HttpMethod.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values. Headers can be set
            # when the job is created.
            #
            # Cloud Scheduler sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Scheduler will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            # * `X-CloudScheduler`: This header will be set to true.
            #
            # If the job has an body, Cloud Scheduler sets
            # the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
            #   setting `Content-Type` to a particular media type when the job is
            #   created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Scheduler. This value is
            #   output only. It cannot be changed.
            #
            # The headers below are output only. They cannot be set or overridden:
            #
            # * `X-Google-*`: For Google internal use only.
            # * `X-AppEngine-*`: For Google internal use only.
            #
            # In addition, some App Engine headers, which contain
            # job-specific information, are also be sent to the job handler.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the job is sent to an instance which is available when
              # the job is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the job is sent to the service which is the default
              # service when the job is attempted.
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the job is sent to the version which is the default
              # version when the job is attempted.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
              #
              # For more information about how App Engine requests are routed, see
              # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
              #
              # The host is constructed as:
              #
              #
              # * `host = [application_domain_name]`&lt;/br&gt;
              #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
              #
              # * `application_domain_name` = The domain name of the app, for
              #   example &lt;app-id&gt;.appspot.com, which is associated with the
              #   job&#x27;s project ID.
              #
              # * `service =` service
              #
              # * `version =` version
              #
              # * `version_dot_service =`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance =` instance
              #
              # * `instance_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance_dot_version =`
              #   instance `+ &#x27;.&#x27; +`
              #   version
              #
              # * `instance_dot_version_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              #
              # If service is empty, then the job will be sent
              # to the service which is the default service when the job is attempted.
              #
              # If version is empty, then the job will be sent
              # to the version which is the default version when the job is attempted.
              #
              # If instance is empty, then the job will be
              # sent to an instance which is available when the job is attempted.
              #
              # If service,
              # version, or
              # instance is invalid, then the job will be sent
              # to the default version of the default service when the job is attempted.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
            # permitted.
      },
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
          # which it becomes output only.
          #
          # The job name. For example:
          # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
      &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
          # UpdateJob.
          #
          # A human-readable description for the job. This string must not contain
          # more than 500 characters.
      &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
          # the given Pub/Sub topic.
        &quot;attributes&quot;: { # Attributes for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
            # be published when a job is delivered. The topic name must be in the
            # same format as required by PubSub&#x27;s
            # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
            # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
            #
            # The topic must be in the same project as the Cloud Scheduler job.
        &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
          # retry of a previously failed attempt or the next execution time
          # according to the schedule.
      &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
          # schedule. The value of this field must be a time
          # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
          #
          # Note that some time zones include a provision for
          # daylight savings time. The rules for daylight saving time are
          # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
          # time zone is not specified, the default will be in UTC (also known
          # as GMT).
      &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
          # an HTTP request via an http_method such as HTTP
          # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
          # response code in the range [200 - 299]. A failure to receive a response
          # constitutes a failed execution. For a redirected request, the response
          # returned by the redirected request is considered.
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
            # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
            # valid values for uri are:
            # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
            # method is POST, PUT, or PATCH. It is an error to set body on a job with an
            # incompatible HttpMethod.
        &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
            # HTTP request. This map contains the header field names and
            # values. Repeated headers are not supported, but a header value can
            # contain commas. These headers represent a subset of the headers
            # that will accompany the job&#x27;s HTTP request. Some HTTP request
            # headers will be ignored or replaced. A partial list of headers that
            # will be ignored or replaced is below:
            # - Host: This will be computed by Cloud Scheduler and derived from
            # uri.
            # * `Content-Length`: This will be computed by Cloud Scheduler.
            # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
            # * `X-Google-*`: Google internal use only.
            # * `X-AppEngine-*`: Google internal use only.
            #
            # The total size of headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
      },
      &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
          #
          # Describes the schedule on which the job will be executed.
          #
          # The schedule can be either of the following types:
          #
          # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
          # * English-like
          # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
          #
          # As a general rule, execution `n + 1` of a job will not begin
          # until execution `n` has finished. Cloud Scheduler will never
          # allow two simultaneously outstanding executions. For example,
          # this implies that if the `n+1`th execution is scheduled to run at
          # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
          # execution will not start until `16:15`.
          # A scheduled start time will be delayed if the previous
          # execution has not ended when its scheduled time occurs.
          #
          # If retry_count &gt; 0 and a job attempt fails,
          # the job will be tried a total of retry_count
          # times, with exponential backoff, until the next scheduled start
          # time.
      &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
          #
          # By default, if a job does not complete successfully (meaning that
          # an acknowledgement is not received from the handler, then it will be retried
          # with exponential backoff according to the settings in RetryConfig.
        &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
            # execution was first attempted. If specified with
            # retry_count, the job will be retried until both
            # limits are reached.
            #
            # The default value for max_retry_duration is zero, which means retry
            # duration is unlimited.
        &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 5 seconds.
        &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
            # exponential backoff procedure described by
            # max_doublings.
            #
            # The default value of retry_count is zero.
            #
            # If retry_count is zero, a job attempt will *not* be retried if
            # it fails. Instead the Cloud Scheduler system will wait for the
            # next scheduled execution time.
            #
            # If retry_count is set to a non-zero number then Cloud Scheduler
            # will retry failed attempts, using exponential backoff,
            # retry_count times, or until the next scheduled execution time,
            # whichever comes first.
            #
            # Values greater than 5 and negative values are not allowed.
        &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 1 hour.
        &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
            #
            # A job&#x27;s retry interval starts at
            # min_backoff_duration, then doubles
            # `max_doublings` times, then increases linearly, and finally
            # retries at intervals of
            # max_backoff_duration up to
            # retry_count times.
            #
            # For example, if min_backoff_duration is
            # 10s, max_backoff_duration is 300s, and
            # `max_doublings` is 3, then the a job will first be retried in 10s. The
            # retry interval will double three times, and then increase linearly by
            # 2^3 * 10s.  Finally, the job will retry at intervals of
            # max_backoff_duration until the job has
            # been attempted retry_count times. Thus, the
            # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
            #
            # The default value of this field is 5.
      },
      &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
      },
      &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
          # this deadline then the request is cancelled and the attempt is marked as a
          # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
          # execution logs. Cloud Scheduler will retry the job according
          # to the RetryConfig.
          #
          # The allowed duration for this deadline is:
          #
          # * For HTTP targets, between 15 seconds and 30 minutes.
          # * For App Engine HTTP targets, between 15
          #   seconds and 24 hours.
          # * For PubSub targets, this field is ignored.
      &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
    }</pre>
</div>

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

If a job is paused then the system will stop executing the job
until it is re-enabled via ResumeJob. The
state of the job is stored in state; if paused it
will be set to Job.State.PAUSED. A job must be in Job.State.ENABLED
to be paused.

Args:
  name: string, Required. The job name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_ID`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for PauseJob.
  }

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

Returns:
  An object of the form:

    { # Configuration for a job.
        # The maximum allowed size for a job is 100KB.
      &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
          # of an HTTP request via an http_method such
          # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
          # HTTP response code in the range [200 - 299]. Error 503 is
          # considered an App Engine system error instead of an application
          # error. Requests returning error 503 will be retried regardless of
          # retry configuration and not counted against retry counts. Any other
          # response code, or a failure to receive a response before the
          # deadline, constitutes a failed attempt.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
            # It can contain a path, query string arguments, and `#` fragments.
            # If the relative URL is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
        &quot;body&quot;: &quot;A String&quot;, # Body.
            #
            # HTTP request body. A request body is allowed only if the HTTP method is
            # POST or PUT. It will result in invalid argument error to set a body on a
            # job with an incompatible HttpMethod.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values. Headers can be set
            # when the job is created.
            #
            # Cloud Scheduler sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Scheduler will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            # * `X-CloudScheduler`: This header will be set to true.
            #
            # If the job has an body, Cloud Scheduler sets
            # the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
            #   setting `Content-Type` to a particular media type when the job is
            #   created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Scheduler. This value is
            #   output only. It cannot be changed.
            #
            # The headers below are output only. They cannot be set or overridden:
            #
            # * `X-Google-*`: For Google internal use only.
            # * `X-AppEngine-*`: For Google internal use only.
            #
            # In addition, some App Engine headers, which contain
            # job-specific information, are also be sent to the job handler.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the job is sent to an instance which is available when
              # the job is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the job is sent to the service which is the default
              # service when the job is attempted.
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the job is sent to the version which is the default
              # version when the job is attempted.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
              #
              # For more information about how App Engine requests are routed, see
              # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
              #
              # The host is constructed as:
              #
              #
              # * `host = [application_domain_name]`&lt;/br&gt;
              #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
              #
              # * `application_domain_name` = The domain name of the app, for
              #   example &lt;app-id&gt;.appspot.com, which is associated with the
              #   job&#x27;s project ID.
              #
              # * `service =` service
              #
              # * `version =` version
              #
              # * `version_dot_service =`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance =` instance
              #
              # * `instance_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance_dot_version =`
              #   instance `+ &#x27;.&#x27; +`
              #   version
              #
              # * `instance_dot_version_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              #
              # If service is empty, then the job will be sent
              # to the service which is the default service when the job is attempted.
              #
              # If version is empty, then the job will be sent
              # to the version which is the default version when the job is attempted.
              #
              # If instance is empty, then the job will be
              # sent to an instance which is available when the job is attempted.
              #
              # If service,
              # version, or
              # instance is invalid, then the job will be sent
              # to the default version of the default service when the job is attempted.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
            # permitted.
      },
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
          # which it becomes output only.
          #
          # The job name. For example:
          # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
      &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
          # UpdateJob.
          #
          # A human-readable description for the job. This string must not contain
          # more than 500 characters.
      &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
          # the given Pub/Sub topic.
        &quot;attributes&quot;: { # Attributes for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
            # be published when a job is delivered. The topic name must be in the
            # same format as required by PubSub&#x27;s
            # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
            # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
            #
            # The topic must be in the same project as the Cloud Scheduler job.
        &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
          # retry of a previously failed attempt or the next execution time
          # according to the schedule.
      &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
          # schedule. The value of this field must be a time
          # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
          #
          # Note that some time zones include a provision for
          # daylight savings time. The rules for daylight saving time are
          # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
          # time zone is not specified, the default will be in UTC (also known
          # as GMT).
      &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
          # an HTTP request via an http_method such as HTTP
          # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
          # response code in the range [200 - 299]. A failure to receive a response
          # constitutes a failed execution. For a redirected request, the response
          # returned by the redirected request is considered.
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
            # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
            # valid values for uri are:
            # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
            # method is POST, PUT, or PATCH. It is an error to set body on a job with an
            # incompatible HttpMethod.
        &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
            # HTTP request. This map contains the header field names and
            # values. Repeated headers are not supported, but a header value can
            # contain commas. These headers represent a subset of the headers
            # that will accompany the job&#x27;s HTTP request. Some HTTP request
            # headers will be ignored or replaced. A partial list of headers that
            # will be ignored or replaced is below:
            # - Host: This will be computed by Cloud Scheduler and derived from
            # uri.
            # * `Content-Length`: This will be computed by Cloud Scheduler.
            # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
            # * `X-Google-*`: Google internal use only.
            # * `X-AppEngine-*`: Google internal use only.
            #
            # The total size of headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
      },
      &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
          #
          # Describes the schedule on which the job will be executed.
          #
          # The schedule can be either of the following types:
          #
          # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
          # * English-like
          # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
          #
          # As a general rule, execution `n + 1` of a job will not begin
          # until execution `n` has finished. Cloud Scheduler will never
          # allow two simultaneously outstanding executions. For example,
          # this implies that if the `n+1`th execution is scheduled to run at
          # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
          # execution will not start until `16:15`.
          # A scheduled start time will be delayed if the previous
          # execution has not ended when its scheduled time occurs.
          #
          # If retry_count &gt; 0 and a job attempt fails,
          # the job will be tried a total of retry_count
          # times, with exponential backoff, until the next scheduled start
          # time.
      &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
          #
          # By default, if a job does not complete successfully (meaning that
          # an acknowledgement is not received from the handler, then it will be retried
          # with exponential backoff according to the settings in RetryConfig.
        &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
            # execution was first attempted. If specified with
            # retry_count, the job will be retried until both
            # limits are reached.
            #
            # The default value for max_retry_duration is zero, which means retry
            # duration is unlimited.
        &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 5 seconds.
        &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
            # exponential backoff procedure described by
            # max_doublings.
            #
            # The default value of retry_count is zero.
            #
            # If retry_count is zero, a job attempt will *not* be retried if
            # it fails. Instead the Cloud Scheduler system will wait for the
            # next scheduled execution time.
            #
            # If retry_count is set to a non-zero number then Cloud Scheduler
            # will retry failed attempts, using exponential backoff,
            # retry_count times, or until the next scheduled execution time,
            # whichever comes first.
            #
            # Values greater than 5 and negative values are not allowed.
        &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 1 hour.
        &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
            #
            # A job&#x27;s retry interval starts at
            # min_backoff_duration, then doubles
            # `max_doublings` times, then increases linearly, and finally
            # retries at intervals of
            # max_backoff_duration up to
            # retry_count times.
            #
            # For example, if min_backoff_duration is
            # 10s, max_backoff_duration is 300s, and
            # `max_doublings` is 3, then the a job will first be retried in 10s. The
            # retry interval will double three times, and then increase linearly by
            # 2^3 * 10s.  Finally, the job will retry at intervals of
            # max_backoff_duration until the job has
            # been attempted retry_count times. Thus, the
            # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
            #
            # The default value of this field is 5.
      },
      &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
      },
      &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
          # this deadline then the request is cancelled and the attempt is marked as a
          # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
          # execution logs. Cloud Scheduler will retry the job according
          # to the RetryConfig.
          #
          # The allowed duration for this deadline is:
          #
          # * For HTTP targets, between 15 seconds and 30 minutes.
          # * For App Engine HTTP targets, between 15
          #   seconds and 24 hours.
          # * For PubSub targets, this field is ignored.
      &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
    }</pre>
</div>

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

This method reenables a job after it has been Job.State.PAUSED. The
state of a job is stored in Job.state; after calling this method it
will be set to Job.State.ENABLED. A job must be in
Job.State.PAUSED to be resumed.

Args:
  name: string, Required. The job name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_ID`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for ResumeJob.
  }

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

Returns:
  An object of the form:

    { # Configuration for a job.
        # The maximum allowed size for a job is 100KB.
      &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
          # of an HTTP request via an http_method such
          # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
          # HTTP response code in the range [200 - 299]. Error 503 is
          # considered an App Engine system error instead of an application
          # error. Requests returning error 503 will be retried regardless of
          # retry configuration and not counted against retry counts. Any other
          # response code, or a failure to receive a response before the
          # deadline, constitutes a failed attempt.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
            # It can contain a path, query string arguments, and `#` fragments.
            # If the relative URL is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
        &quot;body&quot;: &quot;A String&quot;, # Body.
            #
            # HTTP request body. A request body is allowed only if the HTTP method is
            # POST or PUT. It will result in invalid argument error to set a body on a
            # job with an incompatible HttpMethod.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values. Headers can be set
            # when the job is created.
            #
            # Cloud Scheduler sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Scheduler will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            # * `X-CloudScheduler`: This header will be set to true.
            #
            # If the job has an body, Cloud Scheduler sets
            # the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
            #   setting `Content-Type` to a particular media type when the job is
            #   created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Scheduler. This value is
            #   output only. It cannot be changed.
            #
            # The headers below are output only. They cannot be set or overridden:
            #
            # * `X-Google-*`: For Google internal use only.
            # * `X-AppEngine-*`: For Google internal use only.
            #
            # In addition, some App Engine headers, which contain
            # job-specific information, are also be sent to the job handler.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the job is sent to an instance which is available when
              # the job is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the job is sent to the service which is the default
              # service when the job is attempted.
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the job is sent to the version which is the default
              # version when the job is attempted.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
              #
              # For more information about how App Engine requests are routed, see
              # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
              #
              # The host is constructed as:
              #
              #
              # * `host = [application_domain_name]`&lt;/br&gt;
              #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
              #
              # * `application_domain_name` = The domain name of the app, for
              #   example &lt;app-id&gt;.appspot.com, which is associated with the
              #   job&#x27;s project ID.
              #
              # * `service =` service
              #
              # * `version =` version
              #
              # * `version_dot_service =`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance =` instance
              #
              # * `instance_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance_dot_version =`
              #   instance `+ &#x27;.&#x27; +`
              #   version
              #
              # * `instance_dot_version_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              #
              # If service is empty, then the job will be sent
              # to the service which is the default service when the job is attempted.
              #
              # If version is empty, then the job will be sent
              # to the version which is the default version when the job is attempted.
              #
              # If instance is empty, then the job will be
              # sent to an instance which is available when the job is attempted.
              #
              # If service,
              # version, or
              # instance is invalid, then the job will be sent
              # to the default version of the default service when the job is attempted.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
            # permitted.
      },
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
          # which it becomes output only.
          #
          # The job name. For example:
          # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
      &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
          # UpdateJob.
          #
          # A human-readable description for the job. This string must not contain
          # more than 500 characters.
      &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
          # the given Pub/Sub topic.
        &quot;attributes&quot;: { # Attributes for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
            # be published when a job is delivered. The topic name must be in the
            # same format as required by PubSub&#x27;s
            # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
            # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
            #
            # The topic must be in the same project as the Cloud Scheduler job.
        &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
          # retry of a previously failed attempt or the next execution time
          # according to the schedule.
      &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
          # schedule. The value of this field must be a time
          # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
          #
          # Note that some time zones include a provision for
          # daylight savings time. The rules for daylight saving time are
          # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
          # time zone is not specified, the default will be in UTC (also known
          # as GMT).
      &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
          # an HTTP request via an http_method such as HTTP
          # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
          # response code in the range [200 - 299]. A failure to receive a response
          # constitutes a failed execution. For a redirected request, the response
          # returned by the redirected request is considered.
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
            # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
            # valid values for uri are:
            # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
            # method is POST, PUT, or PATCH. It is an error to set body on a job with an
            # incompatible HttpMethod.
        &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
            # HTTP request. This map contains the header field names and
            # values. Repeated headers are not supported, but a header value can
            # contain commas. These headers represent a subset of the headers
            # that will accompany the job&#x27;s HTTP request. Some HTTP request
            # headers will be ignored or replaced. A partial list of headers that
            # will be ignored or replaced is below:
            # - Host: This will be computed by Cloud Scheduler and derived from
            # uri.
            # * `Content-Length`: This will be computed by Cloud Scheduler.
            # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
            # * `X-Google-*`: Google internal use only.
            # * `X-AppEngine-*`: Google internal use only.
            #
            # The total size of headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
      },
      &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
          #
          # Describes the schedule on which the job will be executed.
          #
          # The schedule can be either of the following types:
          #
          # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
          # * English-like
          # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
          #
          # As a general rule, execution `n + 1` of a job will not begin
          # until execution `n` has finished. Cloud Scheduler will never
          # allow two simultaneously outstanding executions. For example,
          # this implies that if the `n+1`th execution is scheduled to run at
          # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
          # execution will not start until `16:15`.
          # A scheduled start time will be delayed if the previous
          # execution has not ended when its scheduled time occurs.
          #
          # If retry_count &gt; 0 and a job attempt fails,
          # the job will be tried a total of retry_count
          # times, with exponential backoff, until the next scheduled start
          # time.
      &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
          #
          # By default, if a job does not complete successfully (meaning that
          # an acknowledgement is not received from the handler, then it will be retried
          # with exponential backoff according to the settings in RetryConfig.
        &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
            # execution was first attempted. If specified with
            # retry_count, the job will be retried until both
            # limits are reached.
            #
            # The default value for max_retry_duration is zero, which means retry
            # duration is unlimited.
        &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 5 seconds.
        &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
            # exponential backoff procedure described by
            # max_doublings.
            #
            # The default value of retry_count is zero.
            #
            # If retry_count is zero, a job attempt will *not* be retried if
            # it fails. Instead the Cloud Scheduler system will wait for the
            # next scheduled execution time.
            #
            # If retry_count is set to a non-zero number then Cloud Scheduler
            # will retry failed attempts, using exponential backoff,
            # retry_count times, or until the next scheduled execution time,
            # whichever comes first.
            #
            # Values greater than 5 and negative values are not allowed.
        &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 1 hour.
        &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
            #
            # A job&#x27;s retry interval starts at
            # min_backoff_duration, then doubles
            # `max_doublings` times, then increases linearly, and finally
            # retries at intervals of
            # max_backoff_duration up to
            # retry_count times.
            #
            # For example, if min_backoff_duration is
            # 10s, max_backoff_duration is 300s, and
            # `max_doublings` is 3, then the a job will first be retried in 10s. The
            # retry interval will double three times, and then increase linearly by
            # 2^3 * 10s.  Finally, the job will retry at intervals of
            # max_backoff_duration until the job has
            # been attempted retry_count times. Thus, the
            # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
            #
            # The default value of this field is 5.
      },
      &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
      },
      &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
          # this deadline then the request is cancelled and the attempt is marked as a
          # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
          # execution logs. Cloud Scheduler will retry the job according
          # to the RetryConfig.
          #
          # The allowed duration for this deadline is:
          #
          # * For HTTP targets, between 15 seconds and 30 minutes.
          # * For App Engine HTTP targets, between 15
          #   seconds and 24 hours.
          # * For PubSub targets, this field is ignored.
      &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
    }</pre>
</div>

<div class="method">
    <code class="details" id="run">run(name, body=None, x__xgafv=None)</code>
  <pre>Forces a job to run now.

When this method is called, Cloud Scheduler will dispatch the job, even
if the job is already running.

Args:
  name: string, Required. The job name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_ID`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for forcing a job to run now using
      # RunJob.
  }

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

Returns:
  An object of the form:

    { # Configuration for a job.
        # The maximum allowed size for a job is 100KB.
      &quot;appEngineHttpTarget&quot;: { # App Engine target. The job will be pushed to a job handler by means # App Engine HTTP target.
          # of an HTTP request via an http_method such
          # as HTTP POST, HTTP GET, etc. The job is acknowledged by means of an
          # HTTP response code in the range [200 - 299]. Error 503 is
          # considered an App Engine system error instead of an application
          # error. Requests returning error 503 will be retried regardless of
          # retry configuration and not counted against retry counts. Any other
          # response code, or a failure to receive a response before the
          # deadline, constitutes a failed attempt.
        &quot;relativeUri&quot;: &quot;A String&quot;, # The relative URI.
            #
            # The relative URL must begin with &quot;/&quot; and must be a valid HTTP relative URL.
            # It can contain a path, query string arguments, and `#` fragments.
            # If the relative URL is empty, then the root path &quot;/&quot; will be used.
            # No spaces are allowed, and the maximum length allowed is 2083 characters.
        &quot;body&quot;: &quot;A String&quot;, # Body.
            #
            # HTTP request body. A request body is allowed only if the HTTP method is
            # POST or PUT. It will result in invalid argument error to set a body on a
            # job with an incompatible HttpMethod.
        &quot;headers&quot;: { # HTTP request headers.
            #
            # This map contains the header field names and values. Headers can be set
            # when the job is created.
            #
            # Cloud Scheduler sets some headers to default values:
            #
            # * `User-Agent`: By default, this header is
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;`.
            #   This header can be modified, but Cloud Scheduler will append
            #   `&quot;AppEngine-Google; (+http://code.google.com/appengine)&quot;` to the
            #   modified `User-Agent`.
            # * `X-CloudScheduler`: This header will be set to true.
            #
            # If the job has an body, Cloud Scheduler sets
            # the following headers:
            #
            # * `Content-Type`: By default, the `Content-Type` header is set to
            #   `&quot;application/octet-stream&quot;`. The default can be overridden by explictly
            #   setting `Content-Type` to a particular media type when the job is
            #   created.
            #   For example, `Content-Type` can be set to `&quot;application/json&quot;`.
            # * `Content-Length`: This is computed by Cloud Scheduler. This value is
            #   output only. It cannot be changed.
            #
            # The headers below are output only. They cannot be set or overridden:
            #
            # * `X-Google-*`: For Google internal use only.
            # * `X-AppEngine-*`: For Google internal use only.
            #
            # In addition, some App Engine headers, which contain
            # job-specific information, are also be sent to the job handler.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;appEngineRouting&quot;: { # App Engine Routing. # App Engine Routing setting for the job.
            #
            # For more information about services, versions, and instances see
            # [An Overview of App
            # Engine](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine),
            # [Microservices Architecture on Google App
            # Engine](https://cloud.google.com/appengine/docs/python/microservices-on-app-engine),
            # [App Engine Standard request
            # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed),
            # and [App Engine Flex request
            # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;instance&quot;: &quot;A String&quot;, # App instance.
              #
              # By default, the job is sent to an instance which is available when
              # the job is attempted.
              #
              # Requests can only be sent to a specific instance if
              # [manual scaling is used in App Engine
              # Standard](https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine?hl=en_US#scaling_types_and_instance_classes).
              # App Engine Flex does not support instances. For more information, see
              # [App Engine Standard request
              # routing](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed)
              # and [App Engine Flex request
              # routing](https://cloud.google.com/appengine/docs/flexible/python/how-requests-are-routed).
          &quot;service&quot;: &quot;A String&quot;, # App service.
              #
              # By default, the job is sent to the service which is the default
              # service when the job is attempted.
          &quot;version&quot;: &quot;A String&quot;, # App version.
              #
              # By default, the job is sent to the version which is the default
              # version when the job is attempted.
          &quot;host&quot;: &quot;A String&quot;, # Output only. The host that the job is sent to.
              #
              # For more information about how App Engine requests are routed, see
              # [here](https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed).
              #
              # The host is constructed as:
              #
              #
              # * `host = [application_domain_name]`&lt;/br&gt;
              #   `| [service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [version_dot_service]+ &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_service] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version] + &#x27;.&#x27; + [application_domain_name]`&lt;/br&gt;
              #   `| [instance_dot_version_dot_service] + &#x27;.&#x27; + [application_domain_name]`
              #
              # * `application_domain_name` = The domain name of the app, for
              #   example &lt;app-id&gt;.appspot.com, which is associated with the
              #   job&#x27;s project ID.
              #
              # * `service =` service
              #
              # * `version =` version
              #
              # * `version_dot_service =`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance =` instance
              #
              # * `instance_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   service
              #
              # * `instance_dot_version =`
              #   instance `+ &#x27;.&#x27; +`
              #   version
              #
              # * `instance_dot_version_dot_service =`
              #   instance `+ &#x27;.&#x27; +`
              #   version `+ &#x27;.&#x27; +`
              #   service
              #
              #
              # If service is empty, then the job will be sent
              # to the service which is the default service when the job is attempted.
              #
              # If version is empty, then the job will be sent
              # to the version which is the default version when the job is attempted.
              #
              # If instance is empty, then the job will be
              # sent to an instance which is available when the job is attempted.
              #
              # If service,
              # version, or
              # instance is invalid, then the job will be sent
              # to the default version of the default service when the job is attempted.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # The HTTP method to use for the request. PATCH and OPTIONS are not
            # permitted.
      },
      &quot;state&quot;: &quot;A String&quot;, # Output only. State of the job.
      &quot;name&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob, after
          # which it becomes output only.
          #
          # The job name. For example:
          # `projects/PROJECT_ID/locations/LOCATION_ID/jobs/JOB_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 job&#x27;s location.
          #    The list of available locations can be obtained by calling
          #    ListLocations.
          #    For more information, see https://cloud.google.com/about/locations/.
          # * `JOB_ID` can contain only letters ([A-Za-z]), numbers ([0-9]),
          #    hyphens (-), or underscores (_). The maximum length is 500 characters.
      &quot;userUpdateTime&quot;: &quot;A String&quot;, # Output only. The creation time of the job.
      &quot;description&quot;: &quot;A String&quot;, # Optionally caller-specified in CreateJob or
          # UpdateJob.
          #
          # A human-readable description for the job. This string must not contain
          # more than 500 characters.
      &quot;pubsubTarget&quot;: { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
          # the given Pub/Sub topic.
        &quot;attributes&quot;: { # Attributes for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;topicName&quot;: &quot;A String&quot;, # Required. The name of the Cloud Pub/Sub topic to which messages will
            # be published when a job is delivered. The topic name must be in the
            # same format as required by PubSub&#x27;s
            # [PublishRequest.name](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#publishrequest),
            # for example `projects/PROJECT_ID/topics/TOPIC_ID`.
            #
            # The topic must be in the same project as the Cloud Scheduler job.
        &quot;data&quot;: &quot;A String&quot;, # The message payload for PubsubMessage.
            #
            # Pubsub message must contain either non-empty data, or at least one
            # attribute.
      },
      &quot;scheduleTime&quot;: &quot;A String&quot;, # Output only. The next time the job is scheduled. Note that this may be a
          # retry of a previously failed attempt or the next execution time
          # according to the schedule.
      &quot;timeZone&quot;: &quot;A String&quot;, # Specifies the time zone to be used in interpreting
          # schedule. The value of this field must be a time
          # zone name from the [tz database](http://en.wikipedia.org/wiki/Tz_database).
          #
          # Note that some time zones include a provision for
          # daylight savings time. The rules for daylight saving time are
          # determined by the chosen tz. For UTC use the string &quot;utc&quot;. If a
          # time zone is not specified, the default will be in UTC (also known
          # as GMT).
      &quot;httpTarget&quot;: { # Http target. The job will be pushed to the job handler by means of # HTTP target.
          # an HTTP request via an http_method such as HTTP
          # POST, HTTP GET, etc. The job is acknowledged by means of an HTTP
          # response code in the range [200 - 299]. A failure to receive a response
          # constitutes a failed execution. For a redirected request, the response
          # returned by the redirected request is considered.
        &quot;oauthToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2)
            # will be generated and attached as an `Authorization` header in the HTTP
            # request.
            #
            # This type of authorization should generally only be used when calling
            # Google APIs hosted on *.googleapis.com.
            # [OAuth token](https://developers.google.com/identity/protocols/OAuth2).
            # This type of authorization should generally only be used when calling Google
            # APIs hosted on *.googleapis.com.
          &quot;scope&quot;: &quot;A String&quot;, # OAuth scope to be used for generating OAuth access token.
              # If not specified, &quot;https://www.googleapis.com/auth/cloud-platform&quot;
              # will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OAuth token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;uri&quot;: &quot;A String&quot;, # Required. The full URI path that the request will be sent to. This string
            # must begin with either &quot;http://&quot; or &quot;https://&quot;. Some examples of
            # valid values for uri are:
            # `http://acme.com` and `https://acme.com/sales:8080`. Cloud Scheduler will
            # encode some characters for safety and compatibility. The maximum allowed
            # URL length is 2083 characters after encoding.
        &quot;body&quot;: &quot;A String&quot;, # HTTP request body. A request body is allowed only if the HTTP
            # method is POST, PUT, or PATCH. It is an error to set body on a job with an
            # incompatible HttpMethod.
        &quot;headers&quot;: { # The user can specify HTTP request headers to send with the job&#x27;s
            # HTTP request. This map contains the header field names and
            # values. Repeated headers are not supported, but a header value can
            # contain commas. These headers represent a subset of the headers
            # that will accompany the job&#x27;s HTTP request. Some HTTP request
            # headers will be ignored or replaced. A partial list of headers that
            # will be ignored or replaced is below:
            # - Host: This will be computed by Cloud Scheduler and derived from
            # uri.
            # * `Content-Length`: This will be computed by Cloud Scheduler.
            # * `User-Agent`: This will be set to `&quot;Google-Cloud-Scheduler&quot;`.
            # * `X-Google-*`: Google internal use only.
            # * `X-AppEngine-*`: Google internal use only.
            #
            # The total size of headers must be less than 80KB.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;oidcToken&quot;: { # Contains information needed for generating an # If specified, an
            # [OIDC](https://developers.google.com/identity/protocols/OpenIDConnect)
            # token will be generated and attached as an `Authorization` header in the
            # HTTP request.
            #
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
            # [OpenID Connect
            # token](https://developers.google.com/identity/protocols/OpenIDConnect).
            # This type of authorization can be used for many scenarios, including
            # calling Cloud Run, or endpoints where you intend to validate the token
            # yourself.
          &quot;audience&quot;: &quot;A String&quot;, # Audience to be used when generating OIDC token. If not specified, the URI
              # specified in target will be used.
          &quot;serviceAccountEmail&quot;: &quot;A String&quot;, # [Service account email](https://cloud.google.com/iam/docs/service-accounts)
              # to be used for generating OIDC token.
              # The service account must be within the same project as the job. The caller
              # must have iam.serviceAccounts.actAs permission for the service account.
        },
        &quot;httpMethod&quot;: &quot;A String&quot;, # Which HTTP method to use for the request.
      },
      &quot;schedule&quot;: &quot;A String&quot;, # Required, except when used with UpdateJob.
          #
          # Describes the schedule on which the job will be executed.
          #
          # The schedule can be either of the following types:
          #
          # * [Crontab](http://en.wikipedia.org/wiki/Cron#Overview)
          # * English-like
          # [schedule](https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)
          #
          # As a general rule, execution `n + 1` of a job will not begin
          # until execution `n` has finished. Cloud Scheduler will never
          # allow two simultaneously outstanding executions. For example,
          # this implies that if the `n+1`th execution is scheduled to run at
          # 16:00 but the `n`th execution takes until 16:15, the `n+1`th
          # execution will not start until `16:15`.
          # A scheduled start time will be delayed if the previous
          # execution has not ended when its scheduled time occurs.
          #
          # If retry_count &gt; 0 and a job attempt fails,
          # the job will be tried a total of retry_count
          # times, with exponential backoff, until the next scheduled start
          # time.
      &quot;retryConfig&quot;: { # Settings that determine the retry behavior. # Settings that determine the retry behavior.
          #
          # By default, if a job does not complete successfully (meaning that
          # an acknowledgement is not received from the handler, then it will be retried
          # with exponential backoff according to the settings in RetryConfig.
        &quot;maxRetryDuration&quot;: &quot;A String&quot;, # The time limit for retrying a failed job, measured from time when an
            # execution was first attempted. If specified with
            # retry_count, the job will be retried until both
            # limits are reached.
            #
            # The default value for max_retry_duration is zero, which means retry
            # duration is unlimited.
        &quot;minBackoffDuration&quot;: &quot;A String&quot;, # The minimum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 5 seconds.
        &quot;retryCount&quot;: 42, # The number of attempts that the system will make to run a job using the
            # exponential backoff procedure described by
            # max_doublings.
            #
            # The default value of retry_count is zero.
            #
            # If retry_count is zero, a job attempt will *not* be retried if
            # it fails. Instead the Cloud Scheduler system will wait for the
            # next scheduled execution time.
            #
            # If retry_count is set to a non-zero number then Cloud Scheduler
            # will retry failed attempts, using exponential backoff,
            # retry_count times, or until the next scheduled execution time,
            # whichever comes first.
            #
            # Values greater than 5 and negative values are not allowed.
        &quot;maxBackoffDuration&quot;: &quot;A String&quot;, # The maximum amount of time to wait before retrying a job after
            # it fails.
            #
            # The default value of this field is 1 hour.
        &quot;maxDoublings&quot;: 42, # The time between retries will double `max_doublings` times.
            #
            # A job&#x27;s retry interval starts at
            # min_backoff_duration, then doubles
            # `max_doublings` times, then increases linearly, and finally
            # retries at intervals of
            # max_backoff_duration up to
            # retry_count times.
            #
            # For example, if min_backoff_duration is
            # 10s, max_backoff_duration is 300s, and
            # `max_doublings` is 3, then the a job will first be retried in 10s. The
            # retry interval will double three times, and then increase linearly by
            # 2^3 * 10s.  Finally, the job will retry at intervals of
            # max_backoff_duration until the job has
            # been attempted retry_count times. Thus, the
            # requests will retry at 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, ....
            #
            # The default value of this field is 5.
      },
      &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Output only. The response from the target for the last attempted execution.
          # different programming environments, including REST APIs and RPC APIs. It is
          # used by [gRPC](https://github.com/grpc). Each `Status` message contains
          # three pieces of data: error code, error message, and error details.
          #
          # You can find out more about this error model and how to work with it in the
          # [API Design Guide](https://cloud.google.com/apis/design/errors).
        &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
        &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
            # user-facing error message should be localized and sent in the
            # google.rpc.Status.details field, or localized by the client.
        &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
            # message types for APIs to use.
          {
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
        ],
      },
      &quot;attemptDeadline&quot;: &quot;A String&quot;, # The deadline for job attempts. If the request handler does not respond by
          # this deadline then the request is cancelled and the attempt is marked as a
          # `DEADLINE_EXCEEDED` failure. The failed attempt can be viewed in
          # execution logs. Cloud Scheduler will retry the job according
          # to the RetryConfig.
          #
          # The allowed duration for this deadline is:
          #
          # * For HTTP targets, between 15 seconds and 30 minutes.
          # * For App Engine HTTP targets, between 15
          #   seconds and 24 hours.
          # * For PubSub targets, this field is ignored.
      &quot;lastAttemptTime&quot;: &quot;A String&quot;, # Output only. The time the last job attempt started.
    }</pre>
</div>

</body></html>