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

     1  package common
     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  	"github.com/kiali/kiali/tests/testutils/validations"
    13  )
    14  
    15  func TestTwoSidecarsWithSelector(t *testing.T) {
    16  	assert := assert.New(t)
    17  
    18  	validations := SidecarSelectorMultiMatchChecker(
    19  		config.Get().KubernetesConfig.ClusterName,
    20  		"sidecar",
    21  		[]*networking_v1beta1.Sidecar{
    22  			data.AddSelectorToSidecar(map[string]string{
    23  				"app": "reviews",
    24  			}, data.CreateSidecar("sidecar1", "bookinfo")),
    25  			data.AddSelectorToSidecar(map[string]string{
    26  				"app": "details",
    27  			}, data.CreateSidecar("sidecar2", "bookinfo")),
    28  		},
    29  		workloadList(),
    30  	).Check()
    31  
    32  	assert.Empty(validations)
    33  }
    34  
    35  func TestTwoSidecarsWithoutSelector(t *testing.T) {
    36  	validations := SidecarSelectorMultiMatchChecker(
    37  		config.Get().KubernetesConfig.ClusterName,
    38  		"sidecar",
    39  		[]*networking_v1beta1.Sidecar{
    40  			data.CreateSidecar("sidecar1", "bookinfo"),
    41  			data.CreateSidecar("sidecar2", "bookinfo"),
    42  			data.CreateSidecar("sidecar3", "bookinfo2"),
    43  		},
    44  		workloadList(),
    45  	).Check()
    46  
    47  	assertMultimatchFailure(t, "generic.multimatch.selectorless", validations, "sidecar1", []string{"sidecar2"})
    48  	assertMultimatchFailure(t, "generic.multimatch.selectorless", validations, "sidecar2", []string{"sidecar1"})
    49  }
    50  
    51  func TestTwoSidecarsWithoutSelectorDifferentNamespaces(t *testing.T) {
    52  	assert := assert.New(t)
    53  
    54  	validations := SidecarSelectorMultiMatchChecker(
    55  		config.Get().KubernetesConfig.ClusterName,
    56  		"sidecar",
    57  		[]*networking_v1beta1.Sidecar{
    58  			data.CreateSidecar("sidecar1", "bookinfo"),
    59  			data.CreateSidecar("sidecar2", "bookinfo2"),
    60  		},
    61  		workloadList(),
    62  	).Check()
    63  
    64  	assert.Empty(validations)
    65  }
    66  
    67  func TestTwoSidecarsTargetingOneDeployment(t *testing.T) {
    68  	sidecars := []*networking_v1beta1.Sidecar{
    69  		data.AddSelectorToSidecar(map[string]string{
    70  			"app":     "details",
    71  			"version": "v1",
    72  		}, data.CreateSidecar("sidecar1", "bookinfo")),
    73  		data.AddSelectorToSidecar(map[string]string{
    74  			"app":     "reviews",
    75  			"version": "v1",
    76  		}, data.CreateSidecar("sidecar2", "bookinfo")),
    77  		data.AddSelectorToSidecar(map[string]string{
    78  			"app": "details",
    79  		}, data.CreateSidecar("sidecar3", "bookinfo")),
    80  		data.AddSelectorToSidecar(map[string]string{
    81  			"version": "v1",
    82  		}, data.CreateSidecar("sidecar4", "bookinfo")),
    83  	}
    84  	validations := SidecarSelectorMultiMatchChecker(
    85  		config.Get().KubernetesConfig.ClusterName,
    86  		"sidecar",
    87  		sidecars,
    88  		workloadList(),
    89  	).Check()
    90  
    91  	assertMultimatchFailure(t, "generic.multimatch.selector", validations, "sidecar1", []string{"sidecar3", "sidecar4"})
    92  	assertMultimatchFailure(t, "generic.multimatch.selector", validations, "sidecar3", []string{"sidecar1", "sidecar4"})
    93  	assertMultimatchFailure(t, "generic.multimatch.selector", validations, "sidecar4", []string{"sidecar1", "sidecar3"})
    94  }
    95  
    96  func TestSidecarsCrossNamespaces(t *testing.T) {
    97  	sidecars := []*networking_v1beta1.Sidecar{
    98  		data.AddSelectorToSidecar(map[string]string{
    99  			"app":     "details",
   100  			"version": "v1",
   101  		}, data.CreateSidecar("sidecar1", "bookinfo")),
   102  		data.AddSelectorToSidecar(map[string]string{
   103  			"app":     "details",
   104  			"version": "v1",
   105  		}, data.CreateSidecar("sidecar2", "bookinfo")),
   106  		data.AddSelectorToSidecar(map[string]string{
   107  			"app":     "details",
   108  			"version": "v1",
   109  		}, data.CreateSidecar("sidecar3", "bookinfo2")),
   110  		data.AddSelectorToSidecar(map[string]string{
   111  			"app":     "details",
   112  			"version": "v1",
   113  		}, data.CreateSidecar("sidecar4", "bookinfo2")),
   114  	}
   115  	validations := SidecarSelectorMultiMatchChecker(
   116  		config.Get().KubernetesConfig.ClusterName,
   117  		"sidecar",
   118  		sidecars,
   119  		workloadList(),
   120  	).Check()
   121  
   122  	assertMultimatchFailure(t, "generic.multimatch.selector", validations, "sidecar1", []string{"sidecar2"})
   123  	assertMultimatchFailure(t, "generic.multimatch.selector", validations, "sidecar2", []string{"sidecar1"})
   124  }
   125  
   126  func TestSidecarsDifferentNamespaces(t *testing.T) {
   127  	assert := assert.New(t)
   128  
   129  	sidecars := []*networking_v1beta1.Sidecar{
   130  		data.AddSelectorToSidecar(map[string]string{
   131  			"app":     "details",
   132  			"version": "v1",
   133  		}, data.CreateSidecar("sidecar1", "bookinfo")),
   134  		data.AddSelectorToSidecar(map[string]string{
   135  			"app":     "details",
   136  			"version": "v2",
   137  		}, data.CreateSidecar("sidecar2", "bookinfo2")),
   138  		data.AddSelectorToSidecar(map[string]string{
   139  			"app":     "details",
   140  			"version": "v3",
   141  		}, data.CreateSidecar("sidecar3", "bookinfo3")),
   142  		data.AddSelectorToSidecar(map[string]string{
   143  			"app":     "details",
   144  			"version": "v4",
   145  		}, data.CreateSidecar("sidecar4", "bookinfo4")),
   146  	}
   147  	validations := SidecarSelectorMultiMatchChecker(
   148  		config.Get().KubernetesConfig.ClusterName,
   149  		"sidecar",
   150  		sidecars,
   151  		workloadList(),
   152  	).Check()
   153  
   154  	assert.Empty(validations)
   155  }
   156  
   157  func assertMultimatchFailure(t *testing.T, code string, vals models.IstioValidations, item string, references []string) {
   158  	assert := assert.New(t)
   159  
   160  	// Global assertion
   161  	assert.NotEmpty(vals)
   162  
   163  	// Assert specific's object validation
   164  	validation, ok := vals[models.IstioValidationKey{ObjectType: "sidecar", Namespace: "bookinfo", Name: item}]
   165  	assert.True(ok)
   166  	assert.False(validation.Valid)
   167  
   168  	// Assert object's checks
   169  	assert.NotEmpty(validation.Checks)
   170  	assert.Equal(models.ErrorSeverity, validation.Checks[0].Severity)
   171  	assert.NoError(validations.ConfirmIstioCheckMessage(code, validation.Checks[0]))
   172  
   173  	// Assert referenced objects
   174  	assert.Len(validation.References, len(references))
   175  	for i, ref := range references {
   176  		assert.Equal(ref, validation.References[i].Name)
   177  		assert.Equal("sidecar", validation.References[i].ObjectType)
   178  	}
   179  }
   180  
   181  func workloadList() map[string]models.WorkloadList {
   182  	wli := []models.WorkloadListItem{
   183  		data.CreateWorkloadListItem("details-v1", map[string]string{"app": "details", "version": "v1"}),
   184  		data.CreateWorkloadListItem("details-v2", map[string]string{"app": "details", "version": "v2"}),
   185  		data.CreateWorkloadListItem("details-v3", map[string]string{"app": "details", "version": "v3"}),
   186  	}
   187  
   188  	return data.CreateWorkloadsPerNamespace([]string{"bookinfo", "bookinfo2", "bookinfo3", "bookinfo4"}, wli...)
   189  }