main.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // Copyright 2015 flannel authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package main
  15. import (
  16. "flag"
  17. "fmt"
  18. "os"
  19. "os/signal"
  20. "strings"
  21. "sync"
  22. "syscall"
  23. "github.com/coreos/pkg/flagutil"
  24. log "github.com/golang/glog"
  25. "golang.org/x/net/context"
  26. "github.com/coreos/flannel/network"
  27. "github.com/coreos/flannel/remote"
  28. "github.com/coreos/flannel/subnet"
  29. "github.com/coreos/flannel/subnet/kube"
  30. "github.com/coreos/flannel/version"
  31. // Backends need to be imported for their init() to get executed and them to register
  32. _ "github.com/coreos/flannel/backend/alloc"
  33. _ "github.com/coreos/flannel/backend/awsvpc"
  34. _ "github.com/coreos/flannel/backend/gce"
  35. _ "github.com/coreos/flannel/backend/hostgw"
  36. _ "github.com/coreos/flannel/backend/udp"
  37. _ "github.com/coreos/flannel/backend/vxlan"
  38. _ "github.com/coreos/flannel/backend/alivpc"
  39. )
  40. type CmdLineOpts struct {
  41. etcdEndpoints string
  42. etcdPrefix string
  43. etcdKeyfile string
  44. etcdCertfile string
  45. etcdCAFile string
  46. etcdUsername string
  47. etcdPassword string
  48. help bool
  49. version bool
  50. listen string
  51. remote string
  52. remoteKeyfile string
  53. remoteCertfile string
  54. remoteCAFile string
  55. kubeSubnetMgr bool
  56. }
  57. var opts CmdLineOpts
  58. func init() {
  59. flag.StringVar(&opts.etcdEndpoints, "etcd-endpoints", "http://127.0.0.1:4001,http://127.0.0.1:2379", "a comma-delimited list of etcd endpoints")
  60. flag.StringVar(&opts.etcdPrefix, "etcd-prefix", "/coreos.com/network", "etcd prefix")
  61. flag.StringVar(&opts.etcdKeyfile, "etcd-keyfile", "", "SSL key file used to secure etcd communication")
  62. flag.StringVar(&opts.etcdCertfile, "etcd-certfile", "", "SSL certification file used to secure etcd communication")
  63. flag.StringVar(&opts.etcdCAFile, "etcd-cafile", "", "SSL Certificate Authority file used to secure etcd communication")
  64. flag.StringVar(&opts.etcdUsername, "etcd-username", "", "Username for BasicAuth to etcd")
  65. flag.StringVar(&opts.etcdPassword, "etcd-password", "", "Password for BasicAuth to etcd")
  66. flag.StringVar(&opts.listen, "listen", "", "run as server and listen on specified address (e.g. ':8080')")
  67. flag.StringVar(&opts.remote, "remote", "", "run as client and connect to server on specified address (e.g. '10.1.2.3:8080')")
  68. flag.StringVar(&opts.remoteKeyfile, "remote-keyfile", "", "SSL key file used to secure client/server communication")
  69. flag.StringVar(&opts.remoteCertfile, "remote-certfile", "", "SSL certification file used to secure client/server communication")
  70. flag.StringVar(&opts.remoteCAFile, "remote-cafile", "", "SSL Certificate Authority file used to secure client/server communication")
  71. flag.BoolVar(&opts.kubeSubnetMgr, "kube-subnet-mgr", false, "Contact the Kubernetes API for subnet assignement instead of etcd or flannel-server.")
  72. flag.BoolVar(&opts.help, "help", false, "print this message")
  73. flag.BoolVar(&opts.version, "version", false, "print version and exit")
  74. }
  75. func newSubnetManager() (subnet.Manager, error) {
  76. if opts.remote != "" {
  77. return remote.NewRemoteManager(opts.remote, opts.remoteCAFile, opts.remoteCertfile, opts.remoteKeyfile)
  78. }
  79. if opts.kubeSubnetMgr {
  80. return kube.NewSubnetManager()
  81. }
  82. cfg := &subnet.EtcdConfig{
  83. Endpoints: strings.Split(opts.etcdEndpoints, ","),
  84. Keyfile: opts.etcdKeyfile,
  85. Certfile: opts.etcdCertfile,
  86. CAFile: opts.etcdCAFile,
  87. Prefix: opts.etcdPrefix,
  88. Username: opts.etcdUsername,
  89. Password: opts.etcdPassword,
  90. }
  91. return subnet.NewLocalManager(cfg)
  92. }
  93. func main() {
  94. // glog will log to tmp files by default. override so all entries
  95. // can flow into journald (if running under systemd)
  96. flag.Set("logtostderr", "true")
  97. // now parse command line args
  98. flag.Parse()
  99. if flag.NArg() > 0 || opts.help {
  100. fmt.Fprintf(os.Stderr, "Usage: %s [OPTION]...\n", os.Args[0])
  101. flag.PrintDefaults()
  102. os.Exit(0)
  103. }
  104. if opts.version {
  105. fmt.Fprintln(os.Stderr, version.Version)
  106. os.Exit(0)
  107. }
  108. flagutil.SetFlagsFromEnv(flag.CommandLine, "FLANNELD")
  109. sm, err := newSubnetManager()
  110. if err != nil {
  111. log.Error("Failed to create SubnetManager: ", err)
  112. os.Exit(1)
  113. }
  114. // Register for SIGINT and SIGTERM
  115. log.Info("Installing signal handlers")
  116. sigs := make(chan os.Signal, 1)
  117. signal.Notify(sigs, os.Interrupt, syscall.SIGTERM)
  118. ctx, cancel := context.WithCancel(context.Background())
  119. var runFunc func(ctx context.Context)
  120. if opts.listen != "" {
  121. if opts.remote != "" {
  122. log.Error("--listen and --remote are mutually exclusive")
  123. os.Exit(1)
  124. }
  125. log.Info("running as server")
  126. runFunc = func(ctx context.Context) {
  127. remote.RunServer(ctx, sm, opts.listen, opts.remoteCAFile, opts.remoteCertfile, opts.remoteKeyfile)
  128. }
  129. } else {
  130. nm, err := network.NewNetworkManager(ctx, sm)
  131. if err != nil {
  132. log.Error("Failed to create NetworkManager: ", err)
  133. os.Exit(1)
  134. }
  135. runFunc = func(ctx context.Context) {
  136. nm.Run(ctx)
  137. }
  138. }
  139. wg := sync.WaitGroup{}
  140. wg.Add(1)
  141. go func() {
  142. runFunc(ctx)
  143. wg.Done()
  144. }()
  145. <-sigs
  146. // unregister to get default OS nuke behaviour in case we don't exit cleanly
  147. signal.Stop(sigs)
  148. log.Info("Exiting...")
  149. cancel()
  150. wg.Wait()
  151. }