just try init once
authorTom Clegg <tom@curoverse.com>
Mon, 6 Feb 2017 10:12:59 +0000 (05:12 -0500)
committerTom Clegg <tom@curoverse.com>
Mon, 6 Feb 2017 10:12:59 +0000 (05:12 -0500)
services/boot/consul.go
services/boot/main.go
services/boot/nomad.go
services/boot/testimage_runit/Dockerfile
services/boot/vault.go

index f51d694583cf0fc5237ca59de1798a1156e35797..9190aac53150a3404a34497d1e61b17362202c62 100644 (file)
@@ -8,6 +8,7 @@ import (
        "path"
        "strings"
        "sync"
+       "time"
 
        "github.com/hashicorp/consul/api"
 )
@@ -36,25 +37,25 @@ func (cb *consulBooter) Boot(ctx context.Context) error {
        if err != nil {
                return err
        }
-       dataDir := cfg.DataDir + "/consul"
+       dataDir := path.Join(cfg.DataDir, "consul")
        if err := os.MkdirAll(dataDir, 0700); err != nil {
                return err
        }
        args := []string{"agent"}
        {
                cf := path.Join(cfg.DataDir, "consul-encrypt.json")
-               _, err := os.Stat(cf)
-               if os.IsNotExist(err) {
+               if _, err := os.Stat(cf); err != nil && !os.IsNotExist(err) {
+                       return err
+               } else if err != nil {
                        key, err := exec.Command(bin, "keygen").CombinedOutput()
                        if err != nil {
                                return err
                        }
-                       err = atomicWriteJSON(cf, map[string]interface{}{
+                       if err = atomicWriteJSON(cf, map[string]interface{}{
                                "encrypt": strings.TrimSpace(string(key)),
-                       }, 0400)
-               }
-               if err != nil {
-                       return err
+                       }, 0400); err != nil {
+                               return err
+                       }
                }
                args = append(args, "-config-file="+cf)
        }
@@ -103,7 +104,7 @@ func (cb *consulBooter) Boot(ctx context.Context) error {
                        }
                }
        }
-       return cb.check(ctx)
+       return waitCheck(ctx, 30*time.Second, cb.check)
 }
 
 var consulCfg = api.DefaultConfig()
index ebab00910fd760f53f7858f4d7a62b8b1599f480..f145e152f87fc8957117b36963a93eec79ca4e9c 100644 (file)
@@ -6,7 +6,6 @@ import (
        "flag"
        "log"
        "os"
-       "time"
 
        "git.curoverse.com/arvados.git/sdk/go/config"
 )
@@ -28,19 +27,9 @@ func main() {
        enc.SetIndent("", "  ")
        enc.Encode(cfg)
 
-       go runWebGUI(cfg)
-       go func() {
-               var ctl Booter = &controller{}
-               ticker := time.NewTicker(5 * time.Second)
-               for {
-                       err := ctl.Boot(withCfg(context.Background(), cfg))
-                       if err != nil {
-                               log.Printf("controller boot failed: %v", err)
-                       } else {
-                               log.Printf("controller boot OK")
-                       }
-                       <-ticker.C
-               }
-       }()
-       <-(chan struct{})(nil)
+       var ctl Booter = &controller{}
+       err := ctl.Boot(withCfg(context.Background(), cfg))
+       if err != nil {
+               log.Printf("controller boot failed: %v", err)
+       }
 }
index 07c5de859fafbb82332e91001b5d2df6f3012118..632f993f2c1d7d7d621ebaa1147b936441f85408 100644 (file)
@@ -6,6 +6,7 @@ import (
        "os"
        "path"
        "sync"
+       "time"
 
        "github.com/hashicorp/nomad/api"
 )
