// Code generated by cue get go. DO NOT EDIT.

//cue:generate cue get go k8s.io/apimachinery/pkg/apis/meta/v1

// Package v1 contains API types that are common to all versions.
//
// The package contains two categories of types:
// - external (serialized) types that lack their own version (e.g TypeMeta)
// - internal (never-serialized) types that are needed by several different
//   api groups, and so live here, to avoid duplication and/or import loops
//   (e.g. LabelSelector).
// In the future, we will probably move these categories of objects into
// separate packages.
package v1

import (
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/types"
)

// 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
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/sig-architecture/api-conventions.md#types-kinds
	// +optional
	kind?: string @go(Kind) @protobuf(1,bytes,opt)

	// 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/sig-architecture/api-conventions.md#resources
	// +optional
	apiVersion?: string @go(APIVersion) @protobuf(2,bytes,opt)
}

// ListMeta describes metadata that synthetic resources must have, including lists and
// various status objects. A resource may have only one of {ObjectMeta, ListMeta}.
ListMeta :: {
	// selfLink is a URL representing this object.
	// Populated by the system.
	// Read-only.
	//
	// DEPRECATED
	// Kubernetes will stop propagating this field in 1.20 release and the field is planned
	// to be removed in 1.21 release.
	// +optional
	selfLink?: string @go(SelfLink) @protobuf(1,bytes,opt)

	// 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/sig-architecture/api-conventions.md#concurrency-control-and-consistency
	// +optional
	resourceVersion?: string @go(ResourceVersion) @protobuf(2,bytes,opt)

	// 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.
	continue?: string @go(Continue) @protobuf(3,bytes,opt)

	// remainingItemCount is the number of subsequent items in the list which are not included in this
	// list response. If the list request contained label or field selectors, then the number of
	// remaining items is unknown and the field will be left unset and omitted during serialization.
	// If the list is complete (either because it is not chunking or because this is the last chunk),
	// then there are no more remaining items and this field will be left unset and omitted during
	// serialization.
	// Servers older than v1.15 do not set this field.
	// The intended use of the remainingItemCount is *estimating* the size of a collection. Clients
	// should not rely on the remainingItemCount to be set or to be exact.
	// +optional
	remainingItemCount?: null | int64 @go(RemainingItemCount,*int64) @protobuf(4,bytes,opt)
}

FinalizerOrphanDependents :: "orphan"
FinalizerDeleteDependents :: "foregroundDeletion"

// ObjectMeta is metadata that all persisted resources must have, which includes all objects
// users must create.
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
	name?: string @go(Name) @protobuf(1,bytes,opt)

	// 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/sig-architecture/api-conventions.md#idempotency
	// +optional
	generateName?: string @go(GenerateName) @protobuf(2,bytes,opt)

	// 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
	namespace?: string @go(Namespace) @protobuf(3,bytes,opt)

	// SelfLink is a URL representing this object.
	// Populated by the system.
	// Read-only.
	//
	// DEPRECATED
	// Kubernetes will stop propagating this field in 1.20 release and the field is planned
	// to be removed in 1.21 release.
	// +optional
	selfLink?: string @go(SelfLink) @protobuf(4,bytes,opt)

	// 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
	uid?: types.UID @go(UID) @protobuf(5,bytes,opt,casttype=k8s.io/kubernetes/pkg/types.UID)

	// 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/sig-architecture/api-conventions.md#concurrency-control-and-consistency
	// +optional
	resourceVersion?: string @go(ResourceVersion) @protobuf(6,bytes,opt)

	// A sequence number representing a specific generation of the desired state.
	// Populated by the system. Read-only.
	// +optional
	generation?: int64 @go(Generation) @protobuf(7,varint,opt)

	// 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/sig-architecture/api-conventions.md#metadata
	// +optional
	creationTimestamp?: Time @go(CreationTimestamp) @protobuf(8,bytes,opt)

	// 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/sig-architecture/api-conventions.md#metadata
	// +optional
	deletionTimestamp?: null | Time @go(DeletionTimestamp,*Time) @protobuf(9,bytes,opt)

	// 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
	deletionGracePeriodSeconds?: null | int64 @go(DeletionGracePeriodSeconds,*int64) @protobuf(10,varint,opt)

	// 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
	labels?: {<_>: string} @go(Labels,map[string]string) @protobuf(11,bytes,rep)

	// 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
	annotations?: {<_>: string} @go(Annotations,map[string]string) @protobuf(12,bytes,rep)

	// 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
	ownerReferences?: [...OwnerReference] @go(OwnerReferences,[]OwnerReference) @protobuf(13,bytes,rep)

	// 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.
	// Finalizers may be processed and removed in any order.  Order is NOT enforced
	// because it introduces significant risk of stuck finalizers.
	// finalizers is a shared field, any actor with permission can reorder it.
	// If the finalizer list is processed in order, then this can lead to a situation
	// in which the component responsible for the first finalizer in the list is
	// waiting for a signal (field value, external system, or other) produced by a
	// component responsible for a finalizer later in the list, resulting in a deadlock.
	// Without enforced ordering finalizers are free to order amongst themselves and
	// are not vulnerable to ordering changes in the list.
	// +optional
	// +patchStrategy=merge
	finalizers?: [...string] @go(Finalizers,[]string) @protobuf(14,bytes,rep)

	// 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
	clusterName?: string @go(ClusterName) @protobuf(15,bytes,opt)

	// 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.
	//
	// +optional
	managedFields?: [...ManagedFieldsEntry] @go(ManagedFields,[]ManagedFieldsEntry) @protobuf(17,bytes,rep)
}

