github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/pkg/varlinkapi/events.go (about)

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