Skip to content

Commit ba11d92

Browse files
committed
finish up the init vw e2e test
Signed-off-by: Karol Szwaj <[email protected]> On-behalf-of: @SAP [email protected]
1 parent b896fdf commit ba11d92

File tree

3 files changed

+66
-102
lines changed

3 files changed

+66
-102
lines changed

providers/apiexport/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import (
4141
kcpcache "github.com/kcp-dev/apimachinery/v2/pkg/cache"
4242
apisv1alpha1 "github.com/kcp-dev/kcp/sdk/apis/apis/v1alpha1"
4343
"github.com/kcp-dev/logicalcluster/v3"
44+
4445
"github.com/kcp-dev/multicluster-provider/shared"
4546
)
4647

providers/initializingworkspaces/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
kcpcache "github.com/kcp-dev/apimachinery/v2/pkg/cache"
4343
kcpcorev1alpha1 "github.com/kcp-dev/kcp/sdk/apis/core/v1alpha1"
4444
"github.com/kcp-dev/logicalcluster/v3"
45+
4546
"github.com/kcp-dev/multicluster-provider/shared"
4647
)
4748

test/e2e/initializingworkspaces_test.go

Lines changed: 64 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)