1
16
17 package upgrade
18
19 import (
20 "reflect"
21 "testing"
22
23 v1 "k8s.io/api/core/v1"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/runtime/schema"
26 "k8s.io/apimachinery/pkg/version"
27 fakediscovery "k8s.io/client-go/discovery/fake"
28 clientsetfake "k8s.io/client-go/kubernetes/fake"
29 )
30
31 func TestKubeVersionGetterClusterVersion(t *testing.T) {
32 tests := []struct {
33 name string
34 version *version.Info
35 wantClusterVersion string
36 wantParsedVersion string
37 wantErr bool
38 }{
39 {
40 name: "cluster version is valid",
41 version: &version.Info{
42 GitVersion: "1.20.0",
43 },
44 wantClusterVersion: "1.20.0",
45 wantParsedVersion: "1.20.0",
46 wantErr: false,
47 },
48 {
49 name: "cluster version is empty",
50 version: &version.Info{},
51 wantClusterVersion: "",
52 wantParsedVersion: "",
53 wantErr: true,
54 },
55 {
56 name: "cluster version is invalid",
57 version: &version.Info{
58 GitVersion: "invalid-version",
59 },
60 wantClusterVersion: "",
61 wantParsedVersion: "",
62 wantErr: true,
63 },
64 }
65 for _, tt := range tests {
66 t.Run(tt.name, func(t *testing.T) {
67 client := clientsetfake.NewSimpleClientset()
68 client.Discovery().(*fakediscovery.FakeDiscovery).FakedServerVersion = tt.version
69
70 g := &KubeVersionGetter{
71 client: client,
72 }
73 clusterVersion, parsedVersion, err := g.ClusterVersion()
74
75 if (err != nil) != tt.wantErr {
76 t.Errorf("error = %v, wantErr = %v", err, tt.wantErr)
77 return
78 }
79 if clusterVersion != tt.wantClusterVersion {
80 t.Errorf("clusterVersion = %v, wantClusterVersion = %v", clusterVersion, tt.wantClusterVersion)
81 }
82 if tt.wantParsedVersion == "" {
83 if parsedVersion != nil {
84 t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
85 }
86 } else if parsedVersion.String() != tt.wantParsedVersion {
87 t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
88 }
89 })
90 }
91 }
92
93 func TestKubeVersionGetterVersionFromCILabel(t *testing.T) {
94 tests := []struct {
95 name string
96 ciVersionLabel string
97 wantCIVersion string
98 wantParsedVersion string
99 wantErr bool
100 }{
101 {
102 name: "version is valid",
103 ciVersionLabel: "v1.28.1",
104 wantCIVersion: "v1.28.1",
105 wantParsedVersion: "1.28.1",
106 wantErr: false,
107 },
108 {
109 name: "version is invalid",
110 ciVersionLabel: "invalid-version",
111 wantCIVersion: "",
112 wantParsedVersion: "",
113 wantErr: true,
114 },
115 {
116 name: "version is empty",
117 ciVersionLabel: "",
118 wantCIVersion: "",
119 wantParsedVersion: "",
120 wantErr: true,
121 },
122 }
123 for _, tt := range tests {
124 t.Run(tt.name, func(t *testing.T) {
125 g := &KubeVersionGetter{
126 client: clientsetfake.NewSimpleClientset(),
127 }
128 cliVersion, parsedVersion, err := g.VersionFromCILabel(tt.ciVersionLabel, "test VersionFromCILabel")
129 if (err != nil) != tt.wantErr {
130 t.Errorf("error = %v, wantErr = %v", err, tt.wantErr)
131 return
132 }
133 if cliVersion != tt.wantCIVersion {
134 t.Errorf("cliVersion = %v, wantCIVersion = %v", cliVersion, tt.wantCIVersion)
135 }
136 if tt.wantParsedVersion == "" {
137 if parsedVersion != nil {
138 t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
139 }
140 } else if parsedVersion.String() != tt.wantParsedVersion {
141 t.Errorf("parsedVersion = %v, wantParsedVersion = %v", parsedVersion, tt.wantParsedVersion)
142 }
143 })
144 }
145 }
146
147 func TestKubeVersionGetterKubeletVersions(t *testing.T) {
148 tests := []struct {
149 name string
150 nodes *v1.NodeList
151 want map[string][]string
152 wantErr bool
153 }{
154 {
155 name: "kubelet version info exists",
156 nodes: &v1.NodeList{
157 Items: []v1.Node{
158 {
159 ObjectMeta: metav1.ObjectMeta{Name: "node1"},
160 Status: v1.NodeStatus{
161 NodeInfo: v1.NodeSystemInfo{
162 KubeletVersion: "v1.28.0",
163 },
164 },
165 },
166 {
167 ObjectMeta: metav1.ObjectMeta{Name: "node2"},
168 Status: v1.NodeStatus{
169 NodeInfo: v1.NodeSystemInfo{
170 KubeletVersion: "v1.28.1",
171 },
172 },
173 },
174 {
175 ObjectMeta: metav1.ObjectMeta{Name: "node3"},
176 Status: v1.NodeStatus{
177 NodeInfo: v1.NodeSystemInfo{
178 KubeletVersion: "v1.28.1",
179 },
180 },
181 },
182 },
183 },
184 want: map[string][]string{
185 "v1.28.0": {"node1"},
186 "v1.28.1": {"node2", "node3"},
187 },
188 wantErr: false,
189 },
190 {
191 name: "kubelet version info is empty",
192 nodes: &v1.NodeList{
193 Items: []v1.Node{
194 {
195 ObjectMeta: metav1.ObjectMeta{Name: "node2"},
196 Status: v1.NodeStatus{},
197 },
198 {
199 ObjectMeta: metav1.ObjectMeta{Name: "node3"},
200 Status: v1.NodeStatus{},
201 },
202 },
203 },
204 want: map[string][]string{
205 "": {"node2", "node3"},
206 },
207 wantErr: false,
208 },
209 {
210 name: "node list is empty",
211 nodes: &v1.NodeList{},
212 want: map[string][]string{},
213 wantErr: false,
214 },
215 }
216 for _, tt := range tests {
217 client := clientsetfake.NewSimpleClientset()
218 t.Run(tt.name, func(t *testing.T) {
219 for _, node := range tt.nodes.Items {
220 err := client.Tracker().Create(schema.GroupVersionResource{Version: "v1", Resource: "nodes"}, &node, "")
221 if err != nil {
222 t.Fatal(err)
223 }
224 }
225 g := &KubeVersionGetter{
226 client: client,
227 }
228 got, err := g.KubeletVersions()
229 if (err != nil) != tt.wantErr {
230 t.Errorf("error = %v, wantErr = %v", err, tt.wantErr)
231 return
232 }
233 if !reflect.DeepEqual(got, tt.want) {
234 t.Errorf("got = %v, want = %v", got, tt.want)
235 }
236 })
237 }
238 }
239
View as plain text