metropolis: implement NodeManagement.Logs

This takes the implementation from the debug service, dusts it off a
bit, adds tests and moves eerything to the new node mgmt service.

Change-Id: Id3b70126a2551775d8328c0c4e424ec0e675f40f
Reviewed-on: https://review.monogon.dev/c/monogon/+/1439
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/node/core/mgmt/mgmt.go b/metropolis/node/core/mgmt/mgmt.go
index 5fa12a0..2572764 100644
--- a/metropolis/node/core/mgmt/mgmt.go
+++ b/metropolis/node/core/mgmt/mgmt.go
@@ -12,16 +12,34 @@
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
+	"source.monogon.dev/metropolis/pkg/logtree"
 	"source.monogon.dev/metropolis/pkg/supervisor"
 
 	apb "source.monogon.dev/metropolis/proto/api"
 )
 
+// Service implements metropolis.proto.api.NodeManagement.
 type Service struct {
+	// NodeCredentials used to set up gRPC server.
 	NodeCredentials *identity.NodeCredentials
+	// LogTree from which NodeManagement.Logs will be served.
+	LogTree *logtree.LogTree
+
+	// Automatically populated on Run.
+	LogService
 }
 
+// Run the Servie as a supervisor runnable.
 func (s *Service) Run(ctx context.Context) error {
+	if s.NodeCredentials == nil {
+		return fmt.Errorf("NodeCredentials missing")
+	}
+	if s.LogTree == nil {
+		return fmt.Errorf("LogTree missing")
+	}
+
+	s.LogService.LogTree = s.LogTree
+
 	sec := rpc.ServerSecurity{
 		NodeCredentials: s.NodeCredentials,
 	}