github.com/kiali/kiali@v1.84.0/business/checkers/virtual_service_checker_test.go (about) 1 package checkers 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 networking_v1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1" 8 9 "github.com/kiali/kiali/config" 10 "github.com/kiali/kiali/models" 11 "github.com/kiali/kiali/tests/data" 12 ) 13 14 func prepareTestForVirtualService(vs *networking_v1beta1.VirtualService) models.IstioValidations { 15 vss := []*networking_v1beta1.VirtualService{vs} 16 17 // Setup mocks 18 destinationList := []*networking_v1beta1.DestinationRule{ 19 data.CreateTestDestinationRule("bookinfo", "reviewsrule", "reviews"), 20 } 21 22 virtualServiceChecker := VirtualServiceChecker{ 23 DestinationRules: destinationList, 24 VirtualServices: vss, 25 } 26 27 return virtualServiceChecker.Check() 28 } 29 30 func TestWellVirtualServiceValidation(t *testing.T) { 31 assert := assert.New(t) 32 conf := config.NewConfig() 33 config.Set(conf) 34 35 // Setup mocks 36 validations := prepareTestForVirtualService(fakeVirtualServices()) 37 assert.NotEmpty(validations) 38 39 // Well configured object 40 validation, ok := validations[models.IstioValidationKey{ObjectType: "virtualservice", Namespace: "bookinfo", Name: "reviews-well"}] 41 assert.True(ok) 42 assert.Equal(validation.Name, "reviews-well") 43 assert.Equal(validation.ObjectType, "virtualservice") 44 assert.True(validation.Valid) 45 assert.Len(validation.Checks, 0) 46 } 47 48 func TestVirtualServiceMultipleCheck(t *testing.T) { 49 assert := assert.New(t) 50 51 // Setup mocks 52 validations := prepareTestForVirtualService(fakeVirtualServicesMultipleChecks()) 53 assert.NotEmpty(validations) 54 55 // route rule with multiple problems 56 validation, ok := validations[models.IstioValidationKey{ObjectType: "virtualservice", Namespace: "bookinfo", Name: "reviews-multiple"}] 57 assert.True(ok) 58 assert.Equal(validation.Name, "reviews-multiple") 59 assert.Equal(validation.ObjectType, "virtualservice") 60 assert.True(validation.Valid) 61 assert.Len(validation.Checks, 2) 62 } 63 64 func TestVirtualServiceMixedChecker(t *testing.T) { 65 assert := assert.New(t) 66 67 // Setup mocks 68 validations := prepareTestForVirtualService(fakeVirtualServiceMixedChecker()) 69 assert.NotEmpty(validations) 70 71 // Precedence is incorrect 72 validation, ok := validations[models.IstioValidationKey{ObjectType: "virtualservice", Namespace: "bookinfo", Name: "reviews-mixed"}] 73 assert.True(ok) 74 assert.Equal(validation.Name, "reviews-mixed") 75 assert.Equal(validation.ObjectType, "virtualservice") 76 assert.True(validation.Valid) 77 assert.Len(validation.Checks, 2) 78 } 79 80 func TestVirtualServiceMultipleIstioObjects(t *testing.T) { 81 assert := assert.New(t) 82 83 // Setup mocks 84 destinationList := []*networking_v1beta1.DestinationRule{ 85 data.CreateTestDestinationRule("bookinfo", "reviewsrule1", "reviews"), 86 } 87 88 virtualServiceChecker := VirtualServiceChecker{ 89 DestinationRules: destinationList, 90 VirtualServices: fakeVirtualServiceMultipleIstioObjects(), 91 } 92 93 validations := virtualServiceChecker.Check() 94 assert.NotEmpty(validations) 95 96 validation, ok := validations[models.IstioValidationKey{ObjectType: "virtualservice", Namespace: "bookinfo", Name: "reviews-mixed"}] 97 assert.True(ok) 98 assert.Equal(validation.Name, "reviews-mixed") 99 assert.Equal(validation.ObjectType, "virtualservice") 100 assert.True(validation.Valid) 101 assert.Len(validation.Checks, 2) 102 103 validation, ok = validations[models.IstioValidationKey{ObjectType: "virtualservice", Namespace: "bookinfo", Name: "reviews-multiple"}] 104 assert.True(ok) 105 assert.Equal(validation.Name, "reviews-multiple") 106 assert.Equal(validation.ObjectType, "virtualservice") 107 assert.True(validation.Valid) 108 assert.Len(validation.Checks, 2) 109 } 110 111 func fakeVirtualServices() *networking_v1beta1.VirtualService { 112 validVirtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v1", 55), 113 data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v2", 45), 114 data.CreateEmptyVirtualService("reviews-well", "bookinfo", []string{"reviews.prod.svc.cluster.local"}), 115 ), 116 ) 117 118 return validVirtualService 119 } 120 121 func fakeVirtualServicesMultipleChecks() *networking_v1beta1.VirtualService { 122 virtualService := data.CreateEmptyVirtualService("reviews-multiple", "bookinfo", []string{}) 123 validVirtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v1", 55), virtualService) 124 validVirtualService = data.AddTcpRoutesToVirtualService(data.CreateTcpRoute("reviews", "v2", 55), 125 validVirtualService) 126 validVirtualService.Spec.Hosts = nil 127 128 return validVirtualService 129 } 130 131 func fakeVirtualServiceMixedChecker() *networking_v1beta1.VirtualService { 132 validVirtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v4", 05), 133 data.CreateEmptyVirtualService("reviews-mixed", "bookinfo", []string{}), 134 ) 135 validVirtualService.Spec.Hosts = nil 136 137 return validVirtualService 138 } 139 140 func fakeVirtualServiceMultipleIstioObjects() []*networking_v1beta1.VirtualService { 141 return []*networking_v1beta1.VirtualService{fakeVirtualServiceMixedChecker(), fakeVirtualServicesMultipleChecks()} 142 }