blob: d0f666c8663099fecf97f04387bba4ac00bc0b4c [file] [log] [blame]
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -07001// +build linux
2
3// Package gce provides a Profile for Google Compute Engine and should be
4// used by binaries that only ever expect to be run on GCE.
5package gce
6
7import (
Cosmos Nicolaouc0e4b792014-09-25 10:57:52 -07008 "flag"
Cosmos Nicolaou682d7fd2014-09-24 22:54:16 -07009 "fmt"
Cosmos Nicolaouef323db2014-09-07 22:13:28 -070010 "net"
Cosmos Nicolaou682d7fd2014-09-24 22:54:16 -070011
Jiri Simsa519c5072014-09-17 21:37:57 -070012 "veyron.io/veyron/veyron2"
13 "veyron.io/veyron/veyron2/config"
Cosmos Nicolaou767b62d2014-09-19 13:58:40 -070014 "veyron.io/veyron/veyron2/ipc"
Jiri Simsa519c5072014-09-17 21:37:57 -070015 "veyron.io/veyron/veyron2/rt"
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070016
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080017 "veyron.io/veyron/veyron/lib/appcycle"
Cosmos Nicolaouc0e4b792014-09-25 10:57:52 -070018 "veyron.io/veyron/veyron/lib/flags"
Cosmos Nicolaou66bc1202014-09-30 20:42:43 -070019 "veyron.io/veyron/veyron/lib/netstate"
Cosmos Nicolaou87c0a552014-12-02 23:05:49 -080020 _ "veyron.io/veyron/veyron/lib/tcp"
21 _ "veyron.io/veyron/veyron/lib/websocket"
Jiri Simsa519c5072014-09-17 21:37:57 -070022 "veyron.io/veyron/veyron/profiles/internal/gce"
Cosmos Nicolaou87c0a552014-12-02 23:05:49 -080023 "veyron.io/veyron/veyron/profiles/internal/platform"
24 _ "veyron.io/veyron/veyron/runtimes/google/rt"
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070025)
26
Cosmos Nicolaouc0e4b792014-09-25 10:57:52 -070027var (
28 listenAddressFlag = flags.IPHostPortFlag{Port: "0"}
29
30 ListenSpec = &ipc.ListenSpec{
31 Protocol: "tcp",
32 Address: "127.0.0.1:0",
33 }
34)
Cosmos Nicolaou767b62d2014-09-19 13:58:40 -070035
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070036func init() {
Cosmos Nicolaouc0e4b792014-09-25 10:57:52 -070037 flag.Var(&listenAddressFlag, "veyron.tcp.address", "address to listen on")
38
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070039 rt.RegisterProfile(&profile{})
40}
41
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080042type profile struct {
43 ac *appcycle.AppCycle
44}
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070045
46func (p *profile) Name() string {
47 return "GCE"
48}
49
Cosmos Nicolaou4e8da642014-11-13 08:32:05 -080050func (p *profile) Runtime() (string, []veyron2.ROpt) {
51 return "", nil
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070052}
53
54func (p *profile) Platform() *veyron2.Platform {
Cosmos Nicolaou87c0a552014-12-02 23:05:49 -080055 pstr, _ := platform.Platform()
56 return pstr
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070057}
58
59func (p *profile) String() string {
60 return "net " + p.Platform().String()
61}
62
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080063func (p *profile) Init(rt veyron2.Runtime, publisher *config.Publisher) (veyron2.AppCycle, error) {
Cosmos Nicolaouef323db2014-09-07 22:13:28 -070064 if !gce.RunningOnGCE() {
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080065 return nil, fmt.Errorf("GCE profile used on a non-GCE system")
Cosmos Nicolaouef323db2014-09-07 22:13:28 -070066 }
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080067 p.ac = appcycle.New(rt)
Cosmos Nicolaouc0e4b792014-09-25 10:57:52 -070068 ListenSpec.Address = listenAddressFlag.String()
Cosmos Nicolaouef323db2014-09-07 22:13:28 -070069 if ip, err := gce.ExternalIPAddress(); err != nil {
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080070 return p.ac, err
Cosmos Nicolaouef323db2014-09-07 22:13:28 -070071 } else {
Cosmos Nicolaou66bc1202014-09-30 20:42:43 -070072 ListenSpec.AddressChooser = func(network string, addrs []ipc.Address) ([]ipc.Address, error) {
73 return []ipc.Address{&netstate.AddrIfc{&net.IPAddr{IP: ip}, "gce-nat", nil}}, nil
Cosmos Nicolaou767b62d2014-09-19 13:58:40 -070074 }
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070075 }
Cosmos Nicolaou39e3ae52014-11-14 13:30:01 -080076 return p.ac, nil
77}
78
79func (p *profile) Cleanup() {
80 p.ac.Shutdown()
Cosmos Nicolaou6c6fa112014-08-19 13:22:33 -070081}