Skip to content

Commit 53fc1da

Browse files
use functional options
1 parent 9c7e807 commit 53fc1da

27 files changed

+5754
-62
lines changed

main.go

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,67 @@ import (
66
"github.com/zpatrick/go-config"
77
"github.com/codegangsta/cli"
88
"github.com/qnib/doxy/proxy"
9+
"fmt"
910
)
1011

12+
var (
13+
dockerSocketFlag = cli.StringFlag{
14+
Name: "docker-socket",
15+
Value: proxy.DOCKER_SOCKET,
16+
Usage: "Docker host to connect to.",
17+
EnvVar: "DOXY_DOCKER_SOCKET",
18+
}
19+
proxySocketFlag = cli.StringFlag{
20+
Name: "proxy-socket",
21+
Value: proxy.PROXY_SOCKET,
22+
Usage: "Proxy socket to be created",
23+
EnvVar: "DOXY_PROXY_SOCKET",
24+
}
25+
debugFlag = cli.BoolFlag{
26+
Name: "debug",
27+
Usage: "Print proxy requests",
28+
EnvVar: "DOXY_DEBUG",
29+
}
30+
patternFileFlag = cli.StringFlag{
31+
Name: "pattern-file",
32+
Value: proxy.PATTERN_FILE,
33+
Usage: "File holding line-separated regex-patterns to be allowed (comments allowed, use #)",
34+
EnvVar: "DOXY_PATTERN_FILE",
35+
}
36+
)
1137