// NamespaceDefault means the object is in the default namespace which is applied when not specified by clients
NamespaceDefault :: "default"

// NamespaceAll is the default argument to specify on a context when you want to list or filter resources across all namespaces
NamespaceAll :: ""

// NamespaceNone is the argument for a context when there is no namespace.
NamespaceNone :: ""

// NamespaceSystem is the system namespace where we place system components.
NamespaceSystem :: "kube-system"

// NamespacePublic is the namespace where we place public info (ConfigMaps)
NamespacePublic :: "kube-public"

// 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.
OwnerReference :: {
	// API version of the referent.
	apiVersion: string @go(APIVersion) @protobuf(5,bytes,opt)

	// Kind of the referent.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
	kind: string @go(Kind) @protobuf(1,bytes,opt)

	// Name of the referent.
	// More info: http://kubernetes.io/docs/user-guide/identifiers#names
	name: string @go(Name) @protobuf(3,bytes,opt)

	// UID of the referent.
	// More info: http://kubernetes.io/docs/user-guide/identifiers#uids
	uid: types.UID @go(UID) @protobuf(4,bytes,opt,casttype=k8s.io/apimachinery/pkg/types.UID)

	// If true, this reference points to the managing controller.
	// +optional
	controller?: null | bool @go(Controller,*bool) @protobuf(6,varint,opt)

	// 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
	blockOwnerDeletion?: null | bool @go(BlockOwnerDeletion,*bool) @protobuf(7,varint,opt)
}

// ListOptions is the query options to a standard REST list call.
ListOptions :: {
	TypeMeta

	// A selector to restrict the list of returned objects by their labels.
	// Defaults to everything.
	// +optional
	labelSelector?: string @go(LabelSelector) @protobuf(1,bytes,opt)

	// A selector to restrict the list of returned objects by their fields.
	// Defaults to everything.
	// +optional
	fieldSelector?: string @go(FieldSelector) @protobuf(2,bytes,opt)

	// Watch for changes to the described resources and return them as a stream of
	// add, update, and remove notifications. Specify resourceVersion.
	// +optional
	watch?: bool @go(Watch) @protobuf(3,varint,opt)

	// allowWatchBookmarks requests watch events with type "BOOKMARK".
	// Servers that do not implement bookmarks may ignore this flag and
	// bookmarks are sent at the server's discretion. Clients should not
	// assume bookmarks are returned at any specific interval, nor may they
	// assume the server will send any BOOKMARK event during a session.
	// If this is not a watch, this field is ignored.
	// If the feature gate WatchBookmarks is not enabled in apiserver,
	// this field is ignored.
	//
	// This field is beta.
	//
	// +optional
	allowWatchBookmarks?: bool @go(AllowWatchBookmarks) @protobuf(9,varint,opt)

	// 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
	resourceVersion?: string @go(ResourceVersion) @protobuf(4,bytes,opt)

	// Timeout for the list/watch call.
	// This limits the duration of the call, regardless of any activity or inactivity.
	// +optional
	timeoutSeconds?: null | int64 @go(TimeoutSeconds,*int64) @protobuf(5,varint,opt)

	// 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.
	limit?: int64 @go(Limit) @protobuf(7,varint,opt)

	// 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.
	continue?: string @go(Continue) @protobuf(8,bytes,opt)
}

// ExportOptions is the query options to the standard REST get call.
// Deprecated. Planned for removal in 1.18.
ExportOptions :: {
	TypeMeta

	// Should this value be exported.  Export strips fields that a user can not specify.
	// Deprecated. Planned for removal in 1.18.
	export: bool @go(Export) @protobuf(1,varint,opt)

	// Should the export be exact.  Exact export maintains cluster-specific fields like 'Namespace'.
	// Deprecated. Planned for removal in 1.18.
	exact: bool @go(Exact) @protobuf(2,varint,opt)
}

// GetOptions is the standard query options to the standard REST get call.
GetOptions :: {
	TypeMeta

	// 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.
	resourceVersion?: string @go(ResourceVersion) @protobuf(1,bytes,opt)
}

// DeletionPropagation decides if a deletion will propagate to the dependents of
// the object, and how the garbage collector will handle the propagation.
DeletionPropagation :: string // enumDeletionPropagation

