package main import ( "log" "git.k6n.net/go-cart-actor/pkg/actor" "git.k6n.net/go-cart-actor/pkg/checkout" "git.k6n.net/go-cart-actor/pkg/discovery" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func GetDiscovery() discovery.Discovery { if podIp == "" { return nil } config, kerr := rest.InClusterConfig() if kerr != nil { log.Fatalf("Error creating kubernetes client: %v\n", kerr) } client, err := kubernetes.NewForConfig(config) if err != nil { log.Fatalf("Error creating client: %v\n", err) } timeout := int64(30) return discovery.NewK8sDiscovery(client, v1.ListOptions{ LabelSelector: "actor-pool=checkout", TimeoutSeconds: &timeout, }) } func UseDiscovery(pool actor.GrainPool[*checkout.CheckoutGrain]) { go func(hw discovery.Discovery) { if hw == nil { log.Print("No discovery service available") return } ch, err := hw.Watch() if err != nil { log.Printf("Discovery error: %v", err) return } for evt := range ch { if evt.Host == "" { continue } switch evt.IsReady { case false: if pool.IsKnown(evt.Host) { log.Printf("Host %s is not ready, removing", evt.Host) pool.RemoveHost(evt.Host) } default: if !pool.IsKnown(evt.Host) { log.Printf("Discovered host %s", evt.Host) pool.AddRemoteHost(evt.Host) } } } }(GetDiscovery()) }