12-
func RunApp(ctx *cli.Context) {
13-
log.Printf("[II] Start Version: %s", ctx.App.Version)
14-
cfg := config.NewConfig([]config.Provider{config.NewCLI(ctx, true)})
15-
newSock, _ := cfg.String("proxy-socket")
38+
func EvalOptions(cfg *config.Config) (po []proxy.ProxyOption) {
39+
s, _ := cfg.Settings()
40+
ps, _ := cfg.String("proxy-socket")
41+
fmt.Printf("%v | dS:%s\n", s, ps)
42+
proxySock, _ := cfg.String("proxy-socket")
43+
po = append(po, proxy.WithProxySocket(proxySock))
1644
dockerSock, _ := cfg.String("docker-socket")
45+
po = append(po, proxy.WithDockerSocket(dockerSock))
1746
debug, _ := cfg.Bool("debug")
47+
po = append(po, proxy.WithDebugValue(debug))
48+
return
49+
}
50+
51+
func EvalPatternOpts(cfg *config.Config) (proxy.ProxyOption) {
1852
patternsFile, _ := cfg.String("pattern-file")
1953
reader, err := os.Open(patternsFile)
2054
defer reader.Close()
2155
patterns := []string{}
2256
if err != nil {
2357
log.Printf("Error reading patterns file (%s), using default patterns\n", err.Error())
24-
patterns = []string{
25-
`^/(v\d\.\d+/)?containers(/\w+)?/(json|stats|top)$`,
26-
`^/(v\d\.\d+/)?services(/[0-9a-f]+)?$`,
27-
`^/(v\d\.\d+/)?tasks(/\w+)?$`,
28-
`^/(v\d\.\d+/)?networks(/\w+)?$`,
29-
`^/(v\d\.\d+/)?volumes(/\w+)?$`,
30-
`^/(v\d\.\d+/)?nodes(/\w+)?$`,
31-
`^/(v\d\.\d+/)?info$`,
32-
`^/(v\d\.\d+/)?version$`,
33-
"^/_ping$",
34-
}
35-
if debug {
36-
for i, p := range patterns {
37-
log.Printf("%-3d: %s\n", i,p)
38-
}
39-
40-
}
41-
} else {
42-
patterns, err = proxy.ReadPatterns(reader)
58+
return proxy.WithPatterns(proxy.DEFAULT_PATTERNS)
4359
}
44-
p := proxy.NewProxy(newSock, dockerSock, debug)
45-
p.AddPatterns(patterns)
60+
patterns, err = proxy.ReadPatterns(reader)
61+
return proxy.WithPatterns(patterns)
62+
}
63+
64+
func RunApp(ctx *cli.Context) {
65+
log.Printf("[II] Start Version: %s", ctx.App.Version)
66+
cfg := config.NewConfig([]config.Provider{config.NewCLI(ctx, true)})
67+
po := EvalOptions(cfg)
68+
po = append(po, EvalPatternOpts(cfg))
69+
p := proxy.NewProxy(po...)
4670
p.Run()
4771
}
4872

@@ -52,26 +76,10 @@ func main() {
5276
app.Usage = "doxy [options]"
5377
app.Version = "0.1.1"
5478
app.Flags = []cli.Flag{
55-
cli.StringFlag{
56-
Name: "docker-socket",
57-
Value: "/var/run/docker.sock",
58-
Usage: "Docker host to connect to.",
59-
EnvVar: "DOXY_DOCKER_SOCKET",
60-
}, cli.StringFlag{
61-
Name: "proxy-socket",
62-
Value: "/tmp/doxy.sock",
63-
Usage: "Proxy socket to be created",
64-
EnvVar: "DOXY_PROXY_SOCKET",
65-
}, cli.BoolFlag{
66-
Name: "debug",
67-
Usage: "Print proxy requests",
68-
EnvVar: "DOXY_DEBUG",
69-
}, cli.StringFlag{
70-
Name: "pattern-file",
71-
Value: "/etc/doxy.pattern",
72-
Usage: "File holding line-separated regex-patterns to be allowed (comments allowed, use #)",
73-
EnvVar: "DOXY_PATTERN_FILE",
74-
},
79+
dockerSocketFlag,
80+
proxySocketFlag,
81+
debugFlag,
82+
patternFileFlag,
7583
}
7684
app.Action = RunApp
7785
app.Run(os.Args)

main_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
"github.com/zpatrick/go-config"
6+
"github.com/qnib/doxy/proxy"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestEvalOptions(t *testing.T) {
11+
myCfg := map[string]string{
12+
"proxy-socket": "proxy.sock",
13+
"docker-socket": "docker.sock",
14+
"debug": "true",
15+
}
16+
cfg := config.NewConfig([]config.Provider{config.NewStatic(myCfg)})
17+
got := EvalOptions(cfg)
18+
p := proxy.NewProxy(got...)
19+
exp := map[string]interface{}{
20+
"docker-socket": "docker.sock",
21+
"proxy-socket": "proxy.sock",
22+
"debug": true,
23+
"patterns": []string{},
24+
}
25+
assert.Equal(t, exp, p.GetOptions())
26+
}
27+
28+
func TestEvalPatternOpts(t *testing.T) {
29+
cfg := config.NewConfig([]config.Provider{config.NewStatic(map[string]string{
30+
"docker-socket": "docker.sock",
31+
"proxy-socket": "proxy.sock",
32+
"pattern-file": "some.file",
33+
})})
34+
got := EvalPatternOpts(cfg)
35+
p := proxy.NewProxy(got)
36+
exp := map[string]interface{}{
37+
"docker-socket": "/var/run/docker.sock",
38+
"proxy-socket": "/tmp/doxy.sock",
39+
"debug": false,
40+
"patterns": proxy.DEFAULT_PATTERNS,
41+
}
42+
opts := p.GetOptions()
43+
assert.Equal(t, exp, opts)
44+
}

proxy/main.go

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,26 @@ import (
77
"syscall"
88
"os/signal"
99
"github.com/urfave/negroni"
10+
)
11+
12+
const (
13+
DOCKER_SOCKET = "/var/run/docker.sock"
14+
PROXY_SOCKET = "/tmp/doxy.sock"
15+
PATTERN_FILE = "/etc/doxy.pattern"
16+
)
1017

18+
var (
19+
DEFAULT_PATTERNS = []string{
20+
`^/(v\d\.\d+/)?containers(/\w+)?/(json|stats|top)$`,
21+
`^/(v\d\.\d+/)?services(/[0-9a-f]+)?$`,
22+
`^/(v\d\.\d+/)?tasks(/\w+)?$`,
23+
`^/(v\d\.\d+/)?networks(/\w+)?$`,
24+
`^/(v\d\.\d+/)?volumes(/\w+)?$`,
25+
`^/(v\d\.\d+/)?nodes(/\w+)?$`,
26+
`^/(v\d\.\d+/)?info$`,
27+
`^/(v\d\.\d+/)?version$`,
28+
"^/_ping$",
29+
}
1130
)
1231

1332
type Proxy struct {
@@ -16,21 +35,27 @@ type Proxy struct {
1635
patterns []string
1736
}
1837

19-
func NewProxy(newsock, oldsock string, debug bool) Proxy {
38+
func NewProxy(opts ...ProxyOption) Proxy {
39+
options := defaultProxyOptions
40+
for _, o := range opts {
41+
o(&options)
42+
}
2043
return Proxy{
21-
dockerSocket: oldsock,
22-
newSocket: newsock,
23-
debug: debug,
24-
patterns: []string{},
44+
dockerSocket: options.DockerSocket,
45+
newSocket: options.ProxySocket,
46+
debug: options.Debug,
47+
patterns: options.Patterns,
2548
}
2649
}
2750

28-
func (p *Proxy) AddPatterns(patterns []string) {
29-
p.patterns = append(p.patterns,patterns...)
30-
}
31-
32-
func (p *Proxy) AddPattern(pattern string) {
33-
p.patterns = append(p.patterns,pattern)
51+
func (p *Proxy) GetOptions() map[string]interface{} {
52+
opt := map[string]interface{}{
53+
"docker-socket": p.dockerSocket,
54+
"proxy-socket": p.newSocket,
55+
"debug": p.debug,
56+
"patterns": p.patterns,
57+
}
58+
return opt
3459
}
3560

3661
func (p *Proxy) Run() {

proxy/main_test.go

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,56 @@ import (
55
"github.com/stretchr/testify/assert"
66
)
77

8-
func TestProxy_AddPattern(t *testing.T) {
9-
p := NewProxy("new", "old", false)
10-
p.AddPattern("mypat1")
8+
9+
func TestProxy_NewProxyWithPattern(t *testing.T) {
10+
p := NewProxy(
11+
WithProxySocket("new"),
12+
WithDockerSocket("old"),
13+
WithPattern("mypat1"),
14+
)
1115
assert.Equal(t, []string{"mypat1"}, p.patterns)
16+
assert.False(t, p.debug, "Debug should be false by default")
1217
}
1318

14-
func TestProxy_AddPatterns(t *testing.T) {
15-
p := NewProxy("new", "old", false)
16-
p.AddPatterns([]string{"mypat1","mypat2"})
19+
func TestProxy_NewProxyWithPatterns(t *testing.T) {
20+
p := NewProxy(
21+
WithProxySocket("new"),
22+
WithDockerSocket("old"),
23+
WithPatterns([]string{"mypat1","mypat2"}),
24+
)
1725
assert.Equal(t, []string{"mypat1","mypat2"}, p.patterns)
26+
assert.False(t, p.debug, "Debug should be false by default")
27+
28+
}
29+
30+
func TestProxy_NewProxyWithDebugEnabled(t *testing.T) {
31+
p := NewProxy(
32+
WithProxySocket("new"),
33+
WithDockerSocket("old"),
34+
WithDebugEnabled(),
35+
)
36+
assert.True(t, p.debug, "Debug should be set")
37+
}
38+
func TestProxy_NewProxyWithDebugValue(t *testing.T) {
39+
p := NewProxy(
40+
WithProxySocket("new"),
41+
WithDockerSocket("old"),
42+
WithDebugValue(true),
43+
)
44+
assert.True(t, p.debug, "Debug should be set")
1845
}
46+
47+
func TestProxy_GetOptions(t *testing.T) {
48+
p := NewProxy(
49+
WithProxySocket("proxy.sock"),
50+
WithDockerSocket("docker.sock"),
51+
WithPattern("mypat1"),
52+
)
53+
exp := map[string]interface{}{
54+
"docker-socket": "docker.sock",
55+
"proxy-socket": "proxy.sock",
56+
"debug": false,
57+
"patterns": []string{"mypat1"},
58+
}
59+
assert.Equal(t, exp, p.GetOptions())
60+
}

proxy/options.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package proxy
2+
3+
type ProxyOptions struct {
4+
DockerSocket string
5+
ProxySocket string
6+
Debug bool
7+
Patterns []string
8+
}
9+
10+
var defaultProxyOptions = ProxyOptions{
11+
DockerSocket: DOCKER_SOCKET,
12+
ProxySocket: PROXY_SOCKET,
13+
Debug: false,
14+
Patterns: []string{},
15+
}
16+
17+
type ProxyOption func(*ProxyOptions)
18+
19+
func WithDockerSocket(s string) ProxyOption {
20+
return func(o *ProxyOptions) {
21+
o.DockerSocket = s
22+
}
23+
}
24+
25+
func WithProxySocket(s string) ProxyOption {
26+
return func(o *ProxyOptions) {
27+
o.ProxySocket = s
28+
}
29+
}
30+
31+
func WithDebugValue(d bool) ProxyOption {
32+
return func(o *ProxyOptions) {
33+
o.Debug = d
34+
}
35+
}
36+
37+
func WithDebugEnabled() ProxyOption {
38+
return func(o *ProxyOptions) {
39+
o.Debug = true
40+
}
41+
}
42+
43+
func WithPattern(p string) ProxyOption {
44+
return func(o *ProxyOptions) {
45+
o.Patterns = append(o.Patterns, p)
46+
}
47+
}
48+
49+
func WithPatterns(p []string) ProxyOption {
50+
return func(o *ProxyOptions) {
51+
o.Patterns = p
52+
}
53+
}
54+

vendor/github.com/davecgh/go-spew/LICENSE

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)