plugin/kubernetes: PTR/A reverse query corner cases (#1551)
* better handle non PTR rev zone qrys * vice versa * tests * comment typo * much cleaner
This commit is contained in:
parent
3c31011ced
commit
395b614349
4 changed files with 56 additions and 2 deletions
|
@ -274,6 +274,10 @@ func (k *Kubernetes) Records(state request.Request, exact bool) ([]msg.Service,
|
||||||
return nil, e
|
return nil, e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if dnsutil.IsReverse(state.Name()) {
|
||||||
|
return nil, errNoItems
|
||||||
|
}
|
||||||
|
|
||||||
if !wildcard(r.namespace) && !k.namespaceExposed(r.namespace) {
|
if !wildcard(r.namespace) && !k.namespaceExposed(r.namespace) {
|
||||||
return nil, errNsNotExposed
|
return nil, errNsNotExposed
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,8 @@ func (k *Kubernetes) Reverse(state request.Request, exact bool, opt plugin.Optio
|
||||||
|
|
||||||
ip := dnsutil.ExtractAddressFromReverse(state.Name())
|
ip := dnsutil.ExtractAddressFromReverse(state.Name())
|
||||||
if ip == "" {
|
if ip == "" {
|
||||||
return nil, nil
|
_, e := k.Records(state, exact)
|
||||||
|
return nil, e
|
||||||
}
|
}
|
||||||
|
|
||||||
records := k.serviceRecordForIP(ip, state.Name())
|
records := k.serviceRecordForIP(ip, state.Name())
|
||||||
|
|
|
@ -18,12 +18,35 @@ func (APIConnReverseTest) HasSynced() bool { return true }
|
||||||
func (APIConnReverseTest) Run() { return }
|
func (APIConnReverseTest) Run() { return }
|
||||||
func (APIConnReverseTest) Stop() error { return nil }
|
func (APIConnReverseTest) Stop() error { return nil }
|
||||||
func (APIConnReverseTest) PodIndex(string) []*api.Pod { return nil }
|
func (APIConnReverseTest) PodIndex(string) []*api.Pod { return nil }
|
||||||
func (APIConnReverseTest) SvcIndex(string) []*api.Service { return nil }
|
|
||||||
func (APIConnReverseTest) EpIndex(string) []*api.Endpoints { return nil }
|
func (APIConnReverseTest) EpIndex(string) []*api.Endpoints { return nil }
|
||||||
func (APIConnReverseTest) EndpointsList() []*api.Endpoints { return nil }
|
func (APIConnReverseTest) EndpointsList() []*api.Endpoints { return nil }
|
||||||
func (APIConnReverseTest) ServiceList() []*api.Service { return nil }
|
func (APIConnReverseTest) ServiceList() []*api.Service { return nil }
|
||||||
func (APIConnReverseTest) Modified() int64 { return 0 }
|
func (APIConnReverseTest) Modified() int64 { return 0 }
|
||||||
|
|
||||||
|
func (APIConnReverseTest) SvcIndex(svc string) []*api.Service {
|
||||||
|
if svc != "svc1.testns" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
svcs := []*api.Service{
|
||||||
|
{
|
||||||
|
ObjectMeta: meta.ObjectMeta{
|
||||||
|
Name: "svc1",
|
||||||
|
Namespace: "testns",
|
||||||
|
},
|
||||||
|
Spec: api.ServiceSpec{
|
||||||
|
ClusterIP: "192.168.1.100",
|
||||||
|
Ports: []api.ServicePort{{
|
||||||
|
Name: "http",
|
||||||
|
Protocol: "tcp",
|
||||||
|
Port: 80,
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return svcs
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (APIConnReverseTest) SvcIndexReverse(ip string) []*api.Service {
|
func (APIConnReverseTest) SvcIndexReverse(ip string) []*api.Service {
|
||||||
if ip != "192.168.1.100" {
|
if ip != "192.168.1.100" {
|
||||||
return nil
|
return nil
|
||||||
|
@ -162,11 +185,32 @@ func TestReverse(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Qname: "example.org.cluster.local.", Qtype: dns.TypePTR,
|
Qname: "example.org.cluster.local.", Qtype: dns.TypePTR,
|
||||||
|
Rcode: dns.RcodeNameError,
|
||||||
|
Ns: []dns.RR{
|
||||||
|
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Qname: "svc1.testns.svc.cluster.local.", Qtype: dns.TypePTR,
|
||||||
Rcode: dns.RcodeSuccess,
|
Rcode: dns.RcodeSuccess,
|
||||||
Ns: []dns.RR{
|
Ns: []dns.RR{
|
||||||
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
|
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Qname: "svc1.testns.svc.0.10.in-addr.arpa.", Qtype: dns.TypeA,
|
||||||
|
Rcode: dns.RcodeNameError,
|
||||||
|
Ns: []dns.RR{
|
||||||
|
test.SOA("0.10.in-addr.arpa. 300 IN SOA ns.dns.0.10.in-addr.arpa. hostmaster.0.10.in-addr.arpa. 1502989566 7200 1800 86400 60"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Qname: "100.0.0.10.cluster.local.", Qtype: dns.TypePTR,
|
||||||
|
Rcode: dns.RcodeNameError,
|
||||||
|
Ns: []dns.RR{
|
||||||
|
test.SOA("cluster.local. 300 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1502989566 7200 1800 86400 60"),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
|
|
|
@ -29,6 +29,11 @@ func ExtractAddressFromReverse(reverseName string) string {
|
||||||
return f(strings.Split(search, "."))
|
return f(strings.Split(search, "."))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsReverse returns true if name is in a reverse zone
|
||||||
|
func IsReverse(name string) bool {
|
||||||
|
return strings.HasSuffix(name, v4arpaSuffix) || strings.HasSuffix(name, v6arpaSuffix)
|
||||||
|
}
|
||||||
|
|
||||||
func reverse(slice []string) string {
|
func reverse(slice []string) string {
|
||||||
for i := 0; i < len(slice)/2; i++ {
|
for i := 0; i < len(slice)/2; i++ {
|
||||||
j := len(slice) - i - 1
|
j := len(slice) - i - 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue