Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "flag" |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 5 | "os" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 6 | |
Jiri Simsa | 519c507 | 2014-09-17 21:37:57 -0700 | [diff] [blame] | 7 | "veyron.io/veyron/veyron2/naming" |
| 8 | "veyron.io/veyron/veyron2/rt" |
| 9 | "veyron.io/veyron/veyron2/vlog" |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 10 | |
| 11 | "veyron.io/veyron/veyron/lib/signals" |
| 12 | "veyron.io/veyron/veyron/profiles/roaming" |
| 13 | "veyron.io/veyron/veyron/services/mgmt/node/config" |
| 14 | "veyron.io/veyron/veyron/services/mgmt/node/impl" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 15 | ) |
| 16 | |
Adam Sadovsky | 5181bdb | 2014-08-13 10:29:11 -0700 | [diff] [blame] | 17 | var ( |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 18 | publishAs = flag.String("name", "", "name to publish the node manager at") |
| 19 | installSelf = flag.Bool("install_self", false, "perform installation using environment and command-line flags") |
| 20 | installFrom = flag.String("install_from", "", "if not-empty, perform installation from the provided application envelope object name") |
Adam Sadovsky | 5181bdb | 2014-08-13 10:29:11 -0700 | [diff] [blame] | 21 | ) |
| 22 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 23 | func main() { |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 24 | flag.Parse() |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 25 | runtime, err := rt.New() |
| 26 | if err != nil { |
| 27 | vlog.Fatalf("Could not initialize runtime: %v", err) |
| 28 | } |
Bogdan Caprita | 4258d88 | 2014-07-02 09:15:22 -0700 | [diff] [blame] | 29 | defer runtime.Cleanup() |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 30 | |
| 31 | if len(*installFrom) > 0 { |
| 32 | if err := impl.InstallFrom(*installFrom); err != nil { |
| 33 | vlog.Errorf("InstallFrom failed: %v", err) |
| 34 | os.Exit(1) |
| 35 | } |
| 36 | return |
| 37 | } |
| 38 | |
| 39 | if *installSelf { |
Bogdan Caprita | d174846 | 2014-11-08 16:49:46 -0800 | [diff] [blame] | 40 | // If the user specified a name to publish as, pass that through |
| 41 | // to the installed node manager script. |
| 42 | // TODO(caprita): Make the flag survive updates. |
| 43 | args := append([]string{"--name=" + *publishAs}, flag.Args()...) |
| 44 | if err := impl.SelfInstall(args, os.Environ()); err != nil { |
Bogdan Caprita | 5420f17 | 2014-10-10 15:58:14 -0700 | [diff] [blame] | 45 | vlog.Errorf("SelfInstall failed: %v", err) |
| 46 | os.Exit(1) |
| 47 | } |
| 48 | return |
| 49 | } |
| 50 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 51 | server, err := runtime.NewServer() |
| 52 | if err != nil { |
| 53 | vlog.Fatalf("NewServer() failed: %v", err) |
| 54 | } |
| 55 | defer server.Stop() |
Cosmos Nicolaou | f8d4c2b | 2014-10-23 22:36:38 -0700 | [diff] [blame] | 56 | endpoint, err := server.Listen(roaming.ListenSpec) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 57 | if err != nil { |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 58 | vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 59 | } |
David Why Use Two When One Will Do Presotto | 8b4dbbf | 2014-11-06 10:50:14 -0800 | [diff] [blame] | 60 | name := naming.JoinAddressName(endpoint.String(), "") |
Bogdan Caprita | c87a914 | 2014-07-21 10:38:13 -0700 | [diff] [blame] | 61 | vlog.VI(0).Infof("Node manager object name: %v", name) |
| 62 | configState, err := config.Load() |
| 63 | if err != nil { |
| 64 | vlog.Fatalf("Failed to load config passed from parent: %v", err) |
| 65 | return |
| 66 | } |
| 67 | configState.Name = name |
| 68 | // TODO(caprita): We need a way to set config fields outside of the |
| 69 | // update mechanism (since that should ideally be an opaque |
| 70 | // implementation detail). |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 71 | dispatcher, err := impl.NewDispatcher(runtime.Principal(), configState) |
Bogdan Caprita | c87a914 | 2014-07-21 10:38:13 -0700 | [diff] [blame] | 72 | if err != nil { |
| 73 | vlog.Fatalf("Failed to create dispatcher: %v", err) |
| 74 | } |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 75 | if err := server.ServeDispatcher(*publishAs, dispatcher); err != nil { |
Adam Sadovsky | 5181bdb | 2014-08-13 10:29:11 -0700 | [diff] [blame] | 76 | vlog.Fatalf("Serve(%v) failed: %v", *publishAs, err) |
Jiri Simsa | 24e87aa | 2014-06-09 09:27:34 -0700 | [diff] [blame] | 77 | } |
Bogdan Caprita | d174846 | 2014-11-08 16:49:46 -0800 | [diff] [blame] | 78 | vlog.VI(0).Infof("Node manager published as: %v", *publishAs) |
Matt Rosencrantz | 5180d16 | 2014-12-03 13:48:40 -0800 | [diff] [blame] | 79 | impl.InvokeCallback(runtime.NewContext(), name) |
Bogdan Caprita | c87a914 | 2014-07-21 10:38:13 -0700 | [diff] [blame] | 80 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 81 | // Wait until shutdown. |
Matt Rosencrantz | c7fecf1 | 2014-11-27 19:58:43 -0800 | [diff] [blame] | 82 | <-signals.ShutdownOnSignals(runtime) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 83 | } |