Skip to content

Commit 77efb72

Browse files
committed
Move to dynamic rest mapper
Signed-off-by: Mangirdas Judeikis <Mangirdas@Judeikis.LT> On-behalf-of: @SAP mangirdas.judeikis@sap.com
1 parent 612108b commit 77efb72

File tree

6 files changed

+47
-26
lines changed

6 files changed

+47
-26
lines changed

pkg/reconciler/cache/cachedresources/cachedresources_reconcile_replication.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func (r *replication) reconcile(ctx context.Context, cachedResource *cachev1alph
106106
r.shardName,
107107
r.dynamicCacheClient,
108108
r.kcpCacheClient,
109+
r.dynRESTMapper,
109110
gvr,
110111
replicated,
111112
callback,

pkg/reconciler/cache/cachedresources/replication/replication_controller.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/kcp-dev/kcp/pkg/cache/client/shard"
3838
"github.com/kcp-dev/kcp/pkg/indexers"
3939
"github.com/kcp-dev/kcp/pkg/logging"
40+
"github.com/kcp-dev/kcp/pkg/reconciler/dynamicrestmapper"
4041
cachev1alpha1 "github.com/kcp-dev/kcp/sdk/apis/cache/v1alpha1"
4142
kcpclientset "github.com/kcp-dev/kcp/sdk/client/clientset/versioned/cluster"
4243
)
@@ -55,6 +56,7 @@ func NewController(
5556
shardName string,
5657
dynamicCacheClient kcpdynamic.ClusterInterface,
5758
kcpCacheClient kcpclientset.ClusterInterface,
59+
dynRESTMapper *dynamicrestmapper.DynamicRESTMapper,
5860
gvr schema.GroupVersionResource,
5961
replicated *ReplicatedGVR,
6062
callback func(),
@@ -73,6 +75,7 @@ func NewController(
7375
replicated: replicated,
7476
gvr: gvr,
7577
callback: callback,
78+
dynRESTMapper: dynRESTMapper,
7679
cleanupFuncs: make([]func(), 0),
7780
localLabelSelector: localLabelSelector,
7881
}
@@ -210,6 +213,8 @@ type Controller struct {
210213
replicated *ReplicatedGVR
211214
gvr schema.GroupVersionResource
212215

216+
dynRESTMapper *dynamicrestmapper.DynamicRESTMapper
217+
213218
// callback is called when we want to trigger parent object reconciliation.
214219
// Cache state is being managed by child controller, so we need to trigger parent object reconciliation
215220
// to update parent object status.

pkg/reconciler/cache/cachedresources/replication/replication_reconcile.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,26 @@ func (c *Controller) reconcile(ctx context.Context, gvrKey string) error {
121121
return u, nil
122122
},
123123
createObject: func(ctx context.Context, cluster logicalcluster.Name, obj *unstructured.Unstructured) (*cachev1alpha1.CachedObject, error) {
124-
gvr := obj.GroupVersionKind()
125-
if gvr.Group == "" {
126-
gvr.Group = "core"
124+
gvk := obj.GroupVersionKind()
125+
if gvk.Group == "" {
126+
gvk.Group = "core"
127127
}
128128

129129
objBytes, err := json.Marshal(obj)
130130
if err != nil {
131131
return nil, err
132132
}
133-
resource := (strings.ToLower(gvr.Kind) + "s")
133+
mapper, err := c.dynRESTMapper.ForCluster(cluster).RESTMapping(gvk.GroupKind(), gvk.Version)
134+
if err != nil {
135+
return nil, err
136+
}
134137
cacheObj := &cachev1alpha1.CachedObject{
135138
TypeMeta: metav1.TypeMeta{
136139
Kind: cache.CachedObjectKind,
137140
APIVersion: cachev1alpha1.SchemeGroupVersion.String(),
138141
},
139142
ObjectMeta: metav1.ObjectMeta{
140-
Name: gvr.Version + "." + resource + "." + gvr.Group + "." + obj.GetName(), // TODO: handle namespace
143+
Name: gvr.Version + "." + mapper.Resource.Resource + "." + gvr.Group + "." + obj.GetName(), // TODO: handle namespace
141144
Labels: obj.GetLabels(),
142145
Annotations: obj.GetAnnotations(),
143146
CreationTimestamp: metav1.NewTime(time.Now()),
@@ -150,35 +153,38 @@ func (c *Controller) reconcile(ctx context.Context, gvrKey string) error {
150153
cacheObj.Labels = map[string]string{}
151154
}
152155
// Append schema label to the object.
153-
cacheObj.Labels[LabelKeyObjectSchema] = gvr.Version + "." + resource + "." + gvr.Group
156+
cacheObj.Labels[LabelKeyObjectSchema] = gvr.Version + "." + mapper.Resource.Resource + "." + gvr.Group
154157
cacheObj.Labels[LabelKeyObjectGroup] = gvr.Group
155158
cacheObj.Labels[LabelKeyObjectVersion] = gvr.Version
156-
cacheObj.Labels[LabelKeyObjectResource] = resource
159+
cacheObj.Labels[LabelKeyObjectResource] = mapper.Resource.Resource
157160
cacheObj.Labels[LabelKeyObjectOriginalName] = obj.GetName()
158161
cacheObj.Labels[LabelKeyObjectOriginalNamespace] = obj.GetNamespace()
159162

160163
u, err := c.kcpCacheClient.Cluster(cluster.Path()).CacheV1alpha1().CachedObjects().Create(ctx, cacheObj, metav1.CreateOptions{})
161164
return u, err
162165
},
163166
updateObject: func(ctx context.Context, cluster logicalcluster.Name, obj *unstructured.Unstructured) (*cachev1alpha1.CachedObject, error) {
164-
gvr := obj.GroupVersionKind()
165-
if gvr.Group == "" {
166-
gvr.Group = "core"
167+
gvk := obj.GroupVersionKind()
168+
if gvk.Group == "" {
169+
gvk.Group = "core"
167170
}
168171

169172
objBytes, err := json.Marshal(obj)
170173
if err != nil {
171174
return nil, err
172175
}
173176

174-
resource := (strings.ToLower(gvr.Kind) + "s")
177+
mapper, err := c.dynRESTMapper.ForCluster(cluster).RESTMapping(gvk.GroupKind(), gvk.Version)
178+
if err != nil {
179+
return nil, err
180+
}
175181
cacheObj := &cachev1alpha1.CachedObject{
176182
TypeMeta: metav1.TypeMeta{
177183
Kind: cache.CachedObjectKind,
178184
APIVersion: cachev1alpha1.SchemeGroupVersion.String(),
179185
},
180186
ObjectMeta: metav1.ObjectMeta{
181-
Name: gvr.Version + "." + resource + "." + gvr.Group + "." + obj.GetName(),
187+
Name: gvr.Version + "." + mapper.Resource.Resource + "." + gvr.Group + "." + obj.GetName(),
182188
Labels: obj.GetLabels(),
183189
Annotations: obj.GetAnnotations(),
184190
ResourceVersion: obj.GetResourceVersion(),
@@ -191,10 +197,10 @@ func (c *Controller) reconcile(ctx context.Context, gvrKey string) error {
191197
cacheObj.Labels = map[string]string{}
192198
}
193199
// Append schema label to the object.
194-
cacheObj.Labels[LabelKeyObjectSchema] = gvr.Version + "." + resource + "." + gvr.Group
200+
cacheObj.Labels[LabelKeyObjectSchema] = gvr.Version + "." + mapper.Resource.Resource + "." + gvr.Group
195201
cacheObj.Labels[LabelKeyObjectGroup] = gvr.Group
196202
cacheObj.Labels[LabelKeyObjectVersion] = gvr.Version
197-
cacheObj.Labels[LabelKeyObjectResource] = resource
203+
cacheObj.Labels[LabelKeyObjectResource] = mapper.Resource.Resource
198204
cacheObj.Labels[LabelKeyObjectOriginalName] = obj.GetName()
199205
cacheObj.Labels[LabelKeyObjectOriginalNamespace] = obj.GetNamespace()
200206

pkg/reconciler/tenancy/workspacemounts/workspacemounts_controller.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package workspacemounts
1919
import (
2020
"context"
2121
"fmt"
22-
"strings"
2322
"time"
2423

2524
kerrors "k8s.io/apimachinery/pkg/api/errors"
@@ -40,6 +39,7 @@ import (
4039
"github.com/kcp-dev/kcp/pkg/informer"
4140
"github.com/kcp-dev/kcp/pkg/logging"
4241
"github.com/kcp-dev/kcp/pkg/reconciler/committer"
42+
"github.com/kcp-dev/kcp/pkg/reconciler/dynamicrestmapper"
4343
"github.com/kcp-dev/kcp/pkg/reconciler/events"
4444
tenancyv1alpha1 "github.com/kcp-dev/kcp/sdk/apis/tenancy/v1alpha1"
4545
kcpclientset "github.com/kcp-dev/kcp/sdk/client/clientset/versioned/cluster"
@@ -59,6 +59,7 @@ func NewController(
5959
dynamicClusterClient kcpdynamic.ClusterInterface,
6060
workspaceInformer tenancyv1alpha1informers.WorkspaceClusterInformer,
6161
discoveringDynamicSharedInformerFactory *informer.DiscoveringDynamicSharedInformerFactory,
62+
dynRESTMapper *dynamicrestmapper.DynamicRESTMapper,
6263
) (*Controller, error) {
6364
c := &Controller{
6465
queue: workqueue.NewTypedRateLimitingQueueWithConfig(
@@ -74,6 +75,8 @@ func NewController(
7475
workspaceIndexer: workspaceInformer.Informer().GetIndexer(),
7576
workspaceLister: workspaceInformer.Lister(),
7677

78+
dynRESTMapper: dynRESTMapper,
79+
7780
commit: committer.NewCommitter[*tenancyv1alpha1.Workspace, tenancyv1alpha1client.WorkspaceInterface, *tenancyv1alpha1.WorkspaceSpec, *tenancyv1alpha1.WorkspaceStatus](kcpClusterClient.TenancyV1alpha1().Workspaces()),
7881
}
7982

@@ -110,6 +113,8 @@ type Controller struct {
110113
workspaceIndexer cache.Indexer
111114
workspaceLister tenancyv1alpha1listers.WorkspaceClusterLister
112115

116+
dynRESTMapper *dynamicrestmapper.DynamicRESTMapper
117+
113118
// commit creates a patch and submits it, if needed.
114119
commit func(ctx context.Context, new, old *workspaceResource) error
115120
}
@@ -197,20 +202,16 @@ func (c *Controller) process(ctx context.Context, key string) (bool, error) {
197202
ctx = klog.NewContext(ctx, logger)
198203

199204
getMountObjectFunc := func(ctx context.Context, cluster logicalcluster.Path, ref tenancyv1alpha1.ObjectReference) (*unstructured.Unstructured, error) {
200-
// TODO(sttts): do proper REST mapping.
201-
resource := strings.ToLower(ref.Kind) + "s"
202-
gvr := schema.GroupVersionResource{Resource: resource}
203-
cs := strings.SplitN(ref.APIVersion, "/", 2)
204-
if len(cs) == 2 {
205-
gvr.Group = cs[0]
206-
gvr.Version = cs[1]
207-
} else {
208-
gvr.Version = ref.APIVersion
205+
clusterName := logicalcluster.From(workspace)
206+
mapper, err := c.dynRESTMapper.ForCluster(clusterName).RESTMapping(ref.GroupKind(), ref.APIVersion)
207+
if err != nil {
208+
return nil, err
209209
}
210+
210211
if ref.Namespace != "" {
211-
return c.dynamicClusterClient.Cluster(cluster).Resource(gvr).Namespace(ref.Namespace).Get(ctx, ref.Name, metav1.GetOptions{})
212+
return c.dynamicClusterClient.Cluster(cluster).Resource(mapper.Resource).Namespace(ref.Namespace).Get(ctx, ref.Name, metav1.GetOptions{})
212213
}
213-
return c.dynamicClusterClient.Cluster(cluster).Resource(gvr).Get(ctx, ref.Name, metav1.GetOptions{})
214+
return c.dynamicClusterClient.Cluster(cluster).Resource(mapper.Resource).Get(ctx, ref.Name, metav1.GetOptions{})
214215
}
215216

216217
// the following logic is a deviation from the standard pattern of reconcilers

pkg/server/controllers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,7 @@ func (s *Server) installWorkspaceMountsScheduler(ctx context.Context, config *re
680680
dynamicClusterClient,
681681
s.KcpSharedInformerFactory.Tenancy().V1alpha1().Workspaces(),
682682
s.DiscoveringDynamicSharedInformerFactory,
683+
s.DynRESTMapper,
683684
)
684685
if err != nil {
685686
return err

sdk/apis/tenancy/v1alpha1/types_workspace.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ package v1alpha1
1818

1919
import (
2020
"fmt"
21+
"strings"
2122

2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
"k8s.io/apimachinery/pkg/runtime/schema"
2325

2426
corev1alpha1 "github.com/kcp-dev/kcp/sdk/apis/core/v1alpha1"
2527
conditionsv1alpha1 "github.com/kcp-dev/kcp/sdk/apis/third_party/conditions/apis/conditions/v1alpha1"
@@ -234,6 +236,11 @@ type ObjectReference struct {
234236
Namespace string `json:"namespace,omitempty"`
235237
}
236238

239+
func (r ObjectReference) GroupKind() schema.GroupKind {
240+
groupVersion := strings.SplitN(r.APIVersion, "/", 2)
241+
return schema.GroupKind{Group: groupVersion[0], Kind: r.Kind}
242+
}
243+
237244
type WorkspaceLocation struct {
238245

239246
// selector is a label selector that filters workspace scheduling targets.

0 commit comments

Comments
 (0)