split daemon request and runtime setup
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
@@ -342,34 +343,9 @@ func runServe(ctx context.Context) (result error) {
|
||||
return err
|
||||
}
|
||||
httpClient := &http.Client{Timeout: 5 * time.Second}
|
||||
var updater *backendupdate.Updater
|
||||
var diagnoser *backendstatus.Diagnoser
|
||||
switch config.Backend.Type {
|
||||
case deploymentconfig.BackendTypeNative:
|
||||
releaseStore, err := filestore.New(config.Backend.ReleaseDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
units, err := systemd.NewSystemctl(config.Backend.SystemctlPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
updater, err = backendupdate.New(config, runtimepaths.WorkRoot, store, coordinator, releaseStore, units, gateway, httpClient, logger)
|
||||
if err == nil {
|
||||
diagnoser, err = backendstatus.New(config, store, coordinator, nil, units, gateway)
|
||||
}
|
||||
case deploymentconfig.BackendTypeContainer:
|
||||
var engine *containerengine.MobyEngine
|
||||
engine, err = containerengine.NewMobyEngine()
|
||||
if err == nil {
|
||||
defer func() { result = errors.Join(result, engine.Close()) }()
|
||||
updater, err = backendupdate.NewContainer(config, runtimepaths.WorkRoot, store, coordinator, engine, gateway, httpClient, logger)
|
||||
if err == nil {
|
||||
diagnoser, err = backendstatus.New(config, store, coordinator, engine, nil, gateway)
|
||||
}
|
||||
}
|
||||
default:
|
||||
err = fmt.Errorf("unsupported backend.type %q", config.Backend.Type)
|
||||
updater, diagnoser, closeRuntime, err := buildRuntime(config, store, coordinator, gateway, httpClient, logger)
|
||||
if closeRuntime != nil {
|
||||
defer func() { result = errors.Join(result, closeRuntime()) }()
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -381,6 +357,50 @@ func runServe(ctx context.Context) (result error) {
|
||||
return server.Serve(ctx)
|
||||
}
|
||||
|
||||
type runtimeCloser func() error
|
||||
|
||||
func buildRuntime(config deploymentconfig.Config, store *transaction.Store, coordinator *transaction.Coordinator, gateway *hostnginx.Controller, httpClient *http.Client, logger *slog.Logger) (*backendupdate.Updater, *backendstatus.Diagnoser, runtimeCloser, error) {
|
||||
switch config.Backend.Type {
|
||||
case deploymentconfig.BackendTypeNative:
|
||||
return buildNativeRuntime(config, store, coordinator, gateway, httpClient, logger)
|
||||
case deploymentconfig.BackendTypeContainer:
|
||||
return buildContainerRuntime(config, store, coordinator, gateway, httpClient, logger)
|
||||
default:
|
||||
return nil, nil, nil, fmt.Errorf("unsupported backend.type %q", config.Backend.Type)
|
||||
}
|
||||
}
|
||||
|
||||
func buildNativeRuntime(config deploymentconfig.Config, store *transaction.Store, coordinator *transaction.Coordinator, gateway *hostnginx.Controller, httpClient *http.Client, logger *slog.Logger) (*backendupdate.Updater, *backendstatus.Diagnoser, runtimeCloser, error) {
|
||||
releaseStore, err := filestore.New(config.Backend.ReleaseDir)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
units, err := systemd.NewSystemctl(config.Backend.SystemctlPath)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
updater, err := backendupdate.New(config, runtimepaths.WorkRoot, store, coordinator, releaseStore, units, gateway, httpClient, logger)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
diagnoser, err := backendstatus.New(config, store, coordinator, nil, units, gateway)
|
||||
return updater, diagnoser, nil, err
|
||||
}
|
||||
|
||||
func buildContainerRuntime(config deploymentconfig.Config, store *transaction.Store, coordinator *transaction.Coordinator, gateway *hostnginx.Controller, httpClient *http.Client, logger *slog.Logger) (*backendupdate.Updater, *backendstatus.Diagnoser, runtimeCloser, error) {
|
||||
engine, err := containerengine.NewMobyEngine()
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
closeEngine := runtimeCloser(engine.Close)
|
||||
updater, err := backendupdate.NewContainer(config, runtimepaths.WorkRoot, store, coordinator, engine, gateway, httpClient, logger)
|
||||
if err != nil {
|
||||
return nil, nil, closeEngine, err
|
||||
}
|
||||
diagnoser, err := backendstatus.New(config, store, coordinator, engine, nil, gateway)
|
||||
return updater, diagnoser, closeEngine, err
|
||||
}
|
||||
|
||||
// writeUsage 向 output 写出命令行客户端各子命令的用法说明。
|
||||
func writeUsage(output io.Writer) {
|
||||
fmt.Fprintln(output, "usage:")
|
||||
|
||||
Reference in New Issue
Block a user