From 685e0c533e82639d798e7c438725f9c4d8454ffd Mon Sep 17 00:00:00 2001
From: Murat Kabilov <murat.kabilov@zalando.de>
Date: Fri, 9 Jun 2017 16:02:29 +0200
Subject: [PATCH] introduce cluster interface; remove cluster types separate
 file

---
 pkg/cluster/cluster.go       | 22 ++++++++++++++++++++++
 pkg/cluster/types.go         |  8 --------
 pkg/controller/controller.go |  4 ++--
 pkg/controller/postgresql.go | 19 +++++++++++--------
 4 files changed, 35 insertions(+), 18 deletions(-)
 delete mode 100644 pkg/cluster/types.go

diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go
index 5627b7b6..fa307b96 100644
--- a/pkg/cluster/cluster.go
+++ b/pkg/cluster/cluster.go
@@ -28,6 +28,24 @@ import (
 	"github.com/zalando-incubator/postgres-operator/pkg/util/volumes"
 )
 
+type Interface interface {
+	Create() error
+	Delete() error
+	ExecCommand(podName *spec.NamespacedName, command ...string) (string, error)
+	ReceivePodEvent(event spec.PodEvent)
+	Run(stopCh <-chan struct{})
+	Sync() error
+	Update(newSpec *spec.Postgresql) error
+	SetFailed(err error)
+}
+
+type PostgresRole string
+
+const (
+	Master  PostgresRole = "master"
+	Replica PostgresRole = "replica"
+)
+
 // Config contains operator-wide clients and configuration used from a cluster. TODO: remove struct duplication.
 type Config struct {
 	KubeClient          *kubernetes.Clientset //TODO: move clients to the better place?
@@ -630,3 +648,7 @@ func (c *Cluster) initInfrastructureRoles() error {
 	}
 	return nil
 }
+
+func (c *Cluster) SetFailed(err error) {
+	c.Error = err
+}
diff --git a/pkg/cluster/types.go b/pkg/cluster/types.go
deleted file mode 100644
index 5091e532..00000000
--- a/pkg/cluster/types.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package cluster
-
-type PostgresRole string
-
-const (
-	Master  PostgresRole = "master"
-	Replica PostgresRole = "replica"
-)
diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go
index b0e0962b..b3eb242d 100644
--- a/pkg/controller/controller.go
+++ b/pkg/controller/controller.go
@@ -31,7 +31,7 @@ type Controller struct {
 	logger   *logrus.Entry
 
 	clustersMu sync.RWMutex
-	clusters   map[spec.NamespacedName]*cluster.Cluster
+	clusters   map[spec.NamespacedName]cluster.Interface
 	stopChs    map[spec.NamespacedName]chan struct{}
 
 	postgresqlInformer cache.SharedIndexInformer
@@ -56,7 +56,7 @@ func New(controllerConfig *Config, operatorConfig *config.Config) *Controller {
 		Config:   *controllerConfig,
 		opConfig: operatorConfig,
 		logger:   logger.WithField("pkg", "controller"),
-		clusters: make(map[spec.NamespacedName]*cluster.Cluster),
+		clusters: make(map[spec.NamespacedName]cluster.Interface),
 		stopChs:  make(map[spec.NamespacedName]chan struct{}),
 		podCh:    make(chan spec.PodEvent),
 	}
diff --git a/pkg/controller/postgresql.go b/pkg/controller/postgresql.go
index 14997c37..1f94053a 100644
--- a/pkg/controller/postgresql.go
+++ b/pkg/controller/postgresql.go
@@ -134,8 +134,9 @@ func (c *Controller) processEvent(obj interface{}) error {
 		c.clustersMu.Unlock()
 
 		if err := cl.Create(); err != nil {
-			cl.Error = fmt.Errorf("could not create cluster: %v", err)
-			logger.Errorf("%v", cl.Error)
+			err = fmt.Errorf("could not create cluster: %v", err)
+			logger.Errorf("%v", err)
+			cl.SetFailed(err)
 
 			return nil
 		}
@@ -149,12 +150,13 @@ func (c *Controller) processEvent(obj interface{}) error {
 			return nil
 		}
 		if err := cl.Update(event.NewSpec); err != nil {
-			cl.Error = fmt.Errorf("could not update cluster: %s", err)
-			logger.Errorf("%v", cl.Error)
+			err = fmt.Errorf("could not update cluster: %s", err)
+			logger.Errorf("%v", err)
+			cl.SetFailed(err)
 
 			return nil
 		}
-		cl.Error = nil
+		cl.SetFailed(nil)
 		logger.Infof("Cluster '%s' has been updated", clusterName)
 	case spec.EventDelete:
 		logger.Infof("Deletion of the '%s' cluster started", clusterName)
@@ -191,11 +193,12 @@ func (c *Controller) processEvent(obj interface{}) error {
 		}
 
 		if err := cl.Sync(); err != nil {
-			cl.Error = fmt.Errorf("could not sync cluster '%s': %v", clusterName, err)
-			logger.Errorf("%v", cl.Error)
+			err = fmt.Errorf("could not sync cluster '%s': %v", clusterName, err)
+			logger.Errorf("%v", err)
+			cl.SetFailed(err)
 			return nil
 		}
-		cl.Error = nil
+		cl.SetFailed(nil)
 
 		logger.Infof("Cluster '%s' has been synced", clusterName)
 	}
-- 
GitLab