diff --git a/cmd/libraryagent/main.go b/cmd/libraryagent/main.go index ada1d86..81fe64e 100644 --- a/cmd/libraryagent/main.go +++ b/cmd/libraryagent/main.go @@ -27,6 +27,7 @@ func main() { flag.StringVar(&config.SourceApp, "source-app", "WKNFull-app", "source container describing the stack") flag.StringVar(&config.SourcePG, "source-pg", "WKNFull-postgres", "source PostgreSQL container") flag.StringVar(&config.SourceES, "source-es", "WKNFull-elasticsearch", "source Elasticsearch container") + flag.StringVar(&config.SourceS3Endpoint, "source-s3-endpoint", "", "host-reachable source object-store endpoint (overrides the container-internal one)") flag.StringVar(&config.GovernancePG, "governance-pg", "knowledge-governance-p1-postgres-1", "governance PostgreSQL container") flag.StringVar(&config.Project, "project", "weknora071full", "Compose project owning the writers") flag.StringVar(&config.Writers, "writers", "app", "declared writer services") diff --git a/internal/libraryagent/agent.go b/internal/libraryagent/agent.go index edc279a..9b32db6 100644 --- a/internal/libraryagent/agent.go +++ b/internal/libraryagent/agent.go @@ -40,6 +40,9 @@ type Config struct { SourceApp string SourcePG string SourceES string + // SourceS3Endpoint 让宿主机用可达地址读源对象存储:容器 env 里的端点常常 + // 只是服务名(minio:9000),宿主机解析不到,资源导出会失败。 + SourceS3Endpoint string GovernancePG string Project string Writers string @@ -268,17 +271,22 @@ func (a *Agent) recoverWriters(ctx context.Context) error { // declaration pins every path and the writer group so a request cannot redirect // the operation to another stack, archive or journal. func (c Config) declaration() []string { - return []string{ + args := []string{ "-source-app", c.SourceApp, "-source-pg", c.SourcePG, "-source-es", c.SourceES, + } + if c.SourceS3Endpoint != "" { + args = append(args, "-source-s3-endpoint", c.SourceS3Endpoint) + } + return append(args, "-governance-pg", c.GovernancePG, "-project", c.Project, "-writers", c.Writers, "-non-writers", c.NonWriters, "-archive", c.ArchiveRoot, "-journal", c.JournalRoot, - } + ) } func (c Config) run(ctx context.Context, name string, args ...string) ([]byte, error) { diff --git a/internal/libraryagent/agent_test.go b/internal/libraryagent/agent_test.go index 8af94d7..11774d1 100644 --- a/internal/libraryagent/agent_test.go +++ b/internal/libraryagent/agent_test.go @@ -336,3 +336,47 @@ func TestNewRejectsIncompleteConfiguration(t *testing.T) { t.Fatal("non-writer declaration without a reason accepted") } } + +// 宿主机可达的源对象存储端点必须由 agent 自己钉住:请求不能改,也不能被悄悄丢掉 +// (掉了就会退回"容器里那个解析不到的服务名",真实封存报 read library resource)。 +func TestAgentPinsTheHostSideObjectEndpoint(t *testing.T) { + config := Config{ + Socket: "/tmp/agent.sock", + Binary: "/bin/echo", + ArchiveRoot: "/tmp/library", + JournalRoot: "/tmp/freeze", + SourceApp: "app-container", + SourcePG: "pg", + SourceES: "es", + SourceS3Endpoint: "http://127.0.0.1:19100", + GovernancePG: "gov", + Project: "proj", + Writers: "app", + NonWriters: "postgres=database store", + MaxDuration: time.Minute, + } + agent, err := New(config) + if err != nil { + t.Fatalf("new: %v", err) + } + args := agent.config.declaration() + found := false + for i := 0; i+1 < len(args); i++ { + if args[i] == "-source-s3-endpoint" && args[i+1] == "http://127.0.0.1:19100" { + found = true + } + } + if !found { + t.Fatalf("声明里没有宿主侧对象存储端点:%v", args) + } + config.SourceS3Endpoint = "" + bare, err := New(config) + if err != nil { + t.Fatalf("new without endpoint: %v", err) + } + for _, arg := range bare.config.declaration() { + if arg == "-source-s3-endpoint" { + t.Fatal("没有端点时不该凭空多一个 flag") + } + } +}