Skip to content

Commit 6c5eb9c

Browse files
committed
test/framework: WaitForControlPlaneToBeReady now considers replicas
Signed-off-by: Stefan Büringer [email protected]
1 parent e499366 commit 6c5eb9c

File tree

6 files changed

+104
-68
lines changed

6 files changed

+104
-68
lines changed

internal/contract/controlplane.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ func (c *ControlPlaneContract) IsUpgrading(obj *unstructured.Unstructured) (bool
207207
// - spec.replicas != status.replicas.
208208
// - spec.replicas != status.updatedReplicas.
209209
// - spec.replicas != status.readyReplicas.
210+
// - status.unavailableReplicas > 0.
210211
func (c *ControlPlaneContract) IsScaling(obj *unstructured.Unstructured) (bool, error) {
211212
desiredReplicas, err := c.Replicas().Get(obj)
212213
if err != nil {
@@ -247,7 +248,7 @@ func (c *ControlPlaneContract) IsScaling(obj *unstructured.Unstructured) (bool,
247248
}
248249

249250
unavailableReplicas, err := c.UnavailableReplicas().Get(obj)
250-
if err != nil && !errors.Is(err, errNotFound) {
251+
if err != nil {
251252
if !errors.Is(err, errNotFound) {
252253
return false, errors.Wrap(err, "failed to get control plane status unavailableReplicas")
253254
}

internal/controllers/topology/cluster/desired_state_test.go

Lines changed: 51 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ func TestComputeControlPlaneVersion(t *testing.T) {
611611
defer utilfeature.SetFeatureGateDuringTest(t, feature.Gates, feature.RuntimeSDK, true)()
612612

613613
// Note: the version used by the machine deployments does
614-
// not affect how we determining the control plane version.
614+
// not affect how we're determining the control plane version.
615615
// We only want to know if the machine deployments are stable.
616616
//
617617
// A machine deployment is considered stable if all the following are true:
@@ -706,10 +706,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
706706
"spec.replicas": int64(2),
707707
}).
708708
WithStatusFields(map[string]interface{}{
709-
"status.version": "v1.2.2",
710-
"status.replicas": int64(2),
711-
"status.updatedReplicas": int64(2),
712-
"status.readyReplicas": int64(2),
709+
"status.version": "v1.2.2",
710+
"status.replicas": int64(2),
711+
"status.updatedReplicas": int64(2),
712+
"status.readyReplicas": int64(2),
713+
"status.unavailableReplicas": int64(0),
713714
}).
714715
Build(),
715716
expectedVersion: "v1.2.3",
@@ -739,10 +740,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
739740
"spec.replicas": int64(2),
740741
}).
741742
WithStatusFields(map[string]interface{}{
742-
"status.version": "v1.2.2",
743-
"status.replicas": int64(1),
744-
"status.updatedReplicas": int64(1),
745-
"status.readyReplicas": int64(1),
743+
"status.version": "v1.2.2",
744+
"status.replicas": int64(1),
745+
"status.updatedReplicas": int64(1),
746+
"status.readyReplicas": int64(1),
747+
"status.unavailableReplicas": int64(0),
746748
}).
747749
Build(),
748750
expectedVersion: "v1.2.2",
@@ -756,10 +758,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
756758
"spec.replicas": int64(2),
757759
}).
758760
WithStatusFields(map[string]interface{}{
759-
"status.version": "v1.2.2",
760-
"status.replicas": int64(2),
761-
"status.updatedReplicas": int64(2),
762-
"status.readyReplicas": int64(2),
761+
"status.version": "v1.2.2",
762+
"status.replicas": int64(2),
763+
"status.updatedReplicas": int64(2),
764+
"status.readyReplicas": int64(2),
765+
"status.unavailableReplicas": int64(0),
763766
}).
764767
Build(),
765768
machineDeploymentsState: scope.MachineDeploymentsStateMap{
@@ -778,10 +781,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
778781
"spec.replicas": int64(2),
779782
}).
780783
WithStatusFields(map[string]interface{}{
781-
"status.version": "v1.2.2",
782-
"status.replicas": int64(2),
783-
"status.updatedReplicas": int64(2),
784-
"status.readyReplicas": int64(2),
784+
"status.version": "v1.2.2",
785+
"status.replicas": int64(2),
786+
"status.updatedReplicas": int64(2),
787+
"status.readyReplicas": int64(2),
788+
"status.unavailableReplicas": int64(0),
785789
}).
786790
Build(),
787791
machineDeploymentsState: scope.MachineDeploymentsStateMap{
@@ -800,10 +804,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
800804
"spec.replicas": int64(2),
801805
}).
802806
WithStatusFields(map[string]interface{}{
803-
"status.version": "v1.2.2",
804-
"status.replicas": int64(2),
805-
"status.updatedReplicas": int64(2),
806-
"status.readyReplicas": int64(2),
807+
"status.version": "v1.2.2",
808+
"status.replicas": int64(2),
809+
"status.updatedReplicas": int64(2),
810+
"status.readyReplicas": int64(2),
811+
"status.unavailableReplicas": int64(0),
807812
}).
808813
Build(),
809814
machineDeploymentsState: scope.MachineDeploymentsStateMap{
@@ -822,10 +827,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
822827
"spec.replicas": int64(2),
823828
}).
824829
WithStatusFields(map[string]interface{}{
825-
"status.version": "v1.2.2",
826-
"status.replicas": int64(2),
827-
"status.updatedReplicas": int64(2),
828-
"status.readyReplicas": int64(2),
830+
"status.version": "v1.2.2",
831+
"status.replicas": int64(2),
832+
"status.updatedReplicas": int64(2),
833+
"status.readyReplicas": int64(2),
834+
"status.unavailableReplicas": int64(0),
829835
}).
830836
Build(),
831837
machineDeploymentsState: scope.MachineDeploymentsStateMap{
@@ -1211,10 +1217,11 @@ func TestComputeControlPlaneVersion(t *testing.T) {
12111217
"spec.replicas": int64(2),
12121218
}).
12131219
WithStatusFields(map[string]interface{}{
1214-
"status.version": "v1.2.2",
1215-
"status.replicas": int64(2),
1216-
"status.updatedReplicas": int64(2),
1217-
"status.readyReplicas": int64(2),
1220+
"status.version": "v1.2.2",
1221+
"status.replicas": int64(2),
1222+
"status.updatedReplicas": int64(2),
1223+
"status.readyReplicas": int64(2),
1224+
"status.unavailableReplicas": int64(0),
12181225
}).
12191226
Build()
12201227

