mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-01-18 11:00:03 -05:00
Share the same instance between the HTTP and the GRPC service. This is in preparation for moving the cache of the metadata storage backend to a go-micro/store based implementation. By sharing the same service instance in the HTTP and GRPC services we can avoid the usage of global variables for the caches, which will make the move to the go-micro/store implementation simpler.
107 lines
3.2 KiB
Go
107 lines
3.2 KiB
Go
package command
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/oklog/run"
|
|
"github.com/owncloud/ocis/v2/ocis-pkg/config/configlog"
|
|
ogrpc "github.com/owncloud/ocis/v2/ocis-pkg/service/grpc"
|
|
"github.com/owncloud/ocis/v2/ocis-pkg/version"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/config"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/config/parser"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/logging"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/metrics"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/server/debug"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/server/grpc"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/server/http"
|
|
svc "github.com/owncloud/ocis/v2/services/settings/pkg/service/v0"
|
|
"github.com/owncloud/ocis/v2/services/settings/pkg/tracing"
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// Server is the entrypoint for the server command.
|
|
func Server(cfg *config.Config) *cli.Command {
|
|
return &cli.Command{
|
|
Name: "server",
|
|
Usage: fmt.Sprintf("start the %s service without runtime (unsupervised mode)", cfg.Service.Name),
|
|
Category: "server",
|
|
Before: func(c *cli.Context) error {
|
|
return configlog.ReturnFatal(parser.ParseConfig(cfg))
|
|
},
|
|
Action: func(c *cli.Context) error {
|
|
logger := logging.Configure(cfg.Service.Name, cfg.Log)
|
|
err := tracing.Configure(cfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = ogrpc.Configure(ogrpc.GetClientOptions(cfg.GRPCClientTLS)...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
servers := run.Group{}
|
|
ctx, cancel := func() (context.Context, context.CancelFunc) {
|
|
if cfg.Context == nil {
|
|
return context.WithCancel(context.Background())
|
|
}
|
|
return context.WithCancel(cfg.Context)
|
|
}()
|
|
defer cancel()
|
|
|
|
mtrcs := metrics.New()
|
|
mtrcs.BuildInfo.WithLabelValues(version.GetString()).Set(1)
|
|
|
|
handle := svc.NewService(cfg, logger)
|
|
|
|
// prepare an HTTP server and add it to the group run.
|
|
httpServer, err := http.Server(
|
|
http.Name(cfg.Service.Name),
|
|
http.Logger(logger),
|
|
http.Context(ctx),
|
|
http.Config(cfg),
|
|
http.Metrics(mtrcs),
|
|
http.ServiceHandler(handle),
|
|
)
|
|
if err != nil {
|
|
logger.Error().
|
|
Err(err).
|
|
Msg("Error initializing http service")
|
|
return fmt.Errorf("could not initialize http service: %w", err)
|
|
}
|
|
servers.Add(httpServer.Run, func(_ error) {
|
|
logger.Info().Str("server", "http").Msg("Shutting down server")
|
|
cancel()
|
|
})
|
|
|
|
// prepare a gRPC server and add it to the group run.
|
|
grpcServer := grpc.Server(
|
|
grpc.Name(cfg.Service.Name),
|
|
grpc.Logger(logger),
|
|
grpc.Context(ctx),
|
|
grpc.Config(cfg),
|
|
grpc.Metrics(mtrcs),
|
|
grpc.ServiceHandler(handle),
|
|
)
|
|
servers.Add(grpcServer.Run, func(_ error) {
|
|
logger.Info().Str("server", "grpc").Msg("Shutting down server")
|
|
cancel()
|
|
})
|
|
|
|
// prepare a debug server and add it to the group run.
|
|
debugServer, err := debug.Server(debug.Logger(logger), debug.Context(ctx), debug.Config(cfg))
|
|
if err != nil {
|
|
logger.Error().Err(err).Str("server", "debug").Msg("Failed to initialize server")
|
|
return err
|
|
}
|
|
|
|
servers.Add(debugServer.ListenAndServe, func(_ error) {
|
|
_ = debugServer.Shutdown(ctx)
|
|
cancel()
|
|
})
|
|
|
|
return servers.Run()
|
|
},
|
|
}
|
|
}
|