Skip to content

Commit eb85b8a

Browse files
committed
Merge pull request #3641 from eMxyzptlk/issue_3552_v2
feat(publisher): expose config as flags
2 parents 3d705a0 + 6c0c271 commit eb85b8a

5 files changed

Lines changed: 53 additions & 30 deletions

File tree

deisctl/units/deis-publisher.service

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ EnvironmentFile=/etc/environment
88
TimeoutStartSec=20m
99
ExecStartPre=/bin/sh -c "IMAGE=`/run/deis/bin/get_image /deis/publisher` && docker history $IMAGE >/dev/null 2>&1 || docker pull $IMAGE"
1010
ExecStartPre=/bin/sh -c "docker inspect deis-publisher >/dev/null 2>&1 && docker rm -f deis-publisher || true"
11-
ExecStart=/bin/sh -c "IMAGE=`/run/deis/bin/get_image /deis/publisher` && docker run --name deis-publisher --rm -e HOST=$COREOS_PRIVATE_IPV4 -e ETCD_HOST=$COREOS_PRIVATE_IPV4 -v /var/run/docker.sock:/var/run/docker.sock $IMAGE"
11+
ExecStart=/bin/sh -c "IMAGE=`/run/deis/bin/get_image /deis/publisher` && docker run --name deis-publisher --rm -v /var/run/docker.sock:/var/run/docker.sock $IMAGE --host=$COREOS_PRIVATE_IPV4 --etcd-host=$COREOS_PRIVATE_IPV4"
1212
ExecStopPost=-/usr/bin/docker rm -f deis-publisher
1313
Restart=on-failure
1414
RestartSec=5

publisher/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ service discovery.
77

88
## Running this Container
99

10-
Set $ETCD_HOST to be the IP address/hostname of the etcd endpoint you wish to target, and
11-
$HOST to be the IP address of the host running this container:
10+
Run the publisher with the --etcd-host set to be the IP address/hostname of the etcd endpint you wish to target, and --host to be the IP address of the host running this container:
1211

13-
$ docker run -d -v /var/run/docker.sock:/tmp/docker.sock -e ETCD_HOST=192.168.0.1 -e HOST=192.168.0.1 deis/publisher
12+
13+
$ docker run -d -v /var/run/docker.sock:/tmp/docker.sock deis/publisher --etcd-host=192.168.0.1 --host=192.168.0.1
1414

1515
## Building from Source
1616

publisher/main.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package main
22

