pkg/dns
This commit is contained in:
parent
b50367cbdc
commit
f0ad860d66
@ -17,8 +17,9 @@ limitations under the License.
|
||||
package config
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestValidate(t *testing.T) {
|
||||
|
@ -18,9 +18,9 @@ package config
|
||||
|
||||
import (
|
||||
"k8s.io/client-go/pkg/util/wait"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/v1"
|
||||
"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"
|
||||
"k8s.io/kubernetes/pkg/fields"
|
||||
"k8s.io/kubernetes/pkg/runtime"
|
||||
@ -55,19 +55,19 @@ func NewSync(client clientset.Interface, ns string, name string) Sync {
|
||||
}
|
||||
|
||||
listWatch := &cache.ListWatch{
|
||||
ListFunc: func(options api.ListOptions) (runtime.Object, error) {
|
||||
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector()
|
||||
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector().String()
|
||||
return client.Core().ConfigMaps(ns).List(options)
|
||||
},
|
||||
WatchFunc: func(options api.ListOptions) (watch.Interface, error) {
|
||||
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector()
|
||||
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||
options.FieldSelector = fields.Set{"metadata.name": name}.AsSelector().String()
|
||||
return client.Core().ConfigMaps(ns).Watch(options)
|
||||
},
|
||||
}
|
||||
|
||||
store, controller := cache.NewInformer(
|
||||
listWatch,
|
||||
&api.ConfigMap{},
|
||||
&v1.ConfigMap{},
|
||||
time.Duration(0),
|
||||
cache.ResourceEventHandlerFuncs{
|
||||
AddFunc: sync.onAdd,
|
||||
@ -115,8 +115,8 @@ func (sync *kubeSync) Periodic() <-chan *Config {
|
||||
return sync.channel
|
||||
}
|
||||
|
||||
func (sync *kubeSync) toConfigMap(obj interface{}) *api.ConfigMap {
|
||||
cm, ok := obj.(*api.ConfigMap)
|
||||
func (sync *kubeSync) toConfigMap(obj interface{}) *v1.ConfigMap {
|
||||
cm, ok := obj.(*v1.ConfigMap)
|
||||
if !ok {
|
||||
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)
|
||||
|
||||
if cm.ObjectMeta.ResourceVersion != sync.latestVersion {
|
||||
@ -184,7 +184,7 @@ func (sync *kubeSync) processUpdate(cm *api.ConfigMap) (config *Config, changed
|
||||
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 {
|
||||
config.Federations = make(map[string]string)
|
||||
if err = fed.ParseFederationsFlag(flagValue, config.Federations); err != nil {
|
||||
|
@ -27,11 +27,11 @@ import (
|
||||
etcd "github.com/coreos/etcd/client"
|
||||
"github.com/miekg/dns"
|
||||
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/v1"
|
||||
"k8s.io/kubernetes/pkg/api/v1/endpoints"
|
||||
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/treecache"
|
||||
"k8s.io/kubernetes/pkg/dns/util"
|
||||
@ -94,7 +94,7 @@ type KubeDNS struct {
|
||||
// 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
|
||||
// out of sync.
|
||||
clusterIPServiceMap map[string]*kapi.Service
|
||||
clusterIPServiceMap map[string]*v1.Service
|
||||
// cacheLock protecting the cache. caller is responsible for using
|
||||
// the cacheLock before invoking methods on cache the cache is not
|
||||
// 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{},
|
||||
nodesStore: kcache.NewStore(kcache.MetaNamespaceKeyFunc),
|
||||
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, "."), ".")),
|
||||
|
||||
configLock: sync.RWMutex{},
|
||||
@ -165,11 +165,11 @@ func (kd *KubeDNS) waitForKubernetesService() {
|
||||
const kubernetesSvcName = "kubernetes"
|
||||
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)
|
||||
|
||||
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 {
|
||||
glog.V(3).Infof(
|
||||
"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.
|
||||
kd.servicesStore, kd.serviceController = kcache.NewInformer(
|
||||
&kcache.ListWatch{
|
||||
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
|
||||
return kd.kubeClient.Core().Services(kapi.NamespaceAll).List(options)
|
||||
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||
return kd.kubeClient.Core().Services(v1.NamespaceAll).List(options)
|
||||
},
|
||||
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
|
||||
return kd.kubeClient.Core().Services(kapi.NamespaceAll).Watch(options)
|
||||
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||
return kd.kubeClient.Core().Services(v1.NamespaceAll).Watch(options)
|
||||
},
|
||||
},
|
||||
&kapi.Service{},
|
||||
&v1.Service{},
|
||||
resyncPeriod,
|
||||
kcache.ResourceEventHandlerFuncs{
|
||||
AddFunc: kd.newService,
|
||||
@ -239,14 +239,14 @@ func (kd *KubeDNS) setEndpointsStore() {
|
||||
// Returns a cache.ListWatch that gets all changes to endpoints.
|
||||
kd.endpointsStore, kd.endpointsController = kcache.NewInformer(
|
||||
&kcache.ListWatch{
|
||||
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
|
||||
return kd.kubeClient.Core().Endpoints(kapi.NamespaceAll).List(options)
|
||||
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||
return kd.kubeClient.Core().Endpoints(v1.NamespaceAll).List(options)
|
||||
},
|
||||
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
|
||||
return kd.kubeClient.Core().Endpoints(kapi.NamespaceAll).Watch(options)
|
||||
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||
return kd.kubeClient.Core().Endpoints(v1.NamespaceAll).Watch(options)
|
||||
},
|
||||
},
|
||||
&kapi.Endpoints{},
|
||||
&v1.Endpoints{},
|
||||
resyncPeriod,
|
||||
kcache.ResourceEventHandlerFuncs{
|
||||
AddFunc: kd.handleEndpointAdd,
|
||||
@ -260,8 +260,8 @@ func (kd *KubeDNS) setEndpointsStore() {
|
||||
)
|
||||
}
|
||||
|
||||
func assertIsService(obj interface{}) (*kapi.Service, bool) {
|
||||
if service, ok := obj.(*kapi.Service); ok {
|
||||
func assertIsService(obj interface{}) (*v1.Service, bool) {
|
||||
if service, ok := obj.(*v1.Service); ok {
|
||||
return service, ok
|
||||
} else {
|
||||
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)
|
||||
|
||||
// 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)
|
||||
return
|
||||
}
|
||||
// if ClusterIP is not set, a DNS entry should not be created
|
||||
if !kapi.IsServiceIPSet(service) {
|
||||
if !v1.IsServiceIPSet(service) {
|
||||
kd.newHeadlessService(service)
|
||||
return
|
||||
}
|
||||
@ -303,7 +303,7 @@ func (kd *KubeDNS) removeService(obj interface{}) {
|
||||
s.Name, subCachePath, success)
|
||||
|
||||
// ExternalName services have no IP
|
||||
if kapi.IsServiceIPSet(s) {
|
||||
if v1.IsServiceIPSet(s) {
|
||||
delete(kd.reverseRecordMap, 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 {
|
||||
// Remove old cache path only if changing type to/from ExternalName.
|
||||
// In all other cases, we'll update records in place.
|
||||
if (new.Spec.Type == kapi.ServiceTypeExternalName) !=
|
||||
(old.Spec.Type == kapi.ServiceTypeExternalName) {
|
||||
if (new.Spec.Type == v1.ServiceTypeExternalName) !=
|
||||
(old.Spec.Type == v1.ServiceTypeExternalName) {
|
||||
kd.removeService(oldObj)
|
||||
}
|
||||
kd.newService(newObj)
|
||||
@ -325,24 +325,24 @@ func (kd *KubeDNS) updateService(oldObj, newObj interface{}) {
|
||||
}
|
||||
|
||||
func (kd *KubeDNS) handleEndpointAdd(obj interface{}) {
|
||||
if e, ok := obj.(*kapi.Endpoints); ok {
|
||||
if e, ok := obj.(*v1.Endpoints); ok {
|
||||
kd.addDNSUsingEndpoints(e)
|
||||
}
|
||||
}
|
||||
|
||||
func (kd *KubeDNS) addDNSUsingEndpoints(e *kapi.Endpoints) error {
|
||||
func (kd *KubeDNS) addDNSUsingEndpoints(e *v1.Endpoints) error {
|
||||
svc, err := kd.getServiceFromEndpoints(e)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if svc == nil || kapi.IsServiceIPSet(svc) {
|
||||
if svc == nil || v1.IsServiceIPSet(svc) {
|
||||
// No headless service found corresponding to endpoints object.
|
||||
return nil
|
||||
}
|
||||
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)
|
||||
if err != nil {
|
||||
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
|
||||
// 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...)
|
||||
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()
|
||||
recordValue, recordLabel := util.GetSkyMsg(service.Spec.ClusterIP, 0)
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
podHostnames, err := getPodHostnamesFromAnnotation(e.Annotations)
|
||||
if err != nil {
|
||||
@ -433,7 +433,7 @@ func (kd *KubeDNS) generateRecordsForHeadlessService(e *kapi.Endpoints, svc *kap
|
||||
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 {
|
||||
return address.Hostname, true
|
||||
}
|
||||
@ -457,7 +457,7 @@ func getPodHostnamesFromAnnotation(annotations map[string]string) (map[string]en
|
||||
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}, ".")
|
||||
for _, cNameLabel := range labels {
|
||||
host = cNameLabel + "." + host
|
||||
@ -467,7 +467,7 @@ func (kd *KubeDNS) generateSRVRecordValue(svc *kapi.Service, portNumber int, lab
|
||||
}
|
||||
|
||||
// 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.
|
||||
// This record must be periodically updated.
|
||||
// Format is as follows:
|
||||
@ -486,14 +486,14 @@ func (kd *KubeDNS) newHeadlessService(service *kapi.Service) error {
|
||||
service.Name, service.Namespace)
|
||||
return nil
|
||||
}
|
||||
if e, ok := e.(*kapi.Endpoints); ok {
|
||||
if e, ok := e.(*v1.Endpoints); ok {
|
||||
return kd.generateRecordsForHeadlessService(e, service)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 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.
|
||||
// TODO: TTL?
|
||||
recordValue, _ := util.GetSkyMsg(service.Spec.ExternalName, 0)
|
||||
@ -675,7 +675,7 @@ func (kd *KubeDNS) serviceWithClusterIPHasEndpoints(msg *skymsg.Service) (bool,
|
||||
if !exists {
|
||||
return false, nil
|
||||
}
|
||||
if e, ok := e.(*kapi.Endpoints); ok {
|
||||
if e, ok := e.(*v1.Endpoints); ok {
|
||||
return len(e.Subsets) > 0, nil
|
||||
}
|
||||
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
|
||||
// the DNS zone.
|
||||
func (kd *KubeDNS) getClusterZoneAndRegion() (string, string, error) {
|
||||
var node *kapi.Node
|
||||
var node *v1.Node
|
||||
|
||||
objs := kd.nodesStore.List()
|
||||
if len(objs) > 0 {
|
||||
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])
|
||||
}
|
||||
} else {
|
||||
@ -853,7 +853,7 @@ func (kd *KubeDNS) getClusterZoneAndRegion() (string, string, error) {
|
||||
// wasteful in case of non-federated independent Kubernetes clusters. So carefully
|
||||
// proceeding here.
|
||||
// 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 {
|
||||
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
|
||||
}
|
||||
|
||||
func getServiceFQDN(domain string, service *kapi.Service) string {
|
||||
func getServiceFQDN(domain string, service *v1.Service) string {
|
||||
return strings.Join(
|
||||
[]string{service.Name, service.Namespace, serviceSubdomain, domain}, ".")
|
||||
}
|
||||
|
@ -32,11 +32,11 @@ import (
|
||||
skyServer "github.com/skynetservices/skydns/server"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"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/v1"
|
||||
endpointsapi "k8s.io/kubernetes/pkg/api/v1/endpoints"
|
||||
"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/treecache"
|
||||
"k8s.io/kubernetes/pkg/dns/util"
|
||||
@ -61,7 +61,7 @@ func newKubeDNS() *KubeDNS {
|
||||
|
||||
cache: treecache.NewTreeCache(),
|
||||
reverseRecordMap: make(map[string]*skymsg.Service),
|
||||
clusterIPServiceMap: make(map[string]*kapi.Service),
|
||||
clusterIPServiceMap: make(map[string]*v1.Service),
|
||||
cacheLock: sync.RWMutex{},
|
||||
|
||||
config: config.NewDefaultConfig(),
|
||||
@ -339,7 +339,7 @@ func TestHeadlessServiceEndpointsUpdate(t *testing.T) {
|
||||
assertDNSForHeadlessService(t, kd, endpoints)
|
||||
|
||||
// remove all endpoints
|
||||
endpoints.Subsets = []kapi.EndpointSubset{}
|
||||
endpoints.Subsets = []v1.EndpointSubset{}
|
||||
kd.handleEndpointAdd(endpoints)
|
||||
assertNoDNSForHeadlessService(t, kd, service)
|
||||
|
||||
@ -419,7 +419,7 @@ func TestFederationHeadlessService(t *testing.T) {
|
||||
"testservice.default.svc.cluster.local.", t, kd)
|
||||
|
||||
// Delete the endpoint.
|
||||
endpoints.Subsets = []kapi.EndpointSubset{}
|
||||
endpoints.Subsets = []v1.EndpointSubset{}
|
||||
kd.handleEndpointAdd(endpoints)
|
||||
kd.updateService(s, s)
|
||||
|
||||
@ -461,7 +461,7 @@ func TestFederationService(t *testing.T) {
|
||||
"testservice.default.svc.cluster.local.", t, kd)
|
||||
|
||||
// Remove the endpoint.
|
||||
endpoints.Subsets = []kapi.EndpointSubset{}
|
||||
endpoints.Subsets = []v1.EndpointSubset{}
|
||||
kd.handleEndpointAdd(endpoints)
|
||||
kd.updateService(s, s)
|
||||
|
||||
@ -590,17 +590,17 @@ func TestConfigSyncInitialMap(t *testing.T) {
|
||||
checkConfigEqual(t, kd, &config.Config{Federations: map[string]string{"name3": "domain3"}})
|
||||
}
|
||||
|
||||
func newNodes() *kapi.NodeList {
|
||||
return &kapi.NodeList{
|
||||
Items: []kapi.Node{
|
||||
func newNodes() *v1.NodeList {
|
||||
return &v1.NodeList{
|
||||
Items: []v1.Node{
|
||||
// Node without annotation.
|
||||
{
|
||||
ObjectMeta: kapi.ObjectMeta{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Name: "testnode-0",
|
||||
},
|
||||
},
|
||||
{
|
||||
ObjectMeta: kapi.ObjectMeta{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Name: "testnode-1",
|
||||
Labels: map[string]string{
|
||||
// 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 {
|
||||
service := kapi.Service{
|
||||
ObjectMeta: kapi.ObjectMeta{
|
||||
func newService(namespace, serviceName, clusterIP, portName string, portNumber int32) *v1.Service {
|
||||
service := v1.Service{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Name: serviceName,
|
||||
Namespace: namespace,
|
||||
},
|
||||
Spec: kapi.ServiceSpec{
|
||||
Spec: v1.ServiceSpec{
|
||||
ClusterIP: clusterIP,
|
||||
Ports: []kapi.ServicePort{
|
||||
Ports: []v1.ServicePort{
|
||||
{Port: portNumber, Name: portName, Protocol: "TCP"},
|
||||
},
|
||||
},
|
||||
@ -631,17 +631,17 @@ func newService(namespace, serviceName, clusterIP, portName string, portNumber i
|
||||
return &service
|
||||
}
|
||||
|
||||
func newExternalNameService() *kapi.Service {
|
||||
service := kapi.Service{
|
||||
ObjectMeta: kapi.ObjectMeta{
|
||||
func newExternalNameService() *v1.Service {
|
||||
service := v1.Service{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Name: testService,
|
||||
Namespace: testNamespace,
|
||||
},
|
||||
Spec: kapi.ServiceSpec{
|
||||
Spec: v1.ServiceSpec{
|
||||
ClusterIP: "None",
|
||||
Type: kapi.ServiceTypeExternalName,
|
||||
Type: v1.ServiceTypeExternalName,
|
||||
ExternalName: testExternalName,
|
||||
Ports: []kapi.ServicePort{
|
||||
Ports: []v1.ServicePort{
|
||||
{Port: 0},
|
||||
},
|
||||
},
|
||||
@ -649,15 +649,15 @@ func newExternalNameService() *kapi.Service {
|
||||
return &service
|
||||
}
|
||||
|
||||
func newHeadlessService() *kapi.Service {
|
||||
service := kapi.Service{
|
||||
ObjectMeta: kapi.ObjectMeta{
|
||||
func newHeadlessService() *v1.Service {
|
||||
service := v1.Service{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Name: testService,
|
||||
Namespace: testNamespace,
|
||||
},
|
||||
Spec: kapi.ServiceSpec{
|
||||
Spec: v1.ServiceSpec{
|
||||
ClusterIP: "None",
|
||||
Ports: []kapi.ServicePort{
|
||||
Ports: []v1.ServicePort{
|
||||
{Port: 0},
|
||||
},
|
||||
},
|
||||
@ -665,40 +665,40 @@ func newHeadlessService() *kapi.Service {
|
||||
return &service
|
||||
}
|
||||
|
||||
func newEndpoints(service *kapi.Service, subsets ...kapi.EndpointSubset) *kapi.Endpoints {
|
||||
endpoints := kapi.Endpoints{
|
||||
func newEndpoints(service *v1.Service, subsets ...v1.EndpointSubset) *v1.Endpoints {
|
||||
endpoints := v1.Endpoints{
|
||||
ObjectMeta: service.ObjectMeta,
|
||||
Subsets: []kapi.EndpointSubset{},
|
||||
Subsets: []v1.EndpointSubset{},
|
||||
}
|
||||
|
||||
endpoints.Subsets = append(endpoints.Subsets, subsets...)
|
||||
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.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 {
|
||||
subset.Addresses = append(subset.Addresses, kapi.EndpointAddress{IP: ip})
|
||||
subset.Addresses = append(subset.Addresses, v1.EndpointAddress{IP: ip})
|
||||
}
|
||||
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.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
|
||||
}
|
||||
|
||||
func newSubset() kapi.EndpointSubset {
|
||||
subset := kapi.EndpointSubset{
|
||||
Addresses: []kapi.EndpointAddress{},
|
||||
Ports: []kapi.EndpointPort{},
|
||||
func newSubset() v1.EndpointSubset {
|
||||
subset := v1.EndpointSubset{
|
||||
Addresses: []v1.EndpointAddress{},
|
||||
Ports: []v1.EndpointPort{},
|
||||
}
|
||||
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 _, port := range subset.Ports {
|
||||
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)
|
||||
require.NoError(t, err)
|
||||
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)
|
||||
require.NoError(t, err)
|
||||
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{}
|
||||
for _, endpointAddress := range e {
|
||||
endpoints[endpointAddress.IP] = true
|
||||
@ -758,32 +758,32 @@ func getIPForCName(t *testing.T, kd *KubeDNS, cname string) string {
|
||||
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)
|
||||
require.Error(t, err)
|
||||
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)
|
||||
require.Error(t, err)
|
||||
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)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 1, len(records))
|
||||
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)
|
||||
require.Error(t, err)
|
||||
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)
|
||||
queries := getEquivalentQueries(serviceFQDN, s.Namespace)
|
||||
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)
|
||||
queries := getEquivalentQueries(serviceFQDN, s.Namespace)
|
||||
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, "."))
|
||||
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
|
||||
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)
|
||||
}
|
||||
|
||||
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, "."))
|
||||
reverseLookup := fmt.Sprintf("%s%s", strings.Join(segments, "."), util.ArpaSuffix)
|
||||
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)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
@ -21,9 +21,9 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"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"
|
||||
"k8s.io/kubernetes/pkg/fields"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
@ -42,12 +42,12 @@ type dnsConfigMapTest struct {
|
||||
name string
|
||||
labels []string
|
||||
|
||||
cm *api.ConfigMap
|
||||
cm *v1.ConfigMap
|
||||
isValid bool
|
||||
|
||||
dnsPod *api.Pod
|
||||
utilPod *api.Pod
|
||||
utilService *api.Service
|
||||
dnsPod *v1.Pod
|
||||
utilPod *v1.Pod
|
||||
utilService *v1.Service
|
||||
}
|
||||
|
||||
var _ = framework.KubeDescribe("DNS config map", func() {
|
||||
@ -69,7 +69,7 @@ var _ = framework.KubeDescribe("DNS config map", func() {
|
||||
func (t *dnsConfigMapTest) init() {
|
||||
By("Finding a DNS pod")
|
||||
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)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
@ -94,19 +94,19 @@ func (t *dnsConfigMapTest) run() {
|
||||
invalid := map[string]string{"federations": "invalid.map=xyz"}
|
||||
|
||||
By("empty -> valid1")
|
||||
t.setConfigMap(&api.ConfigMap{Data: valid1}, true)
|
||||
t.setConfigMap(&v1.ConfigMap{Data: valid1}, true)
|
||||
t.validate()
|
||||
|
||||
By("valid1 -> valid2")
|
||||
t.setConfigMap(&api.ConfigMap{Data: valid2}, true)
|
||||
t.setConfigMap(&v1.ConfigMap{Data: valid2}, true)
|
||||
t.validate()
|
||||
|
||||
By("valid2 -> invalid")
|
||||
t.setConfigMap(&api.ConfigMap{Data: invalid}, false)
|
||||
t.setConfigMap(&v1.ConfigMap{Data: invalid}, false)
|
||||
t.validate()
|
||||
|
||||
By("invalid -> valid1")
|
||||
t.setConfigMap(&api.ConfigMap{Data: valid1}, true)
|
||||
t.setConfigMap(&v1.ConfigMap{Data: valid1}, true)
|
||||
t.validate()
|
||||
|
||||
By("valid1 -> deleted")
|
||||
@ -114,7 +114,7 @@ func (t *dnsConfigMapTest) run() {
|
||||
t.validate()
|
||||
|
||||
By("deleted -> invalid")
|
||||
t.setConfigMap(&api.ConfigMap{Data: invalid}, false)
|
||||
t.setConfigMap(&v1.ConfigMap{Data: invalid}, false)
|
||||
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 {
|
||||
t.cm = cm
|
||||
}
|
||||
@ -219,11 +219,11 @@ func (t *dnsConfigMapTest) setConfigMap(cm *api.ConfigMap, isValid bool) {
|
||||
cm.ObjectMeta.Namespace = t.ns
|
||||
cm.ObjectMeta.Name = t.name
|
||||
|
||||
options := api.ListOptions{
|
||||
options := v1.ListOptions{
|
||||
FieldSelector: fields.Set{
|
||||
"metadata.namespace": t.ns,
|
||||
"metadata.name": t.name,
|
||||
}.AsSelector(),
|
||||
}.AsSelector().String(),
|
||||
}
|
||||
cmList, err := t.c.Core().ConfigMaps(t.ns).List(options)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
@ -253,22 +253,22 @@ func (t *dnsConfigMapTest) createUtilPod() {
|
||||
// Actual port # doesn't matter, just need to exist.
|
||||
const servicePort = 10101
|
||||
|
||||
t.utilPod = &api.Pod{
|
||||
t.utilPod = &v1.Pod{
|
||||
TypeMeta: unversioned.TypeMeta{
|
||||
Kind: "Pod",
|
||||
},
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Namespace: t.f.Namespace.Name,
|
||||
Labels: map[string]string{"app": "e2e-dns-configmap"},
|
||||
GenerateName: "e2e-dns-configmap-",
|
||||
},
|
||||
Spec: api.PodSpec{
|
||||
Containers: []api.Container{
|
||||
Spec: v1.PodSpec{
|
||||
Containers: []v1.Container{
|
||||
{
|
||||
Name: "util",
|
||||
Image: "gcr.io/google_containers/dnsutils:e2e",
|
||||
Command: []string{"sleep", "10000"},
|
||||
Ports: []api.ContainerPort{
|
||||
Ports: []v1.ContainerPort{
|
||||
{ContainerPort: servicePort, Protocol: "TCP"},
|
||||
},
|
||||
},
|
||||
@ -282,17 +282,17 @@ func (t *dnsConfigMapTest) createUtilPod() {
|
||||
framework.Logf("Created pod %v", t.utilPod)
|
||||
Expect(t.f.WaitForPodRunning(t.utilPod.Name)).NotTo(HaveOccurred())
|
||||
|
||||
t.utilService = &api.Service{
|
||||
t.utilService = &v1.Service{
|
||||
TypeMeta: unversioned.TypeMeta{
|
||||
Kind: "Service",
|
||||
},
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Namespace: t.f.Namespace.Name,
|
||||
Name: "e2e-dns-configmap",
|
||||
},
|
||||
Spec: api.ServiceSpec{
|
||||
Spec: v1.ServiceSpec{
|
||||
Selector: map[string]string{"app": "e2e-dns-configmap"},
|
||||
Ports: []api.ServicePort{
|
||||
Ports: []v1.ServicePort{
|
||||
{
|
||||
Protocol: "TCP",
|
||||
Port: servicePort,
|
||||
@ -309,7 +309,7 @@ func (t *dnsConfigMapTest) createUtilPod() {
|
||||
|
||||
func (t *dnsConfigMapTest) deleteUtilPod() {
|
||||
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",
|
||||
t.utilPod.Namespace, t.utilPod.Name, err)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user