m/n/c/r/resolver: allow disabling curator updater

This allows some resolvers to not attempt to contact the cluster for
curator node updates. We use this in the Join and Register resolvers as
they don't have permission to access this data anywa.

We also generalize Resolver options into a proper WithX setup. We also
use this opportunity to move the resolver creation in node code outside
of the roleserver, as it should have been in the first place.

Change-Id: I1cc227711d784e07959371873029e09fc8cd1b99
Reviewed-on: https://review.monogon.dev/c/monogon/+/808
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/node/core/main.go b/metropolis/node/core/main.go
index ca71fa7..c6b0bd3 100644
--- a/metropolis/node/core/main.go
+++ b/metropolis/node/core/main.go
@@ -30,6 +30,7 @@
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/core/network/hostsfile"
 	"source.monogon.dev/metropolis/node/core/roleserve"
+	"source.monogon.dev/metropolis/node/core/rpc/resolver"
 	timesvc "source.monogon.dev/metropolis/node/core/time"
 	"source.monogon.dev/metropolis/pkg/logtree"
 	"source.monogon.dev/metropolis/pkg/supervisor"
@@ -102,6 +103,11 @@
 	// Make context for supervisor. We cancel it when we reach the trapdoor.
 	ctxS, ctxC := context.WithCancel(context.Background())
 
+	// Make node-wide cluster resolver.
+	res := resolver.New(ctxS, resolver.WithLogger(func(f string, args ...interface{}) {
+		lt.MustLeveledFor("resolver").WithAddedStackDepth(1).Infof(f, args...)
+	}))
+
 	// Start root initialization code as a supervisor one-shot runnable. This
 	// means waiting for the network, starting the cluster manager, and then
 	// starting all services related to the node's roles.
@@ -127,6 +133,7 @@
 		rs := roleserve.New(roleserve.Config{
 			StorageRoot: root,
 			Network:     networkSvc,
+			Resolver:    res,
 		})
 		if err := supervisor.Run(ctx, "role", rs.Run); err != nil {
 			close(trapdoor)