kube-state-metrics/tests/lib/lib_test.go

82 lines
1.9 KiB
Go

package lib
import (
"context"
"strings"
"testing"
"time"
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/cache"
"k8s.io/kube-state-metrics/pkg/collectors"
"k8s.io/kube-state-metrics/pkg/metrics"
metricsstore "k8s.io/kube-state-metrics/pkg/metrics_store"
)
func TestAsLibrary(t *testing.T) {
kubeClient := fake.NewSimpleClientset()
service := v1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "my-service",
ResourceVersion: "123456",
},
}
_, err := kubeClient.CoreV1().Services(metav1.NamespaceDefault).Create(&service)
if err != nil {
t.Fatal(err)
}
c := serviceCollector(kubeClient)
// Wait for informers to sync
time.Sleep(time.Second)
w := strings.Builder{}
c.Collect(&w)
m := w.String()
if !strings.Contains(m, service.ObjectMeta.Name) {
t.Fatal("expected string to contain service name")
}
}
func serviceCollector(kubeClient clientset.Interface) *collectors.Collector {
store := metricsstore.NewMetricsStore([]string{"test_metric describes a test metric"}, generateServiceMetrics)
lw := cache.ListWatch{
ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) {
return kubeClient.CoreV1().Services(metav1.NamespaceDefault).List(opts)
},
WatchFunc: func(opts metav1.ListOptions) (watch.Interface, error) {
return kubeClient.CoreV1().Services(metav1.NamespaceDefault).Watch(opts)
},
}
r := cache.NewReflector(&lw, &v1.Service{}, store, 0)
go r.Run(context.TODO().Done())
return collectors.NewCollector(store)
}
func generateServiceMetrics(obj interface{}) [][]*metrics.Metric {
sPointer := obj.(*v1.Service)
s := *sPointer
m, err := metrics.NewMetric("test_metric", []string{"name"}, []string{s.Name}, 1)
if err != nil {
panic(err)
}
ms := []*metrics.Metric{m}
return [][]*metrics.Metric{ms}
}