mirror of https://github.com/k3s-io/k3s
198 lines
6.4 KiB
Go
198 lines
6.4 KiB
Go
/*
|
|
Copyright 2019 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.
|
|
*/
|
|
|
|
package schema
|
|
|
|
import (
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
// +k8s:deepcopy-gen=true
|
|
|
|
// Structural represents a structural schema.
|
|
type Structural struct {
|
|
Items *Structural
|
|
Properties map[string]Structural
|
|
|
|
Generic
|
|
Extensions
|
|
|
|
ValueValidation *ValueValidation
|
|
}
|
|
|
|
// +k8s:deepcopy-gen=true
|
|
|
|
// StructuralOrBool is either a structural schema or a boolean.
|
|
type StructuralOrBool struct {
|
|
Structural *Structural
|
|
Bool bool
|
|
}
|
|
|
|
// +k8s:deepcopy-gen=true
|
|
|
|
// Generic contains the generic schema fields not allowed in value validation.
|
|
type Generic struct {
|
|
Description string
|
|
// type specifies the type of a value.
|
|
// It can be object, array, number, integer, boolean, string.
|
|
// It is optional only if x-kubernetes-preserve-unknown-fields
|
|
// or x-kubernetes-int-or-string is true.
|
|
Type string
|
|
Title string
|
|
Default JSON
|
|
AdditionalProperties *StructuralOrBool
|
|
Nullable bool
|
|
}
|
|
|
|
// +k8s:deepcopy-gen=true
|
|
|
|
// Extensions contains the Kubernetes OpenAPI v3 vendor extensions.
|
|
type Extensions struct {
|
|
// x-kubernetes-preserve-unknown-fields stops the API server
|
|
// decoding step from pruning fields which are not specified
|
|
// in the validation schema. This affects fields recursively,
|
|
// but switches back to normal pruning behaviour if nested
|
|
// properties or additionalProperties are specified in the schema.
|
|
// False means that the pruning behaviour is inherited from the parent.
|
|
// False does not mean to activate pruning.
|
|
XPreserveUnknownFields bool
|
|
|
|
// x-kubernetes-embedded-resource defines that the value is an
|
|
// embedded Kubernetes runtime.Object, with TypeMeta and
|
|
// ObjectMeta. The type must be object. It is allowed to further
|
|
// restrict the embedded object. Both ObjectMeta and TypeMeta
|
|
// are validated automatically. x-kubernetes-preserve-unknown-fields
|
|
// must be true.
|
|
XEmbeddedResource bool
|
|
|
|
// x-kubernetes-int-or-string specifies that this value is
|
|
// either an integer or a string. If this is true, an empty
|
|
// type is allowed and type as child of anyOf is permitted
|
|
// if following one of the following patterns:
|
|
//
|
|
// 1) anyOf:
|
|
// - type: integer
|
|
// - type: string
|
|
// 2) allOf:
|
|
// - anyOf:
|
|
// - type: integer
|
|
// - type: string
|
|
// - ... zero or more
|
|
XIntOrString bool
|
|
|
|
// x-kubernetes-list-map-keys annotates lists with the x-kubernetes-list-type `map` by specifying the keys used
|
|
// as the index of the map.
|
|
//
|
|
// This tag MUST only be used on lists that have the "x-kubernetes-list-type"
|
|
// extension set to "map". Also, the values specified for this attribute must
|
|
// be a scalar typed field of the child structure (no nesting is supported).
|
|
XListMapKeys []string
|
|
|
|
// x-kubernetes-list-type annotates a list to further describe its topology.
|
|
// This extension must only be used on lists and may have 3 possible values:
|
|
//
|
|
// 1) `atomic`: the list is treated as a single entity, like a scalar.
|
|
// Atomic lists will be entirely replaced when updated. This extension
|
|
// may be used on any type of list (struct, scalar, ...).
|
|
// 2) `set`:
|
|
// Sets are lists that must not have multiple items with the same value. Each
|
|
// value must be a scalar (or another atomic type).
|
|
// 3) `map`:
|
|
// These lists are like maps in that their elements have a non-index key
|
|
// used to identify them. Order is preserved upon merge. The map tag
|
|
// must only be used on a list with elements of type object.
|
|
XListType *string
|
|
|
|
// x-kubernetes-map-type annotates an object to further describe its topology.
|
|
// This extension must only be used when type is object and may have 2 possible values:
|
|
//
|
|
// 1) `granular`:
|
|
// These maps are actual maps (key-value pairs) and each fields are independent
|
|
// from each other (they can each be manipulated by separate actors). This is
|
|
// the default behaviour for all maps.
|
|
// 2) `atomic`: the list is treated as a single entity, like a scalar.
|
|
// Atomic maps will be entirely replaced when updated.
|
|
// +optional
|
|
XMapType *string
|
|
}
|
|
|
|
// +k8s:deepcopy-gen=true
|
|
|
|
// ValueValidation contains all schema fields not contributing to the structure of the schema.
|
|
type ValueValidation struct {
|
|
Format string
|
|
Maximum *float64
|
|
ExclusiveMaximum bool
|
|
Minimum *float64
|
|
ExclusiveMinimum bool
|
|
MaxLength *int64
|
|
MinLength *int64
|
|
Pattern string
|
|
MaxItems *int64
|
|
MinItems *int64
|
|
UniqueItems bool
|
|
MultipleOf *float64
|
|
Enum []JSON
|
|
MaxProperties *int64
|
|
MinProperties *int64
|
|
Required []string
|
|
AllOf []NestedValueValidation
|
|
OneOf []NestedValueValidation
|
|
AnyOf []NestedValueValidation
|
|
Not *NestedValueValidation
|
|
}
|
|
|
|
// +k8s:deepcopy-gen=true
|
|
|
|
// NestedValueValidation contains value validations, items and properties usable when nested
|
|
// under a logical junctor, and catch all structs for generic and vendor extensions schema fields.
|
|
type NestedValueValidation struct {
|
|
ValueValidation
|
|
|
|
Items *NestedValueValidation
|
|
Properties map[string]NestedValueValidation
|
|
|
|
// Anything set in the following will make the scheme
|
|
// non-structural, with the exception of these two patterns if
|
|
// x-kubernetes-int-or-string is true:
|
|
//
|
|
// 1) anyOf:
|
|
// - type: integer
|
|
// - type: string
|
|
// 2) allOf:
|
|
// - anyOf:
|
|
// - type: integer
|
|
// - type: string
|
|
// - ... zero or more
|
|
ForbiddenGenerics Generic
|
|
ForbiddenExtensions Extensions
|
|
}
|
|
|
|
// JSON wraps an arbitrary JSON value to be able to implement deepcopy.
|
|
type JSON struct {
|
|
Object interface{}
|
|
}
|
|
|
|
// DeepCopy creates a deep copy of the wrapped JSON value.
|
|
func (j JSON) DeepCopy() JSON {
|
|
return JSON{runtime.DeepCopyJSONValue(j.Object)}
|
|
}
|
|
|
|
// DeepCopyInto creates a deep copy of the wrapped JSON value and stores it in into.
|
|
func (j JSON) DeepCopyInto(into *JSON) {
|
|
into.Object = runtime.DeepCopyJSONValue(j.Object)
|
|
}
|