diff --git a/cmd/mesh-bootstrap/main.go b/cmd/mesh-bootstrap/main.go index adb27ba..f8ae993 100644 --- a/cmd/mesh-bootstrap/main.go +++ b/cmd/mesh-bootstrap/main.go @@ -18,6 +18,7 @@ package main import ( "context" "encoding/json" + "errors" "flag" "fmt" "io" @@ -239,6 +240,18 @@ func registryAgrees(set *flag.FlagSet, opts *bootstrap.Options) error { said := map[string]bool{} set.Visit(func(f *flag.Flag) { said[f.Name] = true }) host, portText, err := net.SplitHostPort(opts.Registry) + var missing *net.AddrError + if errors.As(err, &missing) && missing.Err == "missing port in address" { + // A host alone, as --registry took before its port became the node's: the registry's + // port — the one given, or the catalogue's — completes it. + port := opts.Ports.Registry + if port == 0 { + port = bootstrap.DefaultPorts().Registry + } + opts.Ports.Registry = port + opts.Registry = net.JoinHostPort(strings.Trim(opts.Registry, "[]"), strconv.Itoa(port)) + return nil + } if err != nil { return fmt.Errorf("--registry %q is not host:port: %w", opts.Registry, err) } diff --git a/cmd/mesh-bootstrap/main_test.go b/cmd/mesh-bootstrap/main_test.go index 2a4a4bb..8d19d6c 100644 --- a/cmd/mesh-bootstrap/main_test.go +++ b/cmd/mesh-bootstrap/main_test.go @@ -190,3 +190,17 @@ func TestTheRegistrysPortAndAddressAgree(t *testing.T) { t.Error("two ports for one registry were accepted") } } + +func TestARegistryGivenAsAHostAloneTakesTheRegistrysPort(t *testing.T) { + _, opts, _, err := parseArgs([]string{"--registry", "192.0.2.10"}) + if err != nil || opts.Registry != "192.0.2.10:5000" || opts.Ports.Registry != 5000 { + t.Errorf("--registry host alone: %s %d %v", opts.Registry, opts.Ports.Registry, err) + } + _, opts, _, err = parseArgs([]string{"--registry", "192.0.2.10", "--registry-port", "5100"}) + if err != nil || opts.Registry != "192.0.2.10:5100" { + t.Errorf("--registry host with --registry-port: %s %v", opts.Registry, err) + } + if _, _, _, err := parseArgs([]string{"--registry", "192.0.2.10:notaport"}); err == nil { + t.Error("a registry with a port that is not a number was accepted") + } +}