mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Merge pull request #48444 from p0lyn0mial/add_fisher_resource_to_wardle_group
Automatic merge from submit-queue (batch tested with PRs 47162, 48444, 48445) Introducing a cluster-scoped resource in the wardle.k8s.io group. **What this PR does / why we need it**: This PR adds a cluster-scoped resource to the wardle.k8s.io group. The cluster scoped resource has a field that indicates Flunder.Names that are disallowed. The resource is going to be used by an admission plugin. The admission plugin will list the cluster-scope resources and check against banned names. **Special notes for your reviewer**: Issue: #47868 **Release note**: ``` NONE ```
This commit is contained in:
commit
cfde9e5832
@ -30,7 +30,7 @@ func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *r
|
|||||||
if err := announced.NewGroupMetaFactory(
|
if err := announced.NewGroupMetaFactory(
|
||||||
&announced.GroupMetaFactoryArgs{
|
&announced.GroupMetaFactoryArgs{
|
||||||
GroupName: wardle.GroupName,
|
GroupName: wardle.GroupName,
|
||||||
RootScopedKinds: sets.NewString("APIService"),
|
RootScopedKinds: sets.NewString("Fischer", "FischerList"),
|
||||||
VersionPreferenceOrder: []string{v1alpha1.SchemeGroupVersion.Version},
|
VersionPreferenceOrder: []string{v1alpha1.SchemeGroupVersion.Version},
|
||||||
ImportPrefix: "k8s.io/sample-apiserver/pkg/apis/wardle",
|
ImportPrefix: "k8s.io/sample-apiserver/pkg/apis/wardle",
|
||||||
AddInternalObjectsToScheme: wardle.AddToScheme,
|
AddInternalObjectsToScheme: wardle.AddToScheme,
|
||||||
|
@ -46,6 +46,8 @@ func addKnownTypes(scheme *runtime.Scheme) error {
|
|||||||
scheme.AddKnownTypes(SchemeGroupVersion,
|
scheme.AddKnownTypes(SchemeGroupVersion,
|
||||||
&Flunder{},
|
&Flunder{},
|
||||||
&FlunderList{},
|
&FlunderList{},
|
||||||
|
&Fischer{},
|
||||||
|
&FischerList{},
|
||||||
)
|
)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -41,3 +41,26 @@ type Flunder struct {
|
|||||||
Spec FlunderSpec
|
Spec FlunderSpec
|
||||||
Status FlunderStatus
|
Status FlunderStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// +genclient=true
|
||||||
|
// +nonNamespaced=true
|
||||||
|
|
||||||
|
type Fischer struct {
|
||||||
|
metav1.TypeMeta
|
||||||
|
metav1.ObjectMeta
|
||||||
|
|
||||||
|
// DisallowedFlunders holds a list of Flunder.Names that are disallowed.
|
||||||
|
DisallowedFlunders []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// +genclient=true
|
||||||
|
// +nonNamespaced=true
|
||||||
|
|
||||||
|
// FischerList is a list of Fischer objects.
|
||||||
|
type FischerList struct {
|
||||||
|
metav1.TypeMeta
|
||||||
|
metav1.ListMeta
|
||||||
|
|
||||||
|
// Items is a list of Fischers
|
||||||
|
Items []Fischer
|
||||||
|
}
|
||||||
|
@ -47,6 +47,8 @@ func addKnownTypes(scheme *runtime.Scheme) error {
|
|||||||
scheme.AddKnownTypes(SchemeGroupVersion,
|
scheme.AddKnownTypes(SchemeGroupVersion,
|
||||||
&Flunder{},
|
&Flunder{},
|
||||||
&FlunderList{},
|
&FlunderList{},
|
||||||
|
&Fischer{},
|
||||||
|
&FischerList{},
|
||||||
)
|
)
|
||||||
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
|
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
|
||||||
return nil
|
return nil
|
||||||
|
@ -41,3 +41,25 @@ type Flunder struct {
|
|||||||
Spec FlunderSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
|
Spec FlunderSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
|
||||||
Status FlunderStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
|
Status FlunderStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// +genclient=true
|
||||||
|
// +nonNamespaced=true
|
||||||
|
|
||||||
|
type Fischer struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
|
||||||
|
|
||||||
|
// DisallowedFlunders holds a list of Flunder.Names that are disallowed.
|
||||||
|
DisallowedFlunders []string `json:"disallowedFlunders,omitempty" protobuf:"bytes,2,rep,name=disallowedFlunders"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// +genclient=true
|
||||||
|
// +nonNamespaced=true
|
||||||
|
|
||||||
|
// FischerList is a list of Fischer objects.
|
||||||
|
type FischerList struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
|
||||||
|
|
||||||
|
Items []Fischer `json:"items" protobuf:"bytes,2,rep,name=items"`
|
||||||
|
}
|
||||||
|
@ -35,6 +35,10 @@ func init() {
|
|||||||
// Public to allow building arbitrary schemes.
|
// Public to allow building arbitrary schemes.
|
||||||
func RegisterConversions(scheme *runtime.Scheme) error {
|
func RegisterConversions(scheme *runtime.Scheme) error {
|
||||||
return scheme.AddGeneratedConversionFuncs(
|
return scheme.AddGeneratedConversionFuncs(
|
||||||
|
Convert_v1alpha1_Fischer_To_wardle_Fischer,
|
||||||
|
Convert_wardle_Fischer_To_v1alpha1_Fischer,
|
||||||
|
Convert_v1alpha1_FischerList_To_wardle_FischerList,
|
||||||
|
Convert_wardle_FischerList_To_v1alpha1_FischerList,
|
||||||
Convert_v1alpha1_Flunder_To_wardle_Flunder,
|
Convert_v1alpha1_Flunder_To_wardle_Flunder,
|
||||||
Convert_wardle_Flunder_To_v1alpha1_Flunder,
|
Convert_wardle_Flunder_To_v1alpha1_Flunder,
|
||||||
Convert_v1alpha1_FlunderList_To_wardle_FlunderList,
|
Convert_v1alpha1_FlunderList_To_wardle_FlunderList,
|
||||||
@ -46,6 +50,54 @@ func RegisterConversions(scheme *runtime.Scheme) error {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func autoConvert_v1alpha1_Fischer_To_wardle_Fischer(in *Fischer, out *wardle.Fischer, s conversion.Scope) error {
|
||||||
|
out.ObjectMeta = in.ObjectMeta
|
||||||
|
out.DisallowedFlunders = *(*[]string)(unsafe.Pointer(&in.DisallowedFlunders))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert_v1alpha1_Fischer_To_wardle_Fischer is an autogenerated conversion function.
|
||||||
|
func Convert_v1alpha1_Fischer_To_wardle_Fischer(in *Fischer, out *wardle.Fischer, s conversion.Scope) error {
|
||||||
|
return autoConvert_v1alpha1_Fischer_To_wardle_Fischer(in, out, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func autoConvert_wardle_Fischer_To_v1alpha1_Fischer(in *wardle.Fischer, out *Fischer, s conversion.Scope) error {
|
||||||
|
out.ObjectMeta = in.ObjectMeta
|
||||||
|
out.DisallowedFlunders = *(*[]string)(unsafe.Pointer(&in.DisallowedFlunders))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert_wardle_Fischer_To_v1alpha1_Fischer is an autogenerated conversion function.
|
||||||
|
func Convert_wardle_Fischer_To_v1alpha1_Fischer(in *wardle.Fischer, out *Fischer, s conversion.Scope) error {
|
||||||
|
return autoConvert_wardle_Fischer_To_v1alpha1_Fischer(in, out, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func autoConvert_v1alpha1_FischerList_To_wardle_FischerList(in *FischerList, out *wardle.FischerList, s conversion.Scope) error {
|
||||||
|
out.ListMeta = in.ListMeta
|
||||||
|
out.Items = *(*[]wardle.Fischer)(unsafe.Pointer(&in.Items))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert_v1alpha1_FischerList_To_wardle_FischerList is an autogenerated conversion function.
|
||||||
|
func Convert_v1alpha1_FischerList_To_wardle_FischerList(in *FischerList, out *wardle.FischerList, s conversion.Scope) error {
|
||||||
|
return autoConvert_v1alpha1_FischerList_To_wardle_FischerList(in, out, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func autoConvert_wardle_FischerList_To_v1alpha1_FischerList(in *wardle.FischerList, out *FischerList, s conversion.Scope) error {
|
||||||
|
out.ListMeta = in.ListMeta
|
||||||
|
if in.Items == nil {
|
||||||
|
out.Items = make([]Fischer, 0)
|
||||||
|
} else {
|
||||||
|
out.Items = *(*[]Fischer)(unsafe.Pointer(&in.Items))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert_wardle_FischerList_To_v1alpha1_FischerList is an autogenerated conversion function.
|
||||||
|
func Convert_wardle_FischerList_To_v1alpha1_FischerList(in *wardle.FischerList, out *FischerList, s conversion.Scope) error {
|
||||||
|
return autoConvert_wardle_FischerList_To_v1alpha1_FischerList(in, out, s)
|
||||||
|
}
|
||||||
|
|
||||||
func autoConvert_v1alpha1_Flunder_To_wardle_Flunder(in *Flunder, out *wardle.Flunder, s conversion.Scope) error {
|
func autoConvert_v1alpha1_Flunder_To_wardle_Flunder(in *Flunder, out *wardle.Flunder, s conversion.Scope) error {
|
||||||
out.ObjectMeta = in.ObjectMeta
|
out.ObjectMeta = in.ObjectMeta
|
||||||
if err := Convert_v1alpha1_FlunderSpec_To_wardle_FlunderSpec(&in.Spec, &out.Spec, s); err != nil {
|
if err := Convert_v1alpha1_FlunderSpec_To_wardle_FlunderSpec(&in.Spec, &out.Spec, s); err != nil {
|
||||||
|
@ -35,6 +35,8 @@ func init() {
|
|||||||
// to allow building arbitrary schemes.
|
// to allow building arbitrary schemes.
|
||||||
func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
||||||
return scheme.AddGeneratedDeepCopyFuncs(
|
return scheme.AddGeneratedDeepCopyFuncs(
|
||||||
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_Fischer, InType: reflect.TypeOf(&Fischer{})},
|
||||||
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_FischerList, InType: reflect.TypeOf(&FischerList{})},
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_Flunder, InType: reflect.TypeOf(&Flunder{})},
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_Flunder, InType: reflect.TypeOf(&Flunder{})},
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_FlunderList, InType: reflect.TypeOf(&FlunderList{})},
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_FlunderList, InType: reflect.TypeOf(&FlunderList{})},
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_FlunderSpec, InType: reflect.TypeOf(&FlunderSpec{})},
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1alpha1_FlunderSpec, InType: reflect.TypeOf(&FlunderSpec{})},
|
||||||
@ -42,6 +44,47 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopy_v1alpha1_Fischer is an autogenerated deepcopy function.
|
||||||
|
func DeepCopy_v1alpha1_Fischer(in interface{}, out interface{}, c *conversion.Cloner) error {
|
||||||
|
{
|
||||||
|
in := in.(*Fischer)
|
||||||
|
out := out.(*Fischer)
|
||||||
|
*out = *in
|
||||||
|
if newVal, err := c.DeepCopy(&in.ObjectMeta); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
out.ObjectMeta = *newVal.(*v1.ObjectMeta)
|
||||||
|
}
|
||||||
|
if in.DisallowedFlunders != nil {
|
||||||
|
in, out := &in.DisallowedFlunders, &out.DisallowedFlunders
|
||||||
|
*out = make([]string, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy_v1alpha1_FischerList is an autogenerated deepcopy function.
|
||||||
|
func DeepCopy_v1alpha1_FischerList(in interface{}, out interface{}, c *conversion.Cloner) error {
|
||||||
|
{
|
||||||
|
in := in.(*FischerList)
|
||||||
|
out := out.(*FischerList)
|
||||||
|
*out = *in
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]Fischer, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if newVal, err := c.DeepCopy(&(*in)[i]); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
(*out)[i] = *newVal.(*Fischer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DeepCopy_v1alpha1_Flunder is an autogenerated deepcopy function.
|
// DeepCopy_v1alpha1_Flunder is an autogenerated deepcopy function.
|
||||||
func DeepCopy_v1alpha1_Flunder(in interface{}, out interface{}, c *conversion.Cloner) error {
|
func DeepCopy_v1alpha1_Flunder(in interface{}, out interface{}, c *conversion.Cloner) error {
|
||||||
{
|
{
|
||||||
|
@ -35,6 +35,8 @@ func init() {
|
|||||||
// to allow building arbitrary schemes.
|
// to allow building arbitrary schemes.
|
||||||
func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
||||||
return scheme.AddGeneratedDeepCopyFuncs(
|
return scheme.AddGeneratedDeepCopyFuncs(
|
||||||
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_Fischer, InType: reflect.TypeOf(&Fischer{})},
|
||||||
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_FischerList, InType: reflect.TypeOf(&FischerList{})},
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_Flunder, InType: reflect.TypeOf(&Flunder{})},
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_Flunder, InType: reflect.TypeOf(&Flunder{})},
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_FlunderList, InType: reflect.TypeOf(&FlunderList{})},
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_FlunderList, InType: reflect.TypeOf(&FlunderList{})},
|
||||||
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_FlunderSpec, InType: reflect.TypeOf(&FlunderSpec{})},
|
conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_wardle_FlunderSpec, InType: reflect.TypeOf(&FlunderSpec{})},
|
||||||
@ -42,6 +44,47 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopy_wardle_Fischer is an autogenerated deepcopy function.
|
||||||
|
func DeepCopy_wardle_Fischer(in interface{}, out interface{}, c *conversion.Cloner) error {
|
||||||
|
{
|
||||||
|
in := in.(*Fischer)
|
||||||
|
out := out.(*Fischer)
|
||||||
|
*out = *in
|
||||||
|
if newVal, err := c.DeepCopy(&in.ObjectMeta); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
out.ObjectMeta = *newVal.(*v1.ObjectMeta)
|
||||||
|
}
|
||||||
|
if in.DisallowedFlunders != nil {
|
||||||
|
in, out := &in.DisallowedFlunders, &out.DisallowedFlunders
|
||||||
|
*out = make([]string, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy_wardle_FischerList is an autogenerated deepcopy function.
|
||||||
|
func DeepCopy_wardle_FischerList(in interface{}, out interface{}, c *conversion.Cloner) error {
|
||||||
|
{
|
||||||
|
in := in.(*FischerList)
|
||||||
|
out := out.(*FischerList)
|
||||||
|
*out = *in
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]Fischer, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if newVal, err := c.DeepCopy(&(*in)[i]); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
(*out)[i] = *newVal.(*Fischer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DeepCopy_wardle_Flunder is an autogenerated deepcopy function.
|
// DeepCopy_wardle_Flunder is an autogenerated deepcopy function.
|
||||||
func DeepCopy_wardle_Flunder(in interface{}, out interface{}, c *conversion.Cloner) error {
|
func DeepCopy_wardle_Flunder(in interface{}, out interface{}, c *conversion.Cloner) error {
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library",
|
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library",
|
||||||
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/install:go_default_library",
|
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/install:go_default_library",
|
||||||
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library",
|
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library",
|
||||||
"//vendor/k8s.io/sample-apiserver/pkg/registry/wardle:go_default_library",
|
"//vendor/k8s.io/sample-apiserver/pkg/registry/wardle/fischer:go_default_library",
|
||||||
|
"//vendor/k8s.io/sample-apiserver/pkg/registry/wardle/flunder:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -30,7 +30,8 @@ import (
|
|||||||
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
||||||
"k8s.io/sample-apiserver/pkg/apis/wardle/install"
|
"k8s.io/sample-apiserver/pkg/apis/wardle/install"
|
||||||
"k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1"
|
"k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1"
|
||||||
wardlestorage "k8s.io/sample-apiserver/pkg/registry/wardle"
|
fischerstorage "k8s.io/sample-apiserver/pkg/registry/wardle/fischer"
|
||||||
|
flunderstorage "k8s.io/sample-apiserver/pkg/registry/wardle/flunder"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -102,7 +103,8 @@ func (c completedConfig) New() (*WardleServer, error) {
|
|||||||
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(wardle.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs)
|
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(wardle.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs)
|
||||||
apiGroupInfo.GroupMeta.GroupVersion = v1alpha1.SchemeGroupVersion
|
apiGroupInfo.GroupMeta.GroupVersion = v1alpha1.SchemeGroupVersion
|
||||||
v1alpha1storage := map[string]rest.Storage{}
|
v1alpha1storage := map[string]rest.Storage{}
|
||||||
v1alpha1storage["flunders"] = wardlestorage.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter)
|
v1alpha1storage["flunders"] = flunderstorage.RESTInPeace(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||||
|
v1alpha1storage["fischers"] = fischerstorage.RESTInPeace(Scheme, c.GenericConfig.RESTOptionsGetter)
|
||||||
apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1storage
|
apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1storage
|
||||||
|
|
||||||
if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
|
if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
|
||||||
|
15
staging/src/k8s.io/sample-apiserver/pkg/registry/BUILD
Normal file
15
staging/src/k8s.io/sample-apiserver/pkg/registry/BUILD
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["registry.go"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
deps = ["//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library"],
|
||||||
|
)
|
24
staging/src/k8s.io/sample-apiserver/pkg/registry/registry.go
Normal file
24
staging/src/k8s.io/sample-apiserver/pkg/registry/registry.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
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 registry
|
||||||
|
|
||||||
|
import genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
|
||||||
|
// rest implements a RESTStorage for API services against etcd
|
||||||
|
type REST struct {
|
||||||
|
*genericregistry.Store
|
||||||
|
}
|
@ -25,5 +25,6 @@ go_library(
|
|||||||
"//vendor/k8s.io/apiserver/pkg/storage:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/storage:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library",
|
||||||
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library",
|
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library",
|
||||||
|
"//vendor/k8s.io/sample-apiserver/pkg/registry:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
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 fischer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
|
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
||||||
|
"k8s.io/sample-apiserver/pkg/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RESTInPeace returns a RESTStorage object that will work against API services.
|
||||||
|
func RESTInPeace(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *registry.REST {
|
||||||
|
strategy := NewStrategy(scheme)
|
||||||
|
|
||||||
|
store := &genericregistry.Store{
|
||||||
|
Copier: scheme,
|
||||||
|
NewFunc: func() runtime.Object { return &wardle.Fischer{} },
|
||||||
|
NewListFunc: func() runtime.Object { return &wardle.FischerList{} },
|
||||||
|
PredicateFunc: MatchFischer,
|
||||||
|
QualifiedResource: wardle.Resource("fischers"),
|
||||||
|
|
||||||
|
CreateStrategy: strategy,
|
||||||
|
UpdateStrategy: strategy,
|
||||||
|
DeleteStrategy: strategy,
|
||||||
|
}
|
||||||
|
options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: GetAttrs}
|
||||||
|
if err := store.CompleteWithOptions(options); err != nil {
|
||||||
|
err = fmt.Errorf("Unable to create REST storage for fischer resource due to %v. Committing suicide.", err)
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return ®istry.REST{store}
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
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 fischer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
|
"k8s.io/apiserver/pkg/storage"
|
||||||
|
"k8s.io/apiserver/pkg/storage/names"
|
||||||
|
|
||||||
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewStrategy(typer runtime.ObjectTyper) fischerStrategy {
|
||||||
|
return fischerStrategy{typer, names.SimpleNameGenerator}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) {
|
||||||
|
apiserver, ok := obj.(*wardle.Fischer)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, false, fmt.Errorf("given object is not a Fischer.")
|
||||||
|
}
|
||||||
|
return labels.Set(apiserver.ObjectMeta.Labels), fischerToSelectableFields(apiserver), apiserver.Initializers != nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MatchFischer is the filter used by the generic etcd backend to watch events
|
||||||
|
// from etcd to clients of the apiserver only interested in specific labels/fields.
|
||||||
|
func MatchFischer(label labels.Selector, field fields.Selector) storage.SelectionPredicate {
|
||||||
|
return storage.SelectionPredicate{
|
||||||
|
Label: label,
|
||||||
|
Field: field,
|
||||||
|
GetAttrs: GetAttrs,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fischerToSelectableFields returns a field set that represents the object.
|
||||||
|
func fischerToSelectableFields(obj *wardle.Fischer) fields.Set {
|
||||||
|
return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
type fischerStrategy struct {
|
||||||
|
runtime.ObjectTyper
|
||||||
|
names.NameGenerator
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) NamespaceScoped() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
|
||||||
|
return field.ErrorList{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) AllowCreateOnUpdate() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) AllowUnconditionalUpdate() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) Canonicalize(obj runtime.Object) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fischerStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
|
||||||
|
return field.ErrorList{}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"etcd.go",
|
||||||
|
"strategy.go",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
deps = [
|
||||||
|
"//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/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",
|
||||||
|
"//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library",
|
||||||
|
"//vendor/k8s.io/sample-apiserver/pkg/registry:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
@ -14,22 +14,20 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package wardle
|
package flunder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||||
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
||||||
|
"k8s.io/sample-apiserver/pkg/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
// rest implements a RESTStorage for API services against etcd
|
// RESTInPeace returns a RESTStorage object that will work against API services.
|
||||||
type REST struct {
|
func RESTInPeace(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *registry.REST {
|
||||||
*genericregistry.Store
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewREST returns a RESTStorage object that will work against API services.
|
|
||||||
func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST {
|
|
||||||
strategy := NewStrategy(scheme)
|
strategy := NewStrategy(scheme)
|
||||||
|
|
||||||
store := &genericregistry.Store{
|
store := &genericregistry.Store{
|
||||||
@ -45,7 +43,8 @@ func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST
|
|||||||
}
|
}
|
||||||
options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: GetAttrs}
|
options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: GetAttrs}
|
||||||
if err := store.CompleteWithOptions(options); err != nil {
|
if err := store.CompleteWithOptions(options); err != nil {
|
||||||
panic(err) // TODO: Propagate error up
|
err = fmt.Errorf("Unable to create REST storage for flunder resource due to %v. Committing suicide.", err)
|
||||||
|
panic(err)
|
||||||
}
|
}
|
||||||
return &REST{store}
|
return ®istry.REST{store}
|
||||||
}
|
}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package wardle
|
package flunder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -23,52 +23,16 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
|
||||||
"k8s.io/apiserver/pkg/registry/generic"
|
"k8s.io/apiserver/pkg/registry/generic"
|
||||||
"k8s.io/apiserver/pkg/storage"
|
"k8s.io/apiserver/pkg/storage"
|
||||||
"k8s.io/apiserver/pkg/storage/names"
|
"k8s.io/apiserver/pkg/storage/names"
|
||||||
|
|
||||||
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
"k8s.io/sample-apiserver/pkg/apis/wardle"
|
||||||
)
|
)
|
||||||
|
|
||||||
type apiServerStrategy struct {
|
func NewStrategy(typer runtime.ObjectTyper) flunderStrategy {
|
||||||
runtime.ObjectTyper
|
return flunderStrategy{typer, names.SimpleNameGenerator}
|
||||||
names.NameGenerator
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewStrategy(typer runtime.ObjectTyper) apiServerStrategy {
|
|
||||||
return apiServerStrategy{typer, names.SimpleNameGenerator}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) NamespaceScoped() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
|
|
||||||
return field.ErrorList{}
|
|
||||||
// return validation.ValidateFlunder(obj.(*wardle.Flunder))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) AllowCreateOnUpdate() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) AllowUnconditionalUpdate() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) Canonicalize(obj runtime.Object) {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (apiServerStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
|
|
||||||
return field.ErrorList{}
|
|
||||||
// return validation.ValidateFlunderUpdate(obj.(*wardle.Flunder), old.(*wardle.Flunder))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) {
|
func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, bool, error) {
|
||||||
@ -93,3 +57,37 @@ func MatchFlunder(label labels.Selector, field fields.Selector) storage.Selectio
|
|||||||
func FlunderToSelectableFields(obj *wardle.Flunder) fields.Set {
|
func FlunderToSelectableFields(obj *wardle.Flunder) fields.Set {
|
||||||
return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true)
|
return generic.ObjectMetaFieldsSet(&obj.ObjectMeta, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type flunderStrategy struct {
|
||||||
|
runtime.ObjectTyper
|
||||||
|
names.NameGenerator
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) NamespaceScoped() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
|
||||||
|
return field.ErrorList{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) AllowCreateOnUpdate() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) AllowUnconditionalUpdate() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) Canonicalize(obj runtime.Object) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (flunderStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
|
||||||
|
return field.ErrorList{}
|
||||||
|
}
|
@ -448,9 +448,11 @@ func testAPIResourceList(t *testing.T, client rest.Interface) {
|
|||||||
t.Fatalf("Error in unmarshalling response from server %s: %v", "/apis/wardle.k8s.io/v1alpha1", err)
|
t.Fatalf("Error in unmarshalling response from server %s: %v", "/apis/wardle.k8s.io/v1alpha1", err)
|
||||||
}
|
}
|
||||||
assert.Equal(t, groupVersion.String(), apiResourceList.GroupVersion)
|
assert.Equal(t, groupVersion.String(), apiResourceList.GroupVersion)
|
||||||
assert.Equal(t, 1, len(apiResourceList.APIResources))
|
assert.Equal(t, 2, len(apiResourceList.APIResources))
|
||||||
assert.Equal(t, "flunders", apiResourceList.APIResources[0].Name)
|
assert.Equal(t, "fischers", apiResourceList.APIResources[0].Name)
|
||||||
assert.True(t, apiResourceList.APIResources[0].Namespaced)
|
assert.False(t, apiResourceList.APIResources[0].Namespaced)
|
||||||
|
assert.Equal(t, "flunders", apiResourceList.APIResources[1].Name)
|
||||||
|
assert.True(t, apiResourceList.APIResources[1].Namespaced)
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
Loading…
Reference in New Issue
Block a user