@@ -20,16 +20,15 @@ import (
2020 "context"
2121 "fmt"
2222 "slices"
23- "sync"
2423 "time"
2524
2625 "golang.org/x/sync/errgroup"
2726
28- corev1 "k8s.io/api/core/v1"
2927 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3028 "k8s.io/apimachinery/pkg/util/sets"
3129 "k8s.io/apimachinery/pkg/util/wait"
3230 "k8s.io/client-go/rest"
31+ ctrl "sigs.k8s.io/controller-runtime"
3332 "sigs.k8s.io/controller-runtime/pkg/client"
3433 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3534
@@ -59,9 +58,10 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
5958 ctx context.Context
6059 cancel context.CancelFunc
6160
62- cli clusterclient.ClusterClient
63- workspace1 , workspace2 logicalcluster.Path
64- mgr mcmanager.Manager
61+ cli clusterclient.ClusterClient
62+ ws1Path , ws2Path logicalcluster.Path
63+ ws1 , ws2 * tenancyv1alpha1.Workspace
64+ mgr mcmanager.Manager
6565 )
6666
6767 BeforeAll (func () {
@@ -95,23 +95,23 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
9595 }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to wait for WorkspaceType to be ready" )
9696
9797 By ("creating Workspaces with the WorkspaceType with initializers" )
98- _ , workspace1 = envtest .NewInitializingWorkspaceFixture (GinkgoT (), cli , core .RootCluster .Path (),
98+ ws1 , ws1Path = envtest .NewInitializingWorkspaceFixture (GinkgoT (), cli , core .RootCluster .Path (),
9999 envtest .WithNamePrefix ("init-ws1" ),
100- envtest .WithType (core .RootCluster .Path (), tenancyv1alpha1 .WorkspaceTypeName ("e2e-test-ws-type" )))
100+ envtest .WithType (core .RootCluster .Path (), tenancyv1alpha1 .WorkspaceTypeName (workspaceTypeName )))
101101
102- _ , workspace2 = envtest .NewInitializingWorkspaceFixture (GinkgoT (), cli , core .RootCluster .Path (),
102+ ws2 , ws2Path = envtest .NewInitializingWorkspaceFixture (GinkgoT (), cli , core .RootCluster .Path (),
103103 envtest .WithNamePrefix ("init-ws2" ),
104- envtest .WithType (core .RootCluster .Path (), tenancyv1alpha1 .WorkspaceTypeName ("e2e-test-ws-type" )))
104+ envtest .WithType (core .RootCluster .Path (), tenancyv1alpha1 .WorkspaceTypeName (workspaceTypeName )))
105105 })
106106
107107 It ("sees both clusters with initializers" , func () {
108108 By ("getting LogicalCluster for workspaces and their cluster names" )
109109 lc1 := & kcpcorev1alpha1.LogicalCluster {}
110- err := cli .Cluster (workspace1 ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc1 )
110+ err := cli .Cluster (ws1Path ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc1 )
111111 Expect (err ).NotTo (HaveOccurred ())
112112
113113 lc2 := & kcpcorev1alpha1.LogicalCluster {}
114- err = cli .Cluster (workspace2 ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc2 )
114+ err = cli .Cluster (ws2Path ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc2 )
115115 Expect (err ).NotTo (HaveOccurred ())
116116 envtest .Eventually (GinkgoT (), func () (bool , string ) {
117117 return slices .Contains (lc1 .Status .Initializers , kcpcorev1alpha1 .LogicalClusterInitializer (initName )) && slices .Contains (lc2 .Status .Initializers , kcpcorev1alpha1 .LogicalClusterInitializer (initName )),
@@ -121,22 +121,21 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
121121
122122 Describe ("with a multicluster provider and manager" , func () {
123123 var (
124- lock sync.RWMutex
125124 engaged = sets .NewString ()
126125 p * initializingworkspaces.Provider
127126 g * errgroup.Group
128127 cancelGroup context.CancelFunc
129- configMapsCreated = sets .NewString ()
130128 initializersRemoved = sets .NewString ()
131129 )
132130
133131 BeforeAll (func () {
132+ cli , err := clusterclient .New (kcpConfig , client.Options {})
133+ Expect (err ).NotTo (HaveOccurred ())
134134 By ("creating a multicluster provider for initializing workspaces" )
135- var err error
136135
137136 // Get the initializing workspaces virtual workspace URL
138137 wt := & tenancyv1alpha1.WorkspaceType {}
139- err = cli .Cluster (core .RootCluster .Path ()).Get (ctx , client.ObjectKey {Name : "e2e-test-ws-type" }, wt )
138+ err = cli .Cluster (core .RootCluster .Path ()).Get (ctx , client.ObjectKey {Name : workspaceTypeName }, wt )
140139 Expect (err ).NotTo (HaveOccurred ())
141140 Expect (len (wt .Status .VirtualWorkspaces )).To (BeNumerically (">" , 0 ))
142141
@@ -155,55 +154,37 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
155154
156155 By ("creating a reconciler for LogicalClusters" )
157156 err = mcbuilder .ControllerManagedBy (mgr ).
158- Named ("logicalclusters " ).
157+ Named ("kcp-initializer-controller " ).
159158 For (& kcpcorev1alpha1.LogicalCluster {}).
160- Complete (mcreconcile .Func (func (ctx context.Context , request mcreconcile.Request ) (reconcile.Result , error ) {
161- By (fmt .Sprintf ("reconciling LogicalCluster %s in cluster %q" , request .Name , request .ClusterName ))
162- lock .Lock ()
163- defer lock .Unlock ()
164- engaged .Insert (request .ClusterName )
165- cl , err := mgr .GetCluster (ctx , request .ClusterName )
166- if err != nil {
167- return reconcile.Result {}, err
168- }
169-
170- lc := & kcpcorev1alpha1.LogicalCluster {}
171- if err := cl .GetClient ().Get (ctx , request .NamespacedName , lc ); err != nil {
172- return reconcile.Result {}, client .IgnoreNotFound (err )
173- }
174-
175- initializer := kcpcorev1alpha1 .LogicalClusterInitializer (initName )
176- hasInitializer := slices .Contains (lc .Status .Initializers , initializer )
177-
178- if hasInitializer {
179- cm := & corev1.ConfigMap {
180- ObjectMeta : metav1.ObjectMeta {
181- Name : "initializer-test-cm" ,
182- Namespace : "default" ,
183- },
184- Data : map [string ]string {
185- "cluster" : request .ClusterName ,
186- "test" : "value" ,
187- },
159+ Complete (mcreconcile .Func (
160+ func (ctx context.Context , request mcreconcile.Request ) (ctrl.Result , error ) {
161+ By (fmt .Sprintf ("reconciling LogicalCluster %s in cluster %q" , request .Name , request .ClusterName ))
162+ cl , err := mgr .GetCluster (ctx , request .ClusterName )
163+ if err != nil {
164+ return reconcile.Result {}, err
188165 }
166+ clusterClient := cl .GetClient ()
189167
190- if err := cl .GetClient ().Create (ctx , cm ); err == nil {
191- lock .Lock ()
192- configMapsCreated .Insert (request .ClusterName )
193- lock .Unlock ()
168+ lc := & kcpcorev1alpha1.LogicalCluster {}
169+ if err := clusterClient .Get (ctx , request .NamespacedName , lc ); err != nil {
170+ return reconcile.Result {}, err
194171 }
195172
196- patch := client .MergeFrom (lc .DeepCopy ())
197- lc .Status .Initializers = initialization .EnsureInitializerAbsent (initializer , lc .Status .Initializers )
198- if err := cl .GetClient ().Status ().Patch (ctx , lc , patch ); err == nil {
199- lock .Lock ()
173+ engaged .Insert (request .ClusterName )
174+ initializer := kcpcorev1alpha1 .LogicalClusterInitializer (initName )
175+
176+ if slices .Contains (lc .Status .Initializers , initializer ) {
177+ By (fmt .Sprintf ("removing initializer %q from LogicalCluster %s in cluster %q" , initName , request .Name , request .ClusterName ))
178+
179+ patch := client .MergeFrom (lc .DeepCopy ())
180+ lc .Status .Initializers = initialization .EnsureInitializerAbsent (initializer , lc .Status .Initializers )
181+ if err := clusterClient .Status ().Patch (ctx , lc , patch ); err != nil {
182+ return reconcile.Result {}, err
183+ }
200184 initializersRemoved .Insert (request .ClusterName )
201- lock .Unlock ()
202185 }
203- }
204-
205- return reconcile.Result {}, nil
206- }))
186+ return reconcile.Result {}, nil
187+ }))
207188 Expect (err ).NotTo (HaveOccurred ())
208189
209190 By ("starting the provider and manager" )
@@ -217,60 +198,41 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
217198 return mgr .Start (groupContext )
218199 })
219200 })
220- It ("creates ConfigMaps in both workspaces" , func () {
221- // Wait for ConfigMap in workspace1
201+ It ("engages both Logical Clusters with initializers" , func () {
222202 envtest .Eventually (GinkgoT (), func () (bool , string ) {
223- cm := & corev1.ConfigMap {}
224- err := cli .Cluster (workspace1 ).Get (ctx ,
225- client.ObjectKey {Namespace : "default" , Name : "initializer-test-cm" },
226- cm )
227- if err != nil {
228- return false , fmt .Sprintf ("failed to get ConfigMap in workspace1: %v" , err )
229- }
230- return true , ""
231- }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to create ConfigMap in workspace1" )
232-
233- // Wait for ConfigMap in workspace2
203+ return engaged .Has (ws1 .Spec .Cluster ), fmt .Sprintf ("failed to see workspace %q engaged as a cluster: %v" , ws1 .Spec .Cluster , engaged .List ())
204+ }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to see workspace %q engaged as a cluster: %v" , ws1 .Spec .Cluster , engaged .List ())
205+
234206 envtest .Eventually (GinkgoT (), func () (bool , string ) {
235- cm := & corev1.ConfigMap {}
236- err := cli .Cluster (workspace2 ).Get (ctx ,
237- client.ObjectKey {Namespace : "default" , Name : "initializer-test-cm" },
238- cm )
239- if err != nil {
240- return false , fmt .Sprintf ("failed to get ConfigMap in workspace2: %v" , err )
241- }
242- return true , ""
243- }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to create ConfigMap in workspace2" )
207+ return engaged .Has (ws2 .Spec .Cluster ), fmt .Sprintf ("failed to see workspace %q engaged as a cluster: %v" , ws2 .Spec .Cluster , engaged .List ())
208+ }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to see workspace %q engaged as a cluster: %v" , ws2 .Spec .Cluster , engaged .List ())
209+
210+ fmt .Println ("Engaged clusters:" , engaged .List ())
211+ fmt .Println ("Workspace 2:" , ws2 .Spec .Cluster )
244212 })
245213
246- It ("has removed initializers from both workspaces" , func () {
247- // Verify initializer removed in workspace1
214+ It ("removes initializers from the both clusters after engaging" , func () {
215+ envtest .Eventually (GinkgoT (), func () (bool , string ) {
216+ return initializersRemoved .Has (ws1 .Spec .Cluster ), fmt .Sprintf ("failed to see removed initializer from %q cluster: %v" , ws1 .Spec .Cluster , initializersRemoved .List ())
217+ }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to see removed initializer from %q cluster: %v" , ws1 .Spec .Cluster , initializersRemoved .List ())
218+
219+ envtest .Eventually (GinkgoT (), func () (bool , string ) {
220+ return initializersRemoved .Has (ws2 .Spec .Cluster ), fmt .Sprintf ("failed to see removed initializer from %q cluster: %v" , ws2 .Spec .Cluster , initializersRemoved .List ())
221+ }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to see removed initializer from %q cluster: %v" , ws2 .Spec .Cluster , initializersRemoved .List ())
222+
223+ By ("checking if LogicalClusters objects have no initializers left" )
224+ var err error
248225 lc1 := & kcpcorev1alpha1.LogicalCluster {}
249- err : = cli .Cluster (workspace1 ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc1 )
226+ err = cli .Cluster (ws1Path ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc1 )
250227 Expect (err ).NotTo (HaveOccurred ())
251228
252- hasInitializer := false
253- for _ , init := range lc1 .Status .Initializers {
254- if string (init ) == "root:e2e-test-ws-type" {
255- hasInitializer = true
256- break
257- }
258- }
259- Expect (hasInitializer ).To (BeFalse ())
260-
261- // Verify initializer removed in workspace2
262229 lc2 := & kcpcorev1alpha1.LogicalCluster {}
263- err = cli .Cluster (workspace2 ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc2 )
230+ err = cli .Cluster (ws2Path ).Get (ctx , client.ObjectKey {Name : "cluster" }, lc2 )
264231 Expect (err ).NotTo (HaveOccurred ())
265-
266- hasInitializer = false
267- for _ , init := range lc2 .Status .Initializers {
268- if string (init ) == "root:e2e-test-ws-type" {
269- hasInitializer = true
270- break
271- }
272- }
273- Expect (hasInitializer ).To (BeFalse ())
232+ envtest .Eventually (GinkgoT (), func () (bool , string ) {
233+ return ! slices .Contains (lc1 .Status .Initializers , kcpcorev1alpha1 .LogicalClusterInitializer (initName )) && ! slices .Contains (lc2 .Status .Initializers , kcpcorev1alpha1 .LogicalClusterInitializer (initName )),
234+ fmt .Sprintf ("Initializer not set: %v" , lc1 .Status ) + " " + fmt .Sprintf ("%v" , lc2 .Status )
235+ }, wait .ForeverTestTimeout , time .Millisecond * 100 , "failed to see removed initializers in both clusters" )
274236 })
275237
276238 AfterAll (func () {
0 commit comments