// New Go Routine based server with auth func RunServerWithAuth(opts *server.Options, auth server.Auth) *server.Server { if opts == nil { opts = &DefaultTestOptions } s := server.New(opts) if s == nil { panic("No NATS Server object returned.") } if auth != nil { s.SetAuthMethod(auth) } // Run server in Go routine. go s.Start() end := time.Now().Add(10 * time.Second) for time.Now().Before(end) { addr := s.Addr() if addr == nil { time.Sleep(50 * time.Millisecond) // Retry. We might take a little while to open a connection. continue } conn, err := net.Dial("tcp", addr.String()) if err != nil { // Retry after 50ms time.Sleep(50 * time.Millisecond) continue } conn.Close() return s } panic("Unable to start NATS Server in Go Routine") }
/* cliOpts : extra options configFile : gnatsd config file routes : cluster members */ func NewGnatsdServer(cliOpts server.Options, configFile string, routeHosts []string, log server.Logger) (s *server.Server, opts *server.Options, err error) { log.Noticef("gnatsd config file: %s\n", configFile) // Configure options based on config file if opts, err = configureServerOptions(&cliOpts, configFile, routeHosts); err != nil { return } log.Debugf("Adding routes: %v\n", opts.Routes) // Create the server with appropriate options. s = server.New(opts) // Configure the authentication mechanism configureAuth(s, opts) s.SetLogger(log, opts.Debug, opts.Trace) return }
// RunServerWithAuth starts a new Go routine based server with auth func RunServerWithAuth(opts *server.Options, auth server.Auth) *server.Server { if opts == nil { opts = &DefaultTestOptions } s := server.New(opts) if s == nil { panic("No NATS Server object returned.") } if auth != nil { s.SetClientAuthMethod(auth) } // Run server in Go routine. go s.Start() end := time.Now().Add(10 * time.Second) for time.Now().Before(end) { addr := s.GetListenEndpoint() if addr == "" { time.Sleep(50 * time.Millisecond) // Retry. We might take a little while to open a connection. continue } conn, err := net.Dial("tcp", addr) if err != nil { // Retry after 50ms time.Sleep(50 * time.Millisecond) continue } conn.Close() // Wait a bit to give a chance to the server to remove this // "client" from its state, which may otherwise interfere with // some tests. time.Sleep(25 * time.Millisecond) return s } panic("Unable to start NATS Server in Go Routine") }
// RunServerWithAuth starts a new Go routine based server with auth func RunServerWithAuth(opts *server.Options, auth server.Auth) *server.Server { if opts == nil { opts = &DefaultTestOptions } s := server.New(opts) if s == nil { panic("No NATS Server object returned.") } if auth != nil { s.SetClientAuthMethod(auth) } // Run server in Go routine. go s.Start() // Wait for accept loop(s) to be started if !s.ReadyForConnections(10 * time.Second) { panic("Unable to start NATS Server in Go Routine") } return s }
func main() { // Server Options opts := server.Options{} var showVersion bool var debugAndTrace bool var configFile string var showTLSHelp bool // Parse flags flag.IntVar(&opts.Port, "port", 0, "Port to listen on.") flag.IntVar(&opts.Port, "p", 0, "Port to listen on.") flag.StringVar(&opts.Host, "addr", "", "Network host to listen on.") flag.StringVar(&opts.Host, "a", "", "Network host to listen on.") flag.StringVar(&opts.Host, "net", "", "Network host to listen on.") flag.BoolVar(&opts.Debug, "D", false, "Enable Debug logging.") flag.BoolVar(&opts.Debug, "debug", false, "Enable Debug logging.") flag.BoolVar(&opts.Trace, "V", false, "Enable Trace logging.") flag.BoolVar(&opts.Trace, "trace", false, "Enable Trace logging.") flag.BoolVar(&debugAndTrace, "DV", false, "Enable Debug and Trace logging.") flag.BoolVar(&opts.Logtime, "T", true, "Timestamp log entries.") flag.BoolVar(&opts.Logtime, "logtime", true, "Timestamp log entries.") flag.StringVar(&opts.Username, "user", "", "Username required for connection.") flag.StringVar(&opts.Password, "pass", "", "Password required for connection.") flag.StringVar(&opts.Authorization, "auth", "", "Authorization token required for connection.") flag.IntVar(&opts.HTTPPort, "m", 0, "HTTP Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPPort, "http_port", 0, "HTTP Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPSPort, "ms", 0, "HTTPS Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPSPort, "https_port", 0, "HTTPS Port for /varz, /connz endpoints.") flag.StringVar(&configFile, "c", "", "Configuration file.") flag.StringVar(&configFile, "config", "", "Configuration file.") flag.StringVar(&opts.PidFile, "P", "", "File to store process pid.") flag.StringVar(&opts.PidFile, "pid", "", "File to store process pid.") flag.StringVar(&opts.LogFile, "l", "", "File to store logging output.") flag.StringVar(&opts.LogFile, "log", "", "File to store logging output.") flag.BoolVar(&opts.Syslog, "s", false, "Enable syslog as log method.") flag.BoolVar(&opts.Syslog, "syslog", false, "Enable syslog as log method..") flag.StringVar(&opts.RemoteSyslog, "r", "", "Syslog server addr (udp://localhost:514).") flag.StringVar(&opts.RemoteSyslog, "remote_syslog", "", "Syslog server addr (udp://localhost:514).") flag.BoolVar(&showVersion, "version", false, "Print version information.") flag.BoolVar(&showVersion, "v", false, "Print version information.") flag.IntVar(&opts.ProfPort, "profile", 0, "Profiling HTTP port") flag.StringVar(&opts.RoutesStr, "routes", "", "Routes to actively solicit a connection.") flag.StringVar(&opts.ClusterListenStr, "cluster", "", "Cluster url from which members can solicit routes.") flag.StringVar(&opts.ClusterListenStr, "cluster_listen", "", "Cluster url from which members can solicit routes.") flag.BoolVar(&showTLSHelp, "help_tls", false, "TLS help.") flag.BoolVar(&opts.TLS, "tls", false, "Enable TLS.") flag.BoolVar(&opts.TLSVerify, "tlsverify", false, "Enable TLS with client verification.") flag.StringVar(&opts.TLSCert, "tlscert", "", "Server certificate file.") flag.StringVar(&opts.TLSKey, "tlskey", "", "Private key for server certificate.") flag.StringVar(&opts.TLSCaCert, "tlscacert", "", "Client certificate CA for verification.") flag.Usage = usage flag.Parse() // Show version and exit if showVersion { server.PrintServerAndExit() } if showTLSHelp { server.PrintTLSHelpAndDie() } // One flag can set multiple options. if debugAndTrace { opts.Trace, opts.Debug = true, true } // Process args looking for non-flag options, // 'version' and 'help' only for now for _, arg := range flag.Args() { switch strings.ToLower(arg) { case "version": server.PrintServerAndExit() case "help": usage() } } // Parse config if given if configFile != "" { fileOpts, err := server.ProcessConfigFile(configFile) if err != nil { server.PrintAndDie(err.Error()) } opts = *server.MergeOptions(fileOpts, &opts) } // Remove any host/ip that points to itself in Route newroutes, err := server.RemoveSelfReference(opts.ClusterPort, opts.Routes) if err != nil { server.PrintAndDie(err.Error()) } opts.Routes = newroutes // Configure TLS based on any present flags configureTLS(&opts) // Configure cluster opts if explicitly set via flags. err = configureClusterOpts(&opts) if err != nil { server.PrintAndDie(err.Error()) } // Create the server with appropriate options. s := server.New(&opts) // Configure the authentication mechanism configureAuth(s, &opts) // Configure the logger based on the flags configureLogger(s, &opts) // Start things up. Block here until done. s.Start() }
func TestStressChainedSolicitWorks(t *testing.T) { s1, opts := runSeedServer(t) defer s1.Shutdown() // Create the routes string for s2 to connect to the seed routesStr := fmt.Sprintf("nats-route://%s:%d/", opts.Cluster.Host, opts.Cluster.Port) s2Opts := nextServerOpts(opts) s2Opts.Routes = server.RoutesFromStr(routesStr) s3Opts := nextServerOpts(s2Opts) // Create the routes string for s3 to connect to s2 routesStr = fmt.Sprintf("nats-route://%s:%d/", s2Opts.Cluster.Host, s2Opts.Cluster.Port) s3Opts.Routes = server.RoutesFromStr(routesStr) s4Opts := nextServerOpts(s3Opts) // Create the routes string for s4 to connect to s3 routesStr = fmt.Sprintf("nats-route://%s:%d/", s3Opts.Cluster.Host, s3Opts.Cluster.Port) s4Opts.Routes = server.RoutesFromStr(routesStr) for i := 0; i < 10; i++ { func() { // Run these servers manually, because we want them to start and // connect to s1 as fast as possible. s2 := server.New(s2Opts) if s2 == nil { panic("No NATS Server object returned.") } defer s2.Shutdown() go s2.Start() s3 := server.New(s3Opts) if s3 == nil { panic("No NATS Server object returned.") } defer s3.Shutdown() go s3.Start() s4 := server.New(s4Opts) if s4 == nil { panic("No NATS Server object returned.") } defer s4.Shutdown() go s4.Start() serversInfo := []serverInfo{{s1, opts}, {s2, s2Opts}, {s3, s3Opts}, {s4, s4Opts}} var err error maxTime := time.Now().Add(5 * time.Second) for time.Now().Before(maxTime) { resetPreviousHTTPConnections() for j := 0; j < len(serversInfo); j++ { err = checkConnected(t, serversInfo, j, false) // If error, start this for loop from beginning if err != nil { // Sleep a bit before the next attempt time.Sleep(100 * time.Millisecond) break } } // All servers checked ok, we are done, otherwise, try again // until time is up if err == nil { break } } // Report error if err != nil { t.Fatalf("Error: %v", err) } }() maxTime := time.Now().Add(2 * time.Second) for time.Now().Before(maxTime) { if s1.NumRoutes() > 0 { time.Sleep(10 * time.Millisecond) } else { break } } } }
func main() { // Server Options opts := server.Options{} var showVersion bool var debugAndTrace bool var configFile string // Parse flags flag.IntVar(&opts.Port, "port", 0, "Port to listen on.") flag.IntVar(&opts.Port, "p", 0, "Port to listen on.") flag.StringVar(&opts.Host, "addr", "", "Network host to listen on.") flag.StringVar(&opts.Host, "a", "", "Network host to listen on.") flag.StringVar(&opts.Host, "net", "", "Network host to listen on.") flag.BoolVar(&opts.Debug, "D", false, "Enable Debug logging.") flag.BoolVar(&opts.Debug, "debug", false, "Enable Debug logging.") flag.BoolVar(&opts.Trace, "V", false, "Enable Trace logging.") flag.BoolVar(&opts.Trace, "trace", false, "Enable Trace logging.") flag.BoolVar(&debugAndTrace, "DV", false, "Enable Debug and Trace logging.") flag.BoolVar(&opts.Logtime, "T", true, "Timestamp log entries.") flag.BoolVar(&opts.Logtime, "logtime", true, "Timestamp log entries.") flag.StringVar(&opts.Username, "user", "", "Username required for connection.") flag.StringVar(&opts.Password, "pass", "", "Password required for connection.") flag.StringVar(&opts.Authorization, "auth", "", "Authorization token required for connection.") flag.IntVar(&opts.HTTPPort, "m", 0, "HTTP Port for /varz, /connz endpoints.") flag.IntVar(&opts.HTTPPort, "http_port", 0, "HTTP Port for /varz, /connz endpoints.") flag.StringVar(&configFile, "c", "", "Configuration file.") flag.StringVar(&configFile, "config", "", "Configuration file.") flag.StringVar(&opts.PidFile, "P", "", "File to store process pid.") flag.StringVar(&opts.PidFile, "pid", "", "File to store process pid.") flag.StringVar(&opts.LogFile, "l", "", "File to store logging output.") flag.StringVar(&opts.LogFile, "log", "", "File to store logging output.") flag.BoolVar(&opts.Syslog, "s", false, "Enable syslog as log method.") flag.BoolVar(&opts.Syslog, "syslog", false, "Enable syslog as log method..") flag.StringVar(&opts.RemoteSyslog, "r", "", "Syslog server addr (udp://localhost:514).") flag.StringVar(&opts.RemoteSyslog, "remote_syslog", "", "Syslog server addr (udp://localhost:514).") flag.BoolVar(&showVersion, "version", false, "Print version information.") flag.BoolVar(&showVersion, "v", false, "Print version information.") flag.IntVar(&opts.ProfPort, "profile", 0, "Profiling HTTP port") flag.StringVar(&opts.RoutesStr, "routes", "", "Routes to actively solicit a connection.") // Not public per se, will be replaced with dynamic system, but can be used to lower memory footprint when // lots of connections present. flag.IntVar(&opts.BufSize, "bs", 0, "Read/Write buffer size per client connection.") flag.Usage = server.Usage flag.Parse() // Show version and exit if showVersion { server.PrintServerAndExit() } // One flag can set multiple options. if debugAndTrace { opts.Trace, opts.Debug = true, true } // Process args looking for non-flag options, // 'version' and 'help' only for now for _, arg := range flag.Args() { switch strings.ToLower(arg) { case "version": server.PrintServerAndExit() case "help": server.Usage() } } // Parse config if given if configFile != "" { fileOpts, err := server.ProcessConfigFile(configFile) if err != nil { server.PrintAndDie(err.Error()) } opts = *server.MergeOptions(fileOpts, &opts) } // Remove any host/ip that points to itself in Route newroutes, err := server.RemoveSelfReference(opts.ClusterPort, opts.Routes) if err != nil { server.PrintAndDie(err.Error()) } opts.Routes = newroutes // Create the server with appropriate options. s := server.New(&opts) // Configure the authentication mechanism configureAuth(s, &opts) // Configure the logger based on the flags configureLogger(s, &opts) // Start things up. Block here until done. s.Start() }