enumDeletionPropagation ::
	DeletePropagationOrphan |
	DeletePropagationBackground |
	DeletePropagationForeground

// Orphans the dependents.
DeletePropagationOrphan :: DeletionPropagation & "Orphan"

// Deletes the object from the key-value store, the garbage collector will
// delete the dependents in the background.
DeletePropagationBackground :: DeletionPropagation & "Background"

// The object exists in the key-value store until the garbage collector
// deletes all the dependents whose ownerReference.blockOwnerDeletion=true
// from the key-value store.  API sever will put the "foregroundDeletion"
// finalizer on the object, and sets its deletionTimestamp.  This policy is
// cascading, i.e., the dependents will be deleted with Foreground.
DeletePropagationForeground :: DeletionPropagation & "Foreground"

// DryRunAll means to complete all processing stages, but don't
// persist changes to storage.
DryRunAll :: "All"

// DeleteOptions may be provided when deleting an API object.
DeleteOptions :: {
	TypeMeta

	// 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
	gracePeriodSeconds?: null | int64 @go(GracePeriodSeconds,*int64) @protobuf(1,varint,opt)

	// Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be
	// returned.
	// +optional
	preconditions?: null | Preconditions @go(Preconditions,*Preconditions) @protobuf(2,bytes,opt)

	// 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
	orphanDependents?: null | bool @go(OrphanDependents,*bool) @protobuf(3,varint,opt)

	// 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
	propagationPolicy?: null | DeletionPropagation @go(PropagationPolicy,*DeletionPropagation) @protobuf(4,varint,opt)

	// 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
	dryRun?: [...string] @go(DryRun,[]string) @protobuf(5,bytes,rep)
}

// CreateOptions may be provided when creating an API object.
CreateOptions :: {
	TypeMeta

	// 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
	dryRun?: [...string] @go(DryRun,[]string) @protobuf(1,bytes,rep)

	// 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
	fieldManager?: string @go(FieldManager) @protobuf(3,bytes)
}

// PatchOptions may be provided when patching an API object.
// PatchOptions is meant to be a superset of UpdateOptions.
PatchOptions :: {
	TypeMeta

	// 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
	dryRun?: [...string] @go(DryRun,[]string) @protobuf(1,bytes,rep)

	// 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
	force?: null | bool @go(Force,*bool) @protobuf(2,varint,opt)

	// 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
	fieldManager?: string @go(FieldManager) @protobuf(3,bytes)
}

// UpdateOptions may be provided when updating an API object.
// All fields in UpdateOptions should also be present in PatchOptions.
UpdateOptions :: {
	TypeMeta

	// 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
	dryRun?: [...string] @go(DryRun,[]string) @protobuf(1,bytes,rep)

	// 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
	fieldManager?: string @go(FieldManager) @protobuf(2,bytes)
}

// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
Preconditions :: {
	// Specifies the target UID.
	// +optional
	uid?: null | types.UID @go(UID,*types.UID) @protobuf(1,bytes,opt,casttype=k8s.io/apimachinery/pkg/types.UID)

	// Specifies the target ResourceVersion
	// +optional
	resourceVersion?: null | string @go(ResourceVersion,*string) @protobuf(2,bytes,opt)
}

// Status is a return value for calls that don't return other objects.
Status :: {
	TypeMeta

	// Standard list metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
	// +optional
	metadata?: ListMeta @go(ListMeta) @protobuf(1,bytes,opt)

	// Status of the operation.
	// One of: "Success" or "Failure".
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
	// +optional
	status?: string @go(Status) @protobuf(2,bytes,opt)

	// A human-readable description of the status of this operation.
	// +optional
	message?: string @go(Message) @protobuf(3,bytes,opt)

	// 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
	reason?: StatusReason @go(Reason) @protobuf(4,bytes,opt,casttype=StatusReason)

	// 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
	details?: null | StatusDetails @go(Details,*StatusDetails) @protobuf(5,bytes,opt)

	// Suggested HTTP return code for this status, 0 if not set.
	// +optional
	code?: int32 @go(Code) @protobuf(6,varint,opt)
}

// 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.
StatusDetails :: {
	// The name attribute of the resource associated with the status StatusReason
	// (when there is a single name which can be described).
	// +optional
	name?: string @go(Name) @protobuf(1,bytes,opt)

	// The group attribute of the resource associated with the status StatusReason.
	// +optional
	group?: string @go(Group) @protobuf(2,bytes,opt)

	// 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/sig-architecture/api-conventions.md#types-kinds
	// +optional
	kind?: string @go(Kind) @protobuf(3,bytes,opt)

	// 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
	uid?: types.UID @go(UID) @protobuf(6,bytes,opt,casttype=k8s.io/apimachinery/pkg/types.UID)

	// The Causes array includes more details associated with the StatusReason
	// failure. Not all StatusReasons may provide detailed causes.
	// +optional
	causes?: [...StatusCause] @go(Causes,[]StatusCause) @protobuf(4,bytes,rep)

	// 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
	retryAfterSeconds?: int32 @go(RetryAfterSeconds) @protobuf(5,varint,opt)
}