@@ -28,7 +29,7 @@ func (nb *nomadBooter) Boot(ctx context.Context) error {
        err := (&download{
                URL:  "https://releases.hashicorp.com/nomad/0.5.4/nomad_0.5.4_linux_amd64.zip",
                Dest: bin,
-               //Size: 29079005,
+               Size: 34150464,
                Mode: 0755,
        }).Boot(ctx)
        if err != nil {
@@ -79,7 +80,7 @@ func (nb *nomadBooter) Boot(ctx context.Context) error {
                        return fmt.Errorf("starting nomad: %s", err)
                }
        }
-       return nb.check(ctx)
+       return waitCheck(ctx, 30*time.Second, nb.check)
 }
 
 var nomadCfg = api.DefaultConfig()
index b65a1584622a7f91bd562731fdbdbddaa397f522..1bab29697319b49d6c1a0d9b32cad0ed3cc383ba 100644 (file)
@@ -1,10 +1,9 @@
 FROM debian:8
 RUN apt-get update
 
-RUN DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends runit
-RUN mkdir /etc/sv/arvados-boot && ln -s /usr/bin/arvados-boot /etc/sv/arvados-boot/run
-
 # preload (but don't install) packages arvados-boot might decide to install
-RUN DEBIAN_FRONTEND=noninteractive apt-get -dy install --no-install-recommends ca-certificates nginx
+RUN DEBIAN_FRONTEND=noninteractive apt-get -dy install --no-install-recommends ca-certificates nginx runit
+
+RUN DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends runit
 
-CMD ["sh", "-c", "runsvdir /etc/sv"]
+CMD ["bash", "-c", "coproc arvados-boot; runsvdir /etc/sv"]
index de9cfb3c154a63b01df78aee1522f57b20c90260..7d042f8c7ef53afef09ac75bd7e9e45ff8bf4727 100644 (file)
@@ -7,6 +7,7 @@ import (
        "log"
        "path"
        "sync"
+       "time"
 
        "github.com/hashicorp/vault/api"
 )
@@ -66,29 +67,37 @@ func (vb *vaultBooter) Boot(ctx context.Context) error {
                }
        }
 
-       vb.tryInit(ctx)
-       return vb.check(ctx)
+       if err := vb.tryInit(ctx); err != nil {
+               return err
+       }
+       return waitCheck(ctx, 30*time.Second, vb.check)
 }
 
-func (vb *vaultBooter) tryInit(ctx context.Context) {
+func (vb *vaultBooter) tryInit(ctx context.Context) error {
        cfg := cfg(ctx)
-       vault, err := vb.client(ctx)
-       if err != nil {
-               return
-       }
-       if init, err := vault.Sys().InitStatus(); err != nil {
-               log.Printf("error: vault InitStatus: %s", err)
-               return
+
+       var vault *api.Client
+       var init bool
+       if err := waitCheck(ctx, time.Minute, func(context.Context) error {
+               var err error
+               vault, err = vb.client(ctx)
+               if err != nil {
+                       return err
+               }
+               init, err = vault.Sys().InitStatus()
+               return err
+       }); err != nil {
+               return err
        } else if init {
-               return
+               return nil
        }
+
        resp, err := vault.Sys().Init(&api.InitRequest{
                SecretShares:    5,
                SecretThreshold: 3,
        })
        if err != nil {
-               log.Printf("vault-init: %s", err)
-               return
+               return fmt.Errorf("vault-init: %s", err)
        }
        atomicWriteJSON(path.Join(cfg.DataDir, "vault-keys.json"), resp, 0400)
        atomicWriteFile(path.Join(cfg.DataDir, "vault-root-token.txt"), []byte(resp.RootToken), 0400)
@@ -101,9 +110,10 @@ func (vb *vaultBooter) tryInit(ctx context.Context) {
                }
                if !resp.Sealed {
                        log.Printf("unseal successful")
-                       break
+                       return nil
                }
        }
+       return fmt.Errorf("vault unseal failed!")
 }
 
 func (vb *vaultBooter) client(ctx context.Context) (*api.Client, error) {