2016-08-19 17:14:17 -07:00
package kubernetes
2016-07-22 16:07:27 -07:00
import (
2025-05-19 07:58:16 +02:00
"slices"
2016-07-22 16:07:27 -07:00
"strings"
"testing"
2025-06-12 02:22:07 +08:00
"time"
2016-08-12 20:44:08 -07:00
2020-09-24 18:14:41 +02:00
"github.com/coredns/caddy"
2018-01-07 14:51:32 -05:00
"github.com/coredns/coredns/plugin/pkg/fall"
2017-09-29 15:58:50 -04:00
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
2016-07-22 16:07:27 -07:00
)
2025-06-12 02:22:07 +08:00
var defaultStartupTimeout = time . Second * 5
2016-07-22 16:07:27 -07:00
func TestKubernetesParse ( t * testing . T ) {
tests := [ ] struct {
2019-07-04 01:09:12 +05:30
input string // Corefile data as string
shouldErr bool // true if test case is expected 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.
expectedLabelSelector string // expected label selector value
expectedNamespaceLabelSelector string // expected namespace label selector value
2019-03-22 08:32:40 -06:00
expectedPodMode string
expectedFallthrough fall . F
2025-06-12 02:22:07 +08:00
expectedStartupTimeout time . Duration
2016-07-22 16:07:27 -07:00
} {
// positive
{
2016-08-05 18:19:51 -07:00
` kubernetes coredns.local ` ,
2016-07-22 16:07:27 -07:00
false ,
"" ,
2016-08-05 18:19:51 -07:00
1 ,
2016-07-22 16:07:27 -07:00
0 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-07-22 16:07:27 -07:00
} ,
{
2016-08-05 18:19:51 -07:00
` kubernetes coredns.local test.local ` ,
2016-07-22 16:07:27 -07:00
false ,
"" ,
2016-08-05 18:19:51 -07:00
2 ,
2016-07-22 16:07:27 -07:00
0 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-07-22 16:07:27 -07:00
} ,
{
2016-08-05 18:19:51 -07:00
` kubernetes coredns . local {
} ` ,
2016-07-22 16:07:27 -07:00
false ,
"" ,
2016-08-05 18:19:51 -07:00
1 ,
2016-07-22 16:07:27 -07:00
0 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-07-22 16:07:27 -07:00
} ,
{
` kubernetes coredns . local {
2018-01-28 16:40:10 +00:00
endpoint http : //localhost:9090 http://localhost:9091
2016-07-22 16:07:27 -07:00
} ` ,
false ,
"" ,
1 ,
0 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-07-22 16:07:27 -07:00
} ,
{
` kubernetes coredns . local {
namespaces demo
} ` ,
false ,
"" ,
1 ,
1 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-07-22 16:07:27 -07:00
} ,
{
` kubernetes coredns . local {
namespaces demo test
} ` ,
false ,
"" ,
1 ,
2 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-08-12 20:44:08 -07:00
} ,
{
` kubernetes coredns . local {
labels environment = prod
} ` ,
false ,
"" ,
1 ,
0 ,
"environment=prod" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-08-12 20:44:08 -07:00
} ,
{
` kubernetes coredns . local {
labels environment in ( production , staging , qa ) , application = nginx
} ` ,
false ,
"" ,
1 ,
0 ,
"application=nginx,environment in (production,qa,staging)" ,
2019-03-22 08:32:40 -06:00
"" ,
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2019-03-22 08:32:40 -06:00
} ,
{
` kubernetes coredns . local {
namespace_labels istio - injection = enabled
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
"istio-injection=enabled" ,
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2019-03-22 08:32:40 -06:00
} ,
{
` kubernetes coredns . local {
namespaces foo bar
namespace_labels istio - injection = enabled
} ` ,
true ,
"Error during parsing: namespaces and namespace_labels cannot both be set" ,
- 1 ,
0 ,
"" ,
"istio-injection=enabled" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-07-22 16:07:27 -07:00
} ,
2016-08-05 18:19:51 -07:00
{
` kubernetes coredns . local test . local {
endpoint http : //localhost:8080
namespaces demo test
2016-08-12 20:44:08 -07:00
labels environment in ( production , staging , qa ) , application = nginx
2017-04-19 16:08:30 -04:00
fallthrough
2016-08-05 18:19:51 -07:00
} ` ,
false ,
"" ,
2 ,
2 ,
2016-08-12 20:44:08 -07:00
"application=nginx,environment in (production,qa,staging)" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Root ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-08-05 18:19:51 -07:00
} ,
2017-08-22 22:11:48 +01:00
// negative
2016-08-05 18:19:51 -07:00
{
2016-07-22 16:07:27 -07:00
` kubernetes coredns . local {
endpoint
} ` ,
true ,
2017-06-14 09:37:10 -07:00
"rong argument count or unexpected line ending" ,
2016-07-22 16:07:27 -07:00
- 1 ,
- 1 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-08-05 18:19:51 -07:00
} ,
{
` kubernetes coredns . local {
namespaces
} ` ,
true ,
2017-06-14 09:37:10 -07:00
"rong argument count or unexpected line ending" ,
2016-08-05 18:19:51 -07:00
- 1 ,
2016-07-22 16:07:27 -07:00
- 1 ,
2016-08-12 20:44:08 -07:00
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-08-12 20:44:08 -07:00
} ,
{
` kubernetes coredns . local {
labels
} ` ,
true ,
2017-06-14 09:37:10 -07:00
"rong argument count or unexpected line ending" ,
2016-08-12 20:44:08 -07:00
- 1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2016-08-12 20:44:08 -07:00
} ,
{
` kubernetes coredns . local {
labels environment in ( production , qa
} ` ,
true ,
2017-06-14 09:37:10 -07:00
"unable to parse label selector" ,
2016-08-12 20:44:08 -07:00
- 1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2017-02-02 16:51:42 -05:00
} ,
// pods disabled
{
` kubernetes coredns . local {
pods disabled
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2017-02-02 16:51:42 -05:00
} ,
// pods insecure
{
` kubernetes coredns . local {
pods insecure
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeInsecure ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2017-02-02 16:51:42 -05:00
} ,
// pods verified
{
` kubernetes coredns . local {
pods verified
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeVerified ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2017-02-02 16:51:42 -05:00
} ,
// pods invalid
{
` kubernetes coredns . local {
pods giant_seed
} ` ,
true ,
2017-06-14 09:37:10 -07:00
"rong value for pods" ,
2017-02-02 16:51:42 -05:00
- 1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeVerified ,
2018-01-09 22:29:19 +00:00
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2017-04-19 16:08:30 -04:00
} ,
2018-01-06 14:52:09 -05:00
// fallthrough with zones
2017-04-19 16:08:30 -04:00
{
` kubernetes coredns . local {
2018-01-06 14:52:09 -05:00
fallthrough ip6 . arpa inaddr . arpa foo . com
2017-04-19 16:08:30 -04:00
} ` ,
2018-01-06 14:52:09 -05:00
false ,
2017-06-14 09:37:10 -07:00
"rong argument count" ,
2018-01-06 14:52:09 -05:00
1 ,
2017-04-19 16:08:30 -04:00
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2017-08-22 22:11:48 +01:00
podModeDisabled ,
2018-01-07 14:51:32 -05:00
fall . F { Zones : [ ] string { "ip6.arpa." , "inaddr.arpa." , "foo.com." } } ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2017-05-30 08:20:39 -04:00
} ,
2018-02-07 11:31:08 -05:00
// More than one Kubernetes not allowed
{
` kubernetes coredns . local
kubernetes cluster . local ` ,
true ,
2018-02-28 18:16:05 -08:00
"this plugin" ,
2018-02-07 11:31:08 -05:00
- 1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2018-02-07 11:31:08 -05:00
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2018-02-07 11:31:08 -05:00
} ,
2018-09-28 12:18:55 -07:00
{
` kubernetes coredns . local {
kubeconfig
} ` ,
true ,
"Wrong argument count or unexpected line ending after" ,
- 1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2018-09-28 12:18:55 -07:00
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2018-09-28 12:18:55 -07:00
} ,
{
` kubernetes coredns . local {
kubeconfig file context extraarg
} ` ,
true ,
"Wrong argument count or unexpected line ending after" ,
- 1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2018-09-28 12:18:55 -07:00
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2018-09-28 12:18:55 -07:00
} ,
{
` kubernetes coredns . local {
2021-02-09 21:36:32 +08:00
kubeconfig file
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
"" ,
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
2021-02-09 21:36:32 +08:00
} ,
{
` kubernetes coredns . local {
2018-09-28 12:18:55 -07:00
kubeconfig file context
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
2019-03-22 08:32:40 -06:00
"" ,
2018-09-28 12:18:55 -07:00
podModeDisabled ,
fall . Zero ,
2025-06-12 02:22:07 +08:00
defaultStartupTimeout ,
} ,
{
` kubernetes coredns . local {
kubeconfig file context
startup_timeout 1 s
} ` ,
false ,
"" ,
1 ,
0 ,
"" ,
"" ,
podModeDisabled ,
fall . Zero ,
time . Second * 1 ,
2018-09-28 12:18:55 -07:00
} ,
2016-07-22 16:07:27 -07:00
}
for i , test := range tests {
2016-08-19 17:14:17 -07:00
c := caddy . NewTestController ( "dns" , test . input )
2018-02-12 14:27:16 -05:00
k8sController , err := kubernetesParse ( c )
2016-07-22 16:07:27 -07:00
if test . shouldErr && err == nil {
2016-08-05 18:19:51 -07:00
t . Errorf ( "Test %d: Expected error, but did not find error for input '%s'. Error was: '%v'" , i , test . input , err )
2016-07-22 16:07:27 -07:00
}
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 )
2016-08-05 18:19:51 -07:00
continue
2016-07-22 16:07:27 -07:00
}
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 ) {
2016-08-05 18:19:51 -07:00
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 )
2016-07-22 16:07:27 -07:00
}
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 )
}
2016-08-05 18:19:51 -07:00
continue
2016-07-22 16:07:27 -07:00
}
// 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 )
2016-08-08 14:30:04 -07:00
}
2016-08-12 20:44:08 -07:00
// Labels
2018-02-12 14:27:16 -05:00
if k8sController . opts . labelSelector != nil {
foundLabelSelectorString := meta . FormatLabelSelector ( k8sController . opts . labelSelector )
2016-08-12 20:44:08 -07:00
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 )
}
2016-07-22 16:07:27 -07:00
}
2017-02-02 16:51:42 -05:00
// Pods
2017-08-22 22:11:48 +01:00
foundPodMode := k8sController . podMode
2017-02-02 16:51:42 -05:00
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 )
}
2017-04-19 16:08:30 -04:00
// fallthrough
2018-01-07 14:51:32 -05:00
if ! k8sController . Fall . Equal ( 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 , k8sController . Fall , test . input )
2017-04-19 16:08:30 -04:00
}
2025-06-12 02:22:07 +08:00
// startupTimeout
if k8sController . startupTimeout . String ( ) != test . expectedStartupTimeout . String ( ) {
t . Errorf ( "Test %d: Expected kubernetes controller to be initialized with startupTimeout '%v'. Instead found startupTimeout '%v' for input '%s'" , i , test . expectedStartupTimeout , k8sController . startupTimeout , test . input )
}
2016-07-22 16:07:27 -07:00
}
}
2017-11-08 08:07:10 -05:00
2018-02-16 11:05:52 -05:00
func TestKubernetesParseEndpointPodNames ( t * testing . T ) {
2017-11-08 08:07:10 -05:00
tests := [ ] struct {
input string // Corefile data as string
2018-08-14 17:55:55 +02:00
shouldErr bool // true if test case is expected to produce an error.
2017-11-08 08:07:10 -05:00
expectedErrContent string // substring from the expected error. Empty for positive cases.
expectedEndpointMode bool
} {
// valid endpoints mode
{
` kubernetes coredns . local {
endpoint_pod_names
} ` ,
false ,
"" ,
true ,
} ,
// endpoints invalid
{
` kubernetes coredns . local {
endpoint_pod_names giant_seed
} ` ,
true ,
"rong argument count or unexpected" ,
false ,
} ,
// endpoint not set
{
` kubernetes coredns . local {
} ` ,
false ,
"" ,
false ,
} ,
}
for i , test := range tests {
c := caddy . NewTestController ( "dns" , test . input )
2018-02-12 14:27:16 -05:00
k8sController , err := kubernetesParse ( c )
2017-11-08 08:07:10 -05:00
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 ! 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
}
// Endpoints
foundEndpointNameMode := k8sController . endpointNameMode
if foundEndpointNameMode != test . expectedEndpointMode {
t . Errorf ( "Test %d: Expected kubernetes controller to be initialized with endpoints mode '%v'. Instead found endpoints mode '%v' for input '%s'" , i , test . expectedEndpointMode , foundEndpointNameMode , test . input )
}
}
}
2018-02-16 11:05:52 -05:00
func TestKubernetesParseNoEndpoints ( t * testing . T ) {
tests := [ ] struct {
input string // Corefile data as string
2018-08-14 17:55:55 +02:00
shouldErr bool // true if test case is expected to produce an error.
2018-02-16 11:05:52 -05:00
expectedErrContent string // substring from the expected error. Empty for positive cases.
expectedEndpointsInit bool
} {
// valid
{
` kubernetes coredns . local {
noendpoints
} ` ,
false ,
"" ,
false ,
} ,
// invalid
{
` kubernetes coredns . local {
noendpoints ixnay on the endpointsay
} ` ,
true ,
"rong argument count or unexpected" ,
true ,
} ,
// not set
{
` kubernetes coredns . local {
} ` ,
false ,
"" ,
true ,
} ,
}
for i , test := range tests {
c := caddy . NewTestController ( "dns" , test . input )
k8sController , 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 ! 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
}
foundEndpointsInit := k8sController . opts . initEndpointsCache
if foundEndpointsInit != test . expectedEndpointsInit {
t . Errorf ( "Test %d: Expected kubernetes controller to be initialized with endpoints watch '%v'. Instead found endpoints watch '%v' for input '%s'" , i , test . expectedEndpointsInit , foundEndpointsInit , test . input )
}
}
}
2018-05-23 14:57:59 +02:00
func TestKubernetesParseIgnoreEmptyService ( t * testing . T ) {
tests := [ ] struct {
input string // Corefile data as string
2018-08-14 17:55:55 +02:00
shouldErr bool // true if test case is expected to produce an error.
2018-05-23 14:57:59 +02:00
expectedErrContent string // substring from the expected error. Empty for positive cases.
expectedEndpointsInit bool
} {
// valid
{
` kubernetes coredns . local {
ignore empty_service
} ` ,
false ,
"" ,
true ,
} ,
// invalid
{
` kubernetes coredns . local {
ignore ixnay on the endpointsay
} ` ,
true ,
"unable to parse ignore value" ,
false ,
} ,
{
` kubernetes coredns . local {
ignore empty_service ixnay on the endpointsay
} ` ,
false ,
"" ,
true ,
} ,
// not set
{
` kubernetes coredns . local {
} ` ,
false ,
"" ,
false ,
} ,
}
for i , test := range tests {
c := caddy . NewTestController ( "dns" , test . input )
k8sController , 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 ! 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
}
foundIgnoreEmptyService := k8sController . opts . ignoreEmptyService
if foundIgnoreEmptyService != test . expectedEndpointsInit {
t . Errorf ( "Test %d: Expected kubernetes controller to be initialized with ignore empty_service '%v'. Instead found ignore empty_service watch '%v' for input '%s'" , i , test . expectedEndpointsInit , foundIgnoreEmptyService , test . input )
}
}
}
2025-05-19 07:58:16 +02:00
func TestKubernetesParseMulticluster ( t * testing . T ) {
tests := [ ] struct {
input string // Corefile data as string
shouldErr bool // true if test case is expected to produce an error.
expectedErrContent string // substring from the expected error. Empty for positive cases.
expectedMulticlusterZones [ ] string
} {
// valid
{
` kubernetes coredns . local clusterset . local {
multicluster clusterset . local
} ` ,
false ,
"" ,
[ ] string { "clusterset.local." } ,
} ,
// invalid
{
` kubernetes coredns . local {
multicluster clusterset . local
} ` ,
true ,
"Error during parsing: is not authoritative for the multicluster zone clusterset.local." ,
[ ] string { "clusterset.local." } ,
} ,
{
` kubernetes coredns . local clusterset . local {
multicluster clusterset . local test . local
} ` ,
true ,
"Error during parsing: is not authoritative for the multicluster zone test.local." ,
[ ] string { "clusterset.local." , "test.local." } ,
} ,
// not set
{
` kubernetes coredns . local {
multicluster
} ` ,
false ,
"" ,
[ ] string { } ,
} ,
}
for i , test := range tests {
c := caddy . NewTestController ( "dns" , test . input )
k8sController , 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 ! 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
}
foundMulticlusterZones := k8sController . opts . multiclusterZones
if ! slices . Equal ( foundMulticlusterZones , test . expectedMulticlusterZones ) {
t . Errorf ( "Test %d: Expected kubernetes controller to be initialized with multicluster '%v'. Instead found multicluster '%v' for input '%s'" , i , test . expectedMulticlusterZones , foundMulticlusterZones , test . input )
}
}
}