-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathserve.go
More file actions
119 lines (104 loc) · 4.53 KB
/
serve.go
File metadata and controls
119 lines (104 loc) · 4.53 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
package main
import (
"context"
"errors"
"fmt"
"os"
"os/signal"
"path/filepath"
"syscall"
"time"
"github.com/sei-protocol/seictl/sidecar/engine"
"github.com/sei-protocol/seictl/sidecar/server"
"github.com/sei-protocol/seictl/sidecar/tasks"
"github.com/sei-protocol/seilog"
"github.com/urfave/cli/v3"
)
var serveCmd = cli.Command{
Name: "serve",
Usage: "Start the sidecar task executor and HTTP API",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "port",
Sources: cli.EnvVars("SEI_SIDECAR_PORT"),
Value: "7777",
Usage: "Port for the sidecar HTTP API",
},
},
Action: func(ctx context.Context, cmd *cli.Command) error {
defer func() { _ = seilog.Close() }()
ctx, stop := signal.NotifyContext(ctx, syscall.SIGTERM, syscall.SIGINT)
defer stop()
homeDir := destinations.home
if homeDir == "" {
homeDir = "/sei"
}
port := cmd.String("port")
chainID := os.Getenv("SEI_CHAIN_ID")
genesisBucket := os.Getenv("SEI_GENESIS_BUCKET")
genesisRegion := os.Getenv("SEI_GENESIS_REGION")
snapshotBucket := os.Getenv("SEI_SNAPSHOT_BUCKET")
snapshotRegion := os.Getenv("SEI_SNAPSHOT_REGION")
for _, kv := range []struct{ name, val string }{
{"SEI_CHAIN_ID", chainID},
{"SEI_GENESIS_BUCKET", genesisBucket},
{"SEI_GENESIS_REGION", genesisRegion},
{"SEI_SNAPSHOT_BUCKET", snapshotBucket},
{"SEI_SNAPSHOT_REGION", snapshotRegion},
} {
if kv.val == "" {
return fmt.Errorf("required environment variable %s is not set", kv.name)
}
}
var snapshotUploadInterval time.Duration
if raw := os.Getenv("SEI_SNAPSHOT_UPLOAD_INTERVAL"); raw != "" {
parsed, err := time.ParseDuration(raw)
if err != nil {
return fmt.Errorf("invalid SEI_SNAPSHOT_UPLOAD_INTERVAL %q: %w", raw, err)
}
snapshotUploadInterval = parsed
}
if err := tasks.EnsureDefaultConfig(homeDir); err != nil {
return fmt.Errorf("home directory init failed: %w", err)
}
store, err := engine.NewSQLiteStore(filepath.Join(homeDir, "sidecar.db"))
if err != nil {
return fmt.Errorf("open result store: %w", err)
}
snapshotRestorer, err := tasks.NewSnapshotRestorer(homeDir, snapshotBucket, snapshotRegion, chainID, nil, nil)
if err != nil {
return fmt.Errorf("creating snapshot restorer: %w", err)
}
handlers := map[engine.TaskType]engine.TaskHandler{
engine.TaskSnapshotRestore: snapshotRestorer.Handler(),
engine.TaskDiscoverPeers: tasks.NewPeerDiscoverer(homeDir, nil, nil).Handler(),
engine.TaskConfigPatch: tasks.NewConfigPatcher(homeDir).Handler(),
engine.TaskConfigApply: tasks.NewConfigApplier(homeDir).Handler(),
engine.TaskConfigValidate: tasks.NewConfigValidator(homeDir).Handler(),
engine.TaskConfigReload: tasks.NewConfigReloader(homeDir).Handler(),
engine.TaskMarkReady: tasks.MarkReadyHandler(),
engine.TaskConfigureGenesis: tasks.NewGenesisFetcher(homeDir, chainID, genesisBucket, genesisRegion, nil).Handler(),
engine.TaskConfigureStateSync: tasks.NewStateSyncConfigurer(homeDir, nil).Handler(),
engine.TaskSnapshotUpload: tasks.NewSnapshotUploader(homeDir, snapshotBucket, snapshotRegion, chainID, snapshotUploadInterval, nil).Handler(),
engine.TaskResultExport: tasks.NewResultExporter(homeDir, nil).Handler(),
engine.TaskAwaitCondition: tasks.NewConditionWaiter(nil).Handler(),
engine.TaskGenerateIdentity: tasks.NewIdentityGenerator(homeDir).Handler(),
engine.TaskGenerateGentx: tasks.NewGentxGenerator(homeDir).Handler(),
engine.TaskUploadGenesisArtifacts: tasks.NewGenesisArtifactUploader(homeDir, genesisBucket, genesisRegion, chainID, nil).Handler(),
engine.TaskAssembleAndUploadGenesis: tasks.NewGenesisAssembler(homeDir, genesisBucket, genesisRegion, chainID, nil, nil).Handler(),
engine.TaskSetGenesisPeers: tasks.NewGenesisPeersSetter(homeDir, genesisBucket, genesisRegion, chainID, nil).Handler(),
engine.TaskAssembleGenesisFork: tasks.NewGenesisForkAssembler(homeDir, genesisBucket, genesisRegion, nil, nil).Handler(),
engine.TaskExportState: tasks.NewStateExporter(homeDir, nil).Handler(),
}
eng := engine.NewEngine(ctx, handlers, store)
srv := server.NewServer(":"+port, eng, homeDir)
srvErr := srv.ListenAndServe(ctx)
if closeErr := store.Close(); closeErr != nil {
fmt.Fprintf(os.Stderr, "warn: result store close: %v\n", closeErr)
}
if srvErr != nil && !errors.Is(srvErr, context.Canceled) {
return fmt.Errorf("server error: %w", srvErr)
}
return nil
},
}