blob: 41987ec21aefd9aa85015f3a45b589405bfa20e0 [file] [log] [blame]
Mateusz Zalegadb75e212022-08-04 17:31:34 +02001package main
2
3import (
4 "fmt"
5 "io"
6 "log"
7 "os"
Serge Bazanski15f7f632023-03-14 17:17:20 +01008 "sort"
9 "strings"
Mateusz Zalegadb75e212022-08-04 17:31:34 +020010
11 "source.monogon.dev/metropolis/node/core/identity"
12 apb "source.monogon.dev/metropolis/proto/api"
Mateusz Zalegab838e052022-08-12 18:08:10 +020013 cpb "source.monogon.dev/metropolis/proto/common"
Mateusz Zalegadb75e212022-08-04 17:31:34 +020014)
15
16type encoder struct {
17 out io.WriteCloser
18}
19
20func (e *encoder) writeNodeID(n *apb.Node) error {
21 id := identity.NodeID(n.Pubkey)
22 _, err := fmt.Fprintf(e.out, "%s\n", id)
23 return err
24}
25
Mateusz Zalegab838e052022-08-12 18:08:10 +020026func (e *encoder) writeNode(n *apb.Node) error {
27 id := identity.NodeID(n.Pubkey)
28 if _, err := fmt.Fprintf(e.out, "%s", id); err != nil {
29 return err
30 }
31
32 state := cpb.NodeState_name[int32(n.State)]
33 if _, err := fmt.Fprintf(e.out, "\t%s", state); err != nil {
34 return err
35 }
36
37 addr := n.Status.ExternalAddress
38 if _, err := fmt.Fprintf(e.out, "\t%s", addr); err != nil {
39 return err
40 }
41
42 health := apb.Node_Health_name[int32(n.Health)]
43 if _, err := fmt.Fprintf(e.out, "\t%s", health); err != nil {
44 return err
45 }
46
Serge Bazanski15f7f632023-03-14 17:17:20 +010047 var roles []string
Mateusz Zalegab838e052022-08-12 18:08:10 +020048 if n.Roles.ConsensusMember != nil {
Serge Bazanski15f7f632023-03-14 17:17:20 +010049 roles = append(roles, "ConsensusMember")
Mateusz Zalegab838e052022-08-12 18:08:10 +020050 }
Serge Bazanski15f7f632023-03-14 17:17:20 +010051 if n.Roles.KubernetesController != nil {
52 roles = append(roles, "KubernetesController")
53 }
54 if n.Roles.KubernetesWorker != nil {
55 roles = append(roles, "KubernetesWorker")
56 }
57 sort.Strings(roles)
58 if _, err := fmt.Fprintf(e.out, "\t%s", strings.Join(roles, ",")); err != nil {
Mateusz Zalegab838e052022-08-12 18:08:10 +020059 return err
60 }
61
62 tshs := n.TimeSinceHeartbeat.GetSeconds()
63 if _, err := fmt.Fprintf(e.out, "\t%ds\n", tshs); err != nil {
64 return err
65 }
66 return nil
67}
68
Mateusz Zalegadb75e212022-08-04 17:31:34 +020069func (e *encoder) close() error {
70 if e.out != os.Stdout {
71 return e.out.Close()
72 }
73 return nil
74}
75
76func newOutputEncoder() *encoder {
77 var o io.WriteCloser
78 o = os.Stdout
79
80 // Redirect output to the file at flags.output, if the flag was provided.
81 if flags.output != "" {
82 of, err := os.Create(flags.output)
83 if err != nil {
84 log.Fatalf("Couldn't create the output file at %s: %v", flags.output, err)
85 }
86 o = of
87 }
88
89 if flags.format != "plaintext" {
90 log.Fatalf("Currently only the plaintext output format is supported.")
91 }
92 return &encoder{
93 out: o,
94 }
95}