Skip to content

Commit 089e073

Browse files
implement minReadySeconds for machinepool
1 parent 25fa000 commit 089e073

File tree

5 files changed

+37
-23
lines changed

5 files changed

+37
-23
lines changed

config/crd/bases/cluster.x-k8s.io_machinepools.yaml

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

exp/api/v1beta1/machinepool_types.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ type MachinePoolSpec struct {
4949
// be ready.
5050
// Defaults to 0 (machine instance will be considered available as soon as it
5151
// is ready)
52-
// NOTE: No logic is implemented for this field and it currently has no behaviour.
5352
// +optional
5453
MinReadySeconds *int32 `json:"minReadySeconds,omitempty"`
5554

exp/internal/controllers/machinepool_controller_noderef.go

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ import (
2323

2424
"github.com/pkg/errors"
2525
corev1 "k8s.io/api/core/v1"
26+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627
"k8s.io/klog/v2"
2728
ctrl "sigs.k8s.io/controller-runtime"
2829
"sigs.k8s.io/controller-runtime/pkg/client"
2930

3031
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
32+
"sigs.k8s.io/cluster-api/controllers/noderefutil"
3133
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
3234
"sigs.k8s.io/cluster-api/internal/util/taints"
3335
"sigs.k8s.io/cluster-api/util"
@@ -36,9 +38,7 @@ import (
3638
"sigs.k8s.io/cluster-api/util/patch"
3739
)
3840

39-
var (
40-
errNoAvailableNodes = errors.New("cannot find nodes with matching ProviderIDs in ProviderIDList")
41-
)
41+
var errNoAvailableNodes = errors.New("cannot find nodes with matching ProviderIDs in ProviderIDList")
4242

4343
type getNodeReferencesResult struct {
4444
references []corev1.ObjectReference
@@ -82,7 +82,7 @@ func (r *MachinePoolReconciler) reconcileNodeRefs(ctx context.Context, cluster *
8282
}
8383

8484
// Get the Node references.
85-
nodeRefsResult, err := r.getNodeReferences(ctx, clusterClient, mp.Spec.ProviderIDList)
85+
nodeRefsResult, err := r.getNodeReferences(ctx, clusterClient, mp.Spec.ProviderIDList, mp.Spec.MinReadySeconds)
8686
if err != nil {
8787
if err == errNoAvailableNodes {
8888
log.Info("Cannot assign NodeRefs to MachinePool, no matching Nodes")
@@ -153,7 +153,7 @@ func (r *MachinePoolReconciler) deleteRetiredNodes(ctx context.Context, c client
153153
return nil
154154
}
155155

156-
func (r *MachinePoolReconciler) getNodeReferences(ctx context.Context, c client.Client, providerIDList []string) (getNodeReferencesResult, error) {
156+
func (r *MachinePoolReconciler) getNodeReferences(ctx context.Context, c client.Client, providerIDList []string, minReadySeconds *int32) (getNodeReferencesResult, error) {
157157
log := ctrl.LoggerFrom(ctx, "providerIDList", len(providerIDList))
158158

159159
var ready, available int
@@ -185,9 +185,11 @@ func (r *MachinePoolReconciler) getNodeReferences(ctx context.Context, c client.
185185
continue
186186
}
187187
if node, ok := nodeRefsMap[providerID]; ok {
188-
available++
189-
if nodeIsReady(&node) {
188+
if noderefutil.IsNodeReady(&node) {
190189
ready++
190+
if noderefutil.IsNodeAvailable(&node, *minReadySeconds, metav1.Now()) {
191+
available++
192+
}
191193
}
192194
nodeRefs = append(nodeRefs, corev1.ObjectReference{
193195
APIVersion: corev1.SchemeGroupVersion.String(),
@@ -236,12 +238,3 @@ func (r *MachinePoolReconciler) patchNodes(ctx context.Context, c client.Client,
236238
}
237239
return nil
238240
}
239-
240-
func nodeIsReady(node *corev1.Node) bool {
241-
for _, n := range node.Status.Conditions {
242-
if n.Type == corev1.NodeReady {
243-
return n.Status == corev1.ConditionTrue
244-
}
245-
}
246-
return false
247-
}

exp/internal/controllers/machinepool_controller_noderef_test.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
corev1 "k8s.io/api/core/v1"
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
"k8s.io/client-go/tools/record"
26+
"k8s.io/utils/ptr"
2627
"sigs.k8s.io/controller-runtime/pkg/client"
2728
"sigs.k8s.io/controller-runtime/pkg/client/fake"
2829

@@ -90,10 +91,11 @@ func TestMachinePoolGetNodeReference(t *testing.T) {
9091
client := fake.NewClientBuilder().WithObjects(nodeList...).Build()
9192

9293
testCases := []struct {
93-
name string
94-
providerIDList []string
95-
expected *getNodeReferencesResult
96-
err error
94+
name string
95+
providerIDList []string
96+
expected *getNodeReferencesResult
97+
err error
98+
minReadySeconds int32
9799
}{
98100
{
99101
name: "valid provider id, valid aws node",
@@ -175,13 +177,33 @@ func TestMachinePoolGetNodeReference(t *testing.T) {
175177
},
176178
},
177179
},
180+
{
181+
name: "valid provider id, valid aws node, with minReadySeconds",
182+
providerIDList: []string{"aws://us-east-1/id-node-1"},
183+
expected: &getNodeReferencesResult{
184+
references: []corev1.ObjectReference{{Name: "node-1"}},
185+
available: 0,
186+
ready: 1,
187+
},
188+
minReadySeconds: 20,
189+
},
190+
{
191+
name: "valid provider id, valid aws node, with minReadySeconds equals 0",
192+
providerIDList: []string{"aws://us-east-1/id-node-1"},
193+
expected: &getNodeReferencesResult{
194+
references: []corev1.ObjectReference{{Name: "node-1"}},
195+
available: 1,
196+
ready: 1,
197+
},
198+
minReadySeconds: 0,
199+
},
178200
}
179201

180202
for _, test := range testCases {
181203
t.Run(test.name, func(t *testing.T) {
182204
g := NewWithT(t)
183205

184-
result, err := r.getNodeReferences(ctx, client, test.providerIDList)
206+
result, err := r.getNodeReferences(ctx, client, test.providerIDList, ptr.To(test.minReadySeconds))
185207
if test.err == nil {
186208
g.Expect(err).ToNot(HaveOccurred())
187209
} else {

exp/internal/controllers/machinepool_controller_phases_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,6 +1616,7 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
16161616
},
16171617
},
16181618
},
1619+
MinReadySeconds: ptr.To[int32](0),
16191620
},
16201621
Status: expv1.MachinePoolStatus{},
16211622
}

0 commit comments

Comments
 (0)