m/n/core/roleserve: do not store cluster directory, populate resolver earlier

This cleans up the roleserver code slightly, as I've noticed the cluster
directory actually does not need to be stored anymore now that we have
the rpc resolver.

Change-Id: Ibe9f55691602bc937205c5fb54833683e80d4804
Reviewed-on: https://review.monogon.dev/c/monogon/+/1748
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/node/core/roleserve/roleserve.go b/metropolis/node/core/roleserve/roleserve.go
index c1493be..3af5319 100644
--- a/metropolis/node/core/roleserve/roleserve.go
+++ b/metropolis/node/core/roleserve/roleserve.go
@@ -172,6 +172,7 @@
 	// This is the first time we have the node ID, tell the resolver that it's
 	// available on the loopback interface.
 	s.Resolver.AddOverride(nid, resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort)))
+	s.Resolver.AddEndpoint(resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort)))
 
 	s.ClusterMembership.Set(&ClusterMembership{
 		pubkey:   pubkey,
@@ -192,12 +193,19 @@
 	// This is the first time we have the node ID, tell the resolver that it's
 	// available on the loopback interface.
 	s.Resolver.AddOverride(credentials.ID(), resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort)))
+	// Also tell the resolver about all the existing nodes in the cluster we just
+	// registered into.
+	for _, n := range directory.Nodes {
+		// TODO(q3k): only add control plane nodes.
+		for _, addr := range n.Addresses {
+			s.Resolver.AddEndpoint(resolver.NodeByHostPort(addr.Host, uint16(common.CuratorServicePort)))
+		}
+	}
 
 	s.ClusterMembership.Set(&ClusterMembership{
-		remoteCurators: directory,
-		credentials:    &credentials,
-		pubkey:         credentials.PublicKey(),
-		resolver:       s.Resolver,
+		credentials: &credentials,
+		pubkey:      credentials.PublicKey(),
+		resolver:    s.Resolver,
 	})
 }
 
@@ -205,12 +213,19 @@
 	// This is the first time we have the node ID, tell the resolver that it's
 	// available on the loopback interface.
 	s.Resolver.AddOverride(credentials.ID(), resolver.NodeByHostPort("127.0.0.1", uint16(common.CuratorServicePort)))
+	// Also tell the resolver about all the existing nodes in the cluster we just
+	// joined into.
+	for _, n := range directory.Nodes {
+		// TODO(q3k): only add control plane nodes.
+		for _, addr := range n.Addresses {
+			s.Resolver.AddEndpoint(resolver.NodeByHostPort(addr.Host, uint16(common.CuratorServicePort)))
+		}
+	}
 
 	s.ClusterMembership.Set(&ClusterMembership{
-		remoteCurators: directory,
-		credentials:    &credentials,
-		pubkey:         credentials.PublicKey(),
-		resolver:       s.Resolver,
+		credentials: &credentials,
+		pubkey:      credentials.PublicKey(),
+		resolver:    s.Resolver,
 	})
 	s.clusterDirectorySaved.Set(true)
 }