Skip to content

Commit 224b969

Browse files
committed
More reusable pkg, step 1
In the perspective of a reusable, generic pkg/ content: * Reduce the scope expected from logger, and reduce it to a minimal interface * Start to remove KfConfig (remains: observer and controller): pass naked arguments directly to packages constructors
1 parent 0f1ea3d commit 224b969

File tree

7 files changed

+107
-119
lines changed

7 files changed

+107
-119
lines changed

cmd/execute.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,15 @@ func runE(cmd *cobra.Command, args []string) (err error) {
4848
ResyncIntv: resync,
4949
}
5050

51-
repo, err := git.New(conf).Start()
51+
repo, err := git.New(logger, dryRun, localDir, gitURL).Start()
5252
if err != nil {
5353
conf.Logger.Fatalf("failed to start git repo handler: %v", err)
5454
}
5555

5656
evts := event.New()
57-
reco := recorder.New(conf, evts).Start()
57+
reco := recorder.New(logger, evts, localDir, resyncInt*2, dryRun).Start()
5858
obsv := observer.New(conf, evts, &controller.Factory{}).Start()
59-
http := health.New(conf).Start()
59+
http := health.New(logger, healthP).Start()
6060

6161
sigterm := make(chan os.Signal, 1)
6262
signal.Notify(sigterm, syscall.SIGTERM)

pkg/health/health.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,54 @@ import (
66
"fmt"
77
"io"
88
"net/http"
9-
10-
"github.com/bpineau/katafygio/config"
119
)
1210

11+
type logger interface {
12+
Infof(format string, args ...interface{})
13+
Errorf(format string, args ...interface{})
14+
}
15+
1316
// Listener is an http health check listener
1417
type Listener struct {
15-
config *config.KfConfig
18+
logger logger
19+
port int
1620
donech chan struct{}
1721
srv *http.Server
1822
}
1923

