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 }