Browse Source

Created diff for assets with test cases

nickcurie 3 years ago
parent
commit
d1bc112ec0
2 changed files with 97 additions and 0 deletions
  1. 25 0
      pkg/kubecost/asset.go
  2. 72 0
      pkg/kubecost/diff_test.go

+ 25 - 0
pkg/kubecost/asset.go

@@ -2838,6 +2838,31 @@ func (as *AssetSet) accumulate(that *AssetSet) (*AssetSet, error) {
 	return acc, nil
 }
 
+type Diff struct {
+	Asset Asset
+	ChangedType string
+}
+
+func DiffAsset(before, after *AssetSet) []Diff{
+	changedAssets := []Diff{}
+
+	for assetKey1, asset1 := range before.assets {
+		if _, ok := after.assets[assetKey1]; !ok {
+			d := Diff{asset1, "removed"}
+			changedAssets = append(changedAssets, d)
+		}
+	}
+	
+	for assetKey2, asset2 := range after.assets {
+		if _, ok := before.assets[assetKey2]; !ok {
+			d := Diff{asset2, "added"}
+			changedAssets = append(changedAssets, d)
+		}
+	}
+
+	return changedAssets
+}
+
 // AssetSetRange is a thread-safe slice of AssetSets. It is meant to
 // be used such that the AssetSets held are consecutive and coherent with
 // respect to using the same aggregation properties, UTC offset, and

+ 72 - 0
pkg/kubecost/diff_test.go

@@ -0,0 +1,72 @@
+package kubecost
+
+import (
+	"testing"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+)
+
+func TestDiff(t *testing.T) {
+
+	start := time.Now().AddDate(0, 0, -1)
+	end :=  time.Now()
+	window1 := NewWindow(&start, &end)
+
+	node1 := NewNode("node1", "cluster1", "123abc", start, end, window1)
+	node2 := NewNode("node2", "cluster1", "123abc", start, end, window1)
+	node3 := NewNode("node3", "cluster1", "123abc", start, end, window1)
+	node4 := NewNode("node4", "cluster1", "123abc", start, end, window1)
+	disk1 := NewDisk("disk1", "cluster1", "123abc", start, end, window1)
+	disk2 := NewDisk("disk2", "cluster1", "123abc", start, end, window1)
+
+	cases := map[string]struct {
+		inputAssetsBefore []Asset
+		inputAssetsAfter  []Asset
+		expected          []Diff
+	}{
+		"added node":       {inputAssetsBefore: []Asset{node1, node2}, inputAssetsAfter: []Asset{node1, node2, node3}, expected: []Diff{{node3, "added"}}},
+		"multiple adds":    {inputAssetsBefore: []Asset{node1, node2}, inputAssetsAfter: []Asset{node1, node2, node3, node4}, expected: []Diff{{node3, "added"}, {node4, "added"}}},
+		"removed node":     {inputAssetsBefore: []Asset{node1, node2}, inputAssetsAfter: []Asset{node2}, expected: []Diff{{node1, "removed"}}},
+		"multiple removes": {inputAssetsBefore: []Asset{node1, node2, node3}, inputAssetsAfter: []Asset{node2}, expected: []Diff{{node1, "removed"}, {node3, "removed"}}},
+		"remove all":       {inputAssetsBefore: []Asset{node1, node2}, inputAssetsAfter: []Asset{}, expected: []Diff{{node1, "removed"}, {node2, "removed"}}},
+		"add and remove":   {inputAssetsBefore: []Asset{node1, node2}, inputAssetsAfter: []Asset{node2, node3}, expected: []Diff{{node1, "removed"}, {node3, "added"}}},
+		"no change":        {inputAssetsBefore: []Asset{node1, node2}, inputAssetsAfter: []Asset{node1, node2}, expected: []Diff{}},
+		"order switch":     {inputAssetsBefore: []Asset{node2, node1}, inputAssetsAfter: []Asset{node1, node2}, expected: []Diff{}},
+		"disk add":         {inputAssetsBefore: []Asset{disk1, node1}, inputAssetsAfter: []Asset{disk1, node1, disk2}, expected: []Diff{{disk2, "added"}}},
+		"disk and node add": {inputAssetsBefore: []Asset{disk1, node1}, inputAssetsAfter: []Asset{disk1, node1, disk2, node2}, expected: []Diff{{disk2, "added"}, {node2, "added"}}},
+		"disk and node removed": {inputAssetsBefore: []Asset{disk1, node1, disk2, node2}, inputAssetsAfter: []Asset{disk2, node2}, expected: []Diff{{disk1, "removed"}, {node1, "removed"}}},
+	}
+
+	for name, tc := range cases {
+		t.Run(name, func(t *testing.T) {
+			as1 := NewAssetSet(start, end, tc.inputAssetsBefore...)
+			as2 := NewAssetSet(start, end, tc.inputAssetsAfter...)
+
+			result := DiffAsset(as1.Clone(), as2.Clone())
+
+			diff := cmp.Diff(tc.expected, result) 
+
+			if diff != "" {
+				t.Fatalf(diff)
+			}
+			
+		})
+	}
+	// as1 := NewAssetSet(start, end, 
+	// 	NewNode("node1", "cluster1", "123abc", start, end, window1), 
+	// 	NewNode("node2", "cluster1", "123abc", start, end, window1)
+	// 	NewNode("node3", "cluster1", "123abc", start, end, window1))
+	// as2 := NewAssetSet(start, end, 
+	// 	NewNode("node2", "cluster1", "123abc", start, end, window1),
+	// 	NewNode("node4", "cluster1", "123abc", start, end, window1))
+
+	// t.Logf("testing")
+
+	// result := DiffAsset(as1, as2)
+
+	// for i := range result {
+	// 	t.Logf("%+v", result[i])
+	// }
+
+}