@@ -22,6 +22,7 @@ package managed
2222import (
2323 "context"
2424 "fmt"
25+ "slices"
2526 "time"
2627
2728 "github.com/aws/aws-sdk-go-v2/aws"
@@ -35,6 +36,7 @@ import (
3536 crclient "sigs.k8s.io/controller-runtime/pkg/client"
3637
3738 infrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2"
39+ ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2"
3840 "sigs.k8s.io/cluster-api/test/framework/clusterctl"
3941)
4042
@@ -52,6 +54,7 @@ const (
5254 EKSClusterClassFlavor = "eks-clusterclass"
5355 EKSAuthAPIAndConfigMapFlavor = "eks-auth-api-and-config-map"
5456 EKSAuthBootstrapDisabledFlavor = "eks-auth-bootstrap-disabled"
57+ EKSControlPlaneOnlyWithAccessEntriesFlavor = "eks-control-plane-only-with-accessentries"
5558)
5659
5760const (
@@ -249,3 +252,68 @@ func verifyASG(eksClusterName, asgName string, checkOwned bool, cfg *aws.Config)
249252 Expect (found ).To (BeTrue (), "expecting the cluster owned tag to exist" )
250253 }
251254}
255+
256+ func verifyAccessEntries (ctx context.Context , eksClusterName string , expectedEntries []ekscontrolplanev1.AccessEntry , cfg * aws.Config ) {
257+ eksClient := eks .NewFromConfig (* cfg )
258+
259+ listOutput , err := eksClient .ListAccessEntries (ctx , & eks.ListAccessEntriesInput {
260+ ClusterName : & eksClusterName ,
261+ })
262+ Expect (err ).ToNot (HaveOccurred (), "failed to list access entries" )
263+
264+ expectedEntriesMap := make (map [string ]ekscontrolplanev1.AccessEntry , len (expectedEntries ))
265+ for _ , entry := range expectedEntries {
266+ expectedEntriesMap [entry .PrincipalARN ] = entry
267+ }
268+
269+ for _ , principalARN := range listOutput .AccessEntries {
270+ expectedEntry , exists := expectedEntriesMap [principalARN ]
271+ Expect (exists ).To (BeTrue (), fmt .Sprintf ("unexpected access entry: %s" , principalARN ))
272+
273+ describeOutput , err := eksClient .DescribeAccessEntry (ctx , & eks.DescribeAccessEntryInput {
274+ ClusterName : & eksClusterName ,
275+ PrincipalArn : & principalARN ,
276+ })
277+ Expect (err ).ToNot (HaveOccurred (), fmt .Sprintf ("failed to describe access entry: %s" , principalARN ))
278+
279+ Expect (describeOutput .AccessEntry .Type ).To (Equal (expectedEntry .Type ), "access entry type does not match" )
280+ Expect (describeOutput .AccessEntry .Username ).To (Equal (expectedEntry .Username ), "access entry username does not match" )
281+
282+ if len (expectedEntry .KubernetesGroups ) > 0 {
283+ slices .Sort (expectedEntry .KubernetesGroups )
284+ slices .Sort (describeOutput .AccessEntry .KubernetesGroups )
285+ Expect (describeOutput .AccessEntry .KubernetesGroups ).To (Equal (expectedEntry .KubernetesGroups ), "access entry kubernetes groups do not match" )
286+ }
287+
288+ if len (expectedEntry .AccessPolicies ) > 0 {
289+ listOutput , err := eksClient .ListAssociatedAccessPolicies (ctx , & eks.ListAssociatedAccessPoliciesInput {
290+ ClusterName : & eksClusterName ,
291+ PrincipalArn : & principalARN ,
292+ })
293+ Expect (err ).ToNot (HaveOccurred (), "failed to list access policies" )
294+
295+ expectedPolicies := make (map [string ]ekscontrolplanev1.AccessPolicyReference , len (expectedEntry .AccessPolicies ))
296+ for _ , policy := range expectedEntry .AccessPolicies {
297+ expectedPolicies [policy .PolicyARN ] = policy
298+ }
299+
300+ for _ , policy := range listOutput .AssociatedAccessPolicies {
301+ expectedPolicy , exists := expectedPolicies [* policy .PolicyArn ]
302+ Expect (exists ).To (BeTrue (), fmt .Sprintf ("unexpected access policy: %s" , * policy .PolicyArn ))
303+
304+ Expect (policy .AccessScope .Type ).To (Equal (expectedPolicy .AccessScope .Type ), "access policy scope type does not match" )
305+
306+ if expectedPolicy .AccessScope .Type == "namespace" {
307+ slices .Sort (expectedPolicy .AccessScope .Namespaces )
308+ slices .Sort (policy .AccessScope .Namespaces )
309+ Expect (policy .AccessScope .Namespaces ).To (Equal (expectedPolicy .AccessScope .Namespaces ), "access policy scope namespaces do not match" )
310+ }
311+
312+ delete (expectedPolicies , * policy .PolicyArn )
313+ }
314+ Expect (expectedPolicies ).To (BeEmpty (), "not all expected access policies were found" )
315+ }
316+ delete (expectedEntriesMap , principalARN )
317+ }
318+ Expect (expectedEntriesMap ).To (BeEmpty (), "not all expected access entries were found" )
319+ }
0 commit comments