summaryrefslogtreecommitdiff
path: root/internal/deploy/deploy.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/deploy/deploy.go')
-rw-r--r--internal/deploy/deploy.go31
1 files changed, 2 insertions, 29 deletions
diff --git a/internal/deploy/deploy.go b/internal/deploy/deploy.go
index a25701a..5430b7f 100644
--- a/internal/deploy/deploy.go
+++ b/internal/deploy/deploy.go
@@ -8,12 +8,11 @@ import (
"context"
"fmt"
"io"
- "net/http"
"os"
"path/filepath"
- "time"
"skiff/internal/appmeta"
+ "skiff/internal/health"
"skiff/internal/jailmgr"
"skiff/internal/layout"
"skiff/internal/nginx"
@@ -76,7 +75,7 @@ func Run(ctx context.Context, out io.Writer, cfg layout.Config, app, sha string)
return fmt.Errorf("read app metadata: %w", err)
}
- if err := waitHealthy(ctx, meta); err != nil {
+ if err := health.WaitHealthy(ctx, meta); err != nil {
fmt.Fprintf(out, "==> health check failed (%v), rolling back to pre-%s\n", err, sha)
if rbErr := zfsutil.Rollback(ctx, out, dataset, snapshotTag); rbErr != nil {
return fmt.Errorf("health check failed AND rollback failed: %v / %w", err, rbErr)
@@ -107,29 +106,3 @@ func swapCurrent(currentPath, newTarget string) error {
}
return os.Rename(tmp, currentPath)
}
-
-func waitHealthy(ctx context.Context, meta appmeta.Meta) error {
- url := fmt.Sprintf("http://%s:%d%s", meta.IP, meta.Port, meta.HealthPath)
- deadline := time.Now().Add(layout.HealthTimeoutSecs * time.Second)
- client := &http.Client{Timeout: 2 * time.Second}
-
- var lastErr error
- for time.Now().Before(deadline) {
- req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
- if err != nil {
- return err
- }
- resp, err := client.Do(req)
- if err == nil {
- resp.Body.Close()
- if resp.StatusCode < 300 {
- return nil
- }
- lastErr = fmt.Errorf("status %d", resp.StatusCode)
- } else {
- lastErr = err
- }
- time.Sleep(500 * time.Millisecond)
- }
- return fmt.Errorf("never became healthy at %s: %w", url, lastErr)
-}