Skip to content

Commit 9ff554c

Browse files
authored
Merge pull request #33 from kubernetes-sigs/feat/connector-subresource
Connector subresource
2 parents 20db0ac + 329ada2 commit 9ff554c

File tree

7 files changed

+127
-18
lines changed

7 files changed

+127
-18
lines changed

internal/sample-apiserver/pkg/apiserver/ext.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@ limitations under the License.
1717
package apiserver
1818

1919
import (
20+
"net/url"
21+
2022
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23+
"k8s.io/apimachinery/pkg/conversion"
2124
"k8s.io/apimachinery/pkg/runtime"
2225
"k8s.io/apimachinery/pkg/runtime/schema"
2326
"k8s.io/apimachinery/pkg/util/sets"
2427
genericregistry "k8s.io/apiserver/pkg/registry/generic"
2528
"k8s.io/apiserver/pkg/registry/rest"
2629
pkgserver "k8s.io/apiserver/pkg/server"
30+
31+
"sigs.k8s.io/apiserver-runtime/pkg/builder/resource"
2732
"sigs.k8s.io/apiserver-runtime/pkg/builder/resource/resourcestrategy"
2833
)
2934

@@ -34,6 +39,15 @@ var (
3439
GenericAPIServerFns []func(*pkgserver.GenericAPIServer) *pkgserver.GenericAPIServer
3540
)
3641

42+
var (
43+
ParameterScheme = runtime.NewScheme()
44+
ParameterCodec = runtime.NewParameterCodec(ParameterScheme)
45+
)
46+
47+
func init() {
48+
metav1.AddMetaToScheme(ParameterScheme)
49+
}
50+
3751
func BuildAPIGroupInfos(s *runtime.Scheme, g genericregistry.RESTOptionsGetter) ([]*pkgserver.APIGroupInfo, error) {
3852
resourcesByGroupVersion := make(map[schema.GroupVersion]sets.String)
3953
groups := sets.NewString()
@@ -60,14 +74,28 @@ func BuildAPIGroupInfos(s *runtime.Scheme, g genericregistry.RESTOptionsGetter)
6074
// add the defaulting function for this version to the scheme
6175
if _, ok := storage.(resourcestrategy.Defaulter); ok {
6276
if obj, ok := storage.(runtime.Object); ok {
63-
Scheme.AddTypeDefaultingFunc(obj, func(obj interface{}) {
77+
s.AddTypeDefaultingFunc(obj, func(obj interface{}) {
6478
obj.(resourcestrategy.Defaulter).Default()
6579
})
6680
}
6781
}
82+
if c, ok := storage.(rest.Connecter); ok {
83+
optionsObj, _, _ := c.NewConnectOptions()
84+
if optionsObj != nil {
85+
ParameterScheme.AddKnownTypes(gvr.GroupVersion(), optionsObj)
86+
Scheme.AddKnownTypes(gvr.GroupVersion(), optionsObj)
87+
if _, ok := optionsObj.(resource.QueryParameterObject); ok {
88+
if err := ParameterScheme.AddConversionFunc(&url.Values{}, optionsObj, func(src interface{}, dest interface{}, s conversion.Scope) error {
89+
return dest.(resource.QueryParameterObject).ConvertFromUrlValues(src.(*url.Values))
90+
}); err != nil {
91+
return nil, err
92+
}
93+
}
94+
}
95+
}
6896
}
6997
}
70-
apiGroupInfo := pkgserver.NewDefaultAPIGroupInfo(group, Scheme, metav1.ParameterCodec, Codecs)
98+
apiGroupInfo := pkgserver.NewDefaultAPIGroupInfo(group, Scheme, ParameterCodec, Codecs)
7199
apiGroupInfo.VersionedResourcesStorageMap = apis
72100
apiGroups = append(apiGroups, &apiGroupInfo)
73101
}

pkg/builder/builder_general.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package builder
22

33
import (
44
"github.com/spf13/pflag"
5+
pkgserver "k8s.io/apiserver/pkg/server"
56
"sigs.k8s.io/apiserver-runtime/internal/sample-apiserver/pkg/apiserver"
67
"sigs.k8s.io/apiserver-runtime/internal/sample-apiserver/pkg/cmd/server"
78
)
@@ -18,6 +19,12 @@ func (a *Server) WithServerFns(fns ...func(server *GenericAPIServer) *GenericAPI
1819
return a
1920
}
2021