@@ -1697,10 +1704,11 @@ func TestComputeMachineDeploymentVersion(t *testing.T) {
16971704
"spec.replicas": int64(2),
16981705
}).
16991706
WithStatusFields(map[string]interface{}{
1700-
"status.version": "v1.2.2",
1701-
"status.replicas": int64(2),
1702-
"status.updatedReplicas": int64(2),
1703-
"status.readyReplicas": int64(2),
1707+
"status.version": "v1.2.2",
1708+
"status.replicas": int64(2),
1709+
"status.updatedReplicas": int64(2),
1710+
"status.readyReplicas": int64(2),
1711+
"status.unavailableReplicas": int64(0),
17041712
}).
17051713
Build()
17061714
controlPlaneStable123 := builder.ControlPlane("test1", "cp1").
@@ -1709,10 +1717,11 @@ func TestComputeMachineDeploymentVersion(t *testing.T) {
17091717
"spec.replicas": int64(2),
17101718
}).
17111719
WithStatusFields(map[string]interface{}{
1712-
"status.version": "v1.2.3",
1713-
"status.replicas": int64(2),
1714-
"status.updatedReplicas": int64(2),
1715-
"status.readyReplicas": int64(2),
1720+
"status.version": "v1.2.3",
1721+
"status.replicas": int64(2),
1722+
"status.updatedReplicas": int64(2),
1723+
"status.readyReplicas": int64(2),
1724+
"status.unavailableReplicas": int64(0),
17161725
}).
17171726
Build()
17181727
controlPlaneUpgrading := builder.ControlPlane("test1", "cp1").
@@ -1729,10 +1738,11 @@ func TestComputeMachineDeploymentVersion(t *testing.T) {
17291738
"spec.replicas": int64(2),
17301739
}).
17311740
WithStatusFields(map[string]interface{}{
1732-
"status.version": "v1.2.3",
1733-
"status.replicas": int64(1),
1734-
"status.updatedReplicas": int64(1),
1735-
"status.readyReplicas": int64(1),
1741+
"status.version": "v1.2.3",
1742+
"status.replicas": int64(1),
1743+
"status.updatedReplicas": int64(1),
1744+
"status.readyReplicas": int64(1),
1745+
"status.unavailableReplicas": int64(0),
17361746
}).
17371747
Build()
17381748
controlPlaneDesired := builder.ControlPlane("test1", "cp1").

