mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-18 03:58:32 +02:00
* s3: keep the gateway up when the Iceberg or Lance listener fails to bind The optional catalog servers ran glog.Fatalf on a bind error, so an occupied port (e.g. the default Lance port 9101 taken by another process) killed the entire S3 server. Log the error and run without the auxiliary listener instead; the S3 API itself still fails hard on bind errors. * mini: only probe and advertise catalogs whose listeners bound With aux listener failures no longer fatal, the configured catalog port may answer as an unrelated process; mini's readiness probe accepts any HTTP response and would announce that foreign service as the catalog. Record the bind outcome on S3Options (final by the time the S3 port serves, since the aux binds happen first) and gate mini's readiness wait and admin UI advertisement on it. * s3: test that a failed aux listener bind is non-fatal Hold the Iceberg and Lance ports open and assert both starters return no server and leave the bound flags false, covering the new nonfatal path. * command: range the endpoint test table by index S3Options now holds atomic.Bool flags, so copying a test case trips go vet's lock-copy check. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
package command
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func strp(s string) *string { return &s }
|
|
func intp(i int) *int { return &i }
|
|
|
|
func TestDeriveS3AdvertisedEndpoint(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
opt S3Options
|
|
want string
|
|
}{
|
|
{
|
|
name: "wildcard bind IP with no externalUrl does not advertise an endpoint",
|
|
opt: S3Options{
|
|
bindIp: strp("0.0.0.0"),
|
|
port: intp(8333),
|
|
portHttps: intp(0),
|
|
tlsPrivateKey: strp(""),
|
|
externalUrl: strp(""),
|
|
},
|
|
want: "",
|
|
},
|
|
{
|
|
name: "empty bind IP with no externalUrl does not advertise an endpoint",
|
|
opt: S3Options{
|
|
bindIp: strp(""),
|
|
port: intp(8333),
|
|
portHttps: intp(0),
|
|
tlsPrivateKey: strp(""),
|
|
externalUrl: strp(""),
|
|
},
|
|
want: "",
|
|
},
|
|
{
|
|
name: "explicit bind IP is kept",
|
|
opt: S3Options{
|
|
bindIp: strp("10.0.0.5"),
|
|
port: intp(8333),
|
|
portHttps: intp(0),
|
|
tlsPrivateKey: strp(""),
|
|
externalUrl: strp(""),
|
|
},
|
|
want: "http://10.0.0.5:8333",
|
|
},
|
|
{
|
|
name: "IPv6 literals are bracketed",
|
|
opt: S3Options{
|
|
bindIp: strp("fe80::1"),
|
|
port: intp(8333),
|
|
portHttps: intp(0),
|
|
tlsPrivateKey: strp(""),
|
|
externalUrl: strp(""),
|
|
},
|
|
want: "http://[fe80::1]:8333",
|
|
},
|
|
{
|
|
name: "TLS key + https port switches scheme and port",
|
|
opt: S3Options{
|
|
bindIp: strp("10.0.0.5"),
|
|
port: intp(8333),
|
|
portHttps: intp(8443),
|
|
tlsPrivateKey: strp("/etc/seaweed/tls.key"),
|
|
externalUrl: strp(""),
|
|
},
|
|
want: "https://10.0.0.5:8443",
|
|
},
|
|
{
|
|
name: "TLS-only (no separate https port) still uses https on the HTTP port",
|
|
opt: S3Options{
|
|
bindIp: strp("10.0.0.5"),
|
|
port: intp(8333),
|
|
portHttps: intp(0),
|
|
tlsPrivateKey: strp("/etc/seaweed/tls.key"),
|
|
externalUrl: strp(""),
|
|
},
|
|
want: "https://10.0.0.5:8333",
|
|
},
|
|
{
|
|
name: "externalUrl wins and trailing slash is stripped",
|
|
opt: S3Options{
|
|
bindIp: strp("10.0.0.5"),
|
|
port: intp(8333),
|
|
portHttps: intp(0),
|
|
tlsPrivateKey: strp(""),
|
|
externalUrl: strp("https://s3.example.com/"),
|
|
},
|
|
want: "https://s3.example.com",
|
|
},
|
|
}
|
|
|
|
for i := range tests {
|
|
tc := &tests[i]
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
got := tc.opt.deriveS3AdvertisedEndpoint()
|
|
if got != tc.want {
|
|
t.Fatalf("deriveS3AdvertisedEndpoint() = %q, want %q", got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|