-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
115 lines (98 loc) · 2.68 KB
/
Copy pathmain.go
File metadata and controls
115 lines (98 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"strings"
"syscall"
"time"
"github.com/aerol-ai/kubeshipper/internal/api"
"github.com/aerol-ai/kubeshipper/internal/chartmonitor"
"github.com/aerol-ai/kubeshipper/internal/helm"
"github.com/aerol-ai/kubeshipper/internal/kube"
"github.com/aerol-ai/kubeshipper/internal/rollout"
"github.com/aerol-ai/kubeshipper/internal/store"
"github.com/aerol-ai/kubeshipper/internal/worker"
)
func main() {
port := envOr("PORT", "3000")
dbPath := envOr("DB_PATH", "kubeshipper.sqlite")
managedRaw := os.Getenv("MANAGED_NAMESPACES")
if strings.TrimSpace(managedRaw) == "" {
log.Fatal("FATAL: MANAGED_NAMESPACES is not set. " +
"Set to a comma-separated list of namespaces this service may deploy into, " +
"or \"*\" to allow all namespaces (requires cluster-wide RBAC). " +
"Example: MANAGED_NAMESPACES=default,production,staging")
}
managed := map[string]bool{}
wildcard := false
for _, n := range strings.Split(managedRaw, ",") {
n = strings.TrimSpace(n)
if n == "" {
continue
}
if n == "*" {
wildcard = true
continue
}
managed[n] = true
}
if wildcard {
managed = nil
}
st, err := store.Open(dbPath)
if err != nil {
log.Fatalf("store: %v", err)
}
defer st.Close()
kubeCli, err := kube.New(managed, wildcard)
if err != nil {
log.Fatalf("kube: %v", err)
}
helmMgr, err := helm.New(kubeCli, st)
if err != nil {
log.Fatalf("helm: %v", err)
}
rolloutMgr := rollout.NewManager(st, kubeCli)
chartMonitorMgr := chartmonitor.NewManager(st, helmMgr)
srv := api.NewServer(api.Deps{
Store: st,
Kube: kubeCli,
Helm: helmMgr,
ChartMonitor: chartMonitorMgr,
Rollouts: rolloutMgr,
AuthToken: os.Getenv("AUTH_TOKEN"),
StartedAt: time.Now().UTC().Format(time.RFC3339),
Version: envOr("APP_VERSION", "dev"),
})
httpSrv := &http.Server{
Addr: ":" + port,
Handler: srv.Handler(),
ReadHeaderTimeout: 10 * time.Second,
}
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
wkr := worker.New(st, kubeCli, rolloutMgr, chartMonitorMgr)
go wkr.Run(ctx)
go func() {
log.Printf("kubeshipper: listening on :%s", port)
if err := httpSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("http: %v", err)
}
}()
<-ctx.Done()
log.Println("kubeshipper: shutting down")
shutdownCtx, c := context.WithTimeout(context.Background(), 15*time.Second)
defer c()
_ = httpSrv.Shutdown(shutdownCtx)
}
func envOr(k, dflt string) string {
if v := os.Getenv(k); v != "" {
return v
}
return dflt
}
var _ = fmt.Sprint // keep import for future fmt usage