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.
| paddy@7 | 1 package main |
| paddy@7 | 2 |
| paddy@7 | 3 import ( |
| paddy@7 | 4 "flag" |
| paddy@7 | 5 "fmt" |
| paddy@7 | 6 "log" |
| paddy@7 | 7 "os" |
| paddy@7 | 8 "strings" |
| paddy@7 | 9 |
| paddy@7 | 10 "github.com/coreos/go-etcd/etcd" |
| paddy@7 | 11 ) |
| paddy@7 | 12 |
| paddy@7 | 13 var ( |
| paddy@7 | 14 etcdAddrs = StringArray{} |
| paddy@7 | 15 ) |
| paddy@7 | 16 |
| paddy@7 | 17 type StringArray []string |
| paddy@7 | 18 |
| paddy@7 | 19 func (a *StringArray) Set(s string) error { |
| paddy@7 | 20 *a = append(*a, s) |
| paddy@7 | 21 return nil |
| paddy@7 | 22 } |
| paddy@7 | 23 |
| paddy@7 | 24 func (a *StringArray) String() string { |
| paddy@7 | 25 return strings.Join(*a, ",") |
| paddy@7 | 26 } |
| paddy@7 | 27 |
| paddy@7 | 28 func main() { |
| paddy@7 | 29 flag.Var(&etcdAddrs, "etcd-address", "address to the etcd server (may be specified more than once)") |
| paddy@7 | 30 flag.Parse() |
| paddy@7 | 31 if len(etcdAddrs) < 1 { |
| paddy@7 | 32 if os.Getenv("ETCD_NAME") != "" { |
| paddy@7 | 33 etcdAddrs = []string{"http://etcd:" + os.Getenv("ETCD_PORT_4001_TCP_PORT") + "/"} |
| paddy@7 | 34 } else { |
| paddy@7 | 35 flag.Usage() |
| paddy@7 | 36 return |
| paddy@7 | 37 } |
| paddy@7 | 38 } |
| paddy@7 | 39 log.Println("Using etcd servers", etcdAddrs) |
| paddy@7 | 40 client := etcd.NewClient(etcdAddrs) |
| paddy@7 | 41 resp, err := client.Get("/code.secondbit.org/gifs/api/", false, true) |
| paddy@7 | 42 if err != nil { |
| paddy@7 | 43 log.Fatalln(err) |
| paddy@7 | 44 return |
| paddy@7 | 45 } |
| paddy@7 | 46 context, err := getEtcdContext(resp.Node) |
| paddy@7 | 47 if err != nil { |
| paddy@7 | 48 log.Fatalln(err) |
| paddy@7 | 49 return |
| paddy@7 | 50 } |
| paddy@7 | 51 err = context.Validate() |
| paddy@7 | 52 if err != nil { |
| paddy@7 | 53 log.Fatalln(err) |
| paddy@7 | 54 return |
| paddy@7 | 55 } |
| paddy@7 | 56 listenAddr := ":8080" |
| paddy@7 | 57 for _, node := range resp.Node.Nodes { |
| paddy@7 | 58 if node.Key == "/listen_addr" { |
| paddy@7 | 59 listenAddr = node.Value |
| paddy@7 | 60 fmt.Println("Set listenAddr to " + node.Value) |
| paddy@7 | 61 break |
| paddy@7 | 62 } |
| paddy@7 | 63 } |
| paddy@7 | 64 log.Println("Going to listen on", listenAddr) |
| paddy@7 | 65 |
| paddy@7 | 66 /* |
| paddy@7 | 67 var router *mux.Router |
| paddy@7 | 68 if context.RootDomain == "" { |
| paddy@7 | 69 fmt.Println("Using path muxer") |
| paddy@7 | 70 router = api.GetPathMuxer(context) |
| paddy@7 | 71 } else { |
| paddy@7 | 72 fmt.Println("Using domain muxer") |
| paddy@7 | 73 router = api.GetDomainMuxer(context) |
| paddy@7 | 74 } |
| paddy@7 | 75 http.Handle("/", router) |
| paddy@7 | 76 fmt.Println("Listening on " + listenAddr) |
| paddy@7 | 77 err = http.ListenAndServe(listenAddr, nil) |
| paddy@7 | 78 if err != nil { |
| paddy@7 | 79 panic(err) |
| paddy@7 | 80 } |
| paddy@7 | 81 */ |
| paddy@7 | 82 } |