github.com/kiali/kiali@v1.84.0/business/checkers/serviceentries/workload_entry_address_match.go (about)

     1  package serviceentries
     2  
     3  import (
     4  	networking_v1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1"
     5  	"k8s.io/apimachinery/pkg/labels"
     6  
     7  	"github.com/kiali/kiali/models"
     8  )
     9  
    10  type HasMatchingWorkloadEntryAddress struct {
    11  	ServiceEntry    *networking_v1beta1.ServiceEntry
    12  	WorkloadEntries map[string][]string
    13  }
    14  
    15  const MeshInternal = 1
    16  
    17  func (in HasMatchingWorkloadEntryAddress) Check() ([]*models.IstioCheck, bool) {
    18  	validations := make([]*models.IstioCheck, 0)
    19  
    20  	if in.ServiceEntry.Spec.Location != MeshInternal {
    21  		return validations, true
    22  	}
    23  
    24  	if in.ServiceEntry.Spec.WorkloadSelector == nil {
    25  		return validations, true
    26  	}
    27  
    28  	var targetAddresses []string
    29  	seSelector := labels.Set(in.ServiceEntry.Spec.WorkloadSelector.Labels).AsSelector()
    30  
    31  	for labelsMap, weAddressMap := range in.WorkloadEntries {
    32  		workloadLabelsSet, err := labels.ConvertSelectorToLabelsMap(labelsMap)
    33  		if err != nil {
    34  			continue
    35  		}
    36  
    37  		if seSelector.Matches(workloadLabelsSet) {
    38  			targetAddresses = append(targetAddresses, weAddressMap...)
    39  		}
    40  	}
    41  
    42  	if targetAddresses == nil {
    43  		return validations, true
    44  	}
    45  
    46  	seAddresses := in.ServiceEntryAddressMap()
    47  
    48  	for _, weAddress := range targetAddresses {
    49  		if _, found := seAddresses[weAddress]; !found {
    50  			// Add validation: WorkloadEntry.Address should be part of the Service Entry Addresses list
    51  			validation := models.Build("serviceentries.workloadentries.addressmatch", "spec/addresses")
    52  			validations = append(validations, &validation)
    53  		}
    54  	}
    55  
    56  	return validations, true
    57  }
    58  
    59  func GroupWorkloadEntriesByLabels(workloads []*networking_v1beta1.WorkloadEntry) map[string][]string {
    60  	workloadEntriesMap := map[string][]string{}
    61  	for _, we := range workloads {
    62  		selector := labels.Set(we.Spec.Labels).String()
    63  		workloadEntriesMap[selector] = append(workloadEntriesMap[selector], we.Spec.Address)
    64  	}
    65  	return workloadEntriesMap
    66  }
    67  
    68  func (in HasMatchingWorkloadEntryAddress) ServiceEntryAddressMap() map[string]bool {
    69  	addrMap := map[string]bool{}
    70  	for _, addr := range in.ServiceEntry.Spec.Addresses {
    71  		addrMap[addr] = false
    72  	}
    73  	return addrMap
    74  }