15
15
package list
16
16
17
17
import (
18
+ "encoding/json"
19
+ "fmt"
20
+ "strings"
21
+ "time"
22
+
18
23
"sigs.k8s.io/cli-utils/pkg/apply/event"
19
24
"sigs.k8s.io/cli-utils/pkg/kstatus/polling/collector"
20
25
pollevent "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
21
26
"sigs.k8s.io/cli-utils/pkg/object"
22
27
"sigs.k8s.io/cli-utils/pkg/print/list"
28
+ "sigs.k8s.io/cli-utils/pkg/printers"
23
29
)
24
30
25
31
// BaseListPrinter implements the Printer interface and outputs the resource
26
32
// status information as a list of events as they happen.
27
33
type BaseListPrinter struct {
28
34
Formatter list.Formatter
35
+ Format string
29
36
Data * PrintData
30
37
}
31
38
32
39
// PrintData records data required for printing
33
40
type PrintData struct {
34
- // IndexResourceMap map[int]object.ObjMetadata
35
- // IndexGroupMap map[int]string
36
- // MaxElement int
37
41
Identifiers object.ObjMetadataSet
38
42
InvNameMap map [object.ObjMetadata ]string
39
43
StatusSet map [string ]bool
@@ -53,7 +57,7 @@ func (ep *BaseListPrinter) PrintError(e error) error {
53
57
// every event and is responsible for stopping the poller when appropriate.
54
58
// This function will block.
55
59
func (ep * BaseListPrinter ) Print (ch <- chan pollevent.Event , identifiers []object.ObjMetadata ,
56
- cancelFunc collector.ObserverFunc ) error {
60
+ cancelFunc collector.ObserverFunc ) error {
57
61
coll := collector .NewResourceStatusCollector (identifiers )
58
62
// The actual work is done by the collector, which will invoke the
59
63
// callback on every event. In the callback we print the status
@@ -80,15 +84,50 @@ func (ep *BaseListPrinter) printStatusEvent(se pollevent.Event) error {
80
84
switch se .Type {
81
85
case pollevent .ResourceUpdateEvent :
82
86
id := se .Resource .Identifier
83
- return ep .Formatter .FormatStatusEvent (event.StatusEvent {
84
- Identifier : id ,
85
- Resource : se .Resource .Resource ,
86
- PollResourceInfo : se .Resource ,
87
- })
87
+ var invName string
88
+ var ok bool
89
+ if invName , ok = ep .Data .InvNameMap [id ]; ! ok {
90
+ return fmt .Errorf ("Resource not found\n " )
91
+ }
92
+ // filter out status that are not assigned
93
+ statusString := se .Resource .Status .String ()
94
+ if _ , ok := ep .Data .StatusSet [strings .ToLower (statusString )]; len (ep .Data .StatusSet ) != 0 && ! ok {
95
+ return nil
96
+ }
97
+ switch ep .Format {
98
+ case printers .EventsPrinter :
99
+ _ , err := fmt .Printf ("%s/%s/%s/%s is %s: %s\n " , invName ,
100
+ strings .ToLower (id .GroupKind .String ()), id .Namespace , id .Name , statusString , se .Resource .Message )
101
+ return err
102
+ case printers .JSONPrinter :
103
+ eventInfo := ep .createJsonObj (id )
104
+ eventInfo ["inventory-name" ] = invName
105
+ eventInfo ["status" ] = statusString
106
+ eventInfo ["message" ] = se .Resource .Message
107
+ b , err := json .Marshal (eventInfo )
108
+ if err != nil {
109
+ return err
110
+ }
111
+ _ , err = fmt .Println (string (b ))
112
+ return err
113
+ default :
114
+ return fmt .Errorf ("No such printer type\n " )
115
+ }
88
116
case pollevent .ErrorEvent :
89
117
return ep .Formatter .FormatErrorEvent (event.ErrorEvent {
90
118
Err : se .Error ,
91
119
})
92
120
}
93
121
return nil
94
122
}
123
+
124
+ func (ep * BaseListPrinter ) createJsonObj (id object.ObjMetadata ) map [string ]interface {} {
125
+ return map [string ]interface {}{
126
+ "group" : id .GroupKind .Group ,
127
+ "kind" : id .GroupKind .Kind ,
128
+ "namespace" : id .Namespace ,
129
+ "name" : id .Name ,
130
+ "timestamp" : time .Now ().UTC ().Format (time .RFC3339 ),
131
+ "type" : "status" ,
132
+ }
133
+ }
0 commit comments