@@ -64,6 +64,23 @@ func digForNames(namesToResolve []string, expect sets.String) string {
64
64
return probeCmd
65
65
}
66
66
67
+ func digForCNAMEs (namesToResolve []string , expect sets.String ) string {
68
+ fileNamePrefix := "test"
69
+ var probeCmd string
70
+ for _ , name := range namesToResolve {
71
+ // Resolve by TCP and UDP DNS. Use $$(...) because $(...) is
72
+ // expanded by kubernetes (though this won't expand so should
73
+ // remain a literal, safe > sorry).
74
+ lookup := "CNAME"
75
+ fileName := fmt .Sprintf ("%s_udp@%s" , fileNamePrefix , name )
76
+ expect .Insert (fileName )
77
+ probeCmd += fmt .Sprintf (`test -n "$$(dig +notcp +noall +answer +search %s %s)" && echo %q;` , name , lookup , fileName )
78
+ fileName = fmt .Sprintf ("%s_tcp@%s" , fileNamePrefix , name )
79
+ expect .Insert (fileName )
80
+ probeCmd += fmt .Sprintf (`test -n "$$(dig +tcp +noall +answer +search %s %s)" && echo %q;` , name , lookup , fileName )
81
+ }
82
+ return probeCmd
83
+ }
67
84
func digForARecords (records map [string ][]string , expect sets.String ) string {
68
85
var probeCmd string
69
86
fileNamePrefix := "test"
@@ -178,8 +195,8 @@ func validateDNSResults(f *e2e.Framework, pod *api.Pod, fileNames sets.String, e
178
195
e2e .Logf ("DNS probes using %s succeeded\n " , pod .Name )
179
196
}
180
197
181
- func createServiceSpec (serviceName string , isHeadless bool , selector map [string ]string ) * api.Service {
182
- headlessService := & api.Service {
198
+ func createServiceSpec (serviceName string , isHeadless bool , externalName string , selector map [string ]string ) * api.Service {
199
+ s := & api.Service {
183
200
ObjectMeta : api.ObjectMeta {
184
201
Name : serviceName ,
185
202
},
@@ -191,9 +208,14 @@ func createServiceSpec(serviceName string, isHeadless bool, selector map[string]
191
208
},
192
209
}
193
210
if isHeadless {
194
- headlessService .Spec .ClusterIP = "None"
211
+ s .Spec .ClusterIP = "None"
195
212
}
196
- return headlessService
213
+ if len (externalName ) > 0 {
214
+ s .Spec .Type = api .ServiceTypeExternalName
215
+ s .Spec .ExternalName = externalName
216
+ s .Spec .ClusterIP = ""
217
+ }
218
+ return s
197
219
}
198
220
199
221
func createEndpointSpec (name string ) * api.Endpoints {
@@ -233,18 +255,21 @@ var _ = Describe("DNS", func() {
233
255
f := e2e .NewDefaultFramework ("dns" )
234
256
235
257
It ("should answer endpoint and wildcard queries for the cluster [Conformance]" , func () {
236
- if _ , err := f .Client .Services (f .Namespace .Name ).Create (createServiceSpec ("headless" , true , nil )); err != nil {
258
+ if _ , err := f .Client .Services (f .Namespace .Name ).Create (createServiceSpec ("headless" , true , "" , nil )); err != nil {
237
259
e2e .Failf ("unable to create headless service: %v" , err )
238
260
}
239
261
if _ , err := f .Client .Endpoints (f .Namespace .Name ).Create (createEndpointSpec ("headless" )); err != nil {
240
262
e2e .Failf ("unable to create clusterip endpoints: %v" , err )
241
263
}
242
- if _ , err := f .Client .Services (f .Namespace .Name ).Create (createServiceSpec ("clusterip" , false , nil )); err != nil {
264
+ if _ , err := f .Client .Services (f .Namespace .Name ).Create (createServiceSpec ("clusterip" , false , "" , nil )); err != nil {
243
265
e2e .Failf ("unable to create clusterip service: %v" , err )
244
266
}
245
267
if _ , err := f .Client .Endpoints (f .Namespace .Name ).Create (createEndpointSpec ("clusterip" )); err != nil {
246
268
e2e .Failf ("unable to create clusterip endpoints: %v" , err )
247
269
}
270
+ if _ , err := f .Client .Services (f .Namespace .Name ).Create (createServiceSpec ("externalname" , true , "www.google.com" , nil )); err != nil {
271
+ e2e .Failf ("unable to create externalName service: %v" , err )
272
+ }
248
273
249
274
ep , err := f .Client .Endpoints ("default" ).Get ("kubernetes" )
250
275
if err != nil {
@@ -270,6 +295,11 @@ var _ = Describe("DNS", func() {
270
295
fmt .Sprintf ("prefix.clusterip.%s" , f .Namespace .Name ),
271
296
}, expect ),
272
297
298
+ // the DNS pod should be able to get a CNAME for this service
299
+ digForCNAMEs ([]string {
300
+ fmt .Sprintf ("externalname.%s.svc" , f .Namespace .Name ),
301
+ }, expect ),
302
+
273
303
// the DNS pod should be able to look up endpoints for names and wildcards
274
304
digForARecords (map [string ][]string {
275
305
"kubernetes.default.endpoints" : kubeEndpoints ,
0 commit comments