<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="run_v1.html">Cloud Run API</a> . <a href="run_v1.namespaces.html">namespaces</a> . <a href="run_v1.namespaces.services.html">services</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Create a service.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, apiVersion=None, propagationPolicy=None, kind=None, x__xgafv=None)</a></code></p>
<p class="firstline">Delete a service.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Get information about a service.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, labelSelector=None, resourceVersion=None, includeUninitialized=None, fieldSelector=None, continue=None, limit=None, watch=None, x__xgafv=None)</a></code></p>
<p class="firstline">List services.</p>
<p class="toc_element">
  <code><a href="#replaceService">replaceService(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Replace a service.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>Create a service.

Args:
  parent: string, The namespace in which the service should be created.
For Cloud Run (fully managed), replace {namespace_id} with the project ID
or number. (required)
  body: object, The request body.
    The object takes the form of:

{ # Service acts as a top-level container that manages a set of Routes and
    # Configurations which implement a network service. Service exists to provide a
    # singular abstraction which can be access controlled, reasoned about, and
    # which encapsulates software lifecycle decisions such as rollout policy and
    # team resource ownership. Service acts only as an orchestrator of the
    # underlying Routes and Configurations (much as a kubernetes Deployment
    # orchestrates ReplicaSets).
    # 
    # The Service&#x27;s controller will track the statuses of its owned Configuration
    # and Route, reflecting their statuses and conditions as its own.
    # 
    # See also:
    # https://github.com/knative/serving/blob/master/docs/spec/overview.md#service
  &quot;status&quot;: { # The current state of the Service. Output only. # Status communicates the observed state of the Service (from the
      # controller).
    &quot;latestCreatedRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
        # LatestCreatedRevisionName is the last revision that was created from this
        # Service&#x27;s Configuration. It might not be ready yet, for that use
        # LatestReadyRevisionName.
    &quot;conditions&quot;: [ # Conditions communicates information about ongoing/complete
        # reconciliation processes that bring the &quot;spec&quot; inline with the observed
        # state of the world.
        # Service-specific conditions include:
        # * &quot;ConfigurationsReady&quot;: true when the underlying Configuration is ready.
        # * &quot;RoutesReady&quot;: true when the underlying Route is ready.
        # * &quot;Ready&quot;: true when both the underlying Route and Configuration are
        # ready.
      { # Condition defines a generic condition for a Resource
        &quot;message&quot;: &quot;A String&quot;, # Optional. Human readable message indicating details about the current status.
        &quot;lastTransitionTime&quot;: &quot;A String&quot;, # Optional. Last time the condition transitioned from one status to another.
        &quot;status&quot;: &quot;A String&quot;, # Status of the condition, one of True, False, Unknown.
        &quot;severity&quot;: &quot;A String&quot;, # Optional. How to interpret failures of this condition, one of Error, Warning, Info
        &quot;reason&quot;: &quot;A String&quot;, # Optional. One-word CamelCase reason for the condition&#x27;s last transition.
        &quot;type&quot;: &quot;A String&quot;, # type is used to communicate the status of the reconciliation process.
            # See also:
            # https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting
            # Types common to all resources include:
            # * &quot;Ready&quot;: True when the Resource is ready.
      },
    ],
    &quot;address&quot;: { # Information for connecting over HTTP(s). # From RouteStatus.
        # Similar to url, information on where the service is available on HTTP.
      &quot;url&quot;: &quot;A String&quot;,
    },
    &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Route that
        # was last processed by the controller.
        #
        # Clients polling for completed reconciliation should poll until
        # observedGeneration = metadata.generation and the Ready condition&#x27;s status
        # is True or False.
    &quot;url&quot;: &quot;A String&quot;, # From RouteStatus.
        # URL holds the url that will distribute traffic over the provided traffic
        # targets. It generally has the form
        # https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app
    &quot;traffic&quot;: [ # From RouteStatus.
        # Traffic holds the configured traffic distribution.
        # These entries will always contain RevisionName references.
        # When ConfigurationName appears in the spec, this will hold the
        # LatestReadyRevisionName that we last observed.
      { # TrafficTarget holds a single entry of the routing table for a Route.
        &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
            # is displayed in status, and is disallowed on spec. URL must contain a
            # scheme (e.g. http://) and a hostname, but may not contain anything else
            # (e.g. basic auth, url path, etc.
            #
            # Not currently supported in Cloud Run.
        &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
            # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
            # of the referenced configuration changes, we will automatically migrate
            # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
            # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
            # with RevisionName.
            #
            # Cloud Run currently supports a single ConfigurationName.
        &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
            # This defaults to zero if unspecified.
            #
            # Cloud Run currently requires 100 percent for a single ConfigurationName
            # TrafficTarget entry.
        &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
            # traffic. This is mutually exclusive with ConfigurationName.
            #
            # Providing RevisionName in spec is not currently supported by Cloud Run.
        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
            # ready Revision of the Configuration should be used for this traffic
            # target. When provided LatestRevision must be true if RevisionName is
            # empty; it must be false when RevisionName is non-empty.
            #
            # +optional
        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
            # this target exclusively.
            #
            # Not currently supported in Cloud Run.
            # +optional
      },
    ],
    &quot;latestReadyRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
        # LatestReadyRevisionName holds the name of the latest Revision stamped out
        # from this Service&#x27;s Configuration that has had its &quot;Ready&quot; condition become
        # &quot;True&quot;.
  },
  &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
  &quot;spec&quot;: { # ServiceSpec holds the desired state of the Route (from the client), which # Spec holds the desired state of the Service (from the client).
      # is used to manipulate the underlying Route and Configuration(s).
    &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative
        # Revisions and Configurations.
      { # TrafficTarget holds a single entry of the routing table for a Route.
        &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
            # is displayed in status, and is disallowed on spec. URL must contain a
            # scheme (e.g. http://) and a hostname, but may not contain anything else
            # (e.g. basic auth, url path, etc.
            #
            # Not currently supported in Cloud Run.
        &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
            # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
            # of the referenced configuration changes, we will automatically migrate
            # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
            # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
            # with RevisionName.
            #
            # Cloud Run currently supports a single ConfigurationName.
        &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
            # This defaults to zero if unspecified.
            #
            # Cloud Run currently requires 100 percent for a single ConfigurationName
            # TrafficTarget entry.
        &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
            # traffic. This is mutually exclusive with ConfigurationName.
            #
            # Providing RevisionName in spec is not currently supported by Cloud Run.
        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
            # ready Revision of the Configuration should be used for this traffic
            # target. When provided LatestRevision must be true if RevisionName is
            # empty; it must be false when RevisionName is non-empty.
            #
            # +optional
        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
            # this target exclusively.
            #
            # Not currently supported in Cloud Run.
            # +optional
      },
    ],
    &quot;template&quot;: { # RevisionTemplateSpec describes the data a revision should have when created # Template holds the latest specification for the Revision to
        # be stamped out.
        # from a template. Based on:
        # https://github.com/kubernetes/api/blob/e771f807/core/v1/types.go#L3179-L3190
      &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Optional metadata for this Revision, including labels and annotations. Name
          # will be generated by the Configuration.
          # To set minimum instances for this revision, use the
          # &quot;autoscaling.knative.dev/minScale&quot; annotation key.
          # To set maximum instances for this revision, use the
          # &quot;autoscaling.knative.dev/maxScale&quot; annotation key.
          # To set Cloud SQL connections for the revision, use the
          # &quot;run.googleapis.com/cloudsql-instances&quot; annotation key.
          # persisted resources must have, which includes all objects users must create.
        &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
            #
            # CreationTimestamp is a timestamp representing the server time when this
            # object was created. It is not guaranteed to be set in happens-before order
            # across separate operations. Clients may not set this value. It is
            # represented in RFC3339 form and is in UTC.
            #
            # Populated by the system.
            # Read-only.
            # Null for lists.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
        &quot;labels&quot;: { # (Optional)
            #
            # Map of string keys and values that can be used to organize and categorize
            # (scope and select) objects. May match selectors of replication controllers
            # and routes.
            # More info: http://kubernetes.io/docs/user-guide/labels
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;generation&quot;: 42, # (Optional)
            #
            # A sequence number representing a specific generation of the desired state.
            # Populated by the system. Read-only.
        &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
            #
            # An opaque value that represents the internal version of this object that
            # can be used by clients to determine when objects have changed. May be used
            # for optimistic concurrency, change detection, and the watch operation on a
            # resource or set of resources. Clients must treat these values as opaque and
            # passed unmodified back to the server. They may only be valid for a
            # particular resource or set of resources.
            #
            # Populated by the system.
            # Read-only.
            # Value must be treated as opaque by clients and .
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
        &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
            #
            # SelfLink is a URL representing this object.
            # Populated by the system.
            # Read-only.
            #  string selfLink = 4;
        &quot;uid&quot;: &quot;A String&quot;, # (Optional)
            #
            # UID is the unique in time and space value for this object. It is typically
            # generated by the server on successful creation of a resource and is not
            # allowed to change on PUT operations.
            #
            # Populated by the system.
            # Read-only.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
        &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
            # Cloud Run region. In Cloud Run the namespace must be equal to either the
            # project ID or project number.
        &quot;annotations&quot;: { # (Optional)
            #
            # Annotations is an unstructured key value map stored with a resource that
            # may be set by external tools to store and retrieve arbitrary metadata. They
            # are not queryable and should be preserved when modifying objects. More
            # info: http://kubernetes.io/docs/user-guide/annotations
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # GenerateName is an optional prefix, used by the server, to generate a
            # unique name ONLY IF the Name field has not been provided. If this field is
            # used, the name returned to the client will be different than the name
            # passed. This value will also be combined with a unique suffix. The provided
            # value has the same validation rules as the Name field, and may be truncated
            # by the length of the suffix required to make the value unique on the
            # server.
            #
            # If this field is specified and the generated name exists, the server will
            # NOT return a 409 - instead, it will either return 201 Created or 500 with
            # Reason ServerTimeout indicating a unique name could not be found in the
            # time allotted, and the client should retry (optionally after the time
            # indicated in the Retry-After header).
            #
            # Applied only if Name is not specified.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
            #  string generateName = 2;
        &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
            # Is required when creating
            # resources, although some resources may allow a client to request the
            # generation of an appropriate name automatically. Name is primarily intended
            # for creation idempotence and configuration definition. Cannot be updated.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#names
            # +optional
        &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # Number of seconds allowed for this object to gracefully terminate before
            # it will be removed from the system. Only set when deletionTimestamp is also
            # set. May only be shortened. Read-only.
        &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # The name of the cluster which the object belongs to.
            # This is used to distinguish resources with same name and namespace in
            # different clusters. This field is not set anywhere right now and apiserver
            # is going to ignore it if set in create or update request.
        &quot;finalizers&quot;: [ # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # Must be empty before the object is deleted from the registry. Each entry
            # is an identifier for the responsible component that will remove the entry
            # from the list. If the deletionTimestamp of the object is non-nil, entries
            # in this list can only be removed.
            # +patchStrategy=merge
          &quot;A String&quot;,
        ],
        &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # DeletionTimestamp is RFC 3339 date and time at which this resource will be
            # deleted. This field is set by the server when a graceful deletion is
            # requested by the user, and is not directly settable by a client. The
            # resource is expected to be deleted (no longer visible from resource lists,
            # and not reachable by name) after the time in this field, once the
            # finalizers list is empty. As long as the finalizers list contains items,
            # deletion is blocked. Once the deletionTimestamp is set, this value may not
            # be unset or be set further into the future, although it may be shortened or
            # the resource may be deleted prior to this time. For example, a user may
            # request that a pod is deleted in 30 seconds. The Kubelet will react by
            # sending a graceful termination signal to the containers in the pod. After
            # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
            # to the container and after cleanup, remove the pod from the API. In the
            # presence of network partitions, this object may still exist after this
            # timestamp, until an administrator or automated process can determine the
            # resource is fully terminated.
            # If not set, graceful deletion of the object has not been requested.
            #
            # Populated by the system when a graceful deletion is requested.
            # Read-only.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
        &quot;ownerReferences&quot;: [ # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # List of objects that own this object. If ALL objects in the list have
            # been deleted, this object will be garbage collected.
          { # OwnerReference contains enough information to let you identify an owning
              # object. Currently, an owning object must be in the same namespace, so there
              # is no namespace field.
            &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
            &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                # +optional
            &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                # More info:
                # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
            &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                # the owner cannot be deleted from the key-value store until this
                # reference is removed.
                # Defaults to false.
                # To set this field, a user needs &quot;delete&quot; permission of the owner,
                # otherwise 422 (Unprocessable Entity) will be returned.
                # +optional
            &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
            &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                # More info: http://kubernetes.io/docs/user-guide/identifiers#names
          },
        ],
      },
      &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
        &quot;volumes&quot;: [
          { # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Volume represents a named volume in a container.
            &quot;configMap&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Cloud Run for Anthos: supported
                #
                # Adapts a ConfigMap into a volume.
                # The contents of the target ConfigMap&#x27;s Data field will be presented in a
                # volume as files using the keys in the Data field as the file names, unless
                # the items element is populated with specific mappings of keys to paths.
              &quot;optional&quot;: True or False, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Specify whether the Secret or its keys must be defined.
              &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Name of the config.
              &quot;defaultMode&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Mode bits to use on created files by default. Must be a value between 0 and
                  # 0777. Defaults to 0644. Directories within the path are not affected by
                  # this setting. This might be in conflict with other options that affect the
                  # file mode, like fsGroup, and the result can be other mode bits set.
              &quot;items&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # If unspecified, each key-value pair in the Data field of the referenced
                  # Secret will be projected into the volume as a file whose name is the
                  # key and content is the value. If specified, the listed keys will be
                  # projected into the specified paths, and unlisted keys will not be
                  # present. If a key is specified which is not present in the Secret,
                  # the volume setup will error unless it is marked optional.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Maps a string key to a path within a volume.
                  &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The key to project.
                  &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The relative path of the file to map the key to.
                      # May not be an absolute path.
                      # May not contain the path element &#x27;..&#x27;.
                      # May not start with the string &#x27;..&#x27;.
                  &quot;mode&quot;: 42, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Mode bits to use on this file, must be a value between 0 and 0777. If not
                      # specified, the volume defaultMode will be used. This might be in conflict
                      # with other options that affect the file mode, like fsGroup, and the result
                      # can be other mode bits set.
                },
              ],
            },
            &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Volume&#x27;s name.
            &quot;secret&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Cloud Run for Anthos: supported
                #
                # The contents of the target Secret&#x27;s Data field will be presented in a volume
                # as files using the keys in the Data field as the file names.
              &quot;optional&quot;: True or False, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Specify whether the Secret or its keys must be defined.
              &quot;defaultMode&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Mode bits to use on created files by default. Must be a value between 0 and
                  # 0777. Defaults to 0644. Directories within the path are not affected by
                  # this setting. This might be in conflict with other options that affect the
                  # file mode, like fsGroup, and the result can be other mode bits set.
              &quot;secretName&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Name of the secret in the container&#x27;s namespace to use.
              &quot;items&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # If unspecified, each key-value pair in the Data field of the referenced
                  # Secret will be projected into the volume as a file whose name is the
                  # key and content is the value. If specified, the listed keys will be
                  # projected into the specified paths, and unlisted keys will not be
                  # present. If a key is specified which is not present in the Secret,
                  # the volume setup will error unless it is marked optional.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Maps a string key to a path within a volume.
                  &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The key to project.
                  &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The relative path of the file to map the key to.
                      # May not be an absolute path.
                      # May not contain the path element &#x27;..&#x27;.
                      # May not start with the string &#x27;..&#x27;.
                  &quot;mode&quot;: 42, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Mode bits to use on this file, must be a value between 0 and 0777. If not
                      # specified, the volume defaultMode will be used. This might be in conflict
                      # with other options that affect the file mode, like fsGroup, and the result
                      # can be other mode bits set.
                },
              ],
            },
          },
        ],
        &quot;containerConcurrency&quot;: 42, # (Optional)
            #
            # ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
            # requests per container instance of the Revision.
            #
            # Cloud Run fully managed: supported, defaults to 80
            #
            # Cloud Run for Anthos: supported, defaults to 0, which means concurrency
            # to the application is not limited, and the system decides the
            # target concurrency for the autoscaler.
        &quot;timeoutSeconds&quot;: 42, # TimeoutSeconds holds the max duration the instance is allowed for
            # responding to a request.
            # Not currently used by Cloud Run.
        &quot;serviceAccountName&quot;: &quot;A String&quot;, # Email address of the IAM service account associated with the revision
            # of the service. The service account represents the identity of the
            # running revision, and determines what permissions the revision has. If
            # not provided, the revision will use the project&#x27;s default service account.
        &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution
            # for this Revision. In the context of a Revision, we disallow a number of
            # fields on this Container, including: name and lifecycle.
            # In Cloud Run, only a single container may be provided.
            # The runtime contract is documented here:
            # https://github.com/knative/serving/blob/master/docs/runtime-contract.md
          { # A single application container.
              # This specifies both the container to run, the command to run in the container
              # and the arguments to supply to it.
              # Note that additional arguments may be supplied by the system to the container
              # at runtime.
            &quot;volumeMounts&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Pod volumes to mount into the container&#x27;s filesystem.
              { # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # VolumeMount describes a mounting of a Volume within a container.
                &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # This must match the Name of a Volume.
                &quot;readOnly&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Only true is accepted.
                    # Defaults to true.
                &quot;mountPath&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path within the container at which the volume should be mounted.  Must
                    # not contain &#x27;:&#x27;.
                &quot;subPath&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path within the volume from which the container&#x27;s volume should be mounted.
                    # Defaults to &quot;&quot; (volume&#x27;s root).
              },
            ],
            &quot;args&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: supported
                #
                # Cloud Run for Anthos: supported
                #
                # Arguments to the entrypoint.
                # The docker image&#x27;s CMD is used if this is not provided.
                # Variable references $(VAR_NAME) are expanded using the container&#x27;s
                # environment. If a variable cannot be resolved, the reference in the input
                # string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
                # double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
                # regardless of whether the variable exists or not.
                # More info:
                # https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
              &quot;A String&quot;,
            ],
            &quot;workingDir&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Container&#x27;s working directory.
                # If not specified, the container runtime&#x27;s default will be used, which
                # might be configured in the container image.
            &quot;ports&quot;: [ # (Optional)
                #
                # List of ports to expose from the container. Only a single port can be
                # specified. The specified ports must be listening on all interfaces
                # (0.0.0.0) within the container to be accessible.
                #
                # If omitted, a port number will be chosen and passed to the container
                # through the PORT environment variable for the container to listen on.
              { # ContainerPort represents a network port in a single container.
                &quot;containerPort&quot;: 42, # (Optional)
                    #
                    # Port number the container listens on.
                    # This must be a valid port number, 0 &lt; x &lt; 65536.
                &quot;protocol&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Protocol for port. Must be &quot;TCP&quot;.
                    # Defaults to &quot;TCP&quot;.
                &quot;name&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If specified, used to specify which protocol to use.
                    # Allowed values are &quot;http1&quot; and &quot;h2c&quot;.
              },
            ],
            &quot;image&quot;: &quot;A String&quot;, # Cloud Run fully managed: only supports containers from Google Container
                # Registry
                #
                # Cloud Run for Anthos: supported
                #
                # URL of the Container image.
                # More info: https://kubernetes.io/docs/concepts/containers/images
            &quot;envFrom&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # List of sources to populate environment variables in the container.
                # The keys defined within a source must be a C_IDENTIFIER. All invalid keys
                # will be reported as an event when the container is starting. When a key
                # exists in multiple sources, the value associated with the last source will
                # take precedence. Values defined by an Env with a duplicate key will take
                # precedence. Cannot be updated.
              { # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # EnvFromSource represents the source of a set of ConfigMaps
                &quot;prefix&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # An optional identifier to prepend to each key in the ConfigMap. Must be a
                    # C_IDENTIFIER.
                &quot;configMapRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The ConfigMap to select from
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ConfigMapEnvSource selects a ConfigMap to populate the environment
                    # variables with.
                    #
                    # The contents of the target ConfigMap&#x27;s Data field will represent the
                    # key-value pairs as environment variables.
                  &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                      # directly into the message. Use the &quot;name&quot; field instead.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # LocalObjectReference contains enough information to let you locate the
                      # referenced object inside the same namespace.
                    &quot;name&quot;: &quot;A String&quot;, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Name of the referent.
                        # More info:
                        # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                  },
                  &quot;optional&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Specify whether the ConfigMap must be defined
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The ConfigMap to select from.
                },
                &quot;secretRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The Secret to select from
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # SecretEnvSource selects a Secret to populate the environment
                    # variables with.
                    #
                    # The contents of the target Secret&#x27;s Data field will represent the
                    # key-value pairs as environment variables.
                  &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                      # directly into the message. Use the &quot;name&quot; field instead.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # LocalObjectReference contains enough information to let you locate the
                      # referenced object inside the same namespace.
                    &quot;name&quot;: &quot;A String&quot;, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Name of the referent.
                        # More info:
                        # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                  },
                  &quot;optional&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Specify whether the Secret must be defined
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The Secret to select from.
                },
              },
            ],
            &quot;name&quot;: &quot;A String&quot;, # (Optional)
                #
                # Name of the container specified as a DNS_LABEL.
            &quot;command&quot;: [
              &quot;A String&quot;,
            ],
            &quot;terminationMessagePolicy&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Indicate how the termination message should be populated. File will use the
                # contents of terminationMessagePath to populate the container status message
                # on both success and failure. FallbackToLogsOnError will use the last chunk
                # of container log output if the termination message file is empty and the
                # container exited with an error. The log output is limited to 2048 bytes or
                # 80 lines, whichever is smaller. Defaults to File. Cannot be updated.
            &quot;securityContext&quot;: { # Cloud Run fully managed: not supported # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Security options the pod should run with.
                # More info: https://kubernetes.io/docs/concepts/policy/security-context/
                # More info:
                # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
                #
                # Cloud Run for Anthos: supported
                #
                # SecurityContext holds security configuration that will be applied to a
                # container. Some fields are present in both SecurityContext and
                # PodSecurityContext.  When both are set, the values in SecurityContext take
                # precedence.
              &quot;runAsUser&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # The UID to run the entrypoint of the container process.
                  # Defaults to user specified in image metadata if unspecified.
                  # May also be set in PodSecurityContext.  If set in both SecurityContext and
                  # PodSecurityContext, the value specified in SecurityContext takes
                  # precedence.
            },
            &quot;livenessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Periodic probe of container liveness.
                # Container will be restarted if the probe fails.
                # More info:
                # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                #
                # Cloud Run for Anthos: supported
                #
                # Probe describes a health check to be performed against a container to
                # determine whether it is alive or ready to receive traffic.
              &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGet specifies the http request to perform.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGetAction describes an action based on HTTP Get requests.
                &quot;httpHeaders&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Custom headers to set in the request. HTTP allows repeated headers.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # HTTPHeader describes a custom header to be used in HTTP probes
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field name
                    &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field value
                  },
                ],
                &quot;path&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path to access on the HTTP server.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Host name to connect to, defaults to the pod IP. You probably want to set
                    # &quot;Host&quot; in httpHeaders instead.
                &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Scheme to use for connecting to the host.
                    # Defaults to HTTP.
              },
              &quot;failureThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive failures for the probe to be considered failed after
                  # having succeeded. Defaults to 3. Minimum value is 1.
              &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # One and only one of the following should be specified.
                  # Exec specifies the action to take.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # ExecAction describes a &quot;run in container&quot; action.
                &quot;command&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Command is the command line to execute inside the container, the working
                    # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                    # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                    # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                    # explicitly call out to that shell. Exit status of 0 is treated as
                    # live/healthy and non-zero is unhealthy.
              },
              &quot;initialDelaySeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after the container has started before liveness probes
                  # are initiated. More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;timeoutSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after which the probe times out.
                  # Defaults to 1 second. Minimum value is 1.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;successThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive successes for the probe to be considered successful
                  # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                  # is 1.
              &quot;periodSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # How often (in seconds) to perform the probe.
                  # Default to 10 seconds. Minimum value is 1.
              &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocket specifies an action involving a TCP port.
                  # TCP hooks not yet supported
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocketAction describes an action based on opening a socket
                &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number or name of the port to access on the container.
                    # Number must be in the range 1 to 65535.
                    # Name must be an IANA_SVC_NAME.
                    #
                    # This field is currently limited to integer types only because of proto&#x27;s
                    # inability to properly support the IntOrString golang type.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Optional: Host name to connect to, defaults to the pod IP.
              },
            },
            &quot;env&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: supported
                #
                # Cloud Run for Anthos: supported
                #
                # List of environment variables to set in the container.
              { # EnvVar represents an environment variable present in a Container.
                &quot;name&quot;: &quot;A String&quot;, # Name of the environment variable. Must be a C_IDENTIFIER.
                &quot;valueFrom&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Source for the environment variable&#x27;s value. Cannot be used if value is not
                    # empty.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # EnvVarSource represents a source for the value of an EnvVar.
                  &quot;secretKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Selects a key of a secret in the pod&#x27;s namespace
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # SecretKeySelector selects a key of a Secret.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key of the secret to select from.  Must be a valid secret key.
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The name of the secret in the pod&#x27;s namespace to select from.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret or its key must be defined
                  },
                  &quot;configMapKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Selects a key of a ConfigMap.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Selects a key from a ConfigMap.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the ConfigMap or its key must be defined
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to select.
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The ConfigMap to select from.
                  },
                },
                &quot;value&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Variable references $(VAR_NAME) are expanded
                    # using the previous defined environment variables in the container and
                    # any route environment variables. If a variable cannot be resolved,
                    # the reference in the input string will be unchanged. The $(VAR_NAME)
                    # syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
                    # references will never be expanded, regardless of whether the variable
                    # exists or not.
                    # Defaults to &quot;&quot;.
              },
            ],
            &quot;resources&quot;: { # ResourceRequirements describes the compute resource requirements. # (Optional)
                #
                # Cloud Run fully managed: supported
                #
                # Cloud Run for Anthos: supported
                #
                # Compute Resources required by this container.
                # More info:
                # https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
              &quot;limits&quot;: { # (Optional)
                  #
                  # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                  # supported value for CPU is &#x27;1&#x27;.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Limits describes the maximum amount of compute resources allowed.
                  # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                  # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;requests&quot;: { # (Optional)
                  #
                  # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                  # supported value for CPU is &#x27;1&#x27;.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Requests describes the minimum amount of compute resources required.
                  # If Requests is omitted for a container, it defaults to Limits if that is
                  # explicitly specified, otherwise to an implementation-defined value.
                  # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                  # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                &quot;a_key&quot;: &quot;A String&quot;,
              },
            },
            &quot;readinessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Periodic probe of container service readiness.
                # Container will be removed from service endpoints if the probe fails.
                # More info:
                # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                #
                # Cloud Run for Anthos: supported
                #
                # Probe describes a health check to be performed against a container to
                # determine whether it is alive or ready to receive traffic.
              &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGet specifies the http request to perform.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGetAction describes an action based on HTTP Get requests.
                &quot;httpHeaders&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Custom headers to set in the request. HTTP allows repeated headers.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # HTTPHeader describes a custom header to be used in HTTP probes
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field name
                    &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field value
                  },
                ],
                &quot;path&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path to access on the HTTP server.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Host name to connect to, defaults to the pod IP. You probably want to set
                    # &quot;Host&quot; in httpHeaders instead.
                &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Scheme to use for connecting to the host.
                    # Defaults to HTTP.
              },
              &quot;failureThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive failures for the probe to be considered failed after
                  # having succeeded. Defaults to 3. Minimum value is 1.
              &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # One and only one of the following should be specified.
                  # Exec specifies the action to take.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # ExecAction describes a &quot;run in container&quot; action.
                &quot;command&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Command is the command line to execute inside the container, the working
                    # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                    # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                    # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                    # explicitly call out to that shell. Exit status of 0 is treated as
                    # live/healthy and non-zero is unhealthy.
              },
              &quot;initialDelaySeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after the container has started before liveness probes
                  # are initiated. More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;timeoutSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after which the probe times out.
                  # Defaults to 1 second. Minimum value is 1.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;successThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive successes for the probe to be considered successful
                  # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                  # is 1.
              &quot;periodSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # How often (in seconds) to perform the probe.
                  # Default to 10 seconds. Minimum value is 1.
              &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocket specifies an action involving a TCP port.
                  # TCP hooks not yet supported
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocketAction describes an action based on opening a socket
                &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number or name of the port to access on the container.
                    # Number must be in the range 1 to 65535.
                    # Name must be an IANA_SVC_NAME.
                    #
                    # This field is currently limited to integer types only because of proto&#x27;s
                    # inability to properly support the IntOrString golang type.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Optional: Host name to connect to, defaults to the pod IP.
              },
            },
            &quot;imagePullPolicy&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Image pull policy.
                # One of Always, Never, IfNotPresent.
                # Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.
                # More info:
                # https://kubernetes.io/docs/concepts/containers/images#updating-images
            &quot;terminationMessagePath&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Path at which the file to which the container&#x27;s termination
                # message will be written is mounted into the container&#x27;s filesystem. Message
                # written is intended to be brief final status, such as an assertion failure
                # message. Will be truncated by the node if greater than 4096 bytes. The
                # total message length across all containers will be limited to 12kb.
                # Defaults to /dev/termination-log.
          },
        ],
      },
    },
  },
  &quot;kind&quot;: &quot;A String&quot;, # The kind of resource, in this case &quot;Service&quot;.
  &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Metadata associated with this Service, including name, namespace, labels,
      # and annotations.
      # persisted resources must have, which includes all objects users must create.
    &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
        #
        # CreationTimestamp is a timestamp representing the server time when this
        # object was created. It is not guaranteed to be set in happens-before order
        # across separate operations. Clients may not set this value. It is
        # represented in RFC3339 form and is in UTC.
        #
        # Populated by the system.
        # Read-only.
        # Null for lists.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
    &quot;labels&quot;: { # (Optional)
        #
        # Map of string keys and values that can be used to organize and categorize
        # (scope and select) objects. May match selectors of replication controllers
        # and routes.
        # More info: http://kubernetes.io/docs/user-guide/labels
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;generation&quot;: 42, # (Optional)
        #
        # A sequence number representing a specific generation of the desired state.
        # Populated by the system. Read-only.
    &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
        #
        # An opaque value that represents the internal version of this object that
        # can be used by clients to determine when objects have changed. May be used
        # for optimistic concurrency, change detection, and the watch operation on a
        # resource or set of resources. Clients must treat these values as opaque and
        # passed unmodified back to the server. They may only be valid for a
        # particular resource or set of resources.
        #
        # Populated by the system.
        # Read-only.
        # Value must be treated as opaque by clients and .
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
    &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
        #
        # SelfLink is a URL representing this object.
        # Populated by the system.
        # Read-only.
        #  string selfLink = 4;
    &quot;uid&quot;: &quot;A String&quot;, # (Optional)
        #
        # UID is the unique in time and space value for this object. It is typically
        # generated by the server on successful creation of a resource and is not
        # allowed to change on PUT operations.
        #
        # Populated by the system.
        # Read-only.
        # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
    &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
        # Cloud Run region. In Cloud Run the namespace must be equal to either the
        # project ID or project number.
    &quot;annotations&quot;: { # (Optional)
        #
        # Annotations is an unstructured key value map stored with a resource that
        # may be set by external tools to store and retrieve arbitrary metadata. They
        # are not queryable and should be preserved when modifying objects. More
        # info: http://kubernetes.io/docs/user-guide/annotations
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # GenerateName is an optional prefix, used by the server, to generate a
        # unique name ONLY IF the Name field has not been provided. If this field is
        # used, the name returned to the client will be different than the name
        # passed. This value will also be combined with a unique suffix. The provided
        # value has the same validation rules as the Name field, and may be truncated
        # by the length of the suffix required to make the value unique on the
        # server.
        #
        # If this field is specified and the generated name exists, the server will
        # NOT return a 409 - instead, it will either return 201 Created or 500 with
        # Reason ServerTimeout indicating a unique name could not be found in the
        # time allotted, and the client should retry (optionally after the time
        # indicated in the Retry-After header).
        #
        # Applied only if Name is not specified.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
        #  string generateName = 2;
    &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
        # Is required when creating
        # resources, although some resources may allow a client to request the
        # generation of an appropriate name automatically. Name is primarily intended
        # for creation idempotence and configuration definition. Cannot be updated.
        # More info: http://kubernetes.io/docs/user-guide/identifiers#names
        # +optional
    &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # Number of seconds allowed for this object to gracefully terminate before
        # it will be removed from the system. Only set when deletionTimestamp is also
        # set. May only be shortened. Read-only.
    &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # The name of the cluster which the object belongs to.
        # This is used to distinguish resources with same name and namespace in
        # different clusters. This field is not set anywhere right now and apiserver
        # is going to ignore it if set in create or update request.
    &quot;finalizers&quot;: [ # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # Must be empty before the object is deleted from the registry. Each entry
        # is an identifier for the responsible component that will remove the entry
        # from the list. If the deletionTimestamp of the object is non-nil, entries
        # in this list can only be removed.
        # +patchStrategy=merge
      &quot;A String&quot;,
    ],
    &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # DeletionTimestamp is RFC 3339 date and time at which this resource will be
        # deleted. This field is set by the server when a graceful deletion is
        # requested by the user, and is not directly settable by a client. The
        # resource is expected to be deleted (no longer visible from resource lists,
        # and not reachable by name) after the time in this field, once the
        # finalizers list is empty. As long as the finalizers list contains items,
        # deletion is blocked. Once the deletionTimestamp is set, this value may not
        # be unset or be set further into the future, although it may be shortened or
        # the resource may be deleted prior to this time. For example, a user may
        # request that a pod is deleted in 30 seconds. The Kubelet will react by
        # sending a graceful termination signal to the containers in the pod. After
        # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
        # to the container and after cleanup, remove the pod from the API. In the
        # presence of network partitions, this object may still exist after this
        # timestamp, until an administrator or automated process can determine the
        # resource is fully terminated.
        # If not set, graceful deletion of the object has not been requested.
        #
        # Populated by the system when a graceful deletion is requested.
        # Read-only.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
    &quot;ownerReferences&quot;: [ # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # List of objects that own this object. If ALL objects in the list have
        # been deleted, this object will be garbage collected.
      { # OwnerReference contains enough information to let you identify an owning
          # object. Currently, an owning object must be in the same namespace, so there
          # is no namespace field.
        &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
        &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
            # +optional
        &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
        &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
            # the owner cannot be deleted from the key-value store until this
            # reference is removed.
            # Defaults to false.
            # To set this field, a user needs &quot;delete&quot; permission of the owner,
            # otherwise 422 (Unprocessable Entity) will be returned.
            # +optional
        &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
        &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#names
      },
    ],
  },
}

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

Returns:
  An object of the form:

    { # Service acts as a top-level container that manages a set of Routes and
      # Configurations which implement a network service. Service exists to provide a
      # singular abstraction which can be access controlled, reasoned about, and
      # which encapsulates software lifecycle decisions such as rollout policy and
      # team resource ownership. Service acts only as an orchestrator of the
      # underlying Routes and Configurations (much as a kubernetes Deployment
      # orchestrates ReplicaSets).
      #
      # The Service&#x27;s controller will track the statuses of its owned Configuration
      # and Route, reflecting their statuses and conditions as its own.
      #
      # See also:
      # https://github.com/knative/serving/blob/master/docs/spec/overview.md#service
    &quot;status&quot;: { # The current state of the Service. Output only. # Status communicates the observed state of the Service (from the
        # controller).
      &quot;latestCreatedRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
          # LatestCreatedRevisionName is the last revision that was created from this
          # Service&#x27;s Configuration. It might not be ready yet, for that use
          # LatestReadyRevisionName.
      &quot;conditions&quot;: [ # Conditions communicates information about ongoing/complete
          # reconciliation processes that bring the &quot;spec&quot; inline with the observed
          # state of the world.
          # Service-specific conditions include:
          # * &quot;ConfigurationsReady&quot;: true when the underlying Configuration is ready.
          # * &quot;RoutesReady&quot;: true when the underlying Route is ready.
          # * &quot;Ready&quot;: true when both the underlying Route and Configuration are
          # ready.
        { # Condition defines a generic condition for a Resource
          &quot;message&quot;: &quot;A String&quot;, # Optional. Human readable message indicating details about the current status.
          &quot;lastTransitionTime&quot;: &quot;A String&quot;, # Optional. Last time the condition transitioned from one status to another.
          &quot;status&quot;: &quot;A String&quot;, # Status of the condition, one of True, False, Unknown.
          &quot;severity&quot;: &quot;A String&quot;, # Optional. How to interpret failures of this condition, one of Error, Warning, Info
          &quot;reason&quot;: &quot;A String&quot;, # Optional. One-word CamelCase reason for the condition&#x27;s last transition.
          &quot;type&quot;: &quot;A String&quot;, # type is used to communicate the status of the reconciliation process.
              # See also:
              # https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting
              # Types common to all resources include:
              # * &quot;Ready&quot;: True when the Resource is ready.
        },
      ],
      &quot;address&quot;: { # Information for connecting over HTTP(s). # From RouteStatus.
          # Similar to url, information on where the service is available on HTTP.
        &quot;url&quot;: &quot;A String&quot;,
      },
      &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Route that
          # was last processed by the controller.
          #
          # Clients polling for completed reconciliation should poll until
          # observedGeneration = metadata.generation and the Ready condition&#x27;s status
          # is True or False.
      &quot;url&quot;: &quot;A String&quot;, # From RouteStatus.
          # URL holds the url that will distribute traffic over the provided traffic
          # targets. It generally has the form
          # https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app
      &quot;traffic&quot;: [ # From RouteStatus.
          # Traffic holds the configured traffic distribution.
          # These entries will always contain RevisionName references.
          # When ConfigurationName appears in the spec, this will hold the
          # LatestReadyRevisionName that we last observed.
        { # TrafficTarget holds a single entry of the routing table for a Route.
          &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
              # is displayed in status, and is disallowed on spec. URL must contain a
              # scheme (e.g. http://) and a hostname, but may not contain anything else
              # (e.g. basic auth, url path, etc.
              #
              # Not currently supported in Cloud Run.
          &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
              # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
              # of the referenced configuration changes, we will automatically migrate
              # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
              # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
              # with RevisionName.
              #
              # Cloud Run currently supports a single ConfigurationName.
          &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
              # This defaults to zero if unspecified.
              #
              # Cloud Run currently requires 100 percent for a single ConfigurationName
              # TrafficTarget entry.
          &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
              # traffic. This is mutually exclusive with ConfigurationName.
              #
              # Providing RevisionName in spec is not currently supported by Cloud Run.
          &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
              # ready Revision of the Configuration should be used for this traffic
              # target. When provided LatestRevision must be true if RevisionName is
              # empty; it must be false when RevisionName is non-empty.
              #
              # +optional
          &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
              # this target exclusively.
              #
              # Not currently supported in Cloud Run.
              # +optional
        },
      ],
      &quot;latestReadyRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
          # LatestReadyRevisionName holds the name of the latest Revision stamped out
          # from this Service&#x27;s Configuration that has had its &quot;Ready&quot; condition become
          # &quot;True&quot;.
    },
    &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
    &quot;spec&quot;: { # ServiceSpec holds the desired state of the Route (from the client), which # Spec holds the desired state of the Service (from the client).
        # is used to manipulate the underlying Route and Configuration(s).
      &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative
          # Revisions and Configurations.
        { # TrafficTarget holds a single entry of the routing table for a Route.
          &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
              # is displayed in status, and is disallowed on spec. URL must contain a
              # scheme (e.g. http://) and a hostname, but may not contain anything else
              # (e.g. basic auth, url path, etc.
              #
              # Not currently supported in Cloud Run.
          &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
              # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
              # of the referenced configuration changes, we will automatically migrate
              # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
              # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
              # with RevisionName.
              #
              # Cloud Run currently supports a single ConfigurationName.
          &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
              # This defaults to zero if unspecified.
              #
              # Cloud Run currently requires 100 percent for a single ConfigurationName
              # TrafficTarget entry.
          &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
              # traffic. This is mutually exclusive with ConfigurationName.
              #
              # Providing RevisionName in spec is not currently supported by Cloud Run.
          &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
              # ready Revision of the Configuration should be used for this traffic
              # target. When provided LatestRevision must be true if RevisionName is
              # empty; it must be false when RevisionName is non-empty.
              #
              # +optional
          &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
              # this target exclusively.
              #
              # Not currently supported in Cloud Run.
              # +optional
        },
      ],
      &quot;template&quot;: { # RevisionTemplateSpec describes the data a revision should have when created # Template holds the latest specification for the Revision to
          # be stamped out.
          # from a template. Based on:
          # https://github.com/kubernetes/api/blob/e771f807/core/v1/types.go#L3179-L3190
        &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Optional metadata for this Revision, including labels and annotations. Name
            # will be generated by the Configuration.
            # To set minimum instances for this revision, use the
            # &quot;autoscaling.knative.dev/minScale&quot; annotation key.
            # To set maximum instances for this revision, use the
            # &quot;autoscaling.knative.dev/maxScale&quot; annotation key.
            # To set Cloud SQL connections for the revision, use the
            # &quot;run.googleapis.com/cloudsql-instances&quot; annotation key.
            # persisted resources must have, which includes all objects users must create.
          &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # CreationTimestamp is a timestamp representing the server time when this
              # object was created. It is not guaranteed to be set in happens-before order
              # across separate operations. Clients may not set this value. It is
              # represented in RFC3339 form and is in UTC.
              #
              # Populated by the system.
              # Read-only.
              # Null for lists.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;labels&quot;: { # (Optional)
              #
              # Map of string keys and values that can be used to organize and categorize
              # (scope and select) objects. May match selectors of replication controllers
              # and routes.
              # More info: http://kubernetes.io/docs/user-guide/labels
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generation&quot;: 42, # (Optional)
              #
              # A sequence number representing a specific generation of the desired state.
              # Populated by the system. Read-only.
          &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
              #
              # An opaque value that represents the internal version of this object that
              # can be used by clients to determine when objects have changed. May be used
              # for optimistic concurrency, change detection, and the watch operation on a
              # resource or set of resources. Clients must treat these values as opaque and
              # passed unmodified back to the server. They may only be valid for a
              # particular resource or set of resources.
              #
              # Populated by the system.
              # Read-only.
              # Value must be treated as opaque by clients and .
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
          &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
              #
              # SelfLink is a URL representing this object.
              # Populated by the system.
              # Read-only.
              #  string selfLink = 4;
          &quot;uid&quot;: &quot;A String&quot;, # (Optional)
              #
              # UID is the unique in time and space value for this object. It is typically
              # generated by the server on successful creation of a resource and is not
              # allowed to change on PUT operations.
              #
              # Populated by the system.
              # Read-only.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
              # Cloud Run region. In Cloud Run the namespace must be equal to either the
              # project ID or project number.
          &quot;annotations&quot;: { # (Optional)
              #
              # Annotations is an unstructured key value map stored with a resource that
              # may be set by external tools to store and retrieve arbitrary metadata. They
              # are not queryable and should be preserved when modifying objects. More
              # info: http://kubernetes.io/docs/user-guide/annotations
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # GenerateName is an optional prefix, used by the server, to generate a
              # unique name ONLY IF the Name field has not been provided. If this field is
              # used, the name returned to the client will be different than the name
              # passed. This value will also be combined with a unique suffix. The provided
              # value has the same validation rules as the Name field, and may be truncated
              # by the length of the suffix required to make the value unique on the
              # server.
              #
              # If this field is specified and the generated name exists, the server will
              # NOT return a 409 - instead, it will either return 201 Created or 500 with
              # Reason ServerTimeout indicating a unique name could not be found in the
              # time allotted, and the client should retry (optionally after the time
              # indicated in the Retry-After header).
              #
              # Applied only if Name is not specified.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
              #  string generateName = 2;
          &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
              # Is required when creating
              # resources, although some resources may allow a client to request the
              # generation of an appropriate name automatically. Name is primarily intended
              # for creation idempotence and configuration definition. Cannot be updated.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
              # +optional
          &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Number of seconds allowed for this object to gracefully terminate before
              # it will be removed from the system. Only set when deletionTimestamp is also
              # set. May only be shortened. Read-only.
          &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # The name of the cluster which the object belongs to.
              # This is used to distinguish resources with same name and namespace in
              # different clusters. This field is not set anywhere right now and apiserver
              # is going to ignore it if set in create or update request.
          &quot;finalizers&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Must be empty before the object is deleted from the registry. Each entry
              # is an identifier for the responsible component that will remove the entry
              # from the list. If the deletionTimestamp of the object is non-nil, entries
              # in this list can only be removed.
              # +patchStrategy=merge
            &quot;A String&quot;,
          ],
          &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # DeletionTimestamp is RFC 3339 date and time at which this resource will be
              # deleted. This field is set by the server when a graceful deletion is
              # requested by the user, and is not directly settable by a client. The
              # resource is expected to be deleted (no longer visible from resource lists,
              # and not reachable by name) after the time in this field, once the
              # finalizers list is empty. As long as the finalizers list contains items,
              # deletion is blocked. Once the deletionTimestamp is set, this value may not
              # be unset or be set further into the future, although it may be shortened or
              # the resource may be deleted prior to this time. For example, a user may
              # request that a pod is deleted in 30 seconds. The Kubelet will react by
              # sending a graceful termination signal to the containers in the pod. After
              # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
              # to the container and after cleanup, remove the pod from the API. In the
              # presence of network partitions, this object may still exist after this
              # timestamp, until an administrator or automated process can determine the
              # resource is fully terminated.
              # If not set, graceful deletion of the object has not been requested.
              #
              # Populated by the system when a graceful deletion is requested.
              # Read-only.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;ownerReferences&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # List of objects that own this object. If ALL objects in the list have
              # been deleted, this object will be garbage collected.
            { # OwnerReference contains enough information to let you identify an owning
                # object. Currently, an owning object must be in the same namespace, so there
                # is no namespace field.
              &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
              &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                  # +optional
              &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
              &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                  # the owner cannot be deleted from the key-value store until this
                  # reference is removed.
                  # Defaults to false.
                  # To set this field, a user needs &quot;delete&quot; permission of the owner,
                  # otherwise 422 (Unprocessable Entity) will be returned.
                  # +optional
              &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
              &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#names
            },
          ],
        },
        &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
          &quot;volumes&quot;: [
            { # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Volume represents a named volume in a container.
              &quot;configMap&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Adapts a ConfigMap into a volume.
                  # The contents of the target ConfigMap&#x27;s Data field will be presented in a
                  # volume as files using the keys in the Data field as the file names, unless
                  # the items element is populated with specific mappings of keys to paths.
                &quot;optional&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Specify whether the Secret or its keys must be defined.
                &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Name of the config.
                &quot;defaultMode&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Mode bits to use on created files by default. Must be a value between 0 and
                    # 0777. Defaults to 0644. Directories within the path are not affected by
                    # this setting. This might be in conflict with other options that affect the
                    # file mode, like fsGroup, and the result can be other mode bits set.
                &quot;items&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If unspecified, each key-value pair in the Data field of the referenced
                    # Secret will be projected into the volume as a file whose name is the
                    # key and content is the value. If specified, the listed keys will be
                    # projected into the specified paths, and unlisted keys will not be
                    # present. If a key is specified which is not present in the Secret,
                    # the volume setup will error unless it is marked optional.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Maps a string key to a path within a volume.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to project.
                    &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The relative path of the file to map the key to.
                        # May not be an absolute path.
                        # May not contain the path element &#x27;..&#x27;.
                        # May not start with the string &#x27;..&#x27;.
                    &quot;mode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on this file, must be a value between 0 and 0777. If not
                        # specified, the volume defaultMode will be used. This might be in conflict
                        # with other options that affect the file mode, like fsGroup, and the result
                        # can be other mode bits set.
                  },
                ],
              },
              &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Volume&#x27;s name.
              &quot;secret&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # The contents of the target Secret&#x27;s Data field will be presented in a volume
                  # as files using the keys in the Data field as the file names.
                &quot;optional&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Specify whether the Secret or its keys must be defined.
                &quot;defaultMode&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Mode bits to use on created files by default. Must be a value between 0 and
                    # 0777. Defaults to 0644. Directories within the path are not affected by
                    # this setting. This might be in conflict with other options that affect the
                    # file mode, like fsGroup, and the result can be other mode bits set.
                &quot;secretName&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Name of the secret in the container&#x27;s namespace to use.
                &quot;items&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If unspecified, each key-value pair in the Data field of the referenced
                    # Secret will be projected into the volume as a file whose name is the
                    # key and content is the value. If specified, the listed keys will be
                    # projected into the specified paths, and unlisted keys will not be
                    # present. If a key is specified which is not present in the Secret,
                    # the volume setup will error unless it is marked optional.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Maps a string key to a path within a volume.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to project.
                    &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The relative path of the file to map the key to.
                        # May not be an absolute path.
                        # May not contain the path element &#x27;..&#x27;.
                        # May not start with the string &#x27;..&#x27;.
                    &quot;mode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on this file, must be a value between 0 and 0777. If not
                        # specified, the volume defaultMode will be used. This might be in conflict
                        # with other options that affect the file mode, like fsGroup, and the result
                        # can be other mode bits set.
                  },
                ],
              },
            },
          ],
          &quot;containerConcurrency&quot;: 42, # (Optional)
              #
              # ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
              # requests per container instance of the Revision.
              #
              # Cloud Run fully managed: supported, defaults to 80
              #
              # Cloud Run for Anthos: supported, defaults to 0, which means concurrency
              # to the application is not limited, and the system decides the
              # target concurrency for the autoscaler.
          &quot;timeoutSeconds&quot;: 42, # TimeoutSeconds holds the max duration the instance is allowed for
              # responding to a request.
              # Not currently used by Cloud Run.
          &quot;serviceAccountName&quot;: &quot;A String&quot;, # Email address of the IAM service account associated with the revision
              # of the service. The service account represents the identity of the
              # running revision, and determines what permissions the revision has. If
              # not provided, the revision will use the project&#x27;s default service account.
          &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution
              # for this Revision. In the context of a Revision, we disallow a number of
              # fields on this Container, including: name and lifecycle.
              # In Cloud Run, only a single container may be provided.
              # The runtime contract is documented here:
              # https://github.com/knative/serving/blob/master/docs/runtime-contract.md
            { # A single application container.
                # This specifies both the container to run, the command to run in the container
                # and the arguments to supply to it.
                # Note that additional arguments may be supplied by the system to the container
                # at runtime.
              &quot;volumeMounts&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Pod volumes to mount into the container&#x27;s filesystem.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # VolumeMount describes a mounting of a Volume within a container.
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # This must match the Name of a Volume.
                  &quot;readOnly&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Only true is accepted.
                      # Defaults to true.
                  &quot;mountPath&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path within the container at which the volume should be mounted.  Must
                      # not contain &#x27;:&#x27;.
                  &quot;subPath&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path within the volume from which the container&#x27;s volume should be mounted.
                      # Defaults to &quot;&quot; (volume&#x27;s root).
                },
              ],
              &quot;args&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Arguments to the entrypoint.
                  # The docker image&#x27;s CMD is used if this is not provided.
                  # Variable references $(VAR_NAME) are expanded using the container&#x27;s
                  # environment. If a variable cannot be resolved, the reference in the input
                  # string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
                  # double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
                  # regardless of whether the variable exists or not.
                  # More info:
                  # https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
                &quot;A String&quot;,
              ],
              &quot;workingDir&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Container&#x27;s working directory.
                  # If not specified, the container runtime&#x27;s default will be used, which
                  # might be configured in the container image.
              &quot;ports&quot;: [ # (Optional)
                  #
                  # List of ports to expose from the container. Only a single port can be
                  # specified. The specified ports must be listening on all interfaces
                  # (0.0.0.0) within the container to be accessible.
                  #
                  # If omitted, a port number will be chosen and passed to the container
                  # through the PORT environment variable for the container to listen on.
                { # ContainerPort represents a network port in a single container.
                  &quot;containerPort&quot;: 42, # (Optional)
                      #
                      # Port number the container listens on.
                      # This must be a valid port number, 0 &lt; x &lt; 65536.
                  &quot;protocol&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Protocol for port. Must be &quot;TCP&quot;.
                      # Defaults to &quot;TCP&quot;.
                  &quot;name&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # If specified, used to specify which protocol to use.
                      # Allowed values are &quot;http1&quot; and &quot;h2c&quot;.
                },
              ],
              &quot;image&quot;: &quot;A String&quot;, # Cloud Run fully managed: only supports containers from Google Container
                  # Registry
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # URL of the Container image.
                  # More info: https://kubernetes.io/docs/concepts/containers/images
              &quot;envFrom&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of sources to populate environment variables in the container.
                  # The keys defined within a source must be a C_IDENTIFIER. All invalid keys
                  # will be reported as an event when the container is starting. When a key
                  # exists in multiple sources, the value associated with the last source will
                  # take precedence. Values defined by an Env with a duplicate key will take
                  # precedence. Cannot be updated.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # EnvFromSource represents the source of a set of ConfigMaps
                  &quot;prefix&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # An optional identifier to prepend to each key in the ConfigMap. Must be a
                      # C_IDENTIFIER.
                  &quot;configMapRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The ConfigMap to select from
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # ConfigMapEnvSource selects a ConfigMap to populate the environment
                      # variables with.
                      #
                      # The contents of the target ConfigMap&#x27;s Data field will represent the
                      # key-value pairs as environment variables.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the ConfigMap must be defined
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The ConfigMap to select from.
                  },
                  &quot;secretRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The Secret to select from
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # SecretEnvSource selects a Secret to populate the environment
                      # variables with.
                      #
                      # The contents of the target Secret&#x27;s Data field will represent the
                      # key-value pairs as environment variables.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret must be defined
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The Secret to select from.
                  },
                },
              ],
              &quot;name&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Name of the container specified as a DNS_LABEL.
              &quot;command&quot;: [
                &quot;A String&quot;,
              ],
              &quot;terminationMessagePolicy&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Indicate how the termination message should be populated. File will use the
                  # contents of terminationMessagePath to populate the container status message
                  # on both success and failure. FallbackToLogsOnError will use the last chunk
                  # of container log output if the termination message file is empty and the
                  # container exited with an error. The log output is limited to 2048 bytes or
                  # 80 lines, whichever is smaller. Defaults to File. Cannot be updated.
              &quot;securityContext&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Security options the pod should run with.
                  # More info: https://kubernetes.io/docs/concepts/policy/security-context/
                  # More info:
                  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # SecurityContext holds security configuration that will be applied to a
                  # container. Some fields are present in both SecurityContext and
                  # PodSecurityContext.  When both are set, the values in SecurityContext take
                  # precedence.
                &quot;runAsUser&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The UID to run the entrypoint of the container process.
                    # Defaults to user specified in image metadata if unspecified.
                    # May also be set in PodSecurityContext.  If set in both SecurityContext and
                    # PodSecurityContext, the value specified in SecurityContext takes
                    # precedence.
              },
              &quot;livenessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Periodic probe of container liveness.
                  # Container will be restarted if the probe fails.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Probe describes a health check to be performed against a container to
                  # determine whether it is alive or ready to receive traffic.
                &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGet specifies the http request to perform.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGetAction describes an action based on HTTP Get requests.
                  &quot;httpHeaders&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Custom headers to set in the request. HTTP allows repeated headers.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPHeader describes a custom header to be used in HTTP probes
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field name
                      &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field value
                    },
                  ],
                  &quot;path&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path to access on the HTTP server.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Host name to connect to, defaults to the pod IP. You probably want to set
                      # &quot;Host&quot; in httpHeaders instead.
                  &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Scheme to use for connecting to the host.
                      # Defaults to HTTP.
                },
                &quot;failureThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive failures for the probe to be considered failed after
                    # having succeeded. Defaults to 3. Minimum value is 1.
                &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # One and only one of the following should be specified.
                    # Exec specifies the action to take.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ExecAction describes a &quot;run in container&quot; action.
                  &quot;command&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Command is the command line to execute inside the container, the working
                      # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                      # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                      # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                      # explicitly call out to that shell. Exit status of 0 is treated as
                      # live/healthy and non-zero is unhealthy.
                },
                &quot;initialDelaySeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after the container has started before liveness probes
                    # are initiated. More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;timeoutSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after which the probe times out.
                    # Defaults to 1 second. Minimum value is 1.
                    # More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;successThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive successes for the probe to be considered successful
                    # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                    # is 1.
                &quot;periodSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # How often (in seconds) to perform the probe.
                    # Default to 10 seconds. Minimum value is 1.
                &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocket specifies an action involving a TCP port.
                    # TCP hooks not yet supported
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocketAction describes an action based on opening a socket
                  &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Number or name of the port to access on the container.
                      # Number must be in the range 1 to 65535.
                      # Name must be an IANA_SVC_NAME.
                      #
                      # This field is currently limited to integer types only because of proto&#x27;s
                      # inability to properly support the IntOrString golang type.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Optional: Host name to connect to, defaults to the pod IP.
                },
              },
              &quot;env&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of environment variables to set in the container.
                { # EnvVar represents an environment variable present in a Container.
                  &quot;name&quot;: &quot;A String&quot;, # Name of the environment variable. Must be a C_IDENTIFIER.
                  &quot;valueFrom&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Source for the environment variable&#x27;s value. Cannot be used if value is not
                      # empty.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # EnvVarSource represents a source for the value of an EnvVar.
                    &quot;secretKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key of a secret in the pod&#x27;s namespace
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # SecretKeySelector selects a key of a Secret.
                      &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The key of the secret to select from.  Must be a valid secret key.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The name of the secret in the pod&#x27;s namespace to select from.
                      &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                          # directly into the message. Use the &quot;name&quot; field instead.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # LocalObjectReference contains enough information to let you locate the
                          # referenced object inside the same namespace.
                        &quot;name&quot;: &quot;A String&quot;, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Name of the referent.
                            # More info:
                            # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                      },
                      &quot;optional&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Specify whether the Secret or its key must be defined
                    },
                    &quot;configMapKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key of a ConfigMap.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key from a ConfigMap.
                      &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                          # directly into the message. Use the &quot;name&quot; field instead.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # LocalObjectReference contains enough information to let you locate the
                          # referenced object inside the same namespace.
                        &quot;name&quot;: &quot;A String&quot;, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Name of the referent.
                            # More info:
                            # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                      },
                      &quot;optional&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Specify whether the ConfigMap or its key must be defined
                      &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The key to select.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The ConfigMap to select from.
                    },
                  },
                  &quot;value&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Variable references $(VAR_NAME) are expanded
                      # using the previous defined environment variables in the container and
                      # any route environment variables. If a variable cannot be resolved,
                      # the reference in the input string will be unchanged. The $(VAR_NAME)
                      # syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
                      # references will never be expanded, regardless of whether the variable
                      # exists or not.
                      # Defaults to &quot;&quot;.
                },
              ],
              &quot;resources&quot;: { # ResourceRequirements describes the compute resource requirements. # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Compute Resources required by this container.
                  # More info:
                  # https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
                &quot;limits&quot;: { # (Optional)
                    #
                    # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                    # supported value for CPU is &#x27;1&#x27;.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Limits describes the maximum amount of compute resources allowed.
                    # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                    # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
                &quot;requests&quot;: { # (Optional)
                    #
                    # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                    # supported value for CPU is &#x27;1&#x27;.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Requests describes the minimum amount of compute resources required.
                    # If Requests is omitted for a container, it defaults to Limits if that is
                    # explicitly specified, otherwise to an implementation-defined value.
                    # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                    # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
              },
              &quot;readinessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Periodic probe of container service readiness.
                  # Container will be removed from service endpoints if the probe fails.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Probe describes a health check to be performed against a container to
                  # determine whether it is alive or ready to receive traffic.
                &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGet specifies the http request to perform.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGetAction describes an action based on HTTP Get requests.
                  &quot;httpHeaders&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Custom headers to set in the request. HTTP allows repeated headers.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPHeader describes a custom header to be used in HTTP probes
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field name
                      &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field value
                    },
                  ],
                  &quot;path&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path to access on the HTTP server.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Host name to connect to, defaults to the pod IP. You probably want to set
                      # &quot;Host&quot; in httpHeaders instead.
                  &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Scheme to use for connecting to the host.
                      # Defaults to HTTP.
                },
                &quot;failureThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive failures for the probe to be considered failed after
                    # having succeeded. Defaults to 3. Minimum value is 1.
                &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # One and only one of the following should be specified.
                    # Exec specifies the action to take.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ExecAction describes a &quot;run in container&quot; action.
                  &quot;command&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Command is the command line to execute inside the container, the working
                      # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                      # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                      # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                      # explicitly call out to that shell. Exit status of 0 is treated as
                      # live/healthy and non-zero is unhealthy.
                },
                &quot;initialDelaySeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after the container has started before liveness probes
                    # are initiated. More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;timeoutSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after which the probe times out.
                    # Defaults to 1 second. Minimum value is 1.
                    # More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;successThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive successes for the probe to be considered successful
                    # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                    # is 1.
                &quot;periodSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # How often (in seconds) to perform the probe.
                    # Default to 10 seconds. Minimum value is 1.
                &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocket specifies an action involving a TCP port.
                    # TCP hooks not yet supported
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocketAction describes an action based on opening a socket
                  &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Number or name of the port to access on the container.
                      # Number must be in the range 1 to 65535.
                      # Name must be an IANA_SVC_NAME.
                      #
                      # This field is currently limited to integer types only because of proto&#x27;s
                      # inability to properly support the IntOrString golang type.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Optional: Host name to connect to, defaults to the pod IP.
                },
              },
              &quot;imagePullPolicy&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Image pull policy.
                  # One of Always, Never, IfNotPresent.
                  # Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.
                  # More info:
                  # https://kubernetes.io/docs/concepts/containers/images#updating-images
              &quot;terminationMessagePath&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Path at which the file to which the container&#x27;s termination
                  # message will be written is mounted into the container&#x27;s filesystem. Message
                  # written is intended to be brief final status, such as an assertion failure
                  # message. Will be truncated by the node if greater than 4096 bytes. The
                  # total message length across all containers will be limited to 12kb.
                  # Defaults to /dev/termination-log.
            },
          ],
        },
      },
    },
    &quot;kind&quot;: &quot;A String&quot;, # The kind of resource, in this case &quot;Service&quot;.
    &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Metadata associated with this Service, including name, namespace, labels,
        # and annotations.
        # persisted resources must have, which includes all objects users must create.
      &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
          #
          # CreationTimestamp is a timestamp representing the server time when this
          # object was created. It is not guaranteed to be set in happens-before order
          # across separate operations. Clients may not set this value. It is
          # represented in RFC3339 form and is in UTC.
          #
          # Populated by the system.
          # Read-only.
          # Null for lists.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
      &quot;labels&quot;: { # (Optional)
          #
          # Map of string keys and values that can be used to organize and categorize
          # (scope and select) objects. May match selectors of replication controllers
          # and routes.
          # More info: http://kubernetes.io/docs/user-guide/labels
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;generation&quot;: 42, # (Optional)
          #
          # A sequence number representing a specific generation of the desired state.
          # Populated by the system. Read-only.
      &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
          #
          # An opaque value that represents the internal version of this object that
          # can be used by clients to determine when objects have changed. May be used
          # for optimistic concurrency, change detection, and the watch operation on a
          # resource or set of resources. Clients must treat these values as opaque and
          # passed unmodified back to the server. They may only be valid for a
          # particular resource or set of resources.
          #
          # Populated by the system.
          # Read-only.
          # Value must be treated as opaque by clients and .
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
      &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
          #
          # SelfLink is a URL representing this object.
          # Populated by the system.
          # Read-only.
          #  string selfLink = 4;
      &quot;uid&quot;: &quot;A String&quot;, # (Optional)
          #
          # UID is the unique in time and space value for this object. It is typically
          # generated by the server on successful creation of a resource and is not
          # allowed to change on PUT operations.
          #
          # Populated by the system.
          # Read-only.
          # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
      &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
          # Cloud Run region. In Cloud Run the namespace must be equal to either the
          # project ID or project number.
      &quot;annotations&quot;: { # (Optional)
          #
          # Annotations is an unstructured key value map stored with a resource that
          # may be set by external tools to store and retrieve arbitrary metadata. They
          # are not queryable and should be preserved when modifying objects. More
          # info: http://kubernetes.io/docs/user-guide/annotations
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # GenerateName is an optional prefix, used by the server, to generate a
          # unique name ONLY IF the Name field has not been provided. If this field is
          # used, the name returned to the client will be different than the name
          # passed. This value will also be combined with a unique suffix. The provided
          # value has the same validation rules as the Name field, and may be truncated
          # by the length of the suffix required to make the value unique on the
          # server.
          #
          # If this field is specified and the generated name exists, the server will
          # NOT return a 409 - instead, it will either return 201 Created or 500 with
          # Reason ServerTimeout indicating a unique name could not be found in the
          # time allotted, and the client should retry (optionally after the time
          # indicated in the Retry-After header).
          #
          # Applied only if Name is not specified.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
          #  string generateName = 2;
      &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
          # Is required when creating
          # resources, although some resources may allow a client to request the
          # generation of an appropriate name automatically. Name is primarily intended
          # for creation idempotence and configuration definition. Cannot be updated.
          # More info: http://kubernetes.io/docs/user-guide/identifiers#names
          # +optional
      &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # Number of seconds allowed for this object to gracefully terminate before
          # it will be removed from the system. Only set when deletionTimestamp is also
          # set. May only be shortened. Read-only.
      &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # The name of the cluster which the object belongs to.
          # This is used to distinguish resources with same name and namespace in
          # different clusters. This field is not set anywhere right now and apiserver
          # is going to ignore it if set in create or update request.
      &quot;finalizers&quot;: [ # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # Must be empty before the object is deleted from the registry. Each entry
          # is an identifier for the responsible component that will remove the entry
          # from the list. If the deletionTimestamp of the object is non-nil, entries
          # in this list can only be removed.
          # +patchStrategy=merge
        &quot;A String&quot;,
      ],
      &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # DeletionTimestamp is RFC 3339 date and time at which this resource will be
          # deleted. This field is set by the server when a graceful deletion is
          # requested by the user, and is not directly settable by a client. The
          # resource is expected to be deleted (no longer visible from resource lists,
          # and not reachable by name) after the time in this field, once the
          # finalizers list is empty. As long as the finalizers list contains items,
          # deletion is blocked. Once the deletionTimestamp is set, this value may not
          # be unset or be set further into the future, although it may be shortened or
          # the resource may be deleted prior to this time. For example, a user may
          # request that a pod is deleted in 30 seconds. The Kubelet will react by
          # sending a graceful termination signal to the containers in the pod. After
          # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
          # to the container and after cleanup, remove the pod from the API. In the
          # presence of network partitions, this object may still exist after this
          # timestamp, until an administrator or automated process can determine the
          # resource is fully terminated.
          # If not set, graceful deletion of the object has not been requested.
          #
          # Populated by the system when a graceful deletion is requested.
          # Read-only.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
      &quot;ownerReferences&quot;: [ # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # List of objects that own this object. If ALL objects in the list have
          # been deleted, this object will be garbage collected.
        { # OwnerReference contains enough information to let you identify an owning
            # object. Currently, an owning object must be in the same namespace, so there
            # is no namespace field.
          &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
              # +optional
          &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
          &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
              # the owner cannot be deleted from the key-value store until this
              # reference is removed.
              # Defaults to false.
              # To set this field, a user needs &quot;delete&quot; permission of the owner,
              # otherwise 422 (Unprocessable Entity) will be returned.
              # +optional
          &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
          &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
        },
      ],
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, apiVersion=None, propagationPolicy=None, kind=None, x__xgafv=None)</code>
  <pre>Delete a service.
This will cause the Service to stop serving traffic and will delete the
child entities like Routes, Configurations and Revisions.

Args:
  name: string, The name of the service to delete.
For Cloud Run (fully managed), replace {namespace_id} with the project ID
or number. (required)
  apiVersion: string, Cloud Run currently ignores this parameter.
  propagationPolicy: string, Specifies the propagation policy of delete. Cloud Run currently ignores
this setting, and deletes in the background. Please see
kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/ for
more information.
  kind: string, Cloud Run currently ignores this parameter.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Status is a return value for calls that don&#x27;t return other objects
    &quot;metadata&quot;: { # ListMeta describes metadata that synthetic resources must have, including # Standard list metadata.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
        # +optional
        # lists and various status objects. A resource may have only one of
        # {ObjectMeta, ListMeta}.
      &quot;resourceVersion&quot;: &quot;A String&quot;, # String that identifies the server&#x27;s internal version of this object that
          # can be used by clients to determine when objects have changed. Value must
          # be treated as opaque by clients and passed unmodified back to the server.
          # Populated by the system.
          # Read-only.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
          # +optional
      &quot;continue&quot;: &quot;A String&quot;, # continue may be set if the user set a limit on the number of items
          # returned, and indicates that the server has more data available. The value
          # is opaque and may be used to issue another request to the endpoint that
          # served this list to retrieve the next set of available objects. Continuing
          # a list may not be possible if the server configuration has changed or more
          # than a few minutes have passed. The resourceVersion field returned when
          # using this continue value will be identical to the value in the first
          # response.
      &quot;selfLink&quot;: &quot;A String&quot;, # SelfLink is a URL representing this object.
          # Populated by the system.
          # Read-only.
          # +optional
    },
    &quot;code&quot;: 42, # Suggested HTTP return code for this status, 0 if not set.
        # +optional
    &quot;message&quot;: &quot;A String&quot;, # A human-readable description of the status of this operation.
        # +optional
    &quot;status&quot;: &quot;A String&quot;, # Status of the operation.
        # One of: &quot;Success&quot; or &quot;Failure&quot;.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
        # +optional
    &quot;details&quot;: { # StatusDetails is a set of additional properties that MAY be set by the # Extended data associated with the reason.  Each reason may define its
        # own extended details. This field is optional and the data returned
        # is not guaranteed to conform to any schema except that defined by
        # the reason type.
        # +optional
        # server to provide additional information about a response. The Reason
        # field of a Status object defines what attributes will be set. Clients
        # must ignore fields that do not match the defined type of each attribute,
        # and should assume that any attribute may be empty, invalid, or under
        # defined.
      &quot;name&quot;: &quot;A String&quot;, # The name attribute of the resource associated with the status StatusReason
          # (when there is a single name which can be described).
          # +optional
      &quot;uid&quot;: &quot;A String&quot;, # UID of the resource.
          # (when there is a single resource which can be described).
          # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          # +optional
      &quot;group&quot;: &quot;A String&quot;, # The group attribute of the resource associated with the status
          # StatusReason. +optional
      &quot;causes&quot;: [ # The Causes array includes more details associated with the StatusReason
          # failure. Not all StatusReasons may provide detailed causes.
          # +optional
        { # StatusCause provides more information about an api.Status failure, including
            # cases when multiple errors are encountered.
          &quot;message&quot;: &quot;A String&quot;, # A human-readable description of the cause of the error.  This field may be
              # presented as-is to a reader.
              # +optional
          &quot;reason&quot;: &quot;A String&quot;, # A machine-readable description of the cause of the error. If this value is
              # empty there is no information available.
              # +optional
          &quot;field&quot;: &quot;A String&quot;, # The field of the resource that has caused this error, as named by its JSON
              # serialization. May include dot and postfix notation for nested attributes.
              # Arrays are zero-indexed.  Fields may appear more than once in an array of
              # causes due to fields having multiple errors.
              # Optional.
              #
              # Examples:
              #   &quot;name&quot; - the field &quot;name&quot; on the current resource
              #   &quot;items[0].name&quot; - the field &quot;name&quot; on the first array entry in &quot;items&quot;
              # +optional
        },
      ],
      &quot;kind&quot;: &quot;A String&quot;, # The kind attribute of the resource associated with the status StatusReason.
          # On some operations may differ from the requested resource Kind.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
          # +optional
      &quot;retryAfterSeconds&quot;: 42, # If specified, the time in seconds before the operation should be retried.
          # Some errors may indicate the client must take an alternate action - for
          # those errors this field may indicate how long to wait before taking the
          # alternate action. +optional
    },
    &quot;reason&quot;: &quot;A String&quot;, # A machine-readable description of why this operation is in the
        # &quot;Failure&quot; status. If this value is empty there
        # is no information available. A Reason clarifies an HTTP status
        # code but does not override it.
        # +optional
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Get information about a service.

Args:
  name: string, The name of the service to retrieve.
For Cloud Run (fully managed), replace {namespace_id} with the project ID
or number. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Service acts as a top-level container that manages a set of Routes and
      # Configurations which implement a network service. Service exists to provide a
      # singular abstraction which can be access controlled, reasoned about, and
      # which encapsulates software lifecycle decisions such as rollout policy and
      # team resource ownership. Service acts only as an orchestrator of the
      # underlying Routes and Configurations (much as a kubernetes Deployment
      # orchestrates ReplicaSets).
      #
      # The Service&#x27;s controller will track the statuses of its owned Configuration
      # and Route, reflecting their statuses and conditions as its own.
      #
      # See also:
      # https://github.com/knative/serving/blob/master/docs/spec/overview.md#service
    &quot;status&quot;: { # The current state of the Service. Output only. # Status communicates the observed state of the Service (from the
        # controller).
      &quot;latestCreatedRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
          # LatestCreatedRevisionName is the last revision that was created from this
          # Service&#x27;s Configuration. It might not be ready yet, for that use
          # LatestReadyRevisionName.
      &quot;conditions&quot;: [ # Conditions communicates information about ongoing/complete
          # reconciliation processes that bring the &quot;spec&quot; inline with the observed
          # state of the world.
          # Service-specific conditions include:
          # * &quot;ConfigurationsReady&quot;: true when the underlying Configuration is ready.
          # * &quot;RoutesReady&quot;: true when the underlying Route is ready.
          # * &quot;Ready&quot;: true when both the underlying Route and Configuration are
          # ready.
        { # Condition defines a generic condition for a Resource
          &quot;message&quot;: &quot;A String&quot;, # Optional. Human readable message indicating details about the current status.
          &quot;lastTransitionTime&quot;: &quot;A String&quot;, # Optional. Last time the condition transitioned from one status to another.
          &quot;status&quot;: &quot;A String&quot;, # Status of the condition, one of True, False, Unknown.
          &quot;severity&quot;: &quot;A String&quot;, # Optional. How to interpret failures of this condition, one of Error, Warning, Info
          &quot;reason&quot;: &quot;A String&quot;, # Optional. One-word CamelCase reason for the condition&#x27;s last transition.
          &quot;type&quot;: &quot;A String&quot;, # type is used to communicate the status of the reconciliation process.
              # See also:
              # https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting
              # Types common to all resources include:
              # * &quot;Ready&quot;: True when the Resource is ready.
        },
      ],
      &quot;address&quot;: { # Information for connecting over HTTP(s). # From RouteStatus.
          # Similar to url, information on where the service is available on HTTP.
        &quot;url&quot;: &quot;A String&quot;,
      },
      &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Route that
          # was last processed by the controller.
          #
          # Clients polling for completed reconciliation should poll until
          # observedGeneration = metadata.generation and the Ready condition&#x27;s status
          # is True or False.
      &quot;url&quot;: &quot;A String&quot;, # From RouteStatus.
          # URL holds the url that will distribute traffic over the provided traffic
          # targets. It generally has the form
          # https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app
      &quot;traffic&quot;: [ # From RouteStatus.
          # Traffic holds the configured traffic distribution.
          # These entries will always contain RevisionName references.
          # When ConfigurationName appears in the spec, this will hold the
          # LatestReadyRevisionName that we last observed.
        { # TrafficTarget holds a single entry of the routing table for a Route.
          &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
              # is displayed in status, and is disallowed on spec. URL must contain a
              # scheme (e.g. http://) and a hostname, but may not contain anything else
              # (e.g. basic auth, url path, etc.
              #
              # Not currently supported in Cloud Run.
          &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
              # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
              # of the referenced configuration changes, we will automatically migrate
              # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
              # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
              # with RevisionName.
              #
              # Cloud Run currently supports a single ConfigurationName.
          &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
              # This defaults to zero if unspecified.
              #
              # Cloud Run currently requires 100 percent for a single ConfigurationName
              # TrafficTarget entry.
          &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
              # traffic. This is mutually exclusive with ConfigurationName.
              #
              # Providing RevisionName in spec is not currently supported by Cloud Run.
          &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
              # ready Revision of the Configuration should be used for this traffic
              # target. When provided LatestRevision must be true if RevisionName is
              # empty; it must be false when RevisionName is non-empty.
              #
              # +optional
          &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
              # this target exclusively.
              #
              # Not currently supported in Cloud Run.
              # +optional
        },
      ],
      &quot;latestReadyRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
          # LatestReadyRevisionName holds the name of the latest Revision stamped out
          # from this Service&#x27;s Configuration that has had its &quot;Ready&quot; condition become
          # &quot;True&quot;.
    },
    &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
    &quot;spec&quot;: { # ServiceSpec holds the desired state of the Route (from the client), which # Spec holds the desired state of the Service (from the client).
        # is used to manipulate the underlying Route and Configuration(s).
      &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative
          # Revisions and Configurations.
        { # TrafficTarget holds a single entry of the routing table for a Route.
          &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
              # is displayed in status, and is disallowed on spec. URL must contain a
              # scheme (e.g. http://) and a hostname, but may not contain anything else
              # (e.g. basic auth, url path, etc.
              #
              # Not currently supported in Cloud Run.
          &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
              # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
              # of the referenced configuration changes, we will automatically migrate
              # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
              # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
              # with RevisionName.
              #
              # Cloud Run currently supports a single ConfigurationName.
          &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
              # This defaults to zero if unspecified.
              #
              # Cloud Run currently requires 100 percent for a single ConfigurationName
              # TrafficTarget entry.
          &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
              # traffic. This is mutually exclusive with ConfigurationName.
              #
              # Providing RevisionName in spec is not currently supported by Cloud Run.
          &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
              # ready Revision of the Configuration should be used for this traffic
              # target. When provided LatestRevision must be true if RevisionName is
              # empty; it must be false when RevisionName is non-empty.
              #
              # +optional
          &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
              # this target exclusively.
              #
              # Not currently supported in Cloud Run.
              # +optional
        },
      ],
      &quot;template&quot;: { # RevisionTemplateSpec describes the data a revision should have when created # Template holds the latest specification for the Revision to
          # be stamped out.
          # from a template. Based on:
          # https://github.com/kubernetes/api/blob/e771f807/core/v1/types.go#L3179-L3190
        &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Optional metadata for this Revision, including labels and annotations. Name
            # will be generated by the Configuration.
            # To set minimum instances for this revision, use the
            # &quot;autoscaling.knative.dev/minScale&quot; annotation key.
            # To set maximum instances for this revision, use the
            # &quot;autoscaling.knative.dev/maxScale&quot; annotation key.
            # To set Cloud SQL connections for the revision, use the
            # &quot;run.googleapis.com/cloudsql-instances&quot; annotation key.
            # persisted resources must have, which includes all objects users must create.
          &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # CreationTimestamp is a timestamp representing the server time when this
              # object was created. It is not guaranteed to be set in happens-before order
              # across separate operations. Clients may not set this value. It is
              # represented in RFC3339 form and is in UTC.
              #
              # Populated by the system.
              # Read-only.
              # Null for lists.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;labels&quot;: { # (Optional)
              #
              # Map of string keys and values that can be used to organize and categorize
              # (scope and select) objects. May match selectors of replication controllers
              # and routes.
              # More info: http://kubernetes.io/docs/user-guide/labels
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generation&quot;: 42, # (Optional)
              #
              # A sequence number representing a specific generation of the desired state.
              # Populated by the system. Read-only.
          &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
              #
              # An opaque value that represents the internal version of this object that
              # can be used by clients to determine when objects have changed. May be used
              # for optimistic concurrency, change detection, and the watch operation on a
              # resource or set of resources. Clients must treat these values as opaque and
              # passed unmodified back to the server. They may only be valid for a
              # particular resource or set of resources.
              #
              # Populated by the system.
              # Read-only.
              # Value must be treated as opaque by clients and .
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
          &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
              #
              # SelfLink is a URL representing this object.
              # Populated by the system.
              # Read-only.
              #  string selfLink = 4;
          &quot;uid&quot;: &quot;A String&quot;, # (Optional)
              #
              # UID is the unique in time and space value for this object. It is typically
              # generated by the server on successful creation of a resource and is not
              # allowed to change on PUT operations.
              #
              # Populated by the system.
              # Read-only.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
              # Cloud Run region. In Cloud Run the namespace must be equal to either the
              # project ID or project number.
          &quot;annotations&quot;: { # (Optional)
              #
              # Annotations is an unstructured key value map stored with a resource that
              # may be set by external tools to store and retrieve arbitrary metadata. They
              # are not queryable and should be preserved when modifying objects. More
              # info: http://kubernetes.io/docs/user-guide/annotations
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # GenerateName is an optional prefix, used by the server, to generate a
              # unique name ONLY IF the Name field has not been provided. If this field is
              # used, the name returned to the client will be different than the name
              # passed. This value will also be combined with a unique suffix. The provided
              # value has the same validation rules as the Name field, and may be truncated
              # by the length of the suffix required to make the value unique on the
              # server.
              #
              # If this field is specified and the generated name exists, the server will
              # NOT return a 409 - instead, it will either return 201 Created or 500 with
              # Reason ServerTimeout indicating a unique name could not be found in the
              # time allotted, and the client should retry (optionally after the time
              # indicated in the Retry-After header).
              #
              # Applied only if Name is not specified.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
              #  string generateName = 2;
          &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
              # Is required when creating
              # resources, although some resources may allow a client to request the
              # generation of an appropriate name automatically. Name is primarily intended
              # for creation idempotence and configuration definition. Cannot be updated.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
              # +optional
          &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Number of seconds allowed for this object to gracefully terminate before
              # it will be removed from the system. Only set when deletionTimestamp is also
              # set. May only be shortened. Read-only.
          &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # The name of the cluster which the object belongs to.
              # This is used to distinguish resources with same name and namespace in
              # different clusters. This field is not set anywhere right now and apiserver
              # is going to ignore it if set in create or update request.
          &quot;finalizers&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Must be empty before the object is deleted from the registry. Each entry
              # is an identifier for the responsible component that will remove the entry
              # from the list. If the deletionTimestamp of the object is non-nil, entries
              # in this list can only be removed.
              # +patchStrategy=merge
            &quot;A String&quot;,
          ],
          &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # DeletionTimestamp is RFC 3339 date and time at which this resource will be
              # deleted. This field is set by the server when a graceful deletion is
              # requested by the user, and is not directly settable by a client. The
              # resource is expected to be deleted (no longer visible from resource lists,
              # and not reachable by name) after the time in this field, once the
              # finalizers list is empty. As long as the finalizers list contains items,
              # deletion is blocked. Once the deletionTimestamp is set, this value may not
              # be unset or be set further into the future, although it may be shortened or
              # the resource may be deleted prior to this time. For example, a user may
              # request that a pod is deleted in 30 seconds. The Kubelet will react by
              # sending a graceful termination signal to the containers in the pod. After
              # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
              # to the container and after cleanup, remove the pod from the API. In the
              # presence of network partitions, this object may still exist after this
              # timestamp, until an administrator or automated process can determine the
              # resource is fully terminated.
              # If not set, graceful deletion of the object has not been requested.
              #
              # Populated by the system when a graceful deletion is requested.
              # Read-only.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;ownerReferences&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # List of objects that own this object. If ALL objects in the list have
              # been deleted, this object will be garbage collected.
            { # OwnerReference contains enough information to let you identify an owning
                # object. Currently, an owning object must be in the same namespace, so there
                # is no namespace field.
              &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
              &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                  # +optional
              &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
              &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                  # the owner cannot be deleted from the key-value store until this
                  # reference is removed.
                  # Defaults to false.
                  # To set this field, a user needs &quot;delete&quot; permission of the owner,
                  # otherwise 422 (Unprocessable Entity) will be returned.
                  # +optional
              &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
              &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#names
            },
          ],
        },
        &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
          &quot;volumes&quot;: [
            { # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Volume represents a named volume in a container.
              &quot;configMap&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Adapts a ConfigMap into a volume.
                  # The contents of the target ConfigMap&#x27;s Data field will be presented in a
                  # volume as files using the keys in the Data field as the file names, unless
                  # the items element is populated with specific mappings of keys to paths.
                &quot;optional&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Specify whether the Secret or its keys must be defined.
                &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Name of the config.
                &quot;defaultMode&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Mode bits to use on created files by default. Must be a value between 0 and
                    # 0777. Defaults to 0644. Directories within the path are not affected by
                    # this setting. This might be in conflict with other options that affect the
                    # file mode, like fsGroup, and the result can be other mode bits set.
                &quot;items&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If unspecified, each key-value pair in the Data field of the referenced
                    # Secret will be projected into the volume as a file whose name is the
                    # key and content is the value. If specified, the listed keys will be
                    # projected into the specified paths, and unlisted keys will not be
                    # present. If a key is specified which is not present in the Secret,
                    # the volume setup will error unless it is marked optional.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Maps a string key to a path within a volume.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to project.
                    &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The relative path of the file to map the key to.
                        # May not be an absolute path.
                        # May not contain the path element &#x27;..&#x27;.
                        # May not start with the string &#x27;..&#x27;.
                    &quot;mode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on this file, must be a value between 0 and 0777. If not
                        # specified, the volume defaultMode will be used. This might be in conflict
                        # with other options that affect the file mode, like fsGroup, and the result
                        # can be other mode bits set.
                  },
                ],
              },
              &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Volume&#x27;s name.
              &quot;secret&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # The contents of the target Secret&#x27;s Data field will be presented in a volume
                  # as files using the keys in the Data field as the file names.
                &quot;optional&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Specify whether the Secret or its keys must be defined.
                &quot;defaultMode&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Mode bits to use on created files by default. Must be a value between 0 and
                    # 0777. Defaults to 0644. Directories within the path are not affected by
                    # this setting. This might be in conflict with other options that affect the
                    # file mode, like fsGroup, and the result can be other mode bits set.
                &quot;secretName&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Name of the secret in the container&#x27;s namespace to use.
                &quot;items&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If unspecified, each key-value pair in the Data field of the referenced
                    # Secret will be projected into the volume as a file whose name is the
                    # key and content is the value. If specified, the listed keys will be
                    # projected into the specified paths, and unlisted keys will not be
                    # present. If a key is specified which is not present in the Secret,
                    # the volume setup will error unless it is marked optional.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Maps a string key to a path within a volume.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to project.
                    &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The relative path of the file to map the key to.
                        # May not be an absolute path.
                        # May not contain the path element &#x27;..&#x27;.
                        # May not start with the string &#x27;..&#x27;.
                    &quot;mode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on this file, must be a value between 0 and 0777. If not
                        # specified, the volume defaultMode will be used. This might be in conflict
                        # with other options that affect the file mode, like fsGroup, and the result
                        # can be other mode bits set.
                  },
                ],
              },
            },
          ],
          &quot;containerConcurrency&quot;: 42, # (Optional)
              #
              # ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
              # requests per container instance of the Revision.
              #
              # Cloud Run fully managed: supported, defaults to 80
              #
              # Cloud Run for Anthos: supported, defaults to 0, which means concurrency
              # to the application is not limited, and the system decides the
              # target concurrency for the autoscaler.
          &quot;timeoutSeconds&quot;: 42, # TimeoutSeconds holds the max duration the instance is allowed for
              # responding to a request.
              # Not currently used by Cloud Run.
          &quot;serviceAccountName&quot;: &quot;A String&quot;, # Email address of the IAM service account associated with the revision
              # of the service. The service account represents the identity of the
              # running revision, and determines what permissions the revision has. If
              # not provided, the revision will use the project&#x27;s default service account.
          &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution
              # for this Revision. In the context of a Revision, we disallow a number of
              # fields on this Container, including: name and lifecycle.
              # In Cloud Run, only a single container may be provided.
              # The runtime contract is documented here:
              # https://github.com/knative/serving/blob/master/docs/runtime-contract.md
            { # A single application container.
                # This specifies both the container to run, the command to run in the container
                # and the arguments to supply to it.
                # Note that additional arguments may be supplied by the system to the container
                # at runtime.
              &quot;volumeMounts&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Pod volumes to mount into the container&#x27;s filesystem.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # VolumeMount describes a mounting of a Volume within a container.
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # This must match the Name of a Volume.
                  &quot;readOnly&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Only true is accepted.
                      # Defaults to true.
                  &quot;mountPath&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path within the container at which the volume should be mounted.  Must
                      # not contain &#x27;:&#x27;.
                  &quot;subPath&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path within the volume from which the container&#x27;s volume should be mounted.
                      # Defaults to &quot;&quot; (volume&#x27;s root).
                },
              ],
              &quot;args&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Arguments to the entrypoint.
                  # The docker image&#x27;s CMD is used if this is not provided.
                  # Variable references $(VAR_NAME) are expanded using the container&#x27;s
                  # environment. If a variable cannot be resolved, the reference in the input
                  # string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
                  # double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
                  # regardless of whether the variable exists or not.
                  # More info:
                  # https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
                &quot;A String&quot;,
              ],
              &quot;workingDir&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Container&#x27;s working directory.
                  # If not specified, the container runtime&#x27;s default will be used, which
                  # might be configured in the container image.
              &quot;ports&quot;: [ # (Optional)
                  #
                  # List of ports to expose from the container. Only a single port can be
                  # specified. The specified ports must be listening on all interfaces
                  # (0.0.0.0) within the container to be accessible.
                  #
                  # If omitted, a port number will be chosen and passed to the container
                  # through the PORT environment variable for the container to listen on.
                { # ContainerPort represents a network port in a single container.
                  &quot;containerPort&quot;: 42, # (Optional)
                      #
                      # Port number the container listens on.
                      # This must be a valid port number, 0 &lt; x &lt; 65536.
                  &quot;protocol&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Protocol for port. Must be &quot;TCP&quot;.
                      # Defaults to &quot;TCP&quot;.
                  &quot;name&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # If specified, used to specify which protocol to use.
                      # Allowed values are &quot;http1&quot; and &quot;h2c&quot;.
                },
              ],
              &quot;image&quot;: &quot;A String&quot;, # Cloud Run fully managed: only supports containers from Google Container
                  # Registry
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # URL of the Container image.
                  # More info: https://kubernetes.io/docs/concepts/containers/images
              &quot;envFrom&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of sources to populate environment variables in the container.
                  # The keys defined within a source must be a C_IDENTIFIER. All invalid keys
                  # will be reported as an event when the container is starting. When a key
                  # exists in multiple sources, the value associated with the last source will
                  # take precedence. Values defined by an Env with a duplicate key will take
                  # precedence. Cannot be updated.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # EnvFromSource represents the source of a set of ConfigMaps
                  &quot;prefix&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # An optional identifier to prepend to each key in the ConfigMap. Must be a
                      # C_IDENTIFIER.
                  &quot;configMapRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The ConfigMap to select from
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # ConfigMapEnvSource selects a ConfigMap to populate the environment
                      # variables with.
                      #
                      # The contents of the target ConfigMap&#x27;s Data field will represent the
                      # key-value pairs as environment variables.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the ConfigMap must be defined
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The ConfigMap to select from.
                  },
                  &quot;secretRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The Secret to select from
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # SecretEnvSource selects a Secret to populate the environment
                      # variables with.
                      #
                      # The contents of the target Secret&#x27;s Data field will represent the
                      # key-value pairs as environment variables.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret must be defined
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The Secret to select from.
                  },
                },
              ],
              &quot;name&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Name of the container specified as a DNS_LABEL.
              &quot;command&quot;: [
                &quot;A String&quot;,
              ],
              &quot;terminationMessagePolicy&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Indicate how the termination message should be populated. File will use the
                  # contents of terminationMessagePath to populate the container status message
                  # on both success and failure. FallbackToLogsOnError will use the last chunk
                  # of container log output if the termination message file is empty and the
                  # container exited with an error. The log output is limited to 2048 bytes or
                  # 80 lines, whichever is smaller. Defaults to File. Cannot be updated.
              &quot;securityContext&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Security options the pod should run with.
                  # More info: https://kubernetes.io/docs/concepts/policy/security-context/
                  # More info:
                  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # SecurityContext holds security configuration that will be applied to a
                  # container. Some fields are present in both SecurityContext and
                  # PodSecurityContext.  When both are set, the values in SecurityContext take
                  # precedence.
                &quot;runAsUser&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The UID to run the entrypoint of the container process.
                    # Defaults to user specified in image metadata if unspecified.
                    # May also be set in PodSecurityContext.  If set in both SecurityContext and
                    # PodSecurityContext, the value specified in SecurityContext takes
                    # precedence.
              },
              &quot;livenessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Periodic probe of container liveness.
                  # Container will be restarted if the probe fails.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Probe describes a health check to be performed against a container to
                  # determine whether it is alive or ready to receive traffic.
                &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGet specifies the http request to perform.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGetAction describes an action based on HTTP Get requests.
                  &quot;httpHeaders&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Custom headers to set in the request. HTTP allows repeated headers.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPHeader describes a custom header to be used in HTTP probes
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field name
                      &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field value
                    },
                  ],
                  &quot;path&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path to access on the HTTP server.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Host name to connect to, defaults to the pod IP. You probably want to set
                      # &quot;Host&quot; in httpHeaders instead.
                  &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Scheme to use for connecting to the host.
                      # Defaults to HTTP.
                },
                &quot;failureThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive failures for the probe to be considered failed after
                    # having succeeded. Defaults to 3. Minimum value is 1.
                &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # One and only one of the following should be specified.
                    # Exec specifies the action to take.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ExecAction describes a &quot;run in container&quot; action.
                  &quot;command&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Command is the command line to execute inside the container, the working
                      # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                      # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                      # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                      # explicitly call out to that shell. Exit status of 0 is treated as
                      # live/healthy and non-zero is unhealthy.
                },
                &quot;initialDelaySeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after the container has started before liveness probes
                    # are initiated. More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;timeoutSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after which the probe times out.
                    # Defaults to 1 second. Minimum value is 1.
                    # More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;successThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive successes for the probe to be considered successful
                    # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                    # is 1.
                &quot;periodSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # How often (in seconds) to perform the probe.
                    # Default to 10 seconds. Minimum value is 1.
                &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocket specifies an action involving a TCP port.
                    # TCP hooks not yet supported
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocketAction describes an action based on opening a socket
                  &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Number or name of the port to access on the container.
                      # Number must be in the range 1 to 65535.
                      # Name must be an IANA_SVC_NAME.
                      #
                      # This field is currently limited to integer types only because of proto&#x27;s
                      # inability to properly support the IntOrString golang type.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Optional: Host name to connect to, defaults to the pod IP.
                },
              },
              &quot;env&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of environment variables to set in the container.
                { # EnvVar represents an environment variable present in a Container.
                  &quot;name&quot;: &quot;A String&quot;, # Name of the environment variable. Must be a C_IDENTIFIER.
                  &quot;valueFrom&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Source for the environment variable&#x27;s value. Cannot be used if value is not
                      # empty.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # EnvVarSource represents a source for the value of an EnvVar.
                    &quot;secretKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key of a secret in the pod&#x27;s namespace
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # SecretKeySelector selects a key of a Secret.
                      &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The key of the secret to select from.  Must be a valid secret key.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The name of the secret in the pod&#x27;s namespace to select from.
                      &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                          # directly into the message. Use the &quot;name&quot; field instead.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # LocalObjectReference contains enough information to let you locate the
                          # referenced object inside the same namespace.
                        &quot;name&quot;: &quot;A String&quot;, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Name of the referent.
                            # More info:
                            # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                      },
                      &quot;optional&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Specify whether the Secret or its key must be defined
                    },
                    &quot;configMapKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key of a ConfigMap.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key from a ConfigMap.
                      &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                          # directly into the message. Use the &quot;name&quot; field instead.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # LocalObjectReference contains enough information to let you locate the
                          # referenced object inside the same namespace.
                        &quot;name&quot;: &quot;A String&quot;, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Name of the referent.
                            # More info:
                            # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                      },
                      &quot;optional&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Specify whether the ConfigMap or its key must be defined
                      &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The key to select.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The ConfigMap to select from.
                    },
                  },
                  &quot;value&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Variable references $(VAR_NAME) are expanded
                      # using the previous defined environment variables in the container and
                      # any route environment variables. If a variable cannot be resolved,
                      # the reference in the input string will be unchanged. The $(VAR_NAME)
                      # syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
                      # references will never be expanded, regardless of whether the variable
                      # exists or not.
                      # Defaults to &quot;&quot;.
                },
              ],
              &quot;resources&quot;: { # ResourceRequirements describes the compute resource requirements. # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Compute Resources required by this container.
                  # More info:
                  # https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
                &quot;limits&quot;: { # (Optional)
                    #
                    # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                    # supported value for CPU is &#x27;1&#x27;.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Limits describes the maximum amount of compute resources allowed.
                    # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                    # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
                &quot;requests&quot;: { # (Optional)
                    #
                    # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                    # supported value for CPU is &#x27;1&#x27;.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Requests describes the minimum amount of compute resources required.
                    # If Requests is omitted for a container, it defaults to Limits if that is
                    # explicitly specified, otherwise to an implementation-defined value.
                    # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                    # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
              },
              &quot;readinessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Periodic probe of container service readiness.
                  # Container will be removed from service endpoints if the probe fails.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Probe describes a health check to be performed against a container to
                  # determine whether it is alive or ready to receive traffic.
                &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGet specifies the http request to perform.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGetAction describes an action based on HTTP Get requests.
                  &quot;httpHeaders&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Custom headers to set in the request. HTTP allows repeated headers.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPHeader describes a custom header to be used in HTTP probes
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field name
                      &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field value
                    },
                  ],
                  &quot;path&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path to access on the HTTP server.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Host name to connect to, defaults to the pod IP. You probably want to set
                      # &quot;Host&quot; in httpHeaders instead.
                  &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Scheme to use for connecting to the host.
                      # Defaults to HTTP.
                },
                &quot;failureThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive failures for the probe to be considered failed after
                    # having succeeded. Defaults to 3. Minimum value is 1.
                &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # One and only one of the following should be specified.
                    # Exec specifies the action to take.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ExecAction describes a &quot;run in container&quot; action.
                  &quot;command&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Command is the command line to execute inside the container, the working
                      # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                      # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                      # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                      # explicitly call out to that shell. Exit status of 0 is treated as
                      # live/healthy and non-zero is unhealthy.
                },
                &quot;initialDelaySeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after the container has started before liveness probes
                    # are initiated. More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;timeoutSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after which the probe times out.
                    # Defaults to 1 second. Minimum value is 1.
                    # More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;successThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive successes for the probe to be considered successful
                    # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                    # is 1.
                &quot;periodSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # How often (in seconds) to perform the probe.
                    # Default to 10 seconds. Minimum value is 1.
                &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocket specifies an action involving a TCP port.
                    # TCP hooks not yet supported
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocketAction describes an action based on opening a socket
                  &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Number or name of the port to access on the container.
                      # Number must be in the range 1 to 65535.
                      # Name must be an IANA_SVC_NAME.
                      #
                      # This field is currently limited to integer types only because of proto&#x27;s
                      # inability to properly support the IntOrString golang type.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Optional: Host name to connect to, defaults to the pod IP.
                },
              },
              &quot;imagePullPolicy&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Image pull policy.
                  # One of Always, Never, IfNotPresent.
                  # Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.
                  # More info:
                  # https://kubernetes.io/docs/concepts/containers/images#updating-images
              &quot;terminationMessagePath&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Path at which the file to which the container&#x27;s termination
                  # message will be written is mounted into the container&#x27;s filesystem. Message
                  # written is intended to be brief final status, such as an assertion failure
                  # message. Will be truncated by the node if greater than 4096 bytes. The
                  # total message length across all containers will be limited to 12kb.
                  # Defaults to /dev/termination-log.
            },
          ],
        },
      },
    },
    &quot;kind&quot;: &quot;A String&quot;, # The kind of resource, in this case &quot;Service&quot;.
    &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Metadata associated with this Service, including name, namespace, labels,
        # and annotations.
        # persisted resources must have, which includes all objects users must create.
      &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
          #
          # CreationTimestamp is a timestamp representing the server time when this
          # object was created. It is not guaranteed to be set in happens-before order
          # across separate operations. Clients may not set this value. It is
          # represented in RFC3339 form and is in UTC.
          #
          # Populated by the system.
          # Read-only.
          # Null for lists.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
      &quot;labels&quot;: { # (Optional)
          #
          # Map of string keys and values that can be used to organize and categorize
          # (scope and select) objects. May match selectors of replication controllers
          # and routes.
          # More info: http://kubernetes.io/docs/user-guide/labels
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;generation&quot;: 42, # (Optional)
          #
          # A sequence number representing a specific generation of the desired state.
          # Populated by the system. Read-only.
      &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
          #
          # An opaque value that represents the internal version of this object that
          # can be used by clients to determine when objects have changed. May be used
          # for optimistic concurrency, change detection, and the watch operation on a
          # resource or set of resources. Clients must treat these values as opaque and
          # passed unmodified back to the server. They may only be valid for a
          # particular resource or set of resources.
          #
          # Populated by the system.
          # Read-only.
          # Value must be treated as opaque by clients and .
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
      &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
          #
          # SelfLink is a URL representing this object.
          # Populated by the system.
          # Read-only.
          #  string selfLink = 4;
      &quot;uid&quot;: &quot;A String&quot;, # (Optional)
          #
          # UID is the unique in time and space value for this object. It is typically
          # generated by the server on successful creation of a resource and is not
          # allowed to change on PUT operations.
          #
          # Populated by the system.
          # Read-only.
          # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
      &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
          # Cloud Run region. In Cloud Run the namespace must be equal to either the
          # project ID or project number.
      &quot;annotations&quot;: { # (Optional)
          #
          # Annotations is an unstructured key value map stored with a resource that
          # may be set by external tools to store and retrieve arbitrary metadata. They
          # are not queryable and should be preserved when modifying objects. More
          # info: http://kubernetes.io/docs/user-guide/annotations
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # GenerateName is an optional prefix, used by the server, to generate a
          # unique name ONLY IF the Name field has not been provided. If this field is
          # used, the name returned to the client will be different than the name
          # passed. This value will also be combined with a unique suffix. The provided
          # value has the same validation rules as the Name field, and may be truncated
          # by the length of the suffix required to make the value unique on the
          # server.
          #
          # If this field is specified and the generated name exists, the server will
          # NOT return a 409 - instead, it will either return 201 Created or 500 with
          # Reason ServerTimeout indicating a unique name could not be found in the
          # time allotted, and the client should retry (optionally after the time
          # indicated in the Retry-After header).
          #
          # Applied only if Name is not specified.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
          #  string generateName = 2;
      &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
          # Is required when creating
          # resources, although some resources may allow a client to request the
          # generation of an appropriate name automatically. Name is primarily intended
          # for creation idempotence and configuration definition. Cannot be updated.
          # More info: http://kubernetes.io/docs/user-guide/identifiers#names
          # +optional
      &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # Number of seconds allowed for this object to gracefully terminate before
          # it will be removed from the system. Only set when deletionTimestamp is also
          # set. May only be shortened. Read-only.
      &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # The name of the cluster which the object belongs to.
          # This is used to distinguish resources with same name and namespace in
          # different clusters. This field is not set anywhere right now and apiserver
          # is going to ignore it if set in create or update request.
      &quot;finalizers&quot;: [ # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # Must be empty before the object is deleted from the registry. Each entry
          # is an identifier for the responsible component that will remove the entry
          # from the list. If the deletionTimestamp of the object is non-nil, entries
          # in this list can only be removed.
          # +patchStrategy=merge
        &quot;A String&quot;,
      ],
      &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # DeletionTimestamp is RFC 3339 date and time at which this resource will be
          # deleted. This field is set by the server when a graceful deletion is
          # requested by the user, and is not directly settable by a client. The
          # resource is expected to be deleted (no longer visible from resource lists,
          # and not reachable by name) after the time in this field, once the
          # finalizers list is empty. As long as the finalizers list contains items,
          # deletion is blocked. Once the deletionTimestamp is set, this value may not
          # be unset or be set further into the future, although it may be shortened or
          # the resource may be deleted prior to this time. For example, a user may
          # request that a pod is deleted in 30 seconds. The Kubelet will react by
          # sending a graceful termination signal to the containers in the pod. After
          # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
          # to the container and after cleanup, remove the pod from the API. In the
          # presence of network partitions, this object may still exist after this
          # timestamp, until an administrator or automated process can determine the
          # resource is fully terminated.
          # If not set, graceful deletion of the object has not been requested.
          #
          # Populated by the system when a graceful deletion is requested.
          # Read-only.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
      &quot;ownerReferences&quot;: [ # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # List of objects that own this object. If ALL objects in the list have
          # been deleted, this object will be garbage collected.
        { # OwnerReference contains enough information to let you identify an owning
            # object. Currently, an owning object must be in the same namespace, so there
            # is no namespace field.
          &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
              # +optional
          &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
          &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
              # the owner cannot be deleted from the key-value store until this
              # reference is removed.
              # Defaults to false.
              # To set this field, a user needs &quot;delete&quot; permission of the owner,
              # otherwise 422 (Unprocessable Entity) will be returned.
              # +optional
          &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
          &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
        },
      ],
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(parent, labelSelector=None, resourceVersion=None, includeUninitialized=None, fieldSelector=None, continue=None, limit=None, watch=None, x__xgafv=None)</code>
  <pre>List services.

Args:
  parent: string, The namespace from which the services should be listed.
For Cloud Run (fully managed), replace {namespace_id} with the project ID
or number. (required)
  labelSelector: string, Allows to filter resources based on a label. Supported operations are
=, !=, exists, in, and notIn.
  resourceVersion: string, The baseline resource version from which the list or watch operation should
start. Not currently used by Cloud Run.
  includeUninitialized: boolean, Not currently used by Cloud Run.
  fieldSelector: string, Allows to filter resources based on a specific value for a field name.
Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;.
Not currently used by Cloud Run.
  continue: string, Optional encoded string to continue paging.
  limit: integer, The maximum number of records that should be returned.
  watch: boolean, Flag that indicates that the client expects to watch this resource as well.
Not currently used by Cloud Run.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A list of Service resources.
    &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
    &quot;kind&quot;: &quot;A String&quot;, # The kind of this resource, in this case &quot;ServiceList&quot;.
    &quot;unreachable&quot;: [ # Locations that could not be reached.
      &quot;A String&quot;,
    ],
    &quot;metadata&quot;: { # ListMeta describes metadata that synthetic resources must have, including # Metadata associated with this Service list.
        # lists and various status objects. A resource may have only one of
        # {ObjectMeta, ListMeta}.
      &quot;resourceVersion&quot;: &quot;A String&quot;, # String that identifies the server&#x27;s internal version of this object that
          # can be used by clients to determine when objects have changed. Value must
          # be treated as opaque by clients and passed unmodified back to the server.
          # Populated by the system.
          # Read-only.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
          # +optional
      &quot;continue&quot;: &quot;A String&quot;, # continue may be set if the user set a limit on the number of items
          # returned, and indicates that the server has more data available. The value
          # is opaque and may be used to issue another request to the endpoint that
          # served this list to retrieve the next set of available objects. Continuing
          # a list may not be possible if the server configuration has changed or more
          # than a few minutes have passed. The resourceVersion field returned when
          # using this continue value will be identical to the value in the first
          # response.
      &quot;selfLink&quot;: &quot;A String&quot;, # SelfLink is a URL representing this object.
          # Populated by the system.
          # Read-only.
          # +optional
    },
    &quot;items&quot;: [ # List of Services.
      { # Service acts as a top-level container that manages a set of Routes and
          # Configurations which implement a network service. Service exists to provide a
          # singular abstraction which can be access controlled, reasoned about, and
          # which encapsulates software lifecycle decisions such as rollout policy and
          # team resource ownership. Service acts only as an orchestrator of the
          # underlying Routes and Configurations (much as a kubernetes Deployment
          # orchestrates ReplicaSets).
          #
          # The Service&#x27;s controller will track the statuses of its owned Configuration
          # and Route, reflecting their statuses and conditions as its own.
          #
          # See also:
          # https://github.com/knative/serving/blob/master/docs/spec/overview.md#service
        &quot;status&quot;: { # The current state of the Service. Output only. # Status communicates the observed state of the Service (from the
            # controller).
          &quot;latestCreatedRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
              # LatestCreatedRevisionName is the last revision that was created from this
              # Service&#x27;s Configuration. It might not be ready yet, for that use
              # LatestReadyRevisionName.
          &quot;conditions&quot;: [ # Conditions communicates information about ongoing/complete
              # reconciliation processes that bring the &quot;spec&quot; inline with the observed
              # state of the world.
              # Service-specific conditions include:
              # * &quot;ConfigurationsReady&quot;: true when the underlying Configuration is ready.
              # * &quot;RoutesReady&quot;: true when the underlying Route is ready.
              # * &quot;Ready&quot;: true when both the underlying Route and Configuration are
              # ready.
            { # Condition defines a generic condition for a Resource
              &quot;message&quot;: &quot;A String&quot;, # Optional. Human readable message indicating details about the current status.
              &quot;lastTransitionTime&quot;: &quot;A String&quot;, # Optional. Last time the condition transitioned from one status to another.
              &quot;status&quot;: &quot;A String&quot;, # Status of the condition, one of True, False, Unknown.
              &quot;severity&quot;: &quot;A String&quot;, # Optional. How to interpret failures of this condition, one of Error, Warning, Info
              &quot;reason&quot;: &quot;A String&quot;, # Optional. One-word CamelCase reason for the condition&#x27;s last transition.
              &quot;type&quot;: &quot;A String&quot;, # type is used to communicate the status of the reconciliation process.
                  # See also:
                  # https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting
                  # Types common to all resources include:
                  # * &quot;Ready&quot;: True when the Resource is ready.
            },
          ],
          &quot;address&quot;: { # Information for connecting over HTTP(s). # From RouteStatus.
              # Similar to url, information on where the service is available on HTTP.
            &quot;url&quot;: &quot;A String&quot;,
          },
          &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Route that
              # was last processed by the controller.
              #
              # Clients polling for completed reconciliation should poll until
              # observedGeneration = metadata.generation and the Ready condition&#x27;s status
              # is True or False.
          &quot;url&quot;: &quot;A String&quot;, # From RouteStatus.
              # URL holds the url that will distribute traffic over the provided traffic
              # targets. It generally has the form
              # https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app
          &quot;traffic&quot;: [ # From RouteStatus.
              # Traffic holds the configured traffic distribution.
              # These entries will always contain RevisionName references.
              # When ConfigurationName appears in the spec, this will hold the
              # LatestReadyRevisionName that we last observed.
            { # TrafficTarget holds a single entry of the routing table for a Route.
              &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
                  # is displayed in status, and is disallowed on spec. URL must contain a
                  # scheme (e.g. http://) and a hostname, but may not contain anything else
                  # (e.g. basic auth, url path, etc.
                  #
                  # Not currently supported in Cloud Run.
              &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
                  # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
                  # of the referenced configuration changes, we will automatically migrate
                  # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
                  # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
                  # with RevisionName.
                  #
                  # Cloud Run currently supports a single ConfigurationName.
              &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
                  # This defaults to zero if unspecified.
                  #
                  # Cloud Run currently requires 100 percent for a single ConfigurationName
                  # TrafficTarget entry.
              &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
                  # traffic. This is mutually exclusive with ConfigurationName.
                  #
                  # Providing RevisionName in spec is not currently supported by Cloud Run.
              &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
                  # ready Revision of the Configuration should be used for this traffic
                  # target. When provided LatestRevision must be true if RevisionName is
                  # empty; it must be false when RevisionName is non-empty.
                  #
                  # +optional
              &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
                  # this target exclusively.
                  #
                  # Not currently supported in Cloud Run.
                  # +optional
            },
          ],
          &quot;latestReadyRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
              # LatestReadyRevisionName holds the name of the latest Revision stamped out
              # from this Service&#x27;s Configuration that has had its &quot;Ready&quot; condition become
              # &quot;True&quot;.
        },
        &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
        &quot;spec&quot;: { # ServiceSpec holds the desired state of the Route (from the client), which # Spec holds the desired state of the Service (from the client).
            # is used to manipulate the underlying Route and Configuration(s).
          &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative
              # Revisions and Configurations.
            { # TrafficTarget holds a single entry of the routing table for a Route.
              &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
                  # is displayed in status, and is disallowed on spec. URL must contain a
                  # scheme (e.g. http://) and a hostname, but may not contain anything else
                  # (e.g. basic auth, url path, etc.
                  #
                  # Not currently supported in Cloud Run.
              &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
                  # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
                  # of the referenced configuration changes, we will automatically migrate
                  # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
                  # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
                  # with RevisionName.
                  #
                  # Cloud Run currently supports a single ConfigurationName.
              &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
                  # This defaults to zero if unspecified.
                  #
                  # Cloud Run currently requires 100 percent for a single ConfigurationName
                  # TrafficTarget entry.
              &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
                  # traffic. This is mutually exclusive with ConfigurationName.
                  #
                  # Providing RevisionName in spec is not currently supported by Cloud Run.
              &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
                  # ready Revision of the Configuration should be used for this traffic
                  # target. When provided LatestRevision must be true if RevisionName is
                  # empty; it must be false when RevisionName is non-empty.
                  #
                  # +optional
              &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
                  # this target exclusively.
                  #
                  # Not currently supported in Cloud Run.
                  # +optional
            },
          ],
          &quot;template&quot;: { # RevisionTemplateSpec describes the data a revision should have when created # Template holds the latest specification for the Revision to
              # be stamped out.
              # from a template. Based on:
              # https://github.com/kubernetes/api/blob/e771f807/core/v1/types.go#L3179-L3190
            &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Optional metadata for this Revision, including labels and annotations. Name
                # will be generated by the Configuration.
                # To set minimum instances for this revision, use the
                # &quot;autoscaling.knative.dev/minScale&quot; annotation key.
                # To set maximum instances for this revision, use the
                # &quot;autoscaling.knative.dev/maxScale&quot; annotation key.
                # To set Cloud SQL connections for the revision, use the
                # &quot;run.googleapis.com/cloudsql-instances&quot; annotation key.
                # persisted resources must have, which includes all objects users must create.
              &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # CreationTimestamp is a timestamp representing the server time when this
                  # object was created. It is not guaranteed to be set in happens-before order
                  # across separate operations. Clients may not set this value. It is
                  # represented in RFC3339 form and is in UTC.
                  #
                  # Populated by the system.
                  # Read-only.
                  # Null for lists.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
              &quot;labels&quot;: { # (Optional)
                  #
                  # Map of string keys and values that can be used to organize and categorize
                  # (scope and select) objects. May match selectors of replication controllers
                  # and routes.
                  # More info: http://kubernetes.io/docs/user-guide/labels
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;generation&quot;: 42, # (Optional)
                  #
                  # A sequence number representing a specific generation of the desired state.
                  # Populated by the system. Read-only.
              &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # An opaque value that represents the internal version of this object that
                  # can be used by clients to determine when objects have changed. May be used
                  # for optimistic concurrency, change detection, and the watch operation on a
                  # resource or set of resources. Clients must treat these values as opaque and
                  # passed unmodified back to the server. They may only be valid for a
                  # particular resource or set of resources.
                  #
                  # Populated by the system.
                  # Read-only.
                  # Value must be treated as opaque by clients and .
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
              &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # SelfLink is a URL representing this object.
                  # Populated by the system.
                  # Read-only.
                  #  string selfLink = 4;
              &quot;uid&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # UID is the unique in time and space value for this object. It is typically
                  # generated by the server on successful creation of a resource and is not
                  # allowed to change on PUT operations.
                  #
                  # Populated by the system.
                  # Read-only.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
              &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
                  # Cloud Run region. In Cloud Run the namespace must be equal to either the
                  # project ID or project number.
              &quot;annotations&quot;: { # (Optional)
                  #
                  # Annotations is an unstructured key value map stored with a resource that
                  # may be set by external tools to store and retrieve arbitrary metadata. They
                  # are not queryable and should be preserved when modifying objects. More
                  # info: http://kubernetes.io/docs/user-guide/annotations
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # GenerateName is an optional prefix, used by the server, to generate a
                  # unique name ONLY IF the Name field has not been provided. If this field is
                  # used, the name returned to the client will be different than the name
                  # passed. This value will also be combined with a unique suffix. The provided
                  # value has the same validation rules as the Name field, and may be truncated
                  # by the length of the suffix required to make the value unique on the
                  # server.
                  #
                  # If this field is specified and the generated name exists, the server will
                  # NOT return a 409 - instead, it will either return 201 Created or 500 with
                  # Reason ServerTimeout indicating a unique name could not be found in the
                  # time allotted, and the client should retry (optionally after the time
                  # indicated in the Retry-After header).
                  #
                  # Applied only if Name is not specified.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
                  #  string generateName = 2;
              &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
                  # Is required when creating
                  # resources, although some resources may allow a client to request the
                  # generation of an appropriate name automatically. Name is primarily intended
                  # for creation idempotence and configuration definition. Cannot be updated.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#names
                  # +optional
              &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds allowed for this object to gracefully terminate before
                  # it will be removed from the system. Only set when deletionTimestamp is also
                  # set. May only be shortened. Read-only.
              &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # The name of the cluster which the object belongs to.
                  # This is used to distinguish resources with same name and namespace in
                  # different clusters. This field is not set anywhere right now and apiserver
                  # is going to ignore it if set in create or update request.
              &quot;finalizers&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Must be empty before the object is deleted from the registry. Each entry
                  # is an identifier for the responsible component that will remove the entry
                  # from the list. If the deletionTimestamp of the object is non-nil, entries
                  # in this list can only be removed.
                  # +patchStrategy=merge
                &quot;A String&quot;,
              ],
              &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # DeletionTimestamp is RFC 3339 date and time at which this resource will be
                  # deleted. This field is set by the server when a graceful deletion is
                  # requested by the user, and is not directly settable by a client. The
                  # resource is expected to be deleted (no longer visible from resource lists,
                  # and not reachable by name) after the time in this field, once the
                  # finalizers list is empty. As long as the finalizers list contains items,
                  # deletion is blocked. Once the deletionTimestamp is set, this value may not
                  # be unset or be set further into the future, although it may be shortened or
                  # the resource may be deleted prior to this time. For example, a user may
                  # request that a pod is deleted in 30 seconds. The Kubelet will react by
                  # sending a graceful termination signal to the containers in the pod. After
                  # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
                  # to the container and after cleanup, remove the pod from the API. In the
                  # presence of network partitions, this object may still exist after this
                  # timestamp, until an administrator or automated process can determine the
                  # resource is fully terminated.
                  # If not set, graceful deletion of the object has not been requested.
                  #
                  # Populated by the system when a graceful deletion is requested.
                  # Read-only.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
              &quot;ownerReferences&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of objects that own this object. If ALL objects in the list have
                  # been deleted, this object will be garbage collected.
                { # OwnerReference contains enough information to let you identify an owning
                    # object. Currently, an owning object must be in the same namespace, so there
                    # is no namespace field.
                  &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                      # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
                  &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                      # +optional
                  &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                      # More info:
                      # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
                  &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                      # the owner cannot be deleted from the key-value store until this
                      # reference is removed.
                      # Defaults to false.
                      # To set this field, a user needs &quot;delete&quot; permission of the owner,
                      # otherwise 422 (Unprocessable Entity) will be returned.
                      # +optional
                  &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
                  &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                      # More info: http://kubernetes.io/docs/user-guide/identifiers#names
                },
              ],
            },
            &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
              &quot;volumes&quot;: [
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Volume represents a named volume in a container.
                  &quot;configMap&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Adapts a ConfigMap into a volume.
                      # The contents of the target ConfigMap&#x27;s Data field will be presented in a
                      # volume as files using the keys in the Data field as the file names, unless
                      # the items element is populated with specific mappings of keys to paths.
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret or its keys must be defined.
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Name of the config.
                    &quot;defaultMode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on created files by default. Must be a value between 0 and
                        # 0777. Defaults to 0644. Directories within the path are not affected by
                        # this setting. This might be in conflict with other options that affect the
                        # file mode, like fsGroup, and the result can be other mode bits set.
                    &quot;items&quot;: [ # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # If unspecified, each key-value pair in the Data field of the referenced
                        # Secret will be projected into the volume as a file whose name is the
                        # key and content is the value. If specified, the listed keys will be
                        # projected into the specified paths, and unlisted keys will not be
                        # present. If a key is specified which is not present in the Secret,
                        # the volume setup will error unless it is marked optional.
                      { # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Maps a string key to a path within a volume.
                        &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # The key to project.
                        &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # The relative path of the file to map the key to.
                            # May not be an absolute path.
                            # May not contain the path element &#x27;..&#x27;.
                            # May not start with the string &#x27;..&#x27;.
                        &quot;mode&quot;: 42, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Mode bits to use on this file, must be a value between 0 and 0777. If not
                            # specified, the volume defaultMode will be used. This might be in conflict
                            # with other options that affect the file mode, like fsGroup, and the result
                            # can be other mode bits set.
                      },
                    ],
                  },
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Volume&#x27;s name.
                  &quot;secret&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The contents of the target Secret&#x27;s Data field will be presented in a volume
                      # as files using the keys in the Data field as the file names.
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret or its keys must be defined.
                    &quot;defaultMode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on created files by default. Must be a value between 0 and
                        # 0777. Defaults to 0644. Directories within the path are not affected by
                        # this setting. This might be in conflict with other options that affect the
                        # file mode, like fsGroup, and the result can be other mode bits set.
                    &quot;secretName&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Name of the secret in the container&#x27;s namespace to use.
                    &quot;items&quot;: [ # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # If unspecified, each key-value pair in the Data field of the referenced
                        # Secret will be projected into the volume as a file whose name is the
                        # key and content is the value. If specified, the listed keys will be
                        # projected into the specified paths, and unlisted keys will not be
                        # present. If a key is specified which is not present in the Secret,
                        # the volume setup will error unless it is marked optional.
                      { # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Maps a string key to a path within a volume.
                        &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # The key to project.
                        &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # The relative path of the file to map the key to.
                            # May not be an absolute path.
                            # May not contain the path element &#x27;..&#x27;.
                            # May not start with the string &#x27;..&#x27;.
                        &quot;mode&quot;: 42, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Mode bits to use on this file, must be a value between 0 and 0777. If not
                            # specified, the volume defaultMode will be used. This might be in conflict
                            # with other options that affect the file mode, like fsGroup, and the result
                            # can be other mode bits set.
                      },
                    ],
                  },
                },
              ],
              &quot;containerConcurrency&quot;: 42, # (Optional)
                  #
                  # ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
                  # requests per container instance of the Revision.
                  #
                  # Cloud Run fully managed: supported, defaults to 80
                  #
                  # Cloud Run for Anthos: supported, defaults to 0, which means concurrency
                  # to the application is not limited, and the system decides the
                  # target concurrency for the autoscaler.
              &quot;timeoutSeconds&quot;: 42, # TimeoutSeconds holds the max duration the instance is allowed for
                  # responding to a request.
                  # Not currently used by Cloud Run.
              &quot;serviceAccountName&quot;: &quot;A String&quot;, # Email address of the IAM service account associated with the revision
                  # of the service. The service account represents the identity of the
                  # running revision, and determines what permissions the revision has. If
                  # not provided, the revision will use the project&#x27;s default service account.
              &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution
                  # for this Revision. In the context of a Revision, we disallow a number of
                  # fields on this Container, including: name and lifecycle.
                  # In Cloud Run, only a single container may be provided.
                  # The runtime contract is documented here:
                  # https://github.com/knative/serving/blob/master/docs/runtime-contract.md
                { # A single application container.
                    # This specifies both the container to run, the command to run in the container
                    # and the arguments to supply to it.
                    # Note that additional arguments may be supplied by the system to the container
                    # at runtime.
                  &quot;volumeMounts&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Pod volumes to mount into the container&#x27;s filesystem.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # VolumeMount describes a mounting of a Volume within a container.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # This must match the Name of a Volume.
                      &quot;readOnly&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Only true is accepted.
                          # Defaults to true.
                      &quot;mountPath&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Path within the container at which the volume should be mounted.  Must
                          # not contain &#x27;:&#x27;.
                      &quot;subPath&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Path within the volume from which the container&#x27;s volume should be mounted.
                          # Defaults to &quot;&quot; (volume&#x27;s root).
                    },
                  ],
                  &quot;args&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Arguments to the entrypoint.
                      # The docker image&#x27;s CMD is used if this is not provided.
                      # Variable references $(VAR_NAME) are expanded using the container&#x27;s
                      # environment. If a variable cannot be resolved, the reference in the input
                      # string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
                      # double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
                      # regardless of whether the variable exists or not.
                      # More info:
                      # https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
                    &quot;A String&quot;,
                  ],
                  &quot;workingDir&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Container&#x27;s working directory.
                      # If not specified, the container runtime&#x27;s default will be used, which
                      # might be configured in the container image.
                  &quot;ports&quot;: [ # (Optional)
                      #
                      # List of ports to expose from the container. Only a single port can be
                      # specified. The specified ports must be listening on all interfaces
                      # (0.0.0.0) within the container to be accessible.
                      #
                      # If omitted, a port number will be chosen and passed to the container
                      # through the PORT environment variable for the container to listen on.
                    { # ContainerPort represents a network port in a single container.
                      &quot;containerPort&quot;: 42, # (Optional)
                          #
                          # Port number the container listens on.
                          # This must be a valid port number, 0 &lt; x &lt; 65536.
                      &quot;protocol&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Protocol for port. Must be &quot;TCP&quot;.
                          # Defaults to &quot;TCP&quot;.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # If specified, used to specify which protocol to use.
                          # Allowed values are &quot;http1&quot; and &quot;h2c&quot;.
                    },
                  ],
                  &quot;image&quot;: &quot;A String&quot;, # Cloud Run fully managed: only supports containers from Google Container
                      # Registry
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # URL of the Container image.
                      # More info: https://kubernetes.io/docs/concepts/containers/images
                  &quot;envFrom&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # List of sources to populate environment variables in the container.
                      # The keys defined within a source must be a C_IDENTIFIER. All invalid keys
                      # will be reported as an event when the container is starting. When a key
                      # exists in multiple sources, the value associated with the last source will
                      # take precedence. Values defined by an Env with a duplicate key will take
                      # precedence. Cannot be updated.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # EnvFromSource represents the source of a set of ConfigMaps
                      &quot;prefix&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # An optional identifier to prepend to each key in the ConfigMap. Must be a
                          # C_IDENTIFIER.
                      &quot;configMapRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The ConfigMap to select from
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # ConfigMapEnvSource selects a ConfigMap to populate the environment
                          # variables with.
                          #
                          # The contents of the target ConfigMap&#x27;s Data field will represent the
                          # key-value pairs as environment variables.
                        &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                            # directly into the message. Use the &quot;name&quot; field instead.
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # LocalObjectReference contains enough information to let you locate the
                            # referenced object inside the same namespace.
                          &quot;name&quot;: &quot;A String&quot;, # (Optional)
                              #
                              # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # Name of the referent.
                              # More info:
                              # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                        },
                        &quot;optional&quot;: True or False, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Specify whether the ConfigMap must be defined
                        &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # The ConfigMap to select from.
                      },
                      &quot;secretRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The Secret to select from
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # SecretEnvSource selects a Secret to populate the environment
                          # variables with.
                          #
                          # The contents of the target Secret&#x27;s Data field will represent the
                          # key-value pairs as environment variables.
                        &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                            # directly into the message. Use the &quot;name&quot; field instead.
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # LocalObjectReference contains enough information to let you locate the
                            # referenced object inside the same namespace.
                          &quot;name&quot;: &quot;A String&quot;, # (Optional)
                              #
                              # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # Name of the referent.
                              # More info:
                              # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                        },
                        &quot;optional&quot;: True or False, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Specify whether the Secret must be defined
                        &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # The Secret to select from.
                      },
                    },
                  ],
                  &quot;name&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Name of the container specified as a DNS_LABEL.
                  &quot;command&quot;: [
                    &quot;A String&quot;,
                  ],
                  &quot;terminationMessagePolicy&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Indicate how the termination message should be populated. File will use the
                      # contents of terminationMessagePath to populate the container status message
                      # on both success and failure. FallbackToLogsOnError will use the last chunk
                      # of container log output if the termination message file is empty and the
                      # container exited with an error. The log output is limited to 2048 bytes or
                      # 80 lines, whichever is smaller. Defaults to File. Cannot be updated.
                  &quot;securityContext&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Security options the pod should run with.
                      # More info: https://kubernetes.io/docs/concepts/policy/security-context/
                      # More info:
                      # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # SecurityContext holds security configuration that will be applied to a
                      # container. Some fields are present in both SecurityContext and
                      # PodSecurityContext.  When both are set, the values in SecurityContext take
                      # precedence.
                    &quot;runAsUser&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The UID to run the entrypoint of the container process.
                        # Defaults to user specified in image metadata if unspecified.
                        # May also be set in PodSecurityContext.  If set in both SecurityContext and
                        # PodSecurityContext, the value specified in SecurityContext takes
                        # precedence.
                  },
                  &quot;livenessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Periodic probe of container liveness.
                      # Container will be restarted if the probe fails.
                      # More info:
                      # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Probe describes a health check to be performed against a container to
                      # determine whether it is alive or ready to receive traffic.
                    &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPGet specifies the http request to perform.
                        #
                        # A field inlined from the Handler message.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPGetAction describes an action based on HTTP Get requests.
                      &quot;httpHeaders&quot;: [ # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Custom headers to set in the request. HTTP allows repeated headers.
                        { # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # HTTPHeader describes a custom header to be used in HTTP probes
                          &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The header field name
                          &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The header field value
                        },
                      ],
                      &quot;path&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Path to access on the HTTP server.
                      &quot;host&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Host name to connect to, defaults to the pod IP. You probably want to set
                          # &quot;Host&quot; in httpHeaders instead.
                      &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Scheme to use for connecting to the host.
                          # Defaults to HTTP.
                    },
                    &quot;failureThreshold&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Minimum consecutive failures for the probe to be considered failed after
                        # having succeeded. Defaults to 3. Minimum value is 1.
                    &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # One and only one of the following should be specified.
                        # Exec specifies the action to take.
                        #
                        # A field inlined from the Handler message.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # ExecAction describes a &quot;run in container&quot; action.
                      &quot;command&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Command is the command line to execute inside the container, the working
                          # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                          # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                          # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                          # explicitly call out to that shell. Exit status of 0 is treated as
                          # live/healthy and non-zero is unhealthy.
                    },
                    &quot;initialDelaySeconds&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Number of seconds after the container has started before liveness probes
                        # are initiated. More info:
                        # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                    &quot;timeoutSeconds&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Number of seconds after which the probe times out.
                        # Defaults to 1 second. Minimum value is 1.
                        # More info:
                        # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                    &quot;successThreshold&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Minimum consecutive successes for the probe to be considered successful
                        # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                        # is 1.
                    &quot;periodSeconds&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # How often (in seconds) to perform the probe.
                        # Default to 10 seconds. Minimum value is 1.
                    &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # TCPSocket specifies an action involving a TCP port.
                        # TCP hooks not yet supported
                        #
                        # A field inlined from the Handler message.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # TCPSocketAction describes an action based on opening a socket
                      &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Number or name of the port to access on the container.
                          # Number must be in the range 1 to 65535.
                          # Name must be an IANA_SVC_NAME.
                          #
                          # This field is currently limited to integer types only because of proto&#x27;s
                          # inability to properly support the IntOrString golang type.
                      &quot;host&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Optional: Host name to connect to, defaults to the pod IP.
                    },
                  },
                  &quot;env&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # List of environment variables to set in the container.
                    { # EnvVar represents an environment variable present in a Container.
                      &quot;name&quot;: &quot;A String&quot;, # Name of the environment variable. Must be a C_IDENTIFIER.
                      &quot;valueFrom&quot;: { # Cloud Run fully managed: not supported # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Source for the environment variable&#x27;s value. Cannot be used if value is not
                          # empty.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # EnvVarSource represents a source for the value of an EnvVar.
                        &quot;secretKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Selects a key of a secret in the pod&#x27;s namespace
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # SecretKeySelector selects a key of a Secret.
                          &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The key of the secret to select from.  Must be a valid secret key.
                          &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The name of the secret in the pod&#x27;s namespace to select from.
                          &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                              # directly into the message. Use the &quot;name&quot; field instead.
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # LocalObjectReference contains enough information to let you locate the
                              # referenced object inside the same namespace.
                            &quot;name&quot;: &quot;A String&quot;, # (Optional)
                                #
                                # Cloud Run fully managed: not supported
                                #
                                # Cloud Run for Anthos: supported
                                #
                                # Name of the referent.
                                # More info:
                                # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                          },
                          &quot;optional&quot;: True or False, # (Optional)
                              #
                              # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # Specify whether the Secret or its key must be defined
                        },
                        &quot;configMapKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Selects a key of a ConfigMap.
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Selects a key from a ConfigMap.
                          &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                              # directly into the message. Use the &quot;name&quot; field instead.
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # LocalObjectReference contains enough information to let you locate the
                              # referenced object inside the same namespace.
                            &quot;name&quot;: &quot;A String&quot;, # (Optional)
                                #
                                # Cloud Run fully managed: not supported
                                #
                                # Cloud Run for Anthos: supported
                                #
                                # Name of the referent.
                                # More info:
                                # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                          },
                          &quot;optional&quot;: True or False, # (Optional)
                              #
                              # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # Specify whether the ConfigMap or its key must be defined
                          &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The key to select.
                          &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The ConfigMap to select from.
                        },
                      },
                      &quot;value&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Variable references $(VAR_NAME) are expanded
                          # using the previous defined environment variables in the container and
                          # any route environment variables. If a variable cannot be resolved,
                          # the reference in the input string will be unchanged. The $(VAR_NAME)
                          # syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
                          # references will never be expanded, regardless of whether the variable
                          # exists or not.
                          # Defaults to &quot;&quot;.
                    },
                  ],
                  &quot;resources&quot;: { # ResourceRequirements describes the compute resource requirements. # (Optional)
                      #
                      # Cloud Run fully managed: supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Compute Resources required by this container.
                      # More info:
                      # https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
                    &quot;limits&quot;: { # (Optional)
                        #
                        # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                        # supported value for CPU is &#x27;1&#x27;.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Limits describes the maximum amount of compute resources allowed.
                        # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                        # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                      &quot;a_key&quot;: &quot;A String&quot;,
                    },
                    &quot;requests&quot;: { # (Optional)
                        #
                        # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                        # supported value for CPU is &#x27;1&#x27;.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Requests describes the minimum amount of compute resources required.
                        # If Requests is omitted for a container, it defaults to Limits if that is
                        # explicitly specified, otherwise to an implementation-defined value.
                        # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                        # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                      &quot;a_key&quot;: &quot;A String&quot;,
                    },
                  },
                  &quot;readinessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Periodic probe of container service readiness.
                      # Container will be removed from service endpoints if the probe fails.
                      # More info:
                      # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Probe describes a health check to be performed against a container to
                      # determine whether it is alive or ready to receive traffic.
                    &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPGet specifies the http request to perform.
                        #
                        # A field inlined from the Handler message.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPGetAction describes an action based on HTTP Get requests.
                      &quot;httpHeaders&quot;: [ # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Custom headers to set in the request. HTTP allows repeated headers.
                        { # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # HTTPHeader describes a custom header to be used in HTTP probes
                          &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The header field name
                          &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                              #
                              # Cloud Run for Anthos: supported
                              #
                              # The header field value
                        },
                      ],
                      &quot;path&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Path to access on the HTTP server.
                      &quot;host&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Host name to connect to, defaults to the pod IP. You probably want to set
                          # &quot;Host&quot; in httpHeaders instead.
                      &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Scheme to use for connecting to the host.
                          # Defaults to HTTP.
                    },
                    &quot;failureThreshold&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Minimum consecutive failures for the probe to be considered failed after
                        # having succeeded. Defaults to 3. Minimum value is 1.
                    &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # One and only one of the following should be specified.
                        # Exec specifies the action to take.
                        #
                        # A field inlined from the Handler message.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # ExecAction describes a &quot;run in container&quot; action.
                      &quot;command&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Command is the command line to execute inside the container, the working
                          # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                          # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                          # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                          # explicitly call out to that shell. Exit status of 0 is treated as
                          # live/healthy and non-zero is unhealthy.
                    },
                    &quot;initialDelaySeconds&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Number of seconds after the container has started before liveness probes
                        # are initiated. More info:
                        # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                    &quot;timeoutSeconds&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Number of seconds after which the probe times out.
                        # Defaults to 1 second. Minimum value is 1.
                        # More info:
                        # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                    &quot;successThreshold&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Minimum consecutive successes for the probe to be considered successful
                        # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                        # is 1.
                    &quot;periodSeconds&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # How often (in seconds) to perform the probe.
                        # Default to 10 seconds. Minimum value is 1.
                    &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # TCPSocket specifies an action involving a TCP port.
                        # TCP hooks not yet supported
                        #
                        # A field inlined from the Handler message.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # TCPSocketAction describes an action based on opening a socket
                      &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Number or name of the port to access on the container.
                          # Number must be in the range 1 to 65535.
                          # Name must be an IANA_SVC_NAME.
                          #
                          # This field is currently limited to integer types only because of proto&#x27;s
                          # inability to properly support the IntOrString golang type.
                      &quot;host&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Optional: Host name to connect to, defaults to the pod IP.
                    },
                  },
                  &quot;imagePullPolicy&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Image pull policy.
                      # One of Always, Never, IfNotPresent.
                      # Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.
                      # More info:
                      # https://kubernetes.io/docs/concepts/containers/images#updating-images
                  &quot;terminationMessagePath&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path at which the file to which the container&#x27;s termination
                      # message will be written is mounted into the container&#x27;s filesystem. Message
                      # written is intended to be brief final status, such as an assertion failure
                      # message. Will be truncated by the node if greater than 4096 bytes. The
                      # total message length across all containers will be limited to 12kb.
                      # Defaults to /dev/termination-log.
                },
              ],
            },
          },
        },
        &quot;kind&quot;: &quot;A String&quot;, # The kind of resource, in this case &quot;Service&quot;.
        &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Metadata associated with this Service, including name, namespace, labels,
            # and annotations.
            # persisted resources must have, which includes all objects users must create.
          &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # CreationTimestamp is a timestamp representing the server time when this
              # object was created. It is not guaranteed to be set in happens-before order
              # across separate operations. Clients may not set this value. It is
              # represented in RFC3339 form and is in UTC.
              #
              # Populated by the system.
              # Read-only.
              # Null for lists.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;labels&quot;: { # (Optional)
              #
              # Map of string keys and values that can be used to organize and categorize
              # (scope and select) objects. May match selectors of replication controllers
              # and routes.
              # More info: http://kubernetes.io/docs/user-guide/labels
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generation&quot;: 42, # (Optional)
              #
              # A sequence number representing a specific generation of the desired state.
              # Populated by the system. Read-only.
          &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
              #
              # An opaque value that represents the internal version of this object that
              # can be used by clients to determine when objects have changed. May be used
              # for optimistic concurrency, change detection, and the watch operation on a
              # resource or set of resources. Clients must treat these values as opaque and
              # passed unmodified back to the server. They may only be valid for a
              # particular resource or set of resources.
              #
              # Populated by the system.
              # Read-only.
              # Value must be treated as opaque by clients and .
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
          &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
              #
              # SelfLink is a URL representing this object.
              # Populated by the system.
              # Read-only.
              #  string selfLink = 4;
          &quot;uid&quot;: &quot;A String&quot;, # (Optional)
              #
              # UID is the unique in time and space value for this object. It is typically
              # generated by the server on successful creation of a resource and is not
              # allowed to change on PUT operations.
              #
              # Populated by the system.
              # Read-only.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
              # Cloud Run region. In Cloud Run the namespace must be equal to either the
              # project ID or project number.
          &quot;annotations&quot;: { # (Optional)
              #
              # Annotations is an unstructured key value map stored with a resource that
              # may be set by external tools to store and retrieve arbitrary metadata. They
              # are not queryable and should be preserved when modifying objects. More
              # info: http://kubernetes.io/docs/user-guide/annotations
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # GenerateName is an optional prefix, used by the server, to generate a
              # unique name ONLY IF the Name field has not been provided. If this field is
              # used, the name returned to the client will be different than the name
              # passed. This value will also be combined with a unique suffix. The provided
              # value has the same validation rules as the Name field, and may be truncated
              # by the length of the suffix required to make the value unique on the
              # server.
              #
              # If this field is specified and the generated name exists, the server will
              # NOT return a 409 - instead, it will either return 201 Created or 500 with
              # Reason ServerTimeout indicating a unique name could not be found in the
              # time allotted, and the client should retry (optionally after the time
              # indicated in the Retry-After header).
              #
              # Applied only if Name is not specified.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
              #  string generateName = 2;
          &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
              # Is required when creating
              # resources, although some resources may allow a client to request the
              # generation of an appropriate name automatically. Name is primarily intended
              # for creation idempotence and configuration definition. Cannot be updated.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
              # +optional
          &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Number of seconds allowed for this object to gracefully terminate before
              # it will be removed from the system. Only set when deletionTimestamp is also
              # set. May only be shortened. Read-only.
          &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # The name of the cluster which the object belongs to.
              # This is used to distinguish resources with same name and namespace in
              # different clusters. This field is not set anywhere right now and apiserver
              # is going to ignore it if set in create or update request.
          &quot;finalizers&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Must be empty before the object is deleted from the registry. Each entry
              # is an identifier for the responsible component that will remove the entry
              # from the list. If the deletionTimestamp of the object is non-nil, entries
              # in this list can only be removed.
              # +patchStrategy=merge
            &quot;A String&quot;,
          ],
          &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # DeletionTimestamp is RFC 3339 date and time at which this resource will be
              # deleted. This field is set by the server when a graceful deletion is
              # requested by the user, and is not directly settable by a client. The
              # resource is expected to be deleted (no longer visible from resource lists,
              # and not reachable by name) after the time in this field, once the
              # finalizers list is empty. As long as the finalizers list contains items,
              # deletion is blocked. Once the deletionTimestamp is set, this value may not
              # be unset or be set further into the future, although it may be shortened or
              # the resource may be deleted prior to this time. For example, a user may
              # request that a pod is deleted in 30 seconds. The Kubelet will react by
              # sending a graceful termination signal to the containers in the pod. After
              # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
              # to the container and after cleanup, remove the pod from the API. In the
              # presence of network partitions, this object may still exist after this
              # timestamp, until an administrator or automated process can determine the
              # resource is fully terminated.
              # If not set, graceful deletion of the object has not been requested.
              #
              # Populated by the system when a graceful deletion is requested.
              # Read-only.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;ownerReferences&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # List of objects that own this object. If ALL objects in the list have
              # been deleted, this object will be garbage collected.
            { # OwnerReference contains enough information to let you identify an owning
                # object. Currently, an owning object must be in the same namespace, so there
                # is no namespace field.
              &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
              &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                  # +optional
              &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
              &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                  # the owner cannot be deleted from the key-value store until this
                  # reference is removed.
                  # Defaults to false.
                  # To set this field, a user needs &quot;delete&quot; permission of the owner,
                  # otherwise 422 (Unprocessable Entity) will be returned.
                  # +optional
              &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
              &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#names
            },
          ],
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="replaceService">replaceService(name, body=None, x__xgafv=None)</code>
  <pre>Replace a service.

