1515package list
1616
1717import (
18+ "encoding/json"
19+ "fmt"
20+ "strings"
21+ "time"
22+
1823 "sigs.k8s.io/cli-utils/pkg/apply/event"
1924 "sigs.k8s.io/cli-utils/pkg/kstatus/polling/collector"
2025 pollevent "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
2126 "sigs.k8s.io/cli-utils/pkg/object"
2227 "sigs.k8s.io/cli-utils/pkg/print/list"
28+ "sigs.k8s.io/cli-utils/pkg/printers"
2329)
2430
2531// BaseListPrinter implements the Printer interface and outputs the resource
2632// status information as a list of events as they happen.
2733type BaseListPrinter struct {
2834 Formatter list.Formatter
35+ Format string
2936 Data * PrintData
3037}
3138
3239// PrintData records data required for printing
3340type PrintData struct {
34- // IndexResourceMap map[int]object.ObjMetadata
35- // IndexGroupMap map[int]string
36- // MaxElement int
3741 Identifiers object.ObjMetadataSet
3842 InvNameMap map [object.ObjMetadata ]string
3943 StatusSet map [string ]bool
@@ -53,7 +57,7 @@ func (ep *BaseListPrinter) PrintError(e error) error {
5357// every event and is responsible for stopping the poller when appropriate.
5458// This function will block.
5559func (ep * BaseListPrinter ) Print (ch <- chan pollevent.Event , identifiers []object.ObjMetadata ,
56- cancelFunc collector.ObserverFunc ) error {
60+ cancelFunc collector.ObserverFunc ) error {
5761 coll := collector .NewResourceStatusCollector (identifiers )
5862 // The actual work is done by the collector, which will invoke the
5963 // callback on every event. In the callback we print the status
@@ -80,15 +84,50 @@ func (ep *BaseListPrinter) printStatusEvent(se pollevent.Event) error {
8084 switch se .Type {
8185 case pollevent .ResourceUpdateEvent :
8286 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+ }
88116 case pollevent .ErrorEvent :
89117 return ep .Formatter .FormatErrorEvent (event.ErrorEvent {
90118 Err : se .Error ,
91119 })
92120 }
93121 return nil
94122}
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