cluster_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package kubemodel
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/require"
  7. "github.com/opencost/opencost/core/pkg/model/kubemodel"
  8. "github.com/opencost/opencost/core/pkg/model/shared"
  9. "github.com/opencost/opencost/core/pkg/source"
  10. )
  11. func TestComputeCluster(t *testing.T) {
  12. start := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
  13. end := start.Add(time.Hour)
  14. tests := []struct {
  15. name string
  16. overrides map[string]any
  17. want *kubemodel.Cluster
  18. wantErr bool
  19. }{
  20. {
  21. name: "no data returns error",
  22. overrides: map[string]any{},
  23. wantErr: true,
  24. },
  25. {
  26. name: "basic cluster info and uptime",
  27. overrides: map[string]any{
  28. source.QueryClusterInfo: []*source.ClusterInfoResult{
  29. {UID: testClusterUID, Cluster: "my-cluster"},
  30. },
  31. source.QueryClusterUptime: []*source.UptimeResult{
  32. {UID: testClusterUID, First: start, Last: end},
  33. },
  34. },
  35. want: &kubemodel.Cluster{
  36. UID: testClusterUID,
  37. Name: "my-cluster",
  38. Start: start,
  39. End: end,
  40. },
  41. },
  42. {
  43. name: "cluster with provider, account, and region",
  44. overrides: map[string]any{
  45. source.QueryClusterInfo: []*source.ClusterInfoResult{
  46. {UID: testClusterUID, Cluster: "prod-cluster", Provider: "aws", AccountID: "123456789", Region: "us-east-1"},
  47. },
  48. source.QueryClusterUptime: []*source.UptimeResult{
  49. {UID: testClusterUID, First: start, Last: end},
  50. },
  51. },
  52. want: &kubemodel.Cluster{
  53. UID: testClusterUID,
  54. Name: "prod-cluster",
  55. Provider: shared.ProviderAWS,
  56. Account: "123456789",
  57. Region: "us-east-1",
  58. Start: start,
  59. End: end,
  60. },
  61. },
  62. {
  63. name: "cluster without uptime is registered with zero window but fails validation",
  64. overrides: map[string]any{
  65. source.QueryClusterInfo: []*source.ClusterInfoResult{
  66. {UID: testClusterUID, Cluster: "my-cluster"},
  67. },
  68. },
  69. want: nil,
  70. },
  71. {
  72. name: "uptime for unknown cluster is ignored",
  73. overrides: map[string]any{
  74. source.QueryClusterInfo: []*source.ClusterInfoResult{
  75. {UID: testClusterUID, Cluster: "my-cluster"},
  76. },
  77. source.QueryClusterUptime: []*source.UptimeResult{
  78. {UID: testClusterUID, First: start, Last: end},
  79. {UID: "unknown-cluster", First: start, Last: end},
  80. },
  81. },
  82. want: &kubemodel.Cluster{
  83. UID: testClusterUID,
  84. Name: "my-cluster",
  85. Start: start,
  86. End: end,
  87. },
  88. },
  89. }
  90. for _, tt := range tests {
  91. t.Run(tt.name, func(t *testing.T) {
  92. ds := source.NewMockOpenCostDataSource()
  93. ds.ResolutionValue = 5 * time.Minute
  94. for method, result := range tt.overrides {
  95. ds.Querier.SetOverride(method, result)
  96. }
  97. km, err := NewKubeModel(testClusterUID, false, ds)
  98. require.NoError(t, err)
  99. kms, err := km.ComputeKubeModelSet(start, end)
  100. if tt.wantErr {
  101. require.Error(t, err)
  102. return
  103. }
  104. require.NoError(t, err)
  105. assert.Equal(t, tt.want, kms.Cluster)
  106. })
  107. }
  108. }