StatusSuccess :: "Success"
StatusFailure :: "Failure"

// StatusReason is an enumeration of possible failure causes.  Each StatusReason
// must map to a single HTTP status code, but multiple reasons may map
// to the same HTTP status code.
// TODO: move to apiserver
StatusReason :: string // enumStatusReason

enumStatusReason ::
	StatusReasonUnknown |
	StatusReasonUnauthorized |
	StatusReasonForbidden |
	StatusReasonNotFound |
	StatusReasonAlreadyExists |
	StatusReasonConflict |
	StatusReasonGone |
	StatusReasonInvalid |
	StatusReasonServerTimeout |
	StatusReasonTimeout |
	StatusReasonTooManyRequests |
	StatusReasonBadRequest |
	StatusReasonMethodNotAllowed |
	StatusReasonNotAcceptable |
	StatusReasonRequestEntityTooLarge |
	StatusReasonUnsupportedMediaType |
	StatusReasonInternalError |
	StatusReasonExpired |
	StatusReasonServiceUnavailable

// StatusReasonUnknown means the server has declined to indicate a specific reason.
// The details field may contain other information about this error.
// Status code 500.
StatusReasonUnknown :: StatusReason & ""

// StatusReasonUnauthorized means the server can be reached and understood the request, but requires
// the user to present appropriate authorization credentials (identified by the WWW-Authenticate header)
// in order for the action to be completed. If the user has specified credentials on the request, the
// server considers them insufficient.
// Status code 401
StatusReasonUnauthorized :: StatusReason & "Unauthorized"

// StatusReasonForbidden means the server can be reached and understood the request, but refuses
// to take any further action.  It is the result of the server being configured to deny access for some reason
// to the requested resource by the client.
// Details (optional):
//   "kind" string - the kind attribute of the forbidden resource
//                   on some operations may differ from the requested
//                   resource.
//   "id"   string - the identifier of the forbidden resource
// Status code 403
StatusReasonForbidden :: StatusReason & "Forbidden"

// StatusReasonNotFound means one or more resources required for this operation
// could not be found.
// Details (optional):
//   "kind" string - the kind attribute of the missing resource
//                   on some operations may differ from the requested
//                   resource.
//   "id"   string - the identifier of the missing resource
// Status code 404
StatusReasonNotFound :: StatusReason & "NotFound"

// StatusReasonAlreadyExists means the resource you are creating already exists.
// Details (optional):
//   "kind" string - the kind attribute of the conflicting resource
//   "id"   string - the identifier of the conflicting resource
// Status code 409
StatusReasonAlreadyExists :: StatusReason & "AlreadyExists"

// StatusReasonConflict means the requested operation cannot be completed
// due to a conflict in the operation. The client may need to alter the
// request. Each resource may define custom details that indicate the
// nature of the conflict.
// Status code 409
StatusReasonConflict :: StatusReason & "Conflict"

// StatusReasonGone means the item is no longer available at the server and no
// forwarding address is known.
// Status code 410
StatusReasonGone :: StatusReason & "Gone"

// StatusReasonInvalid means the requested create or update operation cannot be
// completed due to invalid data provided as part of the request. The client may
// need to alter the request. When set, the client may use the StatusDetails
// message field as a summary of the issues encountered.
// Details (optional):
//   "kind" string - the kind attribute of the invalid resource
//   "id"   string - the identifier of the invalid resource
//   "causes"      - one or more StatusCause entries indicating the data in the
//                   provided resource that was invalid.  The code, message, and
//                   field attributes will be set.
// Status code 422
StatusReasonInvalid :: StatusReason & "Invalid"

// StatusReasonServerTimeout means the server can be reached and understood the request,
// but cannot complete the action in a reasonable time. The client should retry the request.
// This is may be due to temporary server load or a transient communication issue with
// another server. Status code 500 is used because the HTTP spec provides no suitable
// server-requested client retry and the 5xx class represents actionable errors.
// Details (optional):
//   "kind" string - the kind attribute of the resource being acted on.
//   "id"   string - the operation that is being attempted.
//   "retryAfterSeconds" int32 - the number of seconds before the operation should be retried
// Status code 500
StatusReasonServerTimeout :: StatusReason & "ServerTimeout"

// StatusReasonTimeout means that the request could not be completed within the given time.
// Clients can get this response only when they specified a timeout param in the request,
// or if the server cannot complete the operation within a reasonable amount of time.
// The request might succeed with an increased value of timeout param. The client *should*
// wait at least the number of seconds specified by the retryAfterSeconds field.
// Details (optional):
//   "retryAfterSeconds" int32 - the number of seconds before the operation should be retried
// Status code 504
StatusReasonTimeout :: StatusReason & "Timeout"

