| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- package scrape
- import (
- "testing"
- "github.com/stretchr/testify/assert"
- coreenv "github.com/opencost/opencost/core/pkg/env"
- "github.com/opencost/opencost/modules/collector-source/pkg/metric"
- )
- // staticScraper is a test double that returns a fixed set of updates.
- type staticScraper struct {
- updates []metric.Update
- }
- func (s *staticScraper) Scrape() []metric.Update { return s.updates }
- func updates(names ...string) []metric.Update {
- out := make([]metric.Update, len(names))
- for i, n := range names {
- out[i] = metric.Update{Name: n}
- }
- return out
- }
- func updateNames(us []metric.Update) []string {
- names := make([]string, len(us))
- for i, u := range us {
- names[i] = u.Name
- }
- return names
- }
- func TestWithFilter_EmptyFilterReturnsOriginalScraper(t *testing.T) {
- s := &staticScraper{}
- wrapped := withFilter(s, MetricFilter{})
- assert.Same(t, s, wrapped, "empty filter should return the original scraper unchanged")
- }
- func TestWithFilter_NilFilterReturnsOriginalScraper(t *testing.T) {
- s := &staticScraper{}
- wrapped := withFilter(s, nil)
- assert.Same(t, s, wrapped, "nil filter should return the original scraper unchanged")
- }
- func TestWithFilter_NonEmptyFilterWraps(t *testing.T) {
- s := &staticScraper{}
- f := MetricFilter{"some_metric": {}}
- wrapped := withFilter(s, f)
- _, isFiltered := wrapped.(*filteredScraper)
- assert.True(t, isFiltered, "non-empty filter should wrap in a filteredScraper")
- }
- func TestFilteredScraper_AllowsMetricsNotInFilter(t *testing.T) {
- s := &staticScraper{updates: updates("cpu_usage", "memory_usage")}
- f := MetricFilter{"kube_pod_annotations": {}}
- wrapped := withFilter(s, f)
- got := wrapped.Scrape()
- assert.Equal(t, []string{"cpu_usage", "memory_usage"}, updateNames(got))
- }
- func TestFilteredScraper_BlocksDeniedMetrics(t *testing.T) {
- s := &staticScraper{updates: updates("cpu_usage", metric.KubePodAnnotations, "memory_usage")}
- f := MetricFilter{metric.KubePodAnnotations: {}}
- wrapped := withFilter(s, f)
- got := wrapped.Scrape()
- assert.Equal(t, []string{"cpu_usage", "memory_usage"}, updateNames(got))
- }
- func TestFilteredScraper_BlocksMultipleDeniedMetrics(t *testing.T) {
- s := &staticScraper{updates: updates(
- metric.KubePodAnnotations,
- "cpu_usage",
- metric.KubeNamespaceAnnotations,
- "memory_usage",
- )}
- f := MetricFilter{
- metric.KubePodAnnotations: {},
- metric.KubeNamespaceAnnotations: {},
- }
- wrapped := withFilter(s, f)
- got := wrapped.Scrape()
- assert.Equal(t, []string{"cpu_usage", "memory_usage"}, updateNames(got))
- }
- func TestFilteredScraper_EmptyResultsPassThrough(t *testing.T) {
- s := &staticScraper{updates: []metric.Update{}}
- f := MetricFilter{metric.KubePodAnnotations: {}}
- wrapped := withFilter(s, f)
- got := wrapped.Scrape()
- assert.Empty(t, got)
- }
- func TestFilteredScraper_AllMetricsDenied(t *testing.T) {
- s := &staticScraper{updates: updates(metric.KubePodAnnotations, metric.KubeNamespaceAnnotations)}
- f := MetricFilter{
- metric.KubePodAnnotations: {},
- metric.KubeNamespaceAnnotations: {},
- }
- wrapped := withFilter(s, f)
- got := wrapped.Scrape()
- assert.Empty(t, got)
- }
- func TestGetDefaultMetricFilter_PodAnnotationsDisabled(t *testing.T) {
- t.Setenv(coreenv.EmitPodAnnotationsMetricEnvVar, "false")
- t.Setenv(coreenv.EmitNamespaceAnnotationsMetricEnvVar, "true")
- f := getDefaultMetricFilter()
- _, podDenied := f[metric.KubePodAnnotations]
- _, nsDenied := f[metric.KubeNamespaceAnnotations]
- assert.True(t, podDenied, "pod annotations should be denied when env var is false")
- assert.False(t, nsDenied, "namespace annotations should be allowed when env var is true")
- }
- func TestGetDefaultMetricFilter_NamespaceAnnotationsDisabled(t *testing.T) {
- t.Setenv(coreenv.EmitPodAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitNamespaceAnnotationsMetricEnvVar, "false")
- f := getDefaultMetricFilter()
- _, podDenied := f[metric.KubePodAnnotations]
- _, nsDenied := f[metric.KubeNamespaceAnnotations]
- assert.False(t, podDenied, "pod annotations should be allowed when env var is true")
- assert.True(t, nsDenied, "namespace annotations should be denied when env var is false")
- }
- func TestGetDefaultMetricFilter_BothDisabledByDefault(t *testing.T) {
- t.Setenv(coreenv.EmitPodAnnotationsMetricEnvVar, "")
- t.Setenv(coreenv.EmitNamespaceAnnotationsMetricEnvVar, "")
- f := getDefaultMetricFilter()
- _, podDenied := f[metric.KubePodAnnotations]
- _, nsDenied := f[metric.KubeNamespaceAnnotations]
- assert.True(t, podDenied, "pod annotations should be denied by default")
- assert.True(t, nsDenied, "namespace annotations should be denied by default")
- }
- func TestGetDefaultMetricFilter_AllEnabled(t *testing.T) {
- t.Setenv(coreenv.EmitPodAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitNamespaceAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitDeploymentLabelsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitDeploymentAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitStatefulSetLabelsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitStatefulSetAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitDaemonSetLabelsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitDaemonSetAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitJobLabelsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitJobAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitCronJobLabelsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitCronJobAnnotationsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitReplicaSetLabelsMetricEnvVar, "true")
- t.Setenv(coreenv.EmitReplicaSetAnnotationsMetricEnvVar, "true")
- f := getDefaultMetricFilter()
- assert.Empty(t, f, "filter should be empty when all metrics are enabled")
- }
- func TestGetDefaultMetricFilter_AnnotationsDefaultFalse(t *testing.T) {
- // Unset all env vars to exercise pure defaults.
- for _, v := range []string{
- coreenv.EmitPodAnnotationsMetricEnvVar,
- coreenv.EmitNamespaceAnnotationsMetricEnvVar,
- coreenv.EmitDeploymentAnnotationsMetricEnvVar,
- coreenv.EmitStatefulSetAnnotationsMetricEnvVar,
- coreenv.EmitDaemonSetAnnotationsMetricEnvVar,
- coreenv.EmitJobAnnotationsMetricEnvVar,
- coreenv.EmitCronJobAnnotationsMetricEnvVar,
- coreenv.EmitReplicaSetAnnotationsMetricEnvVar,
- } {
- t.Setenv(v, "")
- }
- f := getDefaultMetricFilter()
- for _, name := range []string{
- metric.KubePodAnnotations,
- metric.KubeNamespaceAnnotations,
- metric.DeploymentAnnotations,
- metric.StatefulSetAnnotations,
- metric.DaemonSetAnnotations,
- metric.JobAnnotations,
- metric.CronJobAnnotations,
- metric.ReplicaSetAnnotations,
- } {
- _, denied := f[name]
- assert.True(t, denied, "%s should be denied by default", name)
- }
- }
- func TestGetDefaultMetricFilter_LabelsDefaultTrue(t *testing.T) {
- // Unset all label env vars to exercise pure defaults.
- for _, v := range []string{
- coreenv.EmitDeploymentLabelsMetricEnvVar,
- coreenv.EmitStatefulSetLabelsMetricEnvVar,
- coreenv.EmitDaemonSetLabelsMetricEnvVar,
- coreenv.EmitJobLabelsMetricEnvVar,
- coreenv.EmitCronJobLabelsMetricEnvVar,
- coreenv.EmitReplicaSetLabelsMetricEnvVar,
- } {
- t.Setenv(v, "")
- }
- f := getDefaultMetricFilter()
- for _, name := range []string{
- metric.DeploymentLabels,
- metric.StatefulSetLabels,
- metric.DaemonSetLabels,
- metric.JobLabels,
- metric.CronJobLabels,
- metric.ReplicaSetLabels,
- } {
- _, denied := f[name]
- assert.False(t, denied, "%s should be allowed by default", name)
- }
- }
|