blob: 7c8434224c5dafc75c2e9518c1adc50dcc945c2a [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Suharsh Sivakumar3f0eaf92015-01-15 09:48:44 -08005// +build linux darwin
6
Suharsh Sivakumar40e52e92015-05-11 15:37:00 -07007// Package roaming implements a RuntimeFactory suitable for a variety of network
Todd Wang8c4e5cc2015-04-09 11:30:52 -07008// configurations, including 1-1 NATs, dhcp auto-configuration, and Google
9// Compute Engine.
Suharsh Sivakumar3f0eaf92015-01-15 09:48:44 -080010//
Cosmos Nicolaou11c0ca12015-04-23 16:23:43 -070011// The pubsub.Publisher mechanism is used for communicating networking
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070012// settings to the rpc.Server implementation of the runtime and publishes
Suharsh Sivakumar3f0eaf92015-01-15 09:48:44 -080013// the Settings it expects.
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080014package roaming
15
16import (
17 "flag"
Cosmos Nicolaouaa87e292015-04-21 22:15:50 -070018
Jiri Simsa6ac95222015-02-23 16:11:49 -080019 "v.io/v23"
Jiri Simsa6ac95222015-02-23 16:11:49 -080020 "v.io/v23/context"
Matt Rosencrantzc1490fe2015-10-06 14:02:32 -070021 "v.io/v23/flow"
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070022 "v.io/v23/rpc"
Cosmos Nicolaouaa87e292015-04-21 22:15:50 -070023
Cosmos Nicolaou0e4e3922015-06-10 16:30:09 -070024 "v.io/x/ref/internal/logger"
Jungho Ahn1eb602f2015-10-08 14:54:30 -070025 dfactory "v.io/x/ref/lib/discovery/factory"
Jiri Simsaffceefa2015-02-28 11:03:34 -080026 "v.io/x/ref/lib/flags"
Jiri Simsa574ec4b2015-08-11 09:31:37 -070027 "v.io/x/ref/lib/pubsub"
Todd Wangb3511492015-04-07 23:32:34 -070028 "v.io/x/ref/lib/security/securityflag"
Suharsh Sivakumardcc11d72015-05-11 12:19:20 -070029 "v.io/x/ref/runtime/internal"
30 "v.io/x/ref/runtime/internal/lib/appcycle"
Suharsh Sivakumara6ba6412015-10-26 22:06:43 -070031 "v.io/x/ref/runtime/internal/lib/roaming"
Suharsh Sivakumar0219ebb2015-08-27 15:04:00 -070032 "v.io/x/ref/runtime/internal/rt"
Suharsh Sivakumar73e2ee32016-03-22 14:19:10 -070033 "v.io/x/ref/runtime/protocols/lib/websocket"
Suharsh Sivakumarc9432b12015-12-04 18:32:07 -080034 _ "v.io/x/ref/runtime/protocols/tcp"
35 _ "v.io/x/ref/runtime/protocols/ws"
36 _ "v.io/x/ref/runtime/protocols/wsh"
Suharsh Sivakumar0219ebb2015-08-27 15:04:00 -070037 "v.io/x/ref/services/debug/debuglib"
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080038)
39
Suharsh Sivakumard68949c2015-01-26 10:32:23 -080040var commonFlags *flags.Flags
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080041
42func init() {
Suharsh Sivakumar40e52e92015-05-11 15:37:00 -070043 v23.RegisterRuntimeFactory(Init)
Suharsh Sivakumar73e2ee32016-03-22 14:19:10 -070044 flow.RegisterUnknownProtocol("wsh", websocket.WSH{})
Suharsh Sivakumard68949c2015-01-26 10:32:23 -080045 commonFlags = flags.CreateAndRegister(flag.CommandLine, flags.Runtime, flags.Listen)
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080046}
47
Jiri Simsa6ac95222015-02-23 16:11:49 -080048func Init(ctx *context.T) (v23.Runtime, *context.T, v23.Shutdown, error) {
Nicolas Lacasse7c45dd32015-08-28 11:09:24 -070049 if err := internal.ParseFlagsAndConfigureGlobalLogger(commonFlags); err != nil {
Matt Rosencrantz1b793912015-01-23 13:32:53 -080050 return nil, nil, nil, err
51 }
Suharsh Sivakumard68949c2015-01-26 10:32:23 -080052
Robin Thellendaeffbf32016-04-09 20:39:07 -070053 if err := internal.InitCloudVM(); err != nil {
54 return nil, nil, nil, err
55 }
56
Jungho Ahn1eb602f2015-10-08 14:54:30 -070057 ac := appcycle.New()
Jungho Ahnad3677e2016-01-29 16:12:05 -080058 discoveryFactory, err := dfactory.New(ctx)
Jungho Ahn1eb602f2015-10-08 14:54:30 -070059 if err != nil {
60 ac.Shutdown()
61 return nil, nil, nil, err
62 }
63
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080064 lf := commonFlags.ListenFlags()
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070065 listenSpec := rpc.ListenSpec{
Asim Shankar1443db62015-10-15 18:20:45 -040066 Addrs: rpc.ListenAddrs(lf.Addrs),
67 Proxy: lf.Proxy,
68 AddressChooser: internal.NewAddressChooser(logger.Global()),
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080069 }
Cosmos Nicolaou64d573d2015-07-13 16:22:18 -070070 reservedDispatcher := debuglib.NewDispatcher(securityflag.NewAuthorizerOrDie())
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080071
Jungho Ahn1eb602f2015-10-08 14:54:30 -070072 ishutdown := func() {
73 ac.Shutdown()
Jungho Ahnad3677e2016-01-29 16:12:05 -080074 discoveryFactory.Shutdown()
Jungho Ahn1eb602f2015-10-08 14:54:30 -070075 }
Suharsh Sivakumareb0e2962015-01-15 11:24:11 -080076
Cosmos Nicolaou11c0ca12015-04-23 16:23:43 -070077 publisher := pubsub.NewPublisher()
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080078
Srdjan Petrovic6cd55c72016-02-29 10:12:16 -080079 runtime, ctx, shutdown, err := rt.Init(ctx, ac, discoveryFactory, nil, nil, &listenSpec, publisher, commonFlags.RuntimeFlags(), reservedDispatcher, 0)
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080080 if err != nil {
Jungho Ahn1eb602f2015-10-08 14:54:30 -070081 ishutdown()
Suharsh Sivakumard5049b72015-01-21 14:11:35 -080082 return nil, nil, nil, err
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080083 }
84
Suharsh Sivakumara6ba6412015-10-26 22:06:43 -070085 stopRoaming, err := roaming.CreateRoamingStream(ctx, publisher, listenSpec)
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080086 if err != nil {
Suharsh Sivakumard5049b72015-01-21 14:11:35 -080087 return nil, nil, nil, err
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080088 }
89
Suharsh Sivakumar40e52e92015-05-11 15:37:00 -070090 runtimeFactoryShutdown := func() {
Jungho Ahn1eb602f2015-10-08 14:54:30 -070091 ishutdown()
Suharsh Sivakumard5049b72015-01-21 14:11:35 -080092 shutdown()
Suharsh Sivakumara6ba6412015-10-26 22:06:43 -070093 stopRoaming()
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080094 }
Suharsh Sivakumar40e52e92015-05-11 15:37:00 -070095 return runtime, ctx, runtimeFactoryShutdown, nil
Suharsh Sivakumar98aa48c2015-01-14 16:11:30 -080096}