pkg/dns
This commit is contained in:
parent
b50367cbdc
commit
f0ad860d66
@ -17,8 +17,9 @@ limitations under the License.
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidate(t *testing.T) {
|
func TestValidate(t *testing.T) {
|
||||||
|
@ -18,9 +18,9 @@ package config
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/client-go/pkg/util/wait"
|
"k8s.io/client-go/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/client/cache"
|
"k8s.io/kubernetes/pkg/client/cache"
|
||||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
|
||||||
fed "k8s.io/kubernetes/pkg/dns/federation"
|
fed "k8s.io/kubernetes/pkg/dns/federation"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
@ -55,19 +55,19 @@ func NewSync(client clientset.Interface, ns string, name string) Sync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
listWatch := &cache.ListWatch{
|
listWatch := &cache.ListWatch{
|
||||||
ListFunc: func(options api.ListOptions) (runtime.Object, error) {
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector()
|
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector().String()
|
||||||
return client.Core().ConfigMaps(ns).List(options)
|
return client.Core().ConfigMaps(ns).List(options)
|
||||||
},
|
},
|
||||||
WatchFunc: func(options api.ListOptions) (watch.Interface, error) {
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector()
|
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector().String()
|
||||||
return client.Core().ConfigMaps(ns).Watch(options)
|
return client.Core().ConfigMaps(ns).Watch(options)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
store, controller := cache.NewInformer(
|
store, controller := cache.NewInformer(
|
||||||
listWatch,
|
listWatch,
|
||||||
&api.ConfigMap{},
|
&v1.ConfigMap{},
|
||||||
time.Duration(0),
|
time.Duration(0),
|
||||||
cache.ResourceEventHandlerFuncs{
|
cache.ResourceEventHandlerFuncs{
|
||||||
AddFunc: sync.onAdd,
|
AddFunc: sync.onAdd,
|
||||||
@ -115,8 +115,8 @@ func (sync *kubeSync) Periodic() <-chan *Config {
|
|||||||
return sync.channel
|
return sync.channel
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sync *kubeSync) toConfigMap(obj interface{}) *api.ConfigMap {
|
func (sync *kubeSync) toConfigMap(obj interface{}) *v1.ConfigMap {
|
||||||
cm, ok := obj.(*api.ConfigMap)
|
cm, ok := obj.(*v1.ConfigMap)
|
||||||
if !ok {
|
if !ok {
|
||||||
glog.Fatalf("Expected ConfigMap, got %T", obj)
|
glog.Fatalf("Expected ConfigMap, got %T", obj)
|
||||||
}
|
}
|
||||||
@ -154,7 +154,7 @@ func (sync *kubeSync) onUpdate(_, obj interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sync *kubeSync) processUpdate(cm *api.ConfigMap) (config *Config, changed bool, err error) {
|
func (sync *kubeSync) processUpdate(cm *v1.ConfigMap) (config *Config, changed bool, err error) {
|
||||||
glog.V(4).Infof("processUpdate ConfigMap %+v", *cm)
|
glog.V(4).Infof("processUpdate ConfigMap %+v", *cm)
|
||||||
|
|
||||||
if cm.ObjectMeta.ResourceVersion != sync.latestVersion {
|
if cm.ObjectMeta.ResourceVersion != sync.latestVersion {
|
||||||
@ -184,7 +184,7 @@ func (sync *kubeSync) processUpdate(cm *api.ConfigMap) (config *Config, changed
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sync *kubeSync) updateFederations(cm *api.ConfigMap, config *Config) (err error) {
|
func (sync *kubeSync) updateFederations(cm *v1.ConfigMap, config *Config) (err error) {
|
||||||
if flagValue, ok := cm.Data["federations"]; ok {
|
if flagValue, ok := cm.Data["federations"]; ok {
|
||||||
config.Federations = make(map[string]string)
|
config.Federations = make(map[string]string)
|
||||||
if err = fed.ParseFederationsFlag(flagValue, config.Federations); err != nil {
|
if err = fed.ParseFederationsFlag(flagValue, config.Federations); err != nil {
|
||||||
|
@ -27,11 +27,11 @@ import (
|
|||||||
etcd "github.com/coreos/etcd/client"
|
etcd "github.com/coreos/etcd/client"
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
skymsg "github.com/skynetservices/skydns/msg"
|
skymsg "github.com/skynetservices/skydns/msg"
|
||||||
kapi "k8s.io/kubernetes/pkg/api"
|
|
||||||
"k8s.io/kubernetes/pkg/api/endpoints"
|
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/api/v1/endpoints"
|
||||||
kcache "k8s.io/kubernetes/pkg/client/cache"
|
kcache "k8s.io/kubernetes/pkg/client/cache"
|
||||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
|
||||||
"k8s.io/kubernetes/pkg/dns/config"
|
"k8s.io/kubernetes/pkg/dns/config"
|
||||||
"k8s.io/kubernetes/pkg/dns/treecache"
|
"k8s.io/kubernetes/pkg/dns/treecache"
|
||||||
"k8s.io/kubernetes/pkg/dns/util"
|
"k8s.io/kubernetes/pkg/dns/util"
|
||||||
@ -94,7 +94,7 @@ type KubeDNS struct {
|
|||||||
// IP. Access to this is coordinated using cacheLock. We use the
|
// IP. Access to this is coordinated using cacheLock. We use the
|
||||||
// same lock for cache and this map to ensure that they don't get
|
// same lock for cache and this map to ensure that they don't get
|
||||||
// out of sync.
|
// out of sync.
|
||||||
clusterIPServiceMap map[string]*kapi.Service
|
clusterIPServiceMap map[string]*v1.Service
|
||||||
// cacheLock protecting the cache. caller is responsible for using
|
// cacheLock protecting the cache. caller is responsible for using
|
||||||
// the cacheLock before invoking methods on cache the cache is not
|
// the cacheLock before invoking methods on cache the cache is not
|
||||||
// thread-safe, and the caller can guarantee thread safety by using
|
// thread-safe, and the caller can guarantee thread safety by using
|
||||||
@ -127,7 +127,7 @@ func NewKubeDNS(client clientset.Interface, clusterDomain string, configSync con
|
|||||||
cacheLock: sync.RWMutex{},
|
cacheLock: sync.RWMutex{},
|
||||||
nodesStore: kcache.NewStore(kcache.MetaNamespaceKeyFunc),
|
nodesStore: kcache.NewStore(kcache.MetaNamespaceKeyFunc),
|
||||||
reverseRecordMap: make(map[string]*skymsg.Service),
|
reverseRecordMap: make(map[string]*skymsg.Service),
|
||||||
clusterIPServiceMap: make(map[string]*kapi.Service),
|
clusterIPServiceMap: make(map[string]*v1.Service),
|
||||||
domainPath: util.ReverseArray(strings.Split(strings.TrimRight(clusterDomain, "."), ".")),
|
domainPath: util.ReverseArray(strings.Split(strings.TrimRight(clusterDomain, "."), ".")),
|
||||||
|
|
||||||
configLock: sync.RWMutex{},
|
configLock: sync.RWMutex{},
|
||||||
@ -165,11 +165,11 @@ func (kd *KubeDNS) waitForKubernetesService() {
|
|||||||
const kubernetesSvcName = "kubernetes"
|
const kubernetesSvcName = "kubernetes"
|
||||||
const servicePollInterval = 1 * time.Second
|
const servicePollInterval = 1 * time.Second
|
||||||
|
|
||||||
name := fmt.Sprintf("%v/%v", kapi.NamespaceDefault, kubernetesSvcName)
|
name := fmt.Sprintf("%v/%v", v1.NamespaceDefault, kubernetesSvcName)
|
||||||
glog.V(2).Infof("Waiting for service: %v", name)
|
glog.V(2).Infof("Waiting for service: %v", name)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
svc, err := kd.kubeClient.Core().Services(kapi.NamespaceDefault).Get(kubernetesSvcName)
|
svc, err := kd.kubeClient.Core().Services(v1.NamespaceDefault).Get(kubernetesSvcName)
|
||||||
if err != nil || svc == nil {
|
if err != nil || svc == nil {
|
||||||
glog.V(3).Infof(
|
glog.V(3).Infof(
|
||||||
"Ignoring error while waiting for service %v: %v. Sleeping %v before retrying.",
|
"Ignoring error while waiting for service %v: %v. Sleeping %v before retrying.",
|
||||||
@ -218,14 +218,14 @@ func (kd *KubeDNS) setServicesStore() {
|
|||||||
// Returns a cache.ListWatch that gets all changes to services.
|
// Returns a cache.ListWatch that gets all changes to services.
|
||||||
kd.servicesStore, kd.serviceController = kcache.NewInformer(
|
kd.servicesStore, kd.serviceController = kcache.NewInformer(
|
||||||
&kcache.ListWatch{
|
&kcache.ListWatch{
|
||||||
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
return kd.kubeClient.Core().Services(kapi.NamespaceAll).List(options)
|
return kd.kubeClient.Core().Services(v1.NamespaceAll).List(options)
|
||||||
},
|
},
|
||||||
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
return kd.kubeClient.Core().Services(kapi.NamespaceAll).Watch(options)
|
return kd.kubeClient.Core().Services(v1.NamespaceAll).Watch(options)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
&kapi.Service{},
|
&v1.Service{},
|
||||||
resyncPeriod,
|
resyncPeriod,
|
||||||
kcache.ResourceEventHandlerFuncs{
|
kcache.ResourceEventHandlerFuncs{
|
||||||
AddFunc: kd.newService,
|
AddFunc: kd.newService,
|
||||||
@ -239,14 +239,14 @@ func (kd *KubeDNS) setEndpointsStore() {
|
|||||||
// Returns a cache.ListWatch that gets all changes to endpoints.
|
// Returns a cache.ListWatch that gets all changes to endpoints.
|
||||||
kd.endpointsStore, kd.endpointsController = kcache.NewInformer(
|
kd.endpointsStore, kd.endpointsController = kcache.NewInformer(
|
||||||
&kcache.ListWatch{
|
&kcache.ListWatch{
|
||||||
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
return kd.kubeClient.Core().Endpoints(kapi.NamespaceAll).List(options)
|
return kd.kubeClient.Core().Endpoints(v1.NamespaceAll).List(options)
|
||||||
},
|
},
|
||||||
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
return kd.kubeClient.Core().Endpoints(kapi.NamespaceAll).Watch(options)
|
return kd.kubeClient.Core().Endpoints(v1.NamespaceAll).Watch(options)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
&kapi.Endpoints{},
|
&v1.Endpoints{},
|
||||||
resyncPeriod,
|
resyncPeriod,
|
||||||
kcache.ResourceEventHandlerFuncs{
|
kcache.ResourceEventHandlerFuncs{
|
||||||
AddFunc: kd.handleEndpointAdd,
|
AddFunc: kd.handleEndpointAdd,
|
||||||
@ -260,8 +260,8 @@ func (kd *KubeDNS) setEndpointsStore() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertIsService(obj interface{}) (*kapi.Service, bool) {
|
func assertIsService(obj interface{}) (*v1.Service, bool) {
|
||||||
if service, ok := obj.(*kapi.Service); ok {
|
if service, ok := obj.(*v1.Service); ok {
|
||||||
return service, ok
|
return service, ok
|
||||||
} else {
|
} else {
|
||||||
glog.Errorf("Type assertion failed! Expected 'Service', got %T", service)
|
glog.Errorf("Type assertion failed! Expected 'Service', got %T", service)
|
||||||
@ -275,12 +275,12 @@ func (kd *KubeDNS) newService(obj interface{}) {
|
|||||||
glog.V(4).Infof("Service details: %v", service)
|
glog.V(4).Infof("Service details: %v", service)
|
||||||
|
|
||||||
// ExternalName services are a special kind that return CNAME records
|
// ExternalName services are a special kind that return CNAME records
|
||||||
if service.Spec.Type == kapi.ServiceTypeExternalName {
|
if service.Spec.Type == v1.ServiceTypeExternalName {
|
||||||
kd.newExternalNameService(service)
|
kd.newExternalNameService(service)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// if ClusterIP is not set, a DNS entry should not be created
|
// if ClusterIP is not set, a DNS entry should not be created
|
||||||
if !kapi.IsServiceIPSet(service) {
|
if !v1.IsServiceIPSet(service) {
|
||||||
kd.newHeadlessService(service)
|
kd.newHeadlessService(service)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -303,7 +303,7 @@ func (kd *KubeDNS) removeService(obj interface{}) {
|
|||||||
s.Name, subCachePath, success)
|
s.Name, subCachePath, success)
|
||||||
|
|
||||||
// ExternalName services have no IP
|
// ExternalName services have no IP
|
||||||
if kapi.IsServiceIPSet(s) {
|
if v1.IsServiceIPSet(s) {
|
||||||
delete(kd.reverseRecordMap, s.Spec.ClusterIP)
|
delete(kd.reverseRecordMap, s.Spec.ClusterIP)
|
||||||
delete(kd.clusterIPServiceMap, s.Spec.ClusterIP)
|
delete(kd.clusterIPServiceMap, s.Spec.ClusterIP)
|
||||||
}
|
}
|
||||||
@ -315,8 +315,8 @@ func (kd *KubeDNS) updateService(oldObj, newObj interface{}) {
|
|||||||
if old, ok := assertIsService(oldObj); ok {
|
if old, ok := assertIsService(oldObj); ok {
|
||||||
// Remove old cache path only if changing type to/from ExternalName.
|
// Remove old cache path only if changing type to/from ExternalName.
|
||||||
// In all other cases, we'll update records in place.
|
// In all other cases, we'll update records in place.
|
||||||
if (new.Spec.Type == kapi.ServiceTypeExternalName) !=
|
if (new.Spec.Type == v1.ServiceTypeExternalName) !=
|
||||||
(old.Spec.Type == kapi.ServiceTypeExternalName) {
|
(old.Spec.Type == v1.ServiceTypeExternalName) {
|
||||||
kd.removeService(oldObj)
|
kd.removeService(oldObj)
|
||||||
}
|
}
|
||||||
kd.newService(newObj)
|
kd.newService(newObj)
|
||||||
@ -325,24 +325,24 @@ func (kd *KubeDNS) updateService(oldObj, newObj interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (kd *KubeDNS) handleEndpointAdd(obj interface{}) {
|
func (kd *KubeDNS) handleEndpointAdd(obj interface{}) {
|
||||||
if e, ok := obj.(*kapi.Endpoints); ok {
|
if e, ok := obj.(*v1.Endpoints); ok {
|
||||||
kd.addDNSUsingEndpoints(e)
|
kd.addDNSUsingEndpoints(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kd *KubeDNS) addDNSUsingEndpoints(e *kapi.Endpoints) error {
|
func (kd *KubeDNS) addDNSUsingEndpoints(e *v1.Endpoints) error {
|
||||||
svc, err := kd.getServiceFromEndpoints(e)
|
svc, err := kd.getServiceFromEndpoints(e)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if svc == nil || kapi.IsServiceIPSet(svc) {
|
if svc == nil || v1.IsServiceIPSet(svc) {
|
||||||
// No headless service found corresponding to endpoints object.
|
// No headless service found corresponding to endpoints object.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return kd.generateRecordsForHeadlessService(e, svc)
|
return kd.generateRecordsForHeadlessService(e, svc)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kd *KubeDNS) getServiceFromEndpoints(e *kapi.Endpoints) (*kapi.Service, error) {
|
func (kd *KubeDNS) getServiceFromEndpoints(e *v1.Endpoints) (*v1.Service, error) {
|
||||||
key, err := kcache.MetaNamespaceKeyFunc(e)
|
key, err := kcache.MetaNamespaceKeyFunc(e)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -364,12 +364,12 @@ func (kd *KubeDNS) getServiceFromEndpoints(e *kapi.Endpoints) (*kapi.Service, er
|
|||||||
|
|
||||||
// fqdn constructs the fqdn for the given service. subpaths is a list of path
|
// fqdn constructs the fqdn for the given service. subpaths is a list of path
|
||||||
// elements rooted at the given service, ending at a service record.
|
// elements rooted at the given service, ending at a service record.
|
||||||
func (kd *KubeDNS) fqdn(service *kapi.Service, subpaths ...string) string {
|
func (kd *KubeDNS) fqdn(service *v1.Service, subpaths ...string) string {
|
||||||
domainLabels := append(append(kd.domainPath, serviceSubdomain, service.Namespace, service.Name), subpaths...)
|
domainLabels := append(append(kd.domainPath, serviceSubdomain, service.Namespace, service.Name), subpaths...)
|
||||||
return dns.Fqdn(strings.Join(util.ReverseArray(domainLabels), "."))
|
return dns.Fqdn(strings.Join(util.ReverseArray(domainLabels), "."))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kd *KubeDNS) newPortalService(service *kapi.Service) {
|
func (kd *KubeDNS) newPortalService(service *v1.Service) {
|
||||||
subCache := treecache.NewTreeCache()
|
subCache := treecache.NewTreeCache()
|
||||||
recordValue, recordLabel := util.GetSkyMsg(service.Spec.ClusterIP, 0)
|
recordValue, recordLabel := util.GetSkyMsg(service.Spec.ClusterIP, 0)
|
||||||
subCache.SetEntry(recordLabel, recordValue, kd.fqdn(service, recordLabel))
|
subCache.SetEntry(recordLabel, recordValue, kd.fqdn(service, recordLabel))
|
||||||
@ -397,7 +397,7 @@ func (kd *KubeDNS) newPortalService(service *kapi.Service) {
|
|||||||
kd.clusterIPServiceMap[service.Spec.ClusterIP] = service
|
kd.clusterIPServiceMap[service.Spec.ClusterIP] = service
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kd *KubeDNS) generateRecordsForHeadlessService(e *kapi.Endpoints, svc *kapi.Service) error {
|
func (kd *KubeDNS) generateRecordsForHeadlessService(e *v1.Endpoints, svc *v1.Service) error {
|
||||||
// TODO: remove this after v1.4 is released and the old annotations are EOL
|
// TODO: remove this after v1.4 is released and the old annotations are EOL
|
||||||
podHostnames, err := getPodHostnamesFromAnnotation(e.Annotations)
|
podHostnames, err := getPodHostnamesFromAnnotation(e.Annotations)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -433,7 +433,7 @@ func (kd *KubeDNS) generateRecordsForHeadlessService(e *kapi.Endpoints, svc *kap
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getHostname(address *kapi.EndpointAddress, podHostnames map[string]endpoints.HostRecord) (string, bool) {
|
func getHostname(address *v1.EndpointAddress, podHostnames map[string]endpoints.HostRecord) (string, bool) {
|
||||||
if len(address.Hostname) > 0 {
|
if len(address.Hostname) > 0 {
|
||||||
return address.Hostname, true
|
return address.Hostname, true
|
||||||
}
|
}
|
||||||
@ -457,7 +457,7 @@ func getPodHostnamesFromAnnotation(annotations map[string]string) (map[string]en
|
|||||||
return hostnames, nil
|
return hostnames, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kd *KubeDNS) generateSRVRecordValue(svc *kapi.Service, portNumber int, labels ...string) *skymsg.Service {
|
func (kd *KubeDNS) generateSRVRecordValue(svc *v1.Service, portNumber int, labels ...string) *skymsg.Service {
|
||||||
host := strings.Join([]string{svc.Name, svc.Namespace, serviceSubdomain, kd.domain}, ".")
|
host := strings.Join([]string{svc.Name, svc.Namespace, serviceSubdomain, kd.domain}, ".")
|
||||||
for _, cNameLabel := range labels {
|
for _, cNameLabel := range labels {
|
||||||
host = cNameLabel + "." + host
|
host = cNameLabel + "." + host
|
||||||
@ -467,7 +467,7 @@ func (kd *KubeDNS) generateSRVRecordValue(svc *kapi.Service, portNumber int, lab
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generates skydns records for a headless service.
|
// Generates skydns records for a headless service.
|
||||||
func (kd *KubeDNS) newHeadlessService(service *kapi.Service) error {
|
func (kd *KubeDNS) newHeadlessService(service *v1.Service) error {
|
||||||
// Create an A record for every pod in the service.
|
// Create an A record for every pod in the service.
|
||||||
// This record must be periodically updated.
|
// This record must be periodically updated.
|
||||||
// Format is as follows:
|
// Format is as follows:
|
||||||
@ -486,14 +486,14 @@ func (kd *KubeDNS) newHeadlessService(service *kapi.Service) error {
|
|||||||
service.Name, service.Namespace)
|
service.Name, service.Namespace)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if e, ok := e.(*kapi.Endpoints); ok {
|
if e, ok := e.(*v1.Endpoints); ok {
|
||||||
return kd.generateRecordsForHeadlessService(e, service)
|
return kd.generateRecordsForHeadlessService(e, service)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generates skydns records for an ExternalName service.
|
// Generates skydns records for an ExternalName service.
|
||||||
func (kd *KubeDNS) newExternalNameService(service *kapi.Service) {
|
func (kd *KubeDNS) newExternalNameService(service *v1.Service) {
|
||||||
// Create a CNAME record for the service's ExternalName.
|
// Create a CNAME record for the service's ExternalName.
|
||||||
// TODO: TTL?
|
// TODO: TTL?
|
||||||
recordValue, _ := util.GetSkyMsg(service.Spec.ExternalName, 0)
|
recordValue, _ := util.GetSkyMsg(service.Spec.ExternalName, 0)
|
||||||
@ -675,7 +675,7 @@ func (kd *KubeDNS) serviceWithClusterIPHasEndpoints(msg *skymsg.Service) (bool,
|
|||||||
if !exists {
|
if !exists {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
if e, ok := e.(*kapi.Endpoints); ok {
|
if e, ok := e.(*v1.Endpoints); ok {
|
||||||
return len(e.Subsets) > 0, nil
|
return len(e.Subsets) > 0, nil
|
||||||
}
|
}
|
||||||
return false, fmt.Errorf("unexpected: found non-endpoint object in endpoint store: %v", e)
|
return false, fmt.Errorf("unexpected: found non-endpoint object in endpoint store: %v", e)
|
||||||
@ -840,12 +840,12 @@ func (kd *KubeDNS) federationRecords(queryPath []string) ([]skymsg.Service, erro
|
|||||||
// Also note that zone here means the zone in cloud provider terminology, not
|
// Also note that zone here means the zone in cloud provider terminology, not
|
||||||
// the DNS zone.
|
// the DNS zone.
|
||||||
func (kd *KubeDNS) getClusterZoneAndRegion() (string, string, error) {
|
func (kd *KubeDNS) getClusterZoneAndRegion() (string, string, error) {
|
||||||
var node *kapi.Node
|
var node *v1.Node
|
||||||
|
|
||||||
objs := kd.nodesStore.List()
|
objs := kd.nodesStore.List()
|
||||||
if len(objs) > 0 {
|
if len(objs) > 0 {
|
||||||
var ok bool
|
var ok bool
|
||||||
if node, ok = objs[0].(*kapi.Node); !ok {
|
if node, ok = objs[0].(*v1.Node); !ok {
|
||||||
return "", "", fmt.Errorf("expected node object, got: %T", objs[0])
|
return "", "", fmt.Errorf("expected node object, got: %T", objs[0])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -853,7 +853,7 @@ func (kd *KubeDNS) getClusterZoneAndRegion() (string, string, error) {
|
|||||||
// wasteful in case of non-federated independent Kubernetes clusters. So carefully
|
// wasteful in case of non-federated independent Kubernetes clusters. So carefully
|
||||||
// proceeding here.
|
// proceeding here.
|
||||||
// TODO(madhusudancs): Move this to external/v1 API.
|
// TODO(madhusudancs): Move this to external/v1 API.
|
||||||
nodeList, err := kd.kubeClient.Core().Nodes().List(kapi.ListOptions{})
|
nodeList, err := kd.kubeClient.Core().Nodes().List(v1.ListOptions{})
|
||||||
if err != nil || len(nodeList.Items) == 0 {
|
if err != nil || len(nodeList.Items) == 0 {
|
||||||
return "", "", fmt.Errorf("failed to retrieve the cluster nodes: %v", err)
|
return "", "", fmt.Errorf("failed to retrieve the cluster nodes: %v", err)
|
||||||
}
|
}
|
||||||
@ -891,7 +891,7 @@ func (kd *KubeDNS) getClusterZoneAndRegion() (string, string, error) {
|
|||||||
return zone, region, nil
|
return zone, region, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getServiceFQDN(domain string, service *kapi.Service) string {
|
func getServiceFQDN(domain string, service *v1.Service) string {
|
||||||
return strings.Join(
|
return strings.Join(
|
||||||
[]string{service.Name, service.Namespace, serviceSubdomain, domain}, ".")
|
[]string{service.Name, service.Namespace, serviceSubdomain, domain}, ".")
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,11 @@ import (
|
|||||||
skyServer "github.com/skynetservices/skydns/server"
|
skyServer "github.com/skynetservices/skydns/server"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
kapi "k8s.io/kubernetes/pkg/api"
|
|
||||||
endpointsapi "k8s.io/kubernetes/pkg/api/endpoints"
|
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
|
endpointsapi "k8s.io/kubernetes/pkg/api/v1/endpoints"
|
||||||
"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/release_1_5/fake"
|
||||||
"k8s.io/kubernetes/pkg/dns/config"
|
"k8s.io/kubernetes/pkg/dns/config"
|
||||||
"k8s.io/kubernetes/pkg/dns/treecache"
|
"k8s.io/kubernetes/pkg/dns/treecache"
|
||||||
"k8s.io/kubernetes/pkg/dns/util"
|
"k8s.io/kubernetes/pkg/dns/util"
|
||||||
@ -61,7 +61,7 @@ func newKubeDNS() *KubeDNS {
|
|||||||
|
|
||||||
cache: treecache.NewTreeCache(),
|
cache: treecache.NewTreeCache(),
|
||||||
reverseRecordMap: make(map[string]*skymsg.Service),
|
reverseRecordMap: make(map[string]*skymsg.Service),
|
||||||
clusterIPServiceMap: make(map[string]*kapi.Service),
|
clusterIPServiceMap: make(map[string]*v1.Service),
|
||||||
cacheLock: sync.RWMutex{},
|
cacheLock: sync.RWMutex{},
|
||||||
|
|
||||||
config: config.NewDefaultConfig(),
|
config: config.NewDefaultConfig(),
|
||||||
@ -339,7 +339,7 @@ func TestHeadlessServiceEndpointsUpdate(t *testing.T) {
|
|||||||
assertDNSForHeadlessService(t, kd, endpoints)
|
assertDNSForHeadlessService(t, kd, endpoints)
|
||||||
|
|
||||||
// remove all endpoints
|
// remove all endpoints
|
||||||
endpoints.Subsets = []kapi.EndpointSubset{}
|
endpoints.Subsets = []v1.EndpointSubset{}
|
||||||
kd.handleEndpointAdd(endpoints)
|
kd.handleEndpointAdd(endpoints)
|
||||||
assertNoDNSForHeadlessService(t, kd, service)
|
assertNoDNSForHeadlessService(t, kd, service)
|
||||||
|
|
||||||
@ -419,7 +419,7 @@ func TestFederationHeadlessService(t *testing.T) {
|
|||||||
"testservice.default.svc.cluster.local.", t, kd)
|
"testservice.default.svc.cluster.local.", t, kd)
|
||||||
|
|
||||||
// Delete the endpoint.
|
// Delete the endpoint.
|
||||||
endpoints.Subsets = []kapi.EndpointSubset{}
|
endpoints.Subsets = []v1.EndpointSubset{}
|
||||||
kd.handleEndpointAdd(endpoints)
|
kd.handleEndpointAdd(endpoints)
|
||||||
kd.updateService(s, s)
|
kd.updateService(s, s)
|
||||||
|
|
||||||
@ -461,7 +461,7 @@ func TestFederationService(t *testing.T) {
|
|||||||
"testservice.default.svc.cluster.local.", t, kd)
|
"testservice.default.svc.cluster.local.", t, kd)
|
||||||
|
|
||||||
// Remove the endpoint.
|
// Remove the endpoint.
|
||||||
endpoints.Subsets = []kapi.EndpointSubset{}
|
endpoints.Subsets = []v1.EndpointSubset{}
|
||||||
kd.handleEndpointAdd(endpoints)
|
kd.handleEndpointAdd(endpoints)
|
||||||
kd.updateService(s, s)
|
kd.updateService(s, s)
|
||||||
|
|
||||||
@ -590,17 +590,17 @@ func TestConfigSyncInitialMap(t *testing.T) {
|
|||||||
checkConfigEqual(t, kd, &config.Config{Federations: map[string]string{"name3": "domain3"}})
|
checkConfigEqual(t, kd, &config.Config{Federations: map[string]string{"name3": "domain3"}})
|
||||||
}
|
}
|
||||||
|
|
||||||
func newNodes() *kapi.NodeList {
|
func newNodes() *v1.NodeList {
|
||||||
return &kapi.NodeList{
|
return &v1.NodeList{
|
||||||
Items: []kapi.Node{
|
Items: []v1.Node{
|
||||||
// Node without annotation.
|
// Node without annotation.
|
||||||
{
|
{
|
||||||
ObjectMeta: kapi.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: "testnode-0",
|
Name: "testnode-0",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ObjectMeta: kapi.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: "testnode-1",
|
Name: "testnode-1",
|
||||||
Labels: map[string]string{
|
Labels: map[string]string{
|
||||||
// Note: The zone name here is an arbitrary string and doesn't exactly follow the
|
// Note: The zone name here is an arbitrary string and doesn't exactly follow the
|
||||||
@ -615,15 +615,15 @@ func newNodes() *kapi.NodeList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newService(namespace, serviceName, clusterIP, portName string, portNumber int32) *kapi.Service {
|
func newService(namespace, serviceName, clusterIP, portName string, portNumber int32) *v1.Service {
|
||||||
service := kapi.Service{
|
service := v1.Service{
|
||||||
ObjectMeta: kapi.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: serviceName,
|
Name: serviceName,
|
||||||
Namespace: namespace,
|
Namespace: namespace,
|
||||||
},
|
},
|
||||||
Spec: kapi.ServiceSpec{
|
Spec: v1.ServiceSpec{
|
||||||
ClusterIP: clusterIP,
|
ClusterIP: clusterIP,
|
||||||
Ports: []kapi.ServicePort{
|
Ports: []v1.ServicePort{
|
||||||
{Port: portNumber, Name: portName, Protocol: "TCP"},
|
{Port: portNumber, Name: portName, Protocol: "TCP"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -631,17 +631,17 @@ func newService(namespace, serviceName, clusterIP, portName string, portNumber i
|
|||||||
return &service
|
return &service
|
||||||
}
|
}
|
||||||
|
|
||||||
func newExternalNameService() *kapi.Service {
|
func newExternalNameService() *v1.Service {
|
||||||
service := kapi.Service{
|
service := v1.Service{
|
||||||
ObjectMeta: kapi.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: testService,
|
Name: testService,
|
||||||
Namespace: testNamespace,
|
Namespace: testNamespace,
|
||||||
},
|
},
|
||||||
Spec: kapi.ServiceSpec{
|
Spec: v1.ServiceSpec{
|
||||||
ClusterIP: "None",
|
ClusterIP: "None",
|
||||||
Type: kapi.ServiceTypeExternalName,
|
Type: v1.ServiceTypeExternalName,
|
||||||
ExternalName: testExternalName,
|
ExternalName: testExternalName,
|
||||||
Ports: []kapi.ServicePort{
|
Ports: []v1.ServicePort{
|
||||||
{Port: 0},
|
{Port: 0},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -649,15 +649,15 @@ func newExternalNameService() *kapi.Service {
|
|||||||
return &service
|
return &service
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHeadlessService() *kapi.Service {
|
func newHeadlessService() *v1.Service {
|
||||||
service := kapi.Service{
|
service := v1.Service{
|
||||||
ObjectMeta: kapi.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: testService,
|
Name: testService,
|
||||||
Namespace: testNamespace,
|
Namespace: testNamespace,
|
||||||
},
|
},
|
||||||
Spec: kapi.ServiceSpec{
|
Spec: v1.ServiceSpec{
|
||||||
ClusterIP: "None",
|
ClusterIP: "None",
|
||||||
Ports: []kapi.ServicePort{
|
Ports: []v1.ServicePort{
|
||||||
{Port: 0},
|
{Port: 0},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -665,40 +665,40 @@ func newHeadlessService() *kapi.Service {
|
|||||||
return &service
|
return &service
|
||||||
}
|
}
|
||||||
|
|
||||||
func newEndpoints(service *kapi.Service, subsets ...kapi.EndpointSubset) *kapi.Endpoints {
|
func newEndpoints(service *v1.Service, subsets ...v1.EndpointSubset) *v1.Endpoints {
|
||||||
endpoints := kapi.Endpoints{
|
endpoints := v1.Endpoints{
|
||||||
ObjectMeta: service.ObjectMeta,
|
ObjectMeta: service.ObjectMeta,
|
||||||
Subsets: []kapi.EndpointSubset{},
|
Subsets: []v1.EndpointSubset{},
|
||||||
}
|
}
|
||||||
|
|
||||||
endpoints.Subsets = append(endpoints.Subsets, subsets...)
|
endpoints.Subsets = append(endpoints.Subsets, subsets...)
|
||||||
return &endpoints
|
return &endpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSubsetWithOnePort(portName string, port int32, ips ...string) kapi.EndpointSubset {
|
func newSubsetWithOnePort(portName string, port int32, ips ...string) v1.EndpointSubset {
|
||||||
subset := newSubset()
|
subset := newSubset()
|
||||||
subset.Ports = append(subset.Ports, kapi.EndpointPort{Port: port, Name: portName, Protocol: "TCP"})
|
subset.Ports = append(subset.Ports, v1.EndpointPort{Port: port, Name: portName, Protocol: "TCP"})
|
||||||
for _, ip := range ips {
|
for _, ip := range ips {
|
||||||
subset.Addresses = append(subset.Addresses, kapi.EndpointAddress{IP: ip})
|
subset.Addresses = append(subset.Addresses, v1.EndpointAddress{IP: ip})
|
||||||
}
|
}
|
||||||
return subset
|
return subset
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSubsetWithTwoPorts(portName1 string, portNumber1 int32, portName2 string, portNumber2 int32, ips ...string) kapi.EndpointSubset {
|
func newSubsetWithTwoPorts(portName1 string, portNumber1 int32, portName2 string, portNumber2 int32, ips ...string) v1.EndpointSubset {
|
||||||
subset := newSubsetWithOnePort(portName1, portNumber1, ips...)
|
subset := newSubsetWithOnePort(portName1, portNumber1, ips...)
|
||||||
subset.Ports = append(subset.Ports, kapi.EndpointPort{Port: portNumber2, Name: portName2, Protocol: "TCP"})
|
subset.Ports = append(subset.Ports, v1.EndpointPort{Port: portNumber2, Name: portName2, Protocol: "TCP"})
|
||||||
return subset
|
return subset
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSubset() kapi.EndpointSubset {
|
func newSubset() v1.EndpointSubset {
|
||||||
subset := kapi.EndpointSubset{
|
subset := v1.EndpointSubset{
|
||||||
Addresses: []kapi.EndpointAddress{},
|
Addresses: []v1.EndpointAddress{},
|
||||||
Ports: []kapi.EndpointPort{},
|
Ports: []v1.EndpointPort{},
|
||||||
}
|
}
|
||||||
return subset
|
return subset
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertSRVForHeadlessService(t *testing.T, kd *KubeDNS, s *kapi.Service, e *kapi.Endpoints) {
|
func assertSRVForHeadlessService(t *testing.T, kd *KubeDNS, s *v1.Service, e *v1.Endpoints) {
|
||||||
for _, subset := range e.Subsets {
|
for _, subset := range e.Subsets {
|
||||||
for _, port := range subset.Ports {
|
for _, port := range subset.Ports {
|
||||||
records, err := kd.Records(getSRVFQDN(kd, s, port.Name), false)
|
records, err := kd.Records(getSRVFQDN(kd, s, port.Name), false)
|
||||||
@ -709,7 +709,7 @@ func assertSRVForHeadlessService(t *testing.T, kd *KubeDNS, s *kapi.Service, e *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertDNSForHeadlessService(t *testing.T, kd *KubeDNS, e *kapi.Endpoints) {
|
func assertDNSForHeadlessService(t *testing.T, kd *KubeDNS, e *v1.Endpoints) {
|
||||||
records, err := kd.Records(getEndpointsFQDN(kd, e), false)
|
records, err := kd.Records(getEndpointsFQDN(kd, e), false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
endpoints := map[string]bool{}
|
endpoints := map[string]bool{}
|
||||||
@ -725,7 +725,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 *v1.Service) {
|
||||||
records, err := kd.Records(getServiceFQDN(kd.domain, 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))
|
||||||
@ -738,7 +738,7 @@ func assertRecordPortsMatchPort(t *testing.T, port int32, records []skymsg.Servi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertCNameRecordsMatchEndpointIPs(t *testing.T, kd *KubeDNS, e []kapi.EndpointAddress, records []skymsg.Service) {
|
func assertCNameRecordsMatchEndpointIPs(t *testing.T, kd *KubeDNS, e []v1.EndpointAddress, records []skymsg.Service) {
|
||||||
endpoints := map[string]bool{}
|
endpoints := map[string]bool{}
|
||||||
for _, endpointAddress := range e {
|
for _, endpointAddress := range e {
|
||||||
endpoints[endpointAddress.IP] = true
|
endpoints[endpointAddress.IP] = true
|
||||||
@ -758,32 +758,32 @@ func getIPForCName(t *testing.T, kd *KubeDNS, cname string) string {
|
|||||||
return records[0].Host
|
return records[0].Host
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertNoDNSForHeadlessService(t *testing.T, kd *KubeDNS, s *kapi.Service) {
|
func assertNoDNSForHeadlessService(t *testing.T, kd *KubeDNS, s *v1.Service) {
|
||||||
records, err := kd.Records(getServiceFQDN(kd.domain, 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 *v1.Service) {
|
||||||
records, err := kd.Records(getServiceFQDN(kd.domain, 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 assertSRVForNamedPort(t *testing.T, kd *KubeDNS, s *kapi.Service, portName string) {
|
func assertSRVForNamedPort(t *testing.T, kd *KubeDNS, s *v1.Service, portName string) {
|
||||||
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.domain, 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 *v1.Service, portName string) {
|
||||||
records, err := kd.Records(getSRVFQDN(kd, s, portName), false)
|
records, err := kd.Records(getSRVFQDN(kd, s, portName), false)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
assert.Equal(t, 0, len(records))
|
assert.Equal(t, 0, len(records))
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertNoDNSForClusterIP(t *testing.T, kd *KubeDNS, s *kapi.Service) {
|
func assertNoDNSForClusterIP(t *testing.T, kd *KubeDNS, s *v1.Service) {
|
||||||
serviceFQDN := getServiceFQDN(kd.domain, s)
|
serviceFQDN := getServiceFQDN(kd.domain, s)
|
||||||
queries := getEquivalentQueries(serviceFQDN, s.Namespace)
|
queries := getEquivalentQueries(serviceFQDN, s.Namespace)
|
||||||
for _, query := range queries {
|
for _, query := range queries {
|
||||||
@ -793,7 +793,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 *v1.Service) {
|
||||||
serviceFQDN := getServiceFQDN(kd.domain, s)
|
serviceFQDN := getServiceFQDN(kd.domain, s)
|
||||||
queries := getEquivalentQueries(serviceFQDN, s.Namespace)
|
queries := getEquivalentQueries(serviceFQDN, s.Namespace)
|
||||||
for _, query := range queries {
|
for _, query := range queries {
|
||||||
@ -804,7 +804,7 @@ 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 *v1.Service) {
|
||||||
segments := util.ReverseArray(strings.Split(s.Spec.ClusterIP, "."))
|
segments := util.ReverseArray(strings.Split(s.Spec.ClusterIP, "."))
|
||||||
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
|
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
|
||||||
reverseRecord, err := kd.ReverseRecord(reverseLookup)
|
reverseRecord, err := kd.ReverseRecord(reverseLookup)
|
||||||
@ -812,7 +812,7 @@ func assertReverseRecord(t *testing.T, kd *KubeDNS, s *kapi.Service) {
|
|||||||
assert.Equal(t, getServiceFQDN(kd.domain, 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 *v1.Service) {
|
||||||
segments := util.ReverseArray(strings.Split(s.Spec.ClusterIP, "."))
|
segments := util.ReverseArray(strings.Split(s.Spec.ClusterIP, "."))
|
||||||
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
|
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
|
||||||
reverseRecord, err := kd.ReverseRecord(reverseLookup)
|
reverseRecord, err := kd.ReverseRecord(reverseLookup)
|
||||||
@ -830,14 +830,14 @@ func getEquivalentQueries(serviceFQDN, namespace string) []string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getFederationServiceFQDN(kd *KubeDNS, s *kapi.Service, federationName string) string {
|
func getFederationServiceFQDN(kd *KubeDNS, s *v1.Service, federationName string) string {
|
||||||
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 getEndpointsFQDN(kd *KubeDNS, e *kapi.Endpoints) string {
|
func getEndpointsFQDN(kd *KubeDNS, e *v1.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)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSRVFQDN(kd *KubeDNS, s *kapi.Service, portName string) string {
|
func getSRVFQDN(kd *KubeDNS, s *v1.Service, portName string) string {
|
||||||
return fmt.Sprintf("_%s._tcp.%s.%s.svc.%s", portName, s.Name, s.Namespace, kd.domain)
|
return fmt.Sprintf("_%s._tcp.%s.%s.svc.%s", portName, s.Name, s.Namespace, kd.domain)
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
|
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
|
||||||
fed "k8s.io/kubernetes/pkg/dns/federation"
|
fed "k8s.io/kubernetes/pkg/dns/federation"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
@ -42,12 +42,12 @@ type dnsConfigMapTest struct {
|
|||||||
name string
|
name string
|
||||||
labels []string
|
labels []string
|
||||||
|
|
||||||
cm *api.ConfigMap
|
cm *v1.ConfigMap
|
||||||
isValid bool
|
isValid bool
|
||||||
|
|
||||||
dnsPod *api.Pod
|
dnsPod *v1.Pod
|
||||||
utilPod *api.Pod
|
utilPod *v1.Pod
|
||||||
utilService *api.Service
|
utilService *v1.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ = framework.KubeDescribe("DNS config map", func() {
|
var _ = framework.KubeDescribe("DNS config map", func() {
|
||||||
@ -69,7 +69,7 @@ var _ = framework.KubeDescribe("DNS config map", func() {
|
|||||||
func (t *dnsConfigMapTest) init() {
|
func (t *dnsConfigMapTest) init() {
|
||||||
By("Finding a DNS pod")
|
By("Finding a DNS pod")
|
||||||
label := labels.SelectorFromSet(labels.Set(map[string]string{"k8s-app": "kube-dns"}))
|
label := labels.SelectorFromSet(labels.Set(map[string]string{"k8s-app": "kube-dns"}))
|
||||||
options := api.ListOptions{LabelSelector: label}
|
options := v1.ListOptions{LabelSelector: label.String()}
|
||||||
|
|
||||||
pods, err := t.f.ClientSet.Core().Pods("kube-system").List(options)
|
pods, err := t.f.ClientSet.Core().Pods("kube-system").List(options)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@ -94,19 +94,19 @@ func (t *dnsConfigMapTest) run() {
|
|||||||
invalid := map[string]string{"federations": "invalid.map=xyz"}
|
invalid := map[string]string{"federations": "invalid.map=xyz"}
|
||||||
|
|
||||||
By("empty -> valid1")
|
By("empty -> valid1")
|
||||||
t.setConfigMap(&api.ConfigMap{Data: valid1}, true)
|
t.setConfigMap(&v1.ConfigMap{Data: valid1}, true)
|
||||||
t.validate()
|
t.validate()
|
||||||
|
|
||||||
By("valid1 -> valid2")
|
By("valid1 -> valid2")
|
||||||
t.setConfigMap(&api.ConfigMap{Data: valid2}, true)
|
t.setConfigMap(&v1.ConfigMap{Data: valid2}, true)
|
||||||
t.validate()
|
t.validate()
|
||||||
|
|
||||||
By("valid2 -> invalid")
|
By("valid2 -> invalid")
|
||||||
t.setConfigMap(&api.ConfigMap{Data: invalid}, false)
|
t.setConfigMap(&v1.ConfigMap{Data: invalid}, false)
|
||||||
t.validate()
|
t.validate()
|
||||||
|
|
||||||
By("invalid -> valid1")
|
By("invalid -> valid1")
|
||||||
t.setConfigMap(&api.ConfigMap{Data: valid1}, true)
|
t.setConfigMap(&v1.ConfigMap{Data: valid1}, true)
|
||||||
t.validate()
|
t.validate()
|
||||||
|
|
||||||
By("valid1 -> deleted")
|
By("valid1 -> deleted")
|
||||||
@ -114,7 +114,7 @@ func (t *dnsConfigMapTest) run() {
|
|||||||
t.validate()
|
t.validate()
|
||||||
|
|
||||||
By("deleted -> invalid")
|
By("deleted -> invalid")
|
||||||
t.setConfigMap(&api.ConfigMap{Data: invalid}, false)
|
t.setConfigMap(&v1.ConfigMap{Data: invalid}, false)
|
||||||
t.validate()
|
t.validate()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ func (t *dnsConfigMapTest) runDig(dnsName string) []string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *dnsConfigMapTest) setConfigMap(cm *api.ConfigMap, isValid bool) {
|
func (t *dnsConfigMapTest) setConfigMap(cm *v1.ConfigMap, isValid bool) {
|
||||||
if isValid {
|
if isValid {
|
||||||
t.cm = cm
|
t.cm = cm
|
||||||
}
|
}
|
||||||
@ -219,11 +219,11 @@ func (t *dnsConfigMapTest) setConfigMap(cm *api.ConfigMap, isValid bool) {
|
|||||||
cm.ObjectMeta.Namespace = t.ns
|
cm.ObjectMeta.Namespace = t.ns
|
||||||
cm.ObjectMeta.Name = t.name
|
cm.ObjectMeta.Name = t.name
|
||||||
|
|
||||||
options := api.ListOptions{
|
options := v1.ListOptions{
|
||||||
FieldSelector: fields.Set{
|
FieldSelector: fields.Set{
|
||||||
"metadata.namespace": t.ns,
|
"metadata.namespace": t.ns,
|
||||||
"metadata.name": t.name,
|
"metadata.name": t.name,
|
||||||
}.AsSelector(),
|
}.AsSelector().String(),
|
||||||
}
|
}
|
||||||
cmList, err := t.c.Core().ConfigMaps(t.ns).List(options)
|
cmList, err := t.c.Core().ConfigMaps(t.ns).List(options)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@ -253,22 +253,22 @@ func (t *dnsConfigMapTest) createUtilPod() {
|
|||||||
// Actual port # doesn't matter, just need to exist.
|
// Actual port # doesn't matter, just need to exist.
|
||||||
const servicePort = 10101
|
const servicePort = 10101
|
||||||
|
|
||||||
t.utilPod = &api.Pod{
|
t.utilPod = &v1.Pod{
|
||||||
TypeMeta: unversioned.TypeMeta{
|
TypeMeta: unversioned.TypeMeta{
|
||||||
Kind: "Pod",
|
Kind: "Pod",
|
||||||
},
|
},
|
||||||
ObjectMeta: api.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Namespace: t.f.Namespace.Name,
|
Namespace: t.f.Namespace.Name,
|
||||||
Labels: map[string]string{"app": "e2e-dns-configmap"},
|
Labels: map[string]string{"app": "e2e-dns-configmap"},
|
||||||
GenerateName: "e2e-dns-configmap-",
|
GenerateName: "e2e-dns-configmap-",
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: v1.PodSpec{
|
||||||
Containers: []api.Container{
|
Containers: []v1.Container{
|
||||||
{
|
{
|
||||||
Name: "util",
|
Name: "util",
|
||||||
Image: "gcr.io/google_containers/dnsutils:e2e",
|
Image: "gcr.io/google_containers/dnsutils:e2e",
|
||||||
Command: []string{"sleep", "10000"},
|
Command: []string{"sleep", "10000"},
|
||||||
Ports: []api.ContainerPort{
|
Ports: []v1.ContainerPort{
|
||||||
{ContainerPort: servicePort, Protocol: "TCP"},
|
{ContainerPort: servicePort, Protocol: "TCP"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -282,17 +282,17 @@ func (t *dnsConfigMapTest) createUtilPod() {
|
|||||||
framework.Logf("Created pod %v", t.utilPod)
|
framework.Logf("Created pod %v", t.utilPod)
|
||||||
Expect(t.f.WaitForPodRunning(t.utilPod.Name)).NotTo(HaveOccurred())
|
Expect(t.f.WaitForPodRunning(t.utilPod.Name)).NotTo(HaveOccurred())
|
||||||
|
|
||||||
t.utilService = &api.Service{
|
t.utilService = &v1.Service{
|
||||||
TypeMeta: unversioned.TypeMeta{
|
TypeMeta: unversioned.TypeMeta{
|
||||||
Kind: "Service",
|
Kind: "Service",
|
||||||
},
|
},
|
||||||
ObjectMeta: api.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Namespace: t.f.Namespace.Name,
|
Namespace: t.f.Namespace.Name,
|
||||||
Name: "e2e-dns-configmap",
|
Name: "e2e-dns-configmap",
|
||||||
},
|
},
|
||||||
Spec: api.ServiceSpec{
|
Spec: v1.ServiceSpec{
|
||||||
Selector: map[string]string{"app": "e2e-dns-configmap"},
|
Selector: map[string]string{"app": "e2e-dns-configmap"},
|
||||||
Ports: []api.ServicePort{
|
Ports: []v1.ServicePort{
|
||||||
{
|
{
|
||||||
Protocol: "TCP",
|
Protocol: "TCP",
|
||||||
Port: servicePort,
|
Port: servicePort,
|
||||||
@ -309,7 +309,7 @@ func (t *dnsConfigMapTest) createUtilPod() {
|
|||||||
|
|
||||||
func (t *dnsConfigMapTest) deleteUtilPod() {
|
func (t *dnsConfigMapTest) deleteUtilPod() {
|
||||||
podClient := t.c.Core().Pods(t.f.Namespace.Name)
|
podClient := t.c.Core().Pods(t.f.Namespace.Name)
|
||||||
if err := podClient.Delete(t.utilPod.Name, api.NewDeleteOptions(0)); err != nil {
|
if err := podClient.Delete(t.utilPod.Name, v1.NewDeleteOptions(0)); err != nil {
|
||||||
framework.Logf("Delete of pod %v:%v failed: %v",
|
framework.Logf("Delete of pod %v:%v failed: %v",
|
||||||
t.utilPod.Namespace, t.utilPod.Name, err)
|
t.utilPod.Namespace, t.utilPod.Name, err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user