Only the spec and metadata labels and annotations are modifiable. After
the Update request, Cloud Run will work to make the &#x27;status&#x27;
match the requested &#x27;spec&#x27;.

May provide metadata.resourceVersion to enforce update from last read for
optimistic concurrency control.

Args:
  name: string, The name of the service being replaced.
For Cloud Run (fully managed), replace {namespace_id} with the project ID
or number. (required)
  body: object, The request body.
    The object takes the form of:

{ # Service acts as a top-level container that manages a set of Routes and
    # Configurations which implement a network service. Service exists to provide a
    # singular abstraction which can be access controlled, reasoned about, and
    # which encapsulates software lifecycle decisions such as rollout policy and
    # team resource ownership. Service acts only as an orchestrator of the
    # underlying Routes and Configurations (much as a kubernetes Deployment
    # orchestrates ReplicaSets).
    # 
    # The Service&#x27;s controller will track the statuses of its owned Configuration
    # and Route, reflecting their statuses and conditions as its own.
    # 
    # See also:
    # https://github.com/knative/serving/blob/master/docs/spec/overview.md#service
  &quot;status&quot;: { # The current state of the Service. Output only. # Status communicates the observed state of the Service (from the
      # controller).
    &quot;latestCreatedRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
        # LatestCreatedRevisionName is the last revision that was created from this
        # Service&#x27;s Configuration. It might not be ready yet, for that use
        # LatestReadyRevisionName.
    &quot;conditions&quot;: [ # Conditions communicates information about ongoing/complete
        # reconciliation processes that bring the &quot;spec&quot; inline with the observed
        # state of the world.
        # Service-specific conditions include:
        # * &quot;ConfigurationsReady&quot;: true when the underlying Configuration is ready.
        # * &quot;RoutesReady&quot;: true when the underlying Route is ready.
        # * &quot;Ready&quot;: true when both the underlying Route and Configuration are
        # ready.
      { # Condition defines a generic condition for a Resource
        &quot;message&quot;: &quot;A String&quot;, # Optional. Human readable message indicating details about the current status.
        &quot;lastTransitionTime&quot;: &quot;A String&quot;, # Optional. Last time the condition transitioned from one status to another.
        &quot;status&quot;: &quot;A String&quot;, # Status of the condition, one of True, False, Unknown.
        &quot;severity&quot;: &quot;A String&quot;, # Optional. How to interpret failures of this condition, one of Error, Warning, Info
        &quot;reason&quot;: &quot;A String&quot;, # Optional. One-word CamelCase reason for the condition&#x27;s last transition.
        &quot;type&quot;: &quot;A String&quot;, # type is used to communicate the status of the reconciliation process.
            # See also:
            # https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting
            # Types common to all resources include:
            # * &quot;Ready&quot;: True when the Resource is ready.
      },
    ],
    &quot;address&quot;: { # Information for connecting over HTTP(s). # From RouteStatus.
        # Similar to url, information on where the service is available on HTTP.
      &quot;url&quot;: &quot;A String&quot;,
    },
    &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Route that
        # was last processed by the controller.
        #
        # Clients polling for completed reconciliation should poll until
        # observedGeneration = metadata.generation and the Ready condition&#x27;s status
        # is True or False.
    &quot;url&quot;: &quot;A String&quot;, # From RouteStatus.
        # URL holds the url that will distribute traffic over the provided traffic
        # targets. It generally has the form
        # https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app
    &quot;traffic&quot;: [ # From RouteStatus.
        # Traffic holds the configured traffic distribution.
        # These entries will always contain RevisionName references.
        # When ConfigurationName appears in the spec, this will hold the
        # LatestReadyRevisionName that we last observed.
      { # TrafficTarget holds a single entry of the routing table for a Route.
        &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
            # is displayed in status, and is disallowed on spec. URL must contain a
            # scheme (e.g. http://) and a hostname, but may not contain anything else
            # (e.g. basic auth, url path, etc.
            #
            # Not currently supported in Cloud Run.
        &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
            # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
            # of the referenced configuration changes, we will automatically migrate
            # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
            # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
            # with RevisionName.
            #
            # Cloud Run currently supports a single ConfigurationName.
        &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
            # This defaults to zero if unspecified.
            #
            # Cloud Run currently requires 100 percent for a single ConfigurationName
            # TrafficTarget entry.
        &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
            # traffic. This is mutually exclusive with ConfigurationName.
            #
            # Providing RevisionName in spec is not currently supported by Cloud Run.
        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
            # ready Revision of the Configuration should be used for this traffic
            # target. When provided LatestRevision must be true if RevisionName is
            # empty; it must be false when RevisionName is non-empty.
            #
            # +optional
        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
            # this target exclusively.
            #
            # Not currently supported in Cloud Run.
            # +optional
      },
    ],
    &quot;latestReadyRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
        # LatestReadyRevisionName holds the name of the latest Revision stamped out
        # from this Service&#x27;s Configuration that has had its &quot;Ready&quot; condition become
        # &quot;True&quot;.
  },
  &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
  &quot;spec&quot;: { # ServiceSpec holds the desired state of the Route (from the client), which # Spec holds the desired state of the Service (from the client).
      # is used to manipulate the underlying Route and Configuration(s).
    &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative
        # Revisions and Configurations.
      { # TrafficTarget holds a single entry of the routing table for a Route.
        &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
            # is displayed in status, and is disallowed on spec. URL must contain a
            # scheme (e.g. http://) and a hostname, but may not contain anything else
            # (e.g. basic auth, url path, etc.
            #
            # Not currently supported in Cloud Run.
        &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
            # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
            # of the referenced configuration changes, we will automatically migrate
            # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
            # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
            # with RevisionName.
            #
            # Cloud Run currently supports a single ConfigurationName.
        &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
            # This defaults to zero if unspecified.
            #
            # Cloud Run currently requires 100 percent for a single ConfigurationName
            # TrafficTarget entry.
        &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
            # traffic. This is mutually exclusive with ConfigurationName.
            #
            # Providing RevisionName in spec is not currently supported by Cloud Run.
        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
            # ready Revision of the Configuration should be used for this traffic
            # target. When provided LatestRevision must be true if RevisionName is
            # empty; it must be false when RevisionName is non-empty.
            #
            # +optional
        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
            # this target exclusively.
            #
            # Not currently supported in Cloud Run.
            # +optional
      },
    ],
    &quot;template&quot;: { # RevisionTemplateSpec describes the data a revision should have when created # Template holds the latest specification for the Revision to
        # be stamped out.
        # from a template. Based on:
        # https://github.com/kubernetes/api/blob/e771f807/core/v1/types.go#L3179-L3190
      &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Optional metadata for this Revision, including labels and annotations. Name
          # will be generated by the Configuration.
          # To set minimum instances for this revision, use the
          # &quot;autoscaling.knative.dev/minScale&quot; annotation key.
          # To set maximum instances for this revision, use the
          # &quot;autoscaling.knative.dev/maxScale&quot; annotation key.
          # To set Cloud SQL connections for the revision, use the
          # &quot;run.googleapis.com/cloudsql-instances&quot; annotation key.
          # persisted resources must have, which includes all objects users must create.
        &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
            #
            # CreationTimestamp is a timestamp representing the server time when this
            # object was created. It is not guaranteed to be set in happens-before order
            # across separate operations. Clients may not set this value. It is
            # represented in RFC3339 form and is in UTC.
            #
            # Populated by the system.
            # Read-only.
            # Null for lists.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
        &quot;labels&quot;: { # (Optional)
            #
            # Map of string keys and values that can be used to organize and categorize
            # (scope and select) objects. May match selectors of replication controllers
            # and routes.
            # More info: http://kubernetes.io/docs/user-guide/labels
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;generation&quot;: 42, # (Optional)
            #
            # A sequence number representing a specific generation of the desired state.
            # Populated by the system. Read-only.
        &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
            #
            # An opaque value that represents the internal version of this object that
            # can be used by clients to determine when objects have changed. May be used
            # for optimistic concurrency, change detection, and the watch operation on a
            # resource or set of resources. Clients must treat these values as opaque and
            # passed unmodified back to the server. They may only be valid for a
            # particular resource or set of resources.
            #
            # Populated by the system.
            # Read-only.
            # Value must be treated as opaque by clients and .
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
        &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
            #
            # SelfLink is a URL representing this object.
            # Populated by the system.
            # Read-only.
            #  string selfLink = 4;
        &quot;uid&quot;: &quot;A String&quot;, # (Optional)
            #
            # UID is the unique in time and space value for this object. It is typically
            # generated by the server on successful creation of a resource and is not
            # allowed to change on PUT operations.
            #
            # Populated by the system.
            # Read-only.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
        &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
            # Cloud Run region. In Cloud Run the namespace must be equal to either the
            # project ID or project number.
        &quot;annotations&quot;: { # (Optional)
            #
            # Annotations is an unstructured key value map stored with a resource that
            # may be set by external tools to store and retrieve arbitrary metadata. They
            # are not queryable and should be preserved when modifying objects. More
            # info: http://kubernetes.io/docs/user-guide/annotations
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # GenerateName is an optional prefix, used by the server, to generate a
            # unique name ONLY IF the Name field has not been provided. If this field is
            # used, the name returned to the client will be different than the name
            # passed. This value will also be combined with a unique suffix. The provided
            # value has the same validation rules as the Name field, and may be truncated
            # by the length of the suffix required to make the value unique on the
            # server.
            #
            # If this field is specified and the generated name exists, the server will
            # NOT return a 409 - instead, it will either return 201 Created or 500 with
            # Reason ServerTimeout indicating a unique name could not be found in the
            # time allotted, and the client should retry (optionally after the time
            # indicated in the Retry-After header).
            #
            # Applied only if Name is not specified.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
            #  string generateName = 2;
        &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
            # Is required when creating
            # resources, although some resources may allow a client to request the
            # generation of an appropriate name automatically. Name is primarily intended
            # for creation idempotence and configuration definition. Cannot be updated.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#names
            # +optional
        &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # Number of seconds allowed for this object to gracefully terminate before
            # it will be removed from the system. Only set when deletionTimestamp is also
            # set. May only be shortened. Read-only.
        &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # The name of the cluster which the object belongs to.
            # This is used to distinguish resources with same name and namespace in
            # different clusters. This field is not set anywhere right now and apiserver
            # is going to ignore it if set in create or update request.
        &quot;finalizers&quot;: [ # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # Must be empty before the object is deleted from the registry. Each entry
            # is an identifier for the responsible component that will remove the entry
            # from the list. If the deletionTimestamp of the object is non-nil, entries
            # in this list can only be removed.
            # +patchStrategy=merge
          &quot;A String&quot;,
        ],
        &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # DeletionTimestamp is RFC 3339 date and time at which this resource will be
            # deleted. This field is set by the server when a graceful deletion is
            # requested by the user, and is not directly settable by a client. The
            # resource is expected to be deleted (no longer visible from resource lists,
            # and not reachable by name) after the time in this field, once the
            # finalizers list is empty. As long as the finalizers list contains items,
            # deletion is blocked. Once the deletionTimestamp is set, this value may not
            # be unset or be set further into the future, although it may be shortened or
            # the resource may be deleted prior to this time. For example, a user may
            # request that a pod is deleted in 30 seconds. The Kubelet will react by
            # sending a graceful termination signal to the containers in the pod. After
            # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
            # to the container and after cleanup, remove the pod from the API. In the
            # presence of network partitions, this object may still exist after this
            # timestamp, until an administrator or automated process can determine the
            # resource is fully terminated.
            # If not set, graceful deletion of the object has not been requested.
            #
            # Populated by the system when a graceful deletion is requested.
            # Read-only.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
        &quot;ownerReferences&quot;: [ # (Optional)
            #
            # Cloud Run fully managed: not supported
            #
            # Cloud Run for Anthos: supported
            #
            # List of objects that own this object. If ALL objects in the list have
            # been deleted, this object will be garbage collected.
          { # OwnerReference contains enough information to let you identify an owning
              # object. Currently, an owning object must be in the same namespace, so there
              # is no namespace field.
            &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
            &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                # +optional
            &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                # More info:
                # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
            &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                # the owner cannot be deleted from the key-value store until this
                # reference is removed.
                # Defaults to false.
                # To set this field, a user needs &quot;delete&quot; permission of the owner,
                # otherwise 422 (Unprocessable Entity) will be returned.
                # +optional
            &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
            &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                # More info: http://kubernetes.io/docs/user-guide/identifiers#names
          },
        ],
      },
      &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
        &quot;volumes&quot;: [
          { # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Volume represents a named volume in a container.
            &quot;configMap&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Cloud Run for Anthos: supported
                #
                # Adapts a ConfigMap into a volume.
                # The contents of the target ConfigMap&#x27;s Data field will be presented in a
                # volume as files using the keys in the Data field as the file names, unless
                # the items element is populated with specific mappings of keys to paths.
              &quot;optional&quot;: True or False, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Specify whether the Secret or its keys must be defined.
              &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Name of the config.
              &quot;defaultMode&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Mode bits to use on created files by default. Must be a value between 0 and
                  # 0777. Defaults to 0644. Directories within the path are not affected by
                  # this setting. This might be in conflict with other options that affect the
                  # file mode, like fsGroup, and the result can be other mode bits set.
              &quot;items&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # If unspecified, each key-value pair in the Data field of the referenced
                  # Secret will be projected into the volume as a file whose name is the
                  # key and content is the value. If specified, the listed keys will be
                  # projected into the specified paths, and unlisted keys will not be
                  # present. If a key is specified which is not present in the Secret,
                  # the volume setup will error unless it is marked optional.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Maps a string key to a path within a volume.
                  &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The key to project.
                  &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The relative path of the file to map the key to.
                      # May not be an absolute path.
                      # May not contain the path element &#x27;..&#x27;.
                      # May not start with the string &#x27;..&#x27;.
                  &quot;mode&quot;: 42, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Mode bits to use on this file, must be a value between 0 and 0777. If not
                      # specified, the volume defaultMode will be used. This might be in conflict
                      # with other options that affect the file mode, like fsGroup, and the result
                      # can be other mode bits set.
                },
              ],
            },
            &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Volume&#x27;s name.
            &quot;secret&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Cloud Run for Anthos: supported
                #
                # The contents of the target Secret&#x27;s Data field will be presented in a volume
                # as files using the keys in the Data field as the file names.
              &quot;optional&quot;: True or False, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Specify whether the Secret or its keys must be defined.
              &quot;defaultMode&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Mode bits to use on created files by default. Must be a value between 0 and
                  # 0777. Defaults to 0644. Directories within the path are not affected by
                  # this setting. This might be in conflict with other options that affect the
                  # file mode, like fsGroup, and the result can be other mode bits set.
              &quot;secretName&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Name of the secret in the container&#x27;s namespace to use.
              &quot;items&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # If unspecified, each key-value pair in the Data field of the referenced
                  # Secret will be projected into the volume as a file whose name is the
                  # key and content is the value. If specified, the listed keys will be
                  # projected into the specified paths, and unlisted keys will not be
                  # present. If a key is specified which is not present in the Secret,
                  # the volume setup will error unless it is marked optional.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Maps a string key to a path within a volume.
                  &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The key to project.
                  &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The relative path of the file to map the key to.
                      # May not be an absolute path.
                      # May not contain the path element &#x27;..&#x27;.
                      # May not start with the string &#x27;..&#x27;.
                  &quot;mode&quot;: 42, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Mode bits to use on this file, must be a value between 0 and 0777. If not
                      # specified, the volume defaultMode will be used. This might be in conflict
                      # with other options that affect the file mode, like fsGroup, and the result
                      # can be other mode bits set.
                },
              ],
            },
          },
        ],
        &quot;containerConcurrency&quot;: 42, # (Optional)
            #
            # ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
            # requests per container instance of the Revision.
            #
            # Cloud Run fully managed: supported, defaults to 80
            #
            # Cloud Run for Anthos: supported, defaults to 0, which means concurrency
            # to the application is not limited, and the system decides the
            # target concurrency for the autoscaler.
        &quot;timeoutSeconds&quot;: 42, # TimeoutSeconds holds the max duration the instance is allowed for
            # responding to a request.
            # Not currently used by Cloud Run.
        &quot;serviceAccountName&quot;: &quot;A String&quot;, # Email address of the IAM service account associated with the revision
            # of the service. The service account represents the identity of the
            # running revision, and determines what permissions the revision has. If
            # not provided, the revision will use the project&#x27;s default service account.
        &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution
            # for this Revision. In the context of a Revision, we disallow a number of
            # fields on this Container, including: name and lifecycle.
            # In Cloud Run, only a single container may be provided.
            # The runtime contract is documented here:
            # https://github.com/knative/serving/blob/master/docs/runtime-contract.md
          { # A single application container.
              # This specifies both the container to run, the command to run in the container
              # and the arguments to supply to it.
              # Note that additional arguments may be supplied by the system to the container
              # at runtime.
            &quot;volumeMounts&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Pod volumes to mount into the container&#x27;s filesystem.
              { # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # VolumeMount describes a mounting of a Volume within a container.
                &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # This must match the Name of a Volume.
                &quot;readOnly&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Only true is accepted.
                    # Defaults to true.
                &quot;mountPath&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path within the container at which the volume should be mounted.  Must
                    # not contain &#x27;:&#x27;.
                &quot;subPath&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path within the volume from which the container&#x27;s volume should be mounted.
                    # Defaults to &quot;&quot; (volume&#x27;s root).
              },
            ],
            &quot;args&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: supported
                #
                # Cloud Run for Anthos: supported
                #
                # Arguments to the entrypoint.
                # The docker image&#x27;s CMD is used if this is not provided.
                # Variable references $(VAR_NAME) are expanded using the container&#x27;s
                # environment. If a variable cannot be resolved, the reference in the input
                # string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
                # double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
                # regardless of whether the variable exists or not.
                # More info:
                # https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
              &quot;A String&quot;,
            ],
            &quot;workingDir&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Container&#x27;s working directory.
                # If not specified, the container runtime&#x27;s default will be used, which
                # might be configured in the container image.
            &quot;ports&quot;: [ # (Optional)
                #
                # List of ports to expose from the container. Only a single port can be
                # specified. The specified ports must be listening on all interfaces
                # (0.0.0.0) within the container to be accessible.
                #
                # If omitted, a port number will be chosen and passed to the container
                # through the PORT environment variable for the container to listen on.
              { # ContainerPort represents a network port in a single container.
                &quot;containerPort&quot;: 42, # (Optional)
                    #
                    # Port number the container listens on.
                    # This must be a valid port number, 0 &lt; x &lt; 65536.
                &quot;protocol&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Protocol for port. Must be &quot;TCP&quot;.
                    # Defaults to &quot;TCP&quot;.
                &quot;name&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If specified, used to specify which protocol to use.
                    # Allowed values are &quot;http1&quot; and &quot;h2c&quot;.
              },
            ],
            &quot;image&quot;: &quot;A String&quot;, # Cloud Run fully managed: only supports containers from Google Container
                # Registry
                #
                # Cloud Run for Anthos: supported
                #
                # URL of the Container image.
                # More info: https://kubernetes.io/docs/concepts/containers/images
            &quot;envFrom&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # List of sources to populate environment variables in the container.
                # The keys defined within a source must be a C_IDENTIFIER. All invalid keys
                # will be reported as an event when the container is starting. When a key
                # exists in multiple sources, the value associated with the last source will
                # take precedence. Values defined by an Env with a duplicate key will take
                # precedence. Cannot be updated.
              { # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # EnvFromSource represents the source of a set of ConfigMaps
                &quot;prefix&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # An optional identifier to prepend to each key in the ConfigMap. Must be a
                    # C_IDENTIFIER.
                &quot;configMapRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The ConfigMap to select from
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ConfigMapEnvSource selects a ConfigMap to populate the environment
                    # variables with.
                    #
                    # The contents of the target ConfigMap&#x27;s Data field will represent the
                    # key-value pairs as environment variables.
                  &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                      # directly into the message. Use the &quot;name&quot; field instead.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # LocalObjectReference contains enough information to let you locate the
                      # referenced object inside the same namespace.
                    &quot;name&quot;: &quot;A String&quot;, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Name of the referent.
                        # More info:
                        # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                  },
                  &quot;optional&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Specify whether the ConfigMap must be defined
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The ConfigMap to select from.
                },
                &quot;secretRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The Secret to select from
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # SecretEnvSource selects a Secret to populate the environment
                    # variables with.
                    #
                    # The contents of the target Secret&#x27;s Data field will represent the
                    # key-value pairs as environment variables.
                  &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                      # directly into the message. Use the &quot;name&quot; field instead.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # LocalObjectReference contains enough information to let you locate the
                      # referenced object inside the same namespace.
                    &quot;name&quot;: &quot;A String&quot;, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Name of the referent.
                        # More info:
                        # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                  },
                  &quot;optional&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Specify whether the Secret must be defined
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The Secret to select from.
                },
              },
            ],
            &quot;name&quot;: &quot;A String&quot;, # (Optional)
                #
                # Name of the container specified as a DNS_LABEL.
            &quot;command&quot;: [
              &quot;A String&quot;,
            ],
            &quot;terminationMessagePolicy&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Indicate how the termination message should be populated. File will use the
                # contents of terminationMessagePath to populate the container status message
                # on both success and failure. FallbackToLogsOnError will use the last chunk
                # of container log output if the termination message file is empty and the
                # container exited with an error. The log output is limited to 2048 bytes or
                # 80 lines, whichever is smaller. Defaults to File. Cannot be updated.
            &quot;securityContext&quot;: { # Cloud Run fully managed: not supported # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Security options the pod should run with.
                # More info: https://kubernetes.io/docs/concepts/policy/security-context/
                # More info:
                # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
                #
                # Cloud Run for Anthos: supported
                #
                # SecurityContext holds security configuration that will be applied to a
                # container. Some fields are present in both SecurityContext and
                # PodSecurityContext.  When both are set, the values in SecurityContext take
                # precedence.
              &quot;runAsUser&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # The UID to run the entrypoint of the container process.
                  # Defaults to user specified in image metadata if unspecified.
                  # May also be set in PodSecurityContext.  If set in both SecurityContext and
                  # PodSecurityContext, the value specified in SecurityContext takes
                  # precedence.
            },
            &quot;livenessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Periodic probe of container liveness.
                # Container will be restarted if the probe fails.
                # More info:
                # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                #
                # Cloud Run for Anthos: supported
                #
                # Probe describes a health check to be performed against a container to
                # determine whether it is alive or ready to receive traffic.
              &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGet specifies the http request to perform.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGetAction describes an action based on HTTP Get requests.
                &quot;httpHeaders&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Custom headers to set in the request. HTTP allows repeated headers.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # HTTPHeader describes a custom header to be used in HTTP probes
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field name
                    &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field value
                  },
                ],
                &quot;path&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path to access on the HTTP server.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Host name to connect to, defaults to the pod IP. You probably want to set
                    # &quot;Host&quot; in httpHeaders instead.
                &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Scheme to use for connecting to the host.
                    # Defaults to HTTP.
              },
              &quot;failureThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive failures for the probe to be considered failed after
                  # having succeeded. Defaults to 3. Minimum value is 1.
              &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # One and only one of the following should be specified.
                  # Exec specifies the action to take.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # ExecAction describes a &quot;run in container&quot; action.
                &quot;command&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Command is the command line to execute inside the container, the working
                    # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                    # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                    # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                    # explicitly call out to that shell. Exit status of 0 is treated as
                    # live/healthy and non-zero is unhealthy.
              },
              &quot;initialDelaySeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after the container has started before liveness probes
                  # are initiated. More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;timeoutSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after which the probe times out.
                  # Defaults to 1 second. Minimum value is 1.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;successThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive successes for the probe to be considered successful
                  # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                  # is 1.
              &quot;periodSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # How often (in seconds) to perform the probe.
                  # Default to 10 seconds. Minimum value is 1.
              &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocket specifies an action involving a TCP port.
                  # TCP hooks not yet supported
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocketAction describes an action based on opening a socket
                &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number or name of the port to access on the container.
                    # Number must be in the range 1 to 65535.
                    # Name must be an IANA_SVC_NAME.
                    #
                    # This field is currently limited to integer types only because of proto&#x27;s
                    # inability to properly support the IntOrString golang type.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Optional: Host name to connect to, defaults to the pod IP.
              },
            },
            &quot;env&quot;: [ # (Optional)
                #
                # Cloud Run fully managed: supported
                #
                # Cloud Run for Anthos: supported
                #
                # List of environment variables to set in the container.
              { # EnvVar represents an environment variable present in a Container.
                &quot;name&quot;: &quot;A String&quot;, # Name of the environment variable. Must be a C_IDENTIFIER.
                &quot;valueFrom&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Source for the environment variable&#x27;s value. Cannot be used if value is not
                    # empty.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # EnvVarSource represents a source for the value of an EnvVar.
                  &quot;secretKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Selects a key of a secret in the pod&#x27;s namespace
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # SecretKeySelector selects a key of a Secret.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key of the secret to select from.  Must be a valid secret key.
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The name of the secret in the pod&#x27;s namespace to select from.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret or its key must be defined
                  },
                  &quot;configMapKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Selects a key of a ConfigMap.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Selects a key from a ConfigMap.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the ConfigMap or its key must be defined
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to select.
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The ConfigMap to select from.
                  },
                },
                &quot;value&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Variable references $(VAR_NAME) are expanded
                    # using the previous defined environment variables in the container and
                    # any route environment variables. If a variable cannot be resolved,
                    # the reference in the input string will be unchanged. The $(VAR_NAME)
                    # syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
                    # references will never be expanded, regardless of whether the variable
                    # exists or not.
                    # Defaults to &quot;&quot;.
              },
            ],
            &quot;resources&quot;: { # ResourceRequirements describes the compute resource requirements. # (Optional)
                #
                # Cloud Run fully managed: supported
                #
                # Cloud Run for Anthos: supported
                #
                # Compute Resources required by this container.
                # More info:
                # https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
              &quot;limits&quot;: { # (Optional)
                  #
                  # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                  # supported value for CPU is &#x27;1&#x27;.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Limits describes the maximum amount of compute resources allowed.
                  # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                  # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;requests&quot;: { # (Optional)
                  #
                  # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                  # supported value for CPU is &#x27;1&#x27;.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Requests describes the minimum amount of compute resources required.
                  # If Requests is omitted for a container, it defaults to Limits if that is
                  # explicitly specified, otherwise to an implementation-defined value.
                  # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                  # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                &quot;a_key&quot;: &quot;A String&quot;,
              },
            },
            &quot;readinessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Periodic probe of container service readiness.
                # Container will be removed from service endpoints if the probe fails.
                # More info:
                # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                #
                # Cloud Run for Anthos: supported
                #
                # Probe describes a health check to be performed against a container to
                # determine whether it is alive or ready to receive traffic.
              &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGet specifies the http request to perform.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # HTTPGetAction describes an action based on HTTP Get requests.
                &quot;httpHeaders&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Custom headers to set in the request. HTTP allows repeated headers.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # HTTPHeader describes a custom header to be used in HTTP probes
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field name
                    &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The header field value
                  },
                ],
                &quot;path&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Path to access on the HTTP server.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Host name to connect to, defaults to the pod IP. You probably want to set
                    # &quot;Host&quot; in httpHeaders instead.
                &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Scheme to use for connecting to the host.
                    # Defaults to HTTP.
              },
              &quot;failureThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive failures for the probe to be considered failed after
                  # having succeeded. Defaults to 3. Minimum value is 1.
              &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # One and only one of the following should be specified.
                  # Exec specifies the action to take.
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # ExecAction describes a &quot;run in container&quot; action.
                &quot;command&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Command is the command line to execute inside the container, the working
                    # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                    # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                    # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                    # explicitly call out to that shell. Exit status of 0 is treated as
                    # live/healthy and non-zero is unhealthy.
              },
              &quot;initialDelaySeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after the container has started before liveness probes
                  # are initiated. More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;timeoutSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Number of seconds after which the probe times out.
                  # Defaults to 1 second. Minimum value is 1.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
              &quot;successThreshold&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Minimum consecutive successes for the probe to be considered successful
                  # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                  # is 1.
              &quot;periodSeconds&quot;: 42, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # How often (in seconds) to perform the probe.
                  # Default to 10 seconds. Minimum value is 1.
              &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocket specifies an action involving a TCP port.
                  # TCP hooks not yet supported
                  #
                  # A field inlined from the Handler message.
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # TCPSocketAction describes an action based on opening a socket
                &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number or name of the port to access on the container.
                    # Number must be in the range 1 to 65535.
                    # Name must be an IANA_SVC_NAME.
                    #
                    # This field is currently limited to integer types only because of proto&#x27;s
                    # inability to properly support the IntOrString golang type.
                &quot;host&quot;: &quot;A String&quot;, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Optional: Host name to connect to, defaults to the pod IP.
              },
            },
            &quot;imagePullPolicy&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Image pull policy.
                # One of Always, Never, IfNotPresent.
                # Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.
                # More info:
                # https://kubernetes.io/docs/concepts/containers/images#updating-images
            &quot;terminationMessagePath&quot;: &quot;A String&quot;, # (Optional)
                #
                # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Path at which the file to which the container&#x27;s termination
                # message will be written is mounted into the container&#x27;s filesystem. Message
                # written is intended to be brief final status, such as an assertion failure
                # message. Will be truncated by the node if greater than 4096 bytes. The
                # total message length across all containers will be limited to 12kb.
                # Defaults to /dev/termination-log.
          },
        ],
      },
    },
  },
  &quot;kind&quot;: &quot;A String&quot;, # The kind of resource, in this case &quot;Service&quot;.
  &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Metadata associated with this Service, including name, namespace, labels,
      # and annotations.
      # persisted resources must have, which includes all objects users must create.
    &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
        #
        # CreationTimestamp is a timestamp representing the server time when this
        # object was created. It is not guaranteed to be set in happens-before order
        # across separate operations. Clients may not set this value. It is
        # represented in RFC3339 form and is in UTC.
        #
        # Populated by the system.
        # Read-only.
        # Null for lists.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
    &quot;labels&quot;: { # (Optional)
        #
        # Map of string keys and values that can be used to organize and categorize
        # (scope and select) objects. May match selectors of replication controllers
        # and routes.
        # More info: http://kubernetes.io/docs/user-guide/labels
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;generation&quot;: 42, # (Optional)
        #
        # A sequence number representing a specific generation of the desired state.
        # Populated by the system. Read-only.
    &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
        #
        # An opaque value that represents the internal version of this object that
        # can be used by clients to determine when objects have changed. May be used
        # for optimistic concurrency, change detection, and the watch operation on a
        # resource or set of resources. Clients must treat these values as opaque and
        # passed unmodified back to the server. They may only be valid for a
        # particular resource or set of resources.
        #
        # Populated by the system.
        # Read-only.
        # Value must be treated as opaque by clients and .
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
    &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
        #
        # SelfLink is a URL representing this object.
        # Populated by the system.
        # Read-only.
        #  string selfLink = 4;
    &quot;uid&quot;: &quot;A String&quot;, # (Optional)
        #
        # UID is the unique in time and space value for this object. It is typically
        # generated by the server on successful creation of a resource and is not
        # allowed to change on PUT operations.
        #
        # Populated by the system.
        # Read-only.
        # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
    &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
        # Cloud Run region. In Cloud Run the namespace must be equal to either the
        # project ID or project number.
    &quot;annotations&quot;: { # (Optional)
        #
        # Annotations is an unstructured key value map stored with a resource that
        # may be set by external tools to store and retrieve arbitrary metadata. They
        # are not queryable and should be preserved when modifying objects. More
        # info: http://kubernetes.io/docs/user-guide/annotations
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # GenerateName is an optional prefix, used by the server, to generate a
        # unique name ONLY IF the Name field has not been provided. If this field is
        # used, the name returned to the client will be different than the name
        # passed. This value will also be combined with a unique suffix. The provided
        # value has the same validation rules as the Name field, and may be truncated
        # by the length of the suffix required to make the value unique on the
        # server.
        #
        # If this field is specified and the generated name exists, the server will
        # NOT return a 409 - instead, it will either return 201 Created or 500 with
        # Reason ServerTimeout indicating a unique name could not be found in the
        # time allotted, and the client should retry (optionally after the time
        # indicated in the Retry-After header).
        #
        # Applied only if Name is not specified.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
        #  string generateName = 2;
    &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
        # Is required when creating
        # resources, although some resources may allow a client to request the
        # generation of an appropriate name automatically. Name is primarily intended
        # for creation idempotence and configuration definition. Cannot be updated.
        # More info: http://kubernetes.io/docs/user-guide/identifiers#names
        # +optional
    &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # Number of seconds allowed for this object to gracefully terminate before
        # it will be removed from the system. Only set when deletionTimestamp is also
        # set. May only be shortened. Read-only.
    &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # The name of the cluster which the object belongs to.
        # This is used to distinguish resources with same name and namespace in
        # different clusters. This field is not set anywhere right now and apiserver
        # is going to ignore it if set in create or update request.
    &quot;finalizers&quot;: [ # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # Must be empty before the object is deleted from the registry. Each entry
        # is an identifier for the responsible component that will remove the entry
        # from the list. If the deletionTimestamp of the object is non-nil, entries
        # in this list can only be removed.
        # +patchStrategy=merge
      &quot;A String&quot;,
    ],
    &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # DeletionTimestamp is RFC 3339 date and time at which this resource will be
        # deleted. This field is set by the server when a graceful deletion is
        # requested by the user, and is not directly settable by a client. The
        # resource is expected to be deleted (no longer visible from resource lists,
        # and not reachable by name) after the time in this field, once the
        # finalizers list is empty. As long as the finalizers list contains items,
        # deletion is blocked. Once the deletionTimestamp is set, this value may not
        # be unset or be set further into the future, although it may be shortened or
        # the resource may be deleted prior to this time. For example, a user may
        # request that a pod is deleted in 30 seconds. The Kubelet will react by
        # sending a graceful termination signal to the containers in the pod. After
        # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
        # to the container and after cleanup, remove the pod from the API. In the
        # presence of network partitions, this object may still exist after this
        # timestamp, until an administrator or automated process can determine the
        # resource is fully terminated.
        # If not set, graceful deletion of the object has not been requested.
        #
        # Populated by the system when a graceful deletion is requested.
        # Read-only.
        # More info:
        # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
    &quot;ownerReferences&quot;: [ # (Optional)
        #
        # Cloud Run fully managed: not supported
        #
        # Cloud Run for Anthos: supported
        #
        # List of objects that own this object. If ALL objects in the list have
        # been deleted, this object will be garbage collected.
      { # OwnerReference contains enough information to let you identify an owning
          # object. Currently, an owning object must be in the same namespace, so there
          # is no namespace field.
        &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
        &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
            # +optional
        &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
            # More info:
            # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
        &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
            # the owner cannot be deleted from the key-value store until this
            # reference is removed.
            # Defaults to false.
            # To set this field, a user needs &quot;delete&quot; permission of the owner,
            # otherwise 422 (Unprocessable Entity) will be returned.
            # +optional
        &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
        &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
            # More info: http://kubernetes.io/docs/user-guide/identifiers#names
      },
    ],
  },
}

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

