blob: 5fa12a077265ec457beec5ae1e49ac5d2a6f1020 [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"
9
10 "google.golang.org/grpc"
11
12 "source.monogon.dev/metropolis/node"
13 "source.monogon.dev/metropolis/node/core/identity"
14 "source.monogon.dev/metropolis/node/core/rpc"
15 "source.monogon.dev/metropolis/pkg/supervisor"
16
17 apb "source.monogon.dev/metropolis/proto/api"
18)
19
20type Service struct {
21 NodeCredentials *identity.NodeCredentials
22}
23
24func (s *Service) Run(ctx context.Context) error {
25 sec := rpc.ServerSecurity{
26 NodeCredentials: s.NodeCredentials,
27 }
28 logger := supervisor.MustSubLogger(ctx, "rpc")
29 opts := sec.GRPCOptions(logger)
30 lis, err := net.Listen("tcp", fmt.Sprintf(":%d", node.NodeManagement))
31 if err != nil {
32 return fmt.Errorf("failed to listen on node management socket socket: %w", err)
33 }
34 defer lis.Close()
35
36 srv := grpc.NewServer(opts...)
37 apb.RegisterNodeManagementServer(srv, s)
38
39 runnable := supervisor.GRPCServer(srv, lis, false)
40 if err := supervisor.Run(ctx, "server", runnable); err != nil {
41 return fmt.Errorf("could not run server: %w", err)
42 }
43 supervisor.Signal(ctx, supervisor.SignalHealthy)
44 <-ctx.Done()
45 return ctx.Err()
46}