Merge pull request #2215 from abursavich/istio-informer

Istio: Use existing VirtualService informer
This commit is contained in:
Kubernetes Prow Robot 2022-05-12 05:33:14 -07:00 committed by GitHub
commit 379fe6f554
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 22 deletions

View File

@ -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)

View File

@ -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
}