m/cli/metroctl: refactor, use tabular layout

This lays out the files to make it more obvious what command each file
implements, and uses the newly implemented tabular formatting for
listing/describing nodes.

Change-Id: I90feeae67de0f78090dd5440cbad4cb9aa6bb6bc
Reviewed-on: https://review.monogon.dev/c/monogon/+/1392
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/cli/metroctl/test/test.go b/metropolis/cli/metroctl/test/test.go
index a88a2e0..5468834 100644
--- a/metropolis/cli/metroctl/test/test.go
+++ b/metropolis/cli/metroctl/test/test.go
@@ -1,6 +1,7 @@
 package test
 
 import (
+	"bufio"
 	"context"
 	"encoding/pem"
 	"fmt"
@@ -222,20 +223,31 @@
 			}
 
 			// Try matching metroctl output against the advertised format.
-			ob, err := os.ReadFile("describe.txt")
+			f, err := os.Open("describe.txt")
 			if err != nil {
-				return fmt.Errorf("while reading metroctl output: %v", err)
+				return fmt.Errorf("while opening metroctl output: %v", err)
 			}
+			scanner := bufio.NewScanner(f)
+			if !scanner.Scan() {
+				return fmt.Errorf("expected header line")
+			}
+			if !scanner.Scan() {
+				return fmt.Errorf("expected result line")
+			}
+			line := scanner.Text()
+			t.Logf("Line: %q", line)
+
 			var onid, ostate, onaddr, onstatus, onroles string
 			var ontimeout int
-			_, err = fmt.Sscanf(string(ob[:]), "%s\t%s\t%s\t%s\t%s\t%ds\n", &onid, &ostate, &onaddr, &onstatus, &onroles, &ontimeout)
+
+			_, err = fmt.Sscanf(line, "%s%s%s%s%s%ds", &onid, &ostate, &onaddr, &onstatus, &onroles, &ontimeout)
 			if err != nil {
 				return fmt.Errorf("while parsing metroctl output: %v", err)
 			}
 			if onid != nid {
 				return fmt.Errorf("node id mismatch")
 			}
-			if ostate != "NODE_STATE_UP" {
+			if ostate != "UP" {
 				return fmt.Errorf("node state mismatch")
 			}
 			if onaddr != naddr {