Merge pull request #22691 from nalind/events-bad-filters

`podman events`: check for an error after we finish reading events
This commit is contained in:
openshift-merge-bot[bot]
2024-05-15 09:08:13 +00:00
committed by GitHub
4 changed files with 27 additions and 6 deletions

View File

@ -162,8 +162,7 @@ func eventsCmd(cmd *cobra.Command, _ []string) error {
} }
go func() { go func() {
err := registry.ContainerEngine().Events(context.Background(), eventOptions) errChannel <- registry.ContainerEngine().Events(context.Background(), eventOptions)
errChannel <- err
}() }()
for { for {
@ -171,6 +170,13 @@ func eventsCmd(cmd *cobra.Command, _ []string) error {
case event, ok := <-eventChannel: case event, ok := <-eventChannel:
if !ok { if !ok {
// channel was closed we can exit // channel was closed we can exit
select {
case err := <-errChannel:
if err != nil {
return err
}
default:
}
return nil return nil
} }
switch { switch {

View File

@ -43,7 +43,7 @@ func GetEvents(w http.ResponseWriter, r *http.Request) {
libpodFilters, err := util.FiltersFromRequest(r) libpodFilters, err := util.FiltersFromRequest(r)
if err != nil { if err != nil {
utils.Error(w, http.StatusBadRequest, fmt.Errorf("failed to parse parameters for %s: %w", r.URL.String(), err)) utils.Error(w, http.StatusBadRequest, fmt.Errorf("failed to parse filters for %s: %w", r.URL.String(), err))
return return
} }
eventChannel := make(chan *events.Event) eventChannel := make(chan *events.Event)
@ -68,8 +68,13 @@ func GetEvents(w http.ResponseWriter, r *http.Request) {
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK) wroteContent := false
flush() defer func() {
if !wroteContent {
w.WriteHeader(http.StatusOK)
flush()
}
}()
coder := json.NewEncoder(w) coder := json.NewEncoder(w)
coder.SetEscapeHTML(true) coder.SetEscapeHTML(true)
@ -78,8 +83,8 @@ func GetEvents(w http.ResponseWriter, r *http.Request) {
select { select {
case err := <-errorChannel: case err := <-errorChannel:
if err != nil { if err != nil {
// FIXME StatusOK already sent above cannot send 500 here
utils.InternalServerError(w, err) utils.InternalServerError(w, err)
wroteContent = true
} }
return return
case evt := <-eventChannel: case evt := <-eventChannel:
@ -103,6 +108,7 @@ func GetEvents(w http.ResponseWriter, r *http.Request) {
if err := coder.Encode(e); err != nil { if err := coder.Encode(e); err != nil {
logrus.Errorf("Unable to write json: %q", err) logrus.Errorf("Unable to write json: %q", err)
} }
wroteContent = true
flush() flush()
case <-r.Context().Done(): case <-r.Context().Done():
return return

View File

@ -42,6 +42,10 @@ func Events(ctx context.Context, eventChan chan types.Event, cancelChan chan boo
}() }()
} }
if response.StatusCode != http.StatusOK {
return response.Process(nil)
}
dec := json.NewDecoder(response.Body) dec := json.NewDecoder(response.Body)
for err = (error)(nil); err == nil; { for err = (error)(nil); err == nil; {
var e = types.Event{} var e = types.Event{}

View File

@ -406,3 +406,8 @@ EOF
run_podman events --since=1m --stream=false --filter volume=${vname:0:5} run_podman events --since=1m --stream=false --filter volume=${vname:0:5}
assert "$output" = "$notrunc_results" assert "$output" = "$notrunc_results"
} }
@test "events - invalid filter" {
run_podman 125 events --since="the dawn of time...ish"
assert "$output" =~ "failed to parse event filters"
}