forked from coredns/coredns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathview_test.go
163 lines (142 loc) · 4.96 KB
/
view_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package test
import (
"strings"
"testing"
"github.com/coredns/coredns/plugin/test"
"github.com/miekg/dns"
)
func TestView(t *testing.T) {
// Hack to get an available port - We spin up a temporary dummy coredns on :0 to get the port number, then we re-use
// that one port consistently across all server blocks.
corefile := `example.org:0 {
erratic
}`
tmp, addr, _, err := CoreDNSServerAndPorts(corefile)
if err != nil {
t.Fatalf("Could not get CoreDNS serving instance: %s", err)
}
port := addr[strings.LastIndex(addr, ":")+1:]
// Corefile with test views
corefile = `
# split-type config: splits quries for A/AAAA into separate views
split-type:` + port + ` {
view test-view-a {
expr type() == 'A'
}
hosts {
1.2.3.4 test.split-type
}
}
split-type:` + port + ` {
view test-view-aaaa {
expr type() == 'AAAA'
}
hosts {
1:2:3::4 test.split-type
}
}
# split-name config: splits queries into separate views based on first label in query name ("one", "two")
split-name:` + port + ` {
view test-view-1 {
expr name() matches '^one\\..*\\.split-name\\.$'
}
hosts {
1.1.1.1 one.test.split-name one.test.test.test.split-name
}
}
split-name:` + port + ` {
view test-view-2 {
expr name() matches '^two\\..*\\.split-name\\.$'
}
hosts {
2.2.2.2 two.test.split-name two.test.test.test.split-name
}
}
split-name:` + port + ` {
hosts {
3.3.3.3 default.test.split-name
}
}
# metadata config: verifies that metadata is properly collected by the server,
# and that metadata function correctly looks up the value of the metadata.
metadata:` + port + ` {
metadata
view test-view-meta1 {
# This is never true
expr metadata('view/name') == 'not-the-view-name'
}
hosts {
1.1.1.1 test.metadata
}
}
metadata:` + port + ` {
view test-view-meta2 {
# This is never true. The metadata plugin is not enabled in this server block so the metadata function returns
# an empty string
expr metadata('view/name') == 'test-view-meta2'
}
hosts {
2.2.2.2 test.metadata
}
}
metadata:` + port + ` {
metadata
view test-view-meta3 {
# This is always true. Queries in the zone 'metadata.' should always be served using this view.
expr metadata('view/name') == 'test-view-meta3'
}
hosts {
2.2.2.2 test.metadata
}
}
metadata:` + port + ` {
# This block should never be reached since the prior view in the same zone is always true
hosts {
3.3.3.3 test.metadata
}
}
`
i, addr, _, err := CoreDNSServerAndPorts(corefile)
if err != nil {
t.Fatalf("Could not get CoreDNS serving instance: %s", err)
}
// there are multiple sever blocks, but they are all on the same port, so it's a single server instance to stop
defer i.Stop()
// stop the temporary instance before starting tests.
tmp.Stop()
viewTest(t, "split-type A", addr, "test.split-type.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("test.split-type. 303 IN A 1.2.3.4")})
viewTest(t, "split-type AAAA", addr, "test.split-type.", dns.TypeAAAA, dns.RcodeSuccess,
[]dns.RR{test.AAAA("test.split-type. 303 IN AAAA 1:2:3::4")})
viewTest(t, "split-name one.test.test.test.split-name", addr, "one.test.test.test.split-name.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("one.test.test.test.split-name. 303 IN A 1.1.1.1")})
viewTest(t, "split-name one.test.split-name", addr, "one.test.split-name.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("one.test.split-name. 303 IN A 1.1.1.1")})
viewTest(t, "split-name two.test.test.test.split-name", addr, "two.test.test.test.split-name.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("two.test.test.test.split-name. 303 IN A 2.2.2.2")})
viewTest(t, "split-name two.test.split-name", addr, "two.test.split-name.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("two.test.split-name. 303 IN A 2.2.2.2")})
viewTest(t, "split-name default.test.split-name", addr, "default.test.split-name.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("default.test.split-name. 303 IN A 3.3.3.3")})
viewTest(t, "metadata test.metadata", addr, "test.metadata.", dns.TypeA, dns.RcodeSuccess,
[]dns.RR{test.A("test.metadata. 303 IN A 2.2.2.2")})
}
func viewTest(t *testing.T, testName, addr, qname string, qtype uint16, expectRcode int, expectAnswers []dns.RR) {
t.Run(testName, func(t *testing.T) {
m := new(dns.Msg)
m.SetQuestion(qname, qtype)
resp, err := dns.Exchange(m, addr)
if err != nil {
t.Fatalf("Expected to receive reply, but didn't: %s", err)
}
tc := test.Case{
Qname: qname, Qtype: qtype,
Rcode: expectRcode,
Answer: expectAnswers,
}
err = test.SortAndCheck(resp, tc)
if err != nil {
t.Error(err)
}
})
}