diff --git a/examples/cluster-api/main.go b/examples/cluster-api/main.go index 71df954..814c4e3 100644 --- a/examples/cluster-api/main.go +++ b/examples/cluster-api/main.go @@ -129,7 +129,7 @@ func main() { return ignoreCanceled(localMgr.Start(ctx)) }) g.Go(func() error { - return ignoreCanceled(provider.Run(ctx, mcMgr)) + return ignoreCanceled(provider.Start(ctx, mcMgr)) }) g.Go(func() error { return ignoreCanceled(mcMgr.Start(ctx)) diff --git a/examples/file/main.go b/examples/file/main.go index edf99f7..2101d11 100644 --- a/examples/file/main.go +++ b/examples/file/main.go @@ -114,7 +114,7 @@ func main() { return ignoreCanceled(mgr.Start(ctx)) }) g.Go(func() error { - return ignoreCanceled(provider.Run(ctx, mgr)) + return ignoreCanceled(provider.Start(ctx, mgr)) }) if err := g.Wait(); err != nil { entryLog.Info("error in errgroup: %w", err) diff --git a/examples/kind/main.go b/examples/kind/main.go index c532483..97901de 100644 --- a/examples/kind/main.go +++ b/examples/kind/main.go @@ -92,7 +92,7 @@ func main() { // Starting everything. g, ctx := errgroup.WithContext(ctx) g.Go(func() error { - return ignoreCanceled(provider.Run(ctx, mgr)) + return ignoreCanceled(provider.Start(ctx, mgr)) }) g.Go(func() error { return ignoreCanceled(mgr.Start(ctx)) diff --git a/examples/namespace/main.go b/examples/namespace/main.go index cc6458b..5de5a2b 100644 --- a/examples/namespace/main.go +++ b/examples/namespace/main.go @@ -154,7 +154,7 @@ func run(ctx context.Context, log logr.Logger, kubeconfig string) error { // Starting everything. g, ctx := errgroup.WithContext(ctx) g.Go(func() error { - return ignoreCanceled(provider.Run(ctx, mgr)) + return ignoreCanceled(provider.Start(ctx, mgr)) }) g.Go(func() error { return ignoreCanceled(cl.Start(ctx)) diff --git a/pkg/multicluster/multicluster.go b/pkg/multicluster/multicluster.go index 4f6f777..87d137e 100644 --- a/pkg/multicluster/multicluster.go +++ b/pkg/multicluster/multicluster.go @@ -60,4 +60,9 @@ type Provider interface { // IndexField indexes the given object by the given field on all engaged // clusters, current and future. IndexField(ctx context.Context, obj client.Object, field string, extractValue client.IndexerFunc) error + + // Start runs the provider. Implementation of this method should block. + // If you need to pass in manager, it is recommended to implement SetupWithManager(mgr mcmanager.Manager) error method on individual providers. + // It is not part of the provider interface because it is not required for all providers. + Start(context.Context, Aware) error } diff --git a/providers/cluster-api/provider.go b/providers/cluster-api/provider.go index 08de02d..2cfa840 100644 --- a/providers/cluster-api/provider.go +++ b/providers/cluster-api/provider.go @@ -39,7 +39,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -109,7 +108,7 @@ type Provider struct { client client.Client lock sync.Mutex - mcMgr mcmanager.Manager + aware multicluster.Aware clusters map[string]cluster.Cluster cancelFns map[string]context.CancelFunc indexers []index @@ -126,13 +125,14 @@ func (p *Provider) Get(_ context.Context, clusterName string) (cluster.Cluster, return nil, multicluster.ErrClusterNotFound } -// Run starts the provider and blocks. -func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { - p.log.Info("Starting Cluster-API cluster provider") - +// Start starts the provider and blocks. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { p.lock.Lock() - p.mcMgr = mgr - p.lock.Unlock() + defer p.lock.Unlock() + + p.aware = aware + + p.log.Info("Starting Cluster-API cluster provider") <-ctx.Done() @@ -171,7 +171,7 @@ func (p *Provider) Reconcile(ctx context.Context, req reconcile.Request) (reconc // TODO(sttts): do tighter logging. // provider already started? - if p.mcMgr == nil { + if p.aware == nil { return reconcile.Result{RequeueAfter: time.Second * 2}, nil } @@ -222,7 +222,7 @@ func (p *Provider) Reconcile(ctx context.Context, req reconcile.Request) (reconc p.log.Info("Added new cluster") // engage manager. - if err := p.mcMgr.Engage(clusterCtx, key, cl); err != nil { + if err := p.aware.Engage(clusterCtx, key, cl); err != nil { log.Error(err, "failed to engage manager") delete(p.clusters, key) delete(p.cancelFns, key) diff --git a/providers/cluster-inventory-api/provider.go b/providers/cluster-inventory-api/provider.go index 72d33d4..d71f786 100644 --- a/providers/cluster-inventory-api/provider.go +++ b/providers/cluster-inventory-api/provider.go @@ -73,7 +73,7 @@ type Provider struct { strategy kubeconfigstrategy.Interface lock sync.RWMutex - mcMgr mcmanager.Manager + manager mcmanager.Manager clusters map[string]cluster.Cluster cancelFns map[string]context.CancelFunc kubeconfig map[string]*rest.Config @@ -114,7 +114,7 @@ func (p *Provider) SetupWithManager(mgr mcmanager.Manager) error { if mgr == nil { return fmt.Errorf("manager is nil") } - p.mcMgr = mgr + p.manager = mgr // Get the local manager from the multi-cluster manager. localMgr := mgr.GetLocalManager() @@ -188,7 +188,7 @@ func (p *Provider) Reconcile(ctx context.Context, req reconcile.Request) (reconc defer p.lock.Unlock() // provider already started? - if p.mcMgr == nil { + if p.manager == nil { log.V(3).Info("Provider not started yet, requeuing") return reconcile.Result{RequeueAfter: time.Second * 2}, nil } @@ -257,7 +257,7 @@ func (p *Provider) Reconcile(ctx context.Context, req reconcile.Request) (reconc log.Info("Added new cluster for ClusterProfile") // engage manager. - if err := p.mcMgr.Engage(clusterCtx, key, cl); err != nil { + if err := p.manager.Engage(clusterCtx, key, cl); err != nil { log.Error(err, "failed to engage manager for ClusterProfile") delete(p.clusters, key) delete(p.cancelFns, key) @@ -291,3 +291,9 @@ func (p *Provider) IndexField(ctx context.Context, obj client.Object, field stri return nil } + +// Start runs the provider and blocks. +func (p *Provider) Start(ctx context.Context, _ multicluster.Aware) error { + <-ctx.Done() + return ctx.Err() +} diff --git a/providers/file/provider.go b/providers/file/provider.go index a36a96b..f9ffc6d 100644 --- a/providers/file/provider.go +++ b/providers/file/provider.go @@ -33,7 +33,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/cluster" "sigs.k8s.io/controller-runtime/pkg/log" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -137,14 +136,19 @@ type Provider struct { log logr.Logger - clustersLock sync.RWMutex + lock sync.RWMutex + aware multicluster.Aware clusters map[string]cluster.Cluster clusterCancel map[string]func() } -// Run starts the provider and updates the clusters and is blocking. -func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { - if err := p.run(ctx, mgr); err != nil { +// Start starts the provider and updates the clusters and is blocking. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { + p.lock.Lock() + defer p.lock.Unlock() + p.aware = aware + + if err := p.run(ctx); err != nil { return fmt.Errorf("initial update failed: %w", err) } @@ -181,7 +185,7 @@ func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { // would also require to track which cluster belongs to // which file. // Instead clusters are just updated from all files. - if err := p.run(ctx, mgr); err != nil { + if err := p.run(ctx); err != nil { p.log.Error(err, "failed to update clusters after file change") } case err, ok := <-watcher.Errors: @@ -194,17 +198,17 @@ func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { } // RunOnce performs a single update of the clusters. -func (p *Provider) RunOnce(ctx context.Context, mgr mcmanager.Manager) error { - return p.run(ctx, mgr) +func (p *Provider) RunOnce(ctx context.Context) error { + return p.run(ctx) } -func (p *Provider) addCluster(ctx context.Context, mgr mcmanager.Manager, name string, cl cluster.Cluster) { +func (p *Provider) addCluster(ctx context.Context, name string, cl cluster.Cluster) { ctx, cancel := context.WithCancel(ctx) - p.clustersLock.Lock() + p.lock.Lock() p.clusters[name] = cl p.clusterCancel[name] = cancel - p.clustersLock.Unlock() + p.lock.Unlock() go func() { if err := cl.Start(ctx); err != nil { @@ -213,8 +217,8 @@ func (p *Provider) addCluster(ctx context.Context, mgr mcmanager.Manager, name s p.removeCluster(name) }() - if mgr != nil { - if err := mgr.Engage(ctx, name, cl); err != nil { + if p.aware != nil { + if err := p.aware.Engage(ctx, name, cl); err != nil { cancel() p.log.Error(err, "failed to engage cluster", "name", name) } @@ -222,8 +226,8 @@ func (p *Provider) addCluster(ctx context.Context, mgr mcmanager.Manager, name s } func (p *Provider) removeCluster(name string) { - p.clustersLock.Lock() - defer p.clustersLock.Unlock() + p.lock.Lock() + defer p.lock.Unlock() if cancel, ok := p.clusterCancel[name]; ok { cancel() @@ -232,7 +236,11 @@ func (p *Provider) removeCluster(name string) { } } -func (p *Provider) run(ctx context.Context, mgr mcmanager.Manager) error { +func (p *Provider) run(ctx context.Context) error { + if p.aware == nil { + return fmt.Errorf("aware is not set") + } + loadedClusters, err := p.loadClusters() if err != nil { return fmt.Errorf("failed to load clusters: %w", err) @@ -247,12 +255,12 @@ func (p *Provider) run(ctx context.Context, mgr mcmanager.Manager) error { if !cmp.Equal(existingCluster.GetConfig(), cl.GetConfig()) { p.log.Info("updating cluster", "name", name) p.removeCluster(name) - p.addCluster(ctx, mgr, name, cl) + p.addCluster(ctx, name, cl) } continue } p.log.Info("adding cluster", "name", name) - p.addCluster(ctx, mgr, name, cl) + p.addCluster(ctx, name, cl) } // delete clusters that are no longer present @@ -271,8 +279,8 @@ func (p *Provider) run(ctx context.Context, mgr mcmanager.Manager) error { // If the cluster name is empty (""), it returns the first cluster // found. func (p *Provider) Get(_ context.Context, clusterName string) (cluster.Cluster, error) { - p.clustersLock.RLock() - defer p.clustersLock.RUnlock() + p.lock.RLock() + defer p.lock.RUnlock() if clusterName == "" { for _, cl := range p.clusters { @@ -289,8 +297,8 @@ func (p *Provider) Get(_ context.Context, clusterName string) (cluster.Cluster, // IndexField indexes a field on all clusters. func (p *Provider) IndexField(ctx context.Context, obj client.Object, field string, extractValue client.IndexerFunc) error { - p.clustersLock.RLock() - defer p.clustersLock.RUnlock() + p.lock.RLock() + defer p.lock.RUnlock() for name, cl := range p.clusters { if err := cl.GetCache().IndexField(ctx, obj, field, extractValue); err != nil { @@ -302,7 +310,7 @@ func (p *Provider) IndexField(ctx context.Context, obj client.Object, field stri // ClusterNames returns the names of all clusters known to the provider. func (p *Provider) ClusterNames() []string { - p.clustersLock.RLock() - defer p.clustersLock.RUnlock() + p.lock.RLock() + defer p.lock.RUnlock() return slices.Sorted(maps.Keys(p.clusters)) } diff --git a/providers/file/provider_test.go b/providers/file/provider_test.go index 56d9537..8ce6acd 100644 --- a/providers/file/provider_test.go +++ b/providers/file/provider_test.go @@ -54,11 +54,12 @@ var _ = Describe("Provider File", Ordered, func() { KubeconfigDirs: []string{discoverDir}, }) Expect(err).NotTo(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) By("Starting the provider", func() { g.Go(func() error { - return ignoreCanceled(provider.Run(ctx, nil)) + return ignoreCanceled(provider.Start(ctx, nil)) // Pass nil for aware since we are not using a manager in this test }) }) diff --git a/providers/kind/go.mod b/providers/kind/go.mod index 27454be..c7e67f8 100644 --- a/providers/kind/go.mod +++ b/providers/kind/go.mod @@ -16,12 +16,9 @@ require ( require ( github.com/BurntSushi/toml v1.4.0 // indirect github.com/alessio/shellescape v1.4.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect @@ -41,10 +38,6 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -54,7 +47,6 @@ require ( golang.org/x/term v0.30.0 // indirect golang.org/x/text v0.23.0 // indirect golang.org/x/time v0.9.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/providers/kind/go.sum b/providers/kind/go.sum index 8179ce2..7d3863d 100644 --- a/providers/kind/go.sum +++ b/providers/kind/go.sum @@ -16,8 +16,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= @@ -64,8 +62,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -73,8 +69,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= diff --git a/providers/kind/provider.go b/providers/kind/provider.go index 97a7b04..a187bfd 100644 --- a/providers/kind/provider.go +++ b/providers/kind/provider.go @@ -34,7 +34,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/cluster" "sigs.k8s.io/controller-runtime/pkg/log" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -57,6 +56,8 @@ type index struct { // Provider is a cluster Provider that works with a local Kind instance. type Provider struct { + mcaware multicluster.Aware + opts []cluster.Option log logr.Logger lock sync.RWMutex @@ -76,8 +77,10 @@ func (p *Provider) Get(ctx context.Context, clusterName string) (cluster.Cluster return nil, multicluster.ErrClusterNotFound } -// Run starts the provider and blocks. -func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { +// Start starts the provider and blocks. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { + p.mcaware = aware + p.log.Info("Starting kind cluster provider") provider := kind.NewProvider() @@ -152,15 +155,13 @@ func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { p.log.Info("Added new cluster", "cluster", clusterName) // engage manager - if mgr != nil { - if err := mgr.Engage(clusterCtx, clusterName, cl); err != nil { - log.Error(err, "failed to engage manager") - p.lock.Lock() - delete(p.clusters, clusterName) - delete(p.cancelFns, clusterName) - p.lock.Unlock() - return false, nil - } + if err := p.mcaware.Engage(clusterCtx, clusterName, cl); err != nil { + log.Error(err, "failed to engage manager") + p.lock.Lock() + delete(p.clusters, clusterName) + delete(p.cancelFns, clusterName) + p.lock.Unlock() + return false, nil } } diff --git a/providers/kubeconfig/provider.go b/providers/kubeconfig/provider.go index c631431..5bb0337 100644 --- a/providers/kubeconfig/provider.go +++ b/providers/kubeconfig/provider.go @@ -93,12 +93,12 @@ type index struct { // Provider is a cluster provider that watches for secrets containing kubeconfig data // and engages clusters based on those kubeconfigs. type Provider struct { - opts Options - log logr.Logger - lock sync.RWMutex // protects clusters and indexers - clusters map[string]activeCluster - indexers []index - mgr mcmanager.Manager + opts Options + log logr.Logger + lock sync.RWMutex // protects clusters and indexers + clusters map[string]activeCluster + indexers []index + mcmanager mcmanager.Manager } type activeCluster struct { @@ -117,6 +117,13 @@ func (p *Provider) getCluster(clusterName string) (activeCluster, bool) { return ac, exists } +// Start runs the provider and blocks. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { + <-ctx.Done() + + return nil +} + // setCluster adds a cluster with write lock func (p *Provider) setCluster(clusterName string, ac activeCluster) { p.lock.Lock() @@ -150,7 +157,7 @@ func (p *Provider) SetupWithManager(ctx context.Context, mgr mcmanager.Manager) if mgr == nil { return fmt.Errorf("manager is nil") } - p.mgr = mgr + p.mcmanager = mgr // Get the local manager from the multicluster manager localMgr := mgr.GetLocalManager() @@ -233,7 +240,7 @@ func (p *Provider) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result // getSecret retrieves a secret and handles not found errors func (p *Provider) getSecret(ctx context.Context, namespacedName client.ObjectKey) (*corev1.Secret, error) { secret := &corev1.Secret{} - if err := p.mgr.GetLocalManager().GetClient().Get(ctx, namespacedName, secret); err != nil { + if err := p.mcmanager.GetLocalManager().GetClient().Get(ctx, namespacedName, secret); err != nil { if apierrors.IsNotFound(err) { return nil, nil // Secret not found is not an error } @@ -305,7 +312,7 @@ func (p *Provider) createAndEngageCluster(ctx context.Context, clusterName strin log.Info("Successfully added cluster") // Engage cluster so that the manager can start operating on the cluster - if err := p.mgr.Engage(clusterCtx, clusterName, cl); err != nil { + if err := p.mcmanager.Engage(clusterCtx, clusterName, cl); err != nil { log.Error(err, "Failed to engage manager, removing cluster") p.removeCluster(clusterName) return fmt.Errorf("failed to engage manager: %w", err) diff --git a/providers/namespace/provider.go b/providers/namespace/provider.go index d2d52be..352602f 100644 --- a/providers/namespace/provider.go +++ b/providers/namespace/provider.go @@ -31,7 +31,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/cluster" "sigs.k8s.io/controller-runtime/pkg/log" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -43,6 +42,7 @@ var _ multicluster.Provider = &Provider{} // informer to watch objects for all namespaces. type Provider struct { cluster cluster.Cluster + aware multicluster.Aware log logr.Logger lock sync.RWMutex @@ -60,8 +60,12 @@ func New(cl cluster.Cluster) *Provider { } } -// Run starts the provider and blocks. -func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { +// Start starts the provider and blocks. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { + p.lock.Lock() + p.aware = aware + p.lock.Unlock() + nsInf, err := p.cluster.GetCache().GetInformer(ctx, &corev1.Namespace{}) if err != nil { return err @@ -88,7 +92,7 @@ func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { p.cancelFns[ns.Name] = cancel p.lock.Unlock() - if err := mgr.Engage(clusterCtx, ns.Name, cl); err != nil { + if err := p.aware.Engage(clusterCtx, ns.Name, cl); err != nil { utilruntime.HandleError(fmt.Errorf("failed to engage manager with cluster %q: %w", ns.Name, err)) // cleanup diff --git a/providers/namespace/provider_test.go b/providers/namespace/provider_test.go index aa360a5..e3b42ce 100644 --- a/providers/namespace/provider_test.go +++ b/providers/namespace/provider_test.go @@ -71,6 +71,7 @@ var _ = Describe("Provider Namespace", Ordered, func() { var err error mgr, err = mcmanager.New(cfg, provider, manager.Options{}) Expect(err).NotTo(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) By("Setting up the controller feeding the animals", func() { @@ -119,7 +120,7 @@ var _ = Describe("Provider Namespace", Ordered, func() { By("Starting the provider, cluster, manager, and controller", func() { g.Go(func() error { - return ignoreCanceled(provider.Run(ctx, mgr)) + return ignoreCanceled(provider.Start(ctx, mgr)) }) g.Go(func() error { return ignoreCanceled(cl.Start(ctx)) diff --git a/providers/nop/provider.go b/providers/nop/provider.go index 41cb667..67055a0 100644 --- a/providers/nop/provider.go +++ b/providers/nop/provider.go @@ -22,7 +22,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/cluster" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -36,8 +35,8 @@ func New() *Provider { return &Provider{} } -// Run starts the provider and blocks. -func (p *Provider) Run(ctx context.Context, _ mcmanager.Manager) error { +// Start starts the provider and blocks. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { <-ctx.Done() return nil } diff --git a/providers/single/provider.go b/providers/single/provider.go index b3db21c..ab5caba 100644 --- a/providers/single/provider.go +++ b/providers/single/provider.go @@ -18,11 +18,11 @@ package namespace import ( "context" + "fmt" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/cluster" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -43,9 +43,13 @@ func New(name string, cl cluster.Cluster) *Provider { } } -// Run starts the provider and blocks. -func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { - if err := mgr.Engage(ctx, p.name, p.cl); err != nil { +// Start starts the provider and blocks. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { + if aware == nil { + return fmt.Errorf("manager is not set") + } + + if err := aware.Engage(ctx, p.name, p.cl); err != nil { return err } <-ctx.Done()