Merge pull request #29055 from ROKUMATE/fix-remote-events-parse-error
Some checks are pending
ci / path-filter (push) Waiting to run
ci / Validate source code changes (push) Waiting to run
ci / Cross Build (Linux, FreeBSD) (push) Waiting to run
ci / build debian-sid (push) Waiting to run
ci / build fedora-current (push) Waiting to run
ci / build fedora-prior (push) Waiting to run
ci / build fedora-rawhide (push) Waiting to run
ci / windows installer hyperv (push) Waiting to run
ci / windows installer wsl (push) Waiting to run
ci / macos installer (push) Waiting to run
ci / int local root debian-sid (push) Blocked by required conditions
ci / sys local root debian-sid (push) Blocked by required conditions
ci / int local rootless debian-sid (push) Blocked by required conditions
ci / sys local rootless debian-sid (push) Blocked by required conditions
ci / int remote root debian-sid (push) Blocked by required conditions
ci / sys remote root debian-sid (push) Blocked by required conditions
ci / bud local root fedora-current (push) Blocked by required conditions
ci / int local root fedora-current (push) Blocked by required conditions
ci / sys local root fedora-current (push) Blocked by required conditions
ci / int local rootless fedora-current (push) Blocked by required conditions
ci / sys local rootless fedora-current (push) Blocked by required conditions
ci / bud remote root fedora-current (push) Blocked by required conditions
ci / int remote root fedora-current (push) Blocked by required conditions
ci / sys remote root fedora-current (push) Blocked by required conditions
ci / int remote rootless fedora-current (push) Blocked by required conditions
ci / sys remote rootless fedora-current (push) Blocked by required conditions
ci / int local root fedora-prior (push) Blocked by required conditions
ci / sys local root fedora-prior (push) Blocked by required conditions
ci / int local rootless fedora-prior (push) Blocked by required conditions
ci / sys local rootless fedora-prior (push) Blocked by required conditions
ci / int remote root fedora-prior (push) Blocked by required conditions
ci / sys remote root fedora-prior (push) Blocked by required conditions
ci / int local root fedora-rawhide (push) Blocked by required conditions
ci / sys local root fedora-rawhide (push) Blocked by required conditions
ci / int local rootless fedora-rawhide (push) Blocked by required conditions
ci / sys local rootless fedora-rawhide (push) Blocked by required conditions
ci / int remote root fedora-rawhide (push) Blocked by required conditions
ci / sys remote root fedora-rawhide (push) Blocked by required conditions
ci / apiv2 root fedora-current (push) Blocked by required conditions
ci / bindings root fedora-current (push) Blocked by required conditions
ci / compose_v2 root fedora-current (push) Blocked by required conditions
ci / docker_py root fedora-current (push) Blocked by required conditions
ci / unit root fedora-current (push) Blocked by required conditions
ci / apiv2 rootless fedora-current (push) Blocked by required conditions
ci / compose_v2 rootless fedora-current (push) Blocked by required conditions
ci / unit rootless fedora-current (push) Blocked by required conditions
ci / upgrade v5.3.1 root fedora-current (push) Blocked by required conditions
ci / upgrade v5.6.2 root fedora-current (push) Blocked by required conditions
ci / machine linux amd64 (push) Blocked by required conditions
ci / windows unit (push) Blocked by required conditions
ci / windows e2e (push) Blocked by required conditions
ci / windows machine hyperv (push) Blocked by required conditions
ci / windows machine wsl (push) Blocked by required conditions
ci / macos machine applehv (push) Blocked by required conditions
ci / macos machine libkrun (push) Blocked by required conditions
ci / Total Success (push) Blocked by required conditions
zizmor: GitHub Actions Security Analysis / Zizmor (push) Waiting to run

pkg/domain: return an error instead of nil on remote event parse failure
This commit is contained in:
Danish Prakash 2026-06-30 20:53:19 +05:30 committed by GitHub
commit 2be3a749a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 86 additions and 6 deletions

View file