// StatusReasonTooManyRequests means the server experienced too many requests within a
// given window and that the client must wait to perform the action again. A client may
// always retry the request that led to this error, although the client should wait at least
// the number of seconds specified by the retryAfterSeconds field.
// Details (optional):
//   "retryAfterSeconds" int32 - the number of seconds before the operation should be retried
// Status code 429
StatusReasonTooManyRequests :: StatusReason & "TooManyRequests"

// StatusReasonBadRequest means that the request itself was invalid, because the request
// doesn't make any sense, for example deleting a read-only object.  This is different than
// StatusReasonInvalid above which indicates that the API call could possibly succeed, but the
// data was invalid.  API calls that return BadRequest can never succeed.
// Status code 400
StatusReasonBadRequest :: StatusReason & "BadRequest"

// StatusReasonMethodNotAllowed means that the action the client attempted to perform on the
// resource was not supported by the code - for instance, attempting to delete a resource that
// can only be created. API calls that return MethodNotAllowed can never succeed.
// Status code 405
StatusReasonMethodNotAllowed :: StatusReason & "MethodNotAllowed"

// StatusReasonNotAcceptable means that the accept types indicated by the client were not acceptable
// to the server - for instance, attempting to receive protobuf for a resource that supports only json and yaml.
// API calls that return NotAcceptable can never succeed.
// Status code 406
StatusReasonNotAcceptable :: StatusReason & "NotAcceptable"

// StatusReasonRequestEntityTooLarge means that the request entity is too large.
// Status code 413
StatusReasonRequestEntityTooLarge :: StatusReason & "RequestEntityTooLarge"

// StatusReasonUnsupportedMediaType means that the content type sent by the client is not acceptable
// to the server - for instance, attempting to send protobuf for a resource that supports only json and yaml.
// API calls that return UnsupportedMediaType can never succeed.
// Status code 415
StatusReasonUnsupportedMediaType :: StatusReason & "UnsupportedMediaType"

// StatusReasonInternalError indicates that an internal error occurred, it is unexpected
// and the outcome of the call is unknown.
// Details (optional):
//   "causes" - The original error
// Status code 500
StatusReasonInternalError :: StatusReason & "InternalError"

// StatusReasonExpired indicates that the request is invalid because the content you are requesting
// has expired and is no longer available. It is typically associated with watches that can't be
// serviced.
// Status code 410 (gone)
StatusReasonExpired :: StatusReason & "Expired"

// StatusReasonServiceUnavailable means that the request itself was valid,
// but the requested service is unavailable at this time.
// Retrying the request after some time might succeed.
// Status code 503
StatusReasonServiceUnavailable :: StatusReason & "ServiceUnavailable"

// StatusCause provides more information about an api.Status failure, including
// cases when multiple errors are encountered.
StatusCause :: {
	// A machine-readable description of the cause of the error. If this value is
	// empty there is no information available.
	// +optional
	reason?: CauseType @go(Type) @protobuf(1,bytes,opt,casttype=CauseType)

	// A human-readable description of the cause of the error.  This field may be
	// presented as-is to a reader.
	// +optional
	message?: string @go(Message) @protobuf(2,bytes,opt)

	// 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
	field?: string @go(Field) @protobuf(3,bytes,opt)
}

// CauseType is a machine readable value providing more detail about what
// occurred in a status response. An operation may have multiple causes for a
// status (whether Failure or Success).
CauseType :: string // enumCauseType

enumCauseType ::
	CauseTypeFieldValueNotFound |
	CauseTypeFieldValueRequired |
	CauseTypeFieldValueDuplicate |
	CauseTypeFieldValueInvalid |
	CauseTypeFieldValueNotSupported |
	CauseTypeUnexpectedServerResponse |
	CauseTypeFieldManagerConflict

// CauseTypeFieldValueNotFound is used to report failure to find a requested value
// (e.g. looking up an ID).
CauseTypeFieldValueNotFound :: CauseType & "FieldValueNotFound"

// CauseTypeFieldValueRequired is used to report required values that are not
// provided (e.g. empty strings, null values, or empty arrays).
CauseTypeFieldValueRequired :: CauseType & "FieldValueRequired"

// CauseTypeFieldValueDuplicate is used to report collisions of values that must be
// unique (e.g. unique IDs).
CauseTypeFieldValueDuplicate :: CauseType & "FieldValueDuplicate"

// CauseTypeFieldValueInvalid is used to report malformed values (e.g. failed regex
// match).
CauseTypeFieldValueInvalid :: CauseType & "FieldValueInvalid"

// CauseTypeFieldValueNotSupported is used to report valid (as per formatting rules)
// values that can not be handled (e.g. an enumerated string).
CauseTypeFieldValueNotSupported :: CauseType & "FieldValueNotSupported"

