Commit 432bbb5d authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #35246 from bowei/kubedns-logging

Automatic merge from submit-queue Refactor some functions in kube-dns to reduce surface area - Moves federation query path out to its own method - Creates dns/util and moves some trivial methods to that package This is just moving of code.
parents 373be74d 28cd4c58
...@@ -35,6 +35,7 @@ import ( ...@@ -35,6 +35,7 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
fake "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" fake "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
"k8s.io/kubernetes/pkg/dns/util"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
...@@ -54,7 +55,7 @@ func newKubeDNS() *KubeDNS { ...@@ -54,7 +55,7 @@ func newKubeDNS() *KubeDNS {
reverseRecordMap: make(map[string]*skymsg.Service), reverseRecordMap: make(map[string]*skymsg.Service),
clusterIPServiceMap: make(map[string]*kapi.Service), clusterIPServiceMap: make(map[string]*kapi.Service),
cacheLock: sync.RWMutex{}, cacheLock: sync.RWMutex{},
domainPath: reverseArray(strings.Split(strings.TrimRight(testDomain, "."), ".")), domainPath: util.ReverseArray(strings.Split(strings.TrimRight(testDomain, "."), ".")),
nodesStore: cache.NewStore(cache.MetaNamespaceKeyFunc), nodesStore: cache.NewStore(cache.MetaNamespaceKeyFunc),
} }
return kd return kd
...@@ -190,7 +191,9 @@ func TestSkySimpleSRVLookup(t *testing.T) { ...@@ -190,7 +191,9 @@ func TestSkySimpleSRVLookup(t *testing.T) {
targets := []string{} targets := []string{}
for _, eip := range endpointIPs { for _, eip := range endpointIPs {
// A portal service is always created with a port of '0' // A portal service is always created with a port of '0'
targets = append(targets, fmt.Sprintf("%v.%v", fmt.Sprintf("%x", hashServiceRecord(newServiceRecord(eip, 0))), name)) targets = append(targets,
fmt.Sprintf("%x.%v",
util.HashServiceRecord(util.NewServiceRecord(eip, 0)), name))
} }
assertSRVRecordsMatchTarget(t, rec, targets...) assertSRVRecordsMatchTarget(t, rec, targets...)
} }
...@@ -255,7 +258,8 @@ func TestSkyNamedPortSRVLookup(t *testing.T) { ...@@ -255,7 +258,8 @@ func TestSkyNamedPortSRVLookup(t *testing.T) {
svcDomain := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".") svcDomain := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".")
assertARecordsMatchIPs(t, extra, eip) assertARecordsMatchIPs(t, extra, eip)
assertSRVRecordsMatchTarget(t, rec, fmt.Sprintf("%v.%v", fmt.Sprintf("%x", hashServiceRecord(newServiceRecord(eip, 0))), svcDomain)) assertSRVRecordsMatchTarget(
t, rec, fmt.Sprintf("%x.%v", util.HashServiceRecord(util.NewServiceRecord(eip, 0)), svcDomain))
assertSRVRecordsMatchPort(t, rec, 8081) assertSRVRecordsMatchPort(t, rec, 8081)
} }
...@@ -667,7 +671,7 @@ func assertDNSForHeadlessService(t *testing.T, kd *KubeDNS, e *kapi.Endpoints) { ...@@ -667,7 +671,7 @@ func assertDNSForHeadlessService(t *testing.T, kd *KubeDNS, e *kapi.Endpoints) {
} }
func assertDNSForExternalService(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertDNSForExternalService(t *testing.T, kd *KubeDNS, s *kapi.Service) {
records, err := kd.Records(getServiceFQDN(kd, s), false) records, err := kd.Records(getServiceFQDN(kd.domain, s), false)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 1, len(records)) assert.Equal(t, 1, len(records))
assert.Equal(t, testExternalName, records[0].Host) assert.Equal(t, testExternalName, records[0].Host)
...@@ -700,13 +704,13 @@ func getIPForCName(t *testing.T, kd *KubeDNS, cname string) string { ...@@ -700,13 +704,13 @@ func getIPForCName(t *testing.T, kd *KubeDNS, cname string) string {
} }
func assertNoDNSForHeadlessService(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertNoDNSForHeadlessService(t *testing.T, kd *KubeDNS, s *kapi.Service) {
records, err := kd.Records(getServiceFQDN(kd, s), false) records, err := kd.Records(getServiceFQDN(kd.domain, s), false)
require.Error(t, err) require.Error(t, err)
assert.Equal(t, 0, len(records)) assert.Equal(t, 0, len(records))
} }
func assertNoDNSForExternalService(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertNoDNSForExternalService(t *testing.T, kd *KubeDNS, s *kapi.Service) {
records, err := kd.Records(getServiceFQDN(kd, s), false) records, err := kd.Records(getServiceFQDN(kd.domain, s), false)
require.Error(t, err) require.Error(t, err)
assert.Equal(t, 0, len(records)) assert.Equal(t, 0, len(records))
} }
...@@ -715,7 +719,7 @@ func assertSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portName ...@@ -715,7 +719,7 @@ func assertSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portName
records, err := kd.Records(getSRVFQDN(kd, s, portName), false) records, err := kd.Records(getSRVFQDN(kd, s, portName), false)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 1, len(records)) assert.Equal(t, 1, len(records))
assert.Equal(t, getServiceFQDN(kd, s), records[0].Host) assert.Equal(t, getServiceFQDN(kd.domain, s), records[0].Host)
} }
func assertNoSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portName string) { func assertNoSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portName string) {
...@@ -725,7 +729,7 @@ func assertNoSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portNam ...@@ -725,7 +729,7 @@ func assertNoSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portNam
} }
func assertNoDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertNoDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) {
serviceFQDN := getServiceFQDN(kd, s) serviceFQDN := getServiceFQDN(kd.domain, s)
queries := getEquivalentQueries(serviceFQDN, s.Namespace) queries := getEquivalentQueries(serviceFQDN, s.Namespace)
for _, query := range queries { for _, query := range queries {
records, err := kd.Records(query, false) records, err := kd.Records(query, false)
...@@ -735,7 +739,7 @@ func assertNoDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) { ...@@ -735,7 +739,7 @@ func assertNoDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) {
} }
func assertDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) {
serviceFQDN := getServiceFQDN(kd, s) serviceFQDN := getServiceFQDN(kd.domain, s)
queries := getEquivalentQueries(serviceFQDN, s.Namespace) queries := getEquivalentQueries(serviceFQDN, s.Namespace)
for _, query := range queries { for _, query := range queries {
records, err := kd.Records(query, false) records, err := kd.Records(query, false)
...@@ -746,16 +750,16 @@ func assertDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) { ...@@ -746,16 +750,16 @@ func assertDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) {
} }
func assertReverseRecord(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertReverseRecord(t *testing.T, kd *KubeDNS, s *kapi.Service) {
segments := reverseArray(strings.Split(s.Spec.ClusterIP, ".")) segments := util.ReverseArray(strings.Split(s.Spec.ClusterIP, "."))
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), arpaSuffix) reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
reverseRecord, err := kd.ReverseRecord(reverseLookup) reverseRecord, err := kd.ReverseRecord(reverseLookup)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, kd.getServiceFQDN(s), reverseRecord.Host) assert.Equal(t, getServiceFQDN(kd.domain, s), reverseRecord.Host)
} }
func assertNoReverseRecord(t *testing.T, kd *KubeDNS, s *kapi.Service) { func assertNoReverseRecord(t *testing.T, kd *KubeDNS, s *kapi.Service) {
segments := reverseArray(strings.Split(s.Spec.ClusterIP, ".")) segments := util.ReverseArray(strings.Split(s.Spec.ClusterIP, "."))
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), arpaSuffix) reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
reverseRecord, err := kd.ReverseRecord(reverseLookup) reverseRecord, err := kd.ReverseRecord(reverseLookup)
require.Error(t, err) require.Error(t, err)
require.Nil(t, reverseRecord) require.Nil(t, reverseRecord)
...@@ -775,10 +779,6 @@ func getFederationServiceFQDN(kd *KubeDNS, s *kapi.Service, federationName strin ...@@ -775,10 +779,6 @@ func getFederationServiceFQDN(kd *KubeDNS, s *kapi.Service, federationName strin
return fmt.Sprintf("%s.%s.%s.svc.%s", s.Name, s.Namespace, federationName, kd.domain) return fmt.Sprintf("%s.%s.%s.svc.%s", s.Name, s.Namespace, federationName, kd.domain)
} }
func getServiceFQDN(kd *KubeDNS, s *kapi.Service) string {
return fmt.Sprintf("%s.%s.svc.%s", s.Name, s.Namespace, kd.domain)
}
func getEndpointsFQDN(kd *KubeDNS, e *kapi.Endpoints) string { func getEndpointsFQDN(kd *KubeDNS, e *kapi.Endpoints) string {
return fmt.Sprintf("%s.%s.svc.%s", e.Name, e.Namespace, kd.domain) return fmt.Sprintf("%s.%s.svc.%s", e.Name, e.Namespace, kd.domain)
} }
......
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package util
import (
"fmt"
"hash/fnv"
"strings"
"github.com/golang/glog"
"github.com/skynetservices/skydns/msg"
)
const (
// ArpaSuffix is the standard suffix for PTR IP reverse lookups.
ArpaSuffix = ".in-addr.arpa."
// defaultPriority used for service records
defaultPriority = 10
// defaultWeight used for service records
defaultWeight = 10
// defaultTTL used for service records
defaultTTL = 30
)
// extractIP turns a standard PTR reverse record lookup name
// into an IP address
func ExtractIP(reverseName string) (string, bool) {
if !strings.HasSuffix(reverseName, ArpaSuffix) {
return "", false
}
search := strings.TrimSuffix(reverseName, ArpaSuffix)
// reverse the segments and then combine them
segments := ReverseArray(strings.Split(search, "."))
return strings.Join(segments, "."), true
}
// ReverseArray reverses an array.
func ReverseArray(arr []string) []string {
for i := 0; i < len(arr)/2; i++ {
j := len(arr) - i - 1
arr[i], arr[j] = arr[j], arr[i]
}
return arr
}
// Returns record in a format that SkyDNS understands.
// Also return the hash of the record.
func GetSkyMsg(ip string, port int) (*msg.Service, string) {
msg := NewServiceRecord(ip, port)
hash := HashServiceRecord(msg)
glog.V(2).Infof("DNS Record:%s, hash:%s", fmt.Sprintf("%v", msg), hash)
return msg, fmt.Sprintf("%x", hash)
}
// NewServiceRecord creates a new service DNS message.
func NewServiceRecord(ip string, port int) *msg.Service {
return &msg.Service{
Host: ip,
Port: port,
Priority: defaultPriority,
Weight: defaultWeight,
Ttl: defaultTTL,
}
}
// HashServiceRecord hashes the string representation of a DNS
// message.
func HashServiceRecord(msg *msg.Service) string {
s := fmt.Sprintf("%v", msg)
h := fnv.New32a()
h.Write([]byte(s))
return fmt.Sprintf("%x", h.Sum32())
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment