<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, 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, pageSize=None, pageToken=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, 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, 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. (required)
    The object takes the form of:

{ # Configuration for a job.
    # The maximum allowed size for a job is 100KB.
  "status": { # 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).
    "message": "A String", # 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.
    "code": 42, # The status code, which should be an enum value of google.rpc.Code.
    "details": [ # A list of messages that carry the error details.  There is a common set of
        # message types for APIs to use.
      {
        "a_key": "", # Properties of the object. Contains field @type with type URL.
      },
    ],
  },
  "description": "A String", # Optionally caller-specified in CreateJob or
      # UpdateJob.
      # 
      # A human-readable description for the job. This string must not contain
      # more than 500 characters.
  "name": "A 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'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.
  "schedule": "A String", # 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 > 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.
  "scheduleTime": "A String", # 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.
  "httpTarget": { # 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.
    "body": "A String", # 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.
    "httpMethod": "A String", # Which HTTP method to use for the request.
    "oidcToken": { # 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.
      "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
          # specified in target will be used.
      "serviceAccountEmail": "A String", # [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.
    },
    "uri": "A String", # Required.
        #
        # The full URI path that the request will be sent to. This string
        # must begin with either "http://" or "https://". 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.
    "oauthToken": { # 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.
      "scope": "A String", # OAuth scope to be used for generating OAuth access token.
          # If not specified, "https://www.googleapis.com/auth/cloud-platform"
          # will be used.
      "serviceAccountEmail": "A String", # [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.
    },
    "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
        # * `X-Google-*`: Google internal use only.
        # * `X-AppEngine-*`: Google internal use only.
        #
        # The total size of headers must be less than 80KB.
      "a_key": "A String",
    },
  },
  "appEngineHttpTarget": { # 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.
    "body": "A String", # 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.
    "headers": { # 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
        #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
        #   This header can be modified, but Cloud Scheduler will append
        #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
        #   `"application/octet-stream"`. 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 `"application/json"`.
        # * `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.
      "a_key": "A String",
    },
    "appEngineRouting": { # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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]`</br>
          #   `| [service] + '.' + [application_domain_name]`</br>
          #   `| [version] + '.' + [application_domain_name]`</br>
          #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
          #   `| [instance] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
          #
          # * `application_domain_name` = The domain name of the app, for
          #   example <app-id>.appspot.com, which is associated with the
          #   job's project ID.
          #
          # * `service =` service
          #
          # * `version =` version
          #
          # * `version_dot_service =`
          #   version `+ '.' +`
          #   service
          #
          # * `instance =` instance
          #
          # * `instance_dot_service =`
          #   instance `+ '.' +`
          #   service
          #
          # * `instance_dot_version =`
          #   instance `+ '.' +`
          #   version
          #
          # * `instance_dot_version_dot_service =`
          #   instance `+ '.' +`
          #   version `+ '.' +`
          #   service
          #
          #
          # If service is empty, then the 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.
      "version": "A String", # App version.
          #
          # By default, the job is sent to the version which is the default
          # version when the job is attempted.
      "service": "A String", # App service.
          #
          # By default, the job is sent to the service which is the default
          # service when the job is attempted.
    },
    "relativeUri": "A String", # The relative URI.
        #
        # The relative URL must begin with "/" 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 "/" will be used.
        # No spaces are allowed, and the maximum length allowed is 2083 characters.
    "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
        # permitted.
  },
  "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
  "state": "A String", # Output only. State of the job.
  "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
      # the given Pub/Sub topic.
    "attributes": { # Attributes for PubsubMessage.
        #
        # Pubsub message must contain either non-empty data, or at least one
        # attribute.
      "a_key": "A String",
    },
    "data": "A String", # The message payload for PubsubMessage.
        #
        # Pubsub message must contain either non-empty data, or at least one
        # attribute.
    "topicName": "A String", # 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'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.
  },
  "timeZone": "A String", # 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 "utc". If a
      # time zone is not specified, the default will be in UTC (also known
      # as GMT).
  "retryConfig": { # 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.
    "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
        # it fails.
        #
        # The default value of this field is 1 hour.
    "retryCount": 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.
    "maxDoublings": 42, # The time between retries will double `max_doublings` times.
        #
        # A job's retry interval starts at
        # min_backoff_duration, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries 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.
    "maxRetryDuration": "A String", # 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.
    "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
        # it fails.
        #
        # The default value of this field is 5 seconds.
  },
  "attemptDeadline": "A String", # 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.
  "userUpdateTime": "A String", # Output only. The creation time of the job.
}

  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.
    "status": { # 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).
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "description": "A String", # Optionally caller-specified in CreateJob or
        # UpdateJob.
        #
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    "name": "A 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'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.
    "schedule": "A String", # 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 > 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.
    "scheduleTime": "A String", # 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.
    "httpTarget": { # 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.
      "body": "A String", # 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.
      "httpMethod": "A String", # Which HTTP method to use for the request.
      "oidcToken": { # 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.
        "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "uri": "A String", # Required.
          #
          # The full URI path that the request will be sent to. This string
          # must begin with either "http://" or "https://". 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.
      "oauthToken": { # 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.
        "scope": "A String", # OAuth scope to be used for generating OAuth access token.
            # If not specified, "https://www.googleapis.com/auth/cloud-platform"
            # will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        "a_key": "A String",
      },
    },
    "appEngineHttpTarget": { # 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.
      "body": "A String", # 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.
      "headers": { # 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
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
          #   `"application/octet-stream"`. 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 `"application/json"`.
          # * `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.
        "a_key": "A String",
      },
      "appEngineRouting": { # 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).
        "instance": "A String", # 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).
        "host": "A String", # 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]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   job's project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            #
            # If service is empty, then the 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.
        "version": "A String", # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        "service": "A String", # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
      },
      "relativeUri": "A String", # The relative URI.
          #
          # The relative URL must begin with "/" 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 "/" will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
    "state": "A String", # Output only. State of the job.
    "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      "attributes": { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        "a_key": "A String",
      },
      "data": "A String", # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
      "topicName": "A String", # 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'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.
    },
    "timeZone": "A String", # 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 "utc". If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    "retryConfig": { # 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.
      "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      "retryCount": 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.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A job's retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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.
      "maxRetryDuration": "A String", # 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.
      "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
    },
    "attemptDeadline": "A String", # 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.
    "userUpdateTime": "A String", # Output only. The creation time of the job.
  }</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.
    "status": { # 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).
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "description": "A String", # Optionally caller-specified in CreateJob or
        # UpdateJob.
        #
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    "name": "A 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'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.
    "schedule": "A String", # 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 > 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.
    "scheduleTime": "A String", # 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.
    "httpTarget": { # 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.
      "body": "A String", # 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.
      "httpMethod": "A String", # Which HTTP method to use for the request.
      "oidcToken": { # 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.
        "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "uri": "A String", # Required.
          #
          # The full URI path that the request will be sent to. This string
          # must begin with either "http://" or "https://". 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.
      "oauthToken": { # 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.
        "scope": "A String", # OAuth scope to be used for generating OAuth access token.
            # If not specified, "https://www.googleapis.com/auth/cloud-platform"
            # will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        "a_key": "A String",
      },
    },
    "appEngineHttpTarget": { # 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.
      "body": "A String", # 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.
      "headers": { # 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
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
          #   `"application/octet-stream"`. 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 `"application/json"`.
          # * `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.
        "a_key": "A String",
      },
      "appEngineRouting": { # 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).
        "instance": "A String", # 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).
        "host": "A String", # 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]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   job's project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            #
            # If service is empty, then the 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.
        "version": "A String", # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        "service": "A String", # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
      },
      "relativeUri": "A String", # The relative URI.
          #
          # The relative URL must begin with "/" 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 "/" will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
    "state": "A String", # Output only. State of the job.
    "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      "attributes": { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        "a_key": "A String",
      },
      "data": "A String", # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
      "topicName": "A String", # 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'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.
    },
    "timeZone": "A String", # 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 "utc". If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    "retryConfig": { # 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.
      "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      "retryCount": 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.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A job's retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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.
      "maxRetryDuration": "A String", # 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.
      "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
    },
    "attemptDeadline": "A String", # 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.
    "userUpdateTime": "A String", # Output only. The creation time of the job.
  }</pre>
