@@ -4,32 +4,34 @@ import (
4
4
"context"
5
5
"fmt"
6
6
7
+ "github.com/go-logr/logr"
7
8
corev1 "k8s.io/api/core/v1"
8
9
"sigs.k8s.io/controller-runtime/pkg/client"
9
10
"sigs.k8s.io/controller-runtime/pkg/log"
10
11
)
11
12
13
+ const (
14
+ deprecatedControlPlaneLabel = "node-role.kubernetes.io/master"
15
+ controlPlaneLabel = "node-role.kubernetes.io/control-plane"
16
+ )
17
+
12
18
// IsControlPlaneReady takes a client connected to a cluster and reports whether or
13
19
// not the control-plane for the cluster is "ready".
14
20
func IsControlPlaneReady (ctx context.Context , cl client.Client ) (bool , error ) {
15
21
logger := log .FromContext (ctx )
16
- nodes := & corev1.NodeList {}
17
- // https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint/README.md#design-details
18
- err := cl .List (ctx , nodes , client .HasLabels ([]string {"node-role.kubernetes.io/control-plane" }))
22
+ readiness := []bool {}
23
+ readyNodes , err := listReadyNodesWithLabel (ctx , logger , cl , controlPlaneLabel )
19
24
if err != nil {
20
- return false , fmt . Errorf ( "failed to query cluster node list: %w" , err )
25
+ return false , err
21
26
}
22
- logger . Info ( "listed nodes" , "count" , len ( nodes . Items ) )
27
+ readiness = append ( readiness , readyNodes ... )
23
28
24
- readiness := []bool {}
25
- for _ , node := range nodes .Items {
26
- for _ , c := range node .Status .Conditions {
27
- logger .Info ("node status" , "type" , c .Type , "status" , c .Status )
28
- switch c .Type {
29
- case corev1 .NodeReady :
30
- readiness = append (readiness , c .Status == corev1 .ConditionTrue )
31
- }
29
+ if len (readyNodes ) == 0 {
30
+ readyNodes , err := listReadyNodesWithLabel (ctx , logger , cl , deprecatedControlPlaneLabel )
31
+ if err != nil {
32
+ return false , err
32
33
}
34
+ readiness = append (readiness , readyNodes ... )
33
35
}
34
36
35
37
isReady := func (bools []bool ) bool {
@@ -45,3 +47,24 @@ func IsControlPlaneReady(ctx context.Context, cl client.Client) (bool, error) {
45
47
// If we have no statuses, then we really don't know if we're ready or not.
46
48
return (len (readiness ) > 0 && isReady (readiness )), nil
47
49
}
50
+
51
+ func listReadyNodesWithLabel (ctx context.Context , logger logr.Logger , cl client.Client , label string ) ([]bool , error ) {
52
+ nodes := & corev1.NodeList {}
53
+ // https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint/README.md#design-details
54
+ err := cl .List (ctx , nodes , client .HasLabels ([]string {label }))
55
+ if err != nil {
56
+ return nil , fmt .Errorf ("failed to query cluster node list: %w" , err )
57
+ }
58
+ logger .Info ("listed nodes with control plane label" , "label" , label , "count" , len (nodes .Items ))
59
+
60
+ readiness := []bool {}
61
+ for _ , node := range nodes .Items {
62
+ for _ , c := range node .Status .Conditions {
63
+ switch c .Type {
64
+ case corev1 .NodeReady :
65
+ readiness = append (readiness , c .Status == corev1 .ConditionTrue )
66
+ }
67
+ }
68
+ }
69
+ return readiness , nil
70
+ }
0 commit comments