2024
// New create a new http health check listener
21-
func New(config *config.KfConfig) *Listener {
25+
func New(log logger, port int) *Listener {
2226
return &Listener{
23-
config: config,
27+
logger: log,
28+
port: port,
2429
donech: make(chan struct{}),
2530
srv: nil,
2631
}
2732
}
2833

2934
func (h *Listener) healthCheckReply(w http.ResponseWriter, r *http.Request) {
3035
if _, err := io.WriteString(w, "ok\n"); err != nil {
31-
h.config.Logger.Warningf("Failed to reply to http healtcheck from %s: %s\n", r.RemoteAddr, err)
36+
h.logger.Errorf("Failed to reply to http healtcheck from %s: %s\n", r.RemoteAddr, err)
3237
}
3338
}
3439

3540
// Start exposes an http healthcheck handler
3641
func (h *Listener) Start() *Listener {
37-
if h.config.HealthPort == 0 {
42+
if h.port == 0 {
3843
return h
3944
}
4045

41-
h.config.Logger.Info("Starting http healtcheck handler")
46+
h.logger.Infof("Starting http healtcheck handler")
4247

43-
h.srv = &http.Server{Addr: fmt.Sprintf(":%d", h.config.HealthPort)}
48+
h.srv = &http.Server{Addr: fmt.Sprintf(":%d", h.port)}
4449

4550
http.HandleFunc("/health", h.healthCheckReply)
4651

4752
go func() {
4853
defer close(h.donech)
4954
err := h.srv.ListenAndServe()
5055
if err != nil && err.Error() != "http: Server closed" {
51-
h.config.Logger.Errorf("healthcheck server failed: %v", err)
56+
h.logger.Errorf("healthcheck server failed: %v", err)
5257
}
5358
}()
5459

@@ -61,11 +66,11 @@ func (h *Listener) Stop() {
6166
return
6267
}
6368

64-
h.config.Logger.Info("Stopping http healtcheck handler")
69+
h.logger.Infof("Stopping http healtcheck handler")
6570

6671
err := h.srv.Shutdown(context.TODO())
6772
if err != nil {
68-
h.config.Logger.Warningf("failed to stop http healtcheck handler: %v", err)
73+
h.logger.Errorf("failed to stop http healtcheck handler: %v", err)
6974
}
7075

7176
<-h.donech

pkg/health/health_test.go

+6-16
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,29 @@ import (
88
"github.com/sirupsen/logrus"
99
"github.com/sirupsen/logrus/hooks/test"
1010

11-
"github.com/bpineau/katafygio/config"
1211
"github.com/bpineau/katafygio/pkg/log"
1312
)
1413

15-
func TestNoopHealth(t *testing.T) {
14+
var logs = log.New("error", "", "test")
1615

17-
conf := &config.KfConfig{
18-
Logger: log.New("error", "", "test"),
19-
HealthPort: 0,
20-
}
16+
func TestNoopHealth(t *testing.T) {
2117

2218
// shouldn't panic with 0 as port
23-
hc := New(conf)
19+
hc := New(logs, 0)
2420
_ = hc.Start()
2521
hc.Stop()
2622

27-
conf.HealthPort = -42
28-
hc = New(conf)
23+
hc = New(logs, -42)
2924
_ = hc.Start()
3025
hc.Stop()
31-
hook := hc.config.Logger.Hooks[logrus.InfoLevel][0].(*test.Hook)
26+
hook := logs.Hooks[logrus.InfoLevel][0].(*test.Hook)
3227
if len(hook.Entries) != 1 {
3328
t.Error("Failed to log an issue with a bogus port")
3429
}
3530
}
3631

3732
func TestHealthCheck(t *testing.T) {
38-
conf := &config.KfConfig{
39-
Logger: log.New("info", "", "test"),
40-
HealthPort: 0,
41-
}
42-
43-
hc := New(conf)
33+
hc := New(logs, 0)
4434

4535
req, err := http.NewRequest("GET", "/health", nil)
4636
if err != nil {

pkg/recorder/recorder.go

+32-26
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313

1414
"github.com/spf13/afero"
1515

16-
"github.com/bpineau/katafygio/config"
1716
"github.com/bpineau/katafygio/pkg/event"
1817
)
1918

@@ -22,6 +21,11 @@ var (
2221
crc64Table = crc64.MakeTable(crc64.ECMA)
2322
)
2423

24+
type logger interface {
25+
Infof(format string, args ...interface{})
26+
Errorf(format string, args ...interface{})
27+
}
28+
2529
// activeFiles will contain a list of active (present in cluster) objets; we'll
2630
// use that to periodically find and garbage collect stale objets in the git repos
2731
// (ie. if some objects were delete from cluster while katafygio was not running),
@@ -30,36 +34,42 @@ type activeFiles map[string]uint64
3034

3135
// Listener receive events from controllers and save them to disk as yaml files
3236
type Listener struct {
33-
config *config.KfConfig
37+
logger logger
3438
events event.Notifier
3539
actives activeFiles
3640
activesLock sync.RWMutex
41+
localDir string
42+
gcInterval time.Duration
43+
dryRun bool
3744
stopch chan struct{}
3845
donech chan struct{}
3946
}
4047

4148
// New creates a new event Listener
42-
func New(config *config.KfConfig, events event.Notifier) *Listener {
49+
func New(log logger, events event.Notifier, localDir string, gcInterval int, dryRun bool) *Listener {
4350
return &Listener{
44-
config: config,
45-
events: events,
46-
actives: activeFiles{},
47-
stopch: make(chan struct{}),
48-
donech: make(chan struct{}),
51+
logger: log,
52+
events: events,
53+
actives: activeFiles{},
54+
localDir: localDir,
55+
dryRun: dryRun,
56+
gcInterval: time.Duration(gcInterval) * time.Second,
57+
stopch: make(chan struct{}),
58+
donech: make(chan struct{}),
4959
}
5060
}
5161

5262
// Start continuously receive events and saves them to disk as files
5363
func (w *Listener) Start() *Listener {
54-
w.config.Logger.Info("Starting event recorder")
55-
err := appFs.MkdirAll(filepath.Clean(w.config.LocalDir), 0700)
64+
w.logger.Infof("Starting event recorder")
65+
err := appFs.MkdirAll(filepath.Clean(w.localDir), 0700)
5666
if err != nil {
57-
panic(fmt.Sprintf("Can't create directory %s: %v", w.config.LocalDir, err))
67+
panic(fmt.Sprintf("Can't create directory %s: %v", w.localDir, err))
5868
}
5969

6070
go func() {
6171
evCh := w.events.ReadChan()
62-
gcTick := time.NewTicker(w.config.ResyncIntv * 2)
72+
gcTick := time.NewTicker(w.gcInterval)
6373
defer gcTick.Stop()
6474
defer close(w.donech)
6575

@@ -80,15 +90,15 @@ func (w *Listener) Start() *Listener {
8090

8191
// Stop halts the recorder service
8292
func (w *Listener) Stop() {
83-
w.config.Logger.Info("Stopping event recorder")
93+
w.logger.Infof("Stopping event recorder")
8494
close(w.stopch)
8595
<-w.donech
8696
}
8797

8898
func (w *Listener) processNextEvent(ev *event.Notification) {
89-
path, err := getPath(w.config.LocalDir, ev)
99+
path, err := getPath(w.localDir, ev)
90100
if err != nil {
91-
w.config.Logger.Errorf("failed to get %s path: %v", ev.Key, err)
101+
w.logger.Errorf("failed to get %s path: %v", ev.Key, err)
92102
}
93103

94104
switch ev.Action {
@@ -99,7 +109,7 @@ func (w *Listener) processNextEvent(ev *event.Notification) {
99109
}
100110

101111
if err != nil {
102-
w.config.Logger.Errorf("failed to delete or save %s: %v", ev.Key, err)
112+
w.logger.Errorf("failed to delete or save %s: %v", ev.Key, err)
103113
}
104114
}
105115

@@ -115,8 +125,7 @@ func getPath(root string, ev *event.Notification) (string, error) {
115125
}
116126

117127
func (w *Listener) remove(file string) error {
118-
w.config.Logger.Debugf("Removing %s from disk", file)
119-
if w.config.DryRun {
128+
if w.dryRun {
120129
return nil
121130
}
122131

@@ -127,14 +136,12 @@ func (w *Listener) remove(file string) error {
127136
}
128137

129138
func (w *Listener) relativePath(file string) string {
130-
root := filepath.Clean(w.config.LocalDir)
139+
root := filepath.Clean(w.localDir)
131140
return strings.Replace(file, root+"/", "", 1)
132141
}
133142

134143
func (w *Listener) save(file string, data []byte) error {
135-
w.config.Logger.Debugf("Saving %s to disk", file)
136-
137-
if w.config.DryRun {
144+
if w.dryRun {
138145
return nil
139146
}
140147

@@ -182,7 +189,7 @@ func (w *Listener) save(file string, data []byte) error {
182189
func (w *Listener) deleteObsoleteFiles() {
183190
w.activesLock.RLock()
184191
defer w.activesLock.RUnlock()
185-
root := filepath.Clean(w.config.LocalDir)
192+
root := filepath.Clean(w.localDir)
186193

187194
err := afero.Walk(appFs, root, func(path string, info os.FileInfo, err error) error {
188195
if info.IsDir() {
@@ -198,15 +205,14 @@ func (w *Listener) deleteObsoleteFiles() {
198205
return nil
199206
}
200207

201-
w.config.Logger.Debugf("Removing %s from disk", path)
202-
if !w.config.DryRun {
208+
if !w.dryRun {
203209
return appFs.Remove(filepath.Clean(path))
204210
}
205211

206212
return nil
207213
})
208214

209215
if err != nil {
210-
w.config.Logger.Warnf("failed to gc some files: %v", err)
216+
w.logger.Errorf("failed to gc some files: %v", err)
211217
}
212218
}

0 commit comments

Comments
 (0)