index_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package scrape
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/opencost/opencost/core/pkg/clustercache"
  6. "github.com/stretchr/testify/require"
  7. "k8s.io/apimachinery/pkg/types"
  8. )
  9. func TestBuildNodeIndex_Empty(t *testing.T) {
  10. m := buildNodeIndex(nil)
  11. require.Empty(t, m)
  12. }
  13. func TestBuildNodeIndex(t *testing.T) {
  14. nodes := []*clustercache.Node{
  15. {Name: "node-a", UID: "uid-a"},
  16. {Name: "node-b", UID: "uid-b"},
  17. }
  18. m := buildNodeIndex(nodes)
  19. require.Equal(t, types.UID("uid-a"), m["node-a"])
  20. require.Equal(t, types.UID("uid-b"), m["node-b"])
  21. require.Len(t, m, 2)
  22. }
  23. func TestBuildNamespaceIndex_Empty(t *testing.T) {
  24. m := buildNamespaceIndex(nil)
  25. require.Empty(t, m)
  26. }
  27. func TestBuildNamespaceIndex(t *testing.T) {
  28. namespaces := []*clustercache.Namespace{
  29. {Name: "default", UID: "uid-default"},
  30. {Name: "kube-system", UID: "uid-kube-system"},
  31. }
  32. m := buildNamespaceIndex(namespaces)
  33. require.Equal(t, types.UID("uid-default"), m["default"])
  34. require.Equal(t, types.UID("uid-kube-system"), m["kube-system"])
  35. require.Len(t, m, 2)
  36. }
  37. func TestBuildPVCIndex_Empty(t *testing.T) {
  38. m := buildPVCIndex(nil)
  39. require.Empty(t, m)
  40. }
  41. func TestBuildPVCIndex(t *testing.T) {
  42. pvcs := []*clustercache.PersistentVolumeClaim{
  43. {Name: "pvc-a", Namespace: "ns-1", UID: "uid-pvc-a"},
  44. {Name: "pvc-a", Namespace: "ns-2", UID: "uid-pvc-a-ns2"}, // same name, different namespace
  45. {Name: "pvc-b", Namespace: "ns-1", UID: "uid-pvc-b"},
  46. }
  47. m := buildPVCIndex(pvcs)
  48. require.Equal(t, types.UID("uid-pvc-a"), m[pvcKey{name: "pvc-a", namespace: "ns-1"}])
  49. require.Equal(t, types.UID("uid-pvc-a-ns2"), m[pvcKey{name: "pvc-a", namespace: "ns-2"}])
  50. require.Equal(t, types.UID("uid-pvc-b"), m[pvcKey{name: "pvc-b", namespace: "ns-1"}])
  51. require.Len(t, m, 3)
  52. }
  53. func TestBuildPVIndex_Empty(t *testing.T) {
  54. m := buildPVIndex(nil)
  55. require.Empty(t, m)
  56. }
  57. func TestBuildPVIndex(t *testing.T) {
  58. pvs := []*clustercache.PersistentVolume{
  59. {Name: "pv-a", UID: "uid-pv-a"},
  60. {Name: "pv-b", UID: "uid-pv-b"},
  61. }
  62. m := buildPVIndex(pvs)
  63. require.Equal(t, types.UID("uid-pv-a"), m["pv-a"])
  64. require.Equal(t, types.UID("uid-pv-b"), m["pv-b"])
  65. require.Len(t, m, 2)
  66. }
  67. // backdate moves the last seen time of an entry into the past.
  68. func backdate[K comparable](pi *persistedIndex[K], key K, d time.Duration) {
  69. entry := pi.entries[key]
  70. entry.lastSeen = entry.lastSeen.Add(-d)
  71. pi.entries[key] = entry
  72. }
  73. func TestPersistedIndex_Nil(t *testing.T) {
  74. var pi *persistedIndex[string]
  75. current := map[string]types.UID{"node-a": "uid-a"}
  76. require.Equal(t, current, pi.update(current))
  77. }
  78. func TestPersistedIndex_RetainsMissingEntries(t *testing.T) {
  79. pi := newPersistedIndex[string]("test")
  80. m := pi.update(map[string]types.UID{"node-a": "uid-a", "node-b": "uid-b"})
  81. require.Equal(t, map[string]types.UID{"node-a": "uid-a", "node-b": "uid-b"}, m)
  82. backdate(pi, "node-b", persistedIndexTTL/2)
  83. m = pi.update(map[string]types.UID{"node-a": "uid-a"})
  84. require.Equal(t, map[string]types.UID{"node-a": "uid-a", "node-b": "uid-b"}, m)
  85. }
  86. func TestPersistedIndex_CurrentOverwritesRetained(t *testing.T) {
  87. pi := newPersistedIndex[string]("test")
  88. pi.update(map[string]types.UID{"node-a": "uid-a-old"})
  89. m := pi.update(map[string]types.UID{"node-a": "uid-a-new"})
  90. require.Equal(t, map[string]types.UID{"node-a": "uid-a-new"}, m)
  91. }
  92. func TestPersistedIndex_EvictsExpiredEntries(t *testing.T) {
  93. pi := newPersistedIndex[string]("test")
  94. pi.update(map[string]types.UID{"node-a": "uid-a", "node-b": "uid-b"})
  95. backdate(pi, "node-b", 2*persistedIndexTTL)
  96. m := pi.update(map[string]types.UID{"node-a": "uid-a"})
  97. require.Equal(t, map[string]types.UID{"node-a": "uid-a"}, m)
  98. require.Len(t, pi.entries, 1)
  99. }
  100. func TestPersistedIndex_ResultIsIndependent(t *testing.T) {
  101. pi := newPersistedIndex[pvcKey]("test")
  102. key := pvcKey{name: "pvc-a", namespace: "ns-1"}
  103. m := pi.update(map[pvcKey]types.UID{key: "uid-pvc-a"})
  104. m[key] = "modified"
  105. m = pi.update(nil)
  106. require.Equal(t, types.UID("uid-pvc-a"), m[key])
  107. }