/
k8sversion.go
78 lines (66 loc) · 1.99 KB
/
k8sversion.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package precheck
import (
"context"
"fmt"
"time"
"github.com/go-logr/logr"
rainbondv1alpha1 "github.com/goodrain/rainbond-operator/pkg/apis/rainbond/v1alpha1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type k8sversion struct {
ctx context.Context
log logr.Logger
client client.Client
}
// NewK8sVersionPrechecker creates a new kubernetes version prechecker.
func NewK8sVersionPrechecker(ctx context.Context, log logr.Logger, client client.Client) PreChecker {
l := log.WithName("K8sVersionPreChecker")
return &k8sversion{
ctx: ctx,
log: l,
client: client,
}
}
func (k *k8sversion) Check() rainbondv1alpha1.RainbondClusterCondition {
condition := rainbondv1alpha1.RainbondClusterCondition{
Type: rainbondv1alpha1.RainbondClusterConditionTypeKubernetesVersion,
Status: corev1.ConditionTrue,
LastHeartbeatTime: metav1.NewTime(time.Now()),
}
version, err := k.getKubernetesVersion()
if err != nil {
condition.Status = corev1.ConditionFalse
condition.Reason = "KubernetesVersionFailed"
condition.Message = err.Error()
return condition
}
if version < "v1.13.0" {
condition.Status = corev1.ConditionFalse
condition.Reason = "UnsupportedKubernetesVersion"
condition.Message = "expect the version of k8s to be greater than or equal to 1.13.0, but got " + version
return condition
}
return condition
}
func (k *k8sversion) getKubernetesVersion() (string, error) {
nodeList := &corev1.NodeList{}
var listOpts []client.ListOption
if err := k.client.List(k.ctx, nodeList, listOpts...); err != nil {
k.log.Error(err, "list nodes")
return "", fmt.Errorf("list nodes: %v", err)
}
var version string
for _, node := range nodeList.Items {
if node.Status.NodeInfo.KubeletVersion == "" {
continue
}
version = node.Status.NodeInfo.KubeletVersion
break
}
if version == "" {
return "", fmt.Errorf("failed to get kubernetes version")
}
return version, nil
}