@@ -37,7 +37,7 @@ func TestUtils(t *testing.T) {
3737 RunSpecs (t , "ClusterAccess Test Suite" )
3838}
3939
40- func buildTestEnvironmentReconcile (testdataDir string , objectsWitStatus ... client.Object ) * testutils.Environment {
40+ func buildTestEnvironmentReconcile (testdataDir string , skipWorkloadCluster bool , objectsWitStatus ... client.Object ) * testutils.Environment {
4141 scheme := runtime .NewScheme ()
4242 utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
4343 utilruntime .Must (clustersv1alpha1 .AddToScheme (scheme ))
@@ -74,6 +74,9 @@ func buildTestEnvironmentReconcile(testdataDir string, objectsWitStatus ...clien
7474 WithWorkloadPermissions (permissions ).
7575 WithWorkloadRoleRefs (roleRefs ).
7676 WithRetryInterval (1 * time .Second )
77+ if skipWorkloadCluster {
78+ r .SkipWorkloadCluster ()
79+ }
7780 return r
7881 }).
7982 WithDynamicObjectsWithStatus (objectsWitStatus ... ).
@@ -88,7 +91,7 @@ func (dr *deleteReconciler) Reconcile(ctx context.Context, req reconcile.Request
8891 return dr .r .ReconcileDelete (ctx , req )
8992}
9093
91- func buildTestEnvironmentDelete (testdataDir string , objectsWitStatus ... client.Object ) * testutils.Environment {
94+ func buildTestEnvironmentDelete (testdataDir string , skipWorkloadCluster bool , objectsWitStatus ... client.Object ) * testutils.Environment {
9295 scheme := runtime .NewScheme ()
9396 utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
9497 utilruntime .Must (clustersv1alpha1 .AddToScheme (scheme ))
@@ -100,6 +103,10 @@ func buildTestEnvironmentDelete(testdataDir string, objectsWitStatus ...client.O
100103 r := clusteraccess .NewClusterAccessReconciler (c , controllerName )
101104 r .WithRetryInterval (1 * time .Second )
102105
106+ if skipWorkloadCluster {
107+ r .SkipWorkloadCluster ()
108+ }
109+
103110 dr := & deleteReconciler {
104111 r : r ,
105112 }
@@ -122,13 +129,15 @@ func buildTestEnvironmentNoReconcile(testdataDir string, objectsWitStatus ...cli
122129 Build ()
123130}
124131
132+ const (
133+ expectedRequestNamespace = "mcp--80158a25-6874-80a6-a75d-94f57da600c0"
134+ )
135+
125136var _ = Describe ("ClusterAccessReconciler" , func () {
126137 Context ("Reconcile" , func () {
127138 It ("should create MCP-/Workload ClusterRequests/AccessRequests" , func () {
128139 var reconcileResult reconcile.Result
129140
130- expectedRequestNamespace := "mcp--80158a25-6874-80a6-a75d-94f57da600c0"
131-
132141 request := reconcile.Request {
133142 NamespacedName : client.ObjectKey {
134143 Name : "instance" ,
@@ -157,7 +166,7 @@ var _ = Describe("ClusterAccessReconciler", func() {
157166 },
158167 }
159168
160- env := buildTestEnvironmentReconcile ("test-01" , accessRequestMCP , clusterRequestWorkload , accessRequestWorkload )
169+ env := buildTestEnvironmentReconcile ("test-01" , false , accessRequestMCP , clusterRequestWorkload , accessRequestWorkload )
161170
162171 reconcileResult = env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
163172 Expect (reconcileResult .RequeueAfter ).ToNot (BeZero (), "reconcile should requeue after a delay" )
@@ -244,6 +253,85 @@ var _ = Describe("ClusterAccessReconciler", func() {
244253 Expect (workloadCluster ).ToNot (BeNil (), "should return a valid Workload cluster" )
245254 })
246255
256+ It ("should create MCP-/Workload ClusterRequests/AccessRequests without Workload Cluster" , func () {
257+ var reconcileResult reconcile.Result
258+
259+ request := reconcile.Request {
260+ NamespacedName : client.ObjectKey {
261+ Name : "instance" ,
262+ Namespace : "test" ,
263+ },
264+ }
265+
266+ accessRequestMCP := & clustersv1alpha1.AccessRequest {
267+ ObjectMeta : metav1.ObjectMeta {
268+ Name : clusteraccess .StableRequestName (controllerName , request ) + "--mcp" ,
269+ Namespace : expectedRequestNamespace ,
270+ },
271+ }
272+
273+ env := buildTestEnvironmentReconcile ("test-01" , true , accessRequestMCP )
274+
275+ reconcileResult = env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
276+ Expect (reconcileResult .RequeueAfter ).ToNot (BeZero (), "reconcile should requeue after a delay" )
277+
278+ // reconcile now waits until the request namespace is being created
279+ // the format if the request namespace is "ob-<onboarding-namespace>"
280+ // create the expected request namespace
281+ requestNamespace := & corev1.Namespace {
282+ ObjectMeta : metav1.ObjectMeta {
283+ Name : expectedRequestNamespace ,
284+ },
285+ }
286+
287+ Expect (env .Client ().Create (env .Ctx , requestNamespace )).To (Succeed ())
288+
289+ // reconcile again to process the request
290+ env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
291+
292+ // there should be an access request for the MCP cluster created
293+ Expect (env .Client ().Get (env .Ctx , client .ObjectKeyFromObject (accessRequestMCP ), accessRequestMCP )).To (Succeed ())
294+
295+ // set the access request status to "Granted"
296+ accessRequestMCP .Status = clustersv1alpha1.AccessRequestStatus {
297+ Status : commonapi.Status {
298+ Phase : clustersv1alpha1 .REQUEST_GRANTED ,
299+ },
300+ }
301+ Expect (env .Client ().Status ().Update (env .Ctx , accessRequestMCP )).To (Succeed ())
302+
303+ // reconcile again to process the granted access request
304+ env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
305+
306+ // set the secret reference for the MCP access request
307+ accessRequestMCP .Status .SecretRef = & commonapi.ObjectReference {
308+ Name : "mcp-access" ,
309+ Namespace : expectedRequestNamespace ,
310+ }
311+ Expect (env .Client ().Status ().Update (env .Ctx , accessRequestMCP )).To (Succeed ())
312+
313+ // reconcile again to process the granted access request
314+ env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
315+
316+ // cast to ClusterAccessReconciler to access the reconcilerImpl methods
317+ reconciler , ok := env .Reconciler ().(clusteraccess.Reconciler ) // nolint:staticcheck
318+ Expect (ok ).To (BeTrue (), "reconcilerImpl should be of type ClusterAccessReconciler" )
319+
320+ mcpCluster , err := reconciler .MCPCluster (env .Ctx , request )
321+ Expect (err ).ToNot (HaveOccurred (), "should not return an error when getting MCP cluster" )
322+ Expect (mcpCluster ).ToNot (BeNil (), "should return a valid MCP cluster" )
323+
324+ _ , err = reconciler .WorkloadCluster (env .Ctx , request )
325+ Expect (err ).To (HaveOccurred (), "should return an error when trying to get the Workload cluster" )
326+
327+ accessRequestList := & clustersv1alpha1.AccessRequestList {}
328+ Expect (env .Client ().List (env .Ctx , accessRequestList , client .InNamespace (expectedRequestNamespace ))).To (Succeed ())
329+ Expect (accessRequestList .Items ).To (HaveLen (1 ), "there should be only one access request (for the MCP cluster)" )
330+ clusterRequestList := & clustersv1alpha1.ClusterRequestList {}
331+ Expect (env .Client ().List (env .Ctx , clusterRequestList , client .InNamespace (expectedRequestNamespace ))).To (Succeed ())
332+ Expect (clusterRequestList .Items ).To (BeEmpty (), "there should be no cluster request (for the Workload cluster)" )
333+ })
334+
247335 Context ("Delete" , func () {
248336 It ("should delete MCP-/Workload ClusterRequests/AccessRequests" , func () {
249337 var reconcileResult reconcile.Result
@@ -278,7 +366,7 @@ var _ = Describe("ClusterAccessReconciler", func() {
278366 },
279367 }
280368
281- env := buildTestEnvironmentDelete ("test-02" )
369+ env := buildTestEnvironmentDelete ("test-02" , false )
282370
283371 reconcileResult = env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
284372 Expect (reconcileResult .RequeueAfter ).To (BeZero (), "reconcile should requeue after a delay" )
@@ -288,6 +376,34 @@ var _ = Describe("ClusterAccessReconciler", func() {
288376 Expect (env .Client ().Get (env .Ctx , client .ObjectKeyFromObject (clusterRequestWorkload ), clusterRequestWorkload )).ToNot (Succeed (), "cluster request for Workload cluster should not exist" )
289377 Expect (env .Client ().Get (env .Ctx , client .ObjectKeyFromObject (accessRequestWorkload ), accessRequestWorkload )).ToNot (Succeed (), "access request for Workload cluster should not exist" )
290378 })
379+
380+ It ("should delete only MCP AccessRequest with skipWorkloadCluster" , func () {
381+ var reconcileResult reconcile.Result
382+
383+ expectedRequestNamespace := "mcp--80158a25-6874-80a6-a75d-94f57da600c0"
384+
385+ request := reconcile.Request {
386+ NamespacedName : client.ObjectKey {
387+ Name : "instance" ,
388+ Namespace : "test" ,
389+ },
390+ }
391+
392+ accessRequestMCP := & clustersv1alpha1.AccessRequest {
393+ ObjectMeta : metav1.ObjectMeta {
394+ Name : clusteraccess .StableRequestName (controllerName , request ) + "--mcp" ,
395+ Namespace : expectedRequestNamespace ,
396+ },
397+ }
398+
399+ env := buildTestEnvironmentDelete ("test-02" , true )
400+
401+ reconcileResult = env .ShouldReconcile (request , "reconcilerImpl should not return an error" )
402+ Expect (reconcileResult .RequeueAfter ).To (BeZero (), "reconcile should requeue after a delay" )
403+
404+ // access request should be deleted
405+ Expect (env .Client ().Get (env .Ctx , client .ObjectKeyFromObject (accessRequestMCP ), accessRequestMCP )).ToNot (Succeed (), "access request for MCP cluster should not exist" )
406+ })
291407 })
292408 })
293409})
0 commit comments