@@ -17,6 +17,8 @@ limitations under the License.
17
17
package upgrade
18
18
19
19
import (
20
+ "context"
21
+ "errors"
20
22
"fmt"
21
23
"strings"
22
24
"testing"
@@ -54,11 +56,17 @@ func (f *fakeVersionGetter) ClusterVersion() (string, *versionutil.Version, erro
54
56
55
57
// KubeadmVersion gets a fake kubeadm version
56
58
func (f * fakeVersionGetter ) KubeadmVersion () (string , * versionutil.Version , error ) {
59
+ if f .kubeadmVersion == "" {
60
+ return "" , nil , errors .New ("get kubeadm version error" )
61
+ }
57
62
return f .kubeadmVersion , versionutil .MustParseSemantic (f .kubeadmVersion ), nil
58
63
}
59
64
60
65
// VersionFromCILabel gets fake latest versions from CI
61
66
func (f * fakeVersionGetter ) VersionFromCILabel (ciVersionLabel , _ string ) (string , * versionutil.Version , error ) {
67
+ if f .stableVersion == "" {
68
+ return "" , nil , errors .New ("fake error" )
69
+ }
62
70
if ciVersionLabel == "stable" {
63
71
return f .stableVersion , versionutil .MustParseSemantic (f .stableVersion ), nil
64
72
}
@@ -73,6 +81,9 @@ func (f *fakeVersionGetter) VersionFromCILabel(ciVersionLabel, _ string) (string
73
81
74
82
// KubeletVersions should return a map with a version and a list of node names that describes how many kubelets there are for that version
75
83
func (f * fakeVersionGetter ) KubeletVersions () (map [string ][]string , error ) {
84
+ if f .kubeletVersion == "" {
85
+ return nil , errors .New ("get kubelet version failed" )
86
+ }
76
87
return map [string ][]string {
77
88
f .kubeletVersion : {"node1" },
78
89
}, nil
@@ -89,6 +100,17 @@ func (f *fakeVersionGetter) ComponentVersions(name string) (map[string][]string,
89
100
}, nil
90
101
}
91
102
103
+ if f .componentVersion == "" {
104
+ return nil , errors .New ("get component version failed" )
105
+ }
106
+
107
+ if f .componentVersion == "multiVersion" {
108
+ return map [string ][]string {
109
+ "node1" : {"node1" },
110
+ "node2" : {"node2" },
111
+ }, nil
112
+ }
113
+
92
114
return map [string ][]string {
93
115
f .componentVersion : {"node1" },
94
116
}, nil
@@ -136,6 +158,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
136
158
allowExperimental , allowRCs bool
137
159
errExpected bool
138
160
beforeDNSVersion string
161
+ deployDNSFailed bool
139
162
}{
140
163
{
141
164
name : "no action needed, already up-to-date" ,
@@ -154,6 +177,110 @@ func TestGetAvailableUpgrades(t *testing.T) {
154
177
allowExperimental : false ,
155
178
errExpected : false ,
156
179
},
180
+ {
181
+ name : "get component version failed" ,
182
+ vg : & fakeVersionGetter {
183
+ clusterVersion : v1Y0 .String (),
184
+ componentVersion : "" ,
185
+ kubeletVersion : v1Y0 .String (),
186
+ kubeadmVersion : v1Y0 .String (),
187
+ etcdVersion : fakeCurrentEtcdVersion ,
188
+
189
+ stablePatchVersion : v1Y0 .String (),
190
+ stableVersion : v1Y0 .String (),
191
+ },
192
+ beforeDNSVersion : fakeCurrentCoreDNSVersion ,
193
+ expectedUpgrades : nil ,
194
+ allowExperimental : false ,
195
+ errExpected : true ,
196
+ },
197
+ {
198
+ name : "there is version information about multiple components" ,
199
+ vg : & fakeVersionGetter {
200
+ clusterVersion : v1Y0 .String (),
201
+ componentVersion : "multiVersion" ,
202
+ kubeletVersion : v1Y0 .String (),
203
+ kubeadmVersion : v1Y0 .String (),
204
+ etcdVersion : fakeCurrentEtcdVersion ,
205
+
206
+ stablePatchVersion : v1Y0 .String (),
207
+ stableVersion : v1Y0 .String (),
208
+ },
209
+ beforeDNSVersion : fakeCurrentCoreDNSVersion ,
210
+ expectedUpgrades : nil ,
211
+ allowExperimental : false ,
212
+ errExpected : true ,
213
+ },
214
+ {
215
+ name : "get kubeadm version failed" ,
216
+ vg : & fakeVersionGetter {
217
+ clusterVersion : v1Y0 .String (),
218
+ componentVersion : v1Y0 .String (),
219
+ kubeletVersion : v1Y0 .String (),
220
+ kubeadmVersion : "" ,
221
+ etcdVersion : fakeCurrentEtcdVersion ,
222
+
223
+ stablePatchVersion : v1Y0 .String (),
224
+ stableVersion : v1Y0 .String (),
225
+ },
226
+ beforeDNSVersion : fakeCurrentCoreDNSVersion ,
227
+ expectedUpgrades : nil ,
228
+ allowExperimental : false ,
229
+ errExpected : true ,
230
+ },
231
+ {
232
+ name : "get kubelet version failed" ,
233
+ vg : & fakeVersionGetter {
234
+ clusterVersion : v1Y0 .String (),
235
+ componentVersion : v1Y0 .String (),
236
+ kubeletVersion : "" ,
237
+ kubeadmVersion : v1Y0 .String (),
238
+ etcdVersion : fakeCurrentEtcdVersion ,
239
+
240
+ stablePatchVersion : v1Y0 .String (),
241
+ stableVersion : v1Y0 .String (),
242
+ },
243
+ beforeDNSVersion : fakeCurrentCoreDNSVersion ,
244
+ expectedUpgrades : nil ,
245
+ allowExperimental : false ,
246
+ errExpected : true ,
247
+ },
248
+ {
249
+ name : "deploy DNS failed" ,
250
+ vg : & fakeVersionGetter {
251
+ clusterVersion : v1Y0 .String (),
252
+ componentVersion : v1Y0 .String (),
253
+ kubeletVersion : v1Y0 .String (),
254
+ kubeadmVersion : v1Y0 .String (),
255
+ etcdVersion : fakeCurrentEtcdVersion ,
256
+
257
+ stablePatchVersion : v1Y0 .String (),
258
+ stableVersion : v1Y0 .String (),
259
+ },
260
+ beforeDNSVersion : fakeCurrentCoreDNSVersion ,
261
+
262
+ expectedUpgrades : nil ,
263
+ allowExperimental : false ,
264
+ errExpected : false ,
265
+ },
266
+ {
267
+ name : "get stable version from CI label failed" ,
268
+ vg : & fakeVersionGetter {
269
+ clusterVersion : v1Y0 .String (),
270
+ componentVersion : v1Y0 .String (),
271
+ kubeletVersion : v1Y0 .String (),
272
+ kubeadmVersion : v1Y0 .String (),
273
+ etcdVersion : fakeCurrentEtcdVersion ,
274
+
275
+ stablePatchVersion : v1Y0 .String (),
276
+ stableVersion : "" ,
277
+ },
278
+ beforeDNSVersion : fakeCurrentCoreDNSVersion ,
279
+ deployDNSFailed : true ,
280
+ expectedUpgrades : nil ,
281
+ allowExperimental : false ,
282
+ errExpected : true ,
283
+ },
157
284
{
158
285
name : "simple patch version upgrade" ,
159
286
vg : & fakeVersionGetter {
@@ -781,30 +908,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
781
908
782
909
dnsName := constants .CoreDNSDeploymentName
783
910
784
- client := clientsetfake .NewSimpleClientset (& apps.Deployment {
785
- TypeMeta : metav1.TypeMeta {
786
- Kind : "Deployment" ,
787
- APIVersion : "apps/v1" ,
788
- },
789
- ObjectMeta : metav1.ObjectMeta {
790
- Name : dnsName ,
791
- Namespace : "kube-system" ,
792
- Labels : map [string ]string {
793
- "k8s-app" : "kube-dns" ,
794
- },
795
- },
796
- Spec : apps.DeploymentSpec {
797
- Template : v1.PodTemplateSpec {
798
- Spec : v1.PodSpec {
799
- Containers : []v1.Container {
800
- {
801
- Image : "test:" + rt .beforeDNSVersion ,
802
- },
803
- },
804
- },
805
- },
806
- },
807
- })
911
+ client := newMockClientForTest (t , dnsName , rt .beforeDNSVersion , rt .deployDNSFailed )
808
912
809
913
actualUpgrades , actualErr := GetAvailableUpgrades (rt .vg , rt .allowExperimental , rt .allowRCs , client , & output.TextPrinter {})
810
914
if diff := cmp .Diff (rt .expectedUpgrades , actualUpgrades ); len (diff ) > 0 {
@@ -995,3 +1099,42 @@ func TestGetSuggestedEtcdVersion(t *testing.T) {
995
1099
})
996
1100
}
997
1101
}
1102
+
1103
+ func newMockClientForTest (t * testing.T , dnsName string , dnsVersion string , multiDNS bool ) * clientsetfake.Clientset {
1104
+ client := clientsetfake .NewSimpleClientset ()
1105
+ createDeployment := func (name string ) {
1106
+ _ , err := client .AppsV1 ().Deployments (metav1 .NamespaceSystem ).Create (context .TODO (), & apps.Deployment {
1107
+ TypeMeta : metav1.TypeMeta {
1108
+ Kind : "Deployment" ,
1109
+ APIVersion : "apps/v1" ,
1110
+ },
1111
+ ObjectMeta : metav1.ObjectMeta {
1112
+ Name : dnsName + name ,
1113
+ Namespace : "kube-system" ,
1114
+ Labels : map [string ]string {
1115
+ "k8s-app" : "kube-dns" ,
1116
+ },
1117
+ },
1118
+ Spec : apps.DeploymentSpec {
1119
+ Template : v1.PodTemplateSpec {
1120
+ Spec : v1.PodSpec {
1121
+ Containers : []v1.Container {
1122
+ {
1123
+ Image : "test:" + dnsVersion + name ,
1124
+ },
1125
+ },
1126
+ },
1127
+ },
1128
+ },
1129
+ }, metav1.CreateOptions {})
1130
+ if err != nil {
1131
+ t .Fatalf ("error creating deployment: %v" , err )
1132
+ }
1133
+ }
1134
+
1135
+ createDeployment ("" )
1136
+ if multiDNS {
1137
+ createDeployment ("dns2" )
1138
+ }
1139
+ return client
1140
+ }
0 commit comments