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

     1  package virtualservices
     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/models"
    10  	"github.com/kiali/kiali/tests/data"
    11  	"github.com/kiali/kiali/tests/testutils/validations"
    12  )
    13  
    14  // VirtualService has two routes that all the weights sum 100
    15  func TestServiceWellVirtualServiceValidation(t *testing.T) {
    16  	assert := assert.New(t)
    17  
    18  	// Setup mocks
    19  	vals, valid := RouteChecker{
    20  		Namespaces:     []string{"test"},
    21  		VirtualService: fakeValidVirtualService(),
    22  	}.Check()
    23  
    24  	// Well configured object
    25  	assert.True(valid)
    26  	assert.Empty(vals)
    27  }
    28  
    29  // VirtualService with one route and a weight between 0 and 100
    30  func TestServiceMultipleChecks(t *testing.T) {
    31  	assert := assert.New(t)
    32  
    33  	vals, valid := RouteChecker{
    34  		Namespaces:     []string{"test"},
    35  		VirtualService: fakeOneRouteUnder100(),
    36  	}.Check()
    37  
    38  	// wrong weight'ed route rule
    39  	assert.True(valid)
    40  	assert.NotEmpty(vals)
    41  	assert.Len(vals, 1)
    42  	assert.NoError(validations.ConfirmIstioCheckMessage("virtualservices.route.singleweight", vals[0]))
    43  	assert.Equal(vals[0].Severity, models.WarningSeverity)
    44  	assert.Equal(vals[0].Path, "spec/http[0]/route[0]/weight")
    45  }
    46  
    47  func TestVSWithRepeatingSubsets(t *testing.T) {
    48  	assert := assert.New(t)
    49  
    50  	vals, valid := RouteChecker{
    51  		Namespaces:     []string{"test"},
    52  		VirtualService: fakeRepeatedSubset(),
    53  	}.Check()
    54  	assert.True(valid)
    55  	assert.NotEmpty(vals)
    56  	assert.Len(vals, 4)
    57  	assert.NoError(validations.ConfirmIstioCheckMessage("virtualservices.route.repeatedsubset", vals[0]))
    58  	assert.Equal(vals[0].Severity, models.WarningSeverity)
    59  	assert.Regexp(`spec\/http\[0\]\/route\[[0,2]\]\/host`, vals[0].Path)
    60  	assert.NoError(validations.ConfirmIstioCheckMessage("virtualservices.route.repeatedsubset", vals[3]))
    61  	assert.Equal(vals[3].Severity, models.WarningSeverity)
    62  	assert.Regexp(`spec\/http\[0\]\/route\[[1,3]\]\/host`, vals[3].Path)
    63  }
    64  
    65  func TestVSWithRepeatingHostsNoSubsets(t *testing.T) {
    66  	assert := assert.New(t)
    67  
    68  	vals, valid := RouteChecker{
    69  		Namespaces:     []string{"test"},
    70  		VirtualService: fakeRepeatedHosts(),
    71  	}.Check()
    72  	assert.True(valid)
    73  	assert.NotEmpty(vals)
    74  	assert.Len(vals, 4)
    75  	assert.NoError(validations.ConfirmIstioCheckMessage("virtualservices.route.repeatedsubset", vals[0]))
    76  	assert.Equal(vals[0].Severity, models.WarningSeverity)
    77  	assert.Regexp(`spec\/http\[0\]\/route\[[0,2]\]\/host`, vals[0].Path)
    78  	assert.NoError(validations.ConfirmIstioCheckMessage("virtualservices.route.repeatedsubset", vals[3]))
    79  	assert.Equal(vals[3].Severity, models.WarningSeverity)
    80  	assert.Regexp(`spec\/http\[0\]\/route\[[1,3]\]\/host`, vals[3].Path)
    81  }
    82  
    83  func fakeValidVirtualService() *networking_v1beta1.VirtualService {
    84  	validVirtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v1", 55),
    85  		data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v2", 45),
    86  			data.CreateEmptyVirtualService("reviews-well", "test", []string{"reviews"}),
    87  		),
    88  	)
    89  
    90  	return validVirtualService
    91  }
    92  
    93  func fakeOneRouteUnder100() *networking_v1beta1.VirtualService {
    94  	virtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v1", 45),
    95  		data.CreateEmptyVirtualService("reviews-multiple", "test", []string{"reviews"}),
    96  	)
    97  
    98  	return virtualService
    99  }
   100  
   101  func fakeRepeatedSubset() *networking_v1beta1.VirtualService {
   102  	validVirtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v1", 55),
   103  		data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v1", 45),
   104  			data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v2", 55),
   105  				data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews", "v2", 45),
   106  					data.CreateEmptyVirtualService("reviews-repeated", "test", []string{"reviews"}),
   107  				),
   108  			),
   109  		),
   110  	)
   111  
   112  	return validVirtualService
   113  }
   114  
   115  func fakeRepeatedHosts() *networking_v1beta1.VirtualService {
   116  	validVirtualService := data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews.test.svc.cluster.local", "", 55),
   117  		data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews.test.svc.cluster.local", "", 45),
   118  			data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews.test.svc.cluster.local", "", 55),
   119  				data.AddHttpRoutesToVirtualService(data.CreateHttpRouteDestination("reviews.test.svc.cluster.local", "", 45),
   120  					data.CreateEmptyVirtualService("reviews-repeated", "test", []string{"reviews"}),
   121  				),
   122  			),
   123  		),
   124  	)
   125  
   126  	return validVirtualService
   127  }