Update apiextensions-apiserver dependency manually (temporally)
This commit is contained in:
parent
44fd79d061
commit
c795447101
105 changed files with 7546 additions and 155 deletions
3
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD
generated
vendored
3
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD
generated
vendored
|
@ -20,7 +20,6 @@ go_library(
|
||||||
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions",
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions",
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -29,8 +28,8 @@ go_library(
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = ["helpers_test.go"],
|
srcs = ["helpers_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions",
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions",
|
||||||
library = ":go_default_library",
|
|
||||||
deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"],
|
deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/doc.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/doc.go
generated
vendored
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// +k8s:deepcopy-gen=package,register
|
// +k8s:deepcopy-gen=package
|
||||||
|
|
||||||
// Package apiextensions is the internal version of the API.
|
// Package apiextensions is the internal version of the API.
|
||||||
// +groupName=apiextensions.k8s.io
|
// +groupName=apiextensions.k8s.io
|
||||||
|
|
30
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD
generated
vendored
Normal file
30
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["fuzzer.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/google/gofuzz:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
111
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/fuzzer.go
generated
vendored
Normal file
111
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/fuzzer.go
generated
vendored
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 fuzzer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/google/gofuzz"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Funcs returns the fuzzer functions for the apiextensions apis.
|
||||||
|
func Funcs(codecs runtimeserializer.CodecFactory) []interface{} {
|
||||||
|
return []interface{}{
|
||||||
|
func(obj *apiextensions.CustomResourceDefinitionSpec, c fuzz.Continue) {
|
||||||
|
c.FuzzNoCustom(obj)
|
||||||
|
|
||||||
|
// match our defaulter
|
||||||
|
if len(obj.Scope) == 0 {
|
||||||
|
obj.Scope = apiextensions.NamespaceScoped
|
||||||
|
}
|
||||||
|
if len(obj.Names.Singular) == 0 {
|
||||||
|
obj.Names.Singular = strings.ToLower(obj.Names.Kind)
|
||||||
|
}
|
||||||
|
if len(obj.Names.ListKind) == 0 && len(obj.Names.Kind) > 0 {
|
||||||
|
obj.Names.ListKind = obj.Names.Kind + "List"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
func(obj *apiextensions.JSONSchemaProps, c fuzz.Continue) {
|
||||||
|
// we cannot use c.FuzzNoCustom because of the interface{} fields. So let's loop with reflection.
|
||||||
|
vobj := reflect.ValueOf(obj).Elem()
|
||||||
|
tobj := reflect.TypeOf(obj).Elem()
|
||||||
|
for i := 0; i < tobj.NumField(); i++ {
|
||||||
|
field := tobj.Field(i)
|
||||||
|
switch field.Name {
|
||||||
|
case "Default", "Enum", "Example", "Ref":
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
isValue := true
|
||||||
|
switch field.Type.Kind() {
|
||||||
|
case reflect.Interface, reflect.Map, reflect.Slice, reflect.Ptr:
|
||||||
|
isValue = false
|
||||||
|
}
|
||||||
|
if isValue || c.Intn(10) == 0 {
|
||||||
|
c.Fuzz(vobj.Field(i).Addr().Interface())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if c.RandBool() {
|
||||||
|
validJSON := apiextensions.JSON(`{"some": {"json": "test"}, "string": 42}`)
|
||||||
|
obj.Default = &validJSON
|
||||||
|
}
|
||||||
|
if c.RandBool() {
|
||||||
|
obj.Enum = []apiextensions.JSON{c.Float64(), c.RandString(), c.RandBool()}
|
||||||
|
}
|
||||||
|
if c.RandBool() {
|
||||||
|
validJSON := apiextensions.JSON(`"foobarbaz"`)
|
||||||
|
obj.Example = &validJSON
|
||||||
|
}
|
||||||
|
if c.RandBool() {
|
||||||
|
validRef := "validRef"
|
||||||
|
obj.Ref = &validRef
|
||||||
|
}
|
||||||
|
},
|
||||||
|
func(obj *apiextensions.JSONSchemaPropsOrBool, c fuzz.Continue) {
|
||||||
|
if c.RandBool() {
|
||||||
|
obj.Schema = &apiextensions.JSONSchemaProps{}
|
||||||
|
c.Fuzz(obj.Schema)
|
||||||
|
} else {
|
||||||
|
obj.Allows = c.RandBool()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
func(obj *apiextensions.JSONSchemaPropsOrArray, c fuzz.Continue) {
|
||||||
|
// disallow both Schema and JSONSchemas to be nil.
|
||||||
|
if c.RandBool() {
|
||||||
|
obj.Schema = &apiextensions.JSONSchemaProps{}
|
||||||
|
c.Fuzz(obj.Schema)
|
||||||
|
} else {
|
||||||
|
obj.JSONSchemas = make([]apiextensions.JSONSchemaProps, c.Intn(3)+1)
|
||||||
|
for i := range obj.JSONSchemas {
|
||||||
|
c.Fuzz(&obj.JSONSchemas[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
func(obj *apiextensions.JSONSchemaPropsOrStringArray, c fuzz.Continue) {
|
||||||
|
if c.RandBool() {
|
||||||
|
obj.Schema = &apiextensions.JSONSchemaProps{}
|
||||||
|
c.Fuzz(obj.Schema)
|
||||||
|
} else {
|
||||||
|
c.Fuzz(&obj.Property)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
45
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD
generated
vendored
Normal file
45
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["roundtrip_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["install.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
43
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/install.go
generated
vendored
Normal file
43
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/install.go
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 install
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
"k8s.io/apimachinery/pkg/apimachinery/announced"
|
||||||
|
"k8s.io/apimachinery/pkg/apimachinery/registered"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Install registers the API group and adds types to a scheme
|
||||||
|
func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) {
|
||||||
|
if err := announced.NewGroupMetaFactory(
|
||||||
|
&announced.GroupMetaFactoryArgs{
|
||||||
|
GroupName: apiextensions.GroupName,
|
||||||
|
RootScopedKinds: sets.NewString("CustomResourceDefinition"),
|
||||||
|
VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version},
|
||||||
|
AddInternalObjectsToScheme: apiextensions.AddToScheme,
|
||||||
|
},
|
||||||
|
announced.VersionToSchemeFunc{
|
||||||
|
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
|
||||||
|
},
|
||||||
|
).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
28
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/roundtrip_test.go
generated
vendored
Normal file
28
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/roundtrip_test.go
generated
vendored
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 install
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
apiextensionsfuzzer "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer"
|
||||||
|
"k8s.io/apimachinery/pkg/api/testing/roundtrip"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRoundTrip(t *testing.T) {
|
||||||
|
roundtrip.RoundTripTestForAPIGroup(t, Install, apiextensionsfuzzer.Funcs)
|
||||||
|
}
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/register.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/register.go
generated
vendored
|
@ -41,7 +41,7 @@ var (
|
||||||
AddToScheme = SchemeBuilder.AddToScheme
|
AddToScheme = SchemeBuilder.AddToScheme
|
||||||
)
|
)
|
||||||
|
|
||||||
// Adds the list of known types to api.Scheme.
|
// Adds the list of known types to the given scheme.
|
||||||
func addKnownTypes(scheme *runtime.Scheme) error {
|
func addKnownTypes(scheme *runtime.Scheme) error {
|
||||||
scheme.AddKnownTypes(SchemeGroupVersion,
|
scheme.AddKnownTypes(SchemeGroupVersion,
|
||||||
&CustomResourceDefinition{},
|
&CustomResourceDefinition{},
|
||||||
|
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD
generated
vendored
|
@ -60,8 +60,8 @@ go_test(
|
||||||
"conversion_test.go",
|
"conversion_test.go",
|
||||||
"marshal_test.go",
|
"marshal_test.go",
|
||||||
],
|
],
|
||||||
|
embed = [":go_default_library"],
|
||||||
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1",
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1",
|
||||||
library = ":go_default_library",
|
|
||||||
deps = [
|
deps = [
|
||||||
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/doc.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/doc.go
generated
vendored
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// +k8s:deepcopy-gen=package,register
|
// +k8s:deepcopy-gen=package
|
||||||
// +k8s:conversion-gen=k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
|
// +k8s:conversion-gen=k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
|
||||||
// +k8s:defaulter-gen=TypeMeta
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
|
|
||||||
|
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go
generated
vendored
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
3
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto
generated
vendored
3
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto
generated
vendored
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -105,7 +105,6 @@ message CustomResourceDefinitionSpec {
|
||||||
optional string scope = 4;
|
optional string scope = 4;
|
||||||
|
|
||||||
// Validation describes the validation methods for CustomResources
|
// Validation describes the validation methods for CustomResources
|
||||||
// This field is alpha-level and should only be sent to servers that enable the CustomResourceValidation feature.
|
|
||||||
// +optional
|
// +optional
|
||||||
optional CustomResourceValidation validation = 5;
|
optional CustomResourceValidation validation = 5;
|
||||||
}
|
}
|
||||||
|
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/register.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/register.go
generated
vendored
|
@ -43,7 +43,7 @@ var (
|
||||||
AddToScheme = localSchemeBuilder.AddToScheme
|
AddToScheme = localSchemeBuilder.AddToScheme
|
||||||
)
|
)
|
||||||
|
|
||||||
// Adds the list of known types to api.Scheme.
|
// Adds the list of known types to the given scheme.
|
||||||
func addKnownTypes(scheme *runtime.Scheme) error {
|
func addKnownTypes(scheme *runtime.Scheme) error {
|
||||||
scheme.AddKnownTypes(SchemeGroupVersion,
|
scheme.AddKnownTypes(SchemeGroupVersion,
|
||||||
&CustomResourceDefinition{},
|
&CustomResourceDefinition{},
|
||||||
|
|
1
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go
generated
vendored
1
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go
generated
vendored
|
@ -29,7 +29,6 @@ type CustomResourceDefinitionSpec struct {
|
||||||
// Scope indicates whether this resource is cluster or namespace scoped. Default is namespaced
|
// Scope indicates whether this resource is cluster or namespace scoped. Default is namespaced
|
||||||
Scope ResourceScope `json:"scope" protobuf:"bytes,4,opt,name=scope,casttype=ResourceScope"`
|
Scope ResourceScope `json:"scope" protobuf:"bytes,4,opt,name=scope,casttype=ResourceScope"`
|
||||||
// Validation describes the validation methods for CustomResources
|
// Validation describes the validation methods for CustomResources
|
||||||
// This field is alpha-level and should only be sent to servers that enable the CustomResourceValidation feature.
|
|
||||||
// +optional
|
// +optional
|
||||||
Validation *CustomResourceValidation `json:"validation,omitempty" protobuf:"bytes,5,opt,name=validation"`
|
Validation *CustomResourceValidation `json:"validation,omitempty" protobuf:"bytes,5,opt,name=validation"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// +build !ignore_autogenerated
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -21,10 +21,11 @@ limitations under the License.
|
||||||
package v1beta1
|
package v1beta1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
unsafe "unsafe"
|
||||||
|
|
||||||
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
unsafe "unsafe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// +build !ignore_autogenerated
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -21,76 +21,9 @@ limitations under the License.
|
||||||
package v1beta1
|
package v1beta1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
reflect "reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
SchemeBuilder.Register(RegisterDeepCopies)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterDeepCopies adds deep-copy functions to the given scheme. Public
|
|
||||||
// to allow building arbitrary schemes.
|
|
||||||
//
|
|
||||||
// Deprecated: deepcopy registration will go away when static deepcopy is fully implemented.
|
|
||||||
func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
|
||||||
return scheme.AddGeneratedDeepCopyFuncs(
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinition).DeepCopyInto(out.(*CustomResourceDefinition))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinition{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionCondition).DeepCopyInto(out.(*CustomResourceDefinitionCondition))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionCondition{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionList).DeepCopyInto(out.(*CustomResourceDefinitionList))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionList{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionNames).DeepCopyInto(out.(*CustomResourceDefinitionNames))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionNames{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionSpec).DeepCopyInto(out.(*CustomResourceDefinitionSpec))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionSpec{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionStatus).DeepCopyInto(out.(*CustomResourceDefinitionStatus))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionStatus{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceValidation).DeepCopyInto(out.(*CustomResourceValidation))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceValidation{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*ExternalDocumentation).DeepCopyInto(out.(*ExternalDocumentation))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&ExternalDocumentation{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSON).DeepCopyInto(out.(*JSON))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSON{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaProps).DeepCopyInto(out.(*JSONSchemaProps))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaProps{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaPropsOrArray).DeepCopyInto(out.(*JSONSchemaPropsOrArray))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaPropsOrArray{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaPropsOrBool).DeepCopyInto(out.(*JSONSchemaPropsOrBool))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaPropsOrBool{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaPropsOrStringArray).DeepCopyInto(out.(*JSONSchemaPropsOrStringArray))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaPropsOrStringArray{})},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) {
|
func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) {
|
||||||
*out = *in
|
*out = *in
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// +build !ignore_autogenerated
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
47
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD
generated
vendored
Normal file
47
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["validation.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/go-openapi/spec:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["validation_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
330
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go
generated
vendored
Normal file
330
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go
generated
vendored
Normal file
|
@ -0,0 +1,330 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 validation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
|
||||||
|
genericvalidation "k8s.io/apimachinery/pkg/api/validation"
|
||||||
|
validationutil "k8s.io/apimachinery/pkg/util/validation"
|
||||||
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinition statically validates
|
||||||
|
func ValidateCustomResourceDefinition(obj *apiextensions.CustomResourceDefinition) field.ErrorList {
|
||||||
|
nameValidationFn := func(name string, prefix bool) []string {
|
||||||
|
ret := genericvalidation.NameIsDNSSubdomain(name, prefix)
|
||||||
|
requiredName := obj.Spec.Names.Plural + "." + obj.Spec.Group
|
||||||
|
if name != requiredName {
|
||||||
|
ret = append(ret, fmt.Sprintf(`must be spec.names.plural+"."+spec.group`))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
allErrs := genericvalidation.ValidateObjectMeta(&obj.ObjectMeta, false, nameValidationFn, field.NewPath("metadata"))
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionSpec(&obj.Spec, field.NewPath("spec"))...)
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionStatus(&obj.Status, field.NewPath("status"))...)
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionUpdate statically validates
|
||||||
|
func ValidateCustomResourceDefinitionUpdate(obj, oldObj *apiextensions.CustomResourceDefinition) field.ErrorList {
|
||||||
|
allErrs := genericvalidation.ValidateObjectMetaUpdate(&obj.ObjectMeta, &oldObj.ObjectMeta, field.NewPath("metadata"))
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionSpecUpdate(&obj.Spec, &oldObj.Spec, apiextensions.IsCRDConditionTrue(oldObj, apiextensions.Established), field.NewPath("spec"))...)
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionStatus(&obj.Status, field.NewPath("status"))...)
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateUpdateCustomResourceDefinitionStatus statically validates
|
||||||
|
func ValidateUpdateCustomResourceDefinitionStatus(obj, oldObj *apiextensions.CustomResourceDefinition) field.ErrorList {
|
||||||
|
allErrs := genericvalidation.ValidateObjectMetaUpdate(&obj.ObjectMeta, &oldObj.ObjectMeta, field.NewPath("metadata"))
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionStatus(&obj.Status, field.NewPath("status"))...)
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionSpec statically validates
|
||||||
|
func ValidateCustomResourceDefinitionSpec(spec *apiextensions.CustomResourceDefinitionSpec, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
|
if len(spec.Group) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("group"), ""))
|
||||||
|
} else if errs := validationutil.IsDNS1123Subdomain(spec.Group); len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("group"), spec.Group, strings.Join(errs, ",")))
|
||||||
|
} else if len(strings.Split(spec.Group, ".")) < 2 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("group"), spec.Group, "should be a domain with at least one dot"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(spec.Version) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("version"), ""))
|
||||||
|
} else if errs := validationutil.IsDNS1035Label(spec.Version); len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("version"), spec.Version, strings.Join(errs, ",")))
|
||||||
|
}
|
||||||
|
|
||||||
|
switch spec.Scope {
|
||||||
|
case "":
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("scope"), ""))
|
||||||
|
case apiextensions.ClusterScoped, apiextensions.NamespaceScoped:
|
||||||
|
default:
|
||||||
|
allErrs = append(allErrs, field.NotSupported(fldPath.Child("scope"), spec.Scope, []string{string(apiextensions.ClusterScoped), string(apiextensions.NamespaceScoped)}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// in addition to the basic name restrictions, some names are required for spec, but not for status
|
||||||
|
if len(spec.Names.Plural) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("names", "plural"), ""))
|
||||||
|
}
|
||||||
|
if len(spec.Names.Singular) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("names", "singular"), ""))
|
||||||
|
}
|
||||||
|
if len(spec.Names.Kind) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("names", "kind"), ""))
|
||||||
|
}
|
||||||
|
if len(spec.Names.ListKind) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("names", "listKind"), ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionNames(&spec.Names, fldPath.Child("names"))...)
|
||||||
|
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceValidation) {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionValidation(spec.Validation, fldPath.Child("validation"))...)
|
||||||
|
} else if spec.Validation != nil {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("validation"), "disabled by feature-gate"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionSpecUpdate statically validates
|
||||||
|
func ValidateCustomResourceDefinitionSpecUpdate(spec, oldSpec *apiextensions.CustomResourceDefinitionSpec, established bool, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := ValidateCustomResourceDefinitionSpec(spec, fldPath)
|
||||||
|
|
||||||
|
if established {
|
||||||
|
// these effect the storage and cannot be changed therefore
|
||||||
|
allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Version, oldSpec.Version, fldPath.Child("version"))...)
|
||||||
|
allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Scope, oldSpec.Scope, fldPath.Child("scope"))...)
|
||||||
|
allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Names.Kind, oldSpec.Names.Kind, fldPath.Child("names", "kind"))...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// these affects the resource name, which is always immutable, so this can't be updated.
|
||||||
|
allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Group, oldSpec.Group, fldPath.Child("group"))...)
|
||||||
|
allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Names.Plural, oldSpec.Names.Plural, fldPath.Child("names", "plural"))...)
|
||||||
|
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionStatus statically validates
|
||||||
|
func ValidateCustomResourceDefinitionStatus(status *apiextensions.CustomResourceDefinitionStatus, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionNames(&status.AcceptedNames, fldPath.Child("acceptedNames"))...)
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionNames statically validates
|
||||||
|
func ValidateCustomResourceDefinitionNames(names *apiextensions.CustomResourceDefinitionNames, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
if errs := validationutil.IsDNS1035Label(names.Plural); len(names.Plural) > 0 && len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("plural"), names.Plural, strings.Join(errs, ",")))
|
||||||
|
}
|
||||||
|
if errs := validationutil.IsDNS1035Label(names.Singular); len(names.Singular) > 0 && len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("singular"), names.Singular, strings.Join(errs, ",")))
|
||||||
|
}
|
||||||
|
if errs := validationutil.IsDNS1035Label(strings.ToLower(names.Kind)); len(names.Kind) > 0 && len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("kind"), names.Kind, "may have mixed case, but should otherwise match: "+strings.Join(errs, ",")))
|
||||||
|
}
|
||||||
|
if errs := validationutil.IsDNS1035Label(strings.ToLower(names.ListKind)); len(names.ListKind) > 0 && len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("listKind"), names.ListKind, "may have mixed case, but should otherwise match: "+strings.Join(errs, ",")))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, shortName := range names.ShortNames {
|
||||||
|
if errs := validationutil.IsDNS1035Label(shortName); len(errs) > 0 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("shortNames").Index(i), shortName, strings.Join(errs, ",")))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// kind and listKind may not be the same or parsing become ambiguous
|
||||||
|
if len(names.Kind) > 0 && names.Kind == names.ListKind {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("listKind"), names.ListKind, "kind and listKind may not be the same"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// specStandardValidator applies validations for different OpenAPI specfication versions.
|
||||||
|
type specStandardValidator interface {
|
||||||
|
validate(spec *apiextensions.JSONSchemaProps, fldPath *field.Path) field.ErrorList
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionValidation statically validates
|
||||||
|
func ValidateCustomResourceDefinitionValidation(customResourceValidation *apiextensions.CustomResourceValidation, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
|
if customResourceValidation == nil {
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
if customResourceValidation.OpenAPIV3Schema != nil {
|
||||||
|
openAPIV3Schema := &specStandardValidatorV3{}
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(customResourceValidation.OpenAPIV3Schema, fldPath.Child("openAPIV3Schema"), openAPIV3Schema)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateCustomResourceDefinitionOpenAPISchema statically validates
|
||||||
|
func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSchemaProps, fldPath *field.Path, ssv specStandardValidator) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
|
if schema == nil {
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
allErrs = append(allErrs, ssv.validate(schema, fldPath)...)
|
||||||
|
|
||||||
|
if schema.UniqueItems == true {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("uniqueItems"), "uniqueItems cannot be set to true since the runtime complexity becomes quadratic"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// additionalProperties contradicts Kubernetes API convention to ignore unknown fields
|
||||||
|
if schema.AdditionalProperties != nil {
|
||||||
|
if schema.AdditionalProperties.Allows == false {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("additionalProperties"), "additionalProperties cannot be set to false"))
|
||||||
|
}
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalProperties.Schema, fldPath.Child("additionalProperties"), ssv)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Ref != nil {
|
||||||
|
openapiRef, err := spec.NewRef(*schema.Ref)
|
||||||
|
if err != nil {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("ref"), *schema.Ref, err.Error()))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !openapiRef.IsValidURI() {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("ref"), *schema.Ref, "ref does not point to a valid URI"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.AdditionalItems != nil {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalItems.Schema, fldPath.Child("additionalItems"), ssv)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Not, fldPath.Child("not"), ssv)...)
|
||||||
|
|
||||||
|
if len(schema.AllOf) != 0 {
|
||||||
|
for _, jsonSchema := range schema.AllOf {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("allOf"), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.OneOf) != 0 {
|
||||||
|
for _, jsonSchema := range schema.OneOf {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("oneOf"), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.AnyOf) != 0 {
|
||||||
|
for _, jsonSchema := range schema.AnyOf {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("anyOf"), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.Properties) != 0 {
|
||||||
|
for property, jsonSchema := range schema.Properties {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("properties").Key(property), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.PatternProperties) != 0 {
|
||||||
|
for property, jsonSchema := range schema.PatternProperties {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("patternProperties").Key(property), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.Definitions) != 0 {
|
||||||
|
for definition, jsonSchema := range schema.Definitions {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("definitions").Key(definition), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Items != nil {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Items.Schema, fldPath.Child("items"), ssv)...)
|
||||||
|
if len(schema.Items.JSONSchemas) != 0 {
|
||||||
|
for _, jsonSchema := range schema.Items.JSONSchemas {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("items"), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Dependencies != nil {
|
||||||
|
for dependency, jsonSchemaPropsOrStringArray := range schema.Dependencies {
|
||||||
|
allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(jsonSchemaPropsOrStringArray.Schema, fldPath.Child("dependencies").Key(dependency), ssv)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
type specStandardValidatorV3 struct{}
|
||||||
|
|
||||||
|
// validate validates against OpenAPI Schema v3.
|
||||||
|
func (v *specStandardValidatorV3) validate(schema *apiextensions.JSONSchemaProps, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
|
if schema == nil {
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Default != nil {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("default"), "default is not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.ID != "" {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("id"), "id is not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.AdditionalItems != nil {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("additionalItems"), "additionalItems is not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.PatternProperties) != 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("patternProperties"), "patternProperties is not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(schema.Definitions) != 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("definitions"), "definitions is not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Dependencies != nil {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("dependencies"), "dependencies is not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Type == "null" {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("type"), "type cannot be set to null"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if schema.Items != nil && len(schema.Items.JSONSchemas) != 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("items"), "items must be a schema object and not an array"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return allErrs
|
||||||
|
}
|
460
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go
generated
vendored
Normal file
460
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go
generated
vendored
Normal file
|
@ -0,0 +1,460 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 validation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
|
)
|
||||||
|
|
||||||
|
type validationMatch struct {
|
||||||
|
path *field.Path
|
||||||
|
errorType field.ErrorType
|
||||||
|
}
|
||||||
|
|
||||||
|
func required(path ...string) validationMatch {
|
||||||
|
return validationMatch{path: field.NewPath(path[0], path[1:]...), errorType: field.ErrorTypeRequired}
|
||||||
|
}
|
||||||
|
func invalid(path ...string) validationMatch {
|
||||||
|
return validationMatch{path: field.NewPath(path[0], path[1:]...), errorType: field.ErrorTypeInvalid}
|
||||||
|
}
|
||||||
|
func unsupported(path ...string) validationMatch {
|
||||||
|
return validationMatch{path: field.NewPath(path[0], path[1:]...), errorType: field.ErrorTypeNotSupported}
|
||||||
|
}
|
||||||
|
func immutable(path ...string) validationMatch {
|
||||||
|
return validationMatch{path: field.NewPath(path[0], path[1:]...), errorType: field.ErrorTypeInvalid}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v validationMatch) matches(err *field.Error) bool {
|
||||||
|
return err.Type == v.errorType && err.Field == v.path.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestValidateCustomResourceDefinition(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
resource *apiextensions.CustomResourceDefinition
|
||||||
|
errors []validationMatch
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "mismatched name",
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "plural.not.group.com"},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{
|
||||||
|
invalid("metadata", "name"),
|
||||||
|
required("spec", "version"),
|
||||||
|
required("spec", "scope"),
|
||||||
|
required("spec", "names", "singular"),
|
||||||
|
required("spec", "names", "kind"),
|
||||||
|
required("spec", "names", "listKind"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing values",
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{
|
||||||
|
invalid("metadata", "name"),
|
||||||
|
required("spec", "group"),
|
||||||
|
required("spec", "version"),
|
||||||
|
required("spec", "scope"),
|
||||||
|
required("spec", "names", "plural"),
|
||||||
|
required("spec", "names", "singular"),
|
||||||
|
required("spec", "names", "kind"),
|
||||||
|
required("spec", "names", "listKind"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bad names 01",
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "plural.group"},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group",
|
||||||
|
Version: "ve()*rsion",
|
||||||
|
Scope: apiextensions.ResourceScope("foo"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "pl()*ural",
|
||||||
|
Singular: "value()*a",
|
||||||
|
Kind: "value()*a",
|
||||||
|
ListKind: "value()*a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "pl()*ural",
|
||||||
|
Singular: "value()*a",
|
||||||
|
Kind: "value()*a",
|
||||||
|
ListKind: "value()*a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{
|
||||||
|
invalid("metadata", "name"),
|
||||||
|
invalid("spec", "group"),
|
||||||
|
invalid("spec", "version"),
|
||||||
|
unsupported("spec", "scope"),
|
||||||
|
invalid("spec", "names", "plural"),
|
||||||
|
invalid("spec", "names", "singular"),
|
||||||
|
invalid("spec", "names", "kind"),
|
||||||
|
invalid("spec", "names", "listKind"), // invalid format
|
||||||
|
invalid("spec", "names", "listKind"), // kind == listKind
|
||||||
|
invalid("status", "acceptedNames", "plural"),
|
||||||
|
invalid("status", "acceptedNames", "singular"),
|
||||||
|
invalid("status", "acceptedNames", "kind"),
|
||||||
|
invalid("status", "acceptedNames", "listKind"), // invalid format
|
||||||
|
invalid("status", "acceptedNames", "listKind"), // kind == listKind
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bad names 02",
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "plural.group"},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.c(*&om",
|
||||||
|
Version: "version",
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "matching",
|
||||||
|
ListKind: "matching",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "matching",
|
||||||
|
ListKind: "matching",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{
|
||||||
|
invalid("metadata", "name"),
|
||||||
|
invalid("spec", "group"),
|
||||||
|
required("spec", "scope"),
|
||||||
|
invalid("spec", "names", "listKind"),
|
||||||
|
invalid("status", "acceptedNames", "listKind"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
errs := ValidateCustomResourceDefinition(tc.resource)
|
||||||
|
seenErrs := make([]bool, len(errs))
|
||||||
|
|
||||||
|
for _, expectedError := range tc.errors {
|
||||||
|
found := false
|
||||||
|
for i, err := range errs {
|
||||||
|
if expectedError.matches(err) && !seenErrs[i] {
|
||||||
|
found = true
|
||||||
|
seenErrs[i] = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
t.Errorf("%s: expected %v at %v, got %v", tc.name, expectedError.errorType, expectedError.path.String(), errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, seen := range seenErrs {
|
||||||
|
if !seen {
|
||||||
|
t.Errorf("%s: unexpected error: %v", tc.name, errs[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestValidateCustomResourceDefinitionUpdate(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
old *apiextensions.CustomResourceDefinition
|
||||||
|
resource *apiextensions.CustomResourceDefinition
|
||||||
|
errors []validationMatch
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "unchanged",
|
||||||
|
old: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Version: "version",
|
||||||
|
Scope: apiextensions.ResourceScope("Cluster"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Version: "version",
|
||||||
|
Scope: apiextensions.ResourceScope("Cluster"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "unchanged-established",
|
||||||
|
old: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Version: "version",
|
||||||
|
Scope: apiextensions.ResourceScope("Cluster"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
Conditions: []apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
{Type: apiextensions.Established, Status: apiextensions.ConditionTrue},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Version: "version",
|
||||||
|
Scope: apiextensions.ResourceScope("Cluster"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "changes",
|
||||||
|
old: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Version: "version",
|
||||||
|
Scope: apiextensions.ResourceScope("Cluster"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
Conditions: []apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
{Type: apiextensions.Established, Status: apiextensions.ConditionFalse},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "abc.com",
|
||||||
|
Version: "version2",
|
||||||
|
Scope: apiextensions.ResourceScope("Namespaced"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural2",
|
||||||
|
Singular: "singular2",
|
||||||
|
Kind: "kind2",
|
||||||
|
ListKind: "listkind2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural2",
|
||||||
|
Singular: "singular2",
|
||||||
|
Kind: "kind2",
|
||||||
|
ListKind: "listkind2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{
|
||||||
|
immutable("spec", "group"),
|
||||||
|
immutable("spec", "names", "plural"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "changes-established",
|
||||||
|
old: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "group.com",
|
||||||
|
Version: "version",
|
||||||
|
Scope: apiextensions.ResourceScope("Cluster"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural",
|
||||||
|
Singular: "singular",
|
||||||
|
Kind: "kind",
|
||||||
|
ListKind: "listkind",
|
||||||
|
},
|
||||||
|
Conditions: []apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
{Type: apiextensions.Established, Status: apiextensions.ConditionTrue},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resource: &apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "plural.group.com",
|
||||||
|
ResourceVersion: "42",
|
||||||
|
},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: "abc.com",
|
||||||
|
Version: "version2",
|
||||||
|
Scope: apiextensions.ResourceScope("Namespaced"),
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural2",
|
||||||
|
Singular: "singular2",
|
||||||
|
Kind: "kind2",
|
||||||
|
ListKind: "listkind2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: apiextensions.CustomResourceDefinitionStatus{
|
||||||
|
AcceptedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "plural2",
|
||||||
|
Singular: "singular2",
|
||||||
|
Kind: "kind2",
|
||||||
|
ListKind: "listkind2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: []validationMatch{
|
||||||
|
immutable("spec", "group"),
|
||||||
|
immutable("spec", "version"),
|
||||||
|
immutable("spec", "scope"),
|
||||||
|
immutable("spec", "names", "kind"),
|
||||||
|
immutable("spec", "names", "plural"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
errs := ValidateCustomResourceDefinitionUpdate(tc.resource, tc.old)
|
||||||
|
seenErrs := make([]bool, len(errs))
|
||||||
|
|
||||||
|
for _, expectedError := range tc.errors {
|
||||||
|
found := false
|
||||||
|
for i, err := range errs {
|
||||||
|
if expectedError.matches(err) && !seenErrs[i] {
|
||||||
|
found = true
|
||||||
|
seenErrs[i] = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
t.Errorf("%s: expected %v at %v, got %v", tc.name, expectedError.errorType, expectedError.path.String(), errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, seen := range seenErrs {
|
||||||
|
if !seen {
|
||||||
|
t.Errorf("%s: unexpected error: %v", tc.name, errs[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
65
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go
generated
vendored
65
vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go
generated
vendored
|
@ -1,7 +1,7 @@
|
||||||
// +build !ignore_autogenerated
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -21,72 +21,9 @@ limitations under the License.
|
||||||
package apiextensions
|
package apiextensions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
reflect "reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
SchemeBuilder.Register(RegisterDeepCopies)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterDeepCopies adds deep-copy functions to the given scheme. Public
|
|
||||||
// to allow building arbitrary schemes.
|
|
||||||
//
|
|
||||||
// Deprecated: deepcopy registration will go away when static deepcopy is fully implemented.
|
|
||||||
func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
|
||||||
return scheme.AddGeneratedDeepCopyFuncs(
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinition).DeepCopyInto(out.(*CustomResourceDefinition))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinition{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionCondition).DeepCopyInto(out.(*CustomResourceDefinitionCondition))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionCondition{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionList).DeepCopyInto(out.(*CustomResourceDefinitionList))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionList{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionNames).DeepCopyInto(out.(*CustomResourceDefinitionNames))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionNames{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionSpec).DeepCopyInto(out.(*CustomResourceDefinitionSpec))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionSpec{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceDefinitionStatus).DeepCopyInto(out.(*CustomResourceDefinitionStatus))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceDefinitionStatus{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*CustomResourceValidation).DeepCopyInto(out.(*CustomResourceValidation))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&CustomResourceValidation{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*ExternalDocumentation).DeepCopyInto(out.(*ExternalDocumentation))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&ExternalDocumentation{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaProps).DeepCopyInto(out.(*JSONSchemaProps))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaProps{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaPropsOrArray).DeepCopyInto(out.(*JSONSchemaPropsOrArray))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaPropsOrArray{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaPropsOrBool).DeepCopyInto(out.(*JSONSchemaPropsOrBool))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaPropsOrBool{})},
|
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error {
|
|
||||||
in.(*JSONSchemaPropsOrStringArray).DeepCopyInto(out.(*JSONSchemaPropsOrStringArray))
|
|
||||||
return nil
|
|
||||||
}, InType: reflect.TypeOf(&JSONSchemaPropsOrStringArray{})},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) {
|
func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) {
|
||||||
*out = *in
|
*out = *in
|
||||||
|
|
91
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD
generated
vendored
Normal file
91
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"apiserver.go",
|
||||||
|
"customresource_discovery.go",
|
||||||
|
"customresource_discovery_controller.go",
|
||||||
|
"customresource_handler.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/go-openapi/spec:go_default_library",
|
||||||
|
"//vendor/github.com/go-openapi/strfmt:go_default_library",
|
||||||
|
"//vendor/github.com/go-openapi/validate:go_default_library",
|
||||||
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/controller/status:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/version:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/endpoints/handlers:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/server:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/util/workqueue:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["customresource_handler_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver",
|
||||||
|
deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library"],
|
||||||
|
)
|
214
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go
generated
vendored
Normal file
214
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go
generated
vendored
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 apiserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/apimachinery/announced"
|
||||||
|
"k8s.io/apimachinery/pkg/apimachinery/registered"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
"k8s.io/apimachinery/pkg/version"
|
||||||
|
"k8s.io/apiserver/pkg/endpoints/discovery"
|
||||||
|
genericregistry "k8s.io/apiserver/pkg/registry/generic"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
|
genericapiserver "k8s.io/apiserver/pkg/server"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset"
|
||||||
|
internalinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/controller/finalizer"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/controller/status"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition"
|
||||||
|
|
||||||
|
// make sure the generated client works
|
||||||
|
_ "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
|
_ "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions"
|
||||||
|
_ "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
groupFactoryRegistry = make(announced.APIGroupFactoryRegistry)
|
||||||
|
registry = registered.NewOrDie("")
|
||||||
|
Scheme = runtime.NewScheme()
|
||||||
|
Codecs = serializer.NewCodecFactory(Scheme)
|
||||||
|
|
||||||
|
// if you modify this, make sure you update the crEncoder
|
||||||
|
unversionedVersion = schema.GroupVersion{Group: "", Version: "v1"}
|
||||||
|
unversionedTypes = []runtime.Object{
|
||||||
|
&metav1.Status{},
|
||||||
|
&metav1.WatchEvent{},
|
||||||
|
&metav1.APIVersions{},
|
||||||
|
&metav1.APIGroupList{},
|
||||||
|
&metav1.APIGroup{},
|
||||||
|
&metav1.APIResourceList{},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
install.Install(groupFactoryRegistry, registry, Scheme)
|
||||||
|
|
||||||
|
// we need to add the options to empty v1
|
||||||
|
metav1.AddToGroupVersion(Scheme, schema.GroupVersion{Group: "", Version: "v1"})
|
||||||
|
|
||||||
|
Scheme.AddUnversionedTypes(unversionedVersion, unversionedTypes...)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExtraConfig struct {
|
||||||
|
CRDRESTOptionsGetter genericregistry.RESTOptionsGetter
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
GenericConfig *genericapiserver.RecommendedConfig
|
||||||
|
ExtraConfig ExtraConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type completedConfig struct {
|
||||||
|
GenericConfig genericapiserver.CompletedConfig
|
||||||
|
ExtraConfig *ExtraConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type CompletedConfig struct {
|
||||||
|
// Embed a private pointer that cannot be instantiated outside of this package.
|
||||||
|
*completedConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type CustomResourceDefinitions struct {
|
||||||
|
GenericAPIServer *genericapiserver.GenericAPIServer
|
||||||
|
|
||||||
|
// provided for easier embedding
|
||||||
|
Informers internalinformers.SharedInformerFactory
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
|
||||||
|
func (cfg *Config) Complete() CompletedConfig {
|
||||||
|
c := completedConfig{
|
||||||
|
cfg.GenericConfig.Complete(),
|
||||||
|
&cfg.ExtraConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
c.GenericConfig.EnableDiscovery = false
|
||||||
|
c.GenericConfig.Version = &version.Info{
|
||||||
|
Major: "0",
|
||||||
|
Minor: "1",
|
||||||
|
}
|
||||||
|
|
||||||
|
return CompletedConfig{&c}
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new instance of CustomResourceDefinitions from the given config.
|
||||||
|
func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*CustomResourceDefinitions, error) {
|
||||||
|
genericServer, err := c.GenericConfig.New("apiextensions-apiserver", delegationTarget)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
s := &CustomResourceDefinitions{
|
||||||
|
GenericAPIServer: genericServer,
|
||||||
|
}
|
||||||
|
|
||||||
|
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiextensions.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs)
|
||||||
|
apiGroupInfo.GroupMeta.GroupVersion = v1beta1.SchemeGroupVersion
|
||||||
|
customResourceDefintionStorage := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||||
|
v1beta1storage := map[string]rest.Storage{}
|
||||||
|
v1beta1storage["customresourcedefinitions"] = customResourceDefintionStorage
|
||||||
|
v1beta1storage["customresourcedefinitions/status"] = customresourcedefinition.NewStatusREST(Scheme, customResourceDefintionStorage)
|
||||||
|
apiGroupInfo.VersionedResourcesStorageMap["v1beta1"] = v1beta1storage
|
||||||
|
|
||||||
|
if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
crdClient, err := internalclientset.NewForConfig(s.GenericAPIServer.LoopbackClientConfig)
|
||||||
|
if err != nil {
|
||||||
|
// it's really bad that this is leaking here, but until we can fix the test (which I'm pretty sure isn't even testing what it wants to test),
|
||||||
|
// we need to be able to move forward
|
||||||
|
kubeAPIVersions := os.Getenv("KUBE_API_VERSIONS")
|
||||||
|
if len(kubeAPIVersions) == 0 {
|
||||||
|
return nil, fmt.Errorf("failed to create clientset: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// KUBE_API_VERSIONS is used in test-update-storage-objects.sh, disabling a number of API
|
||||||
|
// groups. This leads to a nil client above and undefined behaviour further down.
|
||||||
|
//
|
||||||
|
// TODO: get rid of KUBE_API_VERSIONS or define sane behaviour if set
|
||||||
|
glog.Errorf("Failed to create clientset with KUBE_API_VERSIONS=%q. KUBE_API_VERSIONS is only for testing. Things will break.", kubeAPIVersions)
|
||||||
|
}
|
||||||
|
s.Informers = internalinformers.NewSharedInformerFactory(crdClient, 5*time.Minute)
|
||||||
|
|
||||||
|
delegateHandler := delegationTarget.UnprotectedHandler()
|
||||||
|
if delegateHandler == nil {
|
||||||
|
delegateHandler = http.NotFoundHandler()
|
||||||
|
}
|
||||||
|
|
||||||
|
versionDiscoveryHandler := &versionDiscoveryHandler{
|
||||||
|
discovery: map[schema.GroupVersion]*discovery.APIVersionHandler{},
|
||||||
|
delegate: delegateHandler,
|
||||||
|
}
|
||||||
|
groupDiscoveryHandler := &groupDiscoveryHandler{
|
||||||
|
discovery: map[string]*discovery.APIGroupHandler{},
|
||||||
|
delegate: delegateHandler,
|
||||||
|
}
|
||||||
|
crdHandler := NewCustomResourceDefinitionHandler(
|
||||||
|
versionDiscoveryHandler,
|
||||||
|
groupDiscoveryHandler,
|
||||||
|
s.GenericAPIServer.RequestContextMapper(),
|
||||||
|
s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions().Lister(),
|
||||||
|
s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(),
|
||||||
|
delegateHandler,
|
||||||
|
c.ExtraConfig.CRDRESTOptionsGetter,
|
||||||
|
c.GenericConfig.AdmissionControl,
|
||||||
|
)
|
||||||
|
s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", crdHandler)
|
||||||
|
s.GenericAPIServer.Handler.NonGoRestfulMux.HandlePrefix("/apis/", crdHandler)
|
||||||
|
|
||||||
|
// this only happens when KUBE_API_VERSIONS is set. We must return without adding controllers or poststarthooks which would affect healthz
|
||||||
|
if crdClient == nil {
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
crdController := NewDiscoveryController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), versionDiscoveryHandler, groupDiscoveryHandler, c.GenericConfig.RequestContextMapper)
|
||||||
|
namingController := status.NewNamingConditionController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), crdClient.Apiextensions())
|
||||||
|
finalizingController := finalizer.NewCRDFinalizer(
|
||||||
|
s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(),
|
||||||
|
crdClient.Apiextensions(),
|
||||||
|
crdHandler,
|
||||||
|
)
|
||||||
|
|
||||||
|
s.GenericAPIServer.AddPostStartHook("start-apiextensions-informers", func(context genericapiserver.PostStartHookContext) error {
|
||||||
|
s.Informers.Start(context.StopCh)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
s.GenericAPIServer.AddPostStartHook("start-apiextensions-controllers", func(context genericapiserver.PostStartHookContext) error {
|
||||||
|
go crdController.Run(context.StopCh)
|
||||||
|
go namingController.Run(context.StopCh)
|
||||||
|
go finalizingController.Run(5, context.StopCh)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
return s, nil
|
||||||
|
}
|
127
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery.go
generated
vendored
Normal file
127
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery.go
generated
vendored
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 apiserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apiserver/pkg/endpoints/discovery"
|
||||||
|
)
|
||||||
|
|
||||||
|
type versionDiscoveryHandler struct {
|
||||||
|
// TODO, writing is infrequent, optimize this
|
||||||
|
discoveryLock sync.RWMutex
|
||||||
|
discovery map[schema.GroupVersion]*discovery.APIVersionHandler
|
||||||
|
|
||||||
|
delegate http.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *versionDiscoveryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
|
pathParts := splitPath(req.URL.Path)
|
||||||
|
// only match /apis/<group>/<version>
|
||||||
|
if len(pathParts) != 3 || pathParts[0] != "apis" {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
discovery, ok := r.getDiscovery(schema.GroupVersion{Group: pathParts[1], Version: pathParts[2]})
|
||||||
|
if !ok {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
discovery.ServeHTTP(w, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *versionDiscoveryHandler) getDiscovery(gv schema.GroupVersion) (*discovery.APIVersionHandler, bool) {
|
||||||
|
r.discoveryLock.RLock()
|
||||||
|
defer r.discoveryLock.RUnlock()
|
||||||
|
|
||||||
|
ret, ok := r.discovery[gv]
|
||||||
|
return ret, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *versionDiscoveryHandler) setDiscovery(gv schema.GroupVersion, discovery *discovery.APIVersionHandler) {
|
||||||
|
r.discoveryLock.Lock()
|
||||||
|
defer r.discoveryLock.Unlock()
|
||||||
|
|
||||||
|
r.discovery[gv] = discovery
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *versionDiscoveryHandler) unsetDiscovery(gv schema.GroupVersion) {
|
||||||
|
r.discoveryLock.Lock()
|
||||||
|
defer r.discoveryLock.Unlock()
|
||||||
|
|
||||||
|
delete(r.discovery, gv)
|
||||||
|
}
|
||||||
|
|
||||||
|
type groupDiscoveryHandler struct {
|
||||||
|
// TODO, writing is infrequent, optimize this
|
||||||
|
discoveryLock sync.RWMutex
|
||||||
|
discovery map[string]*discovery.APIGroupHandler
|
||||||
|
|
||||||
|
delegate http.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *groupDiscoveryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
|
pathParts := splitPath(req.URL.Path)
|
||||||
|
// only match /apis/<group>
|
||||||
|
if len(pathParts) != 2 || pathParts[0] != "apis" {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
discovery, ok := r.getDiscovery(pathParts[1])
|
||||||
|
if !ok {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
discovery.ServeHTTP(w, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *groupDiscoveryHandler) getDiscovery(group string) (*discovery.APIGroupHandler, bool) {
|
||||||
|
r.discoveryLock.RLock()
|
||||||
|
defer r.discoveryLock.RUnlock()
|
||||||
|
|
||||||
|
ret, ok := r.discovery[group]
|
||||||
|
return ret, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *groupDiscoveryHandler) setDiscovery(group string, discovery *discovery.APIGroupHandler) {
|
||||||
|
r.discoveryLock.Lock()
|
||||||
|
defer r.discoveryLock.Unlock()
|
||||||
|
|
||||||
|
r.discovery[group] = discovery
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *groupDiscoveryHandler) unsetDiscovery(group string) {
|
||||||
|
r.discoveryLock.Lock()
|
||||||
|
defer r.discoveryLock.Unlock()
|
||||||
|
|
||||||
|
delete(r.discovery, group)
|
||||||
|
}
|
||||||
|
|
||||||
|
// splitPath returns the segments for a URL path.
|
||||||
|
func splitPath(path string) []string {
|
||||||
|
path = strings.Trim(path, "/")
|
||||||
|
if path == "" {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
return strings.Split(path, "/")
|
||||||
|
}
|
222
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go
generated
vendored
Normal file
222
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go
generated
vendored
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 apiserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
"k8s.io/apiserver/pkg/endpoints/discovery"
|
||||||
|
"k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion"
|
||||||
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DiscoveryController struct {
|
||||||
|
versionHandler *versionDiscoveryHandler
|
||||||
|
groupHandler *groupDiscoveryHandler
|
||||||
|
contextMapper request.RequestContextMapper
|
||||||
|
|
||||||
|
crdLister listers.CustomResourceDefinitionLister
|
||||||
|
crdsSynced cache.InformerSynced
|
||||||
|
|
||||||
|
// To allow injection for testing.
|
||||||
|
syncFn func(version schema.GroupVersion) error
|
||||||
|
|
||||||
|
queue workqueue.RateLimitingInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDiscoveryController(crdInformer informers.CustomResourceDefinitionInformer, versionHandler *versionDiscoveryHandler, groupHandler *groupDiscoveryHandler, contextMapper request.RequestContextMapper) *DiscoveryController {
|
||||||
|
c := &DiscoveryController{
|
||||||
|
versionHandler: versionHandler,
|
||||||
|
groupHandler: groupHandler,
|
||||||
|
crdLister: crdInformer.Lister(),
|
||||||
|
crdsSynced: crdInformer.Informer().HasSynced,
|
||||||
|
contextMapper: contextMapper,
|
||||||
|
|
||||||
|
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "DiscoveryController"),
|
||||||
|
}
|
||||||
|
|
||||||
|
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
AddFunc: c.addCustomResourceDefinition,
|
||||||
|
UpdateFunc: c.updateCustomResourceDefinition,
|
||||||
|
DeleteFunc: c.deleteCustomResourceDefinition,
|
||||||
|
})
|
||||||
|
|
||||||
|
c.syncFn = c.sync
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) sync(version schema.GroupVersion) error {
|
||||||
|
|
||||||
|
apiVersionsForDiscovery := []metav1.GroupVersionForDiscovery{}
|
||||||
|
apiResourcesForDiscovery := []metav1.APIResource{}
|
||||||
|
|
||||||
|
crds, err := c.crdLister.List(labels.Everything())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
foundVersion := false
|
||||||
|
foundGroup := false
|
||||||
|
for _, crd := range crds {
|
||||||
|
if !apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if crd.Spec.Group != version.Group {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
foundGroup = true
|
||||||
|
apiVersionsForDiscovery = append(apiVersionsForDiscovery, metav1.GroupVersionForDiscovery{
|
||||||
|
GroupVersion: crd.Spec.Group + "/" + crd.Spec.Version,
|
||||||
|
Version: crd.Spec.Version,
|
||||||
|
})
|
||||||
|
|
||||||
|
if crd.Spec.Version != version.Version {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
foundVersion = true
|
||||||
|
|
||||||
|
verbs := metav1.Verbs([]string{"delete", "deletecollection", "get", "list", "patch", "create", "update", "watch"})
|
||||||
|
// if we're terminating we don't allow some verbs
|
||||||
|
if apiextensions.IsCRDConditionTrue(crd, apiextensions.Terminating) {
|
||||||
|
verbs = metav1.Verbs([]string{"delete", "deletecollection", "get", "list", "watch"})
|
||||||
|
}
|
||||||
|
|
||||||
|
apiResourcesForDiscovery = append(apiResourcesForDiscovery, metav1.APIResource{
|
||||||
|
Name: crd.Status.AcceptedNames.Plural,
|
||||||
|
SingularName: crd.Status.AcceptedNames.Singular,
|
||||||
|
Namespaced: crd.Spec.Scope == apiextensions.NamespaceScoped,
|
||||||
|
Kind: crd.Status.AcceptedNames.Kind,
|
||||||
|
Verbs: verbs,
|
||||||
|
ShortNames: crd.Status.AcceptedNames.ShortNames,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if !foundGroup {
|
||||||
|
c.groupHandler.unsetDiscovery(version.Group)
|
||||||
|
c.versionHandler.unsetDiscovery(version)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
apiGroup := metav1.APIGroup{
|
||||||
|
Name: version.Group,
|
||||||
|
Versions: apiVersionsForDiscovery,
|
||||||
|
// the preferred versions for a group is arbitrary since there cannot be duplicate resources
|
||||||
|
PreferredVersion: apiVersionsForDiscovery[0],
|
||||||
|
}
|
||||||
|
c.groupHandler.setDiscovery(version.Group, discovery.NewAPIGroupHandler(Codecs, apiGroup, c.contextMapper))
|
||||||
|
|
||||||
|
if !foundVersion {
|
||||||
|
c.versionHandler.unsetDiscovery(version)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
c.versionHandler.setDiscovery(version, discovery.NewAPIVersionHandler(Codecs, version, discovery.APIResourceListerFunc(func() []metav1.APIResource {
|
||||||
|
return apiResourcesForDiscovery
|
||||||
|
}), c.contextMapper))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) Run(stopCh <-chan struct{}) {
|
||||||
|
defer utilruntime.HandleCrash()
|
||||||
|
defer c.queue.ShutDown()
|
||||||
|
defer glog.Infof("Shutting down DiscoveryController")
|
||||||
|
|
||||||
|
glog.Infof("Starting DiscoveryController")
|
||||||
|
|
||||||
|
if !cache.WaitForCacheSync(stopCh, c.crdsSynced) {
|
||||||
|
utilruntime.HandleError(fmt.Errorf("timed out waiting for caches to sync"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// only start one worker thread since its a slow moving API
|
||||||
|
go wait.Until(c.runWorker, time.Second, stopCh)
|
||||||
|
|
||||||
|
<-stopCh
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) runWorker() {
|
||||||
|
for c.processNextWorkItem() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// processNextWorkItem deals with one key off the queue. It returns false when it's time to quit.
|
||||||
|
func (c *DiscoveryController) processNextWorkItem() bool {
|
||||||
|
key, quit := c.queue.Get()
|
||||||
|
if quit {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer c.queue.Done(key)
|
||||||
|
|
||||||
|
err := c.syncFn(key.(schema.GroupVersion))
|
||||||
|
if err == nil {
|
||||||
|
c.queue.Forget(key)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
utilruntime.HandleError(fmt.Errorf("%v failed with: %v", key, err))
|
||||||
|
c.queue.AddRateLimited(key)
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
||||||
|
c.queue.Add(schema.GroupVersion{Group: obj.Spec.Group, Version: obj.Spec.Version})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) addCustomResourceDefinition(obj interface{}) {
|
||||||
|
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
glog.V(4).Infof("Adding customresourcedefinition %s", castObj.Name)
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) updateCustomResourceDefinition(obj, _ interface{}) {
|
||||||
|
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
glog.V(4).Infof("Updating customresourcedefinition %s", castObj.Name)
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DiscoveryController) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
|
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
if !ok {
|
||||||
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
|
if !ok {
|
||||||
|
glog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
if !ok {
|
||||||
|
glog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glog.V(4).Infof("Deleting customresourcedefinition %q", castObj.Name)
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
580
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go
generated
vendored
Normal file
580
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go
generated
vendored
Normal file
|
@ -0,0 +1,580 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 apiserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"path"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
openapispec "github.com/go-openapi/spec"
|
||||||
|
"github.com/go-openapi/strfmt"
|
||||||
|
"github.com/go-openapi/validate"
|
||||||
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer/json"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer/versioning"
|
||||||
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
"k8s.io/apiserver/pkg/endpoints/handlers"
|
||||||
|
apirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/apiserver/pkg/storage/storagebackend"
|
||||||
|
"k8s.io/client-go/discovery"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation"
|
||||||
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion"
|
||||||
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/controller/finalizer"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/registry/customresource"
|
||||||
|
)
|
||||||
|
|
||||||
|
// crdHandler serves the `/apis` endpoint.
|
||||||
|
// This is registered as a filter so that it never collides with any explicitly registered endpoints
|
||||||
|
type crdHandler struct {
|
||||||
|
versionDiscoveryHandler *versionDiscoveryHandler
|
||||||
|
groupDiscoveryHandler *groupDiscoveryHandler
|
||||||
|
|
||||||
|
customStorageLock sync.Mutex
|
||||||
|
// customStorage contains a crdStorageMap
|
||||||
|
customStorage atomic.Value
|
||||||
|
|
||||||
|
requestContextMapper apirequest.RequestContextMapper
|
||||||
|
|
||||||
|
crdLister listers.CustomResourceDefinitionLister
|
||||||
|
|
||||||
|
delegate http.Handler
|
||||||
|
restOptionsGetter generic.RESTOptionsGetter
|
||||||
|
admission admission.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
// crdInfo stores enough information to serve the storage for the custom resource
|
||||||
|
type crdInfo struct {
|
||||||
|
// spec and acceptedNames are used to compare against if a change is made on a CRD. We only update
|
||||||
|
// the storage if one of these changes.
|
||||||
|
spec *apiextensions.CustomResourceDefinitionSpec
|
||||||
|
acceptedNames *apiextensions.CustomResourceDefinitionNames
|
||||||
|
|
||||||
|
storage *customresource.REST
|
||||||
|
requestScope handlers.RequestScope
|
||||||
|
}
|
||||||
|
|
||||||
|
// crdStorageMap goes from customresourcedefinition to its storage
|
||||||
|
type crdStorageMap map[types.UID]*crdInfo
|
||||||
|
|
||||||
|
func NewCustomResourceDefinitionHandler(
|
||||||
|
versionDiscoveryHandler *versionDiscoveryHandler,
|
||||||
|
groupDiscoveryHandler *groupDiscoveryHandler,
|
||||||
|
requestContextMapper apirequest.RequestContextMapper,
|
||||||
|
crdLister listers.CustomResourceDefinitionLister,
|
||||||
|
crdInformer informers.CustomResourceDefinitionInformer,
|
||||||
|
delegate http.Handler,
|
||||||
|
restOptionsGetter generic.RESTOptionsGetter,
|
||||||
|
admission admission.Interface) *crdHandler {
|
||||||
|
ret := &crdHandler{
|
||||||
|
versionDiscoveryHandler: versionDiscoveryHandler,
|
||||||
|
groupDiscoveryHandler: groupDiscoveryHandler,
|
||||||
|
customStorage: atomic.Value{},
|
||||||
|
requestContextMapper: requestContextMapper,
|
||||||
|
crdLister: crdLister,
|
||||||
|
delegate: delegate,
|
||||||
|
restOptionsGetter: restOptionsGetter,
|
||||||
|
admission: admission,
|
||||||
|
}
|
||||||
|
|
||||||
|
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
UpdateFunc: ret.updateCustomResourceDefinition,
|
||||||
|
DeleteFunc: func(obj interface{}) {
|
||||||
|
ret.removeDeadStorage()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
ret.customStorage.Store(crdStorageMap{})
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
|
ctx, ok := r.requestContextMapper.Get(req)
|
||||||
|
if !ok {
|
||||||
|
// programmer error
|
||||||
|
panic("missing context")
|
||||||
|
}
|
||||||
|
requestInfo, ok := apirequest.RequestInfoFrom(ctx)
|
||||||
|
if !ok {
|
||||||
|
// programmer error
|
||||||
|
panic("missing requestInfo")
|
||||||
|
}
|
||||||
|
if !requestInfo.IsResourceRequest {
|
||||||
|
pathParts := splitPath(requestInfo.Path)
|
||||||
|
// only match /apis/<group>/<version>
|
||||||
|
// only registered under /apis
|
||||||
|
if len(pathParts) == 3 {
|
||||||
|
r.versionDiscoveryHandler.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// only match /apis/<group>
|
||||||
|
if len(pathParts) == 2 {
|
||||||
|
r.groupDiscoveryHandler.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
crdName := requestInfo.Resource + "." + requestInfo.APIGroup
|
||||||
|
crd, err := r.crdLister.Get(crdName)
|
||||||
|
if apierrors.IsNotFound(err) {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if crd.Spec.Version != requestInfo.APIVersion {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
|
||||||
|
r.delegate.ServeHTTP(w, req)
|
||||||
|
}
|
||||||
|
if len(requestInfo.Subresource) > 0 {
|
||||||
|
http.NotFound(w, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
terminating := apiextensions.IsCRDConditionTrue(crd, apiextensions.Terminating)
|
||||||
|
|
||||||
|
crdInfo, err := r.getServingInfoFor(crd)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
storage := crdInfo.storage
|
||||||
|
requestScope := crdInfo.requestScope
|
||||||
|
minRequestTimeout := 1 * time.Minute
|
||||||
|
|
||||||
|
switch requestInfo.Verb {
|
||||||
|
case "get":
|
||||||
|
handler := handlers.GetResource(storage, storage, requestScope)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "list":
|
||||||
|
forceWatch := false
|
||||||
|
handler := handlers.ListResource(storage, storage, requestScope, forceWatch, minRequestTimeout)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "watch":
|
||||||
|
forceWatch := true
|
||||||
|
handler := handlers.ListResource(storage, storage, requestScope, forceWatch, minRequestTimeout)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "create":
|
||||||
|
if terminating {
|
||||||
|
http.Error(w, fmt.Sprintf("%v not allowed while CustomResourceDefinition is terminating", requestInfo.Verb), http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
handler := handlers.CreateResource(storage, requestScope, discovery.NewUnstructuredObjectTyper(nil), r.admission)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "update":
|
||||||
|
if terminating {
|
||||||
|
http.Error(w, fmt.Sprintf("%v not allowed while CustomResourceDefinition is terminating", requestInfo.Verb), http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
handler := handlers.UpdateResource(storage, requestScope, discovery.NewUnstructuredObjectTyper(nil), r.admission)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "patch":
|
||||||
|
if terminating {
|
||||||
|
http.Error(w, fmt.Sprintf("%v not allowed while CustomResourceDefinition is terminating", requestInfo.Verb), http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
handler := handlers.PatchResource(storage, requestScope, r.admission, unstructured.UnstructuredObjectConverter{})
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "delete":
|
||||||
|
allowsOptions := true
|
||||||
|
handler := handlers.DeleteResource(storage, allowsOptions, requestScope, r.admission)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
case "deletecollection":
|
||||||
|
checkBody := true
|
||||||
|
handler := handlers.DeleteCollection(storage, checkBody, requestScope, r.admission)
|
||||||
|
handler(w, req)
|
||||||
|
return
|
||||||
|
|
||||||
|
default:
|
||||||
|
http.Error(w, fmt.Sprintf("unhandled verb %q", requestInfo.Verb), http.StatusMethodNotAllowed)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// removeDeadStorage removes REST storage that isn't being used
|
||||||
|
func (r *crdHandler) removeDeadStorage() {
|
||||||
|
// these don't have to be live. A snapshot is fine
|
||||||
|
// if we wrongly delete, that's ok. The rest storage will be recreated on the next request
|
||||||
|
// if we wrongly miss one, that's ok. We'll get it next time
|
||||||
|
storageMap := r.customStorage.Load().(crdStorageMap)
|
||||||
|
allCustomResourceDefinitions, err := r.crdLister.List(labels.Everything())
|
||||||
|
if err != nil {
|
||||||
|
utilruntime.HandleError(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for uid, s := range storageMap {
|
||||||
|
found := false
|
||||||
|
for _, crd := range allCustomResourceDefinitions {
|
||||||
|
if crd.UID == uid {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
glog.V(4).Infof("Removing dead CRD storage for %v", s.requestScope.Resource)
|
||||||
|
s.storage.DestroyFunc()
|
||||||
|
delete(storageMap, uid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r.customStorageLock.Lock()
|
||||||
|
defer r.customStorageLock.Unlock()
|
||||||
|
|
||||||
|
r.customStorage.Store(storageMap)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCustomResourceListerCollectionDeleter returns the ListerCollectionDeleter for
|
||||||
|
// the given uid, or nil if one does not exist.
|
||||||
|
func (r *crdHandler) GetCustomResourceListerCollectionDeleter(crd *apiextensions.CustomResourceDefinition) finalizer.ListerCollectionDeleter {
|
||||||
|
info, err := r.getServingInfoFor(crd)
|
||||||
|
if err != nil {
|
||||||
|
utilruntime.HandleError(err)
|
||||||
|
}
|
||||||
|
return info.storage
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *crdHandler) getServingInfoFor(crd *apiextensions.CustomResourceDefinition) (*crdInfo, error) {
|
||||||
|
storageMap := r.customStorage.Load().(crdStorageMap)
|
||||||
|
ret, ok := storageMap[crd.UID]
|
||||||
|
if ok {
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
r.customStorageLock.Lock()
|
||||||
|
defer r.customStorageLock.Unlock()
|
||||||
|
|
||||||
|
ret, ok = storageMap[crd.UID]
|
||||||
|
if ok {
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// In addition to Unstructured objects (Custom Resources), we also may sometimes need to
|
||||||
|
// decode unversioned Options objects, so we delegate to parameterScheme for such types.
|
||||||
|
parameterScheme := runtime.NewScheme()
|
||||||
|
parameterScheme.AddUnversionedTypes(schema.GroupVersion{Group: crd.Spec.Group, Version: crd.Spec.Version},
|
||||||
|
&metav1.ListOptions{},
|
||||||
|
&metav1.ExportOptions{},
|
||||||
|
&metav1.GetOptions{},
|
||||||
|
&metav1.DeleteOptions{},
|
||||||
|
)
|
||||||
|
parameterCodec := runtime.NewParameterCodec(parameterScheme)
|
||||||
|
|
||||||
|
kind := schema.GroupVersionKind{Group: crd.Spec.Group, Version: crd.Spec.Version, Kind: crd.Status.AcceptedNames.Kind}
|
||||||
|
typer := unstructuredObjectTyper{
|
||||||
|
delegate: parameterScheme,
|
||||||
|
unstructuredTyper: discovery.NewUnstructuredObjectTyper(nil),
|
||||||
|
}
|
||||||
|
creator := unstructuredCreator{}
|
||||||
|
|
||||||
|
// convert CRD schema to openapi schema
|
||||||
|
openapiSchema := &openapispec.Schema{}
|
||||||
|
if err := apiservervalidation.ConvertToOpenAPITypes(crd, openapiSchema); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := openapispec.ExpandSchema(openapiSchema, nil, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
validator := validate.NewSchemaValidator(openapiSchema, nil, "", strfmt.Default)
|
||||||
|
|
||||||
|
storage := customresource.NewREST(
|
||||||
|
schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Status.AcceptedNames.Plural},
|
||||||
|
schema.GroupVersionKind{Group: crd.Spec.Group, Version: crd.Spec.Version, Kind: crd.Status.AcceptedNames.ListKind},
|
||||||
|
customresource.NewStrategy(
|
||||||
|
typer,
|
||||||
|
crd.Spec.Scope == apiextensions.NamespaceScoped,
|
||||||
|
kind,
|
||||||
|
validator,
|
||||||
|
),
|
||||||
|
r.restOptionsGetter,
|
||||||
|
)
|
||||||
|
|
||||||
|
selfLinkPrefix := ""
|
||||||
|
switch crd.Spec.Scope {
|
||||||
|
case apiextensions.ClusterScoped:
|
||||||
|
selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, crd.Spec.Version) + "/"
|
||||||
|
case apiextensions.NamespaceScoped:
|
||||||
|
selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, crd.Spec.Version, "namespaces") + "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
clusterScoped := crd.Spec.Scope == apiextensions.ClusterScoped
|
||||||
|
|
||||||
|
requestScope := handlers.RequestScope{
|
||||||
|
Namer: handlers.ContextBasedNaming{
|
||||||
|
GetContext: func(req *http.Request) apirequest.Context {
|
||||||
|
ret, _ := r.requestContextMapper.Get(req)
|
||||||
|
return ret
|
||||||
|
},
|
||||||
|
SelfLinker: meta.NewAccessor(),
|
||||||
|
ClusterScoped: clusterScoped,
|
||||||
|
SelfLinkPathPrefix: selfLinkPrefix,
|
||||||
|
},
|
||||||
|
ContextFunc: func(req *http.Request) apirequest.Context {
|
||||||
|
ret, _ := r.requestContextMapper.Get(req)
|
||||||
|
return ret
|
||||||
|
},
|
||||||
|
|
||||||
|
Serializer: unstructuredNegotiatedSerializer{typer: typer, creator: creator},
|
||||||
|
ParameterCodec: parameterCodec,
|
||||||
|
|
||||||
|
Creater: creator,
|
||||||
|
Convertor: crdObjectConverter{
|
||||||
|
UnstructuredObjectConverter: unstructured.UnstructuredObjectConverter{},
|
||||||
|
clusterScoped: clusterScoped,
|
||||||
|
},
|
||||||
|
Defaulter: unstructuredDefaulter{parameterScheme},
|
||||||
|
Typer: typer,
|
||||||
|
UnsafeConvertor: unstructured.UnstructuredObjectConverter{},
|
||||||
|
|
||||||
|
Resource: schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Status.AcceptedNames.Plural},
|
||||||
|
Kind: kind,
|
||||||
|
Subresource: "",
|
||||||
|
|
||||||
|
MetaGroupVersion: metav1.SchemeGroupVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = &crdInfo{
|
||||||
|
spec: &crd.Spec,
|
||||||
|
acceptedNames: &crd.Status.AcceptedNames,
|
||||||
|
|
||||||
|
storage: storage,
|
||||||
|
requestScope: requestScope,
|
||||||
|
}
|
||||||
|
|
||||||
|
storageMap2 := make(crdStorageMap, len(storageMap))
|
||||||
|
|
||||||
|
// Copy because we cannot write to storageMap without a race
|
||||||
|
// as it is used without locking elsewhere
|
||||||
|
for k, v := range storageMap {
|
||||||
|
storageMap2[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
storageMap2[crd.UID] = ret
|
||||||
|
r.customStorage.Store(storageMap2)
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// crdObjectConverter is a converter that supports field selectors for CRDs.
|
||||||
|
type crdObjectConverter struct {
|
||||||
|
unstructured.UnstructuredObjectConverter
|
||||||
|
clusterScoped bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c crdObjectConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) {
|
||||||
|
// We currently only support metadata.namespace and metadata.name.
|
||||||
|
switch {
|
||||||
|
case label == "metadata.name":
|
||||||
|
return label, value, nil
|
||||||
|
case !c.clusterScoped && label == "metadata.namespace":
|
||||||
|
return label, value, nil
|
||||||
|
default:
|
||||||
|
return "", "", fmt.Errorf("field label not supported: %s", label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
||||||
|
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
newCRD := newObj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
|
||||||
|
c.customStorageLock.Lock()
|
||||||
|
defer c.customStorageLock.Unlock()
|
||||||
|
storageMap := c.customStorage.Load().(crdStorageMap)
|
||||||
|
|
||||||
|
oldInfo, found := storageMap[newCRD.UID]
|
||||||
|
if !found {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if apiequality.Semantic.DeepEqual(&newCRD.Spec, oldInfo.spec) && apiequality.Semantic.DeepEqual(&newCRD.Status.AcceptedNames, oldInfo.acceptedNames) {
|
||||||
|
glog.V(6).Infof("Ignoring customresourcedefinition %s update because neither spec, nor accepted names changed", oldCRD.Name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
glog.V(4).Infof("Updating customresourcedefinition %s", oldCRD.Name)
|
||||||
|
storageMap2 := make(crdStorageMap, len(storageMap))
|
||||||
|
|
||||||
|
// Copy because we cannot write to storageMap without a race
|
||||||
|
// as it is used without locking elsewhere
|
||||||
|
for k, v := range storageMap {
|
||||||
|
if k == oldCRD.UID {
|
||||||
|
v.storage.DestroyFunc()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
storageMap2[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
c.customStorage.Store(storageMap2)
|
||||||
|
}
|
||||||
|
|
||||||
|
type unstructuredNegotiatedSerializer struct {
|
||||||
|
typer runtime.ObjectTyper
|
||||||
|
creator runtime.ObjectCreater
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s unstructuredNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo {
|
||||||
|
return []runtime.SerializerInfo{
|
||||||
|
{
|
||||||
|
MediaType: "application/json",
|
||||||
|
EncodesAsText: true,
|
||||||
|
Serializer: json.NewSerializer(json.DefaultMetaFactory, s.creator, s.typer, false),
|
||||||
|
PrettySerializer: json.NewSerializer(json.DefaultMetaFactory, s.creator, s.typer, true),
|
||||||
|
StreamSerializer: &runtime.StreamSerializerInfo{
|
||||||
|
EncodesAsText: true,
|
||||||
|
Serializer: json.NewSerializer(json.DefaultMetaFactory, s.creator, s.typer, false),
|
||||||
|
Framer: json.Framer,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s unstructuredNegotiatedSerializer) EncoderForVersion(serializer runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder {
|
||||||
|
return versioning.NewDefaultingCodecForScheme(Scheme, crEncoderInstance, nil, gv, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s unstructuredNegotiatedSerializer) DecoderToVersion(serializer runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder {
|
||||||
|
return unstructuredDecoder{delegate: Codecs.DecoderToVersion(serializer, gv)}
|
||||||
|
}
|
||||||
|
|
||||||
|
type unstructuredDecoder struct {
|
||||||
|
delegate runtime.Decoder
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d unstructuredDecoder) Decode(data []byte, defaults *schema.GroupVersionKind, into runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) {
|
||||||
|
// Delegate for things other than Unstructured.
|
||||||
|
if _, ok := into.(runtime.Unstructured); !ok && into != nil {
|
||||||
|
return d.delegate.Decode(data, defaults, into)
|
||||||
|
}
|
||||||
|
return unstructured.UnstructuredJSONScheme.Decode(data, defaults, into)
|
||||||
|
}
|
||||||
|
|
||||||
|
type unstructuredObjectTyper struct {
|
||||||
|
delegate runtime.ObjectTyper
|
||||||
|
unstructuredTyper runtime.ObjectTyper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t unstructuredObjectTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) {
|
||||||
|
// Delegate for things other than Unstructured.
|
||||||
|
if _, ok := obj.(runtime.Unstructured); !ok {
|
||||||
|
return t.delegate.ObjectKinds(obj)
|
||||||
|
}
|
||||||
|
return t.unstructuredTyper.ObjectKinds(obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t unstructuredObjectTyper) Recognizes(gvk schema.GroupVersionKind) bool {
|
||||||
|
return t.delegate.Recognizes(gvk) || t.unstructuredTyper.Recognizes(gvk)
|
||||||
|
}
|
||||||
|
|
||||||
|
var crEncoderInstance = crEncoder{}
|
||||||
|
|
||||||
|
// crEncoder *usually* encodes using the unstructured.UnstructuredJSONScheme, but if the type is Status or WatchEvent
|
||||||
|
// it will serialize them out using the converting codec.
|
||||||
|
type crEncoder struct{}
|
||||||
|
|
||||||
|
func (crEncoder) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
|
switch t := obj.(type) {
|
||||||
|
case *metav1.Status, *metav1.WatchEvent:
|
||||||
|
for _, info := range Codecs.SupportedMediaTypes() {
|
||||||
|
// we are always json
|
||||||
|
if info.MediaType == "application/json" {
|
||||||
|
return info.Serializer.Encode(obj, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("unable to find json serializer for %T", t)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return unstructured.UnstructuredJSONScheme.Encode(obj, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type unstructuredCreator struct{}
|
||||||
|
|
||||||
|
func (c unstructuredCreator) New(kind schema.GroupVersionKind) (runtime.Object, error) {
|
||||||
|
ret := &unstructured.Unstructured{}
|
||||||
|
ret.SetGroupVersionKind(kind)
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type unstructuredDefaulter struct {
|
||||||
|
delegate runtime.ObjectDefaulter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d unstructuredDefaulter) Default(in runtime.Object) {
|
||||||
|
// Delegate for things other than Unstructured.
|
||||||
|
if _, ok := in.(runtime.Unstructured); !ok {
|
||||||
|
d.delegate.Default(in)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type CRDRESTOptionsGetter struct {
|
||||||
|
StorageConfig storagebackend.Config
|
||||||
|
StoragePrefix string
|
||||||
|
EnableWatchCache bool
|
||||||
|
DefaultWatchCacheSize int
|
||||||
|
EnableGarbageCollection bool
|
||||||
|
DeleteCollectionWorkers int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t CRDRESTOptionsGetter) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) {
|
||||||
|
ret := generic.RESTOptions{
|
||||||
|
StorageConfig: &t.StorageConfig,
|
||||||
|
Decorator: generic.UndecoratedStorage,
|
||||||
|
EnableGarbageCollection: t.EnableGarbageCollection,
|
||||||
|
DeleteCollectionWorkers: t.DeleteCollectionWorkers,
|
||||||
|
ResourcePrefix: resource.Group + "/" + resource.Resource,
|
||||||
|
}
|
||||||
|
if t.EnableWatchCache {
|
||||||
|
ret.Decorator = genericregistry.StorageWithCacher(t.DefaultWatchCacheSize)
|
||||||
|
}
|
||||||
|
return ret, nil
|
||||||
|
}
|
91
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go
generated
vendored
Normal file
91
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go
generated
vendored
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 apiserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConvertFieldLabel(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
clusterScoped bool
|
||||||
|
label string
|
||||||
|
expectError bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "cluster scoped - name is ok",
|
||||||
|
clusterScoped: true,
|
||||||
|
label: "metadata.name",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cluster scoped - namespace is not ok",
|
||||||
|
clusterScoped: true,
|
||||||
|
label: "metadata.namespace",
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "cluster scoped - other field is not ok",
|
||||||
|
clusterScoped: true,
|
||||||
|
label: "some.other.field",
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "namespace scoped - name is ok",
|
||||||
|
label: "metadata.name",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "namespace scoped - namespace is ok",
|
||||||
|
label: "metadata.namespace",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "namespace scoped - other field is not ok",
|
||||||
|
label: "some.other.field",
|
||||||
|
expectError: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
|
||||||
|
c := crdObjectConverter{
|
||||||
|
UnstructuredObjectConverter: unstructured.UnstructuredObjectConverter{},
|
||||||
|
clusterScoped: test.clusterScoped,
|
||||||
|
}
|
||||||
|
|
||||||
|
label, value, err := c.ConvertFieldLabel("", "", test.label, "value")
|
||||||
|
if e, a := test.expectError, err != nil; e != a {
|
||||||
|
t.Fatalf("err: expected %t, got %t", e, a)
|
||||||
|
}
|
||||||
|
if test.expectError {
|
||||||
|
if e, a := "field label not supported: "+test.label, err.Error(); e != a {
|
||||||
|
t.Errorf("err: expected %s, got %s", e, a)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if e, a := test.label, label; e != a {
|
||||||
|
t.Errorf("label: expected %s, got %s", e, a)
|
||||||
|
}
|
||||||
|
if e, a := "value", value; e != a {
|
||||||
|
t.Errorf("value: expected %s, got %s", e, a)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
49
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD
generated
vendored
Normal file
49
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["validation.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/validation",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/go-openapi/spec:go_default_library",
|
||||||
|
"//vendor/github.com/go-openapi/validate:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["validation_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/validation",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/go-openapi/spec:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
241
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go
generated
vendored
Normal file
241
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation.go
generated
vendored
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 validation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
"github.com/go-openapi/validate"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ValidateCustomResource validates the Custom Resource against the schema in the CustomResourceDefinition.
|
||||||
|
// CustomResource is a JSON data structure.
|
||||||
|
func ValidateCustomResource(customResource interface{}, validator *validate.SchemaValidator) error {
|
||||||
|
result := validator.Validate(customResource)
|
||||||
|
if result.AsError() != nil {
|
||||||
|
return result.AsError()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConvertToOpenAPITypes is used to convert internal types to go-openapi types.
|
||||||
|
func ConvertToOpenAPITypes(in *apiextensions.CustomResourceDefinition, out *spec.Schema) error {
|
||||||
|
if in.Spec.Validation != nil {
|
||||||
|
if err := convertJSONSchemaProps(in.Spec.Validation.OpenAPIV3Schema, out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertJSONSchemaProps(in *apiextensions.JSONSchemaProps, out *spec.Schema) error {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
out.ID = in.ID
|
||||||
|
out.Schema = spec.SchemaURL(in.Schema)
|
||||||
|
out.Description = in.Description
|
||||||
|
if in.Type != "" {
|
||||||
|
out.Type = spec.StringOrArray([]string{in.Type})
|
||||||
|
}
|
||||||
|
out.Format = in.Format
|
||||||
|
out.Title = in.Title
|
||||||
|
out.Maximum = in.Maximum
|
||||||
|
out.ExclusiveMaximum = in.ExclusiveMaximum
|
||||||
|
out.Minimum = in.Minimum
|
||||||
|
out.ExclusiveMinimum = in.ExclusiveMinimum
|
||||||
|
out.MaxLength = in.MaxLength
|
||||||
|
out.MinLength = in.MinLength
|
||||||
|
out.Pattern = in.Pattern
|
||||||
|
out.MaxItems = in.MaxItems
|
||||||
|
out.MinItems = in.MinItems
|
||||||
|
out.UniqueItems = in.UniqueItems
|
||||||
|
out.MultipleOf = in.MultipleOf
|
||||||
|
out.MaxProperties = in.MaxProperties
|
||||||
|
out.MinProperties = in.MinProperties
|
||||||
|
out.Required = in.Required
|
||||||
|
|
||||||
|
if in.Default != nil {
|
||||||
|
out.Default = *(in.Default)
|
||||||
|
}
|
||||||
|
if in.Example != nil {
|
||||||
|
out.Example = *(in.Example)
|
||||||
|
}
|
||||||
|
|
||||||
|
out.Enum = make([]interface{}, len(in.Enum))
|
||||||
|
for k, v := range in.Enum {
|
||||||
|
out.Enum[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := convertSliceOfJSONSchemaProps(&in.AllOf, &out.AllOf); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := convertSliceOfJSONSchemaProps(&in.OneOf, &out.OneOf); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := convertSliceOfJSONSchemaProps(&in.AnyOf, &out.AnyOf); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.Not != nil {
|
||||||
|
in, out := &in.Not, &out.Not
|
||||||
|
*out = new(spec.Schema)
|
||||||
|
if err := convertJSONSchemaProps(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
out.Properties, err = convertMapOfJSONSchemaProps(in.Properties)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
out.PatternProperties, err = convertMapOfJSONSchemaProps(in.PatternProperties)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
out.Definitions, err = convertMapOfJSONSchemaProps(in.Definitions)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.Ref != nil {
|
||||||
|
out.Ref, err = spec.NewRef(*in.Ref)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.AdditionalProperties != nil {
|
||||||
|
in, out := &in.AdditionalProperties, &out.AdditionalProperties
|
||||||
|
*out = new(spec.SchemaOrBool)
|
||||||
|
if err := convertJSONSchemaPropsorBool(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.AdditionalItems != nil {
|
||||||
|
in, out := &in.AdditionalItems, &out.AdditionalItems
|
||||||
|
*out = new(spec.SchemaOrBool)
|
||||||
|
if err := convertJSONSchemaPropsorBool(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = new(spec.SchemaOrArray)
|
||||||
|
if err := convertJSONSchemaPropsOrArray(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.Dependencies != nil {
|
||||||
|
in, out := &in.Dependencies, &out.Dependencies
|
||||||
|
*out = make(spec.Dependencies, len(*in))
|
||||||
|
for key, val := range *in {
|
||||||
|
newVal := new(spec.SchemaOrStringArray)
|
||||||
|
if err := convertJSONSchemaPropsOrStringArray(&val, newVal); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
(*out)[key] = *newVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if in.ExternalDocs != nil {
|
||||||
|
out.ExternalDocs = &spec.ExternalDocumentation{}
|
||||||
|
out.ExternalDocs.Description = in.ExternalDocs.Description
|
||||||
|
out.ExternalDocs.URL = in.ExternalDocs.URL
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertSliceOfJSONSchemaProps(in *[]apiextensions.JSONSchemaProps, out *[]spec.Schema) error {
|
||||||
|
if in != nil {
|
||||||
|
for _, jsonSchemaProps := range *in {
|
||||||
|
schema := spec.Schema{}
|
||||||
|
if err := convertJSONSchemaProps(&jsonSchemaProps, &schema); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*out = append(*out, schema)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertMapOfJSONSchemaProps(in map[string]apiextensions.JSONSchemaProps) (map[string]spec.Schema, error) {
|
||||||
|
out := make(map[string]spec.Schema)
|
||||||
|
if len(in) != 0 {
|
||||||
|
for k, jsonSchemaProps := range in {
|
||||||
|
schema := spec.Schema{}
|
||||||
|
if err := convertJSONSchemaProps(&jsonSchemaProps, &schema); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out[k] = schema
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertJSONSchemaPropsOrArray(in *apiextensions.JSONSchemaPropsOrArray, out *spec.SchemaOrArray) error {
|
||||||
|
if in.Schema != nil {
|
||||||
|
in, out := &in.Schema, &out.Schema
|
||||||
|
*out = new(spec.Schema)
|
||||||
|
if err := convertJSONSchemaProps(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if in.JSONSchemas != nil {
|
||||||
|
in, out := &in.JSONSchemas, &out.Schemas
|
||||||
|
*out = make([]spec.Schema, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := convertJSONSchemaProps(&(*in)[i], &(*out)[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertJSONSchemaPropsorBool(in *apiextensions.JSONSchemaPropsOrBool, out *spec.SchemaOrBool) error {
|
||||||
|
out.Allows = in.Allows
|
||||||
|
if in.Schema != nil {
|
||||||
|
in, out := &in.Schema, &out.Schema
|
||||||
|
*out = new(spec.Schema)
|
||||||
|
if err := convertJSONSchemaProps(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertJSONSchemaPropsOrStringArray(in *apiextensions.JSONSchemaPropsOrStringArray, out *spec.SchemaOrStringArray) error {
|
||||||
|
out.Property = in.Property
|
||||||
|
if in.Schema != nil {
|
||||||
|
in, out := &in.Schema, &out.Schema
|
||||||
|
*out = new(spec.Schema)
|
||||||
|
if err := convertJSONSchemaProps(*in, *out); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
87
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation_test.go
generated
vendored
Normal file
87
vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation_test.go
generated
vendored
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 validation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/go-openapi/spec"
|
||||||
|
|
||||||
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
|
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
"k8s.io/apimachinery/pkg/util/json"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
apiextensionsfuzzer "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer"
|
||||||
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestRoundTrip checks the conversion to go-openapi types.
|
||||||
|
// internal -> go-openapi -> JSON -> external -> internal
|
||||||
|
func TestRoundTrip(t *testing.T) {
|
||||||
|
scheme := runtime.NewScheme()
|
||||||
|
codecs := serializer.NewCodecFactory(scheme)
|
||||||
|
|
||||||
|
// add internal and external types to scheme
|
||||||
|
if err := apiextensions.AddToScheme(scheme); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := apiextensionsv1beta1.AddToScheme(scheme); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
seed := rand.Int63()
|
||||||
|
fuzzerFuncs := fuzzer.MergeFuzzerFuncs(apiextensionsfuzzer.Funcs)
|
||||||
|
f := fuzzer.FuzzerFor(fuzzerFuncs, rand.NewSource(seed), codecs)
|
||||||
|
|
||||||
|
for i := 0; i < 20; i++ {
|
||||||
|
// fuzz internal types
|
||||||
|
internal := &apiextensions.JSONSchemaProps{}
|
||||||
|
f.Fuzz(internal)
|
||||||
|
|
||||||
|
// internal -> go-openapi
|
||||||
|
openAPITypes := &spec.Schema{}
|
||||||
|
if err := convertJSONSchemaProps(internal, openAPITypes); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// go-openapi -> JSON
|
||||||
|
openAPIJSON, err := json.Marshal(openAPITypes)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON -> external
|
||||||
|
external := &apiextensionsv1beta1.JSONSchemaProps{}
|
||||||
|
if err := json.Unmarshal(openAPIJSON, external); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// external -> internal
|
||||||
|
internalRoundTripped := &apiextensions.JSONSchemaProps{}
|
||||||
|
if err := scheme.Convert(external, internalRoundTripped, nil); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !apiequality.Semantic.DeepEqual(internal, internalRoundTripped) {
|
||||||
|
t.Fatalf("expected\n\t%#v, got \n\t%#v", internal, internalRoundTripped)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/clientset.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/clientset.go
generated
vendored
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/doc.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/doc.go
generated
vendored
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
43
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD
generated
vendored
Normal file
43
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"clientset_generated.go",
|
||||||
|
"doc.go",
|
||||||
|
"register.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/discovery/fake:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/testing:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
71
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/clientset_generated.go
generated
vendored
Normal file
71
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/clientset_generated.go
generated
vendored
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
|
||||||
|
fakeapiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
|
"k8s.io/client-go/discovery"
|
||||||
|
fakediscovery "k8s.io/client-go/discovery/fake"
|
||||||
|
"k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewSimpleClientset returns a clientset that will respond with the provided objects.
|
||||||
|
// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
|
||||||
|
// without applying any validations and/or defaults. It shouldn't be considered a replacement
|
||||||
|
// for a real clientset and is mostly useful in simple unit tests.
|
||||||
|
func NewSimpleClientset(objects ...runtime.Object) *Clientset {
|
||||||
|
o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
|
||||||
|
for _, obj := range objects {
|
||||||
|
if err := o.Add(obj); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fakePtr := testing.Fake{}
|
||||||
|
fakePtr.AddReactor("*", "*", testing.ObjectReaction(o))
|
||||||
|
fakePtr.AddWatchReactor("*", testing.DefaultWatchReactor(watch.NewFake(), nil))
|
||||||
|
|
||||||
|
return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clientset implements clientset.Interface. Meant to be embedded into a
|
||||||
|
// struct to get a default implementation. This makes faking out just the method
|
||||||
|
// you want to test easier.
|
||||||
|
type Clientset struct {
|
||||||
|
testing.Fake
|
||||||
|
discovery *fakediscovery.FakeDiscovery
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Clientset) Discovery() discovery.DiscoveryInterface {
|
||||||
|
return c.discovery
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ clientset.Interface = &Clientset{}
|
||||||
|
|
||||||
|
// ApiextensionsV1beta1 retrieves the ApiextensionsV1beta1Client
|
||||||
|
func (c *Clientset) ApiextensionsV1beta1() apiextensionsv1beta1.ApiextensionsV1beta1Interface {
|
||||||
|
return &fakeapiextensionsv1beta1.FakeApiextensionsV1beta1{Fake: &c.Fake}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apiextensions retrieves the ApiextensionsV1beta1Client
|
||||||
|
func (c *Clientset) Apiextensions() apiextensionsv1beta1.ApiextensionsV1beta1Interface {
|
||||||
|
return &fakeapiextensionsv1beta1.FakeApiextensionsV1beta1{Fake: &c.Fake}
|
||||||
|
}
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 package has the automatically generated fake clientset.
|
||||||
|
package fake
|
53
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/register.go
generated
vendored
Normal file
53
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/register.go
generated
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
serializer "k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
)
|
||||||
|
|
||||||
|
var scheme = runtime.NewScheme()
|
||||||
|
var codecs = serializer.NewCodecFactory(scheme)
|
||||||
|
var parameterCodec = runtime.NewParameterCodec(scheme)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
|
||||||
|
AddToScheme(scheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddToScheme adds all types of this clientset into the given scheme. This allows composition
|
||||||
|
// of clientsets, like in:
|
||||||
|
//
|
||||||
|
// import (
|
||||||
|
// "k8s.io/client-go/kubernetes"
|
||||||
|
// clientsetscheme "k8s.io/client-go/kuberentes/scheme"
|
||||||
|
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
|
||||||
|
// )
|
||||||
|
//
|
||||||
|
// kclientset, _ := kubernetes.NewForConfig(c)
|
||||||
|
// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
|
||||||
|
//
|
||||||
|
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
|
||||||
|
// correctly.
|
||||||
|
func AddToScheme(scheme *runtime.Scheme) {
|
||||||
|
apiextensionsv1beta1.AddToScheme(scheme)
|
||||||
|
|
||||||
|
}
|
2
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/doc.go
generated
vendored
2
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/doc.go
generated
vendored
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
40
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD
generated
vendored
Normal file
40
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"doc.go",
|
||||||
|
"fake_apiextensions_client.go",
|
||||||
|
"fake_customresourcedefinition.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/testing:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake has the automatically generated clients.
|
||||||
|
package fake
|
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_apiextensions_client.go
generated
vendored
Normal file
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_apiextensions_client.go
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1beta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
testing "k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FakeApiextensionsV1beta1 struct {
|
||||||
|
*testing.Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *FakeApiextensionsV1beta1) CustomResourceDefinitions() v1beta1.CustomResourceDefinitionInterface {
|
||||||
|
return &FakeCustomResourceDefinitions{c}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RESTClient returns a RESTClient that is used to communicate
|
||||||
|
// with API server by this client implementation.
|
||||||
|
func (c *FakeApiextensionsV1beta1) RESTClient() rest.Interface {
|
||||||
|
var ret *rest.RESTClient
|
||||||
|
return ret
|
||||||
|
}
|
129
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_customresourcedefinition.go
generated
vendored
Normal file
129
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_customresourcedefinition.go
generated
vendored
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
labels "k8s.io/apimachinery/pkg/labels"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
types "k8s.io/apimachinery/pkg/types"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
testing "k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FakeCustomResourceDefinitions implements CustomResourceDefinitionInterface
|
||||||
|
type FakeCustomResourceDefinitions struct {
|
||||||
|
Fake *FakeApiextensionsV1beta1
|
||||||
|
}
|
||||||
|
|
||||||
|
var customresourcedefinitionsResource = schema.GroupVersionResource{Group: "apiextensions.k8s.io", Version: "v1beta1", Resource: "customresourcedefinitions"}
|
||||||
|
|
||||||
|
var customresourcedefinitionsKind = schema.GroupVersionKind{Group: "apiextensions.k8s.io", Version: "v1beta1", Kind: "CustomResourceDefinition"}
|
||||||
|
|
||||||
|
// Get takes name of the customResourceDefinition, and returns the corresponding customResourceDefinition object, and an error if there is any.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Get(name string, options v1.GetOptions) (result *v1beta1.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootGetAction(customresourcedefinitionsResource, name), &v1beta1.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*v1beta1.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// List takes label and field selectors, and returns the list of CustomResourceDefinitions that match those selectors.
|
||||||
|
func (c *FakeCustomResourceDefinitions) List(opts v1.ListOptions) (result *v1beta1.CustomResourceDefinitionList, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootListAction(customresourcedefinitionsResource, customresourcedefinitionsKind, opts), &v1beta1.CustomResourceDefinitionList{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
label, _, _ := testing.ExtractFromListOptions(opts)
|
||||||
|
if label == nil {
|
||||||
|
label = labels.Everything()
|
||||||
|
}
|
||||||
|
list := &v1beta1.CustomResourceDefinitionList{}
|
||||||
|
for _, item := range obj.(*v1beta1.CustomResourceDefinitionList).Items {
|
||||||
|
if label.Matches(labels.Set(item.Labels)) {
|
||||||
|
list.Items = append(list.Items, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch returns a watch.Interface that watches the requested customResourceDefinitions.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
||||||
|
return c.Fake.
|
||||||
|
InvokesWatch(testing.NewRootWatchAction(customresourcedefinitionsResource, opts))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create takes the representation of a customResourceDefinition and creates it. Returns the server's representation of the customResourceDefinition, and an error, if there is any.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Create(customResourceDefinition *v1beta1.CustomResourceDefinition) (result *v1beta1.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootCreateAction(customresourcedefinitionsResource, customResourceDefinition), &v1beta1.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*v1beta1.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update takes the representation of a customResourceDefinition and updates it. Returns the server's representation of the customResourceDefinition, and an error, if there is any.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Update(customResourceDefinition *v1beta1.CustomResourceDefinition) (result *v1beta1.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootUpdateAction(customresourcedefinitionsResource, customResourceDefinition), &v1beta1.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*v1beta1.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStatus was generated because the type contains a Status member.
|
||||||
|
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
|
||||||
|
func (c *FakeCustomResourceDefinitions) UpdateStatus(customResourceDefinition *v1beta1.CustomResourceDefinition) (*v1beta1.CustomResourceDefinition, error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootUpdateSubresourceAction(customresourcedefinitionsResource, "status", customResourceDefinition), &v1beta1.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*v1beta1.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete takes name of the customResourceDefinition and deletes it. Returns an error if one occurs.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Delete(name string, options *v1.DeleteOptions) error {
|
||||||
|
_, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootDeleteAction(customresourcedefinitionsResource, name), &v1beta1.CustomResourceDefinition{})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteCollection deletes a collection of objects.
|
||||||
|
func (c *FakeCustomResourceDefinitions) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
|
||||||
|
action := testing.NewRootDeleteCollectionAction(customresourcedefinitionsResource, listOptions)
|
||||||
|
|
||||||
|
_, err := c.Fake.Invokes(action, &v1beta1.CustomResourceDefinitionList{})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Patch applies the patch and returns the patched customResourceDefinition.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootPatchSubresourceAction(customresourcedefinitionsResource, name, data, subresources...), &v1beta1.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*v1beta1.CustomResourceDefinition), err
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2017 The Kubernetes Authors.
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
40
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD
generated
vendored
Normal file
40
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"clientset.go",
|
||||||
|
"doc.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/util/flowcontrol:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake:all-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme:all-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
90
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/clientset.go
generated
vendored
Normal file
90
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/clientset.go
generated
vendored
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 internalclientset
|
||||||
|
|
||||||
|
import (
|
||||||
|
glog "github.com/golang/glog"
|
||||||
|
apiextensionsinternalversion "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion"
|
||||||
|
discovery "k8s.io/client-go/discovery"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
flowcontrol "k8s.io/client-go/util/flowcontrol"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Interface interface {
|
||||||
|
Discovery() discovery.DiscoveryInterface
|
||||||
|
Apiextensions() apiextensionsinternalversion.ApiextensionsInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clientset contains the clients for groups. Each group has exactly one
|
||||||
|
// version included in a Clientset.
|
||||||
|
type Clientset struct {
|
||||||
|
*discovery.DiscoveryClient
|
||||||
|
apiextensions *apiextensionsinternalversion.ApiextensionsClient
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apiextensions retrieves the ApiextensionsClient
|
||||||
|
func (c *Clientset) Apiextensions() apiextensionsinternalversion.ApiextensionsInterface {
|
||||||
|
return c.apiextensions
|
||||||
|
}
|
||||||
|
|
||||||
|
// Discovery retrieves the DiscoveryClient
|
||||||
|
func (c *Clientset) Discovery() discovery.DiscoveryInterface {
|
||||||
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.DiscoveryClient
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfig creates a new Clientset for the given config.
|
||||||
|
func NewForConfig(c *rest.Config) (*Clientset, error) {
|
||||||
|
configShallowCopy := *c
|
||||||
|
if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
|
||||||
|
configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
|
||||||
|
}
|
||||||
|
var cs Clientset
|
||||||
|
var err error
|
||||||
|
cs.apiextensions, err = apiextensionsinternalversion.NewForConfig(&configShallowCopy)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorf("failed to create the DiscoveryClient: %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &cs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfigOrDie creates a new Clientset for the given config and
|
||||||
|
// panics if there is an error in the config.
|
||||||
|
func NewForConfigOrDie(c *rest.Config) *Clientset {
|
||||||
|
var cs Clientset
|
||||||
|
cs.apiextensions = apiextensionsinternalversion.NewForConfigOrDie(c)
|
||||||
|
|
||||||
|
cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
|
||||||
|
return &cs
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new Clientset for the given RESTClient.
|
||||||
|
func New(c rest.Interface) *Clientset {
|
||||||
|
var cs Clientset
|
||||||
|
cs.apiextensions = apiextensionsinternalversion.New(c)
|
||||||
|
|
||||||
|
cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
|
||||||
|
return &cs
|
||||||
|
}
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 package has the automatically generated clientset.
|
||||||
|
package internalclientset
|
43
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD
generated
vendored
Normal file
43
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"clientset_generated.go",
|
||||||
|
"doc.go",
|
||||||
|
"register.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/discovery/fake:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/testing:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
66
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/clientset_generated.go
generated
vendored
Normal file
66
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/clientset_generated.go
generated
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset"
|
||||||
|
apiextensionsinternalversion "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion"
|
||||||
|
fakeapiextensionsinternalversion "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
|
"k8s.io/client-go/discovery"
|
||||||
|
fakediscovery "k8s.io/client-go/discovery/fake"
|
||||||
|
"k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewSimpleClientset returns a clientset that will respond with the provided objects.
|
||||||
|
// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
|
||||||
|
// without applying any validations and/or defaults. It shouldn't be considered a replacement
|
||||||
|
// for a real clientset and is mostly useful in simple unit tests.
|
||||||
|
func NewSimpleClientset(objects ...runtime.Object) *Clientset {
|
||||||
|
o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
|
||||||
|
for _, obj := range objects {
|
||||||
|
if err := o.Add(obj); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fakePtr := testing.Fake{}
|
||||||
|
fakePtr.AddReactor("*", "*", testing.ObjectReaction(o))
|
||||||
|
fakePtr.AddWatchReactor("*", testing.DefaultWatchReactor(watch.NewFake(), nil))
|
||||||
|
|
||||||
|
return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clientset implements clientset.Interface. Meant to be embedded into a
|
||||||
|
// struct to get a default implementation. This makes faking out just the method
|
||||||
|
// you want to test easier.
|
||||||
|
type Clientset struct {
|
||||||
|
testing.Fake
|
||||||
|
discovery *fakediscovery.FakeDiscovery
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Clientset) Discovery() discovery.DiscoveryInterface {
|
||||||
|
return c.discovery
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ clientset.Interface = &Clientset{}
|
||||||
|
|
||||||
|
// Apiextensions retrieves the ApiextensionsClient
|
||||||
|
func (c *Clientset) Apiextensions() apiextensionsinternalversion.ApiextensionsInterface {
|
||||||
|
return &fakeapiextensionsinternalversion.FakeApiextensions{Fake: &c.Fake}
|
||||||
|
}
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 package has the automatically generated fake clientset.
|
||||||
|
package fake
|
53
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/register.go
generated
vendored
Normal file
53
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/register.go
generated
vendored
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
apiextensionsinternalversion "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
serializer "k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
)
|
||||||
|
|
||||||
|
var scheme = runtime.NewScheme()
|
||||||
|
var codecs = serializer.NewCodecFactory(scheme)
|
||||||
|
var parameterCodec = runtime.NewParameterCodec(scheme)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
|
||||||
|
AddToScheme(scheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddToScheme adds all types of this clientset into the given scheme. This allows composition
|
||||||
|
// of clientsets, like in:
|
||||||
|
//
|
||||||
|
// import (
|
||||||
|
// "k8s.io/client-go/kubernetes"
|
||||||
|
// clientsetscheme "k8s.io/client-go/kuberentes/scheme"
|
||||||
|
// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
|
||||||
|
// )
|
||||||
|
//
|
||||||
|
// kclientset, _ := kubernetes.NewForConfig(c)
|
||||||
|
// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
|
||||||
|
//
|
||||||
|
// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
|
||||||
|
// correctly.
|
||||||
|
func AddToScheme(scheme *runtime.Scheme) {
|
||||||
|
apiextensionsinternalversion.AddToScheme(scheme)
|
||||||
|
|
||||||
|
}
|
37
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD
generated
vendored
Normal file
37
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"doc.go",
|
||||||
|
"register.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 package contains the scheme of the automatically generated clientset.
|
||||||
|
package scheme
|
47
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/register.go
generated
vendored
Normal file
47
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/register.go
generated
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 scheme
|
||||||
|
|
||||||
|
import (
|
||||||
|
os "os"
|
||||||
|
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
|
||||||
|
announced "k8s.io/apimachinery/pkg/apimachinery/announced"
|
||||||
|
registered "k8s.io/apimachinery/pkg/apimachinery/registered"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
serializer "k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Scheme = runtime.NewScheme()
|
||||||
|
var Codecs = serializer.NewCodecFactory(Scheme)
|
||||||
|
var ParameterCodec = runtime.NewParameterCodec(Scheme)
|
||||||
|
|
||||||
|
var Registry = registered.NewOrDie(os.Getenv("KUBE_API_VERSIONS"))
|
||||||
|
var GroupFactoryRegistry = make(announced.APIGroupFactoryRegistry)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
|
||||||
|
Install(GroupFactoryRegistry, Registry, Scheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install registers the API group and adds types to a scheme
|
||||||
|
func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) {
|
||||||
|
apiextensions.Install(groupFactoryRegistry, registry, scheme)
|
||||||
|
|
||||||
|
}
|
41
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD
generated
vendored
Normal file
41
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"apiextensions_client.go",
|
||||||
|
"customresourcedefinition.go",
|
||||||
|
"doc.go",
|
||||||
|
"generated_expansion.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
99
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/apiextensions_client.go
generated
vendored
Normal file
99
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/apiextensions_client.go
generated
vendored
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ApiextensionsInterface interface {
|
||||||
|
RESTClient() rest.Interface
|
||||||
|
CustomResourceDefinitionsGetter
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApiextensionsClient is used to interact with features provided by the apiextensions.k8s.io group.
|
||||||
|
type ApiextensionsClient struct {
|
||||||
|
restClient rest.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ApiextensionsClient) CustomResourceDefinitions() CustomResourceDefinitionInterface {
|
||||||
|
return newCustomResourceDefinitions(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfig creates a new ApiextensionsClient for the given config.
|
||||||
|
func NewForConfig(c *rest.Config) (*ApiextensionsClient, error) {
|
||||||
|
config := *c
|
||||||
|
if err := setConfigDefaults(&config); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
client, err := rest.RESTClientFor(&config)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ApiextensionsClient{client}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewForConfigOrDie creates a new ApiextensionsClient for the given config and
|
||||||
|
// panics if there is an error in the config.
|
||||||
|
func NewForConfigOrDie(c *rest.Config) *ApiextensionsClient {
|
||||||
|
client, err := NewForConfig(c)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new ApiextensionsClient for the given RESTClient.
|
||||||
|
func New(c rest.Interface) *ApiextensionsClient {
|
||||||
|
return &ApiextensionsClient{c}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setConfigDefaults(config *rest.Config) error {
|
||||||
|
g, err := scheme.Registry.Group("apiextensions.k8s.io")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
config.APIPath = "/apis"
|
||||||
|
if config.UserAgent == "" {
|
||||||
|
config.UserAgent = rest.DefaultKubernetesUserAgent()
|
||||||
|
}
|
||||||
|
if config.GroupVersion == nil || config.GroupVersion.Group != g.GroupVersion.Group {
|
||||||
|
gv := g.GroupVersion
|
||||||
|
config.GroupVersion = &gv
|
||||||
|
}
|
||||||
|
config.NegotiatedSerializer = scheme.Codecs
|
||||||
|
|
||||||
|
if config.QPS == 0 {
|
||||||
|
config.QPS = 5
|
||||||
|
}
|
||||||
|
if config.Burst == 0 {
|
||||||
|
config.Burst = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RESTClient returns a RESTClient that is used to communicate
|
||||||
|
// with API server by this client implementation.
|
||||||
|
func (c *ApiextensionsClient) RESTClient() rest.Interface {
|
||||||
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.restClient
|
||||||
|
}
|
161
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/customresourcedefinition.go
generated
vendored
Normal file
161
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/customresourcedefinition.go
generated
vendored
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
scheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
types "k8s.io/apimachinery/pkg/types"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CustomResourceDefinitionsGetter has a method to return a CustomResourceDefinitionInterface.
|
||||||
|
// A group's client should implement this interface.
|
||||||
|
type CustomResourceDefinitionsGetter interface {
|
||||||
|
CustomResourceDefinitions() CustomResourceDefinitionInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
// CustomResourceDefinitionInterface has methods to work with CustomResourceDefinition resources.
|
||||||
|
type CustomResourceDefinitionInterface interface {
|
||||||
|
Create(*apiextensions.CustomResourceDefinition) (*apiextensions.CustomResourceDefinition, error)
|
||||||
|
Update(*apiextensions.CustomResourceDefinition) (*apiextensions.CustomResourceDefinition, error)
|
||||||
|
UpdateStatus(*apiextensions.CustomResourceDefinition) (*apiextensions.CustomResourceDefinition, error)
|
||||||
|
Delete(name string, options *v1.DeleteOptions) error
|
||||||
|
DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
|
||||||
|
Get(name string, options v1.GetOptions) (*apiextensions.CustomResourceDefinition, error)
|
||||||
|
List(opts v1.ListOptions) (*apiextensions.CustomResourceDefinitionList, error)
|
||||||
|
Watch(opts v1.ListOptions) (watch.Interface, error)
|
||||||
|
Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *apiextensions.CustomResourceDefinition, err error)
|
||||||
|
CustomResourceDefinitionExpansion
|
||||||
|
}
|
||||||
|
|
||||||
|
// customResourceDefinitions implements CustomResourceDefinitionInterface
|
||||||
|
type customResourceDefinitions struct {
|
||||||
|
client rest.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
// newCustomResourceDefinitions returns a CustomResourceDefinitions
|
||||||
|
func newCustomResourceDefinitions(c *ApiextensionsClient) *customResourceDefinitions {
|
||||||
|
return &customResourceDefinitions{
|
||||||
|
client: c.RESTClient(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get takes name of the customResourceDefinition, and returns the corresponding customResourceDefinition object, and an error if there is any.
|
||||||
|
func (c *customResourceDefinitions) Get(name string, options v1.GetOptions) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
result = &apiextensions.CustomResourceDefinition{}
|
||||||
|
err = c.client.Get().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
Name(name).
|
||||||
|
VersionedParams(&options, scheme.ParameterCodec).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// List takes label and field selectors, and returns the list of CustomResourceDefinitions that match those selectors.
|
||||||
|
func (c *customResourceDefinitions) List(opts v1.ListOptions) (result *apiextensions.CustomResourceDefinitionList, err error) {
|
||||||
|
result = &apiextensions.CustomResourceDefinitionList{}
|
||||||
|
err = c.client.Get().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
VersionedParams(&opts, scheme.ParameterCodec).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch returns a watch.Interface that watches the requested customResourceDefinitions.
|
||||||
|
func (c *customResourceDefinitions) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
||||||
|
opts.Watch = true
|
||||||
|
return c.client.Get().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
VersionedParams(&opts, scheme.ParameterCodec).
|
||||||
|
Watch()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create takes the representation of a customResourceDefinition and creates it. Returns the server's representation of the customResourceDefinition, and an error, if there is any.
|
||||||
|
func (c *customResourceDefinitions) Create(customResourceDefinition *apiextensions.CustomResourceDefinition) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
result = &apiextensions.CustomResourceDefinition{}
|
||||||
|
err = c.client.Post().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
Body(customResourceDefinition).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update takes the representation of a customResourceDefinition and updates it. Returns the server's representation of the customResourceDefinition, and an error, if there is any.
|
||||||
|
func (c *customResourceDefinitions) Update(customResourceDefinition *apiextensions.CustomResourceDefinition) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
result = &apiextensions.CustomResourceDefinition{}
|
||||||
|
err = c.client.Put().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
Name(customResourceDefinition.Name).
|
||||||
|
Body(customResourceDefinition).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStatus was generated because the type contains a Status member.
|
||||||
|
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
|
||||||
|
|
||||||
|
func (c *customResourceDefinitions) UpdateStatus(customResourceDefinition *apiextensions.CustomResourceDefinition) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
result = &apiextensions.CustomResourceDefinition{}
|
||||||
|
err = c.client.Put().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
Name(customResourceDefinition.Name).
|
||||||
|
SubResource("status").
|
||||||
|
Body(customResourceDefinition).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete takes name of the customResourceDefinition and deletes it. Returns an error if one occurs.
|
||||||
|
func (c *customResourceDefinitions) Delete(name string, options *v1.DeleteOptions) error {
|
||||||
|
return c.client.Delete().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
Name(name).
|
||||||
|
Body(options).
|
||||||
|
Do().
|
||||||
|
Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteCollection deletes a collection of objects.
|
||||||
|
func (c *customResourceDefinitions) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
|
||||||
|
return c.client.Delete().
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
VersionedParams(&listOptions, scheme.ParameterCodec).
|
||||||
|
Body(options).
|
||||||
|
Do().
|
||||||
|
Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Patch applies the patch and returns the patched customResourceDefinition.
|
||||||
|
func (c *customResourceDefinitions) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
result = &apiextensions.CustomResourceDefinition{}
|
||||||
|
err = c.client.Patch(pt).
|
||||||
|
Resource("customresourcedefinitions").
|
||||||
|
SubResource(subresources...).
|
||||||
|
Name(name).
|
||||||
|
Body(data).
|
||||||
|
Do().
|
||||||
|
Into(result)
|
||||||
|
return
|
||||||
|
}
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 package has the automatically generated typed clients.
|
||||||
|
package internalversion
|
40
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD
generated
vendored
Normal file
40
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"doc.go",
|
||||||
|
"fake_apiextensions_client.go",
|
||||||
|
"fake_customresourcedefinition.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/testing:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/doc.go
generated
vendored
Normal file
18
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake has the automatically generated clients.
|
||||||
|
package fake
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
internalversion "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion"
|
||||||
|
rest "k8s.io/client-go/rest"
|
||||||
|
testing "k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FakeApiextensions struct {
|
||||||
|
*testing.Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *FakeApiextensions) CustomResourceDefinitions() internalversion.CustomResourceDefinitionInterface {
|
||||||
|
return &FakeCustomResourceDefinitions{c}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RESTClient returns a RESTClient that is used to communicate
|
||||||
|
// with API server by this client implementation.
|
||||||
|
func (c *FakeApiextensions) RESTClient() rest.Interface {
|
||||||
|
var ret *rest.RESTClient
|
||||||
|
return ret
|
||||||
|
}
|
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 fake
|
||||||
|
|
||||||
|
import (
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
labels "k8s.io/apimachinery/pkg/labels"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
types "k8s.io/apimachinery/pkg/types"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
testing "k8s.io/client-go/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FakeCustomResourceDefinitions implements CustomResourceDefinitionInterface
|
||||||
|
type FakeCustomResourceDefinitions struct {
|
||||||
|
Fake *FakeApiextensions
|
||||||
|
}
|
||||||
|
|
||||||
|
var customresourcedefinitionsResource = schema.GroupVersionResource{Group: "apiextensions.k8s.io", Version: "", Resource: "customresourcedefinitions"}
|
||||||
|
|
||||||
|
var customresourcedefinitionsKind = schema.GroupVersionKind{Group: "apiextensions.k8s.io", Version: "", Kind: "CustomResourceDefinition"}
|
||||||
|
|
||||||
|
// Get takes name of the customResourceDefinition, and returns the corresponding customResourceDefinition object, and an error if there is any.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Get(name string, options v1.GetOptions) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootGetAction(customresourcedefinitionsResource, name), &apiextensions.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*apiextensions.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// List takes label and field selectors, and returns the list of CustomResourceDefinitions that match those selectors.
|
||||||
|
func (c *FakeCustomResourceDefinitions) List(opts v1.ListOptions) (result *apiextensions.CustomResourceDefinitionList, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootListAction(customresourcedefinitionsResource, customresourcedefinitionsKind, opts), &apiextensions.CustomResourceDefinitionList{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
label, _, _ := testing.ExtractFromListOptions(opts)
|
||||||
|
if label == nil {
|
||||||
|
label = labels.Everything()
|
||||||
|
}
|
||||||
|
list := &apiextensions.CustomResourceDefinitionList{}
|
||||||
|
for _, item := range obj.(*apiextensions.CustomResourceDefinitionList).Items {
|
||||||
|
if label.Matches(labels.Set(item.Labels)) {
|
||||||
|
list.Items = append(list.Items, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch returns a watch.Interface that watches the requested customResourceDefinitions.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Watch(opts v1.ListOptions) (watch.Interface, error) {
|
||||||
|
return c.Fake.
|
||||||
|
InvokesWatch(testing.NewRootWatchAction(customresourcedefinitionsResource, opts))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create takes the representation of a customResourceDefinition and creates it. Returns the server's representation of the customResourceDefinition, and an error, if there is any.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Create(customResourceDefinition *apiextensions.CustomResourceDefinition) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootCreateAction(customresourcedefinitionsResource, customResourceDefinition), &apiextensions.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*apiextensions.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update takes the representation of a customResourceDefinition and updates it. Returns the server's representation of the customResourceDefinition, and an error, if there is any.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Update(customResourceDefinition *apiextensions.CustomResourceDefinition) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootUpdateAction(customresourcedefinitionsResource, customResourceDefinition), &apiextensions.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*apiextensions.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStatus was generated because the type contains a Status member.
|
||||||
|
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
|
||||||
|
func (c *FakeCustomResourceDefinitions) UpdateStatus(customResourceDefinition *apiextensions.CustomResourceDefinition) (*apiextensions.CustomResourceDefinition, error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootUpdateSubresourceAction(customresourcedefinitionsResource, "status", customResourceDefinition), &apiextensions.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*apiextensions.CustomResourceDefinition), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete takes name of the customResourceDefinition and deletes it. Returns an error if one occurs.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Delete(name string, options *v1.DeleteOptions) error {
|
||||||
|
_, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootDeleteAction(customresourcedefinitionsResource, name), &apiextensions.CustomResourceDefinition{})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteCollection deletes a collection of objects.
|
||||||
|
func (c *FakeCustomResourceDefinitions) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
|
||||||
|
action := testing.NewRootDeleteCollectionAction(customresourcedefinitionsResource, listOptions)
|
||||||
|
|
||||||
|
_, err := c.Fake.Invokes(action, &apiextensions.CustomResourceDefinitionList{})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Patch applies the patch and returns the patched customResourceDefinition.
|
||||||
|
func (c *FakeCustomResourceDefinitions) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(testing.NewRootPatchSubresourceAction(customresourcedefinitionsResource, name, data, subresources...), &apiextensions.CustomResourceDefinition{})
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*apiextensions.CustomResourceDefinition), err
|
||||||
|
}
|
19
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/generated_expansion.go
generated
vendored
Normal file
19
vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/generated_expansion.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 internalversion
|
||||||
|
|
||||||
|
type CustomResourceDefinitionExpansion interface{}
|
42
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD
generated
vendored
Normal file
42
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"factory.go",
|
||||||
|
"generic.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions:all-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
32
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD
generated
vendored
Normal file
32
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["interface.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
46
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/interface.go
generated
vendored
Normal file
46
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/interface.go
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package apiextensions
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1beta1 "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1"
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface provides access to each of this group's versions.
|
||||||
|
type Interface interface {
|
||||||
|
// V1beta1 provides access to shared informers for resources in V1beta1.
|
||||||
|
V1beta1() v1beta1.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
type group struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new Interface.
|
||||||
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
|
return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
|
}
|
||||||
|
|
||||||
|
// V1beta1 returns a new v1beta1.Interface.
|
||||||
|
func (g *group) V1beta1() v1beta1.Interface {
|
||||||
|
return v1beta1.New(g.factory, g.namespace, g.tweakListOptions)
|
||||||
|
}
|
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD
generated
vendored
Normal file
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"customresourcedefinition.go",
|
||||||
|
"interface.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
88
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/customresourcedefinition.go
generated
vendored
Normal file
88
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/customresourcedefinition.go
generated
vendored
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package v1beta1
|
||||||
|
|
||||||
|
import (
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
apiextensions_v1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces"
|
||||||
|
v1beta1 "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CustomResourceDefinitionInformer provides access to a shared informer and lister for
|
||||||
|
// CustomResourceDefinitions.
|
||||||
|
type CustomResourceDefinitionInformer interface {
|
||||||
|
Informer() cache.SharedIndexInformer
|
||||||
|
Lister() v1beta1.CustomResourceDefinitionLister
|
||||||
|
}
|
||||||
|
|
||||||
|
type customResourceDefinitionInformer struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCustomResourceDefinitionInformer constructs a new informer for CustomResourceDefinition type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewCustomResourceDefinitionInformer(client clientset.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredCustomResourceDefinitionInformer(client, resyncPeriod, indexers, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredCustomResourceDefinitionInformer constructs a new informer for CustomResourceDefinition type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewFilteredCustomResourceDefinitionInformer(client clientset.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
|
||||||
|
return cache.NewSharedIndexInformer(
|
||||||
|
&cache.ListWatch{
|
||||||
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
|
return client.ApiextensionsV1beta1().CustomResourceDefinitions().List(options)
|
||||||
|
},
|
||||||
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
|
return client.ApiextensionsV1beta1().CustomResourceDefinitions().Watch(options)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&apiextensions_v1beta1.CustomResourceDefinition{},
|
||||||
|
resyncPeriod,
|
||||||
|
indexers,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *customResourceDefinitionInformer) defaultInformer(client clientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredCustomResourceDefinitionInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *customResourceDefinitionInformer) Informer() cache.SharedIndexInformer {
|
||||||
|
return f.factory.InformerFor(&apiextensions_v1beta1.CustomResourceDefinition{}, f.defaultInformer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *customResourceDefinitionInformer) Lister() v1beta1.CustomResourceDefinitionLister {
|
||||||
|
return v1beta1.NewCustomResourceDefinitionLister(f.Informer().GetIndexer())
|
||||||
|
}
|
45
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/interface.go
generated
vendored
Normal file
45
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/interface.go
generated
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package v1beta1
|
||||||
|
|
||||||
|
import (
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface provides access to all the informers in this group version.
|
||||||
|
type Interface interface {
|
||||||
|
// CustomResourceDefinitions returns a CustomResourceDefinitionInformer.
|
||||||
|
CustomResourceDefinitions() CustomResourceDefinitionInformer
|
||||||
|
}
|
||||||
|
|
||||||
|
type version struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new Interface.
|
||||||
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
|
return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CustomResourceDefinitions returns a CustomResourceDefinitionInformer.
|
||||||
|
func (v *version) CustomResourceDefinitions() CustomResourceDefinitionInformer {
|
||||||
|
return &customResourceDefinitionInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
|
||||||
|
}
|
131
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/factory.go
generated
vendored
Normal file
131
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/factory.go
generated
vendored
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package externalversions
|
||||||
|
|
||||||
|
import (
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions"
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
type sharedInformerFactory struct {
|
||||||
|
client clientset.Interface
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
lock sync.Mutex
|
||||||
|
defaultResync time.Duration
|
||||||
|
|
||||||
|
informers map[reflect.Type]cache.SharedIndexInformer
|
||||||
|
// startedInformers is used for tracking which informers have been started.
|
||||||
|
// This allows Start() to be called multiple times safely.
|
||||||
|
startedInformers map[reflect.Type]bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSharedInformerFactory constructs a new instance of sharedInformerFactory
|
||||||
|
func NewSharedInformerFactory(client clientset.Interface, defaultResync time.Duration) SharedInformerFactory {
|
||||||
|
return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory.
|
||||||
|
// Listers obtained via this SharedInformerFactory will be subject to the same filters
|
||||||
|
// as specified here.
|
||||||
|
func NewFilteredSharedInformerFactory(client clientset.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
|
||||||
|
return &sharedInformerFactory{
|
||||||
|
client: client,
|
||||||
|
namespace: namespace,
|
||||||
|
tweakListOptions: tweakListOptions,
|
||||||
|
defaultResync: defaultResync,
|
||||||
|
informers: make(map[reflect.Type]cache.SharedIndexInformer),
|
||||||
|
startedInformers: make(map[reflect.Type]bool),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start initializes all requested informers.
|
||||||
|
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
for informerType, informer := range f.informers {
|
||||||
|
if !f.startedInformers[informerType] {
|
||||||
|
go informer.Run(stopCh)
|
||||||
|
f.startedInformers[informerType] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitForCacheSync waits for all started informers' cache were synced.
|
||||||
|
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
|
||||||
|
informers := func() map[reflect.Type]cache.SharedIndexInformer {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
informers := map[reflect.Type]cache.SharedIndexInformer{}
|
||||||
|
for informerType, informer := range f.informers {
|
||||||
|
if f.startedInformers[informerType] {
|
||||||
|
informers[informerType] = informer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return informers
|
||||||
|
}()
|
||||||
|
|
||||||
|
res := map[reflect.Type]bool{}
|
||||||
|
for informType, informer := range informers {
|
||||||
|
res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// InternalInformerFor returns the SharedIndexInformer for obj using an internal
|
||||||
|
// client.
|
||||||
|
func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
informerType := reflect.TypeOf(obj)
|
||||||
|
informer, exists := f.informers[informerType]
|
||||||
|
if exists {
|
||||||
|
return informer
|
||||||
|
}
|
||||||
|
informer = newFunc(f.client, f.defaultResync)
|
||||||
|
f.informers[informerType] = informer
|
||||||
|
|
||||||
|
return informer
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedInformerFactory provides shared informers for resources in all known
|
||||||
|
// API group versions.
|
||||||
|
type SharedInformerFactory interface {
|
||||||
|
internalinterfaces.SharedInformerFactory
|
||||||
|
ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
|
||||||
|
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
|
||||||
|
|
||||||
|
Apiextensions() apiextensions.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *sharedInformerFactory) Apiextensions() apiextensions.Interface {
|
||||||
|
return apiextensions.New(f, f.namespace, f.tweakListOptions)
|
||||||
|
}
|
62
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/generic.go
generated
vendored
Normal file
62
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/generic.go
generated
vendored
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package externalversions
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
v1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GenericInformer is type of SharedIndexInformer which will locate and delegate to other
|
||||||
|
// sharedInformers based on type
|
||||||
|
type GenericInformer interface {
|
||||||
|
Informer() cache.SharedIndexInformer
|
||||||
|
Lister() cache.GenericLister
|
||||||
|
}
|
||||||
|
|
||||||
|
type genericInformer struct {
|
||||||
|
informer cache.SharedIndexInformer
|
||||||
|
resource schema.GroupResource
|
||||||
|
}
|
||||||
|
|
||||||
|
// Informer returns the SharedIndexInformer.
|
||||||
|
func (f *genericInformer) Informer() cache.SharedIndexInformer {
|
||||||
|
return f.informer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lister returns the GenericLister.
|
||||||
|
func (f *genericInformer) Lister() cache.GenericLister {
|
||||||
|
return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ForResource gives generic access to a shared informer of the matching type
|
||||||
|
// TODO extend this to unknown resources with a client pool
|
||||||
|
func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
|
||||||
|
switch resource {
|
||||||
|
// Group=apiextensions.k8s.io, Version=v1beta1
|
||||||
|
case v1beta1.SchemeGroupVersion.WithResource("customresourcedefinitions"):
|
||||||
|
return &genericInformer{resource: resource.GroupResource(), informer: f.Apiextensions().V1beta1().CustomResourceDefinitions().Informer()}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("no informer found for %v", resource)
|
||||||
|
}
|
31
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD
generated
vendored
Normal file
31
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["factory_interfaces.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
generated
vendored
Normal file
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package internalinterfaces
|
||||||
|
|
||||||
|
import (
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
clientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NewInformerFunc func(clientset.Interface, time.Duration) cache.SharedIndexInformer
|
||||||
|
|
||||||
|
// SharedInformerFactory a small interface to allow for adding an informer without an import cycle
|
||||||
|
type SharedInformerFactory interface {
|
||||||
|
Start(stopCh <-chan struct{})
|
||||||
|
InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
|
||||||
|
}
|
||||||
|
|
||||||
|
type TweakListOptionsFunc func(*v1.ListOptions)
|
42
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD
generated
vendored
Normal file
42
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"factory.go",
|
||||||
|
"generic.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions:all-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
32
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD
generated
vendored
Normal file
32
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["interface.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
46
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/interface.go
generated
vendored
Normal file
46
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/interface.go
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package apiextensions
|
||||||
|
|
||||||
|
import (
|
||||||
|
internalversion "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion"
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface provides access to each of this group's versions.
|
||||||
|
type Interface interface {
|
||||||
|
// InternalVersion provides access to shared informers for resources in InternalVersion.
|
||||||
|
InternalVersion() internalversion.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
type group struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new Interface.
|
||||||
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
|
return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InternalVersion returns a new internalversion.Interface.
|
||||||
|
func (g *group) InternalVersion() internalversion.Interface {
|
||||||
|
return internalversion.New(g.factory, g.namespace, g.tweakListOptions)
|
||||||
|
}
|
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD
generated
vendored
Normal file
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"customresourcedefinition.go",
|
||||||
|
"interface.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
88
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/customresourcedefinition.go
generated
vendored
Normal file
88
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/customresourcedefinition.go
generated
vendored
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
internalclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset"
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces"
|
||||||
|
internalversion "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
watch "k8s.io/apimachinery/pkg/watch"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CustomResourceDefinitionInformer provides access to a shared informer and lister for
|
||||||
|
// CustomResourceDefinitions.
|
||||||
|
type CustomResourceDefinitionInformer interface {
|
||||||
|
Informer() cache.SharedIndexInformer
|
||||||
|
Lister() internalversion.CustomResourceDefinitionLister
|
||||||
|
}
|
||||||
|
|
||||||
|
type customResourceDefinitionInformer struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCustomResourceDefinitionInformer constructs a new informer for CustomResourceDefinition type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewCustomResourceDefinitionInformer(client internalclientset.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredCustomResourceDefinitionInformer(client, resyncPeriod, indexers, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredCustomResourceDefinitionInformer constructs a new informer for CustomResourceDefinition type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewFilteredCustomResourceDefinitionInformer(client internalclientset.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
|
||||||
|
return cache.NewSharedIndexInformer(
|
||||||
|
&cache.ListWatch{
|
||||||
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
|
return client.Apiextensions().CustomResourceDefinitions().List(options)
|
||||||
|
},
|
||||||
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
|
return client.Apiextensions().CustomResourceDefinitions().Watch(options)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
&apiextensions.CustomResourceDefinition{},
|
||||||
|
resyncPeriod,
|
||||||
|
indexers,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *customResourceDefinitionInformer) defaultInformer(client internalclientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredCustomResourceDefinitionInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *customResourceDefinitionInformer) Informer() cache.SharedIndexInformer {
|
||||||
|
return f.factory.InformerFor(&apiextensions.CustomResourceDefinition{}, f.defaultInformer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *customResourceDefinitionInformer) Lister() internalversion.CustomResourceDefinitionLister {
|
||||||
|
return internalversion.NewCustomResourceDefinitionLister(f.Informer().GetIndexer())
|
||||||
|
}
|
45
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/interface.go
generated
vendored
Normal file
45
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/interface.go
generated
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface provides access to all the informers in this group version.
|
||||||
|
type Interface interface {
|
||||||
|
// CustomResourceDefinitions returns a CustomResourceDefinitionInformer.
|
||||||
|
CustomResourceDefinitions() CustomResourceDefinitionInformer
|
||||||
|
}
|
||||||
|
|
||||||
|
type version struct {
|
||||||
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new Interface.
|
||||||
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
|
return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CustomResourceDefinitions returns a CustomResourceDefinitionInformer.
|
||||||
|
func (v *version) CustomResourceDefinitions() CustomResourceDefinitionInformer {
|
||||||
|
return &customResourceDefinitionInformer{factory: v.factory, tweakListOptions: v.tweakListOptions}
|
||||||
|
}
|
131
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/factory.go
generated
vendored
Normal file
131
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/factory.go
generated
vendored
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
internalclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset"
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions"
|
||||||
|
internalinterfaces "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
type sharedInformerFactory struct {
|
||||||
|
client internalclientset.Interface
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
lock sync.Mutex
|
||||||
|
defaultResync time.Duration
|
||||||
|
|
||||||
|
informers map[reflect.Type]cache.SharedIndexInformer
|
||||||
|
// startedInformers is used for tracking which informers have been started.
|
||||||
|
// This allows Start() to be called multiple times safely.
|
||||||
|
startedInformers map[reflect.Type]bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSharedInformerFactory constructs a new instance of sharedInformerFactory
|
||||||
|
func NewSharedInformerFactory(client internalclientset.Interface, defaultResync time.Duration) SharedInformerFactory {
|
||||||
|
return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory.
|
||||||
|
// Listers obtained via this SharedInformerFactory will be subject to the same filters
|
||||||
|
// as specified here.
|
||||||
|
func NewFilteredSharedInformerFactory(client internalclientset.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
|
||||||
|
return &sharedInformerFactory{
|
||||||
|
client: client,
|
||||||
|
namespace: namespace,
|
||||||
|
tweakListOptions: tweakListOptions,
|
||||||
|
defaultResync: defaultResync,
|
||||||
|
informers: make(map[reflect.Type]cache.SharedIndexInformer),
|
||||||
|
startedInformers: make(map[reflect.Type]bool),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start initializes all requested informers.
|
||||||
|
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
for informerType, informer := range f.informers {
|
||||||
|
if !f.startedInformers[informerType] {
|
||||||
|
go informer.Run(stopCh)
|
||||||
|
f.startedInformers[informerType] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitForCacheSync waits for all started informers' cache were synced.
|
||||||
|
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
|
||||||
|
informers := func() map[reflect.Type]cache.SharedIndexInformer {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
informers := map[reflect.Type]cache.SharedIndexInformer{}
|
||||||
|
for informerType, informer := range f.informers {
|
||||||
|
if f.startedInformers[informerType] {
|
||||||
|
informers[informerType] = informer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return informers
|
||||||
|
}()
|
||||||
|
|
||||||
|
res := map[reflect.Type]bool{}
|
||||||
|
for informType, informer := range informers {
|
||||||
|
res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
// InternalInformerFor returns the SharedIndexInformer for obj using an internal
|
||||||
|
// client.
|
||||||
|
func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer {
|
||||||
|
f.lock.Lock()
|
||||||
|
defer f.lock.Unlock()
|
||||||
|
|
||||||
|
informerType := reflect.TypeOf(obj)
|
||||||
|
informer, exists := f.informers[informerType]
|
||||||
|
if exists {
|
||||||
|
return informer
|
||||||
|
}
|
||||||
|
informer = newFunc(f.client, f.defaultResync)
|
||||||
|
f.informers[informerType] = informer
|
||||||
|
|
||||||
|
return informer
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedInformerFactory provides shared informers for resources in all known
|
||||||
|
// API group versions.
|
||||||
|
type SharedInformerFactory interface {
|
||||||
|
internalinterfaces.SharedInformerFactory
|
||||||
|
ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
|
||||||
|
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
|
||||||
|
|
||||||
|
Apiextensions() apiextensions.Interface
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *sharedInformerFactory) Apiextensions() apiextensions.Interface {
|
||||||
|
return apiextensions.New(f, f.namespace, f.tweakListOptions)
|
||||||
|
}
|
62
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/generic.go
generated
vendored
Normal file
62
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/generic.go
generated
vendored
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GenericInformer is type of SharedIndexInformer which will locate and delegate to other
|
||||||
|
// sharedInformers based on type
|
||||||
|
type GenericInformer interface {
|
||||||
|
Informer() cache.SharedIndexInformer
|
||||||
|
Lister() cache.GenericLister
|
||||||
|
}
|
||||||
|
|
||||||
|
type genericInformer struct {
|
||||||
|
informer cache.SharedIndexInformer
|
||||||
|
resource schema.GroupResource
|
||||||
|
}
|
||||||
|
|
||||||
|
// Informer returns the SharedIndexInformer.
|
||||||
|
func (f *genericInformer) Informer() cache.SharedIndexInformer {
|
||||||
|
return f.informer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lister returns the GenericLister.
|
||||||
|
func (f *genericInformer) Lister() cache.GenericLister {
|
||||||
|
return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ForResource gives generic access to a shared informer of the matching type
|
||||||
|
// TODO extend this to unknown resources with a client pool
|
||||||
|
func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
|
||||||
|
switch resource {
|
||||||
|
// Group=apiextensions.k8s.io, Version=internalVersion
|
||||||
|
case apiextensions.SchemeGroupVersion.WithResource("customresourcedefinitions"):
|
||||||
|
return &genericInformer{resource: resource.GroupResource(), informer: f.Apiextensions().InternalVersion().CustomResourceDefinitions().Informer()}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("no informer found for %v", resource)
|
||||||
|
}
|
31
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD
generated
vendored
Normal file
31
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["factory_interfaces.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go
generated
vendored
Normal file
38
vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by informer-gen
|
||||||
|
|
||||||
|
package internalinterfaces
|
||||||
|
|
||||||
|
import (
|
||||||
|
time "time"
|
||||||
|
|
||||||
|
internalclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset"
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
cache "k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NewInformerFunc func(internalclientset.Interface, time.Duration) cache.SharedIndexInformer
|
||||||
|
|
||||||
|
// SharedInformerFactory a small interface to allow for adding an informer without an import cycle
|
||||||
|
type SharedInformerFactory interface {
|
||||||
|
Start(stopCh <-chan struct{})
|
||||||
|
InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
|
||||||
|
}
|
||||||
|
|
||||||
|
type TweakListOptionsFunc func(*v1.ListOptions)
|
34
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD
generated
vendored
Normal file
34
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"customresourcedefinition.go",
|
||||||
|
"expansion_generated.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
65
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/customresourcedefinition.go
generated
vendored
Normal file
65
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/customresourcedefinition.go
generated
vendored
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by lister-gen
|
||||||
|
|
||||||
|
package internalversion
|
||||||
|
|
||||||
|
import (
|
||||||
|
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CustomResourceDefinitionLister helps list CustomResourceDefinitions.
|
||||||
|
type CustomResourceDefinitionLister interface {
|
||||||
|
// List lists all CustomResourceDefinitions in the indexer.
|
||||||
|
List(selector labels.Selector) (ret []*apiextensions.CustomResourceDefinition, err error)
|
||||||
|
// Get retrieves the CustomResourceDefinition from the index for a given name.
|
||||||
|
Get(name string) (*apiextensions.CustomResourceDefinition, error)
|
||||||
|
CustomResourceDefinitionListerExpansion
|
||||||
|
}
|
||||||
|
|
||||||
|
// customResourceDefinitionLister implements the CustomResourceDefinitionLister interface.
|
||||||
|
type customResourceDefinitionLister struct {
|
||||||
|
indexer cache.Indexer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCustomResourceDefinitionLister returns a new CustomResourceDefinitionLister.
|
||||||
|
func NewCustomResourceDefinitionLister(indexer cache.Indexer) CustomResourceDefinitionLister {
|
||||||
|
return &customResourceDefinitionLister{indexer: indexer}
|
||||||
|
}
|
||||||
|
|
||||||
|
// List lists all CustomResourceDefinitions in the indexer.
|
||||||
|
func (s *customResourceDefinitionLister) List(selector labels.Selector) (ret []*apiextensions.CustomResourceDefinition, err error) {
|
||||||
|
err = cache.ListAll(s.indexer, selector, func(m interface{}) {
|
||||||
|
ret = append(ret, m.(*apiextensions.CustomResourceDefinition))
|
||||||
|
})
|
||||||
|
return ret, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves the CustomResourceDefinition from the index for a given name.
|
||||||
|
func (s *customResourceDefinitionLister) Get(name string) (*apiextensions.CustomResourceDefinition, error) {
|
||||||
|
obj, exists, err := s.indexer.GetByKey(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return nil, errors.NewNotFound(apiextensions.Resource("customresourcedefinition"), name)
|
||||||
|
}
|
||||||
|
return obj.(*apiextensions.CustomResourceDefinition), nil
|
||||||
|
}
|
23
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/expansion_generated.go
generated
vendored
Normal file
23
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/expansion_generated.go
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by lister-gen
|
||||||
|
|
||||||
|
package internalversion
|
||||||
|
|
||||||
|
// CustomResourceDefinitionListerExpansion allows custom methods to be added to
|
||||||
|
// CustomResourceDefinitionLister.
|
||||||
|
type CustomResourceDefinitionListerExpansion interface{}
|
34
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD
generated
vendored
Normal file
34
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"customresourcedefinition.go",
|
||||||
|
"expansion_generated.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
65
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/customresourcedefinition.go
generated
vendored
Normal file
65
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/customresourcedefinition.go
generated
vendored
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by lister-gen
|
||||||
|
|
||||||
|
package v1beta1
|
||||||
|
|
||||||
|
import (
|
||||||
|
v1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CustomResourceDefinitionLister helps list CustomResourceDefinitions.
|
||||||
|
type CustomResourceDefinitionLister interface {
|
||||||
|
// List lists all CustomResourceDefinitions in the indexer.
|
||||||
|
List(selector labels.Selector) (ret []*v1beta1.CustomResourceDefinition, err error)
|
||||||
|
// Get retrieves the CustomResourceDefinition from the index for a given name.
|
||||||
|
Get(name string) (*v1beta1.CustomResourceDefinition, error)
|
||||||
|
CustomResourceDefinitionListerExpansion
|
||||||
|
}
|
||||||
|
|
||||||
|
// customResourceDefinitionLister implements the CustomResourceDefinitionLister interface.
|
||||||
|
type customResourceDefinitionLister struct {
|
||||||
|
indexer cache.Indexer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCustomResourceDefinitionLister returns a new CustomResourceDefinitionLister.
|
||||||
|
func NewCustomResourceDefinitionLister(indexer cache.Indexer) CustomResourceDefinitionLister {
|
||||||
|
return &customResourceDefinitionLister{indexer: indexer}
|
||||||
|
}
|
||||||
|
|
||||||
|
// List lists all CustomResourceDefinitions in the indexer.
|
||||||
|
func (s *customResourceDefinitionLister) List(selector labels.Selector) (ret []*v1beta1.CustomResourceDefinition, err error) {
|
||||||
|
err = cache.ListAll(s.indexer, selector, func(m interface{}) {
|
||||||
|
ret = append(ret, m.(*v1beta1.CustomResourceDefinition))
|
||||||
|
})
|
||||||
|
return ret, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves the CustomResourceDefinition from the index for a given name.
|
||||||
|
func (s *customResourceDefinitionLister) Get(name string) (*v1beta1.CustomResourceDefinition, error) {
|
||||||
|
obj, exists, err := s.indexer.GetByKey(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return nil, errors.NewNotFound(v1beta1.Resource("customresourcedefinition"), name)
|
||||||
|
}
|
||||||
|
return obj.(*v1beta1.CustomResourceDefinition), nil
|
||||||
|
}
|
23
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/expansion_generated.go
generated
vendored
Normal file
23
vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/expansion_generated.go
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 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 automatically generated by lister-gen
|
||||||
|
|
||||||
|
package v1beta1
|
||||||
|
|
||||||
|
// CustomResourceDefinitionListerExpansion allows custom methods to be added to
|
||||||
|
// CustomResourceDefinitionLister.
|
||||||
|
type CustomResourceDefinitionListerExpansion interface{}
|
35
vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD
generated
vendored
Normal file
35
vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["start.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/cmd/server",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/server:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/server/options:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
139
vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go
generated
vendored
Normal file
139
vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go
generated
vendored
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apiserver"
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
|
genericregistry "k8s.io/apiserver/pkg/registry/generic"
|
||||||
|
genericapiserver "k8s.io/apiserver/pkg/server"
|
||||||
|
genericoptions "k8s.io/apiserver/pkg/server/options"
|
||||||
|
)
|
||||||
|
|
||||||
|
const defaultEtcdPathPrefix = "/registry/apiextensions.kubernetes.io"
|
||||||
|
|
||||||
|
type CustomResourceDefinitionsServerOptions struct {
|
||||||
|
RecommendedOptions *genericoptions.RecommendedOptions
|
||||||
|
|
||||||
|
StdOut io.Writer
|
||||||
|
StdErr io.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCustomResourceDefinitionsServerOptions(out, errOut io.Writer) *CustomResourceDefinitionsServerOptions {
|
||||||
|
o := &CustomResourceDefinitionsServerOptions{
|
||||||
|
RecommendedOptions: genericoptions.NewRecommendedOptions(defaultEtcdPathPrefix, apiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion)),
|
||||||
|
|
||||||
|
StdOut: out,
|
||||||
|
StdErr: errOut,
|
||||||
|
}
|
||||||
|
|
||||||
|
// the shared informer is not needed for kube-aggregator. Disable the kubeconfig flag and the client creation.
|
||||||
|
o.RecommendedOptions.CoreAPI = nil
|
||||||
|
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCommandStartCustomResourceDefinitionsServer(out, errOut io.Writer, stopCh <-chan struct{}) *cobra.Command {
|
||||||
|
o := NewCustomResourceDefinitionsServerOptions(out, errOut)
|
||||||
|
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Short: "Launch an API extensions API server",
|
||||||
|
Long: "Launch an API extensions API server",
|
||||||
|
RunE: func(c *cobra.Command, args []string) error {
|
||||||
|
if err := o.Complete(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := o.Validate(args); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := o.RunCustomResourceDefinitionsServer(stopCh); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
flags := cmd.Flags()
|
||||||
|
o.RecommendedOptions.AddFlags(flags)
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o CustomResourceDefinitionsServerOptions) Validate(args []string) error {
|
||||||
|
errors := []error{}
|
||||||
|
errors = append(errors, o.RecommendedOptions.Validate()...)
|
||||||
|
return utilerrors.NewAggregate(errors)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *CustomResourceDefinitionsServerOptions) Complete() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, error) {
|
||||||
|
// TODO have a "real" external address
|
||||||
|
if err := o.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil {
|
||||||
|
return nil, fmt.Errorf("error creating self-signed certificates: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs)
|
||||||
|
if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
config := &apiserver.Config{
|
||||||
|
GenericConfig: serverConfig,
|
||||||
|
ExtraConfig: apiserver.ExtraConfig{
|
||||||
|
CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCRDRESTOptionsGetter(etcdOptions genericoptions.EtcdOptions) genericregistry.RESTOptionsGetter {
|
||||||
|
ret := apiserver.CRDRESTOptionsGetter{
|
||||||
|
StorageConfig: etcdOptions.StorageConfig,
|
||||||
|
StoragePrefix: etcdOptions.StorageConfig.Prefix,
|
||||||
|
EnableWatchCache: etcdOptions.EnableWatchCache,
|
||||||
|
DefaultWatchCacheSize: etcdOptions.DefaultWatchCacheSize,
|
||||||
|
EnableGarbageCollection: etcdOptions.EnableGarbageCollection,
|
||||||
|
DeleteCollectionWorkers: etcdOptions.DeleteCollectionWorkers,
|
||||||
|
}
|
||||||
|
ret.StorageConfig.Codec = unstructured.UnstructuredJSONScheme
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o CustomResourceDefinitionsServerOptions) RunCustomResourceDefinitionsServer(stopCh <-chan struct{}) error {
|
||||||
|
config, err := o.Config()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
server, err := config.Complete().New(genericapiserver.EmptyDelegate)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return server.GenericAPIServer.PrepareRun().Run(stopCh)
|
||||||
|
}
|
43
vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD
generated
vendored
Normal file
43
vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["crd_finalizer.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/controller/finalizer",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/util/workqueue:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
327
vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go
generated
vendored
Normal file
327
vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/crd_finalizer.go
generated
vendored
Normal file
|
@ -0,0 +1,327 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 finalizer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion"
|
||||||
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion"
|
||||||
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CRDFinalizer is a controller that finalizes the CRD by deleting all the CRs associated with it.
|
||||||
|
type CRDFinalizer struct {
|
||||||
|
crdClient client.CustomResourceDefinitionsGetter
|
||||||
|
crClientGetter CRClientGetter
|
||||||
|
|
||||||
|
crdLister listers.CustomResourceDefinitionLister
|
||||||
|
crdSynced cache.InformerSynced
|
||||||
|
|
||||||
|
// To allow injection for testing.
|
||||||
|
syncFn func(key string) error
|
||||||
|
|
||||||
|
queue workqueue.RateLimitingInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListerCollectionDeleter combines rest.Lister and rest.CollectionDeleter.
|
||||||
|
type ListerCollectionDeleter interface {
|
||||||
|
rest.Lister
|
||||||
|
rest.CollectionDeleter
|
||||||
|
}
|
||||||
|
|
||||||
|
// CRClientGetter knows how to get a ListerCollectionDeleter for a given CRD UID.
|
||||||
|
type CRClientGetter interface {
|
||||||
|
// GetCustomResourceListerCollectionDeleter gets the ListerCollectionDeleter for the given CRD
|
||||||
|
// UID.
|
||||||
|
GetCustomResourceListerCollectionDeleter(crd *apiextensions.CustomResourceDefinition) ListerCollectionDeleter
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCRDFinalizer creates a new CRDFinalizer.
|
||||||
|
func NewCRDFinalizer(
|
||||||
|
crdInformer informers.CustomResourceDefinitionInformer,
|
||||||
|
crdClient client.CustomResourceDefinitionsGetter,
|
||||||
|
crClientGetter CRClientGetter,
|
||||||
|
) *CRDFinalizer {
|
||||||
|
c := &CRDFinalizer{
|
||||||
|
crdClient: crdClient,
|
||||||
|
crdLister: crdInformer.Lister(),
|
||||||
|
crdSynced: crdInformer.Informer().HasSynced,
|
||||||
|
crClientGetter: crClientGetter,
|
||||||
|
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CustomResourceDefinition-CRDFinalizer"),
|
||||||
|
}
|
||||||
|
|
||||||
|
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
AddFunc: c.addCustomResourceDefinition,
|
||||||
|
UpdateFunc: c.updateCustomResourceDefinition,
|
||||||
|
})
|
||||||
|
|
||||||
|
c.syncFn = c.sync
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) sync(key string) error {
|
||||||
|
cachedCRD, err := c.crdLister.Get(key)
|
||||||
|
if apierrors.IsNotFound(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// no work to do
|
||||||
|
if cachedCRD.DeletionTimestamp.IsZero() || !apiextensions.CRDHasFinalizer(cachedCRD, apiextensions.CustomResourceCleanupFinalizer) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
crd := cachedCRD.DeepCopy()
|
||||||
|
|
||||||
|
// update the status condition. This cleanup could take a while.
|
||||||
|
apiextensions.SetCRDCondition(crd, apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InstanceDeletionInProgress",
|
||||||
|
Message: "CustomResource deletion is in progress",
|
||||||
|
})
|
||||||
|
crd, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we can start deleting items. We should use the REST API to ensure that all normal admission runs.
|
||||||
|
// Since we control the endpoints, we know that delete collection works. No need to delete if not established.
|
||||||
|
if apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) {
|
||||||
|
cond, deleteErr := c.deleteInstances(crd)
|
||||||
|
apiextensions.SetCRDCondition(crd, cond)
|
||||||
|
if deleteErr != nil {
|
||||||
|
crd, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
||||||
|
if err != nil {
|
||||||
|
utilruntime.HandleError(err)
|
||||||
|
}
|
||||||
|
return deleteErr
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
apiextensions.SetCRDCondition(crd, apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionFalse,
|
||||||
|
Reason: "NeverEstablished",
|
||||||
|
Message: "resource was never established",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
apiextensions.CRDRemoveFinalizer(crd, apiextensions.CustomResourceCleanupFinalizer)
|
||||||
|
crd, err = c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// and now issue another delete, which should clean it all up if no finalizers remain or no-op if they do
|
||||||
|
return c.crdClient.CustomResourceDefinitions().Delete(crd.Name, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) deleteInstances(crd *apiextensions.CustomResourceDefinition) (apiextensions.CustomResourceDefinitionCondition, error) {
|
||||||
|
// Now we can start deleting items. While it would be ideal to use a REST API client, doing so
|
||||||
|
// could incorrectly delete a ThirdPartyResource with the same URL as the CustomResource, so we go
|
||||||
|
// directly to the storage instead. Since we control the storage, we know that delete collection works.
|
||||||
|
crClient := c.crClientGetter.GetCustomResourceListerCollectionDeleter(crd)
|
||||||
|
if crClient == nil {
|
||||||
|
err := fmt.Errorf("unable to find a custom resource client for %s.%s", crd.Status.AcceptedNames.Plural, crd.Spec.Group)
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InstanceDeletionFailed",
|
||||||
|
Message: fmt.Sprintf("could not list instances: %v", err),
|
||||||
|
}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := genericapirequest.NewContext()
|
||||||
|
allResources, err := crClient.List(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InstanceDeletionFailed",
|
||||||
|
Message: fmt.Sprintf("could not list instances: %v", err),
|
||||||
|
}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
deletedNamespaces := sets.String{}
|
||||||
|
deleteErrors := []error{}
|
||||||
|
for _, item := range allResources.(*unstructured.UnstructuredList).Items {
|
||||||
|
metadata, err := meta.Accessor(&item)
|
||||||
|
if err != nil {
|
||||||
|
utilruntime.HandleError(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if deletedNamespaces.Has(metadata.GetNamespace()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// don't retry deleting the same namespace
|
||||||
|
deletedNamespaces.Insert(metadata.GetNamespace())
|
||||||
|
nsCtx := genericapirequest.WithNamespace(ctx, metadata.GetNamespace())
|
||||||
|
if _, err := crClient.DeleteCollection(nsCtx, nil, nil); err != nil {
|
||||||
|
deleteErrors = append(deleteErrors, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if deleteError := utilerrors.NewAggregate(deleteErrors); deleteError != nil {
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InstanceDeletionFailed",
|
||||||
|
Message: fmt.Sprintf("could not issue all deletes: %v", deleteError),
|
||||||
|
}, deleteError
|
||||||
|
}
|
||||||
|
|
||||||
|
// now we need to wait until all the resources are deleted. Start with a simple poll before we do anything fancy.
|
||||||
|
// TODO not all servers are synchronized on caches. It is possible for a stale one to still be creating things.
|
||||||
|
// Once we have a mechanism for servers to indicate their states, we should check that for concurrence.
|
||||||
|
err = wait.PollImmediate(5*time.Second, 1*time.Minute, func() (bool, error) {
|
||||||
|
listObj, err := crClient.List(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if len(listObj.(*unstructured.UnstructuredList).Items) == 0 {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
glog.V(2).Infof("%s.%s waiting for %d items to be removed", crd.Status.AcceptedNames.Plural, crd.Spec.Group, len(listObj.(*unstructured.UnstructuredList).Items))
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InstanceDeletionCheck",
|
||||||
|
Message: fmt.Sprintf("could not confirm zero CustomResources remaining: %v", err),
|
||||||
|
}, err
|
||||||
|
}
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Terminating,
|
||||||
|
Status: apiextensions.ConditionFalse,
|
||||||
|
Reason: "InstanceDeletionCompleted",
|
||||||
|
Message: "removed all instances",
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) Run(workers int, stopCh <-chan struct{}) {
|
||||||
|
defer utilruntime.HandleCrash()
|
||||||
|
defer c.queue.ShutDown()
|
||||||
|
|
||||||
|
glog.Infof("Starting CRDFinalizer")
|
||||||
|
defer glog.Infof("Shutting down CRDFinalizer")
|
||||||
|
|
||||||
|
if !cache.WaitForCacheSync(stopCh, c.crdSynced) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < workers; i++ {
|
||||||
|
go wait.Until(c.runWorker, time.Second, stopCh)
|
||||||
|
}
|
||||||
|
|
||||||
|
<-stopCh
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) runWorker() {
|
||||||
|
for c.processNextWorkItem() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// processNextWorkItem deals with one key off the queue. It returns false when it's time to quit.
|
||||||
|
func (c *CRDFinalizer) processNextWorkItem() bool {
|
||||||
|
key, quit := c.queue.Get()
|
||||||
|
if quit {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer c.queue.Done(key)
|
||||||
|
|
||||||
|
err := c.syncFn(key.(string))
|
||||||
|
if err == nil {
|
||||||
|
c.queue.Forget(key)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
utilruntime.HandleError(fmt.Errorf("%v failed with: %v", key, err))
|
||||||
|
c.queue.AddRateLimited(key)
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
||||||
|
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
||||||
|
if err != nil {
|
||||||
|
utilruntime.HandleError(fmt.Errorf("Couldn't get key for object %#v: %v", obj, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.queue.Add(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) addCustomResourceDefinition(obj interface{}) {
|
||||||
|
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
// only queue deleted things
|
||||||
|
if !castObj.DeletionTimestamp.IsZero() && apiextensions.CRDHasFinalizer(castObj, apiextensions.CustomResourceCleanupFinalizer) {
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CRDFinalizer) updateCustomResourceDefinition(oldObj, newObj interface{}) {
|
||||||
|
oldCRD := oldObj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
newCRD := newObj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
// only queue deleted things that haven't been finalized by us
|
||||||
|
if newCRD.DeletionTimestamp.IsZero() || !apiextensions.CRDHasFinalizer(newCRD, apiextensions.CustomResourceCleanupFinalizer) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// always requeue resyncs just in case
|
||||||
|
if oldCRD.ResourceVersion == newCRD.ResourceVersion {
|
||||||
|
c.enqueue(newCRD)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the only difference is in the terminating condition, then there's no reason to requeue here. This controller
|
||||||
|
// is likely to be the originator, so requeuing would hot-loop us. Failures are requeued by the workqueue directly.
|
||||||
|
// This is a low traffic and scale resource, so the copy is terrible. It's not good, so better ideas
|
||||||
|
// are welcome.
|
||||||
|
oldCopy := oldCRD.DeepCopy()
|
||||||
|
newCopy := newCRD.DeepCopy()
|
||||||
|
oldCopy.ResourceVersion = ""
|
||||||
|
newCopy.ResourceVersion = ""
|
||||||
|
apiextensions.RemoveCRDCondition(oldCopy, apiextensions.Terminating)
|
||||||
|
apiextensions.RemoveCRDCondition(newCopy, apiextensions.Terminating)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(oldCopy, newCopy) {
|
||||||
|
c.enqueue(newCRD)
|
||||||
|
}
|
||||||
|
}
|
54
vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD
generated
vendored
Normal file
54
vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["naming_controller_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/controller/status",
|
||||||
|
deps = [
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["naming_controller.go"],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/controller/status",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/util/workqueue:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
364
vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go
generated
vendored
Normal file
364
vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go
generated
vendored
Normal file
|
@ -0,0 +1,364 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 status
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/util/workqueue"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
client "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion"
|
||||||
|
informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion"
|
||||||
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
|
||||||
|
)
|
||||||
|
|
||||||
|
// This controller is reserving names. To avoid conflicts, be sure to run only one instance of the worker at a time.
|
||||||
|
// This could eventually be lifted, but starting simple.
|
||||||
|
type NamingConditionController struct {
|
||||||
|
crdClient client.CustomResourceDefinitionsGetter
|
||||||
|
|
||||||
|
crdLister listers.CustomResourceDefinitionLister
|
||||||
|
crdSynced cache.InformerSynced
|
||||||
|
// crdMutationCache backs our lister and keeps track of committed updates to avoid racy
|
||||||
|
// write/lookup cycles. It's got 100 slots by default, so it unlikely to overrun
|
||||||
|
// TODO to revisit this if naming conflicts are found to occur in the wild
|
||||||
|
crdMutationCache cache.MutationCache
|
||||||
|
|
||||||
|
// To allow injection for testing.
|
||||||
|
syncFn func(key string) error
|
||||||
|
|
||||||
|
queue workqueue.RateLimitingInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNamingConditionController(
|
||||||
|
crdInformer informers.CustomResourceDefinitionInformer,
|
||||||
|
crdClient client.CustomResourceDefinitionsGetter,
|
||||||
|
) *NamingConditionController {
|
||||||
|
c := &NamingConditionController{
|
||||||
|
crdClient: crdClient,
|
||||||
|
crdLister: crdInformer.Lister(),
|
||||||
|
crdSynced: crdInformer.Informer().HasSynced,
|
||||||
|
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "CustomResourceDefinition-NamingConditionController"),
|
||||||
|
}
|
||||||
|
|
||||||
|
informerIndexer := crdInformer.Informer().GetIndexer()
|
||||||
|
c.crdMutationCache = cache.NewIntegerResourceVersionMutationCache(informerIndexer, informerIndexer, 60*time.Second, false)
|
||||||
|
|
||||||
|
crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
||||||
|
AddFunc: c.addCustomResourceDefinition,
|
||||||
|
UpdateFunc: c.updateCustomResourceDefinition,
|
||||||
|
DeleteFunc: c.deleteCustomResourceDefinition,
|
||||||
|
})
|
||||||
|
|
||||||
|
c.syncFn = c.sync
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) getAcceptedNamesForGroup(group string) (allResources sets.String, allKinds sets.String) {
|
||||||
|
allResources = sets.String{}
|
||||||
|
allKinds = sets.String{}
|
||||||
|
|
||||||
|
list, err := c.crdLister.List(labels.Everything())
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, curr := range list {
|
||||||
|
if curr.Spec.Group != group {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// for each item here, see if we have a mutation cache entry that is more recent
|
||||||
|
// this makes sure that if we tight loop on update and run, our mutation cache will show
|
||||||
|
// us the version of the objects we just updated to.
|
||||||
|
item := curr
|
||||||
|
obj, exists, err := c.crdMutationCache.GetByKey(curr.Name)
|
||||||
|
if exists && err == nil {
|
||||||
|
item = obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
}
|
||||||
|
|
||||||
|
allResources.Insert(item.Status.AcceptedNames.Plural)
|
||||||
|
allResources.Insert(item.Status.AcceptedNames.Singular)
|
||||||
|
allResources.Insert(item.Status.AcceptedNames.ShortNames...)
|
||||||
|
|
||||||
|
allKinds.Insert(item.Status.AcceptedNames.Kind)
|
||||||
|
allKinds.Insert(item.Status.AcceptedNames.ListKind)
|
||||||
|
}
|
||||||
|
|
||||||
|
return allResources, allKinds
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) calculateNamesAndConditions(in *apiextensions.CustomResourceDefinition) (apiextensions.CustomResourceDefinitionNames, apiextensions.CustomResourceDefinitionCondition, apiextensions.CustomResourceDefinitionCondition) {
|
||||||
|
// Get the names that have already been claimed
|
||||||
|
allResources, allKinds := c.getAcceptedNamesForGroup(in.Spec.Group)
|
||||||
|
|
||||||
|
namesAcceptedCondition := apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.NamesAccepted,
|
||||||
|
Status: apiextensions.ConditionUnknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
requestedNames := in.Spec.Names
|
||||||
|
acceptedNames := in.Status.AcceptedNames
|
||||||
|
newNames := in.Status.AcceptedNames
|
||||||
|
|
||||||
|
// Check each name for mismatches. If there's a mismatch between spec and status, then try to deconflict.
|
||||||
|
// Continue on errors so that the status is the best match possible
|
||||||
|
if err := equalToAcceptedOrFresh(requestedNames.Plural, acceptedNames.Plural, allResources); err != nil {
|
||||||
|
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
||||||
|
namesAcceptedCondition.Reason = "PluralConflict"
|
||||||
|
namesAcceptedCondition.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
newNames.Plural = requestedNames.Plural
|
||||||
|
}
|
||||||
|
if err := equalToAcceptedOrFresh(requestedNames.Singular, acceptedNames.Singular, allResources); err != nil {
|
||||||
|
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
||||||
|
namesAcceptedCondition.Reason = "SingularConflict"
|
||||||
|
namesAcceptedCondition.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
newNames.Singular = requestedNames.Singular
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(requestedNames.ShortNames, acceptedNames.ShortNames) {
|
||||||
|
errs := []error{}
|
||||||
|
existingShortNames := sets.NewString(acceptedNames.ShortNames...)
|
||||||
|
for _, shortName := range requestedNames.ShortNames {
|
||||||
|
// if the shortname is already ours, then we're fine
|
||||||
|
if existingShortNames.Has(shortName) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := equalToAcceptedOrFresh(shortName, "", allResources); err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if err := utilerrors.NewAggregate(errs); err != nil {
|
||||||
|
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
||||||
|
namesAcceptedCondition.Reason = "ShortNamesConflict"
|
||||||
|
namesAcceptedCondition.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
newNames.ShortNames = requestedNames.ShortNames
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := equalToAcceptedOrFresh(requestedNames.Kind, acceptedNames.Kind, allKinds); err != nil {
|
||||||
|
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
||||||
|
namesAcceptedCondition.Reason = "KindConflict"
|
||||||
|
namesAcceptedCondition.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
newNames.Kind = requestedNames.Kind
|
||||||
|
}
|
||||||
|
if err := equalToAcceptedOrFresh(requestedNames.ListKind, acceptedNames.ListKind, allKinds); err != nil {
|
||||||
|
namesAcceptedCondition.Status = apiextensions.ConditionFalse
|
||||||
|
namesAcceptedCondition.Reason = "ListKindConflict"
|
||||||
|
namesAcceptedCondition.Message = err.Error()
|
||||||
|
} else {
|
||||||
|
newNames.ListKind = requestedNames.ListKind
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we haven't changed the condition, then our names must be good.
|
||||||
|
if namesAcceptedCondition.Status == apiextensions.ConditionUnknown {
|
||||||
|
namesAcceptedCondition.Status = apiextensions.ConditionTrue
|
||||||
|
namesAcceptedCondition.Reason = "NoConflicts"
|
||||||
|
namesAcceptedCondition.Message = "no conflicts found"
|
||||||
|
}
|
||||||
|
|
||||||
|
// set EstablishedCondition to true if all names are accepted. Never set it back to false.
|
||||||
|
establishedCondition := apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Established,
|
||||||
|
Status: apiextensions.ConditionFalse,
|
||||||
|
Reason: "NotAccepted",
|
||||||
|
Message: "not all names are accepted",
|
||||||
|
}
|
||||||
|
if old := apiextensions.FindCRDCondition(in, apiextensions.Established); old != nil {
|
||||||
|
establishedCondition = *old
|
||||||
|
}
|
||||||
|
if establishedCondition.Status != apiextensions.ConditionTrue && namesAcceptedCondition.Status == apiextensions.ConditionTrue {
|
||||||
|
establishedCondition = apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Established,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InitialNamesAccepted",
|
||||||
|
Message: "the initial names have been accepted",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newNames, namesAcceptedCondition, establishedCondition
|
||||||
|
}
|
||||||
|
|
||||||
|
func equalToAcceptedOrFresh(requestedName, acceptedName string, usedNames sets.String) error {
|
||||||
|
if requestedName == acceptedName {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !usedNames.Has(requestedName) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("%q is already in use", requestedName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) sync(key string) error {
|
||||||
|
inCustomResourceDefinition, err := c.crdLister.Get(key)
|
||||||
|
if apierrors.IsNotFound(err) {
|
||||||
|
// CRD was deleted and has freed its names.
|
||||||
|
// Reconsider all other CRDs in the same group.
|
||||||
|
if err := c.requeueAllOtherGroupCRDs(key); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
acceptedNames, namingCondition, establishedCondition := c.calculateNamesAndConditions(inCustomResourceDefinition)
|
||||||
|
|
||||||
|
// nothing to do if accepted names and NamesAccepted condition didn't change
|
||||||
|
if reflect.DeepEqual(inCustomResourceDefinition.Status.AcceptedNames, acceptedNames) &&
|
||||||
|
apiextensions.IsCRDConditionEquivalent(&namingCondition, apiextensions.FindCRDCondition(inCustomResourceDefinition, apiextensions.NamesAccepted)) &&
|
||||||
|
apiextensions.IsCRDConditionEquivalent(&establishedCondition, apiextensions.FindCRDCondition(inCustomResourceDefinition, apiextensions.Established)) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
crd := inCustomResourceDefinition.DeepCopy()
|
||||||
|
crd.Status.AcceptedNames = acceptedNames
|
||||||
|
apiextensions.SetCRDCondition(crd, namingCondition)
|
||||||
|
apiextensions.SetCRDCondition(crd, establishedCondition)
|
||||||
|
|
||||||
|
updatedObj, err := c.crdClient.CustomResourceDefinitions().UpdateStatus(crd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the update was successful, go ahead and add the entry to the mutation cache
|
||||||
|
c.crdMutationCache.Mutation(updatedObj)
|
||||||
|
|
||||||
|
// we updated our status, so we may be releasing a name. When this happens, we need to rekick everything in our group
|
||||||
|
// if we fail to rekick, just return as normal. We'll get everything on a resync
|
||||||
|
if err := c.requeueAllOtherGroupCRDs(key); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) Run(stopCh <-chan struct{}) {
|
||||||
|
defer utilruntime.HandleCrash()
|
||||||
|
defer c.queue.ShutDown()
|
||||||
|
|
||||||
|
glog.Infof("Starting NamingConditionController")
|
||||||
|
defer glog.Infof("Shutting down NamingConditionController")
|
||||||
|
|
||||||
|
if !cache.WaitForCacheSync(stopCh, c.crdSynced) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// only start one worker thread since its a slow moving API and the naming conflict resolution bits aren't thread-safe
|
||||||
|
go wait.Until(c.runWorker, time.Second, stopCh)
|
||||||
|
|
||||||
|
<-stopCh
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) runWorker() {
|
||||||
|
for c.processNextWorkItem() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// processNextWorkItem deals with one key off the queue. It returns false when it's time to quit.
|
||||||
|
func (c *NamingConditionController) processNextWorkItem() bool {
|
||||||
|
key, quit := c.queue.Get()
|
||||||
|
if quit {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
defer c.queue.Done(key)
|
||||||
|
|
||||||
|
err := c.syncFn(key.(string))
|
||||||
|
if err == nil {
|
||||||
|
c.queue.Forget(key)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
utilruntime.HandleError(fmt.Errorf("%v failed with: %v", key, err))
|
||||||
|
c.queue.AddRateLimited(key)
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) enqueue(obj *apiextensions.CustomResourceDefinition) {
|
||||||
|
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
|
||||||
|
if err != nil {
|
||||||
|
utilruntime.HandleError(fmt.Errorf("Couldn't get key for object %#v: %v", obj, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.queue.Add(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) addCustomResourceDefinition(obj interface{}) {
|
||||||
|
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
glog.V(4).Infof("Adding %s", castObj.Name)
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) updateCustomResourceDefinition(obj, _ interface{}) {
|
||||||
|
castObj := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
glog.V(4).Infof("Updating %s", castObj.Name)
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) deleteCustomResourceDefinition(obj interface{}) {
|
||||||
|
castObj, ok := obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
if !ok {
|
||||||
|
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
|
||||||
|
if !ok {
|
||||||
|
glog.Errorf("Couldn't get object from tombstone %#v", obj)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
castObj, ok = tombstone.Obj.(*apiextensions.CustomResourceDefinition)
|
||||||
|
if !ok {
|
||||||
|
glog.Errorf("Tombstone contained object that is not expected %#v", obj)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glog.V(4).Infof("Deleting %q", castObj.Name)
|
||||||
|
c.enqueue(castObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *NamingConditionController) requeueAllOtherGroupCRDs(name string) error {
|
||||||
|
pluralGroup := strings.SplitN(name, ".", 2)
|
||||||
|
list, err := c.crdLister.List(labels.Everything())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, curr := range list {
|
||||||
|
if curr.Spec.Group == pluralGroup[1] && curr.Name != name {
|
||||||
|
c.queue.Add(curr.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
337
vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller_test.go
generated
vendored
Normal file
337
vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller_test.go
generated
vendored
Normal file
|
@ -0,0 +1,337 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 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 status
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
|
||||||
|
listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/client-go/tools/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
type crdBuilder struct {
|
||||||
|
curr apiextensions.CustomResourceDefinition
|
||||||
|
}
|
||||||
|
|
||||||
|
func newCRD(name string) *crdBuilder {
|
||||||
|
tokens := strings.SplitN(name, ".", 2)
|
||||||
|
return &crdBuilder{
|
||||||
|
curr: apiextensions.CustomResourceDefinition{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: name},
|
||||||
|
Spec: apiextensions.CustomResourceDefinitionSpec{
|
||||||
|
Group: tokens[1],
|
||||||
|
Names: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: tokens[0],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *crdBuilder) SpecNames(plural, singular, kind, listKind string, shortNames ...string) *crdBuilder {
|
||||||
|
b.curr.Spec.Names.Plural = plural
|
||||||
|
b.curr.Spec.Names.Singular = singular
|
||||||
|
b.curr.Spec.Names.Kind = kind
|
||||||
|
b.curr.Spec.Names.ListKind = listKind
|
||||||
|
b.curr.Spec.Names.ShortNames = shortNames
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *crdBuilder) StatusNames(plural, singular, kind, listKind string, shortNames ...string) *crdBuilder {
|
||||||
|
b.curr.Status.AcceptedNames.Plural = plural
|
||||||
|
b.curr.Status.AcceptedNames.Singular = singular
|
||||||
|
b.curr.Status.AcceptedNames.Kind = kind
|
||||||
|
b.curr.Status.AcceptedNames.ListKind = listKind
|
||||||
|
b.curr.Status.AcceptedNames.ShortNames = shortNames
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *crdBuilder) Condition(c apiextensions.CustomResourceDefinitionCondition) *crdBuilder {
|
||||||
|
b.curr.Status.Conditions = append(b.curr.Status.Conditions, c)
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func names(plural, singular, kind, listKind string, shortNames ...string) apiextensions.CustomResourceDefinitionNames {
|
||||||
|
ret := apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: plural,
|
||||||
|
Singular: singular,
|
||||||
|
Kind: kind,
|
||||||
|
ListKind: listKind,
|
||||||
|
ShortNames: shortNames,
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *crdBuilder) NewOrDie() *apiextensions.CustomResourceDefinition {
|
||||||
|
return &b.curr
|
||||||
|
}
|
||||||
|
|
||||||
|
var acceptedCondition = apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.NamesAccepted,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "NoConflicts",
|
||||||
|
Message: "no conflicts found",
|
||||||
|
}
|
||||||
|
|
||||||
|
func nameConflictCondition(reason, message string) apiextensions.CustomResourceDefinitionCondition {
|
||||||
|
return apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.NamesAccepted,
|
||||||
|
Status: apiextensions.ConditionFalse,
|
||||||
|
Reason: reason,
|
||||||
|
Message: message,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var establishedCondition = apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Established,
|
||||||
|
Status: apiextensions.ConditionTrue,
|
||||||
|
Reason: "InitialNamesAccepted",
|
||||||
|
Message: "the initial names have been accepted",
|
||||||
|
}
|
||||||
|
|
||||||
|
var notEstablishedCondition = apiextensions.CustomResourceDefinitionCondition{
|
||||||
|
Type: apiextensions.Established,
|
||||||
|
Status: apiextensions.ConditionFalse,
|
||||||
|
Reason: "NotAccepted",
|
||||||
|
Message: "not all names are accepted",
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSync(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
|
||||||
|
in *apiextensions.CustomResourceDefinition
|
||||||
|
existing []*apiextensions.CustomResourceDefinition
|
||||||
|
expectedNames apiextensions.CustomResourceDefinitionNames
|
||||||
|
expectedNameConflictCondition apiextensions.CustomResourceDefinitionCondition
|
||||||
|
expectedEstablishedCondition apiextensions.CustomResourceDefinitionCondition
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "first resource",
|
||||||
|
in: newCRD("alfa.bravo.com").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{},
|
||||||
|
expectedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "alfa",
|
||||||
|
},
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "different groups",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("alfa.charlie.com").StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflict plural to singular",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("PluralConflict", `"alfa" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflict singular to shortName",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "indias", "", "", "delta-singular").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("SingularConflict", `"delta-singular" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflict on shortName to shortName",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "indias", "", "", "hotel-shortname-2").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("ShortNamesConflict", `"hotel-shortname-2" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflict on kind to listkind",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "indias", "", "echo-kind").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("KindConflict", `"echo-kind" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflict on listkind to kind",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("ListKindConflict", `"foxtrot-listkind" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no conflict on resource and kind",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "echo-kind", "", "").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "merge on conflicts",
|
||||||
|
in: newCRD("alfa.bravo.com").
|
||||||
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
StatusNames("zulu", "yankee-singular", "xray-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2").
|
||||||
|
NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "", "delta-singular").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "yankee-singular", "echo-kind", "whiskey-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("ListKindConflict", `"foxtrot-listkind" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "merge on conflicts shortNames as one",
|
||||||
|
in: newCRD("alfa.bravo.com").
|
||||||
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
StatusNames("zulu", "yankee-singular", "xray-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2").
|
||||||
|
NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "indias", "foxtrot-listkind", "", "delta-singular", "golf-shortname-1").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "yankee-singular", "echo-kind", "whiskey-listkind", "victor-shortname-1", "uniform-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("ListKindConflict", `"foxtrot-listkind" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no conflicts on self",
|
||||||
|
in: newCRD("alfa.bravo.com").
|
||||||
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("alfa.bravo.com").
|
||||||
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no conflicts on self, remove shortname",
|
||||||
|
in: newCRD("alfa.bravo.com").
|
||||||
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1").
|
||||||
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("alfa.bravo.com").
|
||||||
|
SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
StatusNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1"),
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "established before with true condition",
|
||||||
|
in: newCRD("alfa.bravo.com").Condition(establishedCondition).NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{},
|
||||||
|
expectedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "alfa",
|
||||||
|
},
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "not established before with false condition",
|
||||||
|
in: newCRD("alfa.bravo.com").Condition(notEstablishedCondition).NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{},
|
||||||
|
expectedNames: apiextensions.CustomResourceDefinitionNames{
|
||||||
|
Plural: "alfa",
|
||||||
|
},
|
||||||
|
expectedNameConflictCondition: acceptedCondition,
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflicting, established before with true condition",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
Condition(establishedCondition).
|
||||||
|
NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("PluralConflict", `"alfa" is already in use`),
|
||||||
|
expectedEstablishedCondition: establishedCondition,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "conflicting, not established before with false condition",
|
||||||
|
in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2").
|
||||||
|
Condition(notEstablishedCondition).
|
||||||
|
NewOrDie(),
|
||||||
|
existing: []*apiextensions.CustomResourceDefinition{
|
||||||
|
newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(),
|
||||||
|
},
|
||||||
|
expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"),
|
||||||
|
expectedNameConflictCondition: nameConflictCondition("PluralConflict", `"alfa" is already in use`),
|
||||||
|
expectedEstablishedCondition: notEstablishedCondition,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
crdIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc})
|
||||||
|
for _, obj := range tc.existing {
|
||||||
|
crdIndexer.Add(obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
c := NamingConditionController{
|
||||||
|
crdLister: listers.NewCustomResourceDefinitionLister(crdIndexer),
|
||||||
|
crdMutationCache: cache.NewIntegerResourceVersionMutationCache(crdIndexer, crdIndexer, 60*time.Second, false),
|
||||||
|
}
|
||||||
|
actualNames, actualNameConflictCondition, actualEstablishedCondition := c.calculateNamesAndConditions(tc.in)
|
||||||
|
|
||||||
|
if e, a := tc.expectedNames, actualNames; !reflect.DeepEqual(e, a) {
|
||||||
|
t.Errorf("%v expected %v, got %#v", tc.name, e, a)
|
||||||
|
}
|
||||||
|
if e, a := tc.expectedNameConflictCondition, actualNameConflictCondition; !apiextensions.IsCRDConditionEquivalent(&e, &a) {
|
||||||
|
t.Errorf("%v expected %v, got %v", tc.name, e, a)
|
||||||
|
}
|
||||||
|
if e, a := tc.expectedEstablishedCondition, actualEstablishedCondition; !apiextensions.IsCRDConditionEquivalent(&e, &a) {
|
||||||
|
t.Errorf("%v expected %v, got %v", tc.name, e, a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go
generated
vendored
3
vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go
generated
vendored
|
@ -29,6 +29,7 @@ const (
|
||||||
|
|
||||||
// owner: @sttts, @nikhita
|
// owner: @sttts, @nikhita
|
||||||
// alpha: v1.8
|
// alpha: v1.8
|
||||||
|
// beta: v1.9
|
||||||
//
|
//
|
||||||
// CustomResourceValidation is a list of validation methods for CustomResources
|
// CustomResourceValidation is a list of validation methods for CustomResources
|
||||||
CustomResourceValidation utilfeature.Feature = "CustomResourceValidation"
|
CustomResourceValidation utilfeature.Feature = "CustomResourceValidation"
|
||||||
|
@ -42,5 +43,5 @@ func init() {
|
||||||
// To add a new feature, define a key for it above and add it here. The features will be
|
// To add a new feature, define a key for it above and add it here. The features will be
|
||||||
// available throughout Kubernetes binaries.
|
// available throughout Kubernetes binaries.
|
||||||
var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{
|
var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{
|
||||||
CustomResourceValidation: {Default: false, PreRelease: utilfeature.Alpha},
|
CustomResourceValidation: {Default: true, PreRelease: utilfeature.Beta},
|
||||||
}
|
}
|
||||||
|
|
46
vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD
generated
vendored
Normal file
46
vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"etcd.go",
|
||||||
|
"strategy.go",
|
||||||
|
],
|
||||||
|
importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresource",
|
||||||
|
deps = [
|
||||||
|
"//vendor/github.com/go-openapi/validate:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/storage:go_default_library",
|
||||||
|
"//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue