sigs.k8s.io/external-dns@v0.14.1/source/gloo_proxy_test.go (about) 1 /* 2 Copyright 2020n The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package source 18 19 import ( 20 "context" 21 "encoding/json" 22 "testing" 23 24 "github.com/stretchr/testify/assert" 25 corev1 "k8s.io/api/core/v1" 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 28 "k8s.io/apimachinery/pkg/runtime" 29 "k8s.io/apimachinery/pkg/runtime/schema" 30 fakeDynamic "k8s.io/client-go/dynamic/fake" 31 fakeKube "k8s.io/client-go/kubernetes/fake" 32 "sigs.k8s.io/external-dns/endpoint" 33 ) 34 35 // This is a compile-time validation that glooSource is a Source. 36 var _ Source = &glooSource{} 37 38 const defaultGlooNamespace = "gloo-system" 39 40 // Internal proxy test 41 var internalProxy = proxy{ 42 TypeMeta: metav1.TypeMeta{ 43 APIVersion: proxyGVR.GroupVersion().String(), 44 Kind: "Proxy", 45 }, 46 Metadata: metav1.ObjectMeta{ 47 Name: "internal", 48 Namespace: defaultGlooNamespace, 49 }, 50 Spec: proxySpec{ 51 Listeners: []proxySpecListener{ 52 { 53 HTTPListener: proxySpecHTTPListener{ 54 VirtualHosts: []proxyVirtualHost{ 55 { 56 Domains: []string{"a.test", "b.test"}, 57 Metadata: proxyVirtualHostMetadata{ 58 Source: []proxyVirtualHostMetadataSource{ 59 { 60 Kind: "*v1.Unknown", 61 Name: "my-unknown-svc", 62 Namespace: "unknown", 63 }, 64 }, 65 }, 66 }, 67 { 68 Domains: []string{"c.test"}, 69 Metadata: proxyVirtualHostMetadata{ 70 Source: []proxyVirtualHostMetadataSource{ 71 { 72 Kind: "*v1.VirtualService", 73 Name: "my-internal-svc", 74 Namespace: "internal", 75 }, 76 }, 77 }, 78 }, 79 }, 80 }, 81 }, 82 }, 83 }, 84 } 85 86 var internalProxySvc = corev1.Service{ 87 ObjectMeta: metav1.ObjectMeta{ 88 Name: internalProxy.Metadata.Name, 89 Namespace: internalProxy.Metadata.Namespace, 90 }, 91 Spec: corev1.ServiceSpec{ 92 Type: corev1.ServiceTypeLoadBalancer, 93 }, 94 Status: corev1.ServiceStatus{ 95 LoadBalancer: corev1.LoadBalancerStatus{ 96 Ingress: []corev1.LoadBalancerIngress{ 97 { 98 IP: "203.0.113.1", 99 }, 100 { 101 IP: "203.0.113.2", 102 }, 103 { 104 IP: "203.0.113.3", 105 }, 106 }, 107 }, 108 }, 109 } 110 111 var internalProxySource = metav1.PartialObjectMetadata{ 112 TypeMeta: metav1.TypeMeta{ 113 APIVersion: virtualServiceGVR.GroupVersion().String(), 114 Kind: "VirtualService", 115 }, 116 ObjectMeta: metav1.ObjectMeta{ 117 Name: internalProxy.Spec.Listeners[0].HTTPListener.VirtualHosts[1].Metadata.Source[0].Name, 118 Namespace: internalProxy.Spec.Listeners[0].HTTPListener.VirtualHosts[1].Metadata.Source[0].Namespace, 119 Annotations: map[string]string{ 120 "external-dns.alpha.kubernetes.io/ttl": "42", 121 "external-dns.alpha.kubernetes.io/aws-geolocation-country-code": "LU", 122 "external-dns.alpha.kubernetes.io/set-identifier": "identifier", 123 }, 124 }, 125 } 126 127 // External proxy test 128 var externalProxy = proxy{ 129 TypeMeta: metav1.TypeMeta{ 130 APIVersion: proxyGVR.GroupVersion().String(), 131 Kind: "Proxy", 132 }, 133 Metadata: metav1.ObjectMeta{ 134 Name: "external", 135 Namespace: defaultGlooNamespace, 136 }, 137 Spec: proxySpec{ 138 Listeners: []proxySpecListener{ 139 { 140 HTTPListener: proxySpecHTTPListener{ 141 VirtualHosts: []proxyVirtualHost{ 142 { 143 Domains: []string{"d.test"}, 144 Metadata: proxyVirtualHostMetadata{ 145 Source: []proxyVirtualHostMetadataSource{ 146 { 147 Kind: "*v1.Unknown", 148 Name: "my-unknown-svc", 149 Namespace: "unknown", 150 }, 151 }, 152 }, 153 }, 154 { 155 Domains: []string{"e.test"}, 156 Metadata: proxyVirtualHostMetadata{ 157 Source: []proxyVirtualHostMetadataSource{ 158 { 159 Kind: "*v1.VirtualService", 160 Name: "my-external-svc", 161 Namespace: "external", 162 }, 163 }, 164 }, 165 }, 166 }, 167 }, 168 }, 169 }, 170 }, 171 } 172 173 var externalProxySvc = corev1.Service{ 174 ObjectMeta: metav1.ObjectMeta{ 175 Name: externalProxy.Metadata.Name, 176 Namespace: externalProxy.Metadata.Namespace, 177 }, 178 Spec: corev1.ServiceSpec{ 179 Type: corev1.ServiceTypeLoadBalancer, 180 }, 181 Status: corev1.ServiceStatus{ 182 LoadBalancer: corev1.LoadBalancerStatus{ 183 Ingress: []corev1.LoadBalancerIngress{ 184 { 185 Hostname: "a.example.org", 186 }, 187 { 188 Hostname: "b.example.org", 189 }, 190 { 191 Hostname: "c.example.org", 192 }, 193 }, 194 }, 195 }, 196 } 197 198 var externalProxySource = metav1.PartialObjectMetadata{ 199 TypeMeta: metav1.TypeMeta{ 200 APIVersion: virtualServiceGVR.GroupVersion().String(), 201 Kind: "VirtualService", 202 }, 203 ObjectMeta: metav1.ObjectMeta{ 204 Name: externalProxy.Spec.Listeners[0].HTTPListener.VirtualHosts[1].Metadata.Source[0].Name, 205 Namespace: externalProxy.Spec.Listeners[0].HTTPListener.VirtualHosts[1].Metadata.Source[0].Namespace, 206 Annotations: map[string]string{ 207 "external-dns.alpha.kubernetes.io/ttl": "24", 208 "external-dns.alpha.kubernetes.io/aws-geolocation-country-code": "JP", 209 "external-dns.alpha.kubernetes.io/set-identifier": "identifier-external", 210 }, 211 }, 212 } 213 214 // Proxy with metadata static test 215 var proxyMetadataStatic = proxy{ 216 TypeMeta: metav1.TypeMeta{ 217 APIVersion: proxyGVR.GroupVersion().String(), 218 Kind: "Proxy", 219 }, 220 Metadata: metav1.ObjectMeta{ 221 Name: "internal-static", 222 Namespace: defaultGlooNamespace, 223 }, 224 Spec: proxySpec{ 225 Listeners: []proxySpecListener{ 226 { 227 HTTPListener: proxySpecHTTPListener{ 228 VirtualHosts: []proxyVirtualHost{ 229 { 230 Domains: []string{"f.test", "g.test"}, 231 MetadataStatic: proxyVirtualHostMetadataStatic{ 232 Source: []proxyVirtualHostMetadataStaticSource{ 233 { 234 ResourceKind: "*v1.Unknown", 235 ResourceRef: proxyVirtualHostMetadataSourceResourceRef{ 236 Name: "my-unknown-svc", 237 Namespace: "unknown", 238 }, 239 }, 240 }, 241 }, 242 }, 243 { 244 Domains: []string{"h.test"}, 245 MetadataStatic: proxyVirtualHostMetadataStatic{ 246 Source: []proxyVirtualHostMetadataStaticSource{ 247 { 248 ResourceKind: "*v1.VirtualService", 249 ResourceRef: proxyVirtualHostMetadataSourceResourceRef{ 250 Name: "my-internal-static-svc", 251 Namespace: "internal-static", 252 }, 253 }, 254 }, 255 }, 256 }, 257 }, 258 }, 259 }, 260 }, 261 }, 262 } 263 264 var proxyMetadataStaticSvc = corev1.Service{ 265 ObjectMeta: metav1.ObjectMeta{ 266 Name: proxyMetadataStatic.Metadata.Name, 267 Namespace: proxyMetadataStatic.Metadata.Namespace, 268 }, 269 Spec: corev1.ServiceSpec{ 270 Type: corev1.ServiceTypeLoadBalancer, 271 }, 272 Status: corev1.ServiceStatus{ 273 LoadBalancer: corev1.LoadBalancerStatus{ 274 Ingress: []corev1.LoadBalancerIngress{ 275 { 276 IP: "203.0.115.1", 277 }, 278 { 279 IP: "203.0.115.2", 280 }, 281 { 282 IP: "203.0.115.3", 283 }, 284 }, 285 }, 286 }, 287 } 288 289 var proxyMetadataStaticSource = metav1.PartialObjectMetadata{ 290 TypeMeta: metav1.TypeMeta{ 291 APIVersion: virtualServiceGVR.GroupVersion().String(), 292 Kind: "VirtualService", 293 }, 294 ObjectMeta: metav1.ObjectMeta{ 295 Name: proxyMetadataStatic.Spec.Listeners[0].HTTPListener.VirtualHosts[1].MetadataStatic.Source[0].ResourceRef.Name, 296 Namespace: proxyMetadataStatic.Spec.Listeners[0].HTTPListener.VirtualHosts[1].MetadataStatic.Source[0].ResourceRef.Namespace, 297 Annotations: map[string]string{ 298 "external-dns.alpha.kubernetes.io/ttl": "420", 299 "external-dns.alpha.kubernetes.io/aws-geolocation-country-code": "ES", 300 "external-dns.alpha.kubernetes.io/set-identifier": "identifier", 301 }, 302 }, 303 } 304 305 // Proxy with target annotation test 306 var targetAnnotatedProxy = proxy{ 307 TypeMeta: metav1.TypeMeta{ 308 APIVersion: proxyGVR.GroupVersion().String(), 309 Kind: "Proxy", 310 }, 311 Metadata: metav1.ObjectMeta{ 312 Name: "target-ann", 313 Namespace: defaultGlooNamespace, 314 Annotations: map[string]string{ 315 "external-dns.alpha.kubernetes.io/target": "203.2.45.7", 316 }, 317 }, 318 Spec: proxySpec{ 319 Listeners: []proxySpecListener{ 320 { 321 HTTPListener: proxySpecHTTPListener{ 322 VirtualHosts: []proxyVirtualHost{ 323 { 324 Domains: []string{"i.test"}, 325 Metadata: proxyVirtualHostMetadata{ 326 Source: []proxyVirtualHostMetadataSource{ 327 { 328 Kind: "*v1.Unknown", 329 Name: "my-unknown-svc", 330 Namespace: "unknown", 331 }, 332 }, 333 }, 334 }, 335 { 336 Domains: []string{"j.test"}, 337 Metadata: proxyVirtualHostMetadata{ 338 Source: []proxyVirtualHostMetadataSource{ 339 { 340 Kind: "*v1.VirtualService", 341 Name: "my-annotated-svc", 342 Namespace: "internal", 343 }, 344 }, 345 }, 346 }, 347 }, 348 }, 349 }, 350 }, 351 }, 352 } 353 354 var targetAnnotatedProxySvc = corev1.Service{ 355 ObjectMeta: metav1.ObjectMeta{ 356 Name: targetAnnotatedProxy.Metadata.Name, 357 Namespace: targetAnnotatedProxy.Metadata.Namespace, 358 }, 359 Spec: corev1.ServiceSpec{ 360 Type: corev1.ServiceTypeLoadBalancer, 361 }, 362 Status: corev1.ServiceStatus{ 363 LoadBalancer: corev1.LoadBalancerStatus{ 364 Ingress: []corev1.LoadBalancerIngress{ 365 { 366 IP: "203.1.115.1", 367 }, 368 { 369 IP: "203.1.115.2", 370 }, 371 { 372 IP: "203.1.115.3", 373 }, 374 }, 375 }, 376 }, 377 } 378 379 var targetAnnotatedProxySource = metav1.PartialObjectMetadata{ 380 TypeMeta: metav1.TypeMeta{ 381 APIVersion: virtualServiceGVR.GroupVersion().String(), 382 Kind: "VirtualService", 383 }, 384 ObjectMeta: metav1.ObjectMeta{ 385 Name: targetAnnotatedProxy.Spec.Listeners[0].HTTPListener.VirtualHosts[1].Metadata.Source[0].Name, 386 Namespace: targetAnnotatedProxy.Spec.Listeners[0].HTTPListener.VirtualHosts[1].Metadata.Source[0].Namespace, 387 Annotations: map[string]string{ 388 "external-dns.alpha.kubernetes.io/ttl": "460", 389 "external-dns.alpha.kubernetes.io/aws-geolocation-country-code": "IT", 390 "external-dns.alpha.kubernetes.io/set-identifier": "identifier-annotated", 391 }, 392 }, 393 } 394 395 func TestGlooSource(t *testing.T) { 396 t.Parallel() 397 398 fakeKubernetesClient := fakeKube.NewSimpleClientset() 399 fakeDynamicClient := fakeDynamic.NewSimpleDynamicClientWithCustomListKinds(runtime.NewScheme(), 400 map[schema.GroupVersionResource]string{ 401 proxyGVR: "ProxyList", 402 }) 403 404 source, err := NewGlooSource(fakeDynamicClient, fakeKubernetesClient, []string{defaultGlooNamespace}) 405 assert.NoError(t, err) 406 assert.NotNil(t, source) 407 408 internalProxyUnstructured := unstructured.Unstructured{} 409 externalProxyUnstructured := unstructured.Unstructured{} 410 proxyMetadataStaticUnstructured := unstructured.Unstructured{} 411 targetAnnotatedProxyUnstructured := unstructured.Unstructured{} 412 413 internalProxySourceUnstructured := unstructured.Unstructured{} 414 externalProxySourceUnstructured := unstructured.Unstructured{} 415 proxyMetadataStaticSourceUnstructured := unstructured.Unstructured{} 416 targetAnnotatedProxySourceUnstructured := unstructured.Unstructured{} 417 418 internalProxyAsJSON, err := json.Marshal(internalProxy) 419 assert.NoError(t, err) 420 421 externalProxyAsJSON, err := json.Marshal(externalProxy) 422 assert.NoError(t, err) 423 424 proxyMetadataStaticAsJSON, err := json.Marshal(proxyMetadataStatic) 425 assert.NoError(t, err) 426 427 targetAnnotatedProxyAsJSON, err := json.Marshal(targetAnnotatedProxy) 428 assert.NoError(t, err) 429 430 internalProxySvcAsJSON, err := json.Marshal(internalProxySource) 431 assert.NoError(t, err) 432 433 externalProxySvcAsJSON, err := json.Marshal(externalProxySource) 434 assert.NoError(t, err) 435 436 proxyMetadataStaticSvcAsJSON, err := json.Marshal(proxyMetadataStaticSource) 437 assert.NoError(t, err) 438 439 targetAnnotatedProxySvcAsJSON, err := json.Marshal(targetAnnotatedProxySource) 440 assert.NoError(t, err) 441 442 assert.NoError(t, internalProxyUnstructured.UnmarshalJSON(internalProxyAsJSON)) 443 assert.NoError(t, externalProxyUnstructured.UnmarshalJSON(externalProxyAsJSON)) 444 assert.NoError(t, proxyMetadataStaticUnstructured.UnmarshalJSON(proxyMetadataStaticAsJSON)) 445 assert.NoError(t, targetAnnotatedProxyUnstructured.UnmarshalJSON(targetAnnotatedProxyAsJSON)) 446 447 assert.NoError(t, internalProxySourceUnstructured.UnmarshalJSON(internalProxySvcAsJSON)) 448 assert.NoError(t, externalProxySourceUnstructured.UnmarshalJSON(externalProxySvcAsJSON)) 449 assert.NoError(t, proxyMetadataStaticSourceUnstructured.UnmarshalJSON(proxyMetadataStaticSvcAsJSON)) 450 assert.NoError(t, targetAnnotatedProxySourceUnstructured.UnmarshalJSON(targetAnnotatedProxySvcAsJSON)) 451 452 // Create proxy resources 453 _, err = fakeDynamicClient.Resource(proxyGVR).Namespace(defaultGlooNamespace).Create(context.Background(), &internalProxyUnstructured, metav1.CreateOptions{}) 454 assert.NoError(t, err) 455 _, err = fakeDynamicClient.Resource(proxyGVR).Namespace(defaultGlooNamespace).Create(context.Background(), &externalProxyUnstructured, metav1.CreateOptions{}) 456 assert.NoError(t, err) 457 _, err = fakeDynamicClient.Resource(proxyGVR).Namespace(defaultGlooNamespace).Create(context.Background(), &proxyMetadataStaticUnstructured, metav1.CreateOptions{}) 458 assert.NoError(t, err) 459 _, err = fakeDynamicClient.Resource(proxyGVR).Namespace(defaultGlooNamespace).Create(context.Background(), &targetAnnotatedProxyUnstructured, metav1.CreateOptions{}) 460 assert.NoError(t, err) 461 462 // Create proxy source 463 _, err = fakeDynamicClient.Resource(virtualServiceGVR).Namespace(internalProxySource.Namespace).Create(context.Background(), &internalProxySourceUnstructured, metav1.CreateOptions{}) 464 assert.NoError(t, err) 465 _, err = fakeDynamicClient.Resource(virtualServiceGVR).Namespace(externalProxySource.Namespace).Create(context.Background(), &externalProxySourceUnstructured, metav1.CreateOptions{}) 466 assert.NoError(t, err) 467 _, err = fakeDynamicClient.Resource(virtualServiceGVR).Namespace(proxyMetadataStaticSource.Namespace).Create(context.Background(), &proxyMetadataStaticSourceUnstructured, metav1.CreateOptions{}) 468 assert.NoError(t, err) 469 _, err = fakeDynamicClient.Resource(virtualServiceGVR).Namespace(targetAnnotatedProxySource.Namespace).Create(context.Background(), &targetAnnotatedProxySourceUnstructured, metav1.CreateOptions{}) 470 assert.NoError(t, err) 471 472 // Create proxy service resources 473 _, err = fakeKubernetesClient.CoreV1().Services(internalProxySvc.GetNamespace()).Create(context.Background(), &internalProxySvc, metav1.CreateOptions{}) 474 assert.NoError(t, err) 475 _, err = fakeKubernetesClient.CoreV1().Services(externalProxySvc.GetNamespace()).Create(context.Background(), &externalProxySvc, metav1.CreateOptions{}) 476 assert.NoError(t, err) 477 _, err = fakeKubernetesClient.CoreV1().Services(proxyMetadataStaticSvc.GetNamespace()).Create(context.Background(), &proxyMetadataStaticSvc, metav1.CreateOptions{}) 478 assert.NoError(t, err) 479 _, err = fakeKubernetesClient.CoreV1().Services(targetAnnotatedProxySvc.GetNamespace()).Create(context.Background(), &targetAnnotatedProxySvc, metav1.CreateOptions{}) 480 assert.NoError(t, err) 481 482 endpoints, err := source.Endpoints(context.Background()) 483 assert.NoError(t, err) 484 assert.Len(t, endpoints, 10) 485 assert.ElementsMatch(t, endpoints, []*endpoint.Endpoint{ 486 { 487 DNSName: "a.test", 488 Targets: []string{internalProxySvc.Status.LoadBalancer.Ingress[0].IP, internalProxySvc.Status.LoadBalancer.Ingress[1].IP, internalProxySvc.Status.LoadBalancer.Ingress[2].IP}, 489 RecordType: endpoint.RecordTypeA, 490 RecordTTL: 0, 491 Labels: endpoint.Labels{}, 492 ProviderSpecific: endpoint.ProviderSpecific{}, 493 }, 494 { 495 DNSName: "b.test", 496 Targets: []string{internalProxySvc.Status.LoadBalancer.Ingress[0].IP, internalProxySvc.Status.LoadBalancer.Ingress[1].IP, internalProxySvc.Status.LoadBalancer.Ingress[2].IP}, 497 RecordType: endpoint.RecordTypeA, 498 RecordTTL: 0, 499 Labels: endpoint.Labels{}, 500 ProviderSpecific: endpoint.ProviderSpecific{}, 501 }, 502 { 503 DNSName: "c.test", 504 Targets: []string{internalProxySvc.Status.LoadBalancer.Ingress[0].IP, internalProxySvc.Status.LoadBalancer.Ingress[1].IP, internalProxySvc.Status.LoadBalancer.Ingress[2].IP}, 505 RecordType: endpoint.RecordTypeA, 506 SetIdentifier: "identifier", 507 RecordTTL: 42, 508 Labels: endpoint.Labels{}, 509 ProviderSpecific: endpoint.ProviderSpecific{ 510 endpoint.ProviderSpecificProperty{ 511 Name: "aws/geolocation-country-code", 512 Value: "LU", 513 }, 514 }, 515 }, 516 { 517 DNSName: "d.test", 518 Targets: []string{externalProxySvc.Status.LoadBalancer.Ingress[0].Hostname, externalProxySvc.Status.LoadBalancer.Ingress[1].Hostname, externalProxySvc.Status.LoadBalancer.Ingress[2].Hostname}, 519 RecordType: endpoint.RecordTypeCNAME, 520 RecordTTL: 0, 521 Labels: endpoint.Labels{}, 522 ProviderSpecific: endpoint.ProviderSpecific{}, 523 }, 524 { 525 DNSName: "e.test", 526 Targets: []string{externalProxySvc.Status.LoadBalancer.Ingress[0].Hostname, externalProxySvc.Status.LoadBalancer.Ingress[1].Hostname, externalProxySvc.Status.LoadBalancer.Ingress[2].Hostname}, 527 RecordType: endpoint.RecordTypeCNAME, 528 SetIdentifier: "identifier-external", 529 RecordTTL: 24, 530 Labels: endpoint.Labels{}, 531 ProviderSpecific: endpoint.ProviderSpecific{ 532 endpoint.ProviderSpecificProperty{ 533 Name: "aws/geolocation-country-code", 534 Value: "JP", 535 }, 536 }, 537 }, 538 { 539 DNSName: "f.test", 540 Targets: []string{proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[0].IP, proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[1].IP, proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[2].IP}, 541 RecordType: endpoint.RecordTypeA, 542 RecordTTL: 0, 543 Labels: endpoint.Labels{}, 544 ProviderSpecific: endpoint.ProviderSpecific{}, 545 }, 546 { 547 DNSName: "g.test", 548 Targets: []string{proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[0].IP, proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[1].IP, proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[2].IP}, 549 RecordType: endpoint.RecordTypeA, 550 RecordTTL: 0, 551 Labels: endpoint.Labels{}, 552 ProviderSpecific: endpoint.ProviderSpecific{}, 553 }, 554 { 555 DNSName: "h.test", 556 Targets: []string{proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[0].IP, proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[1].IP, proxyMetadataStaticSvc.Status.LoadBalancer.Ingress[2].IP}, 557 RecordType: endpoint.RecordTypeA, 558 SetIdentifier: "identifier", 559 RecordTTL: 420, 560 Labels: endpoint.Labels{}, 561 ProviderSpecific: endpoint.ProviderSpecific{ 562 endpoint.ProviderSpecificProperty{ 563 Name: "aws/geolocation-country-code", 564 Value: "ES", 565 }, 566 }, 567 }, 568 { 569 DNSName: "i.test", 570 Targets: []string{"203.2.45.7"}, 571 RecordType: endpoint.RecordTypeA, 572 Labels: endpoint.Labels{}, 573 ProviderSpecific: endpoint.ProviderSpecific{}, 574 }, 575 { 576 DNSName: "j.test", 577 Targets: []string{"203.2.45.7"}, 578 RecordType: endpoint.RecordTypeA, 579 SetIdentifier: "identifier-annotated", 580 RecordTTL: 460, 581 Labels: endpoint.Labels{}, 582 ProviderSpecific: endpoint.ProviderSpecific{ 583 endpoint.ProviderSpecificProperty{ 584 Name: "aws/geolocation-country-code", 585 Value: "IT", 586 }, 587 }, 588 }, 589 }) 590 }