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  }