Skip to content

Commit 647c833

Browse files
committed
update
1 parent 3970d51 commit 647c833

File tree

3 files changed

+127
-10
lines changed

3 files changed

+127
-10
lines changed

lib/clusteraccess/clusteraccess.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,22 @@ func (r *reconcilerImpl) ReconcileDelete(ctx context.Context, request reconcile.
289289
return reconcile.Result{}, nil
290290
}
291291

292+
// Manager is an interface for managing cluster access.
292293
type Manager interface {
294+
// WithTimeout sets the timeout for operations.
293295
WithTimeout(timeout time.Duration) Manager
296+
// WithInterval sets the interval for polling operations.
294297
WithInterval(interval time.Duration) Manager
298+
// WithLogger sets the logger for the manager.
295299
WithLogger(log *logging.Logger) Manager
296300

301+
// CreateAndWaitForCluster creates a new ClusterRequest/AccessRequest and waits for it to be ready.
302+
// It returns the created Cluster if the AccessRequest is granted.
303+
// ctx is the context for the operation.
304+
// clusterName is the name of the cluster to create.
305+
// purpose is the purpose of the cluster (e.g., "onboarding", "mcp", "workload").
306+
// scheme is the runtime scheme to use for the cluster.
307+
// permissions are the permissions to request for the AccessRequest.
297308
CreateAndWaitForCluster(ctx context.Context, clusterName, purpose string,
298309
scheme *runtime.Scheme, permissions []clustersv1alpha1.PermissionsRequest) (*clusters.Cluster, error)
299310
}
@@ -335,11 +346,11 @@ func (m *managerImpl) WithLogger(log *logging.Logger) Manager {
335346
func (m *managerImpl) CreateAndWaitForCluster(ctx context.Context, clusterName, purpose string,
336347
scheme *runtime.Scheme, permissions []clustersv1alpha1.PermissionsRequest) (*clusters.Cluster, error) {
337348

338-
namespace := libutils.StableRequestNamespace(m.controllerName)
349+
namespace := libutils.StableControllerNamespace(m.controllerName)
339350

340351
namespaceMutator := resources.NewNamespaceMutator(namespace)
341352
if err := resources.CreateOrUpdateResource(ctx, m.platformClusterClient, namespaceMutator); err != nil {
342-
return nil, fmt.Errorf("failed to create/update provider namespace: %w", err)
353+
return nil, fmt.Errorf("failed to create/update namespace: %w", err)
343354
}
344355

345356
cr := &clustersv1alpha1.ClusterRequest{
@@ -355,7 +366,7 @@ func (m *managerImpl) CreateAndWaitForCluster(ctx context.Context, clusterName,
355366
}))
356367

357368
if err := resources.CreateOrUpdateResource(ctx, m.platformClusterClient, clusterRequestMutator); err != nil {
358-
return nil, fmt.Errorf("failed to create/update onboarding cluster request: %w", err)
369+
return nil, fmt.Errorf("failed to create/update ClusterRequest: %w", err)
359370
}
360371

361372
err := m.wait(ctx, func(ctx context.Context) (bool, error) {
@@ -364,14 +375,14 @@ func (m *managerImpl) CreateAndWaitForCluster(ctx context.Context, clusterName,
364375
}
365376

366377
if m.log != nil {
367-
m.log.Info("Waiting for access request", "name", cr.Name, "phase", cr.Status.Phase)
378+
m.log.Info("Waiting for ClusterRequest", "name", cr.Name, "phase", cr.Status.Phase)
368379
}
369380

370381
return cr.Status.Phase.IsGranted() || cr.Status.Phase.IsDenied(), nil
371382
})
372383

373384
if err != nil {
374-
return nil, fmt.Errorf("failed to wait for cluster request: %w", err)
385+
return nil, fmt.Errorf("failed to wait for ClusterRequest: %w", err)
375386
}
376387

377388
ar := &clustersv1alpha1.AccessRequest{
@@ -394,7 +405,7 @@ func (m *managerImpl) CreateAndWaitForCluster(ctx context.Context, clusterName,
394405
}))
395406

396407
if err := resources.CreateOrUpdateResource(ctx, m.platformClusterClient, accessRequestMutator); err != nil {
397-
return nil, fmt.Errorf("failed to create/update onboarding access request: %w", err)
408+
return nil, fmt.Errorf("failed to create/update AccessRequest: %w", err)
398409
}
399410

400411
err = m.wait(ctx, func(ctx context.Context) (bool, error) {
@@ -403,14 +414,14 @@ func (m *managerImpl) CreateAndWaitForCluster(ctx context.Context, clusterName,
403414
}
404415

405416
if m.log != nil {
406-
m.log.Info("Waiting for access request", "name", ar.Name, "phase", ar.Status.Phase)
417+
m.log.Info("Waiting for AccessRequest", "name", ar.Name, "phase", ar.Status.Phase)
407418
}
408419

409420
return ar.Status.Phase.IsGranted() || ar.Status.Phase.IsDenied(), nil
410421
})
411422

412423
if err != nil {
413-
return nil, fmt.Errorf("failed to wait for access request: %w", err)
424+
return nil, fmt.Errorf("failed to wait for AccessRequest: %w", err)
414425
}
415426

416427
return createClusterForAccessRequest(ctx, m.platformClusterClient, clustersv1alpha1.PURPOSE_ONBOARDING, scheme, ar)

lib/clusteraccess/clusteraccess_test.go

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package clusteraccess_test
22

