blob: 86cda568b77a0d84c291376f1671401fcccfd786 [file] [log] [blame]
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -07001// Package static provides a network-aware Profile that provides appropriate
2// options and configuration for a variety of network configurations, including
3// being behind 1-1 NATs, but without the ability to respond to dhcp changes.
Cosmos Nicolaou3c8fdff2014-10-20 22:56:30 -07004package static
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -07005
6import (
7 "flag"
8
9 "veyron.io/veyron/veyron2"
10 "veyron.io/veyron/veyron2/config"
11 "veyron.io/veyron/veyron2/ipc"
12 "veyron.io/veyron/veyron2/rt"
13
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080014 "veyron.io/veyron/veyron/lib/appcycle"
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070015 "veyron.io/veyron/veyron/lib/flags"
16 "veyron.io/veyron/veyron/lib/netstate"
Cosmos Nicolaou87c0a552014-12-02 23:05:49 -080017 _ "veyron.io/veyron/veyron/lib/tcp"
18 _ "veyron.io/veyron/veyron/lib/websocket"
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070019 "veyron.io/veyron/veyron/profiles/internal"
Cosmos Nicolaou87c0a552014-12-02 23:05:49 -080020 "veyron.io/veyron/veyron/profiles/internal/platform"
21 _ "veyron.io/veyron/veyron/runtimes/google/rt"
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070022 "veyron.io/veyron/veyron/services/mgmt/debug"
23 // TODO(cnicolaou,ashankar): move this into flags.
24 sflag "veyron.io/veyron/veyron/security/flag"
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070025)
26
27var (
Cosmos Nicolaoubdc917c2014-10-24 12:41:47 -070028 commonFlags *flags.Flags
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070029 // ListenSpec is an initialized instance of ipc.ListenSpec that can
30 // be used with ipc.Listen.
Cosmos Nicolaouf8d4c2b2014-10-23 22:36:38 -070031 ListenSpec ipc.ListenSpec
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070032)
33
34func init() {
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070035 commonFlags = flags.CreateAndRegister(flag.CommandLine, flags.Listen)
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070036 rt.RegisterProfile(New())
37}
38
39type static struct {
40 gce string
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080041 ac *appcycle.AppCycle
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070042}
43
44// New returns a new instance of a very static Profile. It can be used
45// as a default by Runtime implementations, in unit tests etc.
46func New() veyron2.Profile {
47 return &static{}
48}
49
50func (p *static) Name() string {
51 return "static" + p.gce
52}
53
Cosmos Nicolaou4e8da642014-11-13 08:32:05 -080054func (p *static) Runtime() (string, []veyron2.ROpt) {
55 return "google", nil
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070056}
57
58func (*static) Platform() *veyron2.Platform {
Cosmos Nicolaou87c0a552014-12-02 23:05:49 -080059 pstr, _ := platform.Platform()
60 return pstr
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070061}
62
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080063func (p *static) Init(rt veyron2.Runtime, _ *config.Publisher) (veyron2.AppCycle, error) {
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070064 log := rt.Logger()
65
Matt Rosencrantzb30286b2014-11-10 14:52:17 -080066 rt.ConfigureReservedName(debug.NewDispatcher(log.LogDir(), sflag.NewAuthorizerOrDie(), rt.VtraceStore()))
Cosmos Nicolaou8246a8b2014-11-01 09:32:36 -070067
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070068 lf := commonFlags.ListenFlags()
Cosmos Nicolaouf8d4c2b2014-10-23 22:36:38 -070069 ListenSpec = ipc.ListenSpec{
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070070 Protocol: lf.ListenProtocol.Protocol,
71 Address: lf.ListenAddress.String(),
72 Proxy: lf.ListenProxy,
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070073 }
74
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080075 p.ac = appcycle.New(rt)
76
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070077 // Our address is private, so we test for running on GCE and for its
78 // 1:1 NAT configuration. GCEPublicAddress returns a non-nil addr
79 // if we are indeed running on GCE.
80 if !internal.HasPublicIP(log) {
81 if addr := internal.GCEPublicAddress(log); addr != nil {
82 ListenSpec.AddressChooser = func(string, []ipc.Address) ([]ipc.Address, error) {
83 return []ipc.Address{&netstate.AddrIfc{addr, "nat", nil}}, nil
84 }
85 p.gce = "+gce"
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080086 return p.ac, nil
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070087 }
88 }
89 ListenSpec.AddressChooser = internal.IPAddressChooser
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080090 return p.ac, nil
91}
92
93func (p *static) Cleanup() {
94 if p.ac != nil {
95 p.ac.Shutdown()
96 }
Cosmos Nicolaouc9c41fb2014-10-16 23:53:10 -070097}
98
99func (p *static) String() string {
100 return "static profile on " + p.Platform().String()
101}