mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-01-01 09:52:23 -06:00
223 lines
5.4 KiB
Go
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
|
|
|
|
}
|