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 }