From 4ef72066b1c62d32552e702c8c0fd365cbb42f90 Mon Sep 17 00:00:00 2001
From: Garet Halliday <me@garet.holiday>
Date: Mon, 2 Oct 2023 14:30:30 -0500
Subject: [PATCH] improve discovery for zalando operator discovery

---
 lib/gat/handlers/discovery/discoverer.go      |  5 ++--
 .../discoverers/digitalocean/discoverer.go    |  4 ----
 .../google_cloud_sql/discoverer.go            |  4 ----
 .../zalando_operator/discoverer.go            | 24 ++++++++++++-------
 lib/gat/handlers/discovery/module.go          |  6 +++--
 5 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/lib/gat/handlers/discovery/discoverer.go b/lib/gat/handlers/discovery/discoverer.go
index 6ef75817..6fb83733 100644
--- a/lib/gat/handlers/discovery/discoverer.go
+++ b/lib/gat/handlers/discovery/discoverer.go
@@ -1,11 +1,10 @@
 package discovery
 
-// Discoverer looks up and returns the servers. It must implement either Clusters or Added, Updated, and Removed.
-// Both can be implemented for extra robustness.
+// Discoverer looks up and returns the servers. It must implement Clusters. Optionally, it can implement Added
+// and Removed for faster updating. For updates, just send to Added.
 type Discoverer interface {
 	Clusters() ([]Cluster, error)
 
 	Added() <-chan Cluster
-	Updated() <-chan Cluster
 	Removed() <-chan string
 }
diff --git a/lib/gat/handlers/discovery/discoverers/digitalocean/discoverer.go b/lib/gat/handlers/discovery/discoverers/digitalocean/discoverer.go
index 8a31dfe0..bcafe2c4 100644
--- a/lib/gat/handlers/discovery/discoverers/digitalocean/discoverer.go
+++ b/lib/gat/handlers/discovery/discoverers/digitalocean/discoverer.go
@@ -100,10 +100,6 @@ func (T *Discoverer) Added() <-chan discovery.Cluster {
 	return nil
 }
 
-func (T *Discoverer) Updated() <-chan discovery.Cluster {
-	return nil
-}
-
 func (T *Discoverer) Removed() <-chan string {
 	return nil
 }
diff --git a/lib/gat/handlers/discovery/discoverers/google_cloud_sql/discoverer.go b/lib/gat/handlers/discovery/discoverers/google_cloud_sql/discoverer.go
index 7ea6dc0d..6bb9351b 100644
--- a/lib/gat/handlers/discovery/discoverers/google_cloud_sql/discoverer.go
+++ b/lib/gat/handlers/discovery/discoverers/google_cloud_sql/discoverer.go
@@ -208,10 +208,6 @@ func (T *Discoverer) Added() <-chan discovery.Cluster {
 	return nil
 }
 
-func (T *Discoverer) Updated() <-chan discovery.Cluster {
-	return nil
-}
-
 func (T *Discoverer) Removed() <-chan string {
 	return nil
 }
diff --git a/lib/gat/handlers/discovery/discoverers/zalando_operator/discoverer.go b/lib/gat/handlers/discovery/discoverers/zalando_operator/discoverer.go
index 75a617e9..62f547c4 100644
--- a/lib/gat/handlers/discovery/discoverers/zalando_operator/discoverer.go
+++ b/lib/gat/handlers/discovery/discoverers/zalando_operator/discoverer.go
@@ -36,7 +36,6 @@ type Discoverer struct {
 	k8s k8sutil.KubernetesClient
 
 	added   chan discovery.Cluster
-	updated chan discovery.Cluster
 	removed chan string
 
 	done chan struct{}
@@ -107,7 +106,6 @@ func (T *Discoverer) Provision(ctx caddy.Context) error {
 	)
 
 	T.added = make(chan discovery.Cluster)
-	T.updated = make(chan discovery.Cluster)
 	T.removed = make(chan string)
 
 	_, err = T.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
@@ -131,7 +129,7 @@ func (T *Discoverer) Provision(ctx caddy.Context) error {
 			if err != nil {
 				return
 			}
-			T.updated <- cluster
+			T.added <- cluster
 		},
 		DeleteFunc: func(obj interface{}) {
 			psql, ok := obj.(*acidv1.Postgresql)
@@ -207,17 +205,27 @@ func (T *Discoverer) postgresqlToCluster(cluster acidv1.Postgresql) (discovery.C
 }
 
 func (T *Discoverer) Clusters() ([]discovery.Cluster, error) {
-	return nil, nil
+	clusters, err := T.k8s.Postgresqls(T.Namespace).List(context.Background(), metav1.ListOptions{})
+	if err != nil {
+		return nil, err
+	}
+
+	res := make([]discovery.Cluster, 0, len(clusters.Items))
+	for _, cluster := range clusters.Items {
+		r, err := T.postgresqlToCluster(cluster)
+		if err != nil {
+			return nil, err
+		}
+		res = append(res, r)
+	}
+
+	return res, nil
 }
 
 func (T *Discoverer) Added() <-chan discovery.Cluster {
 	return T.added
 }
 
-func (T *Discoverer) Updated() <-chan discovery.Cluster {
-	return T.updated
-}
-
 func (T *Discoverer) Removed() <-chan string {
 	return T.removed
 }
diff --git a/lib/gat/handlers/discovery/module.go b/lib/gat/handlers/discovery/module.go
index d84ced43..a4cd104d 100644
--- a/lib/gat/handlers/discovery/module.go
+++ b/lib/gat/handlers/discovery/module.go
@@ -125,6 +125,10 @@ func (T *Module) creds(user User) (primary, replica auth.Credentials) {
 }
 
 func (T *Module) added(cluster Cluster) {
+	if prev, ok := T.clusters[cluster.ID]; ok {
+		T.updated(prev, cluster)
+		return
+	}
 	if T.clusters == nil {
 		T.clusters = make(map[string]Cluster)
 	}
@@ -475,8 +479,6 @@ func (T *Module) discoverLoop() {
 			T.added(cluster)
 		case id := <-T.discoverer.Removed():
 			T.removed(id)
-		case next := <-T.discoverer.Updated():
-			T.updated(T.clusters[next.ID], next)
 		case <-reconcile:
 			err := T.reconcile()
 			if err != nil {
-- 
GitLab