@@ -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