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

     1  package checkers
     2  
     3  import (
     4  	networking_v1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1"
     5  
     6  	"github.com/kiali/kiali/business/checkers/common"
     7  	"github.com/kiali/kiali/business/checkers/virtualservices"
     8  	"github.com/kiali/kiali/models"
     9  )
    10  
    11  const VirtualCheckerType = "virtualservice"
    12  
    13  type VirtualServiceChecker struct {
    14  	Namespaces       models.Namespaces
    15  	Cluster          string
    16  	VirtualServices  []*networking_v1beta1.VirtualService
    17  	DestinationRules []*networking_v1beta1.DestinationRule
    18  }
    19  
    20  // An Object Checker runs all checkers for an specific object type (i.e.: pod, route rule,...)
    21  // It run two kinds of checkers:
    22  // 1. Individual checks: validating individual objects.
    23  // 2. Group checks: validating behaviour between configurations.
    24  func (in VirtualServiceChecker) Check() models.IstioValidations {
    25  	validations := models.IstioValidations{}
    26  
    27  	validations = validations.MergeValidations(in.runIndividualChecks())
    28  	validations = validations.MergeValidations(in.runGroupChecks())
    29  
    30  	return validations
    31  }
    32  
    33  // Runs individual checks for each virtual service
    34  func (in VirtualServiceChecker) runIndividualChecks() models.IstioValidations {
    35  	validations := models.IstioValidations{}
    36  
    37  	for _, virtualService := range in.VirtualServices {
    38  		validations.MergeValidations(in.runChecks(virtualService))
    39  	}
    40  
    41  	return validations
    42  }
    43  
    44  // runGroupChecks runs group checks for all virtual services
    45  func (in VirtualServiceChecker) runGroupChecks() models.IstioValidations {
    46  	validations := models.IstioValidations{}
    47  
    48  	enabledCheckers := []GroupChecker{
    49  		virtualservices.SingleHostChecker{Namespaces: in.Namespaces, VirtualServices: in.VirtualServices, Cluster: in.Cluster},
    50  	}
    51  
    52  	for _, checker := range enabledCheckers {
    53  		validations = validations.MergeValidations(checker.Check())
    54  	}
    55  
    56  	return validations
    57  }
    58  
    59  // runChecks runs all the individual checks for a single virtual service and appends the result into validations.
    60  func (in VirtualServiceChecker) runChecks(virtualService *networking_v1beta1.VirtualService) models.IstioValidations {
    61  	virtualServiceName := virtualService.Name
    62  	key, rrValidation := EmptyValidValidation(virtualServiceName, virtualService.Namespace, VirtualCheckerType, in.Cluster)
    63  
    64  	enabledCheckers := []Checker{
    65  		virtualservices.RouteChecker{VirtualService: virtualService, Namespaces: in.Namespaces.GetNames()},
    66  		virtualservices.SubsetPresenceChecker{Namespaces: in.Namespaces.GetNames(), VirtualService: virtualService, DestinationRules: in.DestinationRules},
    67  	}
    68  	if !in.Namespaces.IsNamespaceAmbient(virtualService.Namespace, in.Cluster) {
    69  		enabledCheckers = append(enabledCheckers, common.ExportToNamespaceChecker{ExportTo: virtualService.Spec.ExportTo, Namespaces: in.Namespaces})
    70  	}
    71  
    72  	for _, checker := range enabledCheckers {
    73  		checks, validChecker := checker.Check()
    74  		rrValidation.Checks = append(rrValidation.Checks, checks...)
    75  		rrValidation.Valid = rrValidation.Valid && validChecker
    76  	}
    77  
    78  	return models.IstioValidations{key: rrValidation}
    79  }