Returns:
  An object of the form:

    { # Service acts as a top-level container that manages a set of Routes and
      # Configurations which implement a network service. Service exists to provide a
      # singular abstraction which can be access controlled, reasoned about, and
      # which encapsulates software lifecycle decisions such as rollout policy and
      # team resource ownership. Service acts only as an orchestrator of the
      # underlying Routes and Configurations (much as a kubernetes Deployment
      # orchestrates ReplicaSets).
      #
      # The Service&#x27;s controller will track the statuses of its owned Configuration
      # and Route, reflecting their statuses and conditions as its own.
      #
      # See also:
      # https://github.com/knative/serving/blob/master/docs/spec/overview.md#service
    &quot;status&quot;: { # The current state of the Service. Output only. # Status communicates the observed state of the Service (from the
        # controller).
      &quot;latestCreatedRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
          # LatestCreatedRevisionName is the last revision that was created from this
          # Service&#x27;s Configuration. It might not be ready yet, for that use
          # LatestReadyRevisionName.
      &quot;conditions&quot;: [ # Conditions communicates information about ongoing/complete
          # reconciliation processes that bring the &quot;spec&quot; inline with the observed
          # state of the world.
          # Service-specific conditions include:
          # * &quot;ConfigurationsReady&quot;: true when the underlying Configuration is ready.
          # * &quot;RoutesReady&quot;: true when the underlying Route is ready.
          # * &quot;Ready&quot;: true when both the underlying Route and Configuration are
          # ready.
        { # Condition defines a generic condition for a Resource
          &quot;message&quot;: &quot;A String&quot;, # Optional. Human readable message indicating details about the current status.
          &quot;lastTransitionTime&quot;: &quot;A String&quot;, # Optional. Last time the condition transitioned from one status to another.
          &quot;status&quot;: &quot;A String&quot;, # Status of the condition, one of True, False, Unknown.
          &quot;severity&quot;: &quot;A String&quot;, # Optional. How to interpret failures of this condition, one of Error, Warning, Info
          &quot;reason&quot;: &quot;A String&quot;, # Optional. One-word CamelCase reason for the condition&#x27;s last transition.
          &quot;type&quot;: &quot;A String&quot;, # type is used to communicate the status of the reconciliation process.
              # See also:
              # https://github.com/knative/serving/blob/master/docs/spec/errors.md#error-conditions-and-reporting
              # Types common to all resources include:
              # * &quot;Ready&quot;: True when the Resource is ready.
        },
      ],
      &quot;address&quot;: { # Information for connecting over HTTP(s). # From RouteStatus.
          # Similar to url, information on where the service is available on HTTP.
        &quot;url&quot;: &quot;A String&quot;,
      },
      &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Route that
          # was last processed by the controller.
          #
          # Clients polling for completed reconciliation should poll until
          # observedGeneration = metadata.generation and the Ready condition&#x27;s status
          # is True or False.
      &quot;url&quot;: &quot;A String&quot;, # From RouteStatus.
          # URL holds the url that will distribute traffic over the provided traffic
          # targets. It generally has the form
          # https://{route-hash}-{project-hash}-{cluster-level-suffix}.a.run.app
      &quot;traffic&quot;: [ # From RouteStatus.
          # Traffic holds the configured traffic distribution.
          # These entries will always contain RevisionName references.
          # When ConfigurationName appears in the spec, this will hold the
          # LatestReadyRevisionName that we last observed.
        { # TrafficTarget holds a single entry of the routing table for a Route.
          &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
              # is displayed in status, and is disallowed on spec. URL must contain a
              # scheme (e.g. http://) and a hostname, but may not contain anything else
              # (e.g. basic auth, url path, etc.
              #
              # Not currently supported in Cloud Run.
          &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
              # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
              # of the referenced configuration changes, we will automatically migrate
              # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
              # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
              # with RevisionName.
              #
              # Cloud Run currently supports a single ConfigurationName.
          &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
              # This defaults to zero if unspecified.
              #
              # Cloud Run currently requires 100 percent for a single ConfigurationName
              # TrafficTarget entry.
          &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
              # traffic. This is mutually exclusive with ConfigurationName.
              #
              # Providing RevisionName in spec is not currently supported by Cloud Run.
          &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
              # ready Revision of the Configuration should be used for this traffic
              # target. When provided LatestRevision must be true if RevisionName is
              # empty; it must be false when RevisionName is non-empty.
              #
              # +optional
          &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
              # this target exclusively.
              #
              # Not currently supported in Cloud Run.
              # +optional
        },
      ],
      &quot;latestReadyRevisionName&quot;: &quot;A String&quot;, # From ConfigurationStatus.
          # LatestReadyRevisionName holds the name of the latest Revision stamped out
          # from this Service&#x27;s Configuration that has had its &quot;Ready&quot; condition become
          # &quot;True&quot;.
    },
    &quot;apiVersion&quot;: &quot;A String&quot;, # The API version for this call such as &quot;serving.knative.dev/v1&quot;.
    &quot;spec&quot;: { # ServiceSpec holds the desired state of the Route (from the client), which # Spec holds the desired state of the Service (from the client).
        # is used to manipulate the underlying Route and Configuration(s).
      &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative
          # Revisions and Configurations.
        { # TrafficTarget holds a single entry of the routing table for a Route.
          &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL
              # is displayed in status, and is disallowed on spec. URL must contain a
              # scheme (e.g. http://) and a hostname, but may not contain anything else
              # (e.g. basic auth, url path, etc.
              #
              # Not currently supported in Cloud Run.
          &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will
              # send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot;
              # of the referenced configuration changes, we will automatically migrate
              # traffic from the prior &quot;latest ready&quot; revision to the new one. This field
              # is never set in Route&#x27;s status, only its spec. This is mutually exclusive
              # with RevisionName.
              #
              # Cloud Run currently supports a single ConfigurationName.
          &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration.
              # This defaults to zero if unspecified.
              #
              # Cloud Run currently requires 100 percent for a single ConfigurationName
              # TrafficTarget entry.
          &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of
              # traffic. This is mutually exclusive with ConfigurationName.
              #
              # Providing RevisionName in spec is not currently supported by Cloud Run.
          &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest
              # ready Revision of the Configuration should be used for this traffic
              # target. When provided LatestRevision must be true if RevisionName is
              # empty; it must be false when RevisionName is non-empty.
              #
              # +optional
          &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing
              # this target exclusively.
              #
              # Not currently supported in Cloud Run.
              # +optional
        },
      ],
      &quot;template&quot;: { # RevisionTemplateSpec describes the data a revision should have when created # Template holds the latest specification for the Revision to
          # be stamped out.
          # from a template. Based on:
          # https://github.com/kubernetes/api/blob/e771f807/core/v1/types.go#L3179-L3190
        &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Optional metadata for this Revision, including labels and annotations. Name
            # will be generated by the Configuration.
            # To set minimum instances for this revision, use the
            # &quot;autoscaling.knative.dev/minScale&quot; annotation key.
            # To set maximum instances for this revision, use the
            # &quot;autoscaling.knative.dev/maxScale&quot; annotation key.
            # To set Cloud SQL connections for the revision, use the
            # &quot;run.googleapis.com/cloudsql-instances&quot; annotation key.
            # persisted resources must have, which includes all objects users must create.
          &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # CreationTimestamp is a timestamp representing the server time when this
              # object was created. It is not guaranteed to be set in happens-before order
              # across separate operations. Clients may not set this value. It is
              # represented in RFC3339 form and is in UTC.
              #
              # Populated by the system.
              # Read-only.
              # Null for lists.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;labels&quot;: { # (Optional)
              #
              # Map of string keys and values that can be used to organize and categorize
              # (scope and select) objects. May match selectors of replication controllers
              # and routes.
              # More info: http://kubernetes.io/docs/user-guide/labels
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generation&quot;: 42, # (Optional)
              #
              # A sequence number representing a specific generation of the desired state.
              # Populated by the system. Read-only.
          &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
              #
              # An opaque value that represents the internal version of this object that
              # can be used by clients to determine when objects have changed. May be used
              # for optimistic concurrency, change detection, and the watch operation on a
              # resource or set of resources. Clients must treat these values as opaque and
              # passed unmodified back to the server. They may only be valid for a
              # particular resource or set of resources.
              #
              # Populated by the system.
              # Read-only.
              # Value must be treated as opaque by clients and .
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
          &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
              #
              # SelfLink is a URL representing this object.
              # Populated by the system.
              # Read-only.
              #  string selfLink = 4;
          &quot;uid&quot;: &quot;A String&quot;, # (Optional)
              #
              # UID is the unique in time and space value for this object. It is typically
              # generated by the server on successful creation of a resource and is not
              # allowed to change on PUT operations.
              #
              # Populated by the system.
              # Read-only.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
              # Cloud Run region. In Cloud Run the namespace must be equal to either the
              # project ID or project number.
          &quot;annotations&quot;: { # (Optional)
              #
              # Annotations is an unstructured key value map stored with a resource that
              # may be set by external tools to store and retrieve arbitrary metadata. They
              # are not queryable and should be preserved when modifying objects. More
              # info: http://kubernetes.io/docs/user-guide/annotations
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # GenerateName is an optional prefix, used by the server, to generate a
              # unique name ONLY IF the Name field has not been provided. If this field is
              # used, the name returned to the client will be different than the name
              # passed. This value will also be combined with a unique suffix. The provided
              # value has the same validation rules as the Name field, and may be truncated
              # by the length of the suffix required to make the value unique on the
              # server.
              #
              # If this field is specified and the generated name exists, the server will
              # NOT return a 409 - instead, it will either return 201 Created or 500 with
              # Reason ServerTimeout indicating a unique name could not be found in the
              # time allotted, and the client should retry (optionally after the time
              # indicated in the Retry-After header).
              #
              # Applied only if Name is not specified.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
              #  string generateName = 2;
          &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
              # Is required when creating
              # resources, although some resources may allow a client to request the
              # generation of an appropriate name automatically. Name is primarily intended
              # for creation idempotence and configuration definition. Cannot be updated.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
              # +optional
          &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Number of seconds allowed for this object to gracefully terminate before
              # it will be removed from the system. Only set when deletionTimestamp is also
              # set. May only be shortened. Read-only.
          &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # The name of the cluster which the object belongs to.
              # This is used to distinguish resources with same name and namespace in
              # different clusters. This field is not set anywhere right now and apiserver
              # is going to ignore it if set in create or update request.
          &quot;finalizers&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # Must be empty before the object is deleted from the registry. Each entry
              # is an identifier for the responsible component that will remove the entry
              # from the list. If the deletionTimestamp of the object is non-nil, entries
              # in this list can only be removed.
              # +patchStrategy=merge
            &quot;A String&quot;,
          ],
          &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # DeletionTimestamp is RFC 3339 date and time at which this resource will be
              # deleted. This field is set by the server when a graceful deletion is
              # requested by the user, and is not directly settable by a client. The
              # resource is expected to be deleted (no longer visible from resource lists,
              # and not reachable by name) after the time in this field, once the
              # finalizers list is empty. As long as the finalizers list contains items,
              # deletion is blocked. Once the deletionTimestamp is set, this value may not
              # be unset or be set further into the future, although it may be shortened or
              # the resource may be deleted prior to this time. For example, a user may
              # request that a pod is deleted in 30 seconds. The Kubelet will react by
              # sending a graceful termination signal to the containers in the pod. After
              # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
              # to the container and after cleanup, remove the pod from the API. In the
              # presence of network partitions, this object may still exist after this
              # timestamp, until an administrator or automated process can determine the
              # resource is fully terminated.
              # If not set, graceful deletion of the object has not been requested.
              #
              # Populated by the system when a graceful deletion is requested.
              # Read-only.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
          &quot;ownerReferences&quot;: [ # (Optional)
              #
              # Cloud Run fully managed: not supported
              #
              # Cloud Run for Anthos: supported
              #
              # List of objects that own this object. If ALL objects in the list have
              # been deleted, this object will be garbage collected.
            { # OwnerReference contains enough information to let you identify an owning
                # object. Currently, an owning object must be in the same namespace, so there
                # is no namespace field.
              &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
              &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
                  # +optional
              &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
                  # More info:
                  # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
              &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
                  # the owner cannot be deleted from the key-value store until this
                  # reference is removed.
                  # Defaults to false.
                  # To set this field, a user needs &quot;delete&quot; permission of the owner,
                  # otherwise 422 (Unprocessable Entity) will be returned.
                  # +optional
              &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
              &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
                  # More info: http://kubernetes.io/docs/user-guide/identifiers#names
            },
          ],
        },
        &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
          &quot;volumes&quot;: [
            { # Cloud Run fully managed: not supported
                #
                # Cloud Run for Anthos: supported
                #
                # Volume represents a named volume in a container.
              &quot;configMap&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Adapts a ConfigMap into a volume.
                  # The contents of the target ConfigMap&#x27;s Data field will be presented in a
                  # volume as files using the keys in the Data field as the file names, unless
                  # the items element is populated with specific mappings of keys to paths.
                &quot;optional&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Specify whether the Secret or its keys must be defined.
                &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Name of the config.
                &quot;defaultMode&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Mode bits to use on created files by default. Must be a value between 0 and
                    # 0777. Defaults to 0644. Directories within the path are not affected by
                    # this setting. This might be in conflict with other options that affect the
                    # file mode, like fsGroup, and the result can be other mode bits set.
                &quot;items&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If unspecified, each key-value pair in the Data field of the referenced
                    # Secret will be projected into the volume as a file whose name is the
                    # key and content is the value. If specified, the listed keys will be
                    # projected into the specified paths, and unlisted keys will not be
                    # present. If a key is specified which is not present in the Secret,
                    # the volume setup will error unless it is marked optional.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Maps a string key to a path within a volume.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to project.
                    &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The relative path of the file to map the key to.
                        # May not be an absolute path.
                        # May not contain the path element &#x27;..&#x27;.
                        # May not start with the string &#x27;..&#x27;.
                    &quot;mode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on this file, must be a value between 0 and 0777. If not
                        # specified, the volume defaultMode will be used. This might be in conflict
                        # with other options that affect the file mode, like fsGroup, and the result
                        # can be other mode bits set.
                  },
                ],
              },
              &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Volume&#x27;s name.
              &quot;secret&quot;: { # Cloud Run fully managed: not supported # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # The contents of the target Secret&#x27;s Data field will be presented in a volume
                  # as files using the keys in the Data field as the file names.
                &quot;optional&quot;: True or False, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Specify whether the Secret or its keys must be defined.
                &quot;defaultMode&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Mode bits to use on created files by default. Must be a value between 0 and
                    # 0777. Defaults to 0644. Directories within the path are not affected by
                    # this setting. This might be in conflict with other options that affect the
                    # file mode, like fsGroup, and the result can be other mode bits set.
                &quot;secretName&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Name of the secret in the container&#x27;s namespace to use.
                &quot;items&quot;: [ # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # If unspecified, each key-value pair in the Data field of the referenced
                    # Secret will be projected into the volume as a file whose name is the
                    # key and content is the value. If specified, the listed keys will be
                    # projected into the specified paths, and unlisted keys will not be
                    # present. If a key is specified which is not present in the Secret,
                    # the volume setup will error unless it is marked optional.
                  { # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Maps a string key to a path within a volume.
                    &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The key to project.
                    &quot;path&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The relative path of the file to map the key to.
                        # May not be an absolute path.
                        # May not contain the path element &#x27;..&#x27;.
                        # May not start with the string &#x27;..&#x27;.
                    &quot;mode&quot;: 42, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Mode bits to use on this file, must be a value between 0 and 0777. If not
                        # specified, the volume defaultMode will be used. This might be in conflict
                        # with other options that affect the file mode, like fsGroup, and the result
                        # can be other mode bits set.
                  },
                ],
              },
            },
          ],
          &quot;containerConcurrency&quot;: 42, # (Optional)
              #
              # ContainerConcurrency specifies the maximum allowed in-flight (concurrent)
              # requests per container instance of the Revision.
              #
              # Cloud Run fully managed: supported, defaults to 80
              #
              # Cloud Run for Anthos: supported, defaults to 0, which means concurrency
              # to the application is not limited, and the system decides the
              # target concurrency for the autoscaler.
          &quot;timeoutSeconds&quot;: 42, # TimeoutSeconds holds the max duration the instance is allowed for
              # responding to a request.
              # Not currently used by Cloud Run.
          &quot;serviceAccountName&quot;: &quot;A String&quot;, # Email address of the IAM service account associated with the revision
              # of the service. The service account represents the identity of the
              # running revision, and determines what permissions the revision has. If
              # not provided, the revision will use the project&#x27;s default service account.
          &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution
              # for this Revision. In the context of a Revision, we disallow a number of
              # fields on this Container, including: name and lifecycle.
              # In Cloud Run, only a single container may be provided.
              # The runtime contract is documented here:
              # https://github.com/knative/serving/blob/master/docs/runtime-contract.md
            { # A single application container.
                # This specifies both the container to run, the command to run in the container
                # and the arguments to supply to it.
                # Note that additional arguments may be supplied by the system to the container
                # at runtime.
              &quot;volumeMounts&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Pod volumes to mount into the container&#x27;s filesystem.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # VolumeMount describes a mounting of a Volume within a container.
                  &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # This must match the Name of a Volume.
                  &quot;readOnly&quot;: True or False, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Only true is accepted.
                      # Defaults to true.
                  &quot;mountPath&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path within the container at which the volume should be mounted.  Must
                      # not contain &#x27;:&#x27;.
                  &quot;subPath&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path within the volume from which the container&#x27;s volume should be mounted.
                      # Defaults to &quot;&quot; (volume&#x27;s root).
                },
              ],
              &quot;args&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Arguments to the entrypoint.
                  # The docker image&#x27;s CMD is used if this is not provided.
                  # Variable references $(VAR_NAME) are expanded using the container&#x27;s
                  # environment. If a variable cannot be resolved, the reference in the input
                  # string will be unchanged. The $(VAR_NAME) syntax can be escaped with a
                  # double $$, ie: $$(VAR_NAME). Escaped references will never be expanded,
                  # regardless of whether the variable exists or not.
                  # More info:
                  # https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
                &quot;A String&quot;,
              ],
              &quot;workingDir&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Container&#x27;s working directory.
                  # If not specified, the container runtime&#x27;s default will be used, which
                  # might be configured in the container image.
              &quot;ports&quot;: [ # (Optional)
                  #
                  # List of ports to expose from the container. Only a single port can be
                  # specified. The specified ports must be listening on all interfaces
                  # (0.0.0.0) within the container to be accessible.
                  #
                  # If omitted, a port number will be chosen and passed to the container
                  # through the PORT environment variable for the container to listen on.
                { # ContainerPort represents a network port in a single container.
                  &quot;containerPort&quot;: 42, # (Optional)
                      #
                      # Port number the container listens on.
                      # This must be a valid port number, 0 &lt; x &lt; 65536.
                  &quot;protocol&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Protocol for port. Must be &quot;TCP&quot;.
                      # Defaults to &quot;TCP&quot;.
                  &quot;name&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # If specified, used to specify which protocol to use.
                      # Allowed values are &quot;http1&quot; and &quot;h2c&quot;.
                },
              ],
              &quot;image&quot;: &quot;A String&quot;, # Cloud Run fully managed: only supports containers from Google Container
                  # Registry
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # URL of the Container image.
                  # More info: https://kubernetes.io/docs/concepts/containers/images
              &quot;envFrom&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of sources to populate environment variables in the container.
                  # The keys defined within a source must be a C_IDENTIFIER. All invalid keys
                  # will be reported as an event when the container is starting. When a key
                  # exists in multiple sources, the value associated with the last source will
                  # take precedence. Values defined by an Env with a duplicate key will take
                  # precedence. Cannot be updated.
                { # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # EnvFromSource represents the source of a set of ConfigMaps
                  &quot;prefix&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # An optional identifier to prepend to each key in the ConfigMap. Must be a
                      # C_IDENTIFIER.
                  &quot;configMapRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The ConfigMap to select from
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # ConfigMapEnvSource selects a ConfigMap to populate the environment
                      # variables with.
                      #
                      # The contents of the target ConfigMap&#x27;s Data field will represent the
                      # key-value pairs as environment variables.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the ConfigMap must be defined
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The ConfigMap to select from.
                  },
                  &quot;secretRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # The Secret to select from
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # SecretEnvSource selects a Secret to populate the environment
                      # variables with.
                      #
                      # The contents of the target Secret&#x27;s Data field will represent the
                      # key-value pairs as environment variables.
                    &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                        # directly into the message. Use the &quot;name&quot; field instead.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # LocalObjectReference contains enough information to let you locate the
                        # referenced object inside the same namespace.
                      &quot;name&quot;: &quot;A String&quot;, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Name of the referent.
                          # More info:
                          # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                    },
                    &quot;optional&quot;: True or False, # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Specify whether the Secret must be defined
                    &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # The Secret to select from.
                  },
                },
              ],
              &quot;name&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Name of the container specified as a DNS_LABEL.
              &quot;command&quot;: [
                &quot;A String&quot;,
              ],
              &quot;terminationMessagePolicy&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Indicate how the termination message should be populated. File will use the
                  # contents of terminationMessagePath to populate the container status message
                  # on both success and failure. FallbackToLogsOnError will use the last chunk
                  # of container log output if the termination message file is empty and the
                  # container exited with an error. The log output is limited to 2048 bytes or
                  # 80 lines, whichever is smaller. Defaults to File. Cannot be updated.
              &quot;securityContext&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Security options the pod should run with.
                  # More info: https://kubernetes.io/docs/concepts/policy/security-context/
                  # More info:
                  # https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # SecurityContext holds security configuration that will be applied to a
                  # container. Some fields are present in both SecurityContext and
                  # PodSecurityContext.  When both are set, the values in SecurityContext take
                  # precedence.
                &quot;runAsUser&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # The UID to run the entrypoint of the container process.
                    # Defaults to user specified in image metadata if unspecified.
                    # May also be set in PodSecurityContext.  If set in both SecurityContext and
                    # PodSecurityContext, the value specified in SecurityContext takes
                    # precedence.
              },
              &quot;livenessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Periodic probe of container liveness.
                  # Container will be restarted if the probe fails.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Probe describes a health check to be performed against a container to
                  # determine whether it is alive or ready to receive traffic.
                &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGet specifies the http request to perform.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGetAction describes an action based on HTTP Get requests.
                  &quot;httpHeaders&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Custom headers to set in the request. HTTP allows repeated headers.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPHeader describes a custom header to be used in HTTP probes
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field name
                      &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field value
                    },
                  ],
                  &quot;path&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path to access on the HTTP server.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Host name to connect to, defaults to the pod IP. You probably want to set
                      # &quot;Host&quot; in httpHeaders instead.
                  &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Scheme to use for connecting to the host.
                      # Defaults to HTTP.
                },
                &quot;failureThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive failures for the probe to be considered failed after
                    # having succeeded. Defaults to 3. Minimum value is 1.
                &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # One and only one of the following should be specified.
                    # Exec specifies the action to take.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ExecAction describes a &quot;run in container&quot; action.
                  &quot;command&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Command is the command line to execute inside the container, the working
                      # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                      # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                      # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                      # explicitly call out to that shell. Exit status of 0 is treated as
                      # live/healthy and non-zero is unhealthy.
                },
                &quot;initialDelaySeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after the container has started before liveness probes
                    # are initiated. More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;timeoutSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after which the probe times out.
                    # Defaults to 1 second. Minimum value is 1.
                    # More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;successThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive successes for the probe to be considered successful
                    # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                    # is 1.
                &quot;periodSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # How often (in seconds) to perform the probe.
                    # Default to 10 seconds. Minimum value is 1.
                &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocket specifies an action involving a TCP port.
                    # TCP hooks not yet supported
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocketAction describes an action based on opening a socket
                  &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Number or name of the port to access on the container.
                      # Number must be in the range 1 to 65535.
                      # Name must be an IANA_SVC_NAME.
                      #
                      # This field is currently limited to integer types only because of proto&#x27;s
                      # inability to properly support the IntOrString golang type.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Optional: Host name to connect to, defaults to the pod IP.
                },
              },
              &quot;env&quot;: [ # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # List of environment variables to set in the container.
                { # EnvVar represents an environment variable present in a Container.
                  &quot;name&quot;: &quot;A String&quot;, # Name of the environment variable. Must be a C_IDENTIFIER.
                  &quot;valueFrom&quot;: { # Cloud Run fully managed: not supported # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Source for the environment variable&#x27;s value. Cannot be used if value is not
                      # empty.
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # EnvVarSource represents a source for the value of an EnvVar.
                    &quot;secretKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key of a secret in the pod&#x27;s namespace
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # SecretKeySelector selects a key of a Secret.
                      &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The key of the secret to select from.  Must be a valid secret key.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The name of the secret in the pod&#x27;s namespace to select from.
                      &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                          # directly into the message. Use the &quot;name&quot; field instead.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # LocalObjectReference contains enough information to let you locate the
                          # referenced object inside the same namespace.
                        &quot;name&quot;: &quot;A String&quot;, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Name of the referent.
                            # More info:
                            # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                      },
                      &quot;optional&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Specify whether the Secret or its key must be defined
                    },
                    &quot;configMapKeyRef&quot;: { # Cloud Run fully managed: not supported # (Optional)
                        #
                        # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key of a ConfigMap.
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # Selects a key from a ConfigMap.
                      &quot;localObjectReference&quot;: { # Cloud Run fully managed: not supported # This field should not be used directly as it is meant to be inlined
                          # directly into the message. Use the &quot;name&quot; field instead.
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # LocalObjectReference contains enough information to let you locate the
                          # referenced object inside the same namespace.
                        &quot;name&quot;: &quot;A String&quot;, # (Optional)
                            #
                            # Cloud Run fully managed: not supported
                            #
                            # Cloud Run for Anthos: supported
                            #
                            # Name of the referent.
                            # More info:
                            # https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                      },
                      &quot;optional&quot;: True or False, # (Optional)
                          #
                          # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # Specify whether the ConfigMap or its key must be defined
                      &quot;key&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The key to select.
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The ConfigMap to select from.
                    },
                  },
                  &quot;value&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Variable references $(VAR_NAME) are expanded
                      # using the previous defined environment variables in the container and
                      # any route environment variables. If a variable cannot be resolved,
                      # the reference in the input string will be unchanged. The $(VAR_NAME)
                      # syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped
                      # references will never be expanded, regardless of whether the variable
                      # exists or not.
                      # Defaults to &quot;&quot;.
                },
              ],
              &quot;resources&quot;: { # ResourceRequirements describes the compute resource requirements. # (Optional)
                  #
                  # Cloud Run fully managed: supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Compute Resources required by this container.
                  # More info:
                  # https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources
                &quot;limits&quot;: { # (Optional)
                    #
                    # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                    # supported value for CPU is &#x27;1&#x27;.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Limits describes the maximum amount of compute resources allowed.
                    # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                    # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
                &quot;requests&quot;: { # (Optional)
                    #
                    # Cloud Run fully managed: Only memory and CPU are supported. Note: The only
                    # supported value for CPU is &#x27;1&#x27;.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Requests describes the minimum amount of compute resources required.
                    # If Requests is omitted for a container, it defaults to Limits if that is
                    # explicitly specified, otherwise to an implementation-defined value.
                    # The values of the map is string form of the &#x27;quantity&#x27; k8s type:
                    # https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery/pkg/api/resource/quantity.go
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
              },
              &quot;readinessProbe&quot;: { # Cloud Run fully managed: not supported # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Periodic probe of container service readiness.
                  # Container will be removed from service endpoints if the probe fails.
                  # More info:
                  # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Probe describes a health check to be performed against a container to
                  # determine whether it is alive or ready to receive traffic.
                &quot;httpGet&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGet specifies the http request to perform.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # HTTPGetAction describes an action based on HTTP Get requests.
                  &quot;httpHeaders&quot;: [ # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Custom headers to set in the request. HTTP allows repeated headers.
                    { # Cloud Run fully managed: not supported
                        #
                        # Cloud Run for Anthos: supported
                        #
                        # HTTPHeader describes a custom header to be used in HTTP probes
                      &quot;name&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field name
                      &quot;value&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported
                          #
                          # Cloud Run for Anthos: supported
                          #
                          # The header field value
                    },
                  ],
                  &quot;path&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Path to access on the HTTP server.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Host name to connect to, defaults to the pod IP. You probably want to set
                      # &quot;Host&quot; in httpHeaders instead.
                  &quot;scheme&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Scheme to use for connecting to the host.
                      # Defaults to HTTP.
                },
                &quot;failureThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive failures for the probe to be considered failed after
                    # having succeeded. Defaults to 3. Minimum value is 1.
                &quot;exec&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # One and only one of the following should be specified.
                    # Exec specifies the action to take.
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # ExecAction describes a &quot;run in container&quot; action.
                  &quot;command&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Command is the command line to execute inside the container, the working
                      # directory for the command  is root (&#x27;/&#x27;) in the container&#x27;s filesystem. The
                      # command is simply exec&#x27;d, it is not run inside a shell, so traditional
                      # shell instructions (&#x27;|&#x27;, etc) won&#x27;t work. To use a shell, you need to
                      # explicitly call out to that shell. Exit status of 0 is treated as
                      # live/healthy and non-zero is unhealthy.
                },
                &quot;initialDelaySeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after the container has started before liveness probes
                    # are initiated. More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;timeoutSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Number of seconds after which the probe times out.
                    # Defaults to 1 second. Minimum value is 1.
                    # More info:
                    # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
                &quot;successThreshold&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # Minimum consecutive successes for the probe to be considered successful
                    # after having failed. Defaults to 1. Must be 1 for liveness. Minimum value
                    # is 1.
                &quot;periodSeconds&quot;: 42, # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # How often (in seconds) to perform the probe.
                    # Default to 10 seconds. Minimum value is 1.
                &quot;tcpSocket&quot;: { # Cloud Run fully managed: not supported # (Optional)
                    #
                    # Cloud Run fully managed: not supported
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocket specifies an action involving a TCP port.
                    # TCP hooks not yet supported
                    #
                    # A field inlined from the Handler message.
                    #
                    # Cloud Run for Anthos: supported
                    #
                    # TCPSocketAction describes an action based on opening a socket
                  &quot;port&quot;: 42, # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Number or name of the port to access on the container.
                      # Number must be in the range 1 to 65535.
                      # Name must be an IANA_SVC_NAME.
                      #
                      # This field is currently limited to integer types only because of proto&#x27;s
                      # inability to properly support the IntOrString golang type.
                  &quot;host&quot;: &quot;A String&quot;, # (Optional)
                      #
                      # Cloud Run fully managed: not supported
                      #
                      # Cloud Run for Anthos: supported
                      #
                      # Optional: Host name to connect to, defaults to the pod IP.
                },
              },
              &quot;imagePullPolicy&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Image pull policy.
                  # One of Always, Never, IfNotPresent.
                  # Defaults to Always if :latest tag is specified, or IfNotPresent otherwise.
                  # More info:
                  # https://kubernetes.io/docs/concepts/containers/images#updating-images
              &quot;terminationMessagePath&quot;: &quot;A String&quot;, # (Optional)
                  #
                  # Cloud Run fully managed: not supported
                  #
                  # Cloud Run for Anthos: supported
                  #
                  # Path at which the file to which the container&#x27;s termination
                  # message will be written is mounted into the container&#x27;s filesystem. Message
                  # written is intended to be brief final status, such as an assertion failure
                  # message. Will be truncated by the node if greater than 4096 bytes. The
                  # total message length across all containers will be limited to 12kb.
                  # Defaults to /dev/termination-log.
            },
          ],
        },
      },
    },
    &quot;kind&quot;: &quot;A String&quot;, # The kind of resource, in this case &quot;Service&quot;.
    &quot;metadata&quot;: { # k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta is metadata that all # Metadata associated with this Service, including name, namespace, labels,
        # and annotations.
        # persisted resources must have, which includes all objects users must create.
      &quot;creationTimestamp&quot;: &quot;A String&quot;, # (Optional)
          #
          # CreationTimestamp is a timestamp representing the server time when this
          # object was created. It is not guaranteed to be set in happens-before order
          # across separate operations. Clients may not set this value. It is
          # represented in RFC3339 form and is in UTC.
          #
          # Populated by the system.
          # Read-only.
          # Null for lists.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
      &quot;labels&quot;: { # (Optional)
          #
          # Map of string keys and values that can be used to organize and categorize
          # (scope and select) objects. May match selectors of replication controllers
          # and routes.
          # More info: http://kubernetes.io/docs/user-guide/labels
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;generation&quot;: 42, # (Optional)
          #
          # A sequence number representing a specific generation of the desired state.
          # Populated by the system. Read-only.
      &quot;resourceVersion&quot;: &quot;A String&quot;, # (Optional)
          #
          # An opaque value that represents the internal version of this object that
          # can be used by clients to determine when objects have changed. May be used
          # for optimistic concurrency, change detection, and the watch operation on a
          # resource or set of resources. Clients must treat these values as opaque and
          # passed unmodified back to the server. They may only be valid for a
          # particular resource or set of resources.
          #
          # Populated by the system.
          # Read-only.
          # Value must be treated as opaque by clients and .
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency
      &quot;selfLink&quot;: &quot;A String&quot;, # (Optional)
          #
          # SelfLink is a URL representing this object.
          # Populated by the system.
          # Read-only.
          #  string selfLink = 4;
      &quot;uid&quot;: &quot;A String&quot;, # (Optional)
          #
          # UID is the unique in time and space value for this object. It is typically
          # generated by the server on successful creation of a resource and is not
          # allowed to change on PUT operations.
          #
          # Populated by the system.
          # Read-only.
          # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
      &quot;namespace&quot;: &quot;A String&quot;, # Namespace defines the space within each name must be unique, within a
          # Cloud Run region. In Cloud Run the namespace must be equal to either the
          # project ID or project number.
      &quot;annotations&quot;: { # (Optional)
          #
          # Annotations is an unstructured key value map stored with a resource that
          # may be set by external tools to store and retrieve arbitrary metadata. They
          # are not queryable and should be preserved when modifying objects. More
          # info: http://kubernetes.io/docs/user-guide/annotations
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;generateName&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # GenerateName is an optional prefix, used by the server, to generate a
          # unique name ONLY IF the Name field has not been provided. If this field is
          # used, the name returned to the client will be different than the name
          # passed. This value will also be combined with a unique suffix. The provided
          # value has the same validation rules as the Name field, and may be truncated
          # by the length of the suffix required to make the value unique on the
          # server.
          #
          # If this field is specified and the generated name exists, the server will
          # NOT return a 409 - instead, it will either return 201 Created or 500 with
          # Reason ServerTimeout indicating a unique name could not be found in the
          # time allotted, and the client should retry (optionally after the time
          # indicated in the Retry-After header).
          #
          # Applied only if Name is not specified.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency
          #  string generateName = 2;
      &quot;name&quot;: &quot;A String&quot;, # Name must be unique within a namespace, within a Cloud Run region.
          # Is required when creating
          # resources, although some resources may allow a client to request the
          # generation of an appropriate name automatically. Name is primarily intended
          # for creation idempotence and configuration definition. Cannot be updated.
          # More info: http://kubernetes.io/docs/user-guide/identifiers#names
          # +optional
      &quot;deletionGracePeriodSeconds&quot;: 42, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # Number of seconds allowed for this object to gracefully terminate before
          # it will be removed from the system. Only set when deletionTimestamp is also
          # set. May only be shortened. Read-only.
      &quot;clusterName&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # The name of the cluster which the object belongs to.
          # This is used to distinguish resources with same name and namespace in
          # different clusters. This field is not set anywhere right now and apiserver
          # is going to ignore it if set in create or update request.
      &quot;finalizers&quot;: [ # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # Must be empty before the object is deleted from the registry. Each entry
          # is an identifier for the responsible component that will remove the entry
          # from the list. If the deletionTimestamp of the object is non-nil, entries
          # in this list can only be removed.
          # +patchStrategy=merge
        &quot;A String&quot;,
      ],
      &quot;deletionTimestamp&quot;: &quot;A String&quot;, # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # DeletionTimestamp is RFC 3339 date and time at which this resource will be
          # deleted. This field is set by the server when a graceful deletion is
          # requested by the user, and is not directly settable by a client. The
          # resource is expected to be deleted (no longer visible from resource lists,
          # and not reachable by name) after the time in this field, once the
          # finalizers list is empty. As long as the finalizers list contains items,
          # deletion is blocked. Once the deletionTimestamp is set, this value may not
          # be unset or be set further into the future, although it may be shortened or
          # the resource may be deleted prior to this time. For example, a user may
          # request that a pod is deleted in 30 seconds. The Kubelet will react by
          # sending a graceful termination signal to the containers in the pod. After
          # that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL)
          # to the container and after cleanup, remove the pod from the API. In the
          # presence of network partitions, this object may still exist after this
          # timestamp, until an administrator or automated process can determine the
          # resource is fully terminated.
          # If not set, graceful deletion of the object has not been requested.
          #
          # Populated by the system when a graceful deletion is requested.
          # Read-only.
          # More info:
          # https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
      &quot;ownerReferences&quot;: [ # (Optional)
          #
          # Cloud Run fully managed: not supported
          #
          # Cloud Run for Anthos: supported
          #
          # List of objects that own this object. If ALL objects in the list have
          # been deleted, this object will be garbage collected.
        { # OwnerReference contains enough information to let you identify an owning
            # object. Currently, an owning object must be in the same namespace, so there
            # is no namespace field.
          &quot;uid&quot;: &quot;A String&quot;, # UID of the referent.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#uids
          &quot;controller&quot;: True or False, # If true, this reference points to the managing controller.
              # +optional
          &quot;kind&quot;: &quot;A String&quot;, # Kind of the referent.
              # More info:
              # https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
          &quot;blockOwnerDeletion&quot;: True or False, # If true, AND if the owner has the &quot;foregroundDeletion&quot; finalizer, then
              # the owner cannot be deleted from the key-value store until this
              # reference is removed.
              # Defaults to false.
              # To set this field, a user needs &quot;delete&quot; permission of the owner,
              # otherwise 422 (Unprocessable Entity) will be returned.
              # +optional
          &quot;apiVersion&quot;: &quot;A String&quot;, # API version of the referent.
          &quot;name&quot;: &quot;A String&quot;, # Name of the referent.
              # More info: http://kubernetes.io/docs/user-guide/identifiers#names
        },
      ],
    },
  }</pre>
</div>

</body></html>