gifs/api
2014-10-17
gifs/api/gifsd/server.go
Create a Dockerfile and binary. Write a Dockerfile that compiles everything and runs it. Start the binary; load a Context from etcd, and start everything running. The binary is pretty useless until we get HTTP handlers, though, obviously.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gifsd/server.go Fri Oct 17 07:22:17 2014 -0400 1.3 @@ -0,0 +1,82 @@ 1.4 +package main 1.5 + 1.6 +import ( 1.7 + "flag" 1.8 + "fmt" 1.9 + "log" 1.10 + "os" 1.11 + "strings" 1.12 + 1.13 + "github.com/coreos/go-etcd/etcd" 1.14 +) 1.15 + 1.16 +var ( 1.17 + etcdAddrs = StringArray{} 1.18 +) 1.19 + 1.20 +type StringArray []string 1.21 + 1.22 +func (a *StringArray) Set(s string) error { 1.23 + *a = append(*a, s) 1.24 + return nil 1.25 +} 1.26 + 1.27 +func (a *StringArray) String() string { 1.28 + return strings.Join(*a, ",") 1.29 +} 1.30 + 1.31 +func main() { 1.32 + flag.Var(&etcdAddrs, "etcd-address", "address to the etcd server (may be specified more than once)") 1.33 + flag.Parse() 1.34 + if len(etcdAddrs) < 1 { 1.35 + if os.Getenv("ETCD_NAME") != "" { 1.36 + etcdAddrs = []string{"http://etcd:" + os.Getenv("ETCD_PORT_4001_TCP_PORT") + "/"} 1.37 + } else { 1.38 + flag.Usage() 1.39 + return 1.40 + } 1.41 + } 1.42 + log.Println("Using etcd servers", etcdAddrs) 1.43 + client := etcd.NewClient(etcdAddrs) 1.44 + resp, err := client.Get("/code.secondbit.org/gifs/api/", false, true) 1.45 + if err != nil { 1.46 + log.Fatalln(err) 1.47 + return 1.48 + } 1.49 + context, err := getEtcdContext(resp.Node) 1.50 + if err != nil { 1.51 + log.Fatalln(err) 1.52 + return 1.53 + } 1.54 + err = context.Validate() 1.55 + if err != nil { 1.56 + log.Fatalln(err) 1.57 + return 1.58 + } 1.59 + listenAddr := ":8080" 1.60 + for _, node := range resp.Node.Nodes { 1.61 + if node.Key == "/listen_addr" { 1.62 + listenAddr = node.Value 1.63 + fmt.Println("Set listenAddr to " + node.Value) 1.64 + break 1.65 + } 1.66 + } 1.67 + log.Println("Going to listen on", listenAddr) 1.68 + 1.69 + /* 1.70 + var router *mux.Router 1.71 + if context.RootDomain == "" { 1.72 + fmt.Println("Using path muxer") 1.73 + router = api.GetPathMuxer(context) 1.74 + } else { 1.75 + fmt.Println("Using domain muxer") 1.76 + router = api.GetDomainMuxer(context) 1.77 + } 1.78 + http.Handle("/", router) 1.79 + fmt.Println("Listening on " + listenAddr) 1.80 + err = http.ListenAndServe(listenAddr, nil) 1.81 + if err != nil { 1.82 + panic(err) 1.83 + } 1.84 + */ 1.85 +}