blob: 4e72975db37b724cbb7b6acfa24f28cbd2335bdc [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"
"v.io/core/veyron2"
"v.io/core/veyron2/config"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/rt"
"v.io/core/veyron/lib/appcycle"
"v.io/core/veyron/lib/flags"
"v.io/core/veyron/lib/netstate"
"v.io/core/veyron/profiles/internal/gce"
"v.io/core/veyron/profiles/internal/platform"
_ "v.io/core/veyron/runtimes/google/ipc/protocols/tcp"
_ "v.io/core/veyron/runtimes/google/ipc/protocols/ws"
_ "v.io/core/veyron/runtimes/google/ipc/protocols/wsh"
_ "v.io/core/veyron/runtimes/google/rt"
)
var (
commonFlags *flags.Flags
// ListenSpec is an initialized instance of ipc.ListenSpec that can
// be used with ipc.Listen.
ListenSpec ipc.ListenSpec
)
func init() {
commonFlags = flags.CreateAndRegister(flag.CommandLine, flags.Listen)
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")
}
lf := commonFlags.ListenFlags()
ListenSpec = ipc.ListenSpec{
Addrs: ipc.ListenAddrs(lf.Addrs),
Proxy: lf.ListenProxy,
}
p.ac = appcycle.New()
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()
}