mirror of
https://github.com/podman-container-tools/podman.git
synced 2026-08-05 00:15:44 +00:00
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
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:
commit
2be3a749a8
3 changed files with 86 additions and 6 deletions
|
|
@ -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.
|
||||
|
|
|
|||
74
pkg/domain/entities/events_test.go
Normal file
74
pkg/domain/entities/events_test.go
Normal 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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue