github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/pkg/varlinkapi/events.go (about)

     1  // +build varlink
     2  
     3  package varlinkapi
     4  
     5  import (
     6  	"time"
     7  
     8  	"github.com/containers/libpod/libpod/events"
     9  	iopodman "github.com/containers/libpod/pkg/varlink"
    10  )
    11  
    12  // GetEvents is a remote endpoint to get events from the event log
    13  func (i *VarlinkAPI) GetEvents(call iopodman.VarlinkCall, filter []string, since string, until string) error {
    14  	var (
    15  		fromStart   bool
    16  		eventsError error
    17  		event       *events.Event
    18  		stream      bool
    19  	)
    20  	if call.WantsMore() {
    21  		stream = true
    22  		call.Continues = true
    23  	}
    24  	if len(since) > 0 || len(until) > 0 {
    25  		fromStart = true
    26  	}
    27  	eventChannel := make(chan *events.Event)
    28  	go func() {
    29  		readOpts := events.ReadOptions{FromStart: fromStart, Stream: stream, Filters: filter, EventChannel: eventChannel}
    30  		eventsError = i.Runtime.Events(readOpts)
    31  	}()
    32  	if eventsError != nil {
    33  		return call.ReplyErrorOccurred(eventsError.Error())
    34  	}
    35  	for {
    36  		event = <-eventChannel
    37  		if event == nil {
    38  			call.Continues = false
    39  			break
    40  		}
    41  		call.ReplyGetEvents(iopodman.Event{
    42  			Id:     event.ID,
    43  			Image:  event.Image,
    44  			Name:   event.Name,
    45  			Status: string(event.Status),
    46  			Time:   event.Time.Format(time.RFC3339Nano),
    47  			Type:   string(event.Type),
    48  		})
    49  		if !call.Continues {
    50  			// For a one-shot on events, we break out here
    51  			break
    52  		}
    53  	}
    54  	return nil
    55  }