blob: 0c7cb545242f40fbf44bc73b23019dc15a342702 [file] [log] [blame]
Serge Bazanskib40c0082023-03-29 14:28:04 +02001// Package mgmt implements the node-local management service, a.k.a.
2// metropolis.proto.api.NodeManagement.
3package mgmt
4
5import (
6 "context"
7 "fmt"
8 "net"
Lorenz Brund14be0e2023-07-31 16:46:14 +02009 "sync"
Serge Bazanskib40c0082023-03-29 14:28:04 +020010
11 "google.golang.org/grpc"
12
13 "source.monogon.dev/metropolis/node"
14 "source.monogon.dev/metropolis/node/core/identity"
15 "source.monogon.dev/metropolis/node/core/rpc"
Lorenz Brun35fcf032023-06-29 04:15:58 +020016 "source.monogon.dev/metropolis/node/core/update"
Serge Bazanskie012b722023-03-29 17:49:04 +020017 "source.monogon.dev/metropolis/pkg/logtree"
Serge Bazanskib40c0082023-03-29 14:28:04 +020018 "source.monogon.dev/metropolis/pkg/supervisor"
19
20 apb "source.monogon.dev/metropolis/proto/api"
21)
22
Serge Bazanskie012b722023-03-29 17:49:04 +020023// Service implements metropolis.proto.api.NodeManagement.
Serge Bazanskib40c0082023-03-29 14:28:04 +020024type Service struct {
Serge Bazanskie012b722023-03-29 17:49:04 +020025 // NodeCredentials used to set up gRPC server.
Serge Bazanskib40c0082023-03-29 14:28:04 +020026 NodeCredentials *identity.NodeCredentials
Serge Bazanskie012b722023-03-29 17:49:04 +020027 // LogTree from which NodeManagement.Logs will be served.
28 LogTree *logtree.LogTree
Lorenz Brun35fcf032023-06-29 04:15:58 +020029 // Update service handle for performing updates via the API.
30 UpdateService *update.Service
Lorenz Brund14be0e2023-07-31 16:46:14 +020031 // Serialized UpdateNode RPCs
32 updateMutex sync.Mutex
Serge Bazanskie012b722023-03-29 17:49:04 +020033
34 // Automatically populated on Run.
35 LogService
Serge Bazanskib40c0082023-03-29 14:28:04 +020036}
37
Serge Bazanskie012b722023-03-29 17:49:04 +020038// Run the Servie as a supervisor runnable.
Serge Bazanskib40c0082023-03-29 14:28:04 +020039func (s *Service) Run(ctx context.Context) error {
Serge Bazanskie012b722023-03-29 17:49:04 +020040 if s.NodeCredentials == nil {
41 return fmt.Errorf("NodeCredentials missing")
42 }
43 if s.LogTree == nil {
44 return fmt.Errorf("LogTree missing")
45 }
46
47 s.LogService.LogTree = s.LogTree
48
Serge Bazanskib40c0082023-03-29 14:28:04 +020049 sec := rpc.ServerSecurity{
50 NodeCredentials: s.NodeCredentials,
51 }
52 logger := supervisor.MustSubLogger(ctx, "rpc")
53 opts := sec.GRPCOptions(logger)
54 lis, err := net.Listen("tcp", fmt.Sprintf(":%d", node.NodeManagement))
55 if err != nil {
56 return fmt.Errorf("failed to listen on node management socket socket: %w", err)
57 }
58 defer lis.Close()
59
60 srv := grpc.NewServer(opts...)
61 apb.RegisterNodeManagementServer(srv, s)
62
63 runnable := supervisor.GRPCServer(srv, lis, false)
64 if err := supervisor.Run(ctx, "server", runnable); err != nil {
65 return fmt.Errorf("could not run server: %w", err)
66 }
67 supervisor.Signal(ctx, supervisor.SignalHealthy)
68 <-ctx.Done()
69 return ctx.Err()
70}