Skip to content

Commit 483a4a7

Browse files
fourthisleArtem Shcherbatiuk
andauthored
implement cluster path resolution for cluster-names and cleanup unnecessary files and logic (#35)
Co-authored-by: Artem Shcherbatiuk <[email protected]>
1 parent e7a51b5 commit 483a4a7

File tree

8 files changed

+367
-55734
lines changed

8 files changed

+367
-55734
lines changed

cmd/listen.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
kcpapis "github.com/kcp-dev/kcp/sdk/apis/apis/v1alpha1"
1111
kcpcore "github.com/kcp-dev/kcp/sdk/apis/core/v1alpha1"
1212
kcptenancy "github.com/kcp-dev/kcp/sdk/apis/tenancy/v1alpha1"
13+
"github.com/openmfp/crd-gql-gateway/listener/clusterpath"
1314
"github.com/openmfp/crd-gql-gateway/listener/flags"
1415
"github.com/rs/zerolog/log"
1516
"github.com/spf13/cobra"
@@ -155,7 +156,11 @@ var listenCmd = &cobra.Command{
155156
}
156157

157158
reconciler := controller.NewAPIBindingReconciler(
158-
ioHandler, df, apischema.NewResolver(),
159+
ioHandler, df, apischema.NewResolver(), &clusterpath.Resolver{
160+
Scheme: mgr.GetScheme(),
161+
Config: cfg,
162+
ResolverFunc: clusterpath.Resolve,
163+
},
159164
)
160165

161166
err = reconciler.SetupWithManager(mgr)

listener/apischema/testdata/artem_schema.json

Lines changed: 0 additions & 48032 deletions
This file was deleted.

listener/apischema/testdata/kubeSchemaOut.json

Lines changed: 0 additions & 7662 deletions
This file was deleted.

listener/apischema/testdata/v3JSON_v2_out.json

Lines changed: 286 additions & 1 deletion
Large diffs are not rendered by default.

listener/clusterpath/resolver.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package clusterpath
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"net/url"
8+
9+
kcpcore "github.com/kcp-dev/kcp/sdk/apis/core/v1alpha1"
10+
"k8s.io/apimachinery/pkg/runtime"
11+
"k8s.io/client-go/rest"
12+
"sigs.k8s.io/controller-runtime/pkg/client"
13+
)
14+
15+
type Resolver struct {
16+
*runtime.Scheme
17+
*rest.Config
18+
ResolverFunc
19+
}
20+
21+
type ResolverFunc func(name string, cfg *rest.Config, scheme *runtime.Scheme) (string, error)
22+
23+
func Resolve(name string, cfg *rest.Config, scheme *runtime.Scheme) (string, error) {
24+
if name == "root" {
25+
return name, nil
26+
}
27+
if cfg == nil {
28+
return "", errors.New("config should not be nil")
29+
}
30+
if scheme == nil {
31+
return "", errors.New("scheme should not be nil")
32+
}
33+
clusterCfg := rest.CopyConfig(cfg)
34+
clusterCfgURL, err := url.Parse(clusterCfg.Host)
35+
if err != nil {
36+
return "", fmt.Errorf("failed to parse rest config Host URL: %w", err)
37+
}
38+
clusterCfgURL.Path = fmt.Sprintf("/clusters/%s", name)
39+
clusterCfg.Host = clusterCfgURL.String()
40+
clt, err := client.New(clusterCfg, client.Options{
41+
Scheme: scheme,
42+
})
43+
if err != nil {
44+
return "", fmt.Errorf("failed to create client for cluster: %w", err)
45+
}
46+
lc := &kcpcore.LogicalCluster{}
47+
if err := clt.Get(context.TODO(), client.ObjectKey{Name: "cluster"}, lc); err != nil {
48+
return "", fmt.Errorf("failed to get logicalcluster resource: %w", err)
49+
}
50+
path, ok := lc.GetAnnotations()["kcp.io/path"]
51+
if !ok {
52+
return "", errors.New("failed to get cluster path from kcp.io/path annotation")
53+
}
54+
return path, nil
55+
}

listener/controller/apibinding_controller.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ import (
99
"io/fs"
1010

1111
"github.com/openmfp/crd-gql-gateway/listener/apischema"
12+
"github.com/openmfp/crd-gql-gateway/listener/clusterpath"
1213
"github.com/openmfp/crd-gql-gateway/listener/discoveryclient"
1314
"github.com/openmfp/crd-gql-gateway/listener/workspacefile"
1415

1516
kcpapis "github.com/kcp-dev/kcp/sdk/apis/apis/v1alpha1"
16-
kcptenancy "github.com/kcp-dev/kcp/sdk/apis/tenancy/v1alpha1"
1717

1818
ctrl "sigs.k8s.io/controller-runtime"
19-
"sigs.k8s.io/controller-runtime/pkg/handler"
2019
"sigs.k8s.io/controller-runtime/pkg/log"
2120
)
2221

