Skip to content

Commit 2ffb5ed

Browse files
OlegErshovaaronschweigcoderabbitai[bot]
authored
feat: added multi-cluster runtime (#90)
* feat: added multi-cluster runtime On-behalf-of: SAP [email protected] * chore: removed commented code On-behalf-of: SAP [email protected] * chore: refactored imports On-behalf-of: SAP [email protected] * feat: used mccontext and added condition manager On-behalf-of: SAP [email protected] * chore: removed completed todo On-behalf-of: SAP [email protected] * feat: added initilizer's clean up using initializing provider, removed context with timeout On-behalf-of: SAP [email protected] * feat: made initializer name configurable On-behalf-of: SAP [email protected] * fix: fixed merge errors On-behalf-of: SAP [email protected] * chore: showcase mcruntime integration * fix: startup of manager * fix. * chore: updated model generated controller On-behalf-of: SAP [email protected] * Update internal/subroutine/remove_initializer.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * feat: used multi-cluster runtime in operator contoller On-behalf-of: SAP [email protected] * updated go version On-behalf-of: SAP [email protected] * updated go version in docker file On-behalf-of: SAP [email protected] * feat: removed specific lc clients On-behalf-of: SAP [email protected] * feat: updated tests On-behalf-of: SAP [email protected] * chore: format fix On-behalf-of: SAP [email protected] * fix: fixed merge errors On-behalf-of: SAP [email protected] * improve test coverage On-behalf-of: SAP [email protected] * improve tracehold for remove initializer subroutine On-behalf-of: SAP [email protected] * fix: fixed errors related to pointing wrong logical cluster On-behalf-of: SAP [email protected] * fix: fixed tests On-behalf-of: SAP [email protected] * fix: removed wrong file On-behalf-of: SAP [email protected] * feat: support additional redirectURLs for the clients (#99) * feat: support additional redirectURLs for the clients * chore: linter errors --------- Co-authored-by: aaronschweig <[email protected]> Co-authored-by: Aaron Schweig <[email protected]> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent ecc5018 commit 2ffb5ed

30 files changed

+2188
-526
lines changed

.mockery.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,17 @@ packages:
1313
outpkg: mocks
1414
interfaces:
1515
Client:
16+
17+
sigs.k8s.io/multicluster-runtime/pkg/manager:
18+
config:
19+
dir: internal/subroutine/mocks
20+
outpkg: mocks
21+
interfaces:
22+
Manager:
23+
24+
sigs.k8s.io/controller-runtime/pkg/cluster:
25+
config:
26+
dir: internal/subroutine/mocks
27+
outpkg: mocks
28+
interfaces:
29+
Cluster:

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build the manager binary
2-
FROM golang:1.24.6-bullseye AS builder
2+
FROM golang:1.25.2-bookworm AS builder
33
ARG TARGETOS
44
ARG TARGETARCH
55

cmd/initializer.go

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,29 @@ import (
66

77
helmv2 "github.com/fluxcd/helm-controller/api/v2"
88
sourcev1 "github.com/fluxcd/source-controller/api/v1"
9+
910
"github.com/kcp-dev/logicalcluster/v3"
11+
"github.com/kcp-dev/multicluster-provider/initializingworkspaces"
12+
pmcontext "github.com/platform-mesh/golang-commons/context"
1013
"github.com/spf13/cobra"
1114
"k8s.io/apimachinery/pkg/runtime"
1215
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1316
"k8s.io/client-go/rest"
1417
ctrl "sigs.k8s.io/controller-runtime"
1518
"sigs.k8s.io/controller-runtime/pkg/client"
1619
"sigs.k8s.io/controller-runtime/pkg/healthz"
17-
"sigs.k8s.io/controller-runtime/pkg/kcp"
1820
"sigs.k8s.io/controller-runtime/pkg/metrics/server"
1921

2022
"github.com/platform-mesh/security-operator/internal/controller"
23+
mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager"
2124
)
2225

2326
var initializerCmd = &cobra.Command{
2427
Use: "initializer",
2528
Short: "FGA initializer for the organization workspacetype",
2629
RunE: func(cmd *cobra.Command, args []string) error {
30+
ctx, _, shutdown := pmcontext.StartContext(log, appCfg, defaultCfg.ShutdownTimeout)
31+
defer shutdown()
2732

2833
mgrCfg := ctrl.GetConfigOrDie()
2934

@@ -50,7 +55,17 @@ var initializerCmd = &cobra.Command{
5055
}
5156
mgrOpts.LeaderElectionConfig = inClusterCfg
5257
}
53-
mgr, err := kcp.NewClusterAwareManager(mgrCfg, mgrOpts)
58+
59+
provider, err := initializingworkspaces.New(mgrCfg, initializingworkspaces.Options{
60+
InitializerName: appCfg.InitializerName,
61+
Scheme: mgrOpts.Scheme,
62+
})
63+
if err != nil {
64+
log.Error().Err(err).Msg("unable to construct cluster provider")
65+
os.Exit(1)
66+
}
67+
68+
mgr, err := mcmanager.New(mgrCfg, provider, mgrOpts)
5469
if err != nil {
5570
setupLog.Error(err, "Failed to create manager")
5671
os.Exit(1)
@@ -60,7 +75,7 @@ var initializerCmd = &cobra.Command{
6075
utilruntime.Must(sourcev1.AddToScheme(runtimeScheme))
6176
utilruntime.Must(helmv2.AddToScheme(runtimeScheme))
6277

63-
orgClient, err := logicalClusterClientFromKey(mgr, log)(logicalcluster.Name("root:orgs"))
78+
orgClient, err := logicalClusterClientFromKey(mgr.GetLocalManager(), log)(logicalcluster.Name("root:orgs"))
6479
if err != nil {
6580
setupLog.Error(err, "Failed to create org client")
6681
os.Exit(1)
@@ -78,7 +93,12 @@ var initializerCmd = &cobra.Command{
7893
os.Exit(1)
7994
}
8095

81-
if err := controller.NewLogicalClusterReconciler(log, mgrCfg, mgr.GetClient(), orgClient, appCfg, inClusterClient).SetupWithManager(mgr, defaultCfg, log); err != nil {
96+
if appCfg.IDP.AdditionalRedirectURLs == nil {
97+
appCfg.IDP.AdditionalRedirectURLs = []string{}
98+
}
99+
100+
if err := controller.NewLogicalClusterReconciler(log, orgClient, appCfg, inClusterClient, mgr).
101+
SetupWithManager(mgr, defaultCfg); err != nil {
82102
setupLog.Error(err, "unable to create controller", "controller", "LogicalCluster")
83103
os.Exit(1)
84104
}
@@ -92,6 +112,12 @@ var initializerCmd = &cobra.Command{
92112
os.Exit(1)
93113
}
94114

115+
go func() {
116+
if err := provider.Run(ctx, mgr); err != nil {
117+
log.Fatal().Err(err).Msg("unable to run provider")
118+
}
119+
}()
120+
95121
setupLog.Info("starting manager")
96122

97123
return mgr.Start(ctrl.SetupSignalHandler())

cmd/model_generator.go

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package cmd
33
import (
44
"context"
55
"crypto/tls"
6+
"fmt"
67

8+
"github.com/kcp-dev/multicluster-provider/apiexport"
79
platformeshcontext "github.com/platform-mesh/golang-commons/context"
810
appsv1 "k8s.io/api/apps/v1"
911

@@ -13,9 +15,9 @@ import (
1315
"k8s.io/client-go/rest"
1416
ctrl "sigs.k8s.io/controller-runtime"
1517
"sigs.k8s.io/controller-runtime/pkg/healthz"
16-
"sigs.k8s.io/controller-runtime/pkg/kcp"
1718
"sigs.k8s.io/controller-runtime/pkg/manager"
1819
"sigs.k8s.io/controller-runtime/pkg/metrics/server"
20+
mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager"
1921

2022
securityv1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1"
2123
"github.com/platform-mesh/security-operator/internal/controller"
@@ -56,18 +58,31 @@ var modelGeneratorCmd = &cobra.Command{
5658
}
5759
mgrOpts.LeaderElectionConfig = inClusterCfg
5860
}
61+
runtimeScheme := runtime.NewScheme()
62+
utilruntime.Must(appsv1.AddToScheme(runtimeScheme))
63+
utilruntime.Must(securityv1alpha1.AddToScheme(runtimeScheme))
5964

60-
mgr, err := kcp.NewClusterAwareManager(cfg, mgrOpts)
65+
if mgrOpts.Scheme == nil {
66+
log.Error().Err(fmt.Errorf("scheme should not be nil")).Msg("scheme should not be nil")
67+
return fmt.Errorf("scheme should not be nil")
68+
}
69+
70+
provider, err := apiexport.New(cfg, apiexport.Options{
71+
Scheme: mgrOpts.Scheme,
72+
})
6173
if err != nil {
62-
setupLog.Error(err, "unable to setup manager")
74+
log.Error().Err(err).Msg("Failed to create apiexport provider")
75+
return err
6376
}
6477

65-
runtimeScheme := runtime.NewScheme()
66-
utilruntime.Must(appsv1.AddToScheme(runtimeScheme))
67-
utilruntime.Must(securityv1alpha1.AddToScheme(runtimeScheme))
78+
mgr, err := mcmanager.New(cfg, provider, mgrOpts)
79+
if err != nil {
80+
log.Error().Err(err).Msg("Failed to create manager")
81+
return err
82+
}
6883

69-
if err := controller.NewAPIBindingReconciler(mgr.GetClient(), log, logicalClusterClientFromKey(mgr, log)).
70-
SetupWithManager(mgr, log, defaultCfg); err != nil {
84+
if err := controller.NewAPIBindingReconciler(log, mgr).
85+
SetupWithManager(mgr, defaultCfg); err != nil {
7186
setupLog.Error(err, "unable to create controller", "controller", "Resource")
7287
return err
7388
}
@@ -81,6 +96,12 @@ var modelGeneratorCmd = &cobra.Command{
8196
return err
8297
}
8398

99+
go func() {
100+
if err := provider.Run(ctx, mgr); err != nil {
101+
log.Fatal().Err(err).Msg("unable to run provider")
102+
}
103+
}()
104+
84105
setupLog.Info("starting manager")
85106
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
86107
setupLog.Error(err, "problem running manager")

cmd/operator.go

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
apisv1alpha1 "github.com/kcp-dev/kcp/sdk/apis/apis/v1alpha1"
1212
kcpcorev1alpha1 "github.com/kcp-dev/kcp/sdk/apis/core/v1alpha1"
1313
"github.com/kcp-dev/logicalcluster/v3"
14+
"github.com/kcp-dev/multicluster-provider/apiexport"
1415
accountsv1alpha1 "github.com/platform-mesh/account-operator/api/v1alpha1"
1516
"google.golang.org/grpc"
1617
"google.golang.org/grpc/credentials/insecure"
@@ -23,8 +24,9 @@ import (
2324
ctrl "sigs.k8s.io/controller-runtime"
2425
"sigs.k8s.io/controller-runtime/pkg/client"
2526
"sigs.k8s.io/controller-runtime/pkg/healthz"
26-
"sigs.k8s.io/controller-runtime/pkg/kcp"
27+
2728
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
29+
mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager"
2830

2931
openfgav1 "github.com/openfga/api/proto/openfga/v1"
3032
platformeshcontext "github.com/platform-mesh/golang-commons/context"
@@ -35,15 +37,16 @@ import (
3537
kcptenancyv1alphav1 "github.com/kcp-dev/kcp/sdk/apis/tenancy/v1alpha1"
3638
corev1alpha1 "github.com/platform-mesh/security-operator/api/v1alpha1"
3739
"github.com/platform-mesh/security-operator/internal/controller"
38-
"github.com/platform-mesh/security-operator/internal/subroutine"
3940
// +kubebuilder:scaffold:imports
4041
)
4142

4243
var (
4344
scheme = runtime.NewScheme()
4445
)
4546

46-
func logicalClusterClientFromKey(mgr ctrl.Manager, log *logger.Logger) subroutine.NewLogicalClusterClientFunc {
47+
type NewLogicalClusterClientFunc func(clusterKey logicalcluster.Name) (client.Client, error)
48+
49+
func logicalClusterClientFromKey(mgr ctrl.Manager, log *logger.Logger) NewLogicalClusterClientFunc {
4750
return func(clusterKey logicalcluster.Name) (client.Client, error) {
4851
cfg := rest.CopyConfig(mgr.GetConfig())
4952

@@ -55,6 +58,8 @@ func logicalClusterClientFromKey(mgr ctrl.Manager, log *logger.Logger) subroutin
5558

5659
parsed.Path = fmt.Sprintf("/clusters/%s", clusterKey)
5760

61+
log.Info().Msg(fmt.Sprintf("HOST from logical cluster client from key -- %s", parsed.String()))
62+
5863
cfg.Host = parsed.String()
5964

6065
return client.New(cfg, client.Options{
@@ -110,9 +115,22 @@ var operatorCmd = &cobra.Command{
110115
mgrOpts.LeaderElectionConfig = inClusterCfg
111116
}
112117

113-
mgr, err := kcp.NewClusterAwareManager(cfg, mgrOpts)
118+
if mgrOpts.Scheme == nil {
119+
log.Error().Err(fmt.Errorf("scheme should not be nil")).Msg("scheme should not be nil")
120+
return fmt.Errorf("scheme should not be nil")
121+
}
122+
123+
provider, err := apiexport.New(cfg, apiexport.Options{
124+
Scheme: mgrOpts.Scheme,
125+
})
126+
if err != nil {
127+
setupLog.Error(err, "unable to construct cluster provider")
128+
return err
129+
}
130+
131+
mgr, err := mcmanager.New(cfg, provider, mgrOpts)
114132
if err != nil {
115-
log.Error().Err(err).Msg("unable to start manager")
133+
setupLog.Error(err, "Failed to create manager")
116134
return err
117135
}
118136

@@ -124,14 +142,14 @@ var operatorCmd = &cobra.Command{
124142

125143
fga := openfgav1.NewOpenFGAServiceClient(conn)
126144

127-
if err = controller.NewStoreReconciler(log, mgr.GetClient(), fga, logicalClusterClientFromKey(mgr, log)).
128-
SetupWithManager(mgr, defaultCfg, log); err != nil {
145+
if err = controller.NewStoreReconciler(log, fga, mgr).
146+
SetupWithManager(mgr, defaultCfg); err != nil {
129147
log.Error().Err(err).Str("controller", "store").Msg("unable to create controller")
130148
return err
131149
}
132150
if err = controller.
133-
NewAuthorizationModelReconciler(log, mgr.GetClient(), fga, logicalClusterClientFromKey(mgr, log)).
134-
SetupWithManager(mgr, defaultCfg, log); err != nil {
151+
NewAuthorizationModelReconciler(log, fga, mgr).
152+
SetupWithManager(mgr, defaultCfg); err != nil {
135153
log.Error().Err(err).Str("controller", "authorizationmodel").Msg("unable to create controller")
136154
return err
137155
}
@@ -146,6 +164,12 @@ var operatorCmd = &cobra.Command{
146164
return err
147165
}
148166

167+
go func() {
168+
if err := provider.Run(ctx, mgr); err != nil {
169+
log.Fatal().Err(err).Msg("unable to run provider")
170+
}
171+
}()
172+
149173
setupLog.Info("starting manager")
150174
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
151175
log.Error().Err(err).Msg("problem running manager")

0 commit comments

Comments
 (0)