-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.go
More file actions
138 lines (115 loc) · 4.12 KB
/
Copy pathserver.go
File metadata and controls
138 lines (115 loc) · 4.12 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"context"
"errors"
"fmt"
"io/fs"
"log/slog"
"net/http"
"os"
"os/signal"
"sync"
"time"
"github.com/cloudogu/ces-exporter/configuration"
"github.com/cloudogu/ces-exporter/core"
"github.com/cloudogu/ces-exporter/export"
"github.com/cloudogu/ces-exporter/maintenance"
"github.com/cloudogu/ces-exporter/systeminfo"
bup "github.com/cloudogu/k8s-backup-lib/api/v1"
componentEcoClient "github.com/cloudogu/k8s-component-lib/client"
ecoSystemV2 "github.com/cloudogu/k8s-dogu-lib/v2/client"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
)
const (
regKeyApi = "/config/ces-exporter/authentication/api_key"
regKeySsh = "/config/ces-exporter/authentication/public_key"
regKeyVolumeIncreaseFactor = "/config/ces-exporter/volumeIncreaseFactor"
sshKeyFileMode = fs.FileMode(0600)
authorizedKeys = "/root/.ssh/authorized_keys"
)
type ecosystemComponentClient interface {
componentEcoClient.ComponentV1Alpha1Interface
}
type ecosystemDogusClient interface {
ecoSystemV2.EcoSystemV2Interface
}
type kubernetesClient interface {
kubernetes.Interface
}
type controllerProvider interface {
createControllers(ctx context.Context) (*systeminfo.Controller, *configuration.Controller, *maintenance.Controller, *export.Controller)
}
type server struct {
config *core.Configuration
controllerProvider controllerProvider
}
func newServer(config core.Configuration) (*server, error) {
var provider controllerProvider
if config.IsClassic {
var err error
provider, err = newClassicControllerProvider(&config)
if err != nil {
return nil, fmt.Errorf("failed to create classic server: %w", err)
}
} else {
err := bup.AddToScheme(scheme.Scheme)
if err != nil {
return nil, fmt.Errorf("failed to register BackupSchedule scheme: %w", err)
}
provider, err = newMultinodeControllerProvider(config)
if err != nil {
return nil, fmt.Errorf("failed to create multinode controller provider: %w", err)
}
}
return &server{
controllerProvider: provider,
config: &config,
}, nil
}
func (s *server) run(ctx context.Context) error {
ctx, cancel := signal.NotifyContext(ctx, os.Interrupt)
defer cancel()
srv := s.createEndpoints(ctx)
httpServer := &http.Server{
Addr: ":8080",
Handler: srv,
}
go func() {
slog.Info(fmt.Sprintf("listening on %s", httpServer.Addr))
if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
slog.Error("error start serving.", "err", err)
}
}()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
<-ctx.Done()
slog.Info("shutting down...")
shutdownCtx := context.Background()
shutdownCtx, cancel := context.WithTimeout(shutdownCtx, 10*time.Second)
defer cancel()
if err := httpServer.Shutdown(shutdownCtx); err != nil { //nolint:contextcheck
slog.Error("error shutting down http server.", "err", err)
}
}()
wg.Wait()
return nil
}
func (s *server) createEndpoints(ctx context.Context) http.Handler {
systemInfoController, configController, maintenanceModeController, exportModeController := s.controllerProvider.createControllers(ctx)
authMiddleware := core.NewAuthMiddleware(s.config)
rootHandler := http.NewServeMux()
rootHandler.HandleFunc("GET /health", core.Health)
rootHandler.HandleFunc("GET /system-info", authMiddleware(systemInfoController.GetSystemInfo))
rootHandler.HandleFunc("GET /configuration", authMiddleware(configController.GetConfig))
rootHandler.HandleFunc("GET /export/dogu", authMiddleware(exportModeController.GetExportDogu))
rootHandler.HandleFunc("POST /export/dogu/{doguName}", authMiddleware(exportModeController.SetExportDogu))
rootHandler.HandleFunc("GET /export/mode", authMiddleware(exportModeController.GetExportMode))
rootHandler.HandleFunc("GET /maintenance/mode", authMiddleware(maintenanceModeController.GetMaintenanceMode))
rootHandler.HandleFunc("POST /maintenance/mode", authMiddleware(maintenanceModeController.SetMaintenanceMode))
router := http.NewServeMux()
router.Handle(fmt.Sprintf("%s/", s.config.BasePath), http.StripPrefix(s.config.BasePath, rootHandler))
return router
}