blob: 8bfb7edd763b5ea155af304462fd337f0ae2a3f3 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Serge Bazanskib40c0082023-03-29 14:28:04 +02004// Package mgmt implements the node-local management service, a.k.a.
5// metropolis.proto.api.NodeManagement.
6package mgmt
7
8import (
9 "context"
10 "fmt"
11 "net"
Lorenz Brund14be0e2023-07-31 16:46:14 +020012 "sync"
Serge Bazanskib40c0082023-03-29 14:28:04 +020013
14 "google.golang.org/grpc"
15
Jan Schär0f8ce4c2025-09-04 13:27:50 +020016 "source.monogon.dev/metropolis/node/allocs"
Serge Bazanskib40c0082023-03-29 14:28:04 +020017 "source.monogon.dev/metropolis/node/core/identity"
18 "source.monogon.dev/metropolis/node/core/rpc"
Lorenz Brun35fcf032023-06-29 04:15:58 +020019 "source.monogon.dev/metropolis/node/core/update"
Tim Windelschmidt9f21f532024-05-07 15:14:20 +020020 "source.monogon.dev/osbase/logtree"
21 "source.monogon.dev/osbase/supervisor"
Serge Bazanskib40c0082023-03-29 14:28:04 +020022
23 apb "source.monogon.dev/metropolis/proto/api"
24)
25
Serge Bazanskie012b722023-03-29 17:49:04 +020026// Service implements metropolis.proto.api.NodeManagement.
Serge Bazanskib40c0082023-03-29 14:28:04 +020027type Service struct {
Serge Bazanskie012b722023-03-29 17:49:04 +020028 // NodeCredentials used to set up gRPC server.
Serge Bazanskib40c0082023-03-29 14:28:04 +020029 NodeCredentials *identity.NodeCredentials
Serge Bazanskie012b722023-03-29 17:49:04 +020030 // LogTree from which NodeManagement.Logs will be served.
31 LogTree *logtree.LogTree
Lorenz Brun35fcf032023-06-29 04:15:58 +020032 // Update service handle for performing updates via the API.
33 UpdateService *update.Service
Lorenz Brund14be0e2023-07-31 16:46:14 +020034 // Serialized UpdateNode RPCs
35 updateMutex sync.Mutex
Serge Bazanskie012b722023-03-29 17:49:04 +020036
37 // Automatically populated on Run.
38 LogService
Serge Bazanskib40c0082023-03-29 14:28:04 +020039}
40
Serge Bazanskie012b722023-03-29 17:49:04 +020041// Run the Servie as a supervisor runnable.
Serge Bazanskib40c0082023-03-29 14:28:04 +020042func (s *Service) Run(ctx context.Context) error {
Serge Bazanskie012b722023-03-29 17:49:04 +020043 if s.NodeCredentials == nil {
44 return fmt.Errorf("NodeCredentials missing")
45 }
46 if s.LogTree == nil {
47 return fmt.Errorf("LogTree missing")
48 }
49
50 s.LogService.LogTree = s.LogTree
51
Serge Bazanskib40c0082023-03-29 14:28:04 +020052 sec := rpc.ServerSecurity{
53 NodeCredentials: s.NodeCredentials,
54 }
55 logger := supervisor.MustSubLogger(ctx, "rpc")
56 opts := sec.GRPCOptions(logger)
Jan Schär0f8ce4c2025-09-04 13:27:50 +020057 lis, err := net.Listen("tcp", fmt.Sprintf(":%d", allocs.PortNodeManagement))
Serge Bazanskib40c0082023-03-29 14:28:04 +020058 if err != nil {
59 return fmt.Errorf("failed to listen on node management socket socket: %w", err)
60 }
61 defer lis.Close()
62
63 srv := grpc.NewServer(opts...)
64 apb.RegisterNodeManagementServer(srv, s)
65
66 runnable := supervisor.GRPCServer(srv, lis, false)
67 if err := supervisor.Run(ctx, "server", runnable); err != nil {
68 return fmt.Errorf("could not run server: %w", err)
69 }
70 supervisor.Signal(ctx, supervisor.SignalHealthy)
71 <-ctx.Done()
72 return ctx.Err()
73}