mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-06 01:26:59 +02:00
Merge pull request #2215 from abursavich/istio-informer
Istio: Use existing VirtualService informer
This commit is contained in:
commit
379fe6f554
@ -77,7 +77,7 @@ func NewIstioVirtualServiceSource(
|
||||
// Set resync period to 0, to prevent processing when nothing has changed
|
||||
informerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, 0, kubeinformers.WithNamespace(namespace))
|
||||
serviceInformer := informerFactory.Core().V1().Services()
|
||||
istioInformerFactory := istioinformers.NewSharedInformerFactory(istioClient, 0)
|
||||
istioInformerFactory := istioinformers.NewSharedInformerFactoryWithOptions(istioClient, 0, istioinformers.WithNamespace(namespace))
|
||||
virtualServiceInformer := istioInformerFactory.Networking().V1alpha3().VirtualServices()
|
||||
|
||||
// Add default resource event handlers to properly initialize informer.
|
||||
@ -124,12 +124,10 @@ func NewIstioVirtualServiceSource(
|
||||
// Endpoints returns endpoint objects for each host-target combination that should be processed.
|
||||
// Retrieves all VirtualService resources in the source's namespace(s).
|
||||
func (sc *virtualServiceSource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint, error) {
|
||||
virtualServiceList, err := sc.istioClient.NetworkingV1alpha3().VirtualServices(sc.namespace).List(ctx, metav1.ListOptions{})
|
||||
virtualServices, err := sc.virtualserviceInformer.Lister().VirtualServices(sc.namespace).List(labels.Everything())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
virtualServices := virtualServiceList.Items
|
||||
virtualServices, err = sc.filterByAnnotations(virtualServices)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -189,7 +187,7 @@ func (sc *virtualServiceSource) AddEventHandler(ctx context.Context, handler fun
|
||||
sc.virtualserviceInformer.Informer().AddEventHandler(eventHandlerFunc(handler))
|
||||
}
|
||||
|
||||
func (sc *virtualServiceSource) getGateway(ctx context.Context, gatewayStr string, virtualService networkingv1alpha3.VirtualService) *networkingv1alpha3.Gateway {
|
||||
func (sc *virtualServiceSource) getGateway(ctx context.Context, gatewayStr string, virtualService *networkingv1alpha3.VirtualService) *networkingv1alpha3.Gateway {
|
||||
if gatewayStr == "" || gatewayStr == IstioMeshGateway {
|
||||
// This refers to "all sidecars in the mesh"; ignore.
|
||||
return nil
|
||||
@ -217,8 +215,8 @@ func (sc *virtualServiceSource) getGateway(ctx context.Context, gatewayStr strin
|
||||
return gateway
|
||||
}
|
||||
|
||||
func (sc *virtualServiceSource) endpointsFromTemplate(ctx context.Context, virtualService networkingv1alpha3.VirtualService) ([]*endpoint.Endpoint, error) {
|
||||
hostnames, err := execTemplate(sc.fqdnTemplate, &virtualService)
|
||||
func (sc *virtualServiceSource) endpointsFromTemplate(ctx context.Context, virtualService *networkingv1alpha3.VirtualService) ([]*endpoint.Endpoint, error) {
|
||||
hostnames, err := execTemplate(sc.fqdnTemplate, virtualService)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -242,7 +240,7 @@ func (sc *virtualServiceSource) endpointsFromTemplate(ctx context.Context, virtu
|
||||
}
|
||||
|
||||
// filterByAnnotations filters a list of configs by a given annotation selector.
|
||||
func (sc *virtualServiceSource) filterByAnnotations(virtualservices []networkingv1alpha3.VirtualService) ([]networkingv1alpha3.VirtualService, error) {
|
||||
func (sc *virtualServiceSource) filterByAnnotations(virtualservices []*networkingv1alpha3.VirtualService) ([]*networkingv1alpha3.VirtualService, error) {
|
||||
labelSelector, err := metav1.ParseToLabelSelector(sc.annotationFilter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -257,7 +255,7 @@ func (sc *virtualServiceSource) filterByAnnotations(virtualservices []networking
|
||||
return virtualservices, nil
|
||||
}
|
||||
|
||||
var filteredList []networkingv1alpha3.VirtualService
|
||||
var filteredList []*networkingv1alpha3.VirtualService
|
||||
|
||||
for _, virtualservice := range virtualservices {
|
||||
// convert the annotations to an equivalent label selector
|
||||
@ -272,7 +270,7 @@ func (sc *virtualServiceSource) filterByAnnotations(virtualservices []networking
|
||||
return filteredList, nil
|
||||
}
|
||||
|
||||
func (sc *virtualServiceSource) setResourceLabel(virtualservice networkingv1alpha3.VirtualService, endpoints []*endpoint.Endpoint) {
|
||||
func (sc *virtualServiceSource) setResourceLabel(virtualservice *networkingv1alpha3.VirtualService, endpoints []*endpoint.Endpoint) {
|
||||
for _, ep := range endpoints {
|
||||
ep.Labels[endpoint.ResourceLabelKey] = fmt.Sprintf("virtualservice/%s/%s", virtualservice.Namespace, virtualservice.Name)
|
||||
}
|
||||
@ -288,7 +286,7 @@ func appendUnique(targets []string, target string) []string {
|
||||
return append(targets, target)
|
||||
}
|
||||
|
||||
func (sc *virtualServiceSource) targetsFromVirtualService(ctx context.Context, virtualService networkingv1alpha3.VirtualService, vsHost string) ([]string, error) {
|
||||
func (sc *virtualServiceSource) targetsFromVirtualService(ctx context.Context, virtualService *networkingv1alpha3.VirtualService, vsHost string) ([]string, error) {
|
||||
var targets []string
|
||||
// for each host we need to iterate through the gateways because each host might match for only one of the gateways
|
||||
for _, gateway := range virtualService.Spec.Gateways {
|
||||
@ -296,7 +294,7 @@ func (sc *virtualServiceSource) targetsFromVirtualService(ctx context.Context, v
|
||||
if gateway == nil {
|
||||
continue
|
||||
}
|
||||
if !virtualServiceBindsToGateway(&virtualService, gateway, vsHost) {
|
||||
if !virtualServiceBindsToGateway(virtualService, gateway, vsHost) {
|
||||
continue
|
||||
}
|
||||
tgs, err := sc.targetsFromGateway(gateway)
|
||||
@ -312,7 +310,7 @@ func (sc *virtualServiceSource) targetsFromVirtualService(ctx context.Context, v
|
||||
}
|
||||
|
||||
// endpointsFromVirtualService extracts the endpoints from an Istio VirtualService Config object
|
||||
func (sc *virtualServiceSource) endpointsFromVirtualService(ctx context.Context, virtualservice networkingv1alpha3.VirtualService) ([]*endpoint.Endpoint, error) {
|
||||
func (sc *virtualServiceSource) endpointsFromVirtualService(ctx context.Context, virtualservice *networkingv1alpha3.VirtualService) ([]*endpoint.Endpoint, error) {
|
||||
var endpoints []*endpoint.Endpoint
|
||||
|
||||
ttl, err := getTTLFromAnnotations(virtualservice.Annotations)
|
||||
|
@ -43,7 +43,7 @@ type VirtualServiceSuite struct {
|
||||
source Source
|
||||
lbServices []*v1.Service
|
||||
gwconfig networkingv1alpha3.Gateway
|
||||
vsconfig networkingv1alpha3.VirtualService
|
||||
vsconfig *networkingv1alpha3.VirtualService
|
||||
}
|
||||
|
||||
func (suite *VirtualServiceSuite) SetupTest() {
|
||||
@ -85,7 +85,7 @@ func (suite *VirtualServiceSuite) SetupTest() {
|
||||
gateways: []string{"istio-system/foo-gateway-with-targets"},
|
||||
dnsnames: []string{"foo"},
|
||||
}).Config()
|
||||
_, err = fakeIstioClient.NetworkingV1alpha3().VirtualServices(suite.vsconfig.Namespace).Create(context.Background(), &suite.vsconfig, metav1.CreateOptions{})
|
||||
_, err = fakeIstioClient.NetworkingV1alpha3().VirtualServices(suite.vsconfig.Namespace).Create(context.Background(), suite.vsconfig, metav1.CreateOptions{})
|
||||
suite.NoError(err, "should succeed")
|
||||
|
||||
suite.source, err = NewIstioVirtualServiceSource(
|
||||
@ -362,7 +362,7 @@ func testVirtualServiceBindsToGateway(t *testing.T) {
|
||||
t.Run(ti.title, func(t *testing.T) {
|
||||
vsconfig := ti.vsconfig.Config()
|
||||
gwconfig := ti.gwconfig.Config()
|
||||
require.Equal(t, ti.expected, virtualServiceBindsToGateway(&vsconfig, &gwconfig, ti.vsHost))
|
||||
require.Equal(t, ti.expected, virtualServiceBindsToGateway(vsconfig, &gwconfig, ti.vsHost))
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -1454,7 +1454,7 @@ func testVirtualServiceEndpoints(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var gateways []networkingv1alpha3.Gateway
|
||||
var virtualservices []networkingv1alpha3.VirtualService
|
||||
var virtualservices []*networkingv1alpha3.VirtualService
|
||||
|
||||
for _, gwItem := range ti.gwConfigs {
|
||||
gateways = append(gateways, gwItem.Config())
|
||||
@ -1479,7 +1479,7 @@ func testVirtualServiceEndpoints(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, virtualservice := range virtualservices {
|
||||
_, err := fakeIstioClient.NetworkingV1alpha3().VirtualServices(virtualservice.Namespace).Create(context.Background(), &virtualservice, metav1.CreateOptions{})
|
||||
_, err := fakeIstioClient.NetworkingV1alpha3().VirtualServices(virtualservice.Namespace).Create(context.Background(), virtualservice, metav1.CreateOptions{})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
@ -1590,7 +1590,7 @@ type fakeVirtualServiceConfig struct {
|
||||
exportTo string
|
||||
}
|
||||
|
||||
func (c fakeVirtualServiceConfig) Config() networkingv1alpha3.VirtualService {
|
||||
func (c fakeVirtualServiceConfig) Config() *networkingv1alpha3.VirtualService {
|
||||
vs := istionetworking.VirtualService{
|
||||
Gateways: c.gateways,
|
||||
Hosts: c.dnsnames,
|
||||
@ -1599,7 +1599,7 @@ func (c fakeVirtualServiceConfig) Config() networkingv1alpha3.VirtualService {
|
||||
vs.ExportTo = []string{c.exportTo}
|
||||
}
|
||||
|
||||
config := networkingv1alpha3.VirtualService{
|
||||
return &networkingv1alpha3.VirtualService{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: c.name,
|
||||
Namespace: c.namespace,
|
||||
@ -1607,6 +1607,4 @@ func (c fakeVirtualServiceConfig) Config() networkingv1alpha3.VirtualService {
|
||||
},
|
||||
Spec: vs,
|
||||
}
|
||||
|
||||
return config
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user