Add $PORT and $PORT_GRPC env var overrides for MCP agent port assignment
After TOML loading and generic env overrides, config.Load now checks $PORT and $PORT_GRPC and overrides ServerConfig.ListenAddr and ServerConfig.GRPCAddr respectively. These take precedence over all other config sources because they represent agent-assigned authoritative port bindings. Handles both Base embedding (MCR, MCNS, MCAT) and direct ServerConfig embedding (Metacrypt) via struct tree walking. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -401,3 +401,109 @@ func TestEmptyEnvPrefix(t *testing.T) {
|
||||
t.Fatalf("ListenAddr = %q, want %q", cfg.Server.ListenAddr, ":8443")
|
||||
}
|
||||
}
|
||||
|
||||
// directServerConfig embeds ServerConfig without Base (Metacrypt pattern).
|
||||
type directServerConfig struct {
|
||||
Server ServerConfig `toml:"server"`
|
||||
Extra string `toml:"extra"`
|
||||
}
|
||||
|
||||
func TestPortEnvOverridesListenAddr(t *testing.T) {
|
||||
path := writeTOML(t, minimalTOML)
|
||||
t.Setenv("PORT", "9999")
|
||||
|
||||
cfg, err := Load[testConfig](path, "TEST")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Server.ListenAddr != ":9999" {
|
||||
t.Fatalf("ListenAddr = %q, want %q", cfg.Server.ListenAddr, ":9999")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPortGRPCEnvOverridesGRPCAddr(t *testing.T) {
|
||||
path := writeTOML(t, minimalTOML)
|
||||
t.Setenv("PORT_GRPC", "9998")
|
||||
|
||||
cfg, err := Load[testConfig](path, "TEST")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Server.GRPCAddr != ":9998" {
|
||||
t.Fatalf("GRPCAddr = %q, want %q", cfg.Server.GRPCAddr, ":9998")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPortEnvOverridesTOMLValue(t *testing.T) {
|
||||
// fullTOML sets listen_addr = ":8443" and grpc_addr = ":9443".
|
||||
path := writeTOML(t, fullTOML)
|
||||
t.Setenv("PORT", "9999")
|
||||
|
||||
cfg, err := Load[testConfig](path, "TEST")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Server.ListenAddr != ":9999" {
|
||||
t.Fatalf("ListenAddr = %q, want %q ($PORT should override TOML)", cfg.Server.ListenAddr, ":9999")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPortEnvOverridesGenericEnv(t *testing.T) {
|
||||
path := writeTOML(t, minimalTOML)
|
||||
t.Setenv("TEST_SERVER_LISTEN_ADDR", ":7777")
|
||||
t.Setenv("PORT", "9999")
|
||||
|
||||
cfg, err := Load[testConfig](path, "TEST")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Server.ListenAddr != ":9999" {
|
||||
t.Fatalf("ListenAddr = %q, want %q ($PORT should override generic env)", cfg.Server.ListenAddr, ":9999")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNoPortEnvNoChange(t *testing.T) {
|
||||
path := writeTOML(t, minimalTOML)
|
||||
|
||||
cfg, err := Load[testConfig](path, "TEST")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
|
||||
// minimalTOML sets listen_addr = ":8443", no $PORT set.
|
||||
if cfg.Server.ListenAddr != ":8443" {
|
||||
t.Fatalf("ListenAddr = %q, want %q (TOML value preserved without $PORT)", cfg.Server.ListenAddr, ":8443")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPortEnvDirectServerConfig(t *testing.T) {
|
||||
// Test the Metacrypt pattern: ServerConfig embedded without Base.
|
||||
toml := `
|
||||
[server]
|
||||
listen_addr = ":8443"
|
||||
tls_cert = "/tmp/cert.pem"
|
||||
tls_key = "/tmp/key.pem"
|
||||
grpc_addr = ":9443"
|
||||
|
||||
extra = "value"
|
||||
`
|
||||
path := writeTOML(t, toml)
|
||||
t.Setenv("PORT", "5555")
|
||||
t.Setenv("PORT_GRPC", "5556")
|
||||
|
||||
cfg, err := Load[directServerConfig](path, "TEST")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
|
||||
if cfg.Server.ListenAddr != ":5555" {
|
||||
t.Fatalf("ListenAddr = %q, want %q ($PORT on direct ServerConfig)", cfg.Server.ListenAddr, ":5555")
|
||||
}
|
||||
if cfg.Server.GRPCAddr != ":5556" {
|
||||
t.Fatalf("GRPCAddr = %q, want %q ($PORT_GRPC on direct ServerConfig)", cfg.Server.GRPCAddr, ":5556")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user