11package targetconfigcontroller
22
33import (
4+ "context"
45 "fmt"
6+ "strconv"
57 "strings"
68 "testing"
79
8- "k8s.io/apimachinery/pkg/runtime"
9-
1010 operatorv1 "github.com/openshift/api/operator/v1"
11+ corev1 "k8s.io/api/core/v1"
12+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+ "k8s.io/apimachinery/pkg/labels"
14+ "k8s.io/apimachinery/pkg/runtime"
15+ "k8s.io/client-go/kubernetes/fake"
1116 "k8s.io/client-go/kubernetes/scheme"
17+ corev1listers "k8s.io/client-go/listers/core/v1"
1218)
1319
1420var codec = scheme .Codecs .LegacyCodec (scheme .Scheme .PrioritizedVersionsAllGroups ()... )
@@ -109,9 +115,11 @@ func TestIsRequiredConfigPresent(t *testing.T) {
109115 },
110116 }
111117
118+ c := TargetConfigController {}
119+
112120 for _ , test := range tests {
113121 t .Run (test .name , func (t * testing.T ) {
114- actual := isRequiredConfigPresent ([]byte (test .config ), false )
122+ actual := c . isRequiredConfigPresent ([]byte (test .config ), false )
115123 switch {
116124 case actual == nil && len (test .expectedError ) == 0 :
117125 case actual == nil && len (test .expectedError ) != 0 :
@@ -255,75 +263,147 @@ func TestIsRequiredConfigPresentEtcdEndpoints(t *testing.T) {
255263 }
256264 }
257265 `
266+
267+ zeroEtcdEndpoint := makeEtcdEndpointsCM ()
268+ oneEtcdEndpoint := makeEtcdEndpointsCM ("ip-10-0-0-1" )
269+ twoEtcdEndpoints := makeEtcdEndpointsCM ("ip-10-0-0-1" , "ip-10-0-0-2" )
270+ threeEtcdEndpoints := makeEtcdEndpointsCM ("ip-10-0-0-1" , "ip-10-0-0-2" , "ip-10-0-0-3" )
271+
258272 tests := []struct {
259273 name string
260274 etcdServers string
275+ etcdEndpointsCM * corev1.ConfigMap
261276 expectedError string
262277 isNotSingleNode bool
263278 }{
264279 {
265- name : "nil-storage-urls" ,
266- etcdServers : "null" ,
267- expectedError : "apiServerArguments.etcd-servers null in config" ,
280+ name : "nil-storage-urls" ,
281+ etcdServers : "null" ,
282+ etcdEndpointsCM : zeroEtcdEndpoint ,
283+ expectedError : "apiServerArguments.etcd-servers null in config" ,
268284 },
269285 {
270- name : "missing-storage-urls" ,
271- etcdServers : "[]" ,
272- expectedError : "apiServerArguments.etcd-servers empty in config" ,
286+ name : "missing-storage-urls" ,
287+ etcdServers : "[]" ,
288+ etcdEndpointsCM : zeroEtcdEndpoint ,
289+ expectedError : "apiServerArguments.etcd-servers empty in config" ,
273290 },
274291 {
275- name : "empty-string-storage-urls" ,
276- etcdServers : `""` ,
277- expectedError : "apiServerArguments.etcd-servers empty in config" ,
292+ name : "empty-string-storage-urls" ,
293+ etcdServers : `""` ,
294+ etcdEndpointsCM : zeroEtcdEndpoint ,
295+ expectedError : "apiServerArguments.etcd-servers empty in config" ,
278296 },
279297 {
280- name : "one-etcd-server" ,
281- etcdServers : `[ "val" ]` ,
298+ name : "missing-etcd-endpoints-configmap" ,
299+ etcdServers : `[ "not-empty" ]` ,
300+ etcdEndpointsCM : & corev1.ConfigMap {},
282301 isNotSingleNode : true ,
283- expectedError : "apiServerArguments. etcd-servers has less than three endpoints " ,
302+ expectedError : "configmaps \" etcd-endpoints \" not found " ,
284303 },
285304 {
286- name : "one-etcd-server-sno" ,
287- etcdServers : `[ "val" ]` ,
288- isNotSingleNode : false ,
305+ name : "bootstrap" ,
306+ etcdServers : `[ "bootstrap" ]` ,
307+ etcdEndpointsCM : zeroEtcdEndpoint ,
308+ isNotSingleNode : true ,
309+ expectedError : "apiServerArguments.etcd-servers has less than two live etcd endpoints: []" ,
289310 },
290311 {
291- name : "two-etcd-servers" ,
292- etcdServers : `[ "val1", "val2" ]` ,
312+ name : "bootstrap-one-endpoint" ,
313+ etcdServers : `[ "bootstrap", "ip-10-0-0-1" ]` ,
314+ etcdEndpointsCM : oneEtcdEndpoint ,
293315 isNotSingleNode : true ,
294- expectedError : "apiServerArguments.etcd-servers has less than three endpoints" ,
316+ expectedError : "apiServerArguments.etcd-servers has less than two live etcd endpoints: [ip-10-0-0-1] " ,
295317 },
296318 {
297- name : "two-etcd-servers-sno" ,
298- etcdServers : `[ "val1", "val2" ]` ,
299- isNotSingleNode : false ,
319+ name : "bootstrap-two-endpoints" ,
320+ etcdServers : `[ "bootstrap", "ip-10-0-0-1", "ip-10-0-0-2" ]` ,
321+ etcdEndpointsCM : twoEtcdEndpoints ,
322+ isNotSingleNode : true ,
300323 },
301324 {
302- name : "three-etcd-servers" ,
303- etcdServers : `[ "val1", "val2", "val3" ]` ,
325+ name : "bootstrap-three-endpoints" ,
326+ etcdServers : `[ "bootstrap", "ip-10-0-0-1", "ip-10-0-0-2", "ip-10-0-0-3" ]` ,
327+ etcdEndpointsCM : threeEtcdEndpoints ,
304328 isNotSingleNode : true ,
305329 },
306330 {
307- name : "three-etcd-servers-sno" ,
308- etcdServers : `[ "val1", "val2", "val3" ]` ,
309- isNotSingleNode : false ,
331+ name : "bootstrap-and-localhost" ,
332+ etcdServers : `[ "bootstrap", "localhost" ]` ,
333+ etcdEndpointsCM : zeroEtcdEndpoint ,
334+ isNotSingleNode : true ,
335+ expectedError : "apiServerArguments.etcd-servers has less than two live etcd endpoints: []" ,
310336 },
311337 {
312- name : "four-etcd-servers" ,
313- etcdServers : `[ "val1", "val2", "val3", "val4" ]` ,
338+ name : "bootstrap-localhost-one-endpoint" ,
339+ etcdServers : `[ "bootstrap", "localhost", "ip-10-0-0-1" ]` ,
340+ etcdEndpointsCM : oneEtcdEndpoint ,
314341 isNotSingleNode : true ,
342+ expectedError : "apiServerArguments.etcd-servers has less than two live etcd endpoints: [ip-10-0-0-1]" ,
315343 },
316344 {
317- name : "four-etcd-servers-sno" ,
318- etcdServers : `[ "val1", "val2", "val3", "val4" ]` ,
345+ name : "bootstrap-localhost-two-endpoints" ,
346+ etcdServers : `[ "bootstrap", "localhost", "ip-10-0-0-1", "ip-10-0-0-2" ]` ,
347+ etcdEndpointsCM : twoEtcdEndpoints ,
348+ isNotSingleNode : true ,
349+ },
350+ {
351+ name : "bootstrap-localhost-three-endpoints" ,
352+ etcdServers : `[ "bootstrap", "localhost", "ip-10-0-0-1", "ip-10-0-0-2", "ip-10-0-0-3" ]` ,
353+ etcdEndpointsCM : threeEtcdEndpoints ,
354+ isNotSingleNode : true ,
355+ },
356+ {
357+ name : "one-endpoint" ,
358+ etcdServers : `[ "ip-10-0-0-1" ]` ,
359+ etcdEndpointsCM : oneEtcdEndpoint ,
360+ isNotSingleNode : true ,
361+ expectedError : "apiServerArguments.etcd-servers has less than two live etcd endpoints: [ip-10-0-0-1]" ,
362+ },
363+ {
364+ name : "two-endpoints" ,
365+ etcdServers : `[ "ip-10-0-0-1", "ip-10-0-0-2" ]` ,
366+ etcdEndpointsCM : twoEtcdEndpoints ,
367+ isNotSingleNode : true ,
368+ },
369+ {
370+ name : "three-endpoints" ,
371+ etcdServers : `[ "ip-10-0-0-1", "ip-10-0-0-2", "ip-10-0-0-3" ]` ,
372+ etcdEndpointsCM : threeEtcdEndpoints ,
373+ isNotSingleNode : true ,
374+ },
375+ {
376+ name : "bootstrap-sno" ,
377+ etcdServers : `[ "bootstrap" ]` ,
378+ etcdEndpointsCM : zeroEtcdEndpoint ,
379+ isNotSingleNode : false ,
380+ },
381+ {
382+ name : "one-endpoint-sno" ,
383+ etcdServers : `[ "ip-10-0-0-1" ]` ,
384+ etcdEndpointsCM : oneEtcdEndpoint ,
385+ isNotSingleNode : false ,
386+ },
387+ {
388+ name : "two-endpoints-sno" ,
389+ etcdServers : `[ "ip-10-0-0-1", "ip-10-0-0-2" ]` ,
390+ etcdEndpointsCM : twoEtcdEndpoints ,
391+ isNotSingleNode : false ,
392+ },
393+ {
394+ name : "bootstrap-three-endpoints" ,
395+ etcdServers : `[ "ip-10-0-0-1", "ip-10-0-0-2", "ip-10-0-0-3" ]` ,
396+ etcdEndpointsCM : threeEtcdEndpoints ,
319397 isNotSingleNode : false ,
320398 },
321399 }
322400
323401 for _ , test := range tests {
324402 t .Run (test .name , func (t * testing.T ) {
403+ kubeClient := fake .NewSimpleClientset (test .etcdEndpointsCM )
404+ c := TargetConfigController {configMapLister : & configMapLister {client : kubeClient , namespace : etcdEndpointNamespace }}
325405 config := fmt .Sprintf (configTemplate , test .etcdServers )
326- actual := isRequiredConfigPresent ([]byte (config ), test .isNotSingleNode )
406+ actual := c . isRequiredConfigPresent ([]byte (config ), test .isNotSingleNode )
327407 switch {
328408 case actual == nil && len (test .expectedError ) == 0 :
329409 case actual == nil && len (test .expectedError ) != 0 :
@@ -336,3 +416,48 @@ func TestIsRequiredConfigPresentEtcdEndpoints(t *testing.T) {
336416 })
337417 }
338418}
419+
420+ func makeEtcdEndpointsCM (endpoints ... string ) * corev1.ConfigMap {
421+ cm := & corev1.ConfigMap {}
422+ cm .Name = etcdEndpointName
423+ cm .Namespace = etcdEndpointNamespace
424+
425+ cm .Data = make (map [string ]string )
426+ for i , ep := range endpoints {
427+ cm .Data [strconv .Itoa (i )] = ep
428+ }
429+
430+ return cm
431+ }
432+
433+ type configMapLister struct {
434+ client * fake.Clientset
435+ namespace string
436+ }
437+
438+ var _ corev1listers.ConfigMapNamespaceLister = & configMapLister {}
439+ var _ corev1listers.ConfigMapLister = & configMapLister {}
440+
441+ func (l * configMapLister ) List (selector labels.Selector ) (ret []* corev1.ConfigMap , err error ) {
442+ list , err := l .client .CoreV1 ().ConfigMaps (l .namespace ).List (context .Background (), metav1.ListOptions {
443+ LabelSelector : selector .String (),
444+ })
445+
446+ var items []* corev1.ConfigMap
447+ for i := range list .Items {
448+ items = append (items , & list .Items [i ])
449+ }
450+
451+ return items , err
452+ }
453+
454+ func (l * configMapLister ) ConfigMaps (namespace string ) corev1listers.ConfigMapNamespaceLister {
455+ return & configMapLister {
456+ client : l .client ,
457+ namespace : namespace ,
458+ }
459+ }
460+
461+ func (l * configMapLister ) Get (name string ) (* corev1.ConfigMap , error ) {
462+ return l .client .CoreV1 ().ConfigMaps (l .namespace ).Get (context .Background (), name , metav1.GetOptions {})
463+ }
0 commit comments