33
import (
44
"context"
5+
"sync"
56
"testing"
67
"time"
78

9+
"github.com/openmcp-project/controller-utils/pkg/clusters"
10+
811
testutils "github.com/openmcp-project/controller-utils/pkg/testing"
912
corev1 "k8s.io/api/core/v1"
1013
rbacv1 "k8s.io/api/rbac/v1"
@@ -278,7 +281,103 @@ var _ = Describe("ClusterAccessReconciler", func() {
278281

279282
var _ = Describe("ClusterAccessManager", func() {
280283
It("should create and wait for onboarding cluster access", func() {
281-
env := buildTestEnvironmentNoReconcile("test-03")
282-
Expect(env).To(Not(BeNil()))
284+
const (
285+
clusterName = "onboarding-cluster"
286+
controllerName = "test-controller"
287+
timeout = 1 * time.Second
288+
interval = 20 * time.Millisecond
289+
)
290+
291+
clusterRequest := &clustersv1alpha1.ClusterRequest{
292+
ObjectMeta: metav1.ObjectMeta{
293+
Name: clusterName,
294+
Namespace: utils.StableControllerNamespace(controllerName),
295+
},
296+
}
297+
298+
accessRequest := &clustersv1alpha1.AccessRequest{
299+
ObjectMeta: metav1.ObjectMeta{
300+
Name: clusterName,
301+
Namespace: utils.StableControllerNamespace(controllerName),
302+
},
303+
}
304+
305+
env := buildTestEnvironmentNoReconcile("test-03", accessRequest, clusterRequest)
306+
307+
manager := clusteraccess.NewClusterAccessManager(env.Client(), controllerName)
308+
Expect(manager).ToNot(BeNil(), "should create a ClusterAccessManager")
309+
310+
manager.WithInterval(interval).WithTimeout(timeout)
311+
312+
scheme := runtime.NewScheme()
313+
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
314+
utilruntime.Must(clustersv1alpha1.AddToScheme(scheme))
315+
316+
var cluster *clusters.Cluster
317+
var err error
318+
var wg sync.WaitGroup
319+
ctx, cancel := context.WithTimeout(env.Ctx, 1*time.Second)
320+
321+
defer cancel()
322+
wg.Add(1)
323+
324+
go func() {
325+
defer wg.Done()
326+
cluster, err = manager.CreateAndWaitForCluster(ctx, clusterName, clustersv1alpha1.PURPOSE_ONBOARDING, scheme, []clustersv1alpha1.PermissionsRequest{
327+
{
328+
Rules: []rbacv1.PolicyRule{
329+
{
330+
APIGroups: []string{"*"},
331+
Resources: []string{"*"},
332+
Verbs: []string{"*"},
333+
},
334+
},
335+
},
336+
})
337+
}()
338+
339+
Eventually(func() bool {
340+
// read rhe cluster request
341+
if err := env.Client().Get(ctx, client.ObjectKeyFromObject(clusterRequest), clusterRequest); err != nil {
342+
return false
343+
}
344+
345+
// set status phase to REQUEST_GRANTED
346+
if clusterRequest.Status.Phase != clustersv1alpha1.REQUEST_GRANTED {
347+
clusterRequest.Status.Phase = clustersv1alpha1.REQUEST_GRANTED
348+
if err := env.Client().Status().Update(ctx, clusterRequest); err != nil {
349+
return false
350+
}
351+
return false
352+
}
353+
354+
// read the access request
355+
if err := env.Client().Get(ctx, client.ObjectKeyFromObject(accessRequest), accessRequest); err != nil {
356+
return false
357+
}
358+
359+
// set status phase to REQUEST_GRANTED and set the secret reference
360+
if accessRequest.Status.Phase != clustersv1alpha1.REQUEST_GRANTED {
361+
accessRequest.Status.Phase = clustersv1alpha1.REQUEST_GRANTED
362+
363+
accessRequest.Status.SecretRef = &clustersv1alpha1.NamespacedObjectReference{
364+
ObjectReference: clustersv1alpha1.ObjectReference{
365+
Name: "access",
366+
},
367+
Namespace: "default",
368+
}
369+
370+
if err := env.Client().Status().Update(ctx, accessRequest); err != nil {
371+
return false
372+
}
373+
}
374+
375+
return true
376+
}, timeout, interval).Should(BeTrue())
377+
378+
wg.Wait()
379+
380+
Expect(err).ToNot(HaveOccurred(), "should not return an error when creating/waiting for onboarding cluster access")
381+
Expect(cluster).ToNot(BeNil(), "should return a valid onboarding cluster")
283382
})
284383
})
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: v1
2+
kind: Secret
3+
metadata:
4+
name: access
5+
namespace: default
6+
data:
7+
kubeconfig: YXBpVmVyc2lvbjogdjEKa2luZDogQ29uZmlnCnByZWZlcmVuY2VzOiB7fQpjbHVzdGVyczoKLSBjbHVzdGVyOgogICAgc2VydmVyOiBodHRwczovL2FwaS5jbHVzdGVyLWIuZXhhbXBsZS5jb206NjQ0MwogIG5hbWU6IGNsdXN0ZXIKY29udGV4dHM6Ci0gY29udGV4dDoKICAgIGNsdXN0ZXI6IGNsdXN0ZXIKICAgIHVzZXI6IHVzZXIKICBuYW1lOiBjb250ZXh0CmN1cnJlbnQtY29udGV4dDogY29udGV4dAp1c2VyczoKLSBuYW1lOiB1c2VyCiAgdXNlcjoKICAgIHRva2VuOiBhYmM=

0 commit comments

Comments
 (0)