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  }