forked from mantl/mesos-consul
/
main.go
123 lines (100 loc) · 3.13 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"fmt"
"os"
"strings"
"time"
"net/http"
"github.com/CiscoCloud/mesos-consul/config"
"github.com/CiscoCloud/mesos-consul/consul"
"github.com/CiscoCloud/mesos-consul/mesos"
flag "github.com/ogier/pflag"
log "github.com/sirupsen/logrus"
)
const Name = "mesos-consul"
const Version = "0.3"
func main() {
c, err := parseFlags(os.Args[1:])
if err != nil {
log.Fatal(err)
}
if c.Healthcheck {
go StartHealthcheckService(c)
}
log.Info("Using zookeeper: ", c.Zk)
leader := mesos.New(c)
ticker := time.NewTicker(c.Refresh)
leader.Refresh()
for _ = range ticker.C {
leader.Refresh()
}
}
func StartHealthcheckService(c *config.Config) {
http.HandleFunc("/health", HealthHandler)
log.Fatal(http.ListenAndServe(fmt.Sprintf("%s:%s", c.HealthcheckIp, c.HealthcheckPort), nil))
}
func HealthHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "OK")
}
func parseFlags(args []string) (*config.Config, error) {
var doHelp bool
var doVersion bool
var c = config.DefaultConfig()
flags := flag.NewFlagSet("mesos-consul", flag.ContinueOnError)
flags.Usage = func() {
fmt.Println(Help())
}
flags.BoolVar(&doHelp, "help", false, "")
flags.BoolVar(&doVersion, "version", false, "")
flags.StringVar(&c.LogLevel, "log-level", "WARN", "")
flags.DurationVar(&c.Refresh, "refresh", time.Minute, "")
flags.StringVar(&c.Zk, "zk", "zk://127.0.0.1:2181/mesos", "")
flags.StringVar(&c.MesosIpOrder, "mesos-ip-order", "netinfo,mesos,host", "")
flags.BoolVar(&c.Healthcheck, "healthcheck", false, "")
flags.StringVar(&c.HealthcheckIp, "healthcheck-ip", "127.0.0.1", "")
flags.StringVar(&c.HealthcheckPort, "healthcheck-port", "24476", "")
consul.AddCmdFlags(flags)
if err := flags.Parse(args); err != nil {
return nil, err
}
args = flags.Args()
if len(args) > 0 {
return nil, fmt.Errorf("extra argument(s): %q", args)
}
if doVersion {
fmt.Printf("%s v%s\n", Name, Version)
os.Exit(0)
}
if doHelp {
flags.Usage()
os.Exit(0)
}
l, err := log.ParseLevel(strings.ToLower(c.LogLevel))
if err != nil {
log.SetLevel(log.WarnLevel)
log.Warnf("Invalid log level '%v'. Setting to WARN", c.LogLevel)
} else {
log.SetLevel(l)
}
return c, nil
}
func Help() string {
helpText := `
Usage: mesos-consul [options]
Options:
--version Print mesos-consul version
--log-level=<log_level> Set the Logging level to one of [ "DEBUG", "INFO", "WARN", "ERROR" ]
(default "WARN")
--refresh=<time> Set the Mesos refresh rate (default 1m)
--zk=<address> Zookeeper path to Mesos (default zk://127.0.0.1:2181/mesos)
--healthcheck Enables a http endpoint for health checks. When this
flag is enabled, serves a service health status on 127.0.0.1:24476 (default not enabled)
--healthcheck-ip=<ip> Health check interface ip (default 127.0.0.1)
--healthcheck-port=<port> Health check service port (default 24476)
--mesos-ip-order Comma separated list to control the order in
which github.com/CiscoCloud/mesos-consul searches for the task IP
address. Valid options are 'netinfo', 'mesos', 'docker' and 'host'
(default netinfo,mesos,host)
` + consul.Help()
return strings.TrimSpace(helpText)
}