// CauseTypeUnexpectedServerResponse is used to report when the server responded to the client
// without the expected return type. The presence of this cause indicates the error may be
// due to an intervening proxy or the server software malfunctioning.
CauseTypeUnexpectedServerResponse :: CauseType & "UnexpectedServerResponse"

// FieldManagerConflict is used to report when another client claims to manage this field,
// It should only be returned for a request using server-side apply.
CauseTypeFieldManagerConflict :: CauseType & "FieldManagerConflict"

// List holds a list of objects, which may not be known by the server.
List :: {
	TypeMeta

	// Standard list metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
	// +optional
	metadata?: ListMeta @go(ListMeta) @protobuf(1,bytes,opt)

	// List of objects
	items: [...runtime.RawExtension] @go(Items,[]runtime.RawExtension) @protobuf(2,bytes,rep)
}

// 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
APIVersions :: {
	TypeMeta

	// versions are the api versions that are available.
	versions: [...string] @go(Versions,[]string) @protobuf(1,bytes,rep)

	// 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.
	serverAddressByClientCIDRs: [...ServerAddressByClientCIDR] @go(ServerAddressByClientCIDRs,[]ServerAddressByClientCIDR) @protobuf(2,bytes,rep)
}

// APIGroupList is a list of APIGroup, to allow clients to discover the API at
// /apis.
APIGroupList :: {
	TypeMeta

	// groups is a list of APIGroup.
	groups: [...APIGroup] @go(Groups,[]APIGroup) @protobuf(1,bytes,rep)
}

// APIGroup contains the name, the supported versions, and the preferred version
// of a group.
APIGroup :: {
	TypeMeta

	// name is the name of the group.
	name: string @go(Name) @protobuf(1,bytes,opt)

	// versions are the versions supported in this group.
	versions: [...GroupVersionForDiscovery] @go(Versions,[]GroupVersionForDiscovery) @protobuf(2,bytes,rep)

	// preferredVersion is the version preferred by the API server, which
	// probably is the storage version.
	// +optional
	preferredVersion?: GroupVersionForDiscovery @go(PreferredVersion) @protobuf(3,bytes,opt)

	// 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
	serverAddressByClientCIDRs?: [...ServerAddressByClientCIDR] @go(ServerAddressByClientCIDRs,[]ServerAddressByClientCIDR) @protobuf(4,bytes,rep)
}

// ServerAddressByClientCIDR helps the client to determine the server address that they should use, depending on the clientCIDR that they match.
ServerAddressByClientCIDR :: {
	// The CIDR with which clients can match their IP to figure out the server address that they should use.
	clientCIDR: string @go(ClientCIDR) @protobuf(1,bytes,opt)

	// Address of this server, suitable for a client that matches the above CIDR.
	// This can be a hostname, hostname:port, IP or IP:port.
	serverAddress: string @go(ServerAddress) @protobuf(2,bytes,opt)
}

// GroupVersion contains the "group/version" and "version" string of a version.
// It is made a struct to keep extensibility.
GroupVersionForDiscovery :: {
	// groupVersion specifies the API group and version in the form "group/version"
	groupVersion: string @go(GroupVersion) @protobuf(1,bytes,opt)

	// version specifies the version in the form of "version". This is to save
	// the clients the trouble of splitting the GroupVersion.
	version: string @go(Version) @protobuf(2,bytes,opt)
}

// APIResource specifies the name of a resource and whether it is namespaced.
APIResource :: {
	// name is the plural name of the resource.
	name: string @go(Name) @protobuf(1,bytes,opt)

	// 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.
	singularName: string @go(SingularName) @protobuf(6,bytes,opt)

	// namespaced indicates if a resource is namespaced or not.
	namespaced: bool @go(Namespaced) @protobuf(2,varint,opt)

	// 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".
	group?: string @go(Group) @protobuf(8,bytes,opt)

	// 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)".
	version?: string @go(Version) @protobuf(9,bytes,opt)

	// kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')
	kind: string @go(Kind) @protobuf(3,bytes,opt)

	// verbs is a list of supported kube verbs (this includes get, list, watch, create,
	// update, patch, delete, deletecollection, and proxy)
	verbs: Verbs @go(Verbs) @protobuf(4,bytes,opt)

	// shortNames is a list of suggested short names of the resource.
	shortNames?: [...string] @go(ShortNames,[]string) @protobuf(5,bytes,rep)

	// categories is a list of the grouped resources this resource belongs to (e.g. 'all')
	categories?: [...string] @go(Categories,[]string) @protobuf(7,bytes,rep)

	// 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
	storageVersionHash?: string @go(StorageVersionHash) @protobuf(10,bytes,opt)
}

// Verbs masks the value so protobuf can generate
//
// +protobuf.nullable=true
// +protobuf.options.(gogoproto.goproto_stringer)=false
Verbs :: [...string]