22+
// WithConfigFns sets functions to customize the RecommendedConfig
23+
func (a *Server) WithConfigFns(fns ...func(config *pkgserver.RecommendedConfig) *pkgserver.RecommendedConfig) *Server {
24+
server.RecommendedConfigFns = append(server.RecommendedConfigFns, fns...)
25+
return a
26+
}
27+
2128
// WithFlagFns sets functions to customize the flags for the compiled binary.
2229
func (a *Server) WithFlagFns(fns ...func(set *pflag.FlagSet) *pflag.FlagSet) *Server {
2330
server.FlagsFns = append(server.FlagsFns, fns...)

pkg/builder/builder_misc.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"k8s.io/apimachinery/pkg/runtime"
55
openapicommon "k8s.io/kube-openapi/pkg/common"
66
"sigs.k8s.io/apiserver-runtime/internal/sample-apiserver/pkg/cmd/server"
7+
"sigs.k8s.io/apiserver-runtime/pkg/util/loopback"
78
)
89

910
// WithOpenAPIDefinitions registers resource OpenAPI definitions generated by openapi-gen.
@@ -38,3 +39,11 @@ func (a *Server) WithAdditionalSchemesToBuild(s ...*runtime.Scheme) *Server {
3839
a.schemes = append(a.schemes, s...)
3940
return a
4041
}
42+
43+
// ExposeLoopbackClientConfig exposes loopback client config as an external variable.
44+
func (a *Server) ExposeLoopbackClientConfig() *Server {
45+
return a.WithServerFns(func(c *GenericAPIServer) *GenericAPIServer {
46+
loopback.SetLoopbackClientConfig(c.LoopbackClientConfig)
47+
return c
48+
})
49+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package resource
18+
19+
import "net/url"
20+
21+
// StatusSubResource defines interface for registering status subresource to a parent resource.
22+
type StatusSubResource interface {
23+
SubResource
24+
// CopyTo copies the content of the status subresource to a parent resource.
25+
CopyTo(parent ObjectWithStatusSubResource)
26+
}
27+
28+
// SubResource defines interface for registering arbitrary subresource to the parent resource.
29+
type SubResource interface {
30+
SubResourceName() string
31+
// TODO: fill the details for this interface.
32+
}
33+
34+
// QueryParameterObject allows the object to be casted to url.Values.
35+
// It's specifically for Connector subresource.
36+
type QueryParameterObject interface {
37+
ConvertFromUrlValues(values *url.Values) error
38+
}

pkg/builder/resource/types.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,6 @@ type MultiVersionObject interface {
8282
ConvertFromStorageVersion(storageObj runtime.Object) error
8383
}
8484

85-
// StatusSubResource defines interface for registering status subresource to a parent resource.
86-
type StatusSubResource interface {
87-
SubResource
88-
// CopyTo copies the content of the status subresource to a parent resource.
89-
CopyTo(parent ObjectWithStatusSubResource)
90-
}
91-
92-
// SubResource defines interface for registering arbitrary subresource to the parent resource.
93-
type SubResource interface {
94-
SubResourceName() string
95-
// TODO: fill the details for this interface.
96-
}
97-
9885
// ObjectWithStatusSubResource defines an interface for getting and setting the status sub-resource for a resource.
9986
type ObjectWithStatusSubResource interface {
10087
Object
@@ -121,8 +108,9 @@ func AddToScheme(objs ...Object) func(s *runtime.Scheme) error {
121108
s.AddKnownTypes(obj.GetGroupVersionResource().GroupVersion(), obj.New(), obj.NewList())
122109
if obj.IsStorageVersion() {
123110
s.AddKnownTypes(schema.GroupVersion{
124-
Group: runtime.APIVersionInternal,
125-
Version: obj.GetGroupVersionResource().Version}, obj.New(), obj.NewList())
111+
Group: obj.GetGroupVersionResource().Group,
112+
Version: runtime.APIVersionInternal,
113+
}, obj.New(), obj.NewList())
126114
} else {
127115
multiVersionObj, ok := obj.(MultiVersionObject)
128116
if !ok {

pkg/builder/rest/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
type ResourceHandlerProvider = apiserver.StorageProvider
2828

2929
// StaticHandlerProvider returns itself as the request handler.
30-
type StaticHandlerProvider struct {
30+
type StaticHandlerProvider struct { // TODO: privatize
3131
rest.Storage
3232
}
3333

pkg/util/loopback/loopback_client.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
Copyright 2020 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
// Package loopback is a set of utilities for apiserver loopback connections.
18+
package loopback
19+
20+
import (
21+
"sync"
22+
23+
"k8s.io/client-go/rest"
24+
)
25+
26+
var setLoopbackClientOnce sync.Once
27+
var loopbackClientConfig *rest.Config
28+
29+
// SetLoopbackClientConfig provides loopback client config for one time
30+
func SetLoopbackClientConfig(c *rest.Config) {
31+
setLoopbackClientOnce.Do(func() {
32+
loopbackClientConfig = c
33+
})
34+
}
35+
36+
// GetLoopbackClientConfig gets loopback client config
37+
func GetLoopbackClientConfig() *rest.Config {
38+
return loopbackClientConfig
39+
}

0 commit comments

Comments
 (0)