Merge pull request #319 from nats-io/fix_cluster_override

[FIXED] Route/Cluster override
This commit is contained in:
Derek Collison
2016-08-04 18:20:50 -06:00
committed by GitHub
3 changed files with 73 additions and 19 deletions

50
main.go
View File

@@ -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.

View File

@@ -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)
}

View File

@@ -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)