// 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.
APIResourceList :: {
	TypeMeta

	// groupVersion is the group and version this APIResourceList is for.
	groupVersion: string @go(GroupVersion) @protobuf(1,bytes,opt)

	// resources contains the name of the resources and if they are namespaced.
	resources: [...APIResource] @go(APIResources,[]APIResource) @protobuf(2,bytes,rep)
}

// RootPaths lists the paths available at root.
// For example: "/healthz", "/apis".
RootPaths :: {
	// paths are the paths available at root.
	paths: [...string] @go(Paths,[]string) @protobuf(1,bytes,rep)
}

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

// 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.
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
	matchLabels?: {<_>: string} @go(MatchLabels,map[string]string) @protobuf(1,bytes,rep)

	// matchExpressions is a list of label selector requirements. The requirements are ANDed.
	// +optional
	matchExpressions?: [...LabelSelectorRequirement] @go(MatchExpressions,[]LabelSelectorRequirement) @protobuf(2,bytes,rep)
}

// A label selector requirement is a selector that contains values, a key, and an operator that
// relates the key and values.
LabelSelectorRequirement :: {
	// key is the label key that the selector applies to.
	// +patchMergeKey=key
	// +patchStrategy=merge
	key: string @go(Key) @protobuf(1,bytes,opt)

	// operator represents a key's relationship to a set of values.
	// Valid operators are In, NotIn, Exists and DoesNotExist.
	operator: LabelSelectorOperator @go(Operator) @protobuf(2,bytes,opt,casttype=LabelSelectorOperator)

	// 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
	values?: [...string] @go(Values,[]string) @protobuf(3,bytes,rep)
}

// A label selector operator is the set of operators that can be used in a selector requirement.
LabelSelectorOperator :: string // enumLabelSelectorOperator

enumLabelSelectorOperator ::
	LabelSelectorOpIn |
	LabelSelectorOpNotIn |
	LabelSelectorOpExists |
	LabelSelectorOpDoesNotExist

LabelSelectorOpIn ::           LabelSelectorOperator & "In"
LabelSelectorOpNotIn ::        LabelSelectorOperator & "NotIn"
LabelSelectorOpExists ::       LabelSelectorOperator & "Exists"
LabelSelectorOpDoesNotExist :: LabelSelectorOperator & "DoesNotExist"

// ManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource
// that the fieldset applies to.
ManagedFieldsEntry :: {
	// Manager is an identifier of the workflow managing these fields.
	manager?: string @go(Manager) @protobuf(1,bytes,opt)

	// Operation is the type of operation which lead to this ManagedFieldsEntry being created.
	// The only valid values for this field are 'Apply' and 'Update'.
	operation?: ManagedFieldsOperationType @go(Operation) @protobuf(2,bytes,opt,casttype=ManagedFieldsOperationType)

	// 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.
	apiVersion?: string @go(APIVersion) @protobuf(3,bytes,opt)

	// Time is timestamp of when these fields were set. It should always be empty if Operation is 'Apply'
	// +optional
	time?: null | Time @go(Time,*Time) @protobuf(4,bytes,opt)

	// FieldsType is the discriminator for the different fields format and version.
	// There is currently only one possible value: "FieldsV1"
	fieldsType?: string @go(FieldsType) @protobuf(6,bytes,opt)

	// FieldsV1 holds the first JSON version format as described in the "FieldsV1" type.
	// +optional
	fieldsV1?: null | FieldsV1 @go(FieldsV1,*FieldsV1) @protobuf(7,bytes,opt)
}

// ManagedFieldsOperationType is the type of operation which lead to a ManagedFieldsEntry being created.
ManagedFieldsOperationType :: string // enumManagedFieldsOperationType

enumManagedFieldsOperationType ::
	ManagedFieldsOperationApply |
	ManagedFieldsOperationUpdate

ManagedFieldsOperationApply ::  ManagedFieldsOperationType & "Apply"
ManagedFieldsOperationUpdate :: ManagedFieldsOperationType & "Update"

// FieldsV1 stores a set of fields in a data structure like a Trie, in JSON format.
//
// 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 sigs.k8s.io/structured-merge-diff
FieldsV1 :: _

// Table is a tabular representation of a set of API resources. The server transforms the
// object into a set of preferred columns for quickly reviewing the objects.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +protobuf=false
Table :: {
	TypeMeta

	// Standard list metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
	// +optional
	metadata?: ListMeta @go(ListMeta)

	// columnDefinitions describes each column in the returned items array. The number of cells per row
	// will always match the number of column definitions.
	columnDefinitions: [...TableColumnDefinition] @go(ColumnDefinitions,[]TableColumnDefinition)

	// rows is the list of items in the table.
	rows: [...TableRow] @go(Rows,[]TableRow)
}