@@ -25,47 +24,56 @@ type APIBindingReconciler struct {
2524
io workspacefile.IOHandler
2625
df discoveryclient.Factory
2726
sc apischema.Resolver
27+
pr *clusterpath.Resolver
2828
}
2929

3030
func NewAPIBindingReconciler(
3131
io workspacefile.IOHandler,
3232
df discoveryclient.Factory,
3333
sc apischema.Resolver,
34+
pr *clusterpath.Resolver,
3435
) *APIBindingReconciler {
3536
return &APIBindingReconciler{
3637
io: io,
3738
df: df,
3839
sc: sc,
40+
pr: pr,
3941
}
4042
}
4143

4244
// +kubebuilder:rbac:groups=apis.kcp.io,resources=apibindings,verbs=get;list;watch
4345
// +kubebuilder:rbac:groups=apis.kcp.io,resources=apibindings/status,verbs=get
44-
// +kubebuilder:rbac:groups=tenancy.kcp.io,resources=workspaces,verbs=get;list;watch
45-
// +kubebuilder:rbac:groups=tenancy.kcp.io,resources=workspaces/status,verbs=get
4646
func (r *APIBindingReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
4747

48+
// ignore system workspaces (e.g. system:shard)
4849
if strings.HasPrefix(req.ClusterName, "system") {
4950
return ctrl.Result{}, nil
5051
}
5152

52-
logger := log.FromContext(ctx).WithValues("cluster", req.ClusterName)
53+
logger := log.FromContext(ctx)
54+
clusterPath, err := r.pr.ResolverFunc(req.ClusterName, r.pr.Config, r.pr.Scheme)
55+
if err != nil {
56+
logger.Error(err, "failed to get cluster path", "cluster", req.ClusterName)
57+
return ctrl.Result{}, err
58+
}
59+
60+
logger = logger.WithValues("cluster", clusterPath)
5361
logger.Info("starting reconciliation...")
5462

55-
dc, err := r.df.ClientForCluster(req.ClusterName)
63+
dc, err := r.df.ClientForCluster(clusterPath)
5664
if err != nil {
5765
logger.Error(err, "failed to create discovery client for cluster")
5866
return ctrl.Result{}, err
5967
}
6068

61-
savedJSON, err := r.io.Read(req.ClusterName)
69+
savedJSON, err := r.io.Read(clusterPath)
6270
if errors.Is(err, fs.ErrNotExist) {
6371
actualJSON, err1 := r.sc.Resolve(dc)
6472
if err1 != nil {
6573
logger.Error(err1, "failed to resolve server JSON schema")
6674
return ctrl.Result{}, err1
6775
}
68-
if err = r.io.Write(actualJSON, req.ClusterName); err != nil {
76+
if err := r.io.Write(actualJSON, clusterPath); err != nil {
6977
logger.Error(err, "failed to write JSON to filesystem")
7078
return ctrl.Result{}, err
7179
}
@@ -83,8 +91,7 @@ func (r *APIBindingReconciler) Reconcile(ctx context.Context, req ctrl.Request)
8391
return ctrl.Result{}, err
8492
}
8593
if !bytes.Equal(actualJSON, savedJSON) {
86-
err = r.io.Write(actualJSON, req.ClusterName)
87-
if err != nil {
94+
if err := r.io.Write(actualJSON, clusterPath); err != nil {
8895
logger.Error(err, "failed to write JSON to filesystem")
8996
return ctrl.Result{}, err
9097
}
@@ -97,8 +104,6 @@ func (r *APIBindingReconciler) Reconcile(ctx context.Context, req ctrl.Request)
97104
func (r *APIBindingReconciler) SetupWithManager(mgr ctrl.Manager) error {
98105
return ctrl.NewControllerManagedBy(mgr).
99106
For(&kcpapis.APIBinding{}).
100-
Watches(&kcptenancy.Workspace{},
101-
handler.EnqueueRequestsFromMapFunc(clusterNameFromWorkspace)).
102107
Named("apibinding").
103108
Complete(r)
104109
}

listener/controller/apibinding_controller_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99

1010
schemamocks "github.com/openmfp/crd-gql-gateway/listener/apischema/mocks"
11+
"github.com/openmfp/crd-gql-gateway/listener/clusterpath"
1112
"github.com/openmfp/crd-gql-gateway/listener/controller"
1213
discoverymocks "github.com/openmfp/crd-gql-gateway/listener/discoveryclient/mocks"
1314
iomocks "github.com/openmfp/crd-gql-gateway/listener/workspacefile/mocks"
@@ -267,5 +268,6 @@ func setupMocks(t *testing.T, tc testCase) *controller.APIBindingReconciler {
267268
tc.schemaMocks(sc)
268269
}
269270

270-
return controller.NewAPIBindingReconciler(ioHandler, df, sc)
271+
//TODO: add fake impl for clusterpath resolver
272+
return controller.NewAPIBindingReconciler(ioHandler, df, sc, &clusterpath.Resolver{})
271273
}

listener/controller/controller_helper.go

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)