@@ -28,11 +28,14 @@ import (
28
28
ekstypes "github.com/aws/aws-sdk-go-v2/service/eks/types"
29
29
. "github.com/onsi/ginkgo/v2"
30
30
. "github.com/onsi/gomega"
31
+ corev1 "k8s.io/api/core/v1"
31
32
"k8s.io/apimachinery/pkg/util/version"
32
33
crclient "sigs.k8s.io/controller-runtime/pkg/client"
33
34
34
35
ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2"
36
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
35
37
"sigs.k8s.io/cluster-api/test/framework"
38
+ clusterctl "sigs.k8s.io/cluster-api/test/framework/clusterctl"
36
39
)
37
40
38
41
type waitForControlPlaneToBeUpgradedInput struct {
@@ -93,3 +96,73 @@ func GetControlPlaneByName(ctx context.Context, input GetControlPlaneByNameInput
93
96
Expect (input .Getter .Get (ctx , key , cp )).To (Succeed (), "Failed to get AWSManagedControlPlane object %s/%s" , input .Namespace , input .Name )
94
97
return cp
95
98
}
99
+
100
+ func WaitForEKSControlPlaneInitialized (ctx context.Context , input clusterctl.ApplyCustomClusterTemplateAndWaitInput , result * clusterctl.ApplyCustomClusterTemplateAndWaitResult ) {
101
+ Expect (ctx ).NotTo (BeNil (), "ctx is required for WaitForEKSControlPlaneInitialized" )
102
+ Expect (input .ClusterProxy ).ToNot (BeNil (), "Invalid argument. input.ClusterProxy can't be nil" )
103
+
104
+ var awsCP ekscontrolplanev1.AWSManagedControlPlane
105
+ Eventually (func (g Gomega ) {
106
+ list , err := listAWSManagedControlPlanes (ctx , input .ClusterProxy .GetClient (), result .Cluster .Namespace , result .Cluster .Name )
107
+ g .Expect (err ).To (Succeed (), "failed to list AWSManagedControlPlane resource" )
108
+
109
+ g .Expect (len (list .Items )).To (Equal (1 ),
110
+ "expected exactly one AWSManagedControlPlane for %s/%s" ,
111
+ result .Cluster .Namespace , result .Cluster .Name ,
112
+ )
113
+ awsCP = list .Items [0 ]
114
+ }, 10 * time .Second , 1 * time .Second ).Should (Succeed ())
115
+
116
+ key := crclient.ObjectKey {Namespace : awsCP .Namespace , Name : awsCP .Name }
117
+ waitForControlPlaneReady (ctx , input .ClusterProxy .GetClient (), key , input .WaitForControlPlaneIntervals ... )
118
+ }
119
+
120
+ func WaitForEKSControlPlaneMachinesReady (ctx context.Context , input clusterctl.ApplyCustomClusterTemplateAndWaitInput , result * clusterctl.ApplyCustomClusterTemplateAndWaitResult ) {
121
+ Expect (ctx ).NotTo (BeNil (), "ctx is required for WaitForEKSControlPlaneMachinesReady" )
122
+ Expect (input .ClusterProxy ).ToNot (BeNil (), "input.ClusterProxy can't be nil" )
123
+
124
+ var awsCP ekscontrolplanev1.AWSManagedControlPlane
125
+ Eventually (func (g Gomega ) {
126
+ list , err := listAWSManagedControlPlanes (ctx , input .ClusterProxy .GetClient (), result .Cluster .Namespace , result .Cluster .Name )
127
+ g .Expect (err ).To (Succeed ())
128
+ awsCP = list .Items [0 ]
129
+
130
+ g .Expect (awsCP .Status .Ready ).To (BeTrue (),
131
+ "waiting for AWSManagedControlPlane %s/%s to become Ready" ,
132
+ awsCP .Namespace , awsCP .Name ,
133
+ )
134
+ }, input .WaitForControlPlaneIntervals ... ).Should (Succeed ())
135
+
136
+ workloadClusterProxy := input .ClusterProxy .GetWorkloadCluster (ctx , result .Cluster .Namespace , input .ClusterName )
137
+ waitForWorkloadClusterReachable (ctx , workloadClusterProxy .GetClient (), input .WaitForControlPlaneIntervals ... )
138
+ }
139
+
140
+ // listAWSManagedControlPlanes returns a list of AWSManagedControlPlanes for the given cluster.
141
+ func listAWSManagedControlPlanes (ctx context.Context , client crclient.Client , namespace , clusterName string ) (* ekscontrolplanev1.AWSManagedControlPlaneList , error ) {
142
+ list := & ekscontrolplanev1.AWSManagedControlPlaneList {}
143
+ err := client .List (ctx , list ,
144
+ crclient .InNamespace (namespace ),
145
+ crclient.MatchingLabels {clusterv1 .ClusterNameLabel : clusterName },
146
+ )
147
+ return list , err
148
+ }
149
+
150
+ // waitForControlPlaneReady polls until the given AWSManagedControlPlane is marked Ready.
151
+ func waitForControlPlaneReady (ctx context.Context , client crclient.Client , key crclient.ObjectKey , intervals ... interface {}) {
152
+ Eventually (func (g Gomega ) {
153
+ var latest ekscontrolplanev1.AWSManagedControlPlane
154
+ g .Expect (client .Get (ctx , key , & latest )).To (Succeed ())
155
+ g .Expect (latest .Status .Ready ).To (BeTrue (),
156
+ "AWSManagedControlPlane %s/%s is not Ready" , key .Namespace , key .Name ,
157
+ )
158
+ }, intervals ... ).Should (Succeed ())
159
+ }
160
+
161
+ // waitForWorkloadClusterReachable checks when the kube-system namespace is reachable in the workload cluster.
162
+ func waitForWorkloadClusterReachable (ctx context.Context , client crclient.Client , intervals ... interface {}) {
163
+ Eventually (func (g Gomega ) {
164
+ ns := & corev1.Namespace {}
165
+ g .Expect (client .Get (ctx , crclient.ObjectKey {Name : "kube-system" }, ns )).
166
+ To (Succeed (), "workload API server not yet reachable" )
167
+ }, intervals ... ).Should (Succeed ())
168
+ }
0 commit comments