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  }