</div>

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

Args:
  parent: string, Required.

The location name. For example:
`projects/PROJECT_ID/locations/LOCATION_ID`. (required)
  pageSize: integer, Requested page size.

The maximum page size is 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.
  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.
  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.
    "nextPageToken": "A String", # 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.
    "jobs": [ # The list of jobs.
      { # Configuration for a job.
          # The maximum allowed size for a job is 100KB.
        "status": { # 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).
          "message": "A String", # 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.
          "code": 42, # The status code, which should be an enum value of google.rpc.Code.
          "details": [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              "a_key": "", # Properties of the object. Contains field @type with type URL.
            },
          ],
        },
        "description": "A String", # Optionally caller-specified in CreateJob or
            # UpdateJob.
            #
            # A human-readable description for the job. This string must not contain
            # more than 500 characters.
        "name": "A 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'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.
        "schedule": "A String", # 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 > 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.
        "scheduleTime": "A String", # 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.
        "httpTarget": { # 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.
          "body": "A String", # 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.
          "httpMethod": "A String", # Which HTTP method to use for the request.
          "oidcToken": { # 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.
            "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
                # specified in target will be used.
            "serviceAccountEmail": "A String", # [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.
          },
          "uri": "A String", # Required.
              #
              # The full URI path that the request will be sent to. This string
              # must begin with either "http://" or "https://". 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.
          "oauthToken": { # 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.
            "scope": "A String", # OAuth scope to be used for generating OAuth access token.
                # If not specified, "https://www.googleapis.com/auth/cloud-platform"
                # will be used.
            "serviceAccountEmail": "A String", # [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.
          },
          "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
              # * `X-Google-*`: Google internal use only.
              # * `X-AppEngine-*`: Google internal use only.
              #
              # The total size of headers must be less than 80KB.
            "a_key": "A String",
          },
        },
        "appEngineHttpTarget": { # 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.
          "body": "A String", # 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.
          "headers": { # 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
              #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
              #   This header can be modified, but Cloud Scheduler will append
              #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
              #   `"application/octet-stream"`. 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 `"application/json"`.
              # * `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.
            "a_key": "A String",
          },
          "appEngineRouting": { # 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).
            "instance": "A String", # 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).
            "host": "A String", # 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]`</br>
                #   `| [service] + '.' + [application_domain_name]`</br>
                #   `| [version] + '.' + [application_domain_name]`</br>
                #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
                #   `| [instance] + '.' + [application_domain_name]`</br>
                #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
                #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
                #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
                #
                # * `application_domain_name` = The domain name of the app, for
                #   example <app-id>.appspot.com, which is associated with the
                #   job's project ID.
                #
                # * `service =` service
                #
                # * `version =` version
                #
                # * `version_dot_service =`
                #   version `+ '.' +`
                #   service
                #
                # * `instance =` instance
                #
                # * `instance_dot_service =`
                #   instance `+ '.' +`
                #   service
                #
                # * `instance_dot_version =`
                #   instance `+ '.' +`
                #   version
                #
                # * `instance_dot_version_dot_service =`
                #   instance `+ '.' +`
                #   version `+ '.' +`
                #   service
                #
                #
                # If service is empty, then the 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.
            "version": "A String", # App version.
                #
                # By default, the job is sent to the version which is the default
                # version when the job is attempted.
            "service": "A String", # App service.
                #
                # By default, the job is sent to the service which is the default
                # service when the job is attempted.
          },
          "relativeUri": "A String", # The relative URI.
              #
              # The relative URL must begin with "/" 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 "/" will be used.
              # No spaces are allowed, and the maximum length allowed is 2083 characters.
          "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
              # permitted.
        },
        "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
        "state": "A String", # Output only. State of the job.
        "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
            # the given Pub/Sub topic.
          "attributes": { # Attributes for PubsubMessage.
              #
              # Pubsub message must contain either non-empty data, or at least one
              # attribute.
            "a_key": "A String",
          },
          "data": "A String", # The message payload for PubsubMessage.
              #
              # Pubsub message must contain either non-empty data, or at least one
              # attribute.
          "topicName": "A String", # 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'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.
        },
        "timeZone": "A String", # 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 "utc". If a
            # time zone is not specified, the default will be in UTC (also known
            # as GMT).
        "retryConfig": { # 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.
          "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
              # it fails.
              #
              # The default value of this field is 1 hour.
          "retryCount": 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.
          "maxDoublings": 42, # The time between retries will double `max_doublings` times.
              #
              # A job's retry interval starts at
              # min_backoff_duration, then doubles
              # `max_doublings` times, then increases linearly, and finally
              # retries 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.
          "maxRetryDuration": "A String", # 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.
          "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
              # it fails.
              #
              # The default value of this field is 5 seconds.
        },
        "attemptDeadline": "A String", # 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.
        "userUpdateTime": "A String", # Output only. The creation time of the job.
      },
    ],
  }</pre>