@ -1,6 +1,7 @@
package entities
import (
"fmt"
"strconv"
"time"
@ -12,22 +13,22 @@ import (
type Event = types.Event
// ConvertToLibpodEvent converts an entities event to a libpod one.
func ConvertToLibpodEvent(e Event) *libpodEvents.Event {
func ConvertToLibpodEvent(e Event) (*libpodEvents.Event, error) {
var exitCode int
if ec, ok := e.Actor.Attributes["containerExitCode"]; ok {
var err error
exitCode, err = strconv.Atoi(ec)
if err != nil {
return nil
return nil, fmt.Errorf("parsing containerExitCode %q: %w", ec, err)
}
}
status, err := libpodEvents.StringToStatus(string(e.Action))
if err != nil {
return nil
return nil, err
}
t, err := libpodEvents.StringToType(string(e.Type))
if err != nil {
return nil
return nil, err
}
var (
oomKilled bool
@ -71,7 +72,7 @@ func ConvertToLibpodEvent(e Event) *libpodEvents.Event {
if hasOOM {
newEvent.OOMKilled = &oomKilled
}
return newEvent
return newEvent, nil
}
// ConvertToEntitiesEvent converts a libpod event to an entities one.

View file

@ -0,0 +1,74 @@
package entities
import (
"testing"
"time"
dockerEvents "github.com/moby/moby/api/types/events"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
libpodEvents "go.podman.io/podman/v6/libpod/events"
)
func newTestEvent(typ, action string, attrs map[string]string) Event {
if attrs == nil {
attrs = map[string]string{}
}
return Event{
Message: dockerEvents.Message{
Type: dockerEvents.Type(typ),
Action: dockerEvents.Action(action),
Actor: dockerEvents.Actor{ID: "abc123", Attributes: attrs},
TimeNano: 1700000000000000000,
},
}
}
func TestConvertToLibpodEvent(t *testing.T) {
e := newTestEvent("container", "start", map[string]string{
"image": "alpine",
"name": "c1",
"network": "podman1",
"podId": "pod123",
"containerExitCode": "137",
"custom": "value",
})
event, err := ConvertToLibpodEvent(e)
require.NoError(t, err)
require.NotNil(t, event)
assert.Equal(t, libpodEvents.Container, event.Type)
assert.Equal(t, libpodEvents.Start, event.Status)
assert.Equal(t, "abc123", event.ID)
assert.Equal(t, "alpine", event.Image)
assert.Equal(t, "c1", event.Name)
assert.Equal(t, "podman1", event.Network)
assert.Equal(t, time.Unix(0, 1700000000000000000), event.Time)
require.NotNil(t, event.ContainerExitCode)
assert.Equal(t, 137, *event.ContainerExitCode)
assert.Equal(t, "pod123", event.Details.PodID)
assert.Equal(t, "value", event.Details.Attributes["custom"])
}
// Previously a server result that failed to parse was silently turned into a
// nil event, which surfaced to the user as the literal JSON "null". It must now
// return an error instead. See https://github.com/containers/podman/issues/28325
func TestConvertToLibpodEventReturnsError(t *testing.T) {
tests := []struct {
name string
typ string
action string
attrs map[string]string
}{
{name: "unknown status", typ: "container", action: "bogus-status"},
{name: "empty action", typ: "container", action: ""},
{name: "empty type", typ: "", action: "start"},
{name: "invalid containerExitCode", typ: "container", action: "start", attrs: map[string]string{"containerExitCode": "not-a-number"}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
event, err := ConvertToLibpodEvent(newTestEvent(tt.typ, tt.action, tt.attrs))
assert.Error(t, err)
assert.Nil(t, event)
})
}
}

View file

@ -24,7 +24,12 @@ func (ic *ContainerEngine) Events(_ context.Context, opts entities.EventsOptions
binChan := make(chan entities.Event)
go func() {
for e := range binChan {
opts.EventChan <- events.ReadResult{Event: entities.ConvertToLibpodEvent(e)}
event, err := entities.ConvertToLibpodEvent(e)
if err != nil {
opts.EventChan <- events.ReadResult{Error: fmt.Errorf("converting event from server: %w", err)}
continue
}
opts.EventChan <- events.ReadResult{Event: event}
}
close(opts.EventChan)
}()