From ce128982f9fa446c4e368ac4a1cbe5f2aec21658 Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Thu, 23 Nov 2017 22:54:31 +0100 Subject: [PATCH] adds logging prototype --- Makefile | 2 +- cmd/play/main.go | 139 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 cmd/play/main.go diff --git a/Makefile b/Makefile index 778e4376383..b91b9ce325b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION ?= $(shell git rev-parse --verify HEAD) GOOS ?= $(shell go env | grep GOOS | cut -d'"' -f2) -BINARIES := apiserver kubernikus kubernikusctl wormhole +BINARIES := apiserver kubernikus kubernikusctl wormhole play LDFLAGS := -X github.com/sapcc/kubernikus/pkg/version.GitCommit=$(VERSION) GOFLAGS := -ldflags "$(LDFLAGS) -s -w" diff --git a/cmd/play/main.go b/cmd/play/main.go new file mode 100644 index 00000000000..8c8c93decf9 --- /dev/null +++ b/cmd/play/main.go @@ -0,0 +1,139 @@ +package main + +import ( + "fmt" + "os" + "time" + + "github.com/go-kit/kit/log" +) + +type Kluster struct { + Name string + Pool []string +} + +var KLUSTER = []Kluster{ + Kluster{"fabus", []string{"mypool"}}, + Kluster{"esther", []string{"swimmingpool"}}, + Kluster{"michi", []string{"poo", "pool"}}, + Kluster{"marian", []string{"schwarz", "weiss"}}, +} + +type Controller interface { + Run() +} + +type Reconciler interface { + Reconcile(Kluster) (bool, error) +} + +type controller struct { + Name string + Reconciler Reconciler + Logger log.Logger +} + +func (c *controller) Run() { + c.Logger.Log("msg", "running") + + for _, kluster := range KLUSTER { + requeue, _ := c.Reconciler.Reconcile(kluster) + if requeue { + c.Logger.Log("msg", "requeue requested", "kluster", kluster.Name) + c.Reconciler.Reconcile(kluster) + } + } +} + +type launchReconciler struct { + Logger log.Logger +} + +type groundReconciler struct { + Logger log.Logger +} + +func NewLaunchControl(logger log.Logger) Controller { + logger = log.With(logger, "controller", "launch") + return &controller{ + Name: "launch", + Reconciler: &launchReconciler{logger}, + Logger: logger, + } +} + +func NewGroundControl(logger log.Logger) Controller { + logger = log.With(logger, "controller", "ground") + return &controller{ + Name: "ground", + Reconciler: &groundReconciler{logger}, + Logger: logger, + } +} + +func (r *launchReconciler) Reconcile(kluster Kluster) (requeue bool, err error) { + defer func(begin time.Time) { + r.Logger.Log( + "msg", "reconciled kluster", + "kluster", kluster.Name, + "reqeue", requeue, + "took", time.Since(begin), + "err", err) + }(time.Now()) + + if kluster.Name == "michi" { + return false, fmt.Errorf("reconciliation failed") + } + + for _, pool := range kluster.Pool { + if err = r.ReconcilePool(kluster, pool); err != nil { + return + } + } + + if kluster.Name == "fabus" { + return true, nil + } + + return +} + +func (r *launchReconciler) ReconcilePool(kluster Kluster, pool string) (err error) { + defer func(begin time.Time) { + r.Logger.Log( + "msg", "reconciled pool", + "kluster", kluster.Name, + "pool", pool, + "took", time.Since(begin), + "err", err) + }(time.Now()) + + return nil +} + +func (r *groundReconciler) Reconcile(kluster Kluster) (requeue bool, err error) { + defer func(begin time.Time) { + r.Logger.Log( + "msg", "reconciled kluster", + "kluster", kluster.Name, + "reqeue", requeue, + "took", time.Since(begin), + "err", err) + }(time.Now()) + + if kluster.Name == "michi" { + return false, fmt.Errorf("reconciliation failed") + } + + return false, nil +} + +func main() { + w := log.NewSyncWriter(os.Stderr) + logger := log.NewLogfmtLogger(w) + logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) + + NewLaunchControl(logger).Run() + NewGroundControl(logger).Run() +}