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  }