From a20abd014074bb2bbedee26a060b0c122638c33c Mon Sep 17 00:00:00 2001 From: Umputun Date: Mon, 12 Apr 2021 02:57:13 -0500 Subject: [PATCH] change docker default and add autoapi param #20 --- app/discovery/provider/docker.go | 6 ++- app/discovery/provider/docker_test.go | 61 ++++++++++++++++++++++++++- app/main.go | 6 ++- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/app/discovery/provider/docker.go b/app/discovery/provider/docker.go index 711d025..959a230 100644 --- a/app/discovery/provider/docker.go +++ b/app/discovery/provider/docker.go @@ -26,6 +26,7 @@ type Docker struct { DockerClient DockerClient Excludes []string Network string + AutoAPI bool } // DockerClient defines interface listing containers and subscribing to events @@ -71,7 +72,10 @@ func (d *Docker) List() ([]discovery.URLMapper, error) { res := make([]discovery.URLMapper, 0, len(containers)) for _, c := range containers { - srcURL := fmt.Sprintf("^/api/%s/(.*)", c.Name) + srcURL := "^/(.*)" + if d.AutoAPI { + srcURL = fmt.Sprintf("^/api/%s/(.*)", c.Name) + } destURL := fmt.Sprintf("http://%s:%d/$1", c.IP, c.Port) pingURL := fmt.Sprintf("http://%s:%d/ping", c.IP, c.Port) server := "*" diff --git a/app/discovery/provider/docker_test.go b/app/discovery/provider/docker_test.go index a9f2fca..ebb4828 100644 --- a/app/discovery/provider/docker_test.go +++ b/app/discovery/provider/docker_test.go @@ -64,11 +64,70 @@ func TestDocker_List(t *testing.T) { assert.Equal(t, "example.com", res[0].Server) assert.Equal(t, "http://127.0.0.2:12345/ping", res[0].PingURL) + assert.Equal(t, "^/(.*)", res[1].SrcMatch.String()) + assert.Equal(t, "http://127.0.0.3:12346/$1", res[1].Dst) + assert.Equal(t, "http://127.0.0.3:12346/ping", res[1].PingURL) + assert.Equal(t, "*", res[1].Server) +} + +func TestDocker_ListWithAutoAPI(t *testing.T) { + dclient := &DockerClientMock{ + ListContainersFunc: func(opts dc.ListContainersOptions) ([]dc.APIContainers, error) { + return []dc.APIContainers{ + {Names: []string{"c1"}, State: "running", + Networks: dc.NetworkList{ + Networks: map[string]dc.ContainerNetwork{"bridge": {IPAddress: "127.0.0.2"}}, + }, + Ports: []dc.APIPort{ + {PrivatePort: 12345}, + }, + Labels: map[string]string{"reproxy.route": "^/api/123/(.*)", "reproxy.dest": "/blah/$1", + "reproxy.server": "example.com", "reproxy.ping": "/ping"}, + }, + {Names: []string{"c2"}, State: "running", + Networks: dc.NetworkList{ + Networks: map[string]dc.ContainerNetwork{"bridge": {IPAddress: "127.0.0.3"}}, + }, + Ports: []dc.APIPort{ + {PrivatePort: 12346}, + }, + }, + {Names: []string{"c3"}, State: "stopped"}, + {Names: []string{"c4"}, State: "running", + Networks: dc.NetworkList{ + Networks: map[string]dc.ContainerNetwork{"other": {IPAddress: "127.0.0.2"}}, + }, + Ports: []dc.APIPort{ + {PrivatePort: 12345}, + }, + }, + {Names: []string{"c5"}, State: "running", + Networks: dc.NetworkList{ + Networks: map[string]dc.ContainerNetwork{"bridge": {IPAddress: "127.0.0.122"}}, + }, + Ports: []dc.APIPort{ + {PrivatePort: 2345}, + }, + Labels: map[string]string{"reproxy.enabled": "false"}, + }, + }, nil + }, + } + + d := Docker{DockerClient: dclient, Network: "bridge", AutoAPI: true} + res, err := d.List() + require.NoError(t, err) + require.Equal(t, 2, len(res)) + + assert.Equal(t, "^/api/123/(.*)", res[0].SrcMatch.String()) + assert.Equal(t, "http://127.0.0.2:12345/blah/$1", res[0].Dst) + assert.Equal(t, "example.com", res[0].Server) + assert.Equal(t, "http://127.0.0.2:12345/ping", res[0].PingURL) + assert.Equal(t, "^/api/c2/(.*)", res[1].SrcMatch.String()) assert.Equal(t, "http://127.0.0.3:12346/$1", res[1].Dst) assert.Equal(t, "http://127.0.0.3:12346/ping", res[1].PingURL) assert.Equal(t, "*", res[1].Server) - } func TestDocker_Events(t *testing.T) { diff --git a/app/main.go b/app/main.go index 9c15518..7a09a99 100644 --- a/app/main.go +++ b/app/main.go @@ -172,7 +172,11 @@ func makeProviders() ([]discovery.Provider, error) { if err != nil { return nil, errors.Wrapf(err, "failed to make docker client %s", err) } - res = append(res, &provider.Docker{DockerClient: client, Excludes: opts.Docker.Excluded, Network: opts.Docker.Network}) + if opts.Docker.AutoAPI { + log.Printf("[INFO] auto-api enabled for docker") + } + res = append(res, &provider.Docker{DockerClient: client, Excludes: opts.Docker.Excluded, + Network: opts.Docker.Network, AutoAPI: opts.Docker.AutoAPI}) } if len(res) == 0 && opts.Assets.Location == "" {