pin_test.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package kubemodel
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. "github.com/opencost/opencost/core/pkg/source"
  7. )
  8. // pinnableRecordQuerier records calls made to it directly, and hands out a separate recording querier
  9. // over the seeded data when pinned.
  10. type pinnableRecordQuerier struct {
  11. *source.RecordMetricsQuerier
  12. pinned *source.RecordMetricsQuerier
  13. pins int
  14. releases int
  15. }
  16. func (p *pinnableRecordQuerier) Pin() (source.MetricsQuerier, func()) {
  17. p.pins++
  18. return p.pinned, func() { p.releases++ }
  19. }
  20. type pinnableDataSource struct {
  21. *source.MockOpenCostDataSource
  22. querier *pinnableRecordQuerier
  23. }
  24. func (d *pinnableDataSource) Metrics() source.MetricsQuerier { return d.querier }
  25. // Every query issued while computing a KubeModelSet must go through one pinned querier, so that all
  26. // resources are computed from one consistent state of the data source.
  27. func TestComputeKubeModelSet_PinsDataSource(t *testing.T) {
  28. start, end := newTestWindow()
  29. seeded := source.NewMockOpenCostDataSource()
  30. seedCluster(seeded, start, end)
  31. querier := &pinnableRecordQuerier{
  32. RecordMetricsQuerier: source.NewRecordMetricsQuerier(source.NewMockMetricsQuerier()),
  33. pinned: source.NewRecordMetricsQuerier(seeded.Querier),
  34. }
  35. ds := &pinnableDataSource{MockOpenCostDataSource: source.NewMockOpenCostDataSource(), querier: querier}
  36. km, err := NewKubeModel(testClusterUID, false, ds)
  37. require.NoError(t, err)
  38. kms, err := km.ComputeKubeModelSet(start, end)
  39. require.NoError(t, err)
  40. require.NotNil(t, kms.Cluster, "cluster should be computed from the pinned data")
  41. assert.Empty(t, querier.Calls, "no query should bypass the pinned querier")
  42. assert.NotEmpty(t, querier.pinned.Calls)
  43. assert.Equal(t, 1, querier.pins)
  44. assert.Equal(t, 1, querier.releases)
  45. }