Files

96 lines
2.9 KiB
Go

package cli
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
func metricsKubeClient(t *testing.T, statusCode int, body string) *KubeClient {
t.Helper()
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(statusCode)
_, _ = fmt.Fprint(w, body)
}))
t.Cleanup(server.Close)
cli, err := kubernetes.NewForConfig(&rest.Config{Host: server.URL})
require.NoError(t, err)
return &KubeClient{cli: cli}
}
func TestFeatureGateEnabled(t *testing.T) {
t.Parallel()
t.Run("returns true when feature gate is enabled", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusOK,
"kubernetes_feature_enabled{name=\"TestGate\",stage=\"ALPHA\"} 1\n")
ok, err := kcl.featureGateEnabled(t.Context(), "TestGate")
require.NoError(t, err)
assert.True(t, ok)
})
t.Run("returns true when labels are in different order", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusOK,
"kubernetes_feature_enabled{stage=\"ALPHA\",name=\"TestGate\"} 1\n")
ok, err := kcl.featureGateEnabled(t.Context(), "TestGate")
require.NoError(t, err)
assert.True(t, ok)
})
t.Run("returns false when feature gate is disabled", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusOK,
"kubernetes_feature_enabled{name=\"TestGate\",stage=\"ALPHA\"} 0\n")
ok, err := kcl.featureGateEnabled(t.Context(), "TestGate")
require.NoError(t, err)
assert.False(t, ok)
})
t.Run("returns false when feature gate is absent", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusOK,
"kubernetes_feature_enabled{name=\"OtherGate\",stage=\"ALPHA\"} 1\n")
ok, err := kcl.featureGateEnabled(t.Context(), "TestGate")
require.NoError(t, err)
assert.False(t, ok)
})
t.Run("returns error when metrics endpoint is unavailable", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusForbidden, "")
ok, err := kcl.featureGateEnabled(t.Context(), "TestGate")
require.Error(t, err)
assert.False(t, ok)
})
}
func TestSupportsPodRestart(t *testing.T) {
t.Parallel()
t.Run("returns true when feature gate is enabled", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusOK,
"kubernetes_feature_enabled{name=\"RestartAllContainersOnContainerExits\",stage=\"ALPHA\"} 1\n")
ok, err := kcl.SupportsPodRestart(t.Context())
require.NoError(t, err)
assert.True(t, ok)
})
t.Run("returns false when feature gate is absent", func(t *testing.T) {
t.Parallel()
kcl := metricsKubeClient(t, http.StatusOK,
"kubernetes_feature_enabled{name=\"OtherFeature\",stage=\"ALPHA\"} 1\n")
ok, err := kcl.SupportsPodRestart(t.Context())
require.NoError(t, err)
assert.False(t, ok)
})
}