Files
opencloud/pkg/micro/runtime/runtime.go
Jörn Friedrich Dreyer 4f860675bc add ocis-reva
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2019-12-19 12:33:20 +01:00

223 lines
5.4 KiB
Go

package runtime
import (
"os"
"os/signal"
"syscall"
"github.com/micro/cli"
gorun "github.com/micro/go-micro/runtime"
"github.com/micro/micro/api"
"github.com/micro/micro/broker"
"github.com/micro/micro/health"
"github.com/micro/micro/monitor"
"github.com/micro/micro/network"
"github.com/micro/micro/plugin/build"
"github.com/micro/micro/proxy"
"github.com/micro/micro/registry"
"github.com/micro/micro/router"
"github.com/micro/micro/runtime"
"github.com/micro/micro/server"
"github.com/micro/micro/service"
"github.com/micro/micro/store"
"github.com/micro/micro/token"
"github.com/micro/micro/tunnel"
"github.com/micro/micro/web"
"github.com/owncloud/ocis-pkg/log"
)
// OwncloudNamespace is the base path for micro' services to use
var OwncloudNamespace = "com.owncloud."
// RuntimeServices to start as part of the fullstack option
var RuntimeServices = []string{
// "network", // :8085
"runtime", // :8088
"registry", // :8000
"broker", // :8001
"store", // :8002
"tunnel", // :8083
"router", // :8084
"proxy", // :8081
"api", // :8080
"web", // :8082
"monitor", // :????
// "debug", // :????
// "bot", // :????
}
// Extensions are ocis extension services
var Extensions = []string{
"hello",
"phoenix",
"graph",
"ocs",
"webdav",
"reva",
}
// Runtime is a micro' runtime
type Runtime struct {
Services []string
Logger log.Logger
R *gorun.Runtime
}
// New creates a new ocis + micro runtime
func New(opts ...Option) Runtime {
options := newOptions(opts...)
return Runtime{
Services: options.Services,
Logger: options.Logger,
R: options.MicroRuntime,
}
}
// Trap waits for a sigkill to stop the runtime
func (r *Runtime) Trap() {
shutdown := make(chan os.Signal, 1)
signal.Notify(shutdown, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
if err := (*r.R).Start(); err != nil {
os.Exit(1)
}
// block until there is a value
for range shutdown {
r.Logger.Info().Msg("shutdown signal received")
close(shutdown)
}
if err := (*r.R).Stop(); err != nil {
r.Logger.Err(err)
}
r.Logger.Info().Msgf("Service runtime shutdown")
os.Exit(0)
}
// Start starts preconfigured services
func (r *Runtime) Start() {
env := os.Environ()
for _, service := range r.Services {
args := []gorun.CreateOption{
// the binary calls itself with the micro service as a subcommand as first argument
gorun.WithCommand(os.Args[0], service),
gorun.WithEnv(env),
// and logs to STDOUT. Perhaps this can be overridden to use a log.Logger
gorun.WithOutput(os.Stdout),
}
muService := &gorun.Service{Name: service}
if err := (*r.R).Create(muService, args...); err != nil {
r.Logger.Error().Msgf("Failed to create runtime enviroment: %v", err)
}
}
}
// AddRuntime adds the micro subcommands to the cli app
func AddRuntime(app *cli.App) {
// load this from disk / env?
setDefaults()
app.Commands = append(app.Commands, api.Commands()...)
app.Commands = append(app.Commands, broker.Commands()...)
app.Commands = append(app.Commands, health.Commands()...)
app.Commands = append(app.Commands, proxy.Commands()...)
app.Commands = append(app.Commands, monitor.Commands()...)
app.Commands = append(app.Commands, router.Commands()...)
app.Commands = append(app.Commands, tunnel.Commands()...)
app.Commands = append(app.Commands, network.Commands()...)
app.Commands = append(app.Commands, registry.Commands()...)
app.Commands = append(app.Commands, runtime.Commands()...)
app.Commands = append(app.Commands, server.Commands()...)
app.Commands = append(app.Commands, service.Commands()...)
app.Commands = append(app.Commands, store.Commands()...)
app.Commands = append(app.Commands, token.Commands()...)
app.Commands = append(app.Commands, build.Commands()...)
app.Commands = append(app.Commands, web.Commands()...)
// app.Commands = append(app.Commands, bot.Commands()...)
// app.Commands = append(app.Commands, new.Commands()...)
// app.Commands = append(app.Commands, debug.Commands()...)
}
// provide a config.Config with default values?
func setDefaults() {
// api
api.Name = OwncloudNamespace + "api"
api.Namespace = OwncloudNamespace + "api"
api.HeaderPrefix = "X-Micro-Owncloud-"
// api.EnableRPC = false
// api.RPCPath
// api.Address
// api.Handler
// api.Resolver
// api.ProxyPath
// api.APIPath
// broker
broker.Name = OwncloudNamespace + "http.broker"
// broker.Address
// proxy
proxy.Name = OwncloudNamespace + "proxy"
// proxy.Address
// proxy.Protocol
// proxy.Endpoint
// monitor
monitor.Name = OwncloudNamespace + "monitor"
// router
router.Name = OwncloudNamespace + "router"
// router.Address
// router.Network
// router.Topic
// tunnel
tunnel.Name = OwncloudNamespace + "tunnel"
// tunnel.Address
// tunnel.Token
// tunnel.Tunnel
// network
network.Name = OwncloudNamespace + "network"
// network.Address
// network.Advertise
// network.Resolver
// network.Token
// registry
registry.Name = OwncloudNamespace + "registry"
// registry.Address
// registry.SyncTime
// registry.Topic
// runtime
runtime.Name = OwncloudNamespace + "runtime"
// runtime.Address
// server
server.Name = OwncloudNamespace + "server"
// server.Address
// server.Network
// server.Router
// store
store.Name = OwncloudNamespace + "store"
// store.Address
// web
web.Name = OwncloudNamespace + "web"
web.Namespace = OwncloudNamespace + "web"
// web.ACMECA
// web.ACMEChallengeProvider
// web.ACMEProvider
// web.Address
// web.BasePathHeader
// web.DefaultIcon
}