// TableColumnDefinition contains information about a column returned in the Table.
// +protobuf=false
TableColumnDefinition :: {
	// name is a human readable name for the column.
	name: string @go(Name)

	// type is an OpenAPI type definition for this column, such as number, integer, string, or
	// array.
	// See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.
	type: string @go(Type)

	// format is an optional OpenAPI type modifier for this column. A format modifies the type and
	// imposes additional rules, like date or time formatting for a string. The 'name' format is applied
	// to the primary identifier column which has type 'string' to assist in clients identifying column
	// is the resource name.
	// See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.
	format: string @go(Format)

	// description is a human readable description of this column.
	description: string @go(Description)

	// priority is an integer defining the relative importance of this column compared to others. Lower
	// numbers are considered higher priority. Columns that may be omitted in limited space scenarios
	// should be given a higher priority.
	priority: int32 @go(Priority)
}

// TableRow is an individual row in a table.
// +protobuf=false
TableRow :: {
	// cells will be as wide as the column definitions array and may contain strings, numbers (float64 or
	// int64), booleans, simple maps, lists, or null. See the type field of the column definition for a
	// more detailed description.
	cells: [...] @go(Cells,[]interface{})

	// conditions describe additional status of a row that are relevant for a human user. These conditions
	// apply to the row, not to the object, and will be specific to table output. The only defined
	// condition type is 'Completed', for a row that indicates a resource that has run to completion and
	// can be given less visual priority.
	// +optional
	conditions?: [...TableRowCondition] @go(Conditions,[]TableRowCondition)

	// This field contains the requested additional information about each object based on the includeObject
	// policy when requesting the Table. If "None", this field is empty, if "Object" this will be the
	// default serialization of the object for the current API version, and if "Metadata" (the default) will
	// contain the object metadata. Check the returned kind and apiVersion of the object before parsing.
	// The media type of the object will always match the enclosing list - if this as a JSON table, these
	// will be JSON encoded objects.
	// +optional
	object?: runtime.RawExtension @go(Object)
}

// TableRowCondition allows a row to be marked with additional information.
// +protobuf=false
TableRowCondition :: {
	// Type of row condition. The only defined value is 'Completed' indicating that the
	// object this row represents has reached a completed state and may be given less visual
	// priority than other rows. Clients are not required to honor any conditions but should
	// be consistent where possible about handling the conditions.
	type: RowConditionType @go(Type)

	// Status of the condition, one of True, False, Unknown.
	status: ConditionStatus @go(Status)

	// (brief) machine readable reason for the condition's last transition.
	// +optional
	reason?: string @go(Reason)

	// Human readable message indicating details about last transition.
	// +optional
	message?: string @go(Message)
}

RowConditionType :: string // enumRowConditionType

enumRowConditionType ::
	RowCompleted

// RowCompleted means the underlying resource has reached completion and may be given less
// visual priority than other resources.
RowCompleted :: RowConditionType & "Completed"

ConditionStatus :: string // enumConditionStatus

enumConditionStatus ::
	ConditionTrue |
	ConditionFalse |
	ConditionUnknown

ConditionTrue ::    ConditionStatus & "True"
ConditionFalse ::   ConditionStatus & "False"
ConditionUnknown :: ConditionStatus & "Unknown"

// IncludeObjectPolicy controls which portion of the object is returned with a Table.
IncludeObjectPolicy :: string // enumIncludeObjectPolicy

enumIncludeObjectPolicy ::
	IncludeNone |
	IncludeMetadata |
	IncludeObject

// IncludeNone returns no object.
IncludeNone :: IncludeObjectPolicy & "None"

// IncludeMetadata serializes the object containing only its metadata field.
IncludeMetadata :: IncludeObjectPolicy & "Metadata"

// IncludeObject contains the full object.
IncludeObject :: IncludeObjectPolicy & "Object"

// TableOptions are used when a Table is requested by the caller.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
TableOptions :: {
	TypeMeta

	// includeObject decides whether to include each object along with its columnar information.
	// Specifying "None" will return no object, specifying "Object" will return the full object contents, and
	// specifying "Metadata" (the default) will return the object's metadata in the PartialObjectMetadata kind
	// in version v1beta1 of the meta.k8s.io API group.
	includeObject?: IncludeObjectPolicy @go(IncludeObject) @protobuf(1,bytes,opt,casttype=IncludeObjectPolicy)
}

// PartialObjectMetadata is a generic representation of any object with ObjectMeta. It allows clients
// to get access to a particular ObjectMeta schema without knowing the details of the version.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
PartialObjectMetadata :: {
	TypeMeta

	// Standard object's metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
	// +optional
	metadata?: ObjectMeta @go(ObjectMeta) @protobuf(1,bytes,opt)
}

// PartialObjectMetadataList contains a list of objects containing only their metadata
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
PartialObjectMetadataList :: {
	TypeMeta

	// Standard list metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
	// +optional
	metadata?: ListMeta @go(ListMeta) @protobuf(1,bytes,opt)

	// items contains each of the included items.
	items: [...PartialObjectMetadata] @go(Items,[]PartialObjectMetadata) @protobuf(2,bytes,rep)
}
