m/n/core/mgmt: implement node-local management service
Change-Id: I1e8a8ff46d1172e00f2d991ae3cc3af1929b6e4e
Reviewed-on: https://review.monogon.dev/c/monogon/+/1428
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/node/core/roleserve/BUILD.bazel b/metropolis/node/core/roleserve/BUILD.bazel
index 5980563..c2dada4 100644
--- a/metropolis/node/core/roleserve/BUILD.bazel
+++ b/metropolis/node/core/roleserve/BUILD.bazel
@@ -11,6 +11,7 @@
"worker_controlplane.go",
"worker_heartbeat.go",
"worker_kubernetes.go",
+ "worker_nodemgmt.go",
"worker_rolefetch.go",
"worker_statuspush.go",
],
@@ -23,6 +24,7 @@
"//metropolis/node/core/curator/proto/api",
"//metropolis/node/core/identity",
"//metropolis/node/core/localstorage",
+ "//metropolis/node/core/mgmt",
"//metropolis/node/core/network",
"//metropolis/node/core/rpc",
"//metropolis/node/core/rpc/resolver",
diff --git a/metropolis/node/core/roleserve/roleserve.go b/metropolis/node/core/roleserve/roleserve.go
index 0d0997d..8f9bb47 100644
--- a/metropolis/node/core/roleserve/roleserve.go
+++ b/metropolis/node/core/roleserve/roleserve.go
@@ -85,6 +85,7 @@
heartbeat *workerHeartbeat
kubernetes *workerKubernetes
rolefetch *workerRoleFetch
+ nodeMgmt *workerNodeMgmt
}
// New creates a Role Server services from a Config.
@@ -129,6 +130,10 @@
localRoles: &s.localRoles,
}
+ s.nodeMgmt = &workerNodeMgmt{
+ clusterMembership: &s.ClusterMembership,
+ }
+
return s
}
@@ -187,6 +192,7 @@
supervisor.Run(ctx, "statuspush", s.statusPush.run)
supervisor.Run(ctx, "heartbeat", s.heartbeat.run)
supervisor.Run(ctx, "rolefetch", s.rolefetch.run)
+ supervisor.Run(ctx, "nodemgmt", s.nodeMgmt.run)
supervisor.Signal(ctx, supervisor.SignalHealthy)
<-ctx.Done()
diff --git a/metropolis/node/core/roleserve/worker_nodemgmt.go b/metropolis/node/core/roleserve/worker_nodemgmt.go
new file mode 100644
index 0000000..889f0eb
--- /dev/null
+++ b/metropolis/node/core/roleserve/worker_nodemgmt.go
@@ -0,0 +1,29 @@
+package roleserve
+
+import (
+ "context"
+
+ "source.monogon.dev/metropolis/node/core/mgmt"
+ "source.monogon.dev/metropolis/pkg/event/memory"
+ "source.monogon.dev/metropolis/pkg/supervisor"
+)
+
+type workerNodeMgmt struct {
+ clusterMembership *memory.Value[*ClusterMembership]
+}
+
+func (s *workerNodeMgmt) run(ctx context.Context) error {
+ w := s.clusterMembership.Watch()
+ defer w.Close()
+ supervisor.Logger(ctx).Infof("Waiting for cluster membership...")
+ cm, err := w.Get(ctx, FilterHome())
+ if err != nil {
+ return err
+ }
+
+ supervisor.Logger(ctx).Infof("Got cluster membership, starting...")
+ srv := mgmt.Service{
+ NodeCredentials: cm.credentials,
+ }
+ return srv.Run(ctx)
+}