| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- package opencost
- import (
- "fmt"
- "reflect"
- "testing"
- "time"
- filter "github.com/opencost/opencost/core/pkg/filter/networkinsight"
- "github.com/opencost/opencost/core/pkg/util"
- )
- const (
- mockCluster1 = "mockCluster1"
- mockNamespace1 = "mockNamespace1"
- mockPod1 = "mockPod1"
- mockNamespace2 = "mockNamespace2"
- mockPod2 = "mockPod2"
- )
- func Test_NetworkDetailsCombineAndAdd(t *testing.T) {
- mcsI1inSet1, _ := createMockNetworkDetail(0, 200000, mockCloudService1, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsI2inSet1, _ := createMockNetworkDetail(0, 400000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsI3inSet1, _ := createMockNetworkDetail(0, 800000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsE1inSet1, _ := createMockNetworkDetail(0.12, 200000, mockCloudService1, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcsE2inSet1, _ := createMockNetworkDetail(0.15, 400000, mockCloudService2, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcsI1inSet2, _ := createMockNetworkDetail(0, 300000, mockCloudService1, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsI2inSet2, _ := createMockNetworkDetail(0, 300000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsE1inSet2, _ := createMockNetworkDetail(0.16, 300000, mockCloudService1, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcsE2inSet2, _ := createMockNetworkDetail(0.24, 300000, mockCloudService2, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcsE3inSet2, _ := createMockNetworkDetail(0.35, 300000, mockCloudService3, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcsI1inCombineSet, _ := createMockNetworkDetail(0, 500000, mockCloudService1, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsI2inCombineSet, _ := createMockNetworkDetail(0, 700000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcsE1inCombineSet, _ := createMockNetworkDetail(0.28, 500000, mockCloudService1, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcsE2inCombineSet, _ := createMockNetworkDetail(0.39, 700000, mockCloudService2, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- set1 := make(NetworkDetailsSet, 0)
- set1[mcsI1inSet1.Key()] = mcsI1inSet1
- set1[mcsI2inSet1.Key()] = mcsI2inSet1
- set1[mcsI3inSet1.Key()] = mcsI3inSet1
- set1[mcsE1inSet1.Key()] = mcsE1inSet1
- set1[mcsE2inSet1.Key()] = mcsE2inSet1
- set2 := make(NetworkDetailsSet, 0)
- set2[mcsI1inSet2.Key()] = mcsI1inSet2
- set2[mcsI2inSet2.Key()] = mcsI2inSet2
- set2[mcsE1inSet2.Key()] = mcsE1inSet2
- set2[mcsE2inSet2.Key()] = mcsE2inSet2
- set2[mcsE3inSet2.Key()] = mcsE3inSet2
- expected := make(NetworkDetailsSet, 0)
- expected[mcsI1inCombineSet.Key()] = mcsI1inCombineSet
- expected[mcsI2inCombineSet.Key()] = mcsI2inCombineSet
- expected[mcsI3inSet1.Key()] = mcsI3inSet1
- expected[mcsE1inCombineSet.Key()] = mcsE1inCombineSet
- expected[mcsE2inCombineSet.Key()] = mcsE2inCombineSet
- expected[mcsE3inSet2.Key()] = mcsE3inSet2
- set1.Combine(set2)
- if !reflect.DeepEqual(set1, expected) {
- t.Fatalf("Test_NetworkIngressCombineAndAdd: NetworkIngressDetailSet:combine not working as expected")
- }
- }
- func Test_NetworkInsightSetInsertFn(t *testing.T) {
- mockInsight1 := MockNetworkInsightImportantKeys{
- Cluster: mockCluster1,
- Namespace: mockNamespace1,
- Controller: "",
- Pod: mockPod1,
- Node: "",
- Labels: map[string]string{},
- Region: "",
- Zone: "",
- }
- mockInsight2 := MockNetworkInsightImportantKeys{
- Cluster: mockCluster1,
- Namespace: mockNamespace2,
- Controller: "",
- Pod: mockPod2,
- Node: "",
- Labels: map[string]string{},
- Region: "",
- Zone: "",
- }
- mcs1inIngress, _ := createMockNetworkDetail(0, 200000, mockCloudService1, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs2inIngress, _ := createMockNetworkDetail(0, 400000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs3inIngress, _ := createMockNetworkDetail(0, 800000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs1inEgress, _ := createMockNetworkDetail(0.16, 300000, mockCloudService1, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcs2inEgress, _ := createMockNetworkDetail(0.24, 300000, mockCloudService2, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcs3inEgress, _ := createMockNetworkDetail(0.35, 300000, mockCloudService3, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- set1 := make(NetworkDetailsSet, 0)
- set1[mcs1inIngress.Key()] = mcs1inIngress
- set1[mcs2inIngress.Key()] = mcs2inIngress
- set1[mcs3inIngress.Key()] = mcs3inIngress
- set1[mcs1inEgress.Key()] = mcs1inEgress
- set1[mcs2inEgress.Key()] = mcs2inEgress
- set1[mcs3inEgress.Key()] = mcs3inEgress
- set2 := make(NetworkDetailsSet, 0)
- set2[mcs1inIngress.Key()] = mcs1inIngress.Clone()
- set2[mcs2inIngress.Key()] = mcs2inIngress.Clone()
- set2[mcs3inIngress.Key()] = mcs3inIngress.Clone()
- set2[mcs1inEgress.Key()] = mcs1inEgress.Clone()
- set2[mcs2inEgress.Key()] = mcs2inEgress.Clone()
- set2[mcs3inEgress.Key()] = mcs3inEgress.Clone()
- ni1 := createMockNetworkInsight(mockInsight1, set1)
- ni2 := createMockNetworkInsight(mockInsight1, set2)
- ni3 := createMockNetworkInsight(mockInsight2, set1.Clone())
- e := time.Now()
- s := e.Add(-1 * time.Hour)
- nis := &NetworkInsightSet{
- NetworkInsights: make(map[string]*NetworkInsight, 0),
- Window: NewWindow(&s, &e),
- }
- nis.Insert(ni1, []NetworkInsightProperty{NetworkInsightsPod})
- nis.Insert(ni2, []NetworkInsightProperty{NetworkInsightsPod})
- nis.Insert(ni3, []NetworkInsightProperty{NetworkInsightsPod})
- aggregatedNis := nis.NetworkInsights
- if val, ok := aggregatedNis[mockPod1]; !ok {
- t.Fatalf("Test_NetworkInsightSetInsertFn: %s not found after insert", mockPod1)
- } else {
- if !util.IsApproximately(val.NetworkDetails.GetTotalInternetCost(), 1.50) {
- t.Logf("1 is %f", val.NetworkDetails.GetTotalInternetCost())
- t.Fatalf("Test_NetworkInsightSetInsertFn: failed to insert and add properly for pod %s", mockPod1)
- }
- }
- if val, ok := aggregatedNis[mockPod2]; !ok {
- t.Fatalf("Test_NetworkInsightSetInsertFn: %s not found after insert", mockPod2)
- } else {
- if !util.IsApproximately(val.NetworkDetails.GetTotalInternetCost(), 0.75) {
- t.Logf("2 is %f", val.NetworkDetails.GetTotalInternetCost())
- t.Fatalf("Test_NetworkInsightSetInsertFn: failed to insert and add properly for pod %s", mockPod1)
- }
- }
- }
- func Test_NetworkDetailSetFilterZeroCost(t *testing.T) {
- mcs1inIngress, _ := createMockNetworkDetail(0, 200000, mockCloudService1, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs2inIngress, _ := createMockNetworkDetail(0, 400000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs3inIngress, _ := createMockNetworkDetail(0, 800000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs1inEgress, _ := createMockNetworkDetail(0.16, 300000, mockCloudService1, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcs2inEgress, _ := createMockNetworkDetail(0.24, 300000, mockCloudService2, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcs3inEgress, _ := createMockNetworkDetail(0.35, 300000, mockCloudService3, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- set1 := make(NetworkDetailsSet, 0)
- set1[mcs1inIngress.Key()] = mcs1inIngress
- set1[mcs2inIngress.Key()] = mcs2inIngress
- set1[mcs3inIngress.Key()] = mcs3inIngress
- set1[mcs1inEgress.Key()] = mcs1inEgress
- set1[mcs2inEgress.Key()] = mcs2inEgress
- set1[mcs3inEgress.Key()] = mcs3inEgress
- set2 := make(NetworkDetailsSet, 0)
- set2[mcs1inEgress.Key()] = mcs1inEgress
- set2[mcs2inEgress.Key()] = mcs2inEgress
- set2[mcs3inEgress.Key()] = mcs3inEgress
- set3 := set1.filterZeroCost()
- if !reflect.DeepEqual(set3, set2) {
- t.Fatalf("Test_NetworkIngressCombineAndAdd: NetworkIngressDetailSet:filterZeroCost failed with showZeroCost:false option")
- }
- }
- func Test_NetworkInsightFilterNetworkDetails(t *testing.T) {
- parserForEqualsTest := filter.NewNetworkInsightDetailFilterParser()
- compiler := NewNetworkInsightDetailMatchCompiler()
- equalsTestRegex, err := parserForEqualsTest.Parse(fmt.Sprintf("endPoint:\"%s\"", mockCloudService1))
- // if error encounter skip the test
- if err != nil {
- t.Logf("skipping test case to avoid intermittent test failure if not able to parse filter string")
- t.Skip()
- }
- equalsTestFilter, err := compiler.Compile(equalsTestRegex)
- // if error encounter skip the test
- if err != nil {
- t.Logf("skipping test case to avoid intermittent test failure if not able to parse filter string")
- t.Skip()
- }
- parserForContainsTest := filter.NewNetworkInsightDetailFilterParser()
- containsTestRegex, err := parserForContainsTest.Parse(fmt.Sprintf("endPoint~:\"%s\"", mockCloudServiceName))
- // if error encounter skip the test
- if err != nil {
- t.Logf("skipping test case to avoid intermittent test failure if not able to parse filter string")
- t.Skip()
- }
- containsTestFilter, err := compiler.Compile(containsTestRegex)
- // if error encounter skip the test
- if err != nil {
- t.Logf("skipping test case to avoid intermittent test failure if not able to parse filter string")
- t.Skip()
- }
- mcs1inIngress, _ := createMockNetworkDetail(0, 200000, mockCloudService1, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs2inIngress, _ := createMockNetworkDetail(0, 400000, mockCloudService2, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs3inIngress, _ := createMockNetworkDetail(0, 800000, mockCloudService3, NetworkTrafficDirectionIngress, NetworkTrafficTypeInternet)
- mcs1inEgress, _ := createMockNetworkDetail(0.16, 300000, mockCloudService1, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcs2inEgress, _ := createMockNetworkDetail(0.24, 300000, mockCloudService2, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- mcs3inEgress, _ := createMockNetworkDetail(0.35, 300000, mockCloudService3, NetworkTrafficDirectionEgress, NetworkTrafficTypeInternet)
- set1 := make(NetworkDetailsSet, 0)
- set1[mcs1inIngress.Key()] = mcs1inIngress
- set1[mcs2inIngress.Key()] = mcs2inIngress
- set1[mcs3inIngress.Key()] = mcs3inIngress
- set1[mcs1inEgress.Key()] = mcs1inEgress
- set1[mcs2inEgress.Key()] = mcs2inEgress
- set1[mcs3inEgress.Key()] = mcs3inEgress
- // set2 with only mockservice1 network details for validation
- set2 := make(NetworkDetailsSet, 0)
- set2[mcs1inIngress.Key()] = mcs1inIngress
- set2[mcs1inEgress.Key()] = mcs1inEgress
- mockInsight1 := MockNetworkInsightImportantKeys{
- Cluster: mockCluster1,
- Namespace: mockNamespace1,
- Controller: "",
- Pod: mockPod1,
- Node: "",
- Labels: map[string]string{},
- Region: "",
- Zone: "",
- }
- ni1 := createMockNetworkInsight(mockInsight1, set1)
- ni1Copy := ni1.Clone()
- ni1.filterNetworkDetails(equalsTestFilter)
- // Check to see after filtering the network details
- //only have filtered result that is set2
- if !reflect.DeepEqual(ni1.NetworkDetails, set2) {
- t.Fatalf("Test_NetworkIngressCombineAndAdd: NetworkIngressDetailSet:filterNetworkDetails failed with equal to filter")
- }
- // Check to see after filtering the network details only have filtered
- // result that is original as a combine data that satisfy the regex
- ni1Copy.filterNetworkDetails(containsTestFilter)
- if !reflect.DeepEqual(ni1Copy.NetworkDetails, set1) {
- t.Fatalf("Test_NetworkIngressCombineAndAdd: NetworkIngressDetailSet:filterNetworkDetails failed with contains to filter")
- }
- }
|