Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remote API: restore v4 payload in container inspect #22700

Merged
merged 1 commit into from
May 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions libpod/define/container_inspect.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ type InspectContainerConfig struct {
SdNotifyMode string `json:"sdNotifyMode,omitempty"`
// SdNotifySocket is the NOTIFY_SOCKET in use by/configured for the container.
SdNotifySocket string `json:"sdNotifySocket,omitempty"`

// V4PodmanCompatMarshal indicates that the json marshaller should
// use the old v4 inspect format to keep API compatibility.
V4PodmanCompatMarshal bool `json:"-"`
}

// UnmarshalJSON allow compatibility with podman V4 API
Expand Down Expand Up @@ -136,6 +140,28 @@ func (insp *InspectContainerConfig) UnmarshalJSON(data []byte) error {
return nil
}

func (insp *InspectContainerConfig) MarshalJSON() ([]byte, error) {
// the alias is needed otherwise MarshalJSON will
type Alias InspectContainerConfig
conf := (*Alias)(insp)
if !insp.V4PodmanCompatMarshal {
return json.Marshal(conf)
}

type v4InspectContainerConfig struct {
Entrypoint string `json:"Entrypoint"`
StopSignal uint `json:"StopSignal"`
*Alias
}
stopSignal, _ := signal.ParseSignal(insp.StopSignal)
newConf := &v4InspectContainerConfig{
Entrypoint: strings.Join(insp.Entrypoint, " "),
StopSignal: uint(stopSignal),
Alias: conf,
}
return json.Marshal(newConf)
}

// InspectRestartPolicy holds information about the container's restart policy.
type InspectRestartPolicy struct {
// Name contains the container's restart policy.
Expand Down
5 changes: 5 additions & 0 deletions pkg/api/handlers/libpod/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,11 @@ func GetContainer(w http.ResponseWriter, r *http.Request) {
utils.InternalServerError(w, err)
return
}
// if client request old v4 payload we should return v4 compatible json
if _, err := utils.SupportedVersion(r, ">=5.0.0"); err != nil {
data.Config.V4PodmanCompatMarshal = true
}

utils.WriteResponse(w, http.StatusOK, data)
}

Expand Down
12 changes: 10 additions & 2 deletions test/apiv2/25-containersMore.at
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ podman pull $IMAGE &>/dev/null
# Ensure clean slate
podman rm -a -f &>/dev/null

podman run -d --name foo $IMAGE top
podman run -d --name foo --entrypoint='["sh","-c"]' $IMAGE top

# Check exists for none such
t GET libpod/containers/nonesuch/exists 404
Expand Down Expand Up @@ -44,7 +44,15 @@ t GET libpod/containers/foo/json 200 \
.State.Status=running \
.ImageName=$IMAGE \
.Config.Cmd[0]=top \
.Name=foo
.Name=foo \
.Config.StopSignal="SIGTERM" \
.Config.Entrypoint[0]="sh" \
.Config.Entrypoint[1]="-c"

# now check v4 request return old compatible output
t GET /v4.0.0/libpod/containers/foo/json 200 \
.Config.StopSignal=15 \
.Config.Entrypoint="sh -c"

# List processes of the container
t GET libpod/containers/foo/top 200 \
Expand Down
2 changes: 1 addition & 1 deletion test/apiv2/test-apiv2
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ function t() {
url=http://$HOST:$PORT
case "$path" in
/*) url="$url$path" ;;
libpod/*) url="$url/v4.0.0/$path" ;;
libpod/*) url="$url/v5.0.0/$path" ;;
*) url="$url/v1.41/$path" ;;
esac
fi
Expand Down