metropolis/proto: EnrolmentConfig -> NodeParameters
This starts off the move to a node configuration API conforming to
the lifecycle management design document.
Instead of an Enrolment Config used only to join an existing cluster, we
move to a NodeParameters proto that must always be given to a node if
it's supposed to either bootstrap a new cluster or join an existing one.
This links the existing cluster management code (and its state machine)
to work with this file. However, that state machine will be removed very
soon, anyway.
We also remove everything related to golden tickets.
This breaks multi-node tests.
X-Origin-Diff: phab/D710
GitOrigin-RevId: f22615fbccab975f2d5e6928bdc7387ab3aa5714
diff --git a/metropolis/test/launch/launch.go b/metropolis/test/launch/launch.go
index 6e6891a..3a444ef 100644
--- a/metropolis/test/launch/launch.go
+++ b/metropolis/test/launch/launch.go
@@ -130,8 +130,8 @@
// It can be set to an existing file descriptor (like os.Stdout/os.Stderr) or any Go structure implementing this interface.
SerialPort io.ReadWriter
- // EnrolmentConfig is passed into the VM and subsequently used for bootstrapping if no enrolment config is built-in
- EnrolmentConfig *apb.EnrolmentConfig
+ // NodeParameters is passed into the VM and subsequently used for bootstrapping or registering into a cluster.
+ NodeParameters *apb.NodeParameters
}
// NodePorts is the list of ports a fully operational Metropolis node listens on
@@ -254,16 +254,16 @@
qemuArgs = append(qemuArgs, "-no-reboot")
}
- if options.EnrolmentConfig != nil {
- enrolmentConfigPath := filepath.Join(tempDir, "enrolment.pb")
- enrolmentConfigRaw, err := proto.Marshal(options.EnrolmentConfig)
+ if options.NodeParameters != nil {
+ parametersPath := filepath.Join(tempDir, "parameters.pb")
+ parametersRaw, err := proto.Marshal(options.NodeParameters)
if err != nil {
- return fmt.Errorf("failed to encode enrolment config: %w", err)
+ return fmt.Errorf("failed to encode node paraeters: %w", err)
}
- if err := ioutil.WriteFile(enrolmentConfigPath, enrolmentConfigRaw, 0644); err != nil {
- return fmt.Errorf("failed to write enrolment config: %w", err)
+ if err := ioutil.WriteFile(parametersPath, parametersRaw, 0644); err != nil {
+ return fmt.Errorf("failed to write node parameters: %w", err)
}
- qemuArgs = append(qemuArgs, "-fw_cfg", "name=dev.monogon.metropolis/enrolment.pb,file="+enrolmentConfigPath)
+ qemuArgs = append(qemuArgs, "-fw_cfg", "name=dev.monogon.metropolis/parameters.pb,file="+parametersPath)
}
// Start TPM emulator as a subprocess
@@ -498,7 +498,15 @@
}
go func() {
- if err := Launch(ctx, Options{ConnectToSocket: vmPorts[0]}); err != nil {
+ if err := Launch(ctx, Options{
+ ConnectToSocket: vmPorts[0],
+ NodeParameters: &apb.NodeParameters{
+ Cluster: &apb.NodeParameters_ClusterBootstrap_{
+ ClusterBootstrap: &apb.NodeParameters_ClusterBootstrap{},
+ },
+ },
+ }); err != nil {
+
// Launch() only terminates when QEMU has terminated. At that point our function probably doesn't run anymore
// so we have no way of communicating the error back up, so let's just log it. Also a failure in launching
// VMs should be very visible by the unavailability of the clients we return.
@@ -532,23 +540,7 @@
debug := apb.NewNodeDebugServiceClient(conn)
if opts.NumNodes == 2 {
- res, err := debug.GetGoldenTicket(ctx, &apb.GetGoldenTicketRequest{
- // HACK: this is assigned by DHCP, and we assume that everything goes well.
- ExternalIp: "10.1.0.3",
- }, grpcretry.WithMax(10))
- if err != nil {
- return nil, nil, fmt.Errorf("failed to get golden ticket: %w", err)
- }
-
- ec := &apb.EnrolmentConfig{
- GoldenTicket: res.Ticket,
- }
-
- go func() {
- if err := Launch(ctx, Options{ConnectToSocket: vmPorts[1], EnrolmentConfig: ec}); err != nil {
- log.Printf("Failed to launch vm1: %v", err)
- }
- }()
+ return nil, nil, fmt.Errorf("multinode unimplemented")
}
return debug, portMap, nil