/*
Copyright The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/


// This file was autogenerated by go-to-protobuf. Do not edit it manually!

syntax = 'proto2';

package k8s.io.apimachinery.pkg.apis.meta.v1;

import "k8s.io/apimachinery/pkg/runtime/generated.proto";
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";

// Package-wide variables from generator "generated".
option go_package = "v1";

// APIGroup contains the name, the supported versions, and the preferred version
// of a group.
message APIGroup {
  // name is the name of the group.
  optional string name = 1;

  // versions are the versions supported in this group.
  repeated GroupVersionForDiscovery versions = 2;

  // preferredVersion is the version preferred by the API server, which
  // probably is the storage version.
  // +optional
  optional GroupVersionForDiscovery preferredVersion = 3;

  // a map of client CIDR to server address that is serving this group.
  // This is to help clients reach servers in the most network-efficient way possible.
  // Clients can use the appropriate server address as per the CIDR that they match.
  // In case of multiple matches, clients should use the longest matching CIDR.
  // The server returns only those CIDRs that it thinks that the client can match.
  // For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP.
  // Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.
  // +optional
  repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 4;
}

// APIGroupList is a list of APIGroup, to allow clients to discover the API at
// /apis.
message APIGroupList {
  // groups is a list of APIGroup.
  repeated APIGroup groups = 1;
}

// APIResource specifies the name of a resource and whether it is namespaced.
message APIResource {
  // name is the plural name of the resource.
  optional string name = 1;

  // singularName is the singular name of the resource.  This allows clients to handle plural and singular opaquely.
  // The singularName is more correct for reporting status on a single item and both singular and plural are allowed
  // from the kubectl CLI interface.
  optional string singularName = 6;

  // namespaced indicates if a resource is namespaced or not.
  optional bool namespaced = 2;

  // group is the preferred group of the resource.  Empty implies the group of the containing resource list.
  // For subresources, this may have a different value, for example: Scale".
  optional string group = 8;

  // version is the preferred version of the resource.  Empty implies the version of the containing resource list
  // For subresources, this may have a different value, for example: v1 (while inside a v1beta1 version of the core resource's group)".
  optional string version = 9;

  // kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')
  optional string kind = 3;

  // verbs is a list of supported kube verbs (this includes get, list, watch, create,
  // update, patch, delete, deletecollection, and proxy)
  optional Verbs verbs = 4;

  // shortNames is a list of suggested short names of the resource.
  repeated string shortNames = 5;

  // categories is a list of the grouped resources this resource belongs to (e.g. 'all')
  repeated string categories = 7;

  // The hash value of the storage version, the version this resource is
  // converted to when written to the data store. Value must be treated
  // as opaque by clients. Only equality comparison on the value is valid.
  // This is an alpha feature and may change or be removed in the future.
  // The field is populated by the apiserver only if the
  // StorageVersionHash feature gate is enabled.
  // This field will remain optional even if it graduates.
  // +optional
  optional string storageVersionHash = 10;
}

// APIResourceList is a list of APIResource, it is used to expose the name of the
// resources supported in a specific group and version, and if the resource
// is namespaced.
message APIResourceList {
  // groupVersion is the group and version this APIResourceList is for.
  optional string groupVersion = 1;

  // resources contains the name of the resources and if they are namespaced.
  repeated APIResource resources = 2;
}

// APIVersions lists the versions that are available, to allow clients to
// discover the API at /api, which is the root path of the legacy v1 API.
//
// +protobuf.options.(gogoproto.goproto_stringer)=false
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
message APIVersions {
  // versions are the api versions that are available.
  repeated string versions = 1;

  // a map of client CIDR to server address that is serving this group.
  // This is to help clients reach servers in the most network-efficient way possible.
  // Clients can use the appropriate server address as per the CIDR that they match.
  // In case of multiple matches, clients should use the longest matching CIDR.
  // The server returns only those CIDRs that it thinks that the client can match.
  // For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP.
  // Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.
  repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 2;
}

// CreateOptions may be provided when creating an API object.
message CreateOptions {
  // When present, indicates that modifications should not be
  // persisted. An invalid or unrecognized dryRun directive will
  // result in an error response and no further processing of the
  // request. Valid values are:
  // - All: all dry run stages will be processed
  // +optional
  repeated string dryRun = 1;

  // fieldManager is a name associated with the actor or entity
  // that is making these changes. The value must be less than or
  // 128 characters long, and only contain printable characters,
  // as defined by https://golang.org/pkg/unicode/#IsPrint.
  // +optional
  optional string fieldManager = 3;
}

// DeleteOptions may be provided when deleting an API object.
message DeleteOptions {
  // The duration in seconds before the object should be deleted. Value must be non-negative integer.
  // The value zero indicates delete immediately. If this value is nil, the default grace period for the
  // specified type will be used.
  // Defaults to a per object value if not specified. zero means delete immediately.
  // +optional
  optional int64 gracePeriodSeconds = 1;

  // Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be
  // returned.
  // +optional
  optional Preconditions preconditions = 2;

  // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7.
  // Should the dependent objects be orphaned. If true/false, the "orphan"
  // finalizer will be added to/removed from the object's finalizers list.
  // Either this field or PropagationPolicy may be set, but not both.
  // +optional
  optional bool orphanDependents = 3;

  // Whether and how garbage collection will be performed.
  // Either this field or OrphanDependents may be set, but not both.
  // The default policy is decided by the existing finalizer set in the
  // metadata.finalizers and the resource-specific default policy.
  // Acceptable values are: 'Orphan' - orphan the dependents; 'Background' -
  // allow the garbage collector to delete the dependents in the background;
  // 'Foreground' - a cascading policy that deletes all dependents in the
  // foreground.
  // +optional
  optional string propagationPolicy = 4;

  // When present, indicates that modifications should not be
  // persisted. An invalid or unrecognized dryRun directive will
  // result in an error response and no further processing of the
  // request. Valid values are:
  // - All: all dry run stages will be processed
  // +optional
  repeated string dryRun = 5;
}

// Duration is a wrapper around time.Duration which supports correct
// marshaling to YAML and JSON. In particular, it marshals into strings, which
// can be used as map keys in json.
message Duration {
  optional int64 duration = 1;
}

// ExportOptions is the query options to the standard REST get call.
// Deprecated. Planned for removal in 1.18.
message ExportOptions {
  // Should this value be exported.  Export strips fields that a user can not specify.
  // Deprecated. Planned for removal in 1.18.
  optional bool export = 1;

  // Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'.
  // Deprecated. Planned for removal in 1.18.
  optional bool exact = 2;
}

// Fields stores a set of fields in a data structure like a Trie.
// To understand how this is used, see: https://github.com/kubernetes-sigs/structured-merge-diff
message Fields {
  // Map stores a set of fields in a data structure like a Trie.
  //
  // Each key is either a '.' representing the field itself, and will always map to an empty set,
  // or a string representing a sub-field or item. The string will follow one of these four formats:
  // 'f:<name>', where <name> is the name of a field in a struct, or key in a map
  // 'v:<value>', where <value> is the exact json formatted value of a list item
  // 'i:<index>', where <index> is position of a item in a list
  // 'k:<keys>', where <keys> is a map of  a list item's key fields to their unique values
  // If a key maps to an empty Fields value, the field that key represents is part of the set.
  //
  // The exact format is defined in k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal
  map<string, Fields> map = 1;
}

// GetOptions is the standard query options to the standard REST get call.
message GetOptions {
  // When specified:
  // - if unset, then the result is returned from remote storage based on quorum-read flag;
  // - if it's 0, then we simply return what we currently have in cache, no guarantee;
  // - if set to non zero, then the result is at least as fresh as given rv.
  optional string resourceVersion = 1;
}

// GroupKind specifies a Group and a Kind, but does not force a version.  This is useful for identifying
// concepts during lookup stages without having partially valid types
//
// +protobuf.options.(gogoproto.goproto_stringer)=false
message GroupKind {
  optional string group = 1;

  optional string kind = 2;
}

// GroupResource specifies a Group and a Resource, but does not force a version.  This is useful for identifying
// concepts during lookup stages without having partially valid types
//
// +protobuf.options.(gogoproto.goproto_stringer)=false
message GroupResource {
  optional string group = 1;

  optional string resource = 2;
}

// GroupVersion contains the "group" and the "version", which uniquely identifies the API.
//
// +protobuf.options.(gogoproto.goproto_stringer)=false
message GroupVersion {
  optional string group = 1;

  optional string version = 2;
}

// GroupVersion contains the "group/version" and "version" string of a version.
// It is made a struct to keep extensibility.
message GroupVersionForDiscovery {
  // groupVersion specifies the API group and version in the form "group/version"
  optional string groupVersion = 1;

  // version specifies the version in the form of "version". This is to save
  // the clients the trouble of splitting the GroupVersion.
  optional string version = 2;
}

// GroupVersionKind unambiguously identifies a kind.  It doesn't anonymously include GroupVersion
// to avoid automatic coersion.  It doesn't use a GroupVersion to avoid custom marshalling
//
// +protobuf.options.(gogoproto.goproto_stringer)=false
message GroupVersionKind {
  optional string group = 1;

  optional string version = 2;

  optional string kind = 3;
}

// GroupVersionResource unambiguously identifies a resource.  It doesn't anonymously include GroupVersion
// to avoid automatic coersion.  It doesn't use a GroupVersion to avoid custom marshalling
//
// +protobuf.options.(gogoproto.goproto_stringer)=false
message GroupVersionResource {
  optional string group = 1;

  optional string version = 2;

  optional string resource = 3;
}

// Initializer is information about an initializer that has not yet completed.
message Initializer {
  // name of the process that is responsible for initializing this object.
  optional string name = 1;
}

// Initializers tracks the progress of initialization.
message Initializers {
  // Pending is a list of initializers that must execute in order before this object is visible.
  // When the last pending initializer is removed, and no failing result is set, the initializers
  // struct will be set to nil and the object is considered as initialized and visible to all
  // clients.
  // +patchMergeKey=name
  // +patchStrategy=merge
  repeated Initializer pending = 1;

  // If result is set with the Failure field, the object will be persisted to storage and then deleted,
  // ensuring that other clients can observe the deletion.
  optional Status result = 2;
}

// A label selector is a label query over a set of resources. The result of matchLabels and
// matchExpressions are ANDed. An empty label selector matches all objects. A null
// label selector matches no objects.
message LabelSelector {
  // matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels
  // map is equivalent to an element of matchExpressions, whose key field is "key", the
  // operator is "In", and the values array contains only "value". The requirements are ANDed.
  // +optional
  map<string, string> matchLabels = 1;

  // matchExpressions is a list of label selector requirements. The requirements are ANDed.
  // +optional
  repeated LabelSelectorRequirement matchExpressions = 2;
}

// A label selector requirement is a selector that contains values, a key, and an operator that
// relates the key and values.
message LabelSelectorRequirement {
  // key is the label key that the selector applies to.
  // +patchMergeKey=key
  // +patchStrategy=merge
  optional string key = 1;

  // operator represents a key's relationship to a set of values.
  // Valid operators are In, NotIn, Exists and DoesNotExist.
  optional string operator = 2;

  // values is an array of string values. If the operator is In or NotIn,
  // the values array must be non-empty. If the operator is Exists or DoesNotExist,
  // the values array must be empty. This array is replaced during a strategic
  // merge patch.
  // +optional
  repeated string values = 3;
}

// List holds a list of objects, which may not be known by the server.
message List {
  // Standard list metadata.
  // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
  // +optional
  optional ListMeta metadata = 1;

  // List of objects
  repeated k8s.io.apimachinery.pkg.runtime.RawExtension items = 2;
}

// ListMeta describes metadata that synthetic resources must have, including lists and
// various status objects. A resource may have only one of {ObjectMeta, ListMeta}.
message ListMeta {
  // selfLink is a URL representing this object.
  // Populated by the system.
  // Read-only.
  // +optional
  optional string selfLink = 1;

  // String that identifies the server'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
  optional string resourceVersion = 2;

  // 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
  // consistent 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, unless you have received this token from an error
  // message.
  optional string continue = 3;
}

// ListOptions is the query options to a standard REST list call.
message ListOptions {
  // A selector to restrict the list of returned objects by their labels.
  // Defaults to everything.
  // +optional
  optional string labelSelector = 1;

  // A selector to restrict the list of returned objects by their fields.
  // Defaults to everything.
  // +optional
  optional string fieldSelector = 2;

  // Watch for changes to the described resources and return them as a stream of
  // add, update, and remove notifications. Specify resourceVersion.
  // +optional
  optional bool watch = 3;

  // When specified with a watch call, shows changes that occur after that particular version of a resource.
  // Defaults to changes from the beginning of history.
  // When specified for list:
  // - if unset, then the result is returned from remote storage based on quorum-read flag;
  // - if it's 0, then we simply return what we currently have in cache, no guarantee;
  // - if set to non zero, then the result is at least as fresh as given rv.
  // +optional
  optional string resourceVersion = 4;

  // Timeout for the list/watch call.
  // This limits the duration of the call, regardless of any activity or inactivity.
  // +optional
  optional int64 timeoutSeconds = 5;

  // limit is a maximum number of responses to return for a list call. If more items exist, the
  // server will set the `continue` field on the list metadata to a value that can be used with the
  // same initial query to retrieve the next set of results. Setting a limit may return fewer than
  // the requested amount of items (up to zero items) in the event all requested objects are
  // filtered out and clients should only use the presence of the continue field to determine whether
  // more results are available. Servers may choose not to support the limit argument and will return
  // all of the available results. If limit is specified and the continue field is empty, clients may
  // assume that no more results are available. This field is not supported if watch is true.
  //
  // The server guarantees that the objects returned when using continue will be identical to issuing
  // a single list call without a limit - that is, no objects created, modified, or deleted after the
  // first request is issued will be included in any subsequent continued requests. This is sometimes
  // referred to as a consistent snapshot, and ensures that a client that is using limit to receive
  // smaller chunks of a very large result can ensure they see all possible objects. If objects are
  // updated during a chunked list the version of the object that was present at the time the first list
  // result was calculated is returned.
  optional int64 limit = 7;

  // The continue option should be set when retrieving more results from the server. Since this value is
  // server defined, clients may only use the continue value from a previous query result with identical
  // query parameters (except for the value of continue) and the server may reject a continue value it
  // does not recognize. If the specified continue value is no longer valid whether due to expiration
  // (generally five to fifteen minutes) or a configuration change on the server, the server will
  // respond with a 410 ResourceExpired error together with a continue token. If the client needs a
  // consistent list, it must restart their list without the continue field. Otherwise, the client may
  // send another list request with the token received with the 410 error, the server will respond with
  // a list starting from the next key, but from the latest snapshot, which is inconsistent from the
  // previous list results - objects that are created, modified, or deleted after the first list request
  // will be included in the response, as long as their keys are after the "next key".
  //
  // This field is not supported when watch is true. Clients may start a watch from the last
  // resourceVersion value returned by the server and not miss any modifications.
  optional string continue = 8;
}

// ManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource
// that the fieldset applies to.
message ManagedFieldsEntry {
  // Manager is an identifier of the workflow managing these fields.
  optional string manager = 1;

  // Operation is the type of operation which lead to this ManagedFieldsEntry being created.
  // The only valid values for this field are 'Apply' and 'Update'.
  optional string operation = 2;

  // APIVersion defines the version of this resource that this field set
  // applies to. The format is "group/version" just like the top-level
  // APIVersion field. It is necessary to track the version of a field
  // set because it cannot be automatically converted.
  optional string apiVersion = 3;

  // Time is timestamp of when these fields were set. It should always be empty if Operation is 'Apply'
  // +optional
  optional Time time = 4;

  // Fields identifies a set of fields.
  // +optional
  optional Fields fields = 5;
}

// MicroTime is version of Time with microsecond level precision.
//
// +protobuf.options.marshal=false
// +protobuf.as=Timestamp
// +protobuf.options.(gogoproto.goproto_stringer)=false
message MicroTime {
  // Represents seconds of UTC time since Unix epoch
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
  // 9999-12-31T23:59:59Z inclusive.
  optional int64 seconds = 1;

  // Non-negative fractions of a second at nanosecond resolution. Negative
  // second values with fractions must still have non-negative nanos values
  // that count forward in time. Must be from 0 to 999,999,999
  // inclusive. This field may be limited in precision depending on context.
  optional int32 nanos = 2;
}

// ObjectMeta is metadata that all persisted resources must have, which includes all objects
// users must create.
message ObjectMeta {
  // Name must be unique within a namespace. 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
  optional string name = 1;

  // 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
  // +optional
  optional string generateName = 2;

  // Namespace defines the space within each name must be unique. An empty namespace is
  // equivalent to the "default" namespace, but "default" is the canonical representation.
  // Not all objects are required to be scoped to a namespace - the value of this field for
  // those objects will be empty.
  //
  // Must be a DNS_LABEL.
  // Cannot be updated.
  // More info: http://kubernetes.io/docs/user-guide/namespaces
  // +optional
  optional string namespace = 3;

  // SelfLink is a URL representing this object.
  // Populated by the system.
  // Read-only.
  // +optional
  optional string selfLink = 4;

  // 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
  // +optional
  optional string uid = 5;

  // 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
  // +optional
  optional string resourceVersion = 6;

  // A sequence number representing a specific generation of the desired state.
  // Populated by the system. Read-only.
  // +optional
  optional int64 generation = 7;

  // 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
  // +optional
  optional Time creationTimestamp = 8;

  // 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
  // +optional
  optional Time deletionTimestamp = 9;

  // 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.
  // +optional
  optional int64 deletionGracePeriodSeconds = 10;

  // 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 services.
  // More info: http://kubernetes.io/docs/user-guide/labels
  // +optional
  map<string, string> labels = 11;

  // 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
  // +optional
  map<string, string> annotations = 12;

  // List of objects depended by this object. If ALL objects in the list have
  // been deleted, this object will be garbage collected. If this object is managed by a controller,
  // then an entry in this list will point to this controller, with the controller field set to true.
  // There cannot be more than one managing controller.
  // +optional
  // +patchMergeKey=uid
  // +patchStrategy=merge
  repeated OwnerReference ownerReferences = 13;

  // An initializer is a controller which enforces some system invariant at object creation time.
  // This field is a list of initializers that have not yet acted on this object. If nil or empty,
  // this object has been completely initialized. Otherwise, the object is considered uninitialized
  // and is hidden (in list/watch and get calls) from clients that haven't explicitly asked to
  // observe uninitialized objects.
  //
  // When an object is created, the system will populate this list with the current set of initializers.
  // Only privileged users may set or modify this list. Once it is empty, it may not be modified further
  // by any user.
  //
  // DEPRECATED - initializers are an alpha field and will be removed in v1.15.
  optional Initializers initializers = 16;

  // 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.
  // +optional
  // +patchStrategy=merge
  repeated string finalizers = 14;

  // 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.
  // +optional
  optional string clusterName = 15;

  // ManagedFields maps workflow-id and version to the set of fields
  // that are managed by that workflow. This is mostly for internal
  // housekeeping, and users typically shouldn't need to set or
  // understand this field. A workflow can be the user's name, a
  // controller's name, or the name of a specific apply path like
  // "ci-cd". The set of fields is always in the version that the
  // workflow used when modifying the object.
  //
  // This field is alpha and can be changed or removed without notice.
  //
  // +optional
  repeated ManagedFieldsEntry managedFields = 17;
}

// OwnerReference contains enough information to let you identify an owning
// object. An owning object must be in the same namespace as the dependent, or
// be cluster-scoped, so there is no namespace field.
message OwnerReference {
  // API version of the referent.
  optional string apiVersion = 5;

  // Kind of the referent.
  // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
  optional string kind = 1;

  // Name of the referent.
  // More info: http://kubernetes.io/docs/user-guide/identifiers#names
  optional string name = 3;

  // UID of the referent.
  // More info: http://kubernetes.io/docs/user-guide/identifiers#uids
  optional string uid = 4;

  // If true, this reference points to the managing controller.
  // +optional
  optional bool controller = 6;

  // If true, AND if the owner has the "foregroundDeletion" 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 "delete" permission of the owner,
  // otherwise 422 (Unprocessable Entity) will be returned.
  // +optional
  optional bool blockOwnerDeletion = 7;
}

// Patch is provided to give a concrete name and type to the Kubernetes PATCH request body.
message Patch {
}

// PatchOptions may be provided when patching an API object.
// PatchOptions is meant to be a superset of UpdateOptions.
message PatchOptions {
  // When present, indicates that modifications should not be
  // persisted. An invalid or unrecognized dryRun directive will
  // result in an error response and no further processing of the
  // request. Valid values are:
  // - All: all dry run stages will be processed
  // +optional
  repeated string dryRun = 1;

  // Force is going to "force" Apply requests. It means user will
  // re-acquire conflicting fields owned by other people. Force
  // flag must be unset for non-apply patch requests.
  // +optional
  optional bool force = 2;

  // fieldManager is a name associated with the actor or entity
  // that is making these changes. The value must be less than or
  // 128 characters long, and only contain printable characters,
  // as defined by https://golang.org/pkg/unicode/#IsPrint. This
  // field is required for apply requests
  // (application/apply-patch) but optional for non-apply patch
  // types (JsonPatch, MergePatch, StrategicMergePatch).
  // +optional
  optional string fieldManager = 3;
}

// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
message Preconditions {
  // Specifies the target UID.
  // +optional
  optional string uid = 1;

  // Specifies the target ResourceVersion
  // +optional
  optional string resourceVersion = 2;
}

// RootPaths lists the paths available at root.
// For example: "/healthz", "/apis".
message RootPaths {
  // paths are the paths available at root.
  repeated string paths = 1;
}

// ServerAddressByClientCIDR helps the client to determine the server address that they should use, depending on the clientCIDR that they match.
message ServerAddressByClientCIDR {
  // The CIDR with which clients can match their IP to figure out the server address that they should use.
  optional string clientCIDR = 1;

  // Address of this server, suitable for a client that matches the above CIDR.
  // This can be a hostname, hostname:port, IP or IP:port.
  optional string serverAddress = 2;
}

// Status is a return value for calls that don't return other objects.
message Status {
  // Standard list metadata.
  // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
  // +optional
  optional ListMeta metadata = 1;

  // Status of the operation.
  // One of: "Success" or "Failure".
  // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
  // +optional
  optional string status = 2;

  // A human-readable description of the status of this operation.
  // +optional
  optional string message = 3;

  // A machine-readable description of why this operation is in the
  // "Failure" status. If this value is empty there
  // is no information available. A Reason clarifies an HTTP status
  // code but does not override it.
  // +optional
  optional string reason = 4;

  // 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
  optional StatusDetails details = 5;

  // Suggested HTTP return code for this status, 0 if not set.
  // +optional
  optional int32 code = 6;
}

// StatusCause provides more information about an api.Status failure, including
// cases when multiple errors are encountered.
message StatusCause {
  // A machine-readable description of the cause of the error. If this value is
  // empty there is no information available.
  // +optional
  optional string reason = 1;

  // A human-readable description of the cause of the error.  This field may be
  // presented as-is to a reader.
  // +optional
  optional string message = 2;

  // 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:
  //   "name" - the field "name" on the current resource
  //   "items[0].name" - the field "name" on the first array entry in "items"
  // +optional
  optional string field = 3;
}

// StatusDetails is a set of additional properties that MAY be set by the
// 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.
message StatusDetails {
  // The name attribute of the resource associated with the status StatusReason
  // (when there is a single name which can be described).
  // +optional
  optional string name = 1;

  // The group attribute of the resource associated with the status StatusReason.
  // +optional
  optional string group = 2;

  // 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
  optional string kind = 3;

  // 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
  optional string uid = 6;

  // The Causes array includes more details associated with the StatusReason
  // failure. Not all StatusReasons may provide detailed causes.
  // +optional
  repeated StatusCause causes = 4;

  // 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
  optional int32 retryAfterSeconds = 5;
}

// Time is a wrapper around time.Time which supports correct
// marshaling to YAML and JSON.  Wrappers are provided for many
// of the factory methods that the time package offers.
//
// +protobuf.options.marshal=false
// +protobuf.as=Timestamp
// +protobuf.options.(gogoproto.goproto_stringer)=false
message Time {
  // Represents seconds of UTC time since Unix epoch
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
  // 9999-12-31T23:59:59Z inclusive.
  optional int64 seconds = 1;

  // Non-negative fractions of a second at nanosecond resolution. Negative
  // second values with fractions must still have non-negative nanos values
  // that count forward in time. Must be from 0 to 999,999,999
  // inclusive. This field may be limited in precision depending on context.
  optional int32 nanos = 2;
}

// Timestamp is a struct that is equivalent to Time, but intended for
// protobuf marshalling/unmarshalling. It is generated into a serialization
// that matches Time. Do not use in Go structs.
message Timestamp {
  // Represents seconds of UTC time since Unix epoch
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
  // 9999-12-31T23:59:59Z inclusive.
  optional int64 seconds = 1;

  // Non-negative fractions of a second at nanosecond resolution. Negative
  // second values with fractions must still have non-negative nanos values
  // that count forward in time. Must be from 0 to 999,999,999
  // inclusive. This field may be limited in precision depending on context.
  optional int32 nanos = 2;
}

// TypeMeta describes an individual object in an API response or request
// with strings representing the type of the object and its API schema version.
// Structures that are versioned or persisted should inline TypeMeta.
//
// +k8s:deepcopy-gen=false
message TypeMeta {
  // Kind is a string value representing the REST resource this object represents.
  // Servers may infer this from the endpoint the client submits requests to.
  // Cannot be updated.
  // In CamelCase.
  // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
  // +optional
  optional string kind = 1;

  // APIVersion defines the versioned schema of this representation of an object.
  // Servers should convert recognized schemas to the latest internal value, and
  // may reject unrecognized values.
  // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
  // +optional
  optional string apiVersion = 2;
}

// UpdateOptions may be provided when updating an API object.
// All fields in UpdateOptions should also be present in PatchOptions.
message UpdateOptions {
  // When present, indicates that modifications should not be
  // persisted. An invalid or unrecognized dryRun directive will
  // result in an error response and no further processing of the
  // request. Valid values are:
  // - All: all dry run stages will be processed
  // +optional
  repeated string dryRun = 1;

  // fieldManager is a name associated with the actor or entity
  // that is making these changes. The value must be less than or
  // 128 characters long, and only contain printable characters,
  // as defined by https://golang.org/pkg/unicode/#IsPrint.
  // +optional
  optional string fieldManager = 2;
}

// Verbs masks the value so protobuf can generate
//
// +protobuf.nullable=true
// +protobuf.options.(gogoproto.goproto_stringer)=false
message Verbs {
  // items, if empty, will result in an empty slice

  repeated string items = 1;
}

// Event represents a single event to a watched resource.
//
// +protobuf=true
// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
message WatchEvent {
  optional string type = 1;

  // Object is:
  //  * If Type is Added or Modified: the new state of the object.
  //  * If Type is Deleted: the state of the object immediately before deletion.
  //  * If Type is Error: *Status is recommended; other types may make sense
  //    depending on context.
  optional k8s.io.apimachinery.pkg.runtime.RawExtension object = 2;
}

