blob: 49ead7078fe28a5723694deb4a003ae87711024c [file] [log] [blame]
// +build linux
// Package gce provides a Profile for Google Compute Engine and should be
// used by binaries that only ever expect to be run on GCE.
package gce
import (
"flag"
"fmt"
"net"
"veyron.io/veyron/veyron2"
"veyron.io/veyron/veyron2/config"
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/rt"
"veyron.io/veyron/veyron/lib/appcycle"
"veyron.io/veyron/veyron/lib/flags"
"veyron.io/veyron/veyron/lib/netstate"
_ "veyron.io/veyron/veyron/lib/tcp"
_ "veyron.io/veyron/veyron/lib/websocket"
"veyron.io/veyron/veyron/profiles/internal/gce"
"veyron.io/veyron/veyron/profiles/internal/platform"
_ "veyron.io/veyron/veyron/runtimes/google/rt"
)
var (
listenAddressFlag = flags.IPHostPortFlag{Port: "0"}
ListenSpec = &ipc.ListenSpec{
Protocol: "tcp",
Address: "127.0.0.1:0",
}
)
func init() {
flag.Var(&listenAddressFlag, "veyron.tcp.address", "address to listen on")
rt.RegisterProfile(&profile{})
}
type profile struct {
ac *appcycle.AppCycle
}
func (p *profile) Name() string {
return "GCE"
}
func (p *profile) Runtime() (string, []veyron2.ROpt) {
return "", nil
}
func (p *profile) Platform() *veyron2.Platform {
pstr, _ := platform.Platform()
return pstr
}
func (p *profile) String() string {
return "net " + p.Platform().String()
}
func (p *profile) Init(veyron2.Runtime, *config.Publisher) (veyron2.AppCycle, error) {
if !gce.RunningOnGCE() {
return nil, fmt.Errorf("GCE profile used on a non-GCE system")
}
p.ac = appcycle.New()
ListenSpec.Address = listenAddressFlag.String()
if ip, err := gce.ExternalIPAddress(); err != nil {
return p.ac, err
} else {
ListenSpec.AddressChooser = func(network string, addrs []ipc.Address) ([]ipc.Address, error) {
return []ipc.Address{&netstate.AddrIfc{&net.IPAddr{IP: ip}, "gce-nat", nil}}, nil
}
}
return p.ac, nil
}
func (p *profile) Cleanup() {
p.ac.Shutdown()
}