Skip to content

Commit c3c267a

Browse files
committed
Extend interface with runner
1 parent eb0549c commit c3c267a

File tree

12 files changed

+108
-27
lines changed

12 files changed

+108
-27
lines changed

examples/cluster-api/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ func main() {
9292
os.Exit(1)
9393
}
9494

95+
if err := provider.SetupWithManager(mcMgr); err != nil {
96+
entryLog.Error(err, "unable to set up provider")
97+
os.Exit(1)
98+
}
99+
95100
// Create a configmap controller in the multi-cluster manager.
96101
if err := mcbuilder.ControllerManagedBy(mcMgr).
97102
Named("multicluster-configmaps").
@@ -129,7 +134,7 @@ func main() {
129134
return ignoreCanceled(localMgr.Start(ctx))
130135
})
131136
g.Go(func() error {
132-
return ignoreCanceled(provider.Run(ctx, mcMgr))
137+
return ignoreCanceled(provider.Run(ctx))
133138
})
134139
g.Go(func() error {
135140
return ignoreCanceled(mcMgr.Start(ctx))

examples/kind/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ func main() {
5151
os.Exit(1)
5252
}
5353

54+
if err := provider.SetupWithManager(mgr); err != nil {
55+
entryLog.Error(err, "unable to set up provider")
56+
os.Exit(1)
57+
}
58+
5459
err = mcbuilder.ControllerManagedBy(mgr).
5560
Named("multicluster-configmaps").
5661
For(&corev1.ConfigMap{}).
@@ -85,7 +90,7 @@ func main() {
8590
// Starting everything.
8691
g, ctx := errgroup.WithContext(ctx)
8792
g.Go(func() error {
88-
return ignoreCanceled(provider.Run(ctx, mgr))
93+
return ignoreCanceled(provider.Run(ctx))
8994
})
9095
g.Go(func() error {
9196
return ignoreCanceled(mgr.Start(ctx))

examples/namespace/main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ func run(ctx context.Context, log logr.Logger, kubeconfig string) error {
122122
return fmt.Errorf("unable to set up overall controller manager: %w", err)
123123
}
124124

125+
if err := provider.SetupWithManager(mgr); err != nil {
126+
return fmt.Errorf("unable to set up provider: %w", err)
127+
}
128+
125129
if err := mcbuilder.ControllerManagedBy(mgr).
126130
Named("multicluster-configmaps").
127131
For(&corev1.ConfigMap{}).
@@ -154,7 +158,7 @@ func run(ctx context.Context, log logr.Logger, kubeconfig string) error {
154158
// Starting everything.
155159
g, ctx := errgroup.WithContext(ctx)
156160
g.Go(func() error {
157-
return ignoreCanceled(provider.Run(ctx, mgr))
161+
return ignoreCanceled(provider.Run(ctx))
158162
})
159163
g.Go(func() error {
160164
return ignoreCanceled(cl.Start(ctx))

pkg/multicluster/multicluster.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,9 @@ type Provider interface {
6060
// IndexField indexes the given object by the given field on all engaged
6161
// clusters, current and future.
6262
IndexField(ctx context.Context, obj client.Object, field string, extractValue client.IndexerFunc) error
63+
64+
// Run runs the provider. Implenetation of this method should block.
65+
// If you need to pass in manager, it is recommended to implement SetupWithManager(mgr mcmanager.Manager) error method on individual providers.
66+
// It is not part of the provider interface because it is not required for all providers.
67+
Run(ctx context.Context) error
6368
}

providers/cluster-api/provider.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,21 @@ func (p *Provider) Get(_ context.Context, clusterName string) (cluster.Cluster,
126126
return nil, multicluster.ErrClusterNotFound
127127
}
128128

129-
// Run starts the provider and blocks.
130-
func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error {
131-
p.log.Info("Starting Cluster-API cluster provider")
132-
129+
func (p *Provider) SetupWithManager(mgr mcmanager.Manager) error {
133130
p.lock.Lock()
131+
defer p.lock.Unlock()
132+
134133
p.mcMgr = mgr
135-
p.lock.Unlock()
134+
return nil
135+
}
136+
137+
// Run starts the provider and blocks.
138+
func (p *Provider) Run(ctx context.Context) error {
139+
if p.mcMgr == nil {
140+
return fmt.Errorf("manager is not set")
141+
}
142+
143+
p.log.Info("Starting Cluster-API cluster provider")
136144

137145
<-ctx.Done()
138146

providers/cluster-inventory-api/provider.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,3 +291,13 @@ func (p *Provider) IndexField(ctx context.Context, obj client.Object, field stri
291291

292292
return nil
293293
}
294+
295+
func (p *Provider) Run(ctx context.Context) error {
296+
if p.mcMgr == nil {
297+
return fmt.Errorf("manager is not set")
298+
}
299+
300+
<-ctx.Done()
301+
302+
return ctx.Err()
303+
}

providers/kind/provider.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ type index struct {
5757

5858
// Provider is a cluster Provider that works with a local Kind instance.
5959
type Provider struct {
60+
mcMgr mcmanager.Manager
61+
6062
opts []cluster.Option
6163
log logr.Logger
6264
lock sync.RWMutex
@@ -76,8 +78,20 @@ func (p *Provider) Get(ctx context.Context, clusterName string) (cluster.Cluster
7678
return nil, multicluster.ErrClusterNotFound
7779
}
7880

81+
func (p *Provider) SetupWithManager(mgr mcmanager.Manager) error {
82+
p.lock.Lock()
83+
defer p.lock.Unlock()
84+
85+
p.mcMgr = mgr
86+
return nil
87+
}
88+
7989
// Run starts the provider and blocks.
80-
func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error {
90+
func (p *Provider) Run(ctx context.Context) error {
91+
if p.mcMgr == nil {
92+
return fmt.Errorf("manager is not set")
93+
}
94+
8195
p.log.Info("Starting kind cluster provider")
8296

8397
provider := kind.NewProvider()
@@ -152,16 +166,15 @@ func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error {
152166
p.log.Info("Added new cluster", "cluster", clusterName)
153167

154168
// engage manager
155-
if mgr != nil {
156-
if err := mgr.Engage(clusterCtx, clusterName, cl); err != nil {
157-
log.Error(err, "failed to engage manager")
158-
p.lock.Lock()
159-
delete(p.clusters, clusterName)
160-
delete(p.cancelFns, clusterName)
161-
p.lock.Unlock()
162-
return false, nil
163-
}
169+
if err := p.mcMgr.Engage(clusterCtx, clusterName, cl); err != nil {
170+
log.Error(err, "failed to engage manager")
171+
p.lock.Lock()
172+
delete(p.clusters, clusterName)
173+
delete(p.cancelFns, clusterName)
174+
p.lock.Unlock()
175+
return false, nil
164176
}
177+
165178
}
166179

167180
// remove old clusters

providers/kubeconfig/provider.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ func (p *Provider) getCluster(clusterName string) (activeCluster, bool) {
119119
return ac, exists
120120
}
121121

122+
// Run runs the provider and blocks.
123+
func (p *Provider) Run(ctx context.Context) error {
124+
<-ctx.Done()
125+
126+
return nil
127+
}
128+
122129
// setCluster adds a cluster with write lock
123130
func (p *Provider) setCluster(clusterName string, ac activeCluster) {
124131
p.lock.Lock()

providers/namespace/provider.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ var _ multicluster.Provider = &Provider{}
4343
// informer to watch objects for all namespaces.
4444
type Provider struct {
4545
cluster cluster.Cluster
46+
manager mcmanager.Manager
4647

4748
log logr.Logger
4849
lock sync.RWMutex
@@ -60,8 +61,18 @@ func New(cl cluster.Cluster) *Provider {
6061
}
6162
}
6263

64+
// SetupWithManager sets the manager on the provider.
65+
func (p *Provider) SetupWithManager(mgr mcmanager.Manager) error {
66+
p.manager = mgr
67+
return nil
68+
}
69+
6370
// Run starts the provider and blocks.
64-
func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error {
71+
func (p *Provider) Run(ctx context.Context) error {
72+
if p.manager == nil {
73+
return fmt.Errorf("manager is not set")
74+
}
75+
6576
nsInf, err := p.cluster.GetCache().GetInformer(ctx, &corev1.Namespace{})
6677
if err != nil {
6778
return err
@@ -88,7 +99,7 @@ func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error {
8899
p.cancelFns[ns.Name] = cancel
89100
p.lock.Unlock()
90101

91-
if err := mgr.Engage(clusterCtx, ns.Name, cl); err != nil {
102+
if err := p.manager.Engage(clusterCtx, ns.Name, cl); err != nil {
92103
utilruntime.HandleError(fmt.Errorf("failed to engage manager with cluster %q: %w", ns.Name, err))
93104

94105
// cleanup

providers/namespace/provider_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ var _ = Describe("Provider Namespace", Ordered, func() {
7171
var err error
7272
mgr, err = mcmanager.New(cfg, provider, manager.Options{})
7373
Expect(err).NotTo(HaveOccurred())
74+
err = provider.SetupWithManager(mgr)
75+
Expect(err).NotTo(HaveOccurred())
7476
})
7577

7678
By("Setting up the controller feeding the animals", func() {
@@ -119,7 +121,7 @@ var _ = Describe("Provider Namespace", Ordered, func() {
119121

120122
By("Starting the provider, cluster, manager, and controller", func() {
121123
g.Go(func() error {
122-
return ignoreCanceled(provider.Run(ctx, mgr))
124+
return ignoreCanceled(provider.Run(ctx))
123125
})
124126
g.Go(func() error {
125127
return ignoreCanceled(cl.Start(ctx))

0 commit comments

Comments
 (0)