github.com/kiali/kiali@v1.84.0/graph/telemetry/istio/appender/idle_node_test.go (about) 1 package appender 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 8 "github.com/kiali/kiali/config" 9 "github.com/kiali/kiali/graph" 10 "github.com/kiali/kiali/models" 11 ) 12 13 func TestNonTrafficScenario(t *testing.T) { 14 assert := assert.New(t) 15 16 config.Set(config.NewConfig()) 17 18 a := IdleNodeAppender{ 19 graph.GraphTypeVersionedApp, 20 true, 21 false, 22 } 23 24 // Empty trafficMap 25 trafficMap := graph.NewTrafficMap() 26 serviceLists := mockServiceLists(a) 27 workloadLists := mockWorkloadLists(a) 28 29 a.addIdleNodes(trafficMap, "testNamespace", serviceLists, workloadLists) 30 assert.Equal(7, len(trafficMap)) 31 32 id, _, _ := graph.Id(config.DefaultClusterID, "testNamespace", "customer", "testNamespace", "customer-v1", "customer", "v1", a.GraphType) 33 n, ok := trafficMap[id] 34 assert.Equal(true, ok) 35 assert.Equal("customer-v1", n.Workload) 36 assert.Equal("customer", n.App) 37 assert.Equal("v1", n.Version) 38 assert.Equal(true, n.Metadata[graph.IsIdle]) 39 40 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "preference", "testNamespace", "preference-v1", "preference", "v1", a.GraphType) 41 n, ok = trafficMap[id] 42 assert.Equal(true, ok) 43 assert.Equal("preference-v1", n.Workload) 44 assert.Equal("preference", n.App) 45 assert.Equal("v1", n.Version) 46 assert.Equal(true, n.Metadata[graph.IsIdle]) 47 48 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "recommendation", "testNamespace", "recommendation-v1", "recommendation", "v1", a.GraphType) 49 n, ok = trafficMap[id] 50 assert.Equal(true, ok) 51 assert.Equal("recommendation-v1", n.Workload) 52 assert.Equal("recommendation", n.App) 53 assert.Equal("v1", n.Version) 54 assert.Equal(true, n.Metadata[graph.IsIdle]) 55 56 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "recommendation", "testNamespace", "recommendation-v2", "recommendation", "v2", a.GraphType) 57 n, ok = trafficMap[id] 58 assert.Equal(true, ok) 59 assert.Equal("recommendation-v2", n.Workload) 60 assert.Equal("recommendation", n.App) 61 assert.Equal("v2", n.Version) 62 assert.Equal(true, n.Metadata[graph.IsIdle]) 63 64 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "customer", "", "", "", "", a.GraphType) 65 n, ok = trafficMap[id] 66 assert.Equal(true, ok) 67 assert.Equal(graph.NodeTypeService, n.NodeType) 68 assert.Equal("customer", n.Service) 69 assert.Equal(true, n.Metadata[graph.IsIdle]) 70 71 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "preference", "", "", "", "", a.GraphType) 72 n, ok = trafficMap[id] 73 assert.Equal(true, ok) 74 assert.Equal(graph.NodeTypeService, n.NodeType) 75 assert.Equal("preference", n.Service) 76 assert.Equal(true, n.Metadata[graph.IsIdle]) 77 78 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "recommendation", "", "", "", "", a.GraphType) 79 n, ok = trafficMap[id] 80 assert.Equal(true, ok) 81 assert.Equal(graph.NodeTypeService, n.NodeType) 82 assert.Equal("recommendation", n.Service) 83 assert.Equal(true, n.Metadata[graph.IsIdle]) 84 } 85 86 func TestOneNodeTrafficScenario(t *testing.T) { 87 assert := assert.New(t) 88 89 config.Set(config.NewConfig()) 90 91 a := IdleNodeAppender{ 92 graph.GraphTypeVersionedApp, 93 false, 94 false, 95 } 96 97 trafficMap := a.oneNodeTraffic() 98 serviceLists := mockServiceLists(a) 99 workloadLists := mockWorkloadLists(a) 100 101 a.addIdleNodes(trafficMap, "testNamespace", serviceLists, workloadLists) 102 103 assert.Equal(5, len(trafficMap)) 104 id, _, _ := graph.Id(graph.Unknown, graph.Unknown, "", graph.Unknown, graph.Unknown, graph.Unknown, graph.Unknown, a.GraphType) 105 unknown, ok := trafficMap[id] 106 assert.Equal(true, ok) 107 assert.Equal(graph.Unknown, unknown.Workload) 108 assert.Equal(1, len(unknown.Edges)) 109 110 e := unknown.Edges[0] 111 assert.Equal(float64(0.8), e.Metadata["httpIn"]) 112 n := e.Dest 113 assert.Equal("customer-v1", n.Workload) 114 assert.Equal("customer", n.App) 115 assert.Equal("v1", n.Version) 116 assert.Equal(nil, n.Metadata[graph.IsIdle]) 117 118 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "preference", "testNamespace", "preference-v1", "preference", "v1", a.GraphType) 119 n, ok = trafficMap[id] 120 assert.Equal(true, ok) 121 assert.Equal("preference-v1", n.Workload) 122 assert.Equal("preference", n.App) 123 assert.Equal("v1", n.Version) 124 assert.Equal(true, n.Metadata[graph.IsIdle]) 125 126 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "recommendation", "testNamespace", "recommendation-v1", "recommendation", "v1", a.GraphType) 127 n, ok = trafficMap[id] 128 assert.Equal(true, ok) 129 assert.Equal("recommendation-v1", n.Workload) 130 assert.Equal("recommendation", n.App) 131 assert.Equal("v1", n.Version) 132 assert.Equal(true, n.Metadata[graph.IsIdle]) 133 134 id, _, _ = graph.Id(config.DefaultClusterID, "testNamespace", "recommendation", "testNamespace", "recommendation-v2", "recommendation", "v2", a.GraphType) 135 n, ok = trafficMap[id] 136 assert.Equal(true, ok) 137 assert.Equal("recommendation-v2", n.Workload) 138 assert.Equal("recommendation", n.App) 139 assert.Equal("v2", n.Version) 140 assert.Equal(true, n.Metadata[graph.IsIdle]) 141 } 142 143 func TestVersionWithNoTrafficScenario(t *testing.T) { 144 assert := assert.New(t) 145 146 config.Set(config.NewConfig()) 147 148 a := IdleNodeAppender{ 149 graph.GraphTypeVersionedApp, 150 false, 151 false, 152 } 153 154 const cluster = config.DefaultClusterID 155 156 trafficMap := a.v1Traffic(cluster) 157 serviceLists := mockServiceLists(a) 158 workloadLists := mockWorkloadLists(a) 159 160 a.addIdleNodes(trafficMap, "testNamespace", serviceLists, workloadLists) 161 162 assert.Equal(5, len(trafficMap)) 163 id, _, _ := graph.Id(graph.Unknown, graph.Unknown, "", graph.Unknown, graph.Unknown, graph.Unknown, graph.Unknown, a.GraphType) 164 unknown, ok := trafficMap[id] 165 assert.Equal(true, ok) 166 assert.Equal(graph.Unknown, unknown.Workload) 167 assert.Equal(1, len(unknown.Edges)) 168 169 customer := unknown.Edges[0].Dest 170 assert.Equal("customer-v1", customer.Workload) 171 assert.Equal("customer", customer.App) 172 assert.Equal("v1", customer.Version) 173 assert.Equal(float64(0.8), unknown.Edges[0].Metadata["http"]) 174 assert.Equal(nil, customer.Metadata[graph.IsIdle]) 175 assert.Equal(1, len(customer.Edges)) 176 177 e := customer.Edges[0] 178 preference := e.Dest 179 assert.Equal("preference-v1", preference.Workload) 180 assert.Equal("preference", preference.App) 181 assert.Equal("v1", preference.Version) 182 assert.Equal(float64(0.8), e.Metadata["http"]) 183 assert.Equal(nil, preference.Metadata[graph.IsIdle]) 184 assert.Equal(1, len(preference.Edges)) 185 186 e = preference.Edges[0] 187 recommendationV1 := e.Dest 188 assert.Equal("recommendation-v1", recommendationV1.Workload) 189 assert.Equal("recommendation", recommendationV1.App) 190 assert.Equal("v1", recommendationV1.Version) 191 assert.Equal(float64(0.8), e.Metadata["http"]) 192 assert.Equal(nil, recommendationV1.Metadata[graph.IsIdle]) 193 194 var idleV2Node *graph.Node 195 for _, node := range trafficMap { 196 if node.App == "recommendation" && node.Version == "v2" { 197 idleV2Node = node 198 } 199 } 200 assert.NotNil(idleV2Node) 201 202 assert.Equal(true, idleV2Node.Metadata[graph.IsIdle]) 203 assert.Equal(idleV2Node.Cluster, cluster) 204 } 205 206 func mockServiceLists(a IdleNodeAppender) map[string]*models.ServiceList { 207 serviceOverviews := []models.ServiceOverview{} 208 209 if a.GraphType == graph.GraphTypeService || a.InjectServiceNodes { 210 serviceOverviews = []models.ServiceOverview{ 211 { 212 Name: "customer", 213 }, 214 { 215 Name: "preference", 216 }, 217 { 218 Name: "recommendation", 219 }, 220 { 221 Name: "recommendation", 222 }, 223 } 224 } 225 226 return map[string]*models.ServiceList{config.DefaultClusterID: &models.ServiceList{Services: serviceOverviews}} 227 } 228 229 func mockWorkloadLists(a IdleNodeAppender) map[string]*models.WorkloadList { 230 workloadListItems := []models.WorkloadListItem{} 231 232 if a.GraphType != graph.GraphTypeService { 233 workloadListItems = []models.WorkloadListItem{ 234 { 235 Name: "customer-v1", 236 Labels: map[string]string{"app": "customer", "version": "v1"}, 237 }, 238 { 239 Name: "preference-v1", 240 Labels: map[string]string{"app": "preference", "version": "v1"}, 241 }, 242 { 243 Name: "recommendation-v1", 244 Labels: map[string]string{"app": "recommendation", "version": "v1"}, 245 }, 246 { 247 Name: "recommendation-v2", 248 Labels: map[string]string{"app": "recommendation", "version": "v2"}, 249 }, 250 } 251 } 252 253 return map[string]*models.WorkloadList{config.DefaultClusterID: &models.WorkloadList{Workloads: workloadListItems}} 254 } 255 256 func (a *IdleNodeAppender) oneNodeTraffic() map[string]*graph.Node { 257 trafficMap := make(map[string]*graph.Node) 258 259 unknown, _ := graph.NewNode(graph.Unknown, graph.Unknown, "", graph.Unknown, graph.Unknown, graph.Unknown, graph.Unknown, a.GraphType) 260 customer, _ := graph.NewNode(config.DefaultClusterID, "testNamespace", "customer", "testNamespace", "customer-v1", "customer", "v1", a.GraphType) 261 trafficMap[unknown.ID] = unknown 262 trafficMap[customer.ID] = customer 263 edge := unknown.AddEdge(customer) 264 edge.Metadata["httpIn"] = 0.8 265 unknown.Metadata["httpOut"] = 0.8 266 customer.Metadata["httpIn"] = 0.8 267 268 return trafficMap 269 } 270 271 func (a *IdleNodeAppender) v1Traffic(cluster string) map[string]*graph.Node { 272 trafficMap := make(map[string]*graph.Node) 273 274 unknown, _ := graph.NewNode(graph.Unknown, graph.Unknown, "", graph.Unknown, graph.Unknown, graph.Unknown, graph.Unknown, a.GraphType) 275 customer, _ := graph.NewNode(cluster, "testNamespace", "customer", "testNamespace", "customer-v1", "customer", "v1", a.GraphType) 276 preference, _ := graph.NewNode(cluster, "testNamespace", "preference", "testNamespace", "preference-v1", "preference", "v1", a.GraphType) 277 recommendation, _ := graph.NewNode(cluster, "testNamespace", "recommendation", "testNamespace", "recommendation-v1", "recommendation", "v1", a.GraphType) 278 trafficMap[unknown.ID] = unknown 279 trafficMap[customer.ID] = customer 280 trafficMap[preference.ID] = preference 281 trafficMap[recommendation.ID] = recommendation 282 283 // unknown --> customer --> preference --> recommendation 284 285 edge := unknown.AddEdge(customer) 286 edge.Metadata["http"] = 0.8 287 unknown.Metadata["httpOut"] = 0.8 288 customer.Metadata["httpIn"] = 0.8 289 290 edge = customer.AddEdge(preference) 291 edge.Metadata["http"] = 0.8 292 customer.Metadata["httpOut"] = 0.8 293 preference.Metadata["httpIn"] = 0.8 294 295 edge = preference.AddEdge(recommendation) 296 edge.Metadata["http"] = 0.8 297 preference.Metadata["httpOut"] = 0.8 298 recommendation.Metadata["httpIn"] = 0.8 299 300 return trafficMap 301 }