internal/controllers/topology/cluster/reconcile_state_test.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -498,10 +498,11 @@ func TestReconcile_callAfterClusterUpgrade(t *testing.T) {
498498
"spec.replicas": int64(2),
499499
}).
500500
WithStatusFields(map[string]interface{}{
501-
"status.version": topologyVersion,
502-
"status.replicas": int64(2),
503-
"status.updatedReplicas": int64(2),
504-
"status.readyReplicas": int64(2),
501+
"status.version": topologyVersion,
502+
"status.replicas": int64(2),
503+
"status.updatedReplicas": int64(2),
504+
"status.readyReplicas": int64(2),
505+
"status.unavailableReplicas": int64(0),
505506
}).
506507
Build()
507508
controlPlaneStableAtLowerVersion := builder.ControlPlane("test1", "cp1").
@@ -510,10 +511,11 @@ func TestReconcile_callAfterClusterUpgrade(t *testing.T) {
510511
"spec.replicas": int64(2),
511512
}).
512513
WithStatusFields(map[string]interface{}{
513-
"status.version": lowerVersion,
514-
"status.replicas": int64(2),
515-
"status.updatedReplicas": int64(2),
516-
"status.readyReplicas": int64(2),
514+
"status.version": lowerVersion,
515+
"status.replicas": int64(2),
516+
"status.updatedReplicas": int64(2),
517+
"status.readyReplicas": int64(2),
518+
"status.unavailableReplicas": int64(0),
517519
}).
518520
Build()
519521
controlPlaneUpgrading := builder.ControlPlane("test1", "cp1").
@@ -522,10 +524,11 @@ func TestReconcile_callAfterClusterUpgrade(t *testing.T) {
522524
"spec.replicas": int64(2),
523525
}).
524526
WithStatusFields(map[string]interface{}{
525-
"status.version": lowerVersion,
526-
"status.replicas": int64(2),
527-
"status.updatedReplicas": int64(2),
528-
"status.readyReplicas": int64(2),
527+
"status.version": lowerVersion,
528+
"status.replicas": int64(2),
529+
"status.updatedReplicas": int64(2),
530+
"status.readyReplicas": int64(2),
531+
"status.unavailableReplicas": int64(0),
529532
}).
530533
Build()
531534
controlPlaneScaling := builder.ControlPlane("test1", "cp1").
@@ -534,10 +537,11 @@ func TestReconcile_callAfterClusterUpgrade(t *testing.T) {
534537
"spec.replicas": int64(2),
535538
}).
536539
WithStatusFields(map[string]interface{}{
537-
"status.version": topologyVersion,
538-
"status.replicas": int64(1),
539-
"status.updatedReplicas": int64(1),
540-
"status.readyReplicas": int64(1),
540+
"status.version": topologyVersion,
541+
"status.replicas": int64(1),
542+
"status.updatedReplicas": int64(1),
543+
"status.readyReplicas": int64(1),
544+
"status.unavailableReplicas": int64(0),
541545
}).
542546
Build()
543547

test/e2e/clusterctl_upgrade.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ func ClusterctlUpgradeSpec(ctx context.Context, inputGetter func() ClusterctlUpg
436436
}
437437

