Skip to content

Commit 578fb7a

Browse files
authored
Do not show created at in the network report (#583)
* No longer show created_at in network reports * Remove network report table output
1 parent 7770e61 commit 578fb7a

File tree

4 files changed

+57
-117
lines changed

4 files changed

+57
-117
lines changed

cli/cmd/network_report.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/replicatedhq/replicated/cli/print"
1010
"github.com/replicatedhq/replicated/pkg/platformclient"
1111
"github.com/replicatedhq/replicated/pkg/types"
12+
"github.com/replicatedhq/replicated/pkg/util"
1213
"github.com/spf13/cobra"
1314
)
1415

@@ -23,11 +24,8 @@ replicated network report abc123
2324
# Get report for a network by ID (using flag)
2425
replicated network report --id abc123
2526
26-
# Watch for new network events (table format)
27-
replicated network report abc123 --watch --output table
28-
2927
# Watch for new network events (JSON Lines format)
30-
replicated network report abc123 --watch --output json`,
28+
replicated network report abc123 --watch`,
3129
RunE: r.getNetworkReport,
3230
ValidArgsFunction: r.completeNetworkIDs,
3331
Hidden: true,
@@ -37,7 +35,6 @@ replicated network report abc123 --watch --output json`,
3735
cmd.Flags().StringVar(&r.args.networkReportID, "id", "", "Network ID to get report for")
3836
cmd.RegisterFlagCompletionFunc("id", r.completeNetworkIDs)
3937

40-
cmd.Flags().StringVarP(&r.outputFormat, "output", "o", "json", "The output format to use. One of: json|table")
4138
cmd.Flags().BoolVarP(&r.args.networkReportWatch, "watch", "w", false, "Watch for new network events")
4239

4340
return cmd
@@ -74,15 +71,18 @@ func (r *runners) getNetworkReport(_ *cobra.Command, args []string) error {
7471

7572
// Print initial events
7673
if len(report.Events) > 0 {
77-
if err := print.NetworkEvents(r.outputFormat, w, report.Events, true); err != nil {
74+
if err := print.NetworkEvents(w, report.Events); err != nil {
7875
return errors.Wrap(err, "print initial network events")
7976
}
8077
}
8178

8279
// Track the last seen event time
8380
var lastEventTime *time.Time
8481
if len(report.Events) > 0 {
85-
lastEventTime = &report.Events[len(report.Events)-1].CreatedAt
82+
// Extract timestamp from the last event
83+
if parsedTime, err := util.ParseTime(report.Events[len(report.Events)-1].Timestamp); err == nil {
84+
lastEventTime = &parsedTime
85+
}
8686
}
8787

8888
// Poll for new events
@@ -100,17 +100,19 @@ func (r *runners) getNetworkReport(_ *cobra.Command, args []string) error {
100100

101101
// Print new events
102102
if len(newReport.Events) > 0 {
103-
if err := print.NetworkEvents(r.outputFormat, w, newReport.Events, false); err != nil {
103+
if err := print.NetworkEvents(w, newReport.Events); err != nil {
104104
return errors.Wrap(err, "print new network events")
105105
}
106106
// Update last seen time
107-
lastEventTime = &newReport.Events[len(newReport.Events)-1].CreatedAt
107+
if parsedTime, err := util.ParseTime(newReport.Events[len(newReport.Events)-1].Timestamp); err == nil {
108+
lastEventTime = &parsedTime
109+
}
108110
}
109111
}
110112
return nil
111113
}
112114

113115
// Output the report (non-watch mode)
114116
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
115-
return print.NetworkReport(r.outputFormat, w, report)
117+
return print.NetworkReport(w, report)
116118
}

cli/print/network_reports.go

Lines changed: 15 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -4,116 +4,34 @@ import (
44
"encoding/json"
55
"fmt"
66
"text/tabwriter"
7-
"text/template"
8-
"time"
97

108
"github.com/replicatedhq/replicated/pkg/types"
119
)
1210

13-
// Table formatting for network reports
14-
var (
15-
networkReportTmplTableHeaderSrc = `CREATED AT SRC IP DST IP SRC PORT DST PORT PROTOCOL COMMAND PID DNS QUERY SERVICE`
16-
networkReportTmplTableRowSrc = `{{ range . -}}
17-
{{ padding (printf "%s" (.CreatedAt | localeTime)) 20 }} {{ if .EventData.SrcIP }}{{ padding .EventData.SrcIP 15 }}{{ else }}{{ padding "-" 15 }}{{ end }} {{ if .EventData.DstIP }}{{ padding .EventData.DstIP 15 }}{{ else }}{{ padding "-" 15 }}{{ end }} {{ if .EventData.SrcPort }}{{ padding (printf "%d" .EventData.SrcPort) 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.DstPort }}{{ padding (printf "%d" .EventData.DstPort) 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.Protocol }}{{ padding .EventData.Protocol 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.Command }}{{ padding .EventData.Command 15 }}{{ else }}{{ padding "-" 15 }}{{ end }} {{ if .EventData.PID }}{{ padding (printf "%d" .EventData.PID) 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.DNSQueryName }}{{ padding .EventData.DNSQueryName 20 }}{{ else }}{{ padding "-" 20 }}{{ end }} {{ if .EventData.LikelyService }}{{ padding .EventData.LikelyService 15 }}{{ else }}{{ padding "-" 15 }}{{ end }}
18-
{{ end }}`
19-
)
20-
21-
var (
22-
networkReportTmplTableSrc = fmt.Sprintln(networkReportTmplTableHeaderSrc) + networkReportTmplTableRowSrc
23-
networkReportTmplTable = template.Must(template.New("networkReport").Funcs(funcs).Parse(networkReportTmplTableSrc))
24-
networkReportTmplTableNoHeader = template.Must(template.New("networkReport").Funcs(funcs).Parse(networkReportTmplTableRowSrc))
25-
)
2611

27-
// NetworkEventsWithData represents network events with parsed event data
28-
type NetworkEventsWithData struct {
29-
CreatedAt time.Time
30-
EventData *types.NetworkEventData
31-
}
32-
33-
// NetworkReport prints network report in various formats
34-
func NetworkReport(outputFormat string, w *tabwriter.Writer, report *types.NetworkReport) error {
35-
switch outputFormat {
36-
case "table":
37-
if len(report.Events) == 0 {
38-
_, err := fmt.Fprintln(w, "No network events found.")
39-
return err
40-
}
41-
eventsWithData, err := parseNetworkEventsData(report.Events)
42-
if err != nil {
43-
return fmt.Errorf("failed to parse network events: %v", err)
44-
}
45-
if err := networkReportTmplTable.Execute(w, eventsWithData); err != nil {
46-
return err
47-
}
48-
case "json":
49-
reportBytes, err := json.MarshalIndent(report, "", " ")
50-
if err != nil {
51-
return fmt.Errorf("failed to marshal report to json: %v", err)
52-
}
53-
if _, err := fmt.Fprintln(w, string(reportBytes)); err != nil {
54-
return err
55-
}
56-
default:
57-
return fmt.Errorf("unsupported output format: %s", outputFormat)
12+
// NetworkReport prints network report in JSON format
13+
func NetworkReport(w *tabwriter.Writer, report *types.NetworkReport) error {
14+
reportBytes, err := json.MarshalIndent(report, "", " ")
15+
if err != nil {
16+
return fmt.Errorf("failed to marshal report to json: %v", err)
17+
}
18+
if _, err := fmt.Fprintln(w, string(reportBytes)); err != nil {
19+
return err
5820
}
5921
return w.Flush()
6022
}
6123

62-
// NetworkEvents prints network events in table format (for watch mode)
63-
func NetworkEvents(outputFormat string, w *tabwriter.Writer, events []*types.NetworkEvent, includeHeader bool) error {
64-
switch outputFormat {
65-
case "table":
66-
if len(events) == 0 {
67-
return nil
68-
}
69-
eventsWithData, err := parseNetworkEventsData(events)
24+
// NetworkEvents prints network events in JSON format (for watch mode)
25+
func NetworkEvents(w *tabwriter.Writer, events []*types.NetworkEventData) error {
26+
for _, event := range events {
27+
eventBytes, err := json.Marshal(event)
7028
if err != nil {
71-
return fmt.Errorf("failed to parse network events: %v", err)
72-
}
73-
if includeHeader {
74-
if err := networkReportTmplTable.Execute(w, eventsWithData); err != nil {
75-
return err
76-
}
77-
} else {
78-
if err := networkReportTmplTableNoHeader.Execute(w, eventsWithData); err != nil {
79-
return err
80-
}
29+
continue // Skip events that can't be marshaled
8130
}
82-
case "json":
83-
for _, event := range events {
84-
eventBytes, err := json.Marshal(event)
85-
if err != nil {
86-
continue // Skip events that can't be marshaled
87-
}
88-
if _, err := fmt.Fprintln(w, string(eventBytes)); err != nil {
89-
return err
90-
}
31+
if _, err := fmt.Fprintln(w, string(eventBytes)); err != nil {
32+
return err
9133
}
92-
default:
93-
return fmt.Errorf("unsupported output format: %s", outputFormat)
9434
}
9535
return w.Flush()
9636
}
9737

98-
// parseNetworkEventsData parses the JSON event data for template consumption
99-
func parseNetworkEventsData(events []*types.NetworkEvent) ([]*NetworkEventsWithData, error) {
100-
var eventsWithData []*NetworkEventsWithData
101-
102-
for _, event := range events {
103-
var eventData types.NetworkEventData
104-
if err := json.Unmarshal([]byte(event.EventData), &eventData); err != nil {
105-
// For events that can't be parsed, create a minimal entry
106-
eventsWithData = append(eventsWithData, &NetworkEventsWithData{
107-
CreatedAt: event.CreatedAt,
108-
EventData: &types.NetworkEventData{},
109-
})
110-
} else {
111-
eventsWithData = append(eventsWithData, &NetworkEventsWithData{
112-
CreatedAt: event.CreatedAt,
113-
EventData: &eventData,
114-
})
115-
}
116-
}
117-
118-
return eventsWithData, nil
119-
}

pkg/kotsclient/network_report.go

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package kotsclient
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"net/http"
78
"net/url"
@@ -15,19 +16,43 @@ func (c *VendorV3Client) GetNetworkReport(id string) (*types.NetworkReport, erro
1516
}
1617

1718
func (c *VendorV3Client) GetNetworkReportAfter(id string, after *time.Time) (*types.NetworkReport, error) {
18-
report := &types.NetworkReport{}
19-
2019
urlPath := fmt.Sprintf("/v3/network/%s/report", id)
2120
if after != nil {
2221
v := url.Values{}
2322
v.Set("after", after.Format(time.RFC3339Nano))
2423
urlPath = fmt.Sprintf("%s?%s", urlPath, v.Encode())
2524
}
2625

27-
err := c.DoJSON(context.TODO(), "GET", urlPath, http.StatusOK, nil, report)
26+
// Get raw response as map
27+
var rawResponse map[string]interface{}
28+
err := c.DoJSON(context.TODO(), "GET", urlPath, http.StatusOK, nil, &rawResponse)
2829
if err != nil {
2930
return nil, err
3031
}
3132

32-
return report, nil
33+
// Extract events array
34+
eventsRaw, ok := rawResponse["events"].([]interface{})
35+
if !ok {
36+
return &types.NetworkReport{Events: []*types.NetworkEventData{}}, nil
37+
}
38+
39+
// Parse each event using json.Unmarshal
40+
var events []*types.NetworkEventData
41+
for _, eventRaw := range eventsRaw {
42+
// Convert to JSON bytes
43+
eventBytes, err := json.Marshal(eventRaw)
44+
if err != nil {
45+
continue // Skip malformed events
46+
}
47+
48+
// Unmarshal into NetworkEventData
49+
var eventData types.NetworkEventData
50+
if err := json.Unmarshal(eventBytes, &eventData); err != nil {
51+
continue // Skip malformed events
52+
}
53+
54+
events = append(events, &eventData)
55+
}
56+
57+
return &types.NetworkReport{Events: events}, nil
3358
}

pkg/types/network.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,7 @@ const (
3737
)
3838

3939
type NetworkReport struct {
40-
Events []*NetworkEvent `json:"events"`
41-
}
42-
43-
type NetworkEvent struct {
44-
CreatedAt time.Time `json:"created_at"`
45-
EventData string `json:"event_data"`
40+
Events []*NetworkEventData `json:"events"`
4641
}
4742

4843
type NetworkEventData struct {

0 commit comments

Comments
 (0)