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