@@ -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
@@ -49,6 +51,7 @@ const (
4951 EKSMachinePoolOnlyFlavor = "eks-machinepool-only"
5052 EKSIPv6ClusterFlavor = "eks-ipv6-cluster"
5153 EKSControlPlaneOnlyLegacyFlavor = "eks-control-plane-only-legacy"
54+ EKSControlPlaneOnlyWithAccessEntriesFlavor = "eks-control-plane-only-with-accessentries"
5255)
5356
5457const (
@@ -231,3 +234,68 @@ func verifyASG(eksClusterName, asgName string, checkOwned bool, cfg *aws.Config)
231234 Expect (found ).To (BeTrue (), "expecting the cluster owned tag to exist" )
232235 }
233236}
237+
238+ func verifyAccessEntries (ctx context.Context , eksClusterName string , expectedEntries []ekscontrolplanev1.AccessEntry , cfg * aws.Config ) {
239+ eksClient := eks .NewFromConfig (* cfg )
240+
241+ listOutput , err := eksClient .ListAccessEntries (ctx , & eks.ListAccessEntriesInput {
242+ ClusterName : & eksClusterName ,
243+ })
244+ Expect (err ).ToNot (HaveOccurred (), "failed to list access entries" )
245+
246+ expectedEntriesMap := make (map [string ]ekscontrolplanev1.AccessEntry , len (expectedEntries ))
247+ for _ , entry := range expectedEntries {
248+ expectedEntriesMap [entry .PrincipalARN ] = entry
249+ }
250+
251+ for _ , principalARN := range listOutput .AccessEntries {
252+ expectedEntry , exists := expectedEntriesMap [principalARN ]
253+ Expect (exists ).To (BeTrue (), fmt .Sprintf ("unexpected access entry: %s" , principalARN ))
254+
255+ describeOutput , err := eksClient .DescribeAccessEntry (ctx , & eks.DescribeAccessEntryInput {
256+ ClusterName : & eksClusterName ,
257+ PrincipalArn : & principalARN ,
258+ })
259+ Expect (err ).ToNot (HaveOccurred (), fmt .Sprintf ("failed to describe access entry: %s" , principalARN ))
260+
261+ Expect (describeOutput .AccessEntry .Type ).To (Equal (expectedEntry .Type ), "access entry type does not match" )
262+ Expect (describeOutput .AccessEntry .Username ).To (Equal (expectedEntry .Username ), "access entry username does not match" )
263+
264+ if len (expectedEntry .KubernetesGroups ) > 0 {
265+ slices .Sort (expectedEntry .KubernetesGroups )
266+ slices .Sort (describeOutput .AccessEntry .KubernetesGroups )
267+ Expect (describeOutput .AccessEntry .KubernetesGroups ).To (Equal (expectedEntry .KubernetesGroups ), "access entry kubernetes groups do not match" )
268+ }
269+
270+ if len (expectedEntry .AccessPolicies ) > 0 {
271+ listOutput , err := eksClient .ListAssociatedAccessPolicies (ctx , & eks.ListAssociatedAccessPoliciesInput {
272+ ClusterName : & eksClusterName ,
273+ PrincipalArn : & principalARN ,
274+ })
275+ Expect (err ).ToNot (HaveOccurred (), "failed to list access policies" )
276+
277+ expectedPolicies := make (map [string ]ekscontrolplanev1.AccessPolicyReference , len (expectedEntry .AccessPolicies ))
278+ for _ , policy := range expectedEntry .AccessPolicies {
279+ expectedPolicies [policy .PolicyARN ] = policy
280+ }
281+
282+ for _ , policy := range listOutput .AssociatedAccessPolicies {
283+ expectedPolicy , exists := expectedPolicies [* policy .PolicyArn ]
284+ Expect (exists ).To (BeTrue (), fmt .Sprintf ("unexpected access policy: %s" , * policy .PolicyArn ))
285+
286+ Expect (policy .AccessScope .Type ).To (Equal (expectedPolicy .AccessScope .Type ), "access policy scope type does not match" )
287+
288+ if expectedPolicy .AccessScope .Type == "namespace" {
289+ slices .Sort (expectedPolicy .AccessScope .Namespaces )
290+ slices .Sort (policy .AccessScope .Namespaces )
291+ Expect (policy .AccessScope .Namespaces ).To (Equal (expectedPolicy .AccessScope .Namespaces ), "access policy scope namespaces do not match" )
292+ }
293+
294+ delete (expectedPolicies , * policy .PolicyArn )
295+ }
296+ Expect (expectedPolicies ).To (BeEmpty (), "not all expected access policies were found" )
297+ }
298+ delete (expectedEntriesMap , principalARN )
299+ }
300+ Expect (expectedEntriesMap ).To (BeEmpty (), "not all expected access entries were found" )
301+ }
0 commit comments