438438
// After the upgrade check that there were no unexpected rollouts.
439+
log.Logf("Verify there are no unexpected rollouts")
439440
Consistently(func() bool {
440441
postUpgradeMachineList := &unstructured.UnstructuredList{}
441442
postUpgradeMachineList.SetGroupVersionKind(clusterv1.GroupVersion.WithKind("MachineList"))

test/e2e/self_hosted.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ func SelfHostedSpec(ctx context.Context, inputGetter func() SelfHostedSpecInput)
261261
Expect(controlPlane).ToNot(BeNil())
262262

263263
// After the move check that there were no unexpected rollouts.
264+
log.Logf("Verify there are no unexpected rollouts")
264265
Consistently(func() bool {
265266
postMoveMachineList := &unstructured.UnstructuredList{}
266267
postMoveMachineList.SetGroupVersionKind(clusterv1.GroupVersion.WithKind("MachineList"))
@@ -279,8 +280,14 @@ func SelfHostedSpec(ctx context.Context, inputGetter func() SelfHostedSpecInput)
279280
return
280281
}
281282

282-
By("Upgrading the self-hosted Cluster")
283+
log.Logf("Waiting for control plane to be ready")
284+
framework.WaitForControlPlaneAndMachinesReady(ctx, framework.WaitForControlPlaneAndMachinesReadyInput{
285+
GetLister: selfHostedClusterProxy.GetClient(),
286+
Cluster: clusterResources.Cluster,
287+
ControlPlane: clusterResources.ControlPlane,
288+
}, input.E2EConfig.GetIntervals(specName, "wait-control-plane")...)
283289

290+
By("Upgrading the self-hosted Cluster")
284291
if clusterResources.Cluster.Spec.Topology != nil {
285292
// Cluster is using ClusterClass, upgrade via topology.
286293
By("Upgrading the Cluster topology")

test/framework/controlplane_helpers.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
. "github.com/onsi/ginkgo/v2"
2424
. "github.com/onsi/gomega"
25-
. "github.com/onsi/gomega/gstruct"
2625
"github.com/pkg/errors"
2726
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827
"k8s.io/apimachinery/pkg/labels"
@@ -164,20 +163,34 @@ type WaitForControlPlaneToBeReadyInput struct {
164163
func WaitForControlPlaneToBeReady(ctx context.Context, input WaitForControlPlaneToBeReadyInput, intervals ...interface{}) {
165164
By("Waiting for the control plane to be ready")
166165
controlplane := &controlplanev1.KubeadmControlPlane{}
167-
Eventually(func() (controlplanev1.KubeadmControlPlane, error) {
166+
Eventually(func() (bool, error) {
168167
key := client.ObjectKey{
169168
Namespace: input.ControlPlane.GetNamespace(),
170169
Name: input.ControlPlane.GetName(),
171170
}
172171
if err := input.Getter.Get(ctx, key, controlplane); err != nil {
173-
return *controlplane, errors.Wrapf(err, "failed to get KCP")
172+
return false, errors.Wrapf(err, "failed to get KCP")
173+
}
174+
175+
desiredReplicas := controlplane.Spec.Replicas
176+
statusReplicas := controlplane.Status.Replicas
177+
updatedReplicas := controlplane.Status.UpdatedReplicas
178+
readyReplicas := controlplane.Status.ReadyReplicas
179+
unavailableReplicas := controlplane.Status.UnavailableReplicas
180+
181+
// Control plane is still rolling out (and thus not ready) if:
182+
// * .spec.replicas, .status.replicas, .status.updatedReplicas,
183+
// .status.readyReplicas are not equal and
184+
// * unavailableReplicas > 0
185+
if statusReplicas != *desiredReplicas ||
186+
updatedReplicas != *desiredReplicas ||
187+
readyReplicas != *desiredReplicas ||
188+
unavailableReplicas > 0 {
189+
return false, nil
174190
}
175-
return *controlplane, nil
176-
}, intervals...).Should(MatchFields(IgnoreExtras, Fields{
177-
"Status": MatchFields(IgnoreExtras, Fields{
178-
"Ready": BeTrue(),
179-
}),
180-
}), PrettyPrint(controlplane)+"\n")
191+
192+
return true, nil
193+
}, intervals...).Should(BeTrue(), PrettyPrint(controlplane)+"\n")
181194
}
182195

183196
// AssertControlPlaneFailureDomainsInput is the input for AssertControlPlaneFailureDomains.

0 commit comments

Comments
 (0)