diff options
Diffstat (limited to 'plugin/kubernetes/setup_test.go')
-rw-r--r-- | plugin/kubernetes/setup_test.go | 473 |
1 files changed, 473 insertions, 0 deletions
diff --git a/plugin/kubernetes/setup_test.go b/plugin/kubernetes/setup_test.go new file mode 100644 index 000000000..2fdc38a9c --- /dev/null +++ b/plugin/kubernetes/setup_test.go @@ -0,0 +1,473 @@ +package kubernetes + +import ( + "strings" + "testing" + "time" + + "github.com/mholt/caddy" + "k8s.io/client-go/1.5/pkg/api/unversioned" +) + +func TestKubernetesParse(t *testing.T) { + tests := []struct { + input string // Corefile data as string + shouldErr bool // true if test case is exected to produce an error. + expectedErrContent string // substring from the expected error. Empty for positive cases. + expectedZoneCount int // expected count of defined zones. + expectedNSCount int // expected count of namespaces. + expectedResyncPeriod time.Duration // expected resync period value + expectedLabelSelector string // expected label selector value + expectedPodMode string + expectedFallthrough bool + expectedUpstreams []string + }{ + // positive + { + `kubernetes coredns.local`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local test.local`, + false, + "", + 2, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + endpoint http://localhost:9090 +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + namespaces demo +}`, + false, + "", + 1, + 1, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + namespaces demo test +}`, + false, + "", + 1, + 2, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + resyncperiod 30s +}`, + false, + "", + 1, + 0, + 30 * time.Second, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + resyncperiod 15m +}`, + false, + "", + 1, + 0, + 15 * time.Minute, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + labels environment=prod +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "environment=prod", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + labels environment in (production, staging, qa),application=nginx +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "application=nginx,environment in (production,qa,staging)", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local test.local { + resyncperiod 15m + endpoint http://localhost:8080 + namespaces demo test + labels environment in (production, staging, qa),application=nginx + fallthrough +}`, + false, + "", + 2, + 2, + 15 * time.Minute, + "application=nginx,environment in (production,qa,staging)", + podModeDisabled, + true, + nil, + }, + // negative + { + `kubernetes coredns.local { + endpoint +}`, + true, + "rong argument count or unexpected line ending", + -1, + -1, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + namespaces +}`, + true, + "rong argument count or unexpected line ending", + -1, + -1, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + resyncperiod +}`, + true, + "rong argument count or unexpected line ending", + -1, + 0, + 0 * time.Minute, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + resyncperiod 15 +}`, + true, + "unable to parse resync duration value", + -1, + 0, + 0 * time.Second, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + resyncperiod abc +}`, + true, + "unable to parse resync duration value", + -1, + 0, + 0 * time.Second, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + labels +}`, + true, + "rong argument count or unexpected line ending", + -1, + 0, + 0 * time.Second, + "", + podModeDisabled, + false, + nil, + }, + { + `kubernetes coredns.local { + labels environment in (production, qa +}`, + true, + "unable to parse label selector", + -1, + 0, + 0 * time.Second, + "", + podModeDisabled, + false, + nil, + }, + // pods disabled + { + `kubernetes coredns.local { + pods disabled +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + // pods insecure + { + `kubernetes coredns.local { + pods insecure +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeInsecure, + false, + nil, + }, + // pods verified + { + `kubernetes coredns.local { + pods verified +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeVerified, + false, + nil, + }, + // pods invalid + { + `kubernetes coredns.local { + pods giant_seed +}`, + true, + "rong value for pods", + -1, + 0, + defaultResyncPeriod, + "", + podModeVerified, + false, + nil, + }, + // fallthrough invalid + { + `kubernetes coredns.local { + fallthrough junk +}`, + true, + "rong argument count", + -1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + // Valid upstream + { + `kubernetes coredns.local { + upstream 13.14.15.16:53 +}`, + false, + "", + 1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + []string{"13.14.15.16:53"}, + }, + // Invalid upstream + { + `kubernetes coredns.local { + upstream 13.14.15.16orange +}`, + true, + "not an IP address or file: \"13.14.15.16orange\"", + -1, + 0, + defaultResyncPeriod, + "", + podModeDisabled, + false, + nil, + }, + } + + for i, test := range tests { + c := caddy.NewTestController("dns", test.input) + k8sController, opts, err := kubernetesParse(c) + + if test.shouldErr && err == nil { + t.Errorf("Test %d: Expected error, but did not find error for input '%s'. Error was: '%v'", i, test.input, err) + } + + if err != nil { + if !test.shouldErr { + t.Errorf("Test %d: Expected no error but found one for input %s. Error was: %v", i, test.input, err) + continue + } + + if test.shouldErr && (len(test.expectedErrContent) < 1) { + t.Fatalf("Test %d: Test marked as expecting an error, but no expectedErrContent provided for input '%s'. Error was: '%v'", i, test.input, err) + } + + if test.shouldErr && (test.expectedZoneCount >= 0) { + t.Errorf("Test %d: Test marked as expecting an error, but provides value for expectedZoneCount!=-1 for input '%s'. Error was: '%v'", i, test.input, err) + } + + if !strings.Contains(err.Error(), test.expectedErrContent) { + t.Errorf("Test %d: Expected error to contain: %v, found error: %v, input: %s", i, test.expectedErrContent, err, test.input) + } + continue + } + + // No error was raised, so validate initialization of k8sController + // Zones + foundZoneCount := len(k8sController.Zones) + if foundZoneCount != test.expectedZoneCount { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with %d zones, instead found %d zones: '%v' for input '%s'", i, test.expectedZoneCount, foundZoneCount, k8sController.Zones, test.input) + } + + // Namespaces + foundNSCount := len(k8sController.Namespaces) + if foundNSCount != test.expectedNSCount { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with %d namespaces. Instead found %d namespaces: '%v' for input '%s'", i, test.expectedNSCount, foundNSCount, k8sController.Namespaces, test.input) + } + + // ResyncPeriod + foundResyncPeriod := opts.resyncPeriod + if foundResyncPeriod != test.expectedResyncPeriod { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with resync period '%s'. Instead found period '%s' for input '%s'", i, test.expectedResyncPeriod, foundResyncPeriod, test.input) + } + + // Labels + if opts.labelSelector != nil { + foundLabelSelectorString := unversioned.FormatLabelSelector(opts.labelSelector) + if foundLabelSelectorString != test.expectedLabelSelector { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with label selector '%s'. Instead found selector '%s' for input '%s'", i, test.expectedLabelSelector, foundLabelSelectorString, test.input) + } + } + // Pods + foundPodMode := k8sController.podMode + if foundPodMode != test.expectedPodMode { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with pod mode '%s'. Instead found pod mode '%s' for input '%s'", i, test.expectedPodMode, foundPodMode, test.input) + } + + // fallthrough + foundFallthrough := k8sController.Fallthrough + if foundFallthrough != test.expectedFallthrough { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with fallthrough '%v'. Instead found fallthrough '%v' for input '%s'", i, test.expectedFallthrough, foundFallthrough, test.input) + } + // upstream + foundUpstreams := k8sController.Proxy.Upstreams + if test.expectedUpstreams == nil { + if foundUpstreams != nil { + t.Errorf("Test %d: Expected kubernetes controller to not be initialized with upstreams for input '%s'", i, test.input) + } + } else { + if foundUpstreams == nil { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with upstreams for input '%s'", i, test.input) + } else { + if len(*foundUpstreams) != len(test.expectedUpstreams) { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with %d upstreams. Instead found %d upstreams for input '%s'", i, len(test.expectedUpstreams), len(*foundUpstreams), test.input) + } + for j, want := range test.expectedUpstreams { + got := (*foundUpstreams)[j].Select().Name + if got != want { + t.Errorf("Test %d: Expected kubernetes controller to be initialized with upstream '%s'. Instead found upstream '%s' for input '%s'", i, want, got, test.input) + } + } + + } + } + } +} |