</div>

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

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

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

<div class="method">
    <code class="details" id="patch">patch(name, body, updateMask=None, x__xgafv=None)</code>
  <pre>Updates a 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'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. (required)
    The object takes the form of:

{ # Configuration for a job.
    # The maximum allowed size for a job is 100KB.
  "status": { # 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).
    "message": "A String", # 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.
    "code": 42, # The status code, which should be an enum value of google.rpc.Code.
    "details": [ # A list of messages that carry the error details.  There is a common set of
        # message types for APIs to use.
      {
        "a_key": "", # Properties of the object. Contains field @type with type URL.
      },
    ],
  },
  "description": "A String", # Optionally caller-specified in CreateJob or
      # UpdateJob.
      # 
      # A human-readable description for the job. This string must not contain
      # more than 500 characters.
  "name": "A 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'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.
  "schedule": "A String", # 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 > 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.
  "scheduleTime": "A String", # 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.
  "httpTarget": { # 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.
    "body": "A String", # 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.
    "httpMethod": "A String", # Which HTTP method to use for the request.
    "oidcToken": { # 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.
      "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
          # specified in target will be used.
      "serviceAccountEmail": "A String", # [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.
    },
    "uri": "A String", # Required.
        #
        # The full URI path that the request will be sent to. This string
        # must begin with either "http://" or "https://". 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.
    "oauthToken": { # 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.
      "scope": "A String", # OAuth scope to be used for generating OAuth access token.
          # If not specified, "https://www.googleapis.com/auth/cloud-platform"
          # will be used.
      "serviceAccountEmail": "A String", # [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.
    },
    "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
        # * `X-Google-*`: Google internal use only.
        # * `X-AppEngine-*`: Google internal use only.
        #
        # The total size of headers must be less than 80KB.
      "a_key": "A String",
    },
  },
  "appEngineHttpTarget": { # 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.
    "body": "A String", # 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.
    "headers": { # 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
        #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
        #   This header can be modified, but Cloud Scheduler will append
        #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
        #   `"application/octet-stream"`. 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 `"application/json"`.
        # * `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.
      "a_key": "A String",
    },
    "appEngineRouting": { # 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).
      "instance": "A String", # 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).
      "host": "A String", # 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]`</br>
          #   `| [service] + '.' + [application_domain_name]`</br>
          #   `| [version] + '.' + [application_domain_name]`</br>
          #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
          #   `| [instance] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
          #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
          #
          # * `application_domain_name` = The domain name of the app, for
          #   example <app-id>.appspot.com, which is associated with the
          #   job's project ID.
          #
          # * `service =` service
          #
          # * `version =` version
          #
          # * `version_dot_service =`
          #   version `+ '.' +`
          #   service
          #
          # * `instance =` instance
          #
          # * `instance_dot_service =`
          #   instance `+ '.' +`
          #   service
          #
          # * `instance_dot_version =`
          #   instance `+ '.' +`
          #   version
          #
          # * `instance_dot_version_dot_service =`
          #   instance `+ '.' +`
          #   version `+ '.' +`
          #   service
          #
          #
          # If service is empty, then the 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.
      "version": "A String", # App version.
          #
          # By default, the job is sent to the version which is the default
          # version when the job is attempted.
      "service": "A String", # App service.
          #
          # By default, the job is sent to the service which is the default
          # service when the job is attempted.
    },
    "relativeUri": "A String", # The relative URI.
        #
        # The relative URL must begin with "/" 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 "/" will be used.
        # No spaces are allowed, and the maximum length allowed is 2083 characters.
    "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
        # permitted.
  },
  "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
  "state": "A String", # Output only. State of the job.
  "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
      # the given Pub/Sub topic.
    "attributes": { # Attributes for PubsubMessage.
        #
        # Pubsub message must contain either non-empty data, or at least one
        # attribute.
      "a_key": "A String",
    },
    "data": "A String", # The message payload for PubsubMessage.
        #
        # Pubsub message must contain either non-empty data, or at least one
        # attribute.
    "topicName": "A String", # 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'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.
  },
  "timeZone": "A String", # 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 "utc". If a
      # time zone is not specified, the default will be in UTC (also known
      # as GMT).
  "retryConfig": { # 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.
    "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
        # it fails.
        #
        # The default value of this field is 1 hour.
    "retryCount": 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.
    "maxDoublings": 42, # The time between retries will double `max_doublings` times.
        #
        # A job's retry interval starts at
        # min_backoff_duration, then doubles
        # `max_doublings` times, then increases linearly, and finally
        # retries 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.
    "maxRetryDuration": "A String", # 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.
    "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
        # it fails.
        #
        # The default value of this field is 5 seconds.
  },
  "attemptDeadline": "A String", # 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.
  "userUpdateTime": "A String", # Output only. The creation time of the job.
}

  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.
    "status": { # 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).
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "description": "A String", # Optionally caller-specified in CreateJob or
        # UpdateJob.
        #
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    "name": "A 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'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.
    "schedule": "A String", # 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 > 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.
    "scheduleTime": "A String", # 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.
    "httpTarget": { # 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.
      "body": "A String", # 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.
      "httpMethod": "A String", # Which HTTP method to use for the request.
      "oidcToken": { # 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.
        "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "uri": "A String", # Required.
          #
          # The full URI path that the request will be sent to. This string
          # must begin with either "http://" or "https://". 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.
      "oauthToken": { # 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.
        "scope": "A String", # OAuth scope to be used for generating OAuth access token.
            # If not specified, "https://www.googleapis.com/auth/cloud-platform"
            # will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        "a_key": "A String",
      },
    },
    "appEngineHttpTarget": { # 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.
      "body": "A String", # 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.
      "headers": { # 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
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
          #   `"application/octet-stream"`. 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 `"application/json"`.
          # * `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.
        "a_key": "A String",
      },
      "appEngineRouting": { # 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).
        "instance": "A String", # 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).
        "host": "A String", # 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]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   job's project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            #
            # If service is empty, then the 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.
        "version": "A String", # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        "service": "A String", # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
      },
      "relativeUri": "A String", # The relative URI.
          #
          # The relative URL must begin with "/" 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 "/" will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
    "state": "A String", # Output only. State of the job.
    "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      "attributes": { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        "a_key": "A String",
      },
      "data": "A String", # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
      "topicName": "A String", # 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'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.
    },
    "timeZone": "A String", # 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 "utc". If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    "retryConfig": { # 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.
      "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      "retryCount": 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.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A job's retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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.
      "maxRetryDuration": "A String", # 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.
      "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
    },
    "attemptDeadline": "A String", # 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.
    "userUpdateTime": "A String", # Output only. The creation time of the job.
  }</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.
    "status": { # 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).
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "description": "A String", # Optionally caller-specified in CreateJob or
        # UpdateJob.
        #
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    "name": "A 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'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.
    "schedule": "A String", # 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 > 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.
    "scheduleTime": "A String", # 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.
    "httpTarget": { # 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.
      "body": "A String", # 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.
      "httpMethod": "A String", # Which HTTP method to use for the request.
      "oidcToken": { # 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.
        "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "uri": "A String", # Required.
          #
          # The full URI path that the request will be sent to. This string
          # must begin with either "http://" or "https://". 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.
      "oauthToken": { # 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.
        "scope": "A String", # OAuth scope to be used for generating OAuth access token.
            # If not specified, "https://www.googleapis.com/auth/cloud-platform"
            # will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        "a_key": "A String",
      },
    },
    "appEngineHttpTarget": { # 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.
      "body": "A String", # 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.
      "headers": { # 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
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
          #   `"application/octet-stream"`. 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 `"application/json"`.
          # * `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.
        "a_key": "A String",
      },
      "appEngineRouting": { # 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).
        "instance": "A String", # 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).
        "host": "A String", # 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]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   job's project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            #
            # If service is empty, then the 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.
        "version": "A String", # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        "service": "A String", # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
      },
      "relativeUri": "A String", # The relative URI.
          #
          # The relative URL must begin with "/" 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 "/" will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
    "state": "A String", # Output only. State of the job.
    "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      "attributes": { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        "a_key": "A String",
      },
      "data": "A String", # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
      "topicName": "A String", # 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'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.
    },
    "timeZone": "A String", # 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 "utc". If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    "retryConfig": { # 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.
      "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      "retryCount": 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.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A job's retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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.
      "maxRetryDuration": "A String", # 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.
      "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
    },
    "attemptDeadline": "A String", # 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.
    "userUpdateTime": "A String", # Output only. The creation time of the job.
  }</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.
    "status": { # 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).
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "description": "A String", # Optionally caller-specified in CreateJob or
        # UpdateJob.
        #
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    "name": "A 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'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.
    "schedule": "A String", # 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 > 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.
    "scheduleTime": "A String", # 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.
    "httpTarget": { # 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.
      "body": "A String", # 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.
      "httpMethod": "A String", # Which HTTP method to use for the request.
      "oidcToken": { # 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.
        "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "uri": "A String", # Required.
          #
          # The full URI path that the request will be sent to. This string
          # must begin with either "http://" or "https://". 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.
      "oauthToken": { # 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.
        "scope": "A String", # OAuth scope to be used for generating OAuth access token.
            # If not specified, "https://www.googleapis.com/auth/cloud-platform"
            # will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        "a_key": "A String",
      },
    },
    "appEngineHttpTarget": { # 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.
      "body": "A String", # 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.
      "headers": { # 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
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
          #   `"application/octet-stream"`. 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 `"application/json"`.
          # * `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.
        "a_key": "A String",
      },
      "appEngineRouting": { # 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).
        "instance": "A String", # 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).
        "host": "A String", # 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]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   job's project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            #
            # If service is empty, then the 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.
        "version": "A String", # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        "service": "A String", # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
      },
      "relativeUri": "A String", # The relative URI.
          #
          # The relative URL must begin with "/" 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 "/" will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
    "state": "A String", # Output only. State of the job.
    "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      "attributes": { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        "a_key": "A String",
      },
      "data": "A String", # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
      "topicName": "A String", # 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'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.
    },
    "timeZone": "A String", # 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 "utc". If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    "retryConfig": { # 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.
      "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      "retryCount": 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.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A job's retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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.
      "maxRetryDuration": "A String", # 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.
      "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
    },
    "attemptDeadline": "A String", # 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.
    "userUpdateTime": "A String", # Output only. The creation time of the job.
  }</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.
    "status": { # 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).
      "message": "A String", # 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.
      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
      "details": [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          "a_key": "", # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    "description": "A String", # Optionally caller-specified in CreateJob or
        # UpdateJob.
        #
        # A human-readable description for the job. This string must not contain
        # more than 500 characters.
    "name": "A 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'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.
    "schedule": "A String", # 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 > 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.
    "scheduleTime": "A String", # 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.
    "httpTarget": { # 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.
      "body": "A String", # 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.
      "httpMethod": "A String", # Which HTTP method to use for the request.
      "oidcToken": { # 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.
        "audience": "A String", # Audience to be used when generating OIDC token. If not specified, the URI
            # specified in target will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "uri": "A String", # Required.
          #
          # The full URI path that the request will be sent to. This string
          # must begin with either "http://" or "https://". 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.
      "oauthToken": { # 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.
        "scope": "A String", # OAuth scope to be used for generating OAuth access token.
            # If not specified, "https://www.googleapis.com/auth/cloud-platform"
            # will be used.
        "serviceAccountEmail": "A String", # [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.
      },
      "headers": { # The user can specify HTTP request headers to send with the job'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'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 `"Google-Cloud-Scheduler"`.
          # * `X-Google-*`: Google internal use only.
          # * `X-AppEngine-*`: Google internal use only.
          #
          # The total size of headers must be less than 80KB.
        "a_key": "A String",
      },
    },
    "appEngineHttpTarget": { # 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.
      "body": "A String", # 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.
      "headers": { # 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
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"`.
          #   This header can be modified, but Cloud Scheduler will append
          #   `"AppEngine-Google; (+http://code.google.com/appengine)"` 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
          #   `"application/octet-stream"`. 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 `"application/json"`.
          # * `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.
        "a_key": "A String",
      },
      "appEngineRouting": { # 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).
        "instance": "A String", # 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).
        "host": "A String", # 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]`</br>
            #   `| [service] + '.' + [application_domain_name]`</br>
            #   `| [version] + '.' + [application_domain_name]`</br>
            #   `| [version_dot_service]+ '.' + [application_domain_name]`</br>
            #   `| [instance] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_service] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version] + '.' + [application_domain_name]`</br>
            #   `| [instance_dot_version_dot_service] + '.' + [application_domain_name]`
            #
            # * `application_domain_name` = The domain name of the app, for
            #   example <app-id>.appspot.com, which is associated with the
            #   job's project ID.
            #
            # * `service =` service
            #
            # * `version =` version
            #
            # * `version_dot_service =`
            #   version `+ '.' +`
            #   service
            #
            # * `instance =` instance
            #
            # * `instance_dot_service =`
            #   instance `+ '.' +`
            #   service
            #
            # * `instance_dot_version =`
            #   instance `+ '.' +`
            #   version
            #
            # * `instance_dot_version_dot_service =`
            #   instance `+ '.' +`
            #   version `+ '.' +`
            #   service
            #
            #
            # If service is empty, then the 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.
        "version": "A String", # App version.
            #
            # By default, the job is sent to the version which is the default
            # version when the job is attempted.
        "service": "A String", # App service.
            #
            # By default, the job is sent to the service which is the default
            # service when the job is attempted.
      },
      "relativeUri": "A String", # The relative URI.
          #
          # The relative URL must begin with "/" 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 "/" will be used.
          # No spaces are allowed, and the maximum length allowed is 2083 characters.
      "httpMethod": "A String", # The HTTP method to use for the request. PATCH and OPTIONS are not
          # permitted.
    },
    "lastAttemptTime": "A String", # Output only. The time the last job attempt started.
    "state": "A String", # Output only. State of the job.
    "pubsubTarget": { # Pub/Sub target. The job will be delivered by publishing a message to # Pub/Sub target.
        # the given Pub/Sub topic.
      "attributes": { # Attributes for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
        "a_key": "A String",
      },
      "data": "A String", # The message payload for PubsubMessage.
          #
          # Pubsub message must contain either non-empty data, or at least one
          # attribute.
      "topicName": "A String", # 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'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.
    },
    "timeZone": "A String", # 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 "utc". If a
        # time zone is not specified, the default will be in UTC (also known
        # as GMT).
    "retryConfig": { # 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.
      "maxBackoffDuration": "A String", # The maximum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 1 hour.
      "retryCount": 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.
      "maxDoublings": 42, # The time between retries will double `max_doublings` times.
          #
          # A job's retry interval starts at
          # min_backoff_duration, then doubles
          # `max_doublings` times, then increases linearly, and finally
          # retries 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.
      "maxRetryDuration": "A String", # 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.
      "minBackoffDuration": "A String", # The minimum amount of time to wait before retrying a job after
          # it fails.
          #
          # The default value of this field is 5 seconds.
    },
    "attemptDeadline": "A String", # 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.
    "userUpdateTime": "A String", # Output only. The creation time of the job.
  }</pre>
</div>

</body></html>