package discovery import ( "os" "path/filepath" "testing" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) func kubeConfigPath(t *testing.T) string { home, err := os.UserHomeDir() if err != nil { t.Skip("Skipping test: user home dir not found") } path := filepath.Join(home, ".kube", "config") if _, err := os.Stat(path); os.IsNotExist(err) { t.Skipf("Skipping test: %s not found", path) } return path } func TestDiscovery(t *testing.T) { path := kubeConfigPath(t) config, err := clientcmd.BuildConfigFromFlags("", path) if err != nil { t.Fatalf("Error building config: %v", err) } client, err := kubernetes.NewForConfig(config) if err != nil { t.Fatalf("Error creating client: %v", err) } d := NewK8sDiscovery(client, metav1.ListOptions{ LabelSelector: "app", }) res, err := d.DiscoverInNamespace("") if err != nil { t.Errorf("Error discovering: %v", err) } if len(res) == 0 { t.Errorf("Expected at least one host, got none") } } func TestWatch(t *testing.T) { path := kubeConfigPath(t) config, err := clientcmd.BuildConfigFromFlags("", path) if err != nil { t.Fatalf("Error building config: %v", err) } client, err := kubernetes.NewForConfig(config) if err != nil { t.Fatalf("Error creating client: %v", err) } d := NewK8sDiscovery(client, metav1.ListOptions{ LabelSelector: "app", }) ch, err := d.Watch() if err != nil { t.Errorf("Error watching: %v", err) } select { case m := <-ch: t.Logf("Received watch %v", m) case <-time.After(5 * time.Second): t.Errorf("Timeout waiting for watch") } }