split daemon request and runtime setup

This commit is contained in:
2026-08-22 16:07:12 +08:00
parent b163b48ae3
commit a37ee9d09d
3 changed files with 141 additions and 99 deletions
+48 -28
View File
@@ -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:")