33
import (
4+
"flag"
45
"log"
5-
"os"
66
"time"
77

88
"github.com/coreos/go-etcd/etcd"
@@ -12,34 +12,40 @@ import (
1212
)
1313

1414
const (
15-
timeout time.Duration = 10 * time.Second
16-
etcdTTL time.Duration = timeout * 2
15+
defaultRefreshTime time.Duration = 10 * time.Second
16+
defaultEtcdTTL time.Duration = defaultRefreshTime * 2
17+
defaultHost = "127.0.0.1"
18+
defaultDockerHost = "unix:///var/run/docker.sock"
19+
defaultEtcdHost = "127.0.0.1"
20+
defaultEtcdPort = "4001"
21+
defaultLogLevel = "error"
1722
)
1823

19-
func getopt(name, dfault string) string {
20-
value := os.Getenv(name)
21-
if value == "" {
22-
value = dfault
23-
}
24-
return value
25-
}
24+
var (
25+
refreshDuration = flag.Duration("refresh-duration", defaultRefreshTime, "The time to wait between etcd refreshes.")
26+
etcdTTL = flag.Duration("etcd-ttl", defaultEtcdTTL, "The TTL for all of the keys in etcd.")
27+
host = flag.String("host", defaultHost, "The host where the publisher is running.")
28+
dockerHost = flag.String("docker-host", defaultDockerHost, "The host where to find docker.")
29+
etcdHost = flag.String("etcd-host", defaultEtcdHost, "The etcd host.")
30+
etcdPort = flag.String("etcd-port", defaultEtcdPort, "The etcd port.")
31+
logLevel = flag.String("log-level", defaultLogLevel, "Acceptable values: error, debug")
32+
)
2633

2734
func main() {
28-
endpoint := getopt("DOCKER_HOST", "unix:///var/run/docker.sock")
29-
etcdHost := getopt("ETCD_HOST", "127.0.0.1")
35+
flag.Parse()
3036

31-
client, err := docker.NewClient(endpoint)
37+
dockerClient, err := docker.NewClient(*dockerHost)
3238
if err != nil {
3339
log.Fatal(err)
3440
}
35-
etcdClient := etcd.NewClient([]string{"http://" + etcdHost + ":4001"})
41+
etcdClient := etcd.NewClient([]string{"http://" + *etcdHost + ":" + *etcdPort})
3642

37-
server := &server.Server{DockerClient: client, EtcdClient: etcdClient}
43+
server := server.New(dockerClient, etcdClient, *host, *logLevel)
3844

39-
go server.Listen(etcdTTL)
45+
go server.Listen(*etcdTTL)
4046

4147
for {
42-
go server.Poll(etcdTTL)
43-
time.Sleep(timeout)
48+
go server.Poll(*etcdTTL)
49+
time.Sleep(*refreshDuration)
4450
}
4551
}

publisher/server/publisher.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"log"
66
"net"
7-
"os"
87
"regexp"
98
"strconv"
109
"sync"
@@ -23,13 +22,26 @@ const (
2322
type Server struct {
2423
DockerClient *docker.Client
2524
EtcdClient *etcd.Client
25+
26+
host string
27+
logLevel string
2628
}
2729

2830
var safeMap = struct {
2931
sync.RWMutex
3032
data map[string]string
3133
}{data: make(map[string]string)}
3234

35+
// New returns a new instance of Server.
36+
func New(dockerClient *docker.Client, etcdClient *etcd.Client, host, logLevel string) *Server {
37+
return &Server{
38+
DockerClient: dockerClient,
39+
EtcdClient: etcdClient,
40+
host: host,
41+
logLevel: logLevel,
42+
}
43+
}
44+
3345
// Listen adds an event listener to the docker client and publishes containers that were started.
3446
func (s *Server) Listen(ttl time.Duration) {
3547
listener := make(chan *docker.APIEvents)
@@ -86,7 +98,6 @@ func (s *Server) getContainer(id string) (*docker.APIContainers, error) {
8698
// publishContainer publishes the docker container to etcd.
8799
func (s *Server) publishContainer(container *docker.APIContainers, ttl time.Duration) {
88100
r := regexp.MustCompile(appNameRegex)
89-
host := os.Getenv("HOST")
90101
for _, name := range container.Names {
91102
// HACK: remove slash from container name
92103
// see https://github.com/docker/docker/issues/7519
@@ -101,7 +112,7 @@ func (s *Server) publishContainer(container *docker.APIContainers, ttl time.Dura
101112
dirPath := fmt.Sprintf("/deis/services/%s", appName)
102113
for _, p := range container.Ports {
103114
port := strconv.Itoa(int(p.PublicPort))
104-
hostAndPort := host + ":" + port
115+
hostAndPort := s.host + ":" + port
105116
if s.IsPublishableApp(containerName) && s.IsPortOpen(hostAndPort) {
106117
s.setEtcd(keyPath, hostAndPort, uint64(ttl.Seconds()))
107118
s.updateDir(dirPath, uint64(ttl.Seconds()))
@@ -208,15 +219,19 @@ func (s *Server) setEtcd(key, value string, ttl uint64) {
208219
if _, err := s.EtcdClient.Set(key, value, ttl); err != nil {
209220
log.Println(err)
210221
}
211-
log.Println("set", key, "->", value)
222+
if s.logLevel == "debug" {
223+
log.Println("set", key, "->", value)
224+
}
212225
}
213226

214227
// removeEtcd removes the corresponding etcd key
215228
func (s *Server) removeEtcd(key string, recursive bool) {
216229
if _, err := s.EtcdClient.Delete(key, recursive); err != nil {
217230
log.Println(err)
218231
}
219-
log.Println("del", key)
232+
if s.logLevel == "debug" {
233+
log.Println("del", key)
234+
}
220235
}
221236

222237
// updateDir updates the given directory for a given ttl. It succeeds
@@ -225,5 +240,7 @@ func (s *Server) updateDir(directory string, ttl uint64) {
225240
if _, err := s.EtcdClient.UpdateDir(directory, ttl); err != nil {
226241
log.Println(err)
227242
}
228-
log.Println("updateDir", directory)
243+
if s.logLevel == "debug" {
244+
log.Println("updateDir", directory)
245+
}
229246
}

publisher/server/publisher_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
func TestIsPublishableApp(t *testing.T) {
9-
s := &Server{nil, nil}
9+
s := &Server{}
1010
appName := "go_v2.web.1"
1111
if !s.IsPublishableApp(appName) {
1212
t.Errorf("%s should be publishable", appName)
@@ -37,7 +37,7 @@ func TestIsPortOpen(t *testing.T) {
3737
}
3838
defer ln.Close()
3939

40-
s := &Server{nil, nil}
40+
s := &Server{}
4141
if !s.IsPortOpen(ln.Addr().String()) {
4242
t.Errorf("Port should be open")
4343
}

0 commit comments

Comments
 (0)