Skip to content

Commit aef963c

Browse files
committed
rebase multicontroller runtime
Signed-off-by: Karol Szwaj <karol.szwaj@gmail.com> On-behalf-of: @SAP karol.szwaj@sap.com add cache Signed-off-by: Karol Szwaj <karol.szwaj@gmail.com> On-behalf-of: @SAP karol.szwaj@sap.com
1 parent 297ec62 commit aef963c

11 files changed

Lines changed: 141 additions & 49 deletions

File tree

contrib/example-backend/controllers/clusterbinding/clusterbinding_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,14 @@ func (r *ClusterBindingReconciler) SetupWithManager(mgr mcmanager.Manager) error
242242
Owns(&rbacv1.RoleBinding{}).
243243
Watches(
244244
&kubebindv1alpha2.APIServiceExport{},
245-
mapCRD,
245+
mapAPIResourceSchema,
246246
).
247247
Named(controllerName).
248248
Complete(r)
249249
}
250250

251-
func mapCRD(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
252-
return handler.TypedEnqueueRequestsFromMapFunc[client.Object, mcreconcile.Request](func(ctx context.Context, obj client.Object) []mcreconcile.Request {
251+
func mapAPIResourceSchema(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
252+
return handler.TypedEnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []mcreconcile.Request {
253253
serviceExport, ok := obj.(*kubebindv1alpha2.APIServiceExport)
254254
if !ok {
255255
return nil

contrib/example-backend/controllers/serviceexport/serviceexport_controller.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,18 @@ func NewAPIServiceExportReconciler(
6666
if err != nil {
6767
return nil, err
6868
}
69-
if err := mgr.GetFieldIndexer().IndexField(ctx, &kubebindv1alpha2.APIServiceExport{}, indexers.ServiceExportByCustomResourceDefinition,
70-
indexers.IndexServiceExportByCustomResourceDefinitionControllerRuntime); err != nil {
71-
return nil, fmt.Errorf("failed to setup ServiceExportByCustomResourceDefinition indexer: %w", err)
69+
70+
if err := mgr.GetFieldIndexer().IndexField(ctx, &kubebindv1alpha2.APIServiceExport{}, indexers.ServiceExportByAPIResourceSchema,
71+
indexers.IndexServiceExportByAPIResourceSchema); err != nil {
72+
return nil, fmt.Errorf("failed to setup ServiceExportByAPIResourceSchema indexer: %w", err)
7273
}
7374

7475
r := &APIServiceExportReconciler{
7576
manager: mgr,
7677
bindClient: bindClient,
7778
reconciler: reconciler{
78-
getCRD: func(ctx context.Context, cache cache.Cache, name string) (*apiextensionsv1.CustomResourceDefinition, error) {
79-
var crd apiextensionsv1.CustomResourceDefinition
79+
getAPIResourceSchema: func(ctx context.Context, cache cache.Cache, name string) (*kubebindv1alpha2.APIResourceSchema, error) {
80+
var schema kubebindv1alpha2.APIResourceSchema
8081
key := types.NamespacedName{Name: name}
8182
if err := cache.Get(ctx, key, &schema); err != nil {
8283
return nil, err
@@ -143,15 +144,15 @@ func (r *APIServiceExportReconciler) Reconcile(ctx context.Context, req mcreconc
143144
return ctrl.Result{}, nil
144145
}
145146

146-
// getCRDMapper returns a mapper function that uses the manager to find related APIServiceExports.
147-
func getCRDMapper(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
148-
return handler.TypedEnqueueRequestsFromMapFunc[client.Object, mcreconcile.Request](func(ctx context.Context, obj client.Object) []mcreconcile.Request {
149-
crd := obj.(*apiextensionsv1.CustomResourceDefinition)
150-
crdKey := crd.Name
147+
// getAPIResourceSchemaMapper returns a mapper function that uses the manager to find related APIServiceExports.
148+
func getAPIResourceSchemaMapper(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
149+
return handler.TypedEnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []mcreconcile.Request {
150+
apiResourceSchema := obj.(*kubebindv1alpha2.APIResourceSchema)
151+
apiResourceSchemaKey := apiResourceSchema.Name
151152
c := cl.GetClient()
152153

153154
var exports kubebindv1alpha2.APIServiceExportList
154-
if err := c.List(ctx, &exports, client.MatchingFields{indexers.ServiceExportByCustomResourceDefinition: crdKey}); err != nil {
155+
if err := c.List(ctx, &exports, client.MatchingFields{indexers.ServiceExportByAPIResourceSchema: apiResourceSchemaKey}); err != nil {
155156
return []mcreconcile.Request{}
156157
}
157158

@@ -174,8 +175,8 @@ func (r *APIServiceExportReconciler) SetupWithManager(mgr mcmanager.Manager) err
174175
return mcbuilder.ControllerManagedBy(mgr).
175176
For(&kubebindv1alpha2.APIServiceExport{}).
176177
Watches(
177-
&apiextensionsv1.CustomResourceDefinition{},
178-
getCRDMapper,
178+
&kubebindv1alpha2.APIResourceSchema{},
179+
getAPIResourceSchemaMapper,
179180
).
180181
Named(controllerName).
181182
Complete(r)

contrib/example-backend/controllers/serviceexport/serviceexport_reconcile.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ import (
3434
)
3535

3636
type reconciler struct {
37-
getAPIResourceSchema func(ctx context.Context, name string) (*kubebindv1alpha2.APIResourceSchema, error)
37+
getAPIResourceSchema func(ctx context.Context, cache cache.Cache, name string) (*kubebindv1alpha2.APIResourceSchema, error)
3838
deleteServiceExport func(ctx context.Context, namespace, name string) error
3939
}
4040

4141
func (r *reconciler) reconcile(ctx context.Context, cache cache.Cache, export *kubebindv1alpha2.APIServiceExport) error {
4242
var errs []error
4343

44-
if specChanged, err := r.ensureSchema(ctx, export); err != nil {
44+
if specChanged, err := r.ensureSchema(ctx, cache, export); err != nil {
4545
errs = append(errs, err)
4646
} else if specChanged {
4747
// TODO: This should be separate controller for apiresourceschemas.
@@ -53,7 +53,7 @@ func (r *reconciler) reconcile(ctx context.Context, cache cache.Cache, export *k
5353
return utilerrors.NewAggregate(errs)
5454
}
5555

56-
func (r *reconciler) ensureSchema(ctx context.Context, export *kubebindv1alpha2.APIServiceExport) (specChanged bool, err error) {
56+
func (r *reconciler) ensureSchema(ctx context.Context, cache cache.Cache, export *kubebindv1alpha2.APIServiceExport) (specChanged bool, err error) {
5757
logger := klog.FromContext(ctx)
5858
leafHashes := make([]string, 0, len(export.Spec.Resources))
5959
for _, resourceRef := range export.Spec.Resources {
@@ -62,7 +62,7 @@ func (r *reconciler) ensureSchema(ctx context.Context, export *kubebindv1alpha2.
6262
continue
6363
}
6464

65-
schema, err := r.getAPIResourceSchema(ctx, resourceRef.Name)
65+
schema, err := r.getAPIResourceSchema(ctx, cache, resourceRef.Name)
6666
if err != nil {
6767
if errors.IsNotFound(err) {
6868
continue

contrib/example-backend/controllers/serviceexportrequest/serviceexportrequest_controller.go

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ func NewAPIServiceExportRequestReconciler(
7979

8080
// Set up field indexers for APIServiceExportRequests
8181
if err := mgr.GetFieldIndexer().IndexField(ctx, &kubebindv1alpha2.APIServiceExportRequest{}, indexers.ServiceExportRequestByServiceExport,
82-
indexers.IndexServiceExportRequestByServiceExportControllerRuntime); err != nil {
82+
indexers.IndexServiceExportRequestByServiceExport); err != nil {
8383
return nil, fmt.Errorf("failed to setup ServiceExportRequestByServiceExport indexer: %w", err)
8484
}
8585

8686
if err := mgr.GetFieldIndexer().IndexField(ctx, &kubebindv1alpha2.APIServiceExportRequest{}, indexers.ServiceExportRequestByGroupResource,
87-
indexers.IndexServiceExportRequestByGroupResourceControllerRuntime); err != nil {
87+
indexers.IndexServiceExportRequestByGroupResource); err != nil {
8888
return nil, fmt.Errorf("failed to setup ServiceExportRequestByGroupResource indexer: %w", err)
8989
}
9090

@@ -97,14 +97,6 @@ func NewAPIServiceExportRequestReconciler(
9797
reconciler: reconciler{
9898
informerScope: scope,
9999
clusterScopedIsolation: isolation,
100-
getCRD: func(ctx context.Context, cache cache.Cache, name string) (*apiextensionsv1.CustomResourceDefinition, error) {
101-
var crd apiextensionsv1.CustomResourceDefinition
102-
key := types.NamespacedName{Name: name}
103-
if err := cache.Get(ctx, key, &crd); err != nil {
104-
return nil, err
105-
}
106-
return &crd, nil
107-
},
108100
getAPIResourceSchema: func(ctx context.Context, cache cache.Cache, name string) (*kubebindv1alpha2.APIResourceSchema, error) {
109101
var schema kubebindv1alpha2.APIResourceSchema
110102
key := types.NamespacedName{Name: name}
@@ -137,9 +129,8 @@ func NewAPIServiceExportRequestReconciler(
137129
}
138130

139131
// getServiceExportRequestMapper creates a mapping function for ServiceExport changes.
140-
141132
func getServiceExportRequestMapper(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
142-
return handler.TypedEnqueueRequestsFromMapFunc[client.Object, mcreconcile.Request](func(ctx context.Context, obj client.Object) []mcreconcile.Request {
133+
return handler.TypedEnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []mcreconcile.Request {
143134
serviceExport := obj.(*kubebindv1alpha2.APIServiceExport)
144135
seKey := serviceExport.Namespace + "/" + serviceExport.Name
145136

@@ -167,16 +158,15 @@ func getServiceExportRequestMapper(clusterName string, cl cluster.Cluster) handl
167158
})
168159
}
169160

170-
// getCRDMapper creates a mapping function for CRD changes.
171-
func getCRDMapper(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
172-
return handler.TypedEnqueueRequestsFromMapFunc[client.Object, mcreconcile.Request](func(ctx context.Context, obj client.Object) []mcreconcile.Request {
173-
crd := obj.(*apiextensionsv1.CustomResourceDefinition)
174-
crdKey := crd.Name // CRDs are cluster-scoped
175-
161+
// getAPIResourceSchemaMapper creates a mapping function for APIResourceSchema changes.
162+
func getAPIResourceSchemaMapper(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[client.Object, mcreconcile.Request] {
163+
return handler.TypedEnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []mcreconcile.Request {
164+
apiResourceSchema := obj.(*kubebindv1alpha2.APIResourceSchema)
165+
apiResourceSchemaKey := apiResourceSchema.Name
176166
c := cl.GetClient()
177167

178168
var requests kubebindv1alpha2.APIServiceExportRequestList
179-
if err := c.List(ctx, &requests, client.MatchingFields{indexers.ServiceExportRequestByGroupResource: crdKey}); err != nil {
169+
if err := c.List(ctx, &requests, client.MatchingFields{indexers.ServiceExportRequestByGroupResource: apiResourceSchemaKey}); err != nil {
180170
return []mcreconcile.Request{}
181171
}
182172

@@ -259,8 +249,8 @@ func (r *APIServiceExportRequestReconciler) SetupWithManager(mgr mcmanager.Manag
259249
getServiceExportRequestMapper,
260250
).
261251
Watches(
262-
&apiextensionsv1.CustomResourceDefinition{},
263-
getCRDMapper,
252+
&kubebindv1alpha2.APIResourceSchema{},
253+
getAPIResourceSchemaMapper,
264254
).
265255
Named(controllerName).
266256
Complete(r)

contrib/example-backend/controllers/serviceexportrequest/serviceexportrequest_reconcile.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ type reconciler struct {
3737
informerScope kubebindv1alpha2.InformerScope
3838
clusterScopedIsolation kubebindv1alpha2.Isolation
3939

40-
getCRD func(ctx context.Context, cache cache.Cache, name string) (*apiextensionsv1.CustomResourceDefinition, error)
4140
getAPIResourceSchema func(ctx context.Context, cache cache.Cache, name string) (*kubebindv1alpha2.APIResourceSchema, error)
4241
getServiceExport func(ctx context.Context, cache cache.Cache, ns, name string) (*kubebindv1alpha2.APIServiceExport, error)
4342
createServiceExport func(ctx context.Context, resource *kubebindv1alpha2.APIServiceExport) (*kubebindv1alpha2.APIServiceExport, error)

deploy/examples/crd-mangodb.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,3 @@ spec:
3838
- spec
3939
subresources:
4040
status: {}
41-

deploy/examples/servicenamespace-example.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ apiVersion: kube-bind.io/v1alpha1
22
kind: APIServiceNamespace
33
metadata:
44
name: example
5-
spec: {}
5+
spec: {}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
apiVersion: apiextensions.k8s.io/v1
2+
kind: CustomResourceDefinition
3+
metadata:
4+
name: foos.bar.io
5+
labels:
6+
kube-bind.io/exported: "true"
7+
spec:
8+
group: bar.io
9+
versions:
10+
- name: v1alpha1
11+
served: true
12+
storage: true
13+
schema:
14+
# schema used for validation
15+
openAPIV3Schema:
16+
type: object
17+
properties:
18+
spec:
19+
type: object
20+
properties:
21+
deploymentName:
22+
type: string
23+
replicas:
24+
type: integer
25+
minimum: 1
26+
maximum: 10
27+
status:
28+
type: object
29+
properties:
30+
availableReplicas:
31+
type: integer
32+
phase:
33+
type: string
34+
enum:
35+
- Pending
36+
- Running
37+
- Succeeded
38+
- Failed
39+
- Unknown
40+
# subresources for the custom resource
41+
subresources:
42+
# enables the status subresource
43+
status: {}
44+
names:
45+
kind: Foo
46+
plural: foos
47+
scope: Cluster
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
apiVersion: apiextensions.k8s.io/v1
2+
kind: CustomResourceDefinition
3+
metadata:
4+
name: mangodbs.mangodb.com
5+
labels:
6+
kube-bind.io/exported: "true"
7+
spec:
8+
group: mangodb.com
9+
names:
10+
kind: MangoDB
11+
listKind: MangoDBList
12+
plural: mangodbs
13+
singular: mangodb
14+
scope: Namespaced
15+
versions:
16+
- name: v1alpha1
17+
served: true
18+
storage: true
19+
subresources:
20+
status: {}
21+
schema:
22+
openAPIV3Schema:
23+
type: object
24+
properties:
25+
spec:
26+
type: object
27+
properties:
28+
tier:
29+
type: string
30+
enum:
31+
- Dedicated
32+
- Shared
33+
default: Shared
34+
region:
35+
type: string
36+
default: us-east-1
37+
minLength: 1
38+
backup:
39+
type: boolean
40+
default: false
41+
tokenSecret:
42+
type: string
43+
minLength: 1
44+
required:
45+
- tokenSecret
46+
status:
47+
type: object
48+
properties:
49+
phase:
50+
type: string
51+
enum:
52+
- Pending
53+
- Running
54+
- Succeeded
55+
- Failed
56+
- Unknown
57+
required:
58+
- spec

test/e2e/bind/happy-case_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ func testHappyCase(t *testing.T, resourceScope apiextensionsv1.ResourceScope, in
6262
t.Logf("Creating provider workspace")
6363
providerConfig, providerKubeconfig := framework.NewWorkspace(t, framework.ClientConfig(t), framework.WithGenerateName("test-happy-case-provider"))
6464

65-
t.Logf("Creating APIResourceSchemas on provider side")
66-
providerfixtures.Bootstrap(t, framework.DiscoveryClient(t, providerConfig), framework.DynamicClient(t, providerConfig), nil)
67-
6865
t.Logf("Starting backend with random port")
6966
addr, _ := framework.StartBackend(t, providerConfig, "--kubeconfig="+providerKubeconfig, "--listen-port=0", "--consumer-scope="+string(informerScope))
7067

68+
t.Logf("Creating APIResourceSchemas on provider side")
69+
providerfixtures.Bootstrap(t, framework.DiscoveryClient(t, providerConfig), framework.DynamicClient(t, providerConfig), nil)
70+
7171
t.Logf("Creating consumer workspace and starting konnector")
7272
consumerConfig, consumerKubeconfig := framework.NewWorkspace(t, framework.ClientConfig(t), framework.WithGenerateName("test-happy-case-consumer"))
7373
framework.StartKonnector(t, consumerConfig, "--kubeconfig="+consumerKubeconfig)

0 commit comments

Comments
 (0)