github.com/kiali/kiali@v1.84.0/graph/telemetry/istio/appender/istio_details_test.go (about) 1 package appender 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 api_networking_v1beta1 "istio.io/api/networking/v1beta1" 8 networking_v1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1" 9 core_v1 "k8s.io/api/core/v1" 10 meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 12 "github.com/kiali/kiali/business" 13 "github.com/kiali/kiali/config" 14 "github.com/kiali/kiali/graph" 15 "github.com/kiali/kiali/kubernetes" 16 "github.com/kiali/kiali/kubernetes/kubetest" 17 ) 18 19 func setupTrafficMap() (map[string]*graph.Node, string, string, string, string, string, string) { 20 trafficMap := graph.NewTrafficMap() 21 22 appNode, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "ratings", "testNamespace", graph.Unknown, "ratings", "", graph.GraphTypeVersionedApp) 23 appNode.Metadata[graph.DestServices] = graph.NewDestServicesMetadata().Add("testNamespace ratings", graph.ServiceName{Namespace: "testNamespace", Name: "ratings"}) 24 trafficMap[appNode.ID] = appNode 25 26 appNodeV1, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "ratings", "testNamespace", "ratings-v1", "ratings", "v1", graph.GraphTypeVersionedApp) 27 appNodeV1.Metadata[graph.DestServices] = graph.NewDestServicesMetadata().Add("testNamespace ratings", graph.ServiceName{Namespace: "testNamespace", Name: "ratings"}) 28 trafficMap[appNodeV1.ID] = appNodeV1 29 30 appNodeV2, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "ratings", "testNamespace", "ratings-v2", "ratings", "v2", graph.GraphTypeVersionedApp) 31 appNodeV2.Metadata[graph.DestServices] = graph.NewDestServicesMetadata().Add("testNamespace ratings", graph.ServiceName{Namespace: "testNamespace", Name: "ratings"}) 32 trafficMap[appNodeV2.ID] = appNodeV2 33 34 serviceNode, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "ratings", "testNamespace", graph.Unknown, graph.Unknown, graph.Unknown, graph.GraphTypeVersionedApp) 35 trafficMap[serviceNode.ID] = serviceNode 36 37 workloadNode, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "ratings", "testNamespace", "ratings-v1", graph.Unknown, graph.Unknown, graph.GraphTypeWorkload) 38 workloadNode.Metadata[graph.DestServices] = graph.NewDestServicesMetadata().Add("testNamespace ratings", graph.ServiceName{Namespace: "testNamespace", Name: "ratings"}) 39 trafficMap[workloadNode.ID] = workloadNode 40 41 fooServiceNode, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "foo", "testNamespace", graph.Unknown, graph.Unknown, graph.Unknown, graph.GraphTypeVersionedApp) 42 trafficMap[fooServiceNode.ID] = fooServiceNode 43 44 return trafficMap, appNode.ID, appNodeV1.ID, appNodeV2.ID, serviceNode.ID, workloadNode.ID, fooServiceNode.ID 45 } 46 47 func TestCBAll(t *testing.T) { 48 assert := assert.New(t) 49 conf := config.NewConfig() 50 conf.KubernetesConfig.ClusterName = config.DefaultClusterID 51 conf.ExternalServices.Istio.IstioAPIEnabled = false 52 config.Set(conf) 53 54 dRule := &networking_v1beta1.DestinationRule{} 55 dRule.Name = "dRule-1" 56 dRule.Namespace = "testNamespace" 57 dRule.Spec.Host = "ratings" 58 dRule.Spec.TrafficPolicy = &api_networking_v1beta1.TrafficPolicy{ 59 ConnectionPool: &api_networking_v1beta1.ConnectionPoolSettings{ 60 Http: &api_networking_v1beta1.ConnectionPoolSettings_HTTPSettings{ 61 MaxRequestsPerConnection: 30, 62 }, 63 }, 64 } 65 k8s := kubetest.NewFakeK8sClient(dRule, &core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}}) 66 business.SetupBusinessLayer(t, k8s, *conf) 67 k8sclients := map[string]kubernetes.ClientInterface{ 68 config.DefaultClusterID: kubetest.NewFakeK8sClient( 69 &core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}}, 70 ), 71 } 72 businessLayer := business.NewWithBackends(k8sclients, k8sclients, nil, nil) 73 trafficMap, appNodeId, appNodeV1Id, appNodeV2Id, svcNodeId, wlNodeId, _ := setupTrafficMap() 74 75 assert.Equal(6, len(trafficMap)) 76 assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasCB]) 77 assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasCB]) 78 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasCB]) 79 assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasCB]) 80 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasCB]) 81 assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasVS]) 82 assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasVS]) 83 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasVS]) 84 assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasVS]) 85 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasVS]) 86 87 globalInfo := graph.NewAppenderGlobalInfo() 88 globalInfo.Business = businessLayer 89 namespaceInfo := graph.NewAppenderNamespaceInfo("testNamespace") 90 91 a := IstioAppender{} 92 a.AppendGraph(trafficMap, globalInfo, namespaceInfo) 93 94 assert.Equal(6, len(trafficMap)) 95 assert.Equal(true, trafficMap[appNodeId].Metadata[graph.HasCB]) 96 assert.Equal(true, trafficMap[appNodeV1Id].Metadata[graph.HasCB]) 97 assert.Equal(true, trafficMap[appNodeV2Id].Metadata[graph.HasCB]) 98 assert.Equal(true, trafficMap[svcNodeId].Metadata[graph.HasCB]) 99 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasCB]) 100 assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasVS]) 101 assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasVS]) 102 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasVS]) 103 assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasVS]) 104 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasVS]) 105 } 106 107 func TestCBSubset(t *testing.T) { 108 assert := assert.New(t) 109 conf := config.NewConfig() 110 conf.KubernetesConfig.ClusterName = config.DefaultClusterID 111 conf.ExternalServices.Istio.IstioAPIEnabled = false 112 config.Set(conf) 113 114 dRule := &networking_v1beta1.DestinationRule{} 115 dRule.Name = "dRule-1" 116 dRule.Namespace = "testNamespace" 117 dRule.Spec.Host = "ratings" 118 dRule.Spec.Subsets = []*api_networking_v1beta1.Subset{ 119 { 120 TrafficPolicy: &api_networking_v1beta1.TrafficPolicy{ 121 ConnectionPool: &api_networking_v1beta1.ConnectionPoolSettings{ 122 Http: &api_networking_v1beta1.ConnectionPoolSettings_HTTPSettings{ 123 MaxRequestsPerConnection: 30, 124 }, 125 }, 126 }, 127 Labels: map[string]string{ 128 "version": "v1", 129 }, 130 }, 131 } 132 k8s := kubetest.NewFakeK8sClient(dRule, &core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}}) 133 business.SetupBusinessLayer(t, k8s, *conf) 134 k8sclients := map[string]kubernetes.ClientInterface{ 135 config.DefaultClusterID: kubetest.NewFakeK8sClient( 136 &core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}}, 137 ), 138 } 139 businessLayer := business.NewWithBackends(k8sclients, k8sclients, nil, nil) 140 trafficMap, appNodeId, appNodeV1Id, appNodeV2Id, svcNodeId, wlNodeId, _ := setupTrafficMap() 141 142 assert.Equal(6, len(trafficMap)) 143 assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasCB]) 144 assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasCB]) 145 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasCB]) 146 assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasCB]) 147 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasCB]) 148 assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasVS]) 149 assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasVS]) 150 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasVS]) 151 assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasVS]) 152 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasVS]) 153 154 globalInfo := graph.NewAppenderGlobalInfo() 155 globalInfo.Business = businessLayer 156 namespaceInfo := graph.NewAppenderNamespaceInfo("testNamespace") 157 158 a := IstioAppender{} 159 a.AppendGraph(trafficMap, globalInfo, namespaceInfo) 160 161 assert.Equal(6, len(trafficMap)) 162 assert.Equal(true, trafficMap[appNodeId].Metadata[graph.HasCB]) 163 assert.Equal(true, trafficMap[appNodeV1Id].Metadata[graph.HasCB]) 164 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasCB]) 165 assert.Equal(true, trafficMap[svcNodeId].Metadata[graph.HasCB]) 166 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasCB]) 167 assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasVS]) 168 assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasVS]) 169 assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasVS]) 170 assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasVS]) 171 assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasVS]) 172 } 173 174 // TODO: Re-add following two tests. A way for testing code that *requires* the cache to be enabled is needed. 175 //func TestVS(t *testing.T) { 176 // assert := assert.New(t) 177 // config.Set(config.NewConfig()) 178 // 179 // k8s := kubetest.NewK8SClientMock() 180 // vService := &networking_v1beta1.VirtualService{} 181 // vService.Name = "vService-1" 182 // vService.Namespace = "testNamespace" 183 // vService.Spec.Hosts = []string{"ratings"} 184 // vService.Spec.Http = []*api_networking_v1beta1.HTTPRoute{ 185 // { 186 // Route: []*api_networking_v1beta1.HTTPRouteDestination{ 187 // { 188 // Destination: &api_networking_v1beta1.Destination{ 189 // Host: "foo", 190 // }, 191 // }, 192 // }, 193 // }, 194 // } 195 // k8s.MockIstio(vService) 196 // 197 // k8s.On("GetProject", mock.AnythingOfType("string")).Return(&osproject_v1.Project{}, nil) 198 // k8s.On("GetProjects", mock.AnythingOfType("string")).Return([]osproject_v1.Project{}, nil) 199 // k8s.On("GetEndpoints", mock.AnythingOfType("string"), mock.AnythingOfType("string")).Return(&core_v1.Endpoints{}, nil) 200 // k8s.On("GetServices", mock.AnythingOfType("string"), mock.Anything).Return([]core_v1.Service{{}}, nil) 201 // 202 // businessLayer := business.NewWithBackends(k8s, nil, nil) 203 // trafficMap, appNodeId, appNodeV1Id, appNodeV2Id, svcNodeId, wlNodeId, fooSvcNodeId := setupTrafficMap() 204 // 205 // assert.Equal(6, len(trafficMap)) 206 // assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasCB]) 207 // assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasCB]) 208 // assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasCB]) 209 // assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasCB]) 210 // assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasCB]) 211 // assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasVS]) 212 // assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasVS]) 213 // assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasVS]) 214 // assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasVS]) 215 // assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasVS]) 216 // assert.Equal(nil, trafficMap[fooSvcNodeId].Metadata[graph.HasVS]) 217 // 218 // globalInfo := graph.NewAppenderGlobalInfo() 219 // globalInfo.Business = businessLayer 220 // namespaceInfo := graph.NewAppenderNamespaceInfo("testNamespace") 221 // 222 // a := IstioAppender{} 223 // a.AppendGraph(trafficMap, globalInfo, namespaceInfo) 224 // 225 // assert.Equal(6, len(trafficMap)) 226 // assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasCB]) 227 // assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasCB]) 228 // assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasCB]) 229 // assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasCB]) 230 // assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasCB]) 231 // assert.Equal(nil, trafficMap[appNodeId].Metadata[graph.HasVS]) 232 // assert.Equal(nil, trafficMap[appNodeV1Id].Metadata[graph.HasVS]) 233 // assert.Equal(nil, trafficMap[appNodeV2Id].Metadata[graph.HasVS]) 234 // assert.Equal(nil, trafficMap[svcNodeId].Metadata[graph.HasVS]) 235 // assert.Equal(nil, trafficMap[wlNodeId].Metadata[graph.HasVS]) 236 // 237 // assert.NotNil(trafficMap[fooSvcNodeId].Metadata[graph.HasVS]) 238 // assert.IsType(graph.VirtualServicesMetadata{}, trafficMap[fooSvcNodeId].Metadata[graph.HasVS]) 239 // assert.Len(trafficMap[fooSvcNodeId].Metadata[graph.HasVS], 1) 240 // assert.Len(trafficMap[fooSvcNodeId].Metadata[graph.HasVS].(graph.VirtualServicesMetadata)["vService-1"], 1) 241 // assert.Equal("ratings", trafficMap[fooSvcNodeId].Metadata[graph.HasVS].(graph.VirtualServicesMetadata)["vService-1"][0]) 242 //} 243 // 244 //func TestVSWithRoutingBadges(t *testing.T) { 245 // assert := assert.New(t) 246 // config.Set(config.NewConfig()) 247 // 248 // k8s := kubetest.NewK8SClientMock() 249 // vService := &networking_v1beta1.VirtualService{} 250 // vService.Name = "vService-1" 251 // vService.Namespace = "testNamespace" 252 // vService.Spec.Hosts = []string{"ratings"} 253 // vService.Spec.Http = []*api_networking_v1beta1.HTTPRoute{ 254 // { 255 // Route: []*api_networking_v1beta1.HTTPRouteDestination{ 256 // { 257 // Destination: &api_networking_v1beta1.Destination{ 258 // Host: "foo", 259 // }, 260 // Weight: 20, 261 // }, 262 // { 263 // Destination: &api_networking_v1beta1.Destination{ 264 // Host: "bar", 265 // }, 266 // Weight: 80, 267 // }, 268 // }, 269 // }, 270 // } 271 // k8s.MockIstio(vService) 272 // k8s.On("GetProject", mock.AnythingOfType("string")).Return(&osproject_v1.Project{}, nil) 273 // k8s.On("GetProjects", mock.AnythingOfType("string")).Return([]osproject_v1.Project{}, nil) 274 // k8s.On("GetEndpoints", mock.AnythingOfType("string"), mock.AnythingOfType("string")).Return(&core_v1.Endpoints{}, nil) 275 // k8s.On("GetServices", mock.AnythingOfType("string"), mock.Anything).Return([]core_v1.Service{{}}, nil) 276 // 277 // businessLayer := business.NewWithBackends(k8s, nil, nil) 278 // trafficMap, _, _, _, _, _, fooSvcNodeId := setupTrafficMap() 279 // 280 // assert.Equal(nil, trafficMap[fooSvcNodeId].Metadata[graph.HasVS]) 281 // assert.Equal(nil, trafficMap[fooSvcNodeId].Metadata[graph.HasTrafficShifting]) 282 // assert.Equal(nil, trafficMap[fooSvcNodeId].Metadata[graph.HasRequestRouting]) 283 // 284 // globalInfo := graph.NewAppenderGlobalInfo() 285 // globalInfo.Business = businessLayer 286 // namespaceInfo := graph.NewAppenderNamespaceInfo("testNamespace") 287 // 288 // a := IstioAppender{} 289 // a.AppendGraph(trafficMap, globalInfo, namespaceInfo) 290 // 291 // assert.Equal(true, trafficMap[fooSvcNodeId].Metadata[graph.HasTrafficShifting]) 292 //} 293 294 func TestSEInAppBox(t *testing.T) { 295 check := assert.New(t) 296 conf := config.NewConfig() 297 conf.KubernetesConfig.ClusterName = config.DefaultClusterID 298 conf.ExternalServices.Istio.IstioAPIEnabled = false 299 config.Set(conf) 300 301 svc := &core_v1.Service{ 302 ObjectMeta: meta_v1.ObjectMeta{ 303 Name: "foobar", 304 Namespace: "testNamespace", 305 Labels: map[string]string{ 306 "app": "fooApp", 307 }, 308 }, 309 } 310 k8s := kubetest.NewFakeK8sClient(svc, &core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}}) 311 business.SetupBusinessLayer(t, k8s, *conf) 312 k8sclients := map[string]kubernetes.ClientInterface{ 313 config.DefaultClusterID: kubetest.NewFakeK8sClient( 314 &core_v1.Namespace{ObjectMeta: meta_v1.ObjectMeta{Name: "testNamespace"}}, 315 ), 316 } 317 businessLayer := business.NewWithBackends(k8sclients, k8sclients, nil, nil) 318 319 trafficMap := graph.NewTrafficMap() 320 serviceEntryNode, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "ratings", "", "", "", "", graph.GraphTypeVersionedApp) 321 serviceEntryNode.Metadata[graph.IsServiceEntry] = &graph.SEInfo{ 322 Hosts: []string{"foobar.com"}, 323 Location: "MESH_INTERNAL", 324 Namespace: "testNamespace", 325 } 326 trafficMap[serviceEntryNode.ID] = serviceEntryNode 327 328 globalInfo := graph.NewAppenderGlobalInfo() 329 globalInfo.Business = businessLayer 330 namespaceInfo := graph.NewAppenderNamespaceInfo("testNamespace") 331 332 a := IstioAppender{} 333 a.AppendGraph(trafficMap, globalInfo, namespaceInfo) 334 335 check.Equal("fooApp", trafficMap[serviceEntryNode.ID].App) 336 }