diff --git a/main.go b/main.go index 7d3a6232..bd679e2c 100644 --- a/main.go +++ b/main.go @@ -260,33 +260,45 @@ func configureTLS(opts *server.Options) { } func configureClusterOpts(opts *server.Options) error { - if opts.ClusterListenStr == "" { + // If we don't have cluster defined in the configuration + // file and no cluster listen string override, but we do + // have a routes override, we need to report misconfiguration. + if opts.ClusterListenStr == "" && opts.ClusterHost == "" && + opts.ClusterPort == 0 { if opts.RoutesStr != "" { server.PrintAndDie("Solicited routes require cluster capabilities, e.g. --cluster.") } return nil } - clusterURL, err := url.Parse(opts.ClusterListenStr) - h, p, err := net.SplitHostPort(clusterURL.Host) - if err != nil { - return err - } - opts.ClusterHost = h - _, err = fmt.Sscan(p, &opts.ClusterPort) - if err != nil { - return err - } - - if clusterURL.User != nil { - pass, hasPassword := clusterURL.User.Password() - if !hasPassword { - return fmt.Errorf("Expected cluster password to be set.") + // If cluster flag override, process it + if opts.ClusterListenStr != "" { + clusterURL, err := url.Parse(opts.ClusterListenStr) + h, p, err := net.SplitHostPort(clusterURL.Host) + if err != nil { + return err + } + opts.ClusterHost = h + _, err = fmt.Sscan(p, &opts.ClusterPort) + if err != nil { + return err } - opts.ClusterPassword = pass - user := clusterURL.User.Username() - opts.ClusterUsername = user + if clusterURL.User != nil { + pass, hasPassword := clusterURL.User.Password() + if !hasPassword { + return fmt.Errorf("Expected cluster password to be set.") + } + opts.ClusterPassword = pass + + user := clusterURL.User.Username() + opts.ClusterUsername = user + } else { + // Since we override from flag and there is no user/pwd, make + // sure we clear what we may have gotten from config file. + opts.ClusterUsername = "" + opts.ClusterPassword = "" + } } // If we have routes but no config file, fill in here. diff --git a/server/opts.go b/server/opts.go index 56ff4327..a0e61089 100644 --- a/server/opts.go +++ b/server/opts.go @@ -637,6 +637,9 @@ func MergeOptions(fileOpts, flagOpts *Options) *Options { if flagOpts.ProfPort != 0 { opts.ProfPort = flagOpts.ProfPort } + if flagOpts.ClusterListenStr != "" { + opts.ClusterListenStr = flagOpts.ClusterListenStr + } if flagOpts.RoutesStr != "" { mergeRoutes(&opts, flagOpts) } diff --git a/server/opts_test.go b/server/opts_test.go index 18adf2cf..70c1301b 100644 --- a/server/opts_test.go +++ b/server/opts_test.go @@ -276,6 +276,45 @@ func TestRouteFlagOverride(t *testing.T) { } } +func TestClusterFlagsOverride(t *testing.T) { + routeFlag := "nats-route://ruser:top_secret@127.0.0.1:7246" + rurl, _ := url.Parse(routeFlag) + + // In this test, we override the cluster listen string. Note that in + // the golden options, the cluster other infos correspond to what + // is recovered from the configuration file, this explains the + // discrepency between ClusterListenStr and the rest. + // The server would then process the ClusterListenStr override and + // correctly override ClusterHost/ClustherPort/etc.. + golden := &Options{ + Host: "127.0.0.1", + Port: 7222, + ClusterHost: "127.0.0.1", + ClusterPort: 7244, + ClusterListenStr: "nats://127.0.0.1:8224", + ClusterUsername: "ruser", + ClusterPassword: "top_secret", + ClusterAuthTimeout: 0.5, + Routes: []*url.URL{rurl}, + } + + fopts, err := ProcessConfigFile("./configs/srv_a.conf") + if err != nil { + t.Fatalf("Received an error reading config file: %v\n", err) + } + + // Overrides via flags + opts := &Options{ + ClusterListenStr: "nats://127.0.0.1:8224", + } + merged := MergeOptions(fopts, opts) + + if !reflect.DeepEqual(golden, merged) { + t.Fatalf("Options are incorrect.\nexpected: %+v\ngot: %+v", + golden, merged) + } +} + func TestRouteFlagOverrideWithMultiple(t *testing.T) { routeFlag := "nats-route://ruser:top_secret@127.0.0.1:8246, nats-route://ruser:top_secret@127.0.0.1:8266" rurls := RoutesFromStr(routeFlag)