Skip to content

Commit db2b56f

Browse files
committed
etcdctl: fix json output
Signed-off-by: Kirill Trifonov <[email protected]>
1 parent 49fbd1e commit db2b56f

File tree

1 file changed

+48
-49
lines changed

1 file changed

+48
-49
lines changed

etcdctl/ctlv3/command/printer_json.go

+48-49
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ import (
1818
"encoding/json"
1919
"fmt"
2020
"os"
21-
"strconv"
22-
"strings"
21+
"slices"
2322

24-
clientv3 "go.etcd.io/etcd/client/v3"
23+
v3 "go.etcd.io/etcd/client/v3"
2524
)
2625

2726
type jsonPrinter struct {
@@ -36,65 +35,65 @@ func newJSONPrinter(isHex bool) printer {
3635
}
3736
}
3837

39-
func (p *jsonPrinter) EndpointHealth(r []epHealth) { printJSON(r) }
40-
func (p *jsonPrinter) EndpointStatus(r []epStatus) { printJSON(r) }
41-
func (p *jsonPrinter) EndpointHashKV(r []epHashKV) { printJSON(r) }
38+
func (p *jsonPrinter) EndpointHealth(r []epHealth) { p.printJSON(r) }
39+
func (p *jsonPrinter) EndpointStatus(r []epStatus) { p.printJSON(r) }
40+
func (p *jsonPrinter) EndpointHashKV(r []epHashKV) { p.printJSON(r) }
4241

43-
func (p *jsonPrinter) MemberList(r clientv3.MemberListResponse) {
44-
if p.isHex {
45-
printMemberListWithHexJSON(r)
46-
} else {
47-
printJSON(r)
42+
func (p *jsonPrinter) MemberAdd(r v3.MemberAddResponse) { p.printJSON(r) }
43+
func (p *jsonPrinter) MemberList(r v3.MemberListResponse) { p.printJSON(r) }
44+
45+
func printJSON(v any) {
46+
b, err := json.Marshal(v)
47+
if err != nil {
48+
fmt.Fprintf(os.Stderr, "%v\n", err)
49+
return
4850
}
51+
fmt.Println(string(b))
4952
}
5053

51-
func printJSON(v any) {
54+
func (p *jsonPrinter) printJSON(v any) {
5255
b, err := json.Marshal(v)
5356
if err != nil {
5457
fmt.Fprintf(os.Stderr, "%v\n", err)
5558
return
5659
}
60+
61+
if !p.isHex {
62+
fmt.Println(string(b))
63+
return
64+
}
65+
66+
var data any
67+
if err := json.Unmarshal(b, &data); err != nil {
68+
fmt.Fprintf(os.Stderr, "%v\n", err)
69+
return
70+
}
71+
72+
convertFieldsToHex(data)
73+
b, err = json.Marshal(data)
74+
if err != nil {
75+
fmt.Fprintf(os.Stderr, "%v\n", err)
76+
return
77+
}
5778
fmt.Println(string(b))
5879
}
5980

60-
func printMemberListWithHexJSON(r clientv3.MemberListResponse) {
61-
var buffer strings.Builder
62-
var b []byte
63-
buffer.WriteString("{\"header\":{\"cluster_id\":\"")
64-
b = strconv.AppendUint(nil, r.Header.ClusterId, 16)
65-
buffer.Write(b)
66-
buffer.WriteString("\",\"member_id\":\"")
67-
b = strconv.AppendUint(nil, r.Header.MemberId, 16)
68-
buffer.Write(b)
69-
buffer.WriteString("\",\"raft_term\":")
70-
b = strconv.AppendUint(nil, r.Header.RaftTerm, 10)
71-
buffer.Write(b)
72-
buffer.WriteByte('}')
73-
for i := 0; i < len(r.Members); i++ {
74-
if i == 0 {
75-
buffer.WriteString(",\"members\":[{\"ID\":\"")
76-
} else {
77-
buffer.WriteString(",{\"ID\":\"")
78-
}
79-
b = strconv.AppendUint(nil, r.Members[i].ID, 16)
80-
buffer.Write(b)
81-
buffer.WriteString("\",\"name\":\"" + r.Members[i].Name + "\"," + "\"peerURLs\":")
82-
b, err := json.Marshal(r.Members[i].PeerURLs)
83-
if err != nil {
84-
return
85-
}
86-
buffer.Write(b)
87-
buffer.WriteString(",\"clientURLs\":")
88-
b, err = json.Marshal(r.Members[i].ClientURLs)
89-
if err != nil {
90-
return
81+
func convertFieldsToHex(data any) {
82+
keysToConvert := []string{"cluster_id", "member_id", "ID", "leader"}
83+
84+
switch v := data.(type) {
85+
case map[string]any:
86+
for key, val := range v {
87+
if slices.Contains(keysToConvert, key) {
88+
if num, ok := val.(float64); ok {
89+
v[key] = fmt.Sprintf("%x", uint64(num))
90+
}
91+
}
92+
convertFieldsToHex(val)
9193
}
92-
buffer.Write(b)
93-
buffer.WriteByte('}')
94-
if i == len(r.Members)-1 {
95-
buffer.WriteString("]")
94+
case []any:
95+
for _, item := range v {
96+
convertFieldsToHex(item)
9697
}
9798
}
98-
buffer.WriteString("}")
99-
fmt.Println(buffer.String())
10099
}

0 commit comments

Comments
 (0)