diff --git a/pkg/api/handlers/compat/images.go b/pkg/api/handlers/compat/images.go index fd416c176d..b800714482 100644 --- a/pkg/api/handlers/compat/images.go +++ b/pkg/api/handlers/compat/images.go @@ -390,24 +390,23 @@ func imageDataToImageInspect(ctx context.Context, l *libimage.Image, r *http.Req cc.Volumes = info.Config.Volumes dockerImageInspect := dockerImage.InspectResponse{ - Architecture: info.Architecture, - Author: info.Author, - Comment: info.Comment, - Config: &config, - ContainerConfig: cc, - Created: l.Created().Format(time.RFC3339Nano), - DockerVersion: info.Version, - GraphDriver: graphDriver, - ID: "sha256:" + l.ID(), - Metadata: dockerImage.Metadata{}, - Os: info.Os, - OsVersion: info.Version, - Parent: info.Parent, - RepoDigests: info.RepoDigests, - RepoTags: info.RepoTags, - RootFS: rootfs, - Size: info.Size, - Variant: "", + Architecture: info.Architecture, + Author: info.Author, + Comment: info.Comment, + Config: &config, + Created: l.Created().Format(time.RFC3339Nano), + DockerVersion: info.Version, + GraphDriver: graphDriver, + ID: "sha256:" + l.ID(), + Metadata: dockerImage.Metadata{}, + Os: info.Os, + OsVersion: info.Version, + Parent: info.Parent, + RepoDigests: info.RepoDigests, + RepoTags: info.RepoTags, + RootFS: rootfs, + Size: info.Size, + Variant: "", } if _, err := apiutil.SupportedVersion(r, "<1.44.0"); err == nil { @@ -415,6 +414,10 @@ func imageDataToImageInspect(ctx context.Context, l *libimage.Image, r *http.Req dockerImageInspect.VirtualSize = info.VirtualSize } + if _, err := apiutil.SupportedVersion(r, "<1.45.0"); err == nil { + dockerImageInspect.ContainerConfig = cc //nolint:staticcheck // Deprecated field + } + return &handlers.ImageInspect{InspectResponse: dockerImageInspect}, nil } diff --git a/pkg/api/handlers/types.go b/pkg/api/handlers/types.go index 2d85470854..6a79103b4a 100644 --- a/pkg/api/handlers/types.go +++ b/pkg/api/handlers/types.go @@ -20,8 +20,13 @@ type AuthConfig struct { type ImageInspect struct { dockerImage.InspectResponse - // Container is for backwards compat but is basically unused - Container string + // When you embed a struct, the fields of the embedded struct are "promoted" to the outer struct. + // If a field in the outer struct has the same name as a field in the embedded struct, + // the outer struct's field will shadow or override the embedded one allowing for a clean way to + // hide fields from the swagger spec that still exist in the libraries struct. + Container string `json:"-"` + ContainerConfig string `json:"-"` + VirtualSize string `json:"-"` } type ContainerConfig struct { diff --git a/test/apiv2/10-images.at b/test/apiv2/10-images.at index 8105f108b2..65d89b1bb7 100644 --- a/test/apiv2/10-images.at +++ b/test/apiv2/10-images.at @@ -66,6 +66,14 @@ t GET /v1.43/images/$iid/json 200 \ t GET /v1.44/images/$iid/json 200 \ .VirtualSize=null +# Test ContainerConfig fields are present in API v1.44 (backward compatibility) +t GET /v1.44/images/$iid/json 200 \ + .ContainerConfig.Hostname~[0-9a-f] + +# Test ContainerConfig fields are no longer present in API >= v1.45 (deprecated since API v1.44, omitted since API v1.45) +t GET /v1.45/images/$iid/json 200 \ + .ContainerConfig=null + t POST "images/create?fromImage=alpine" 200 .error~null .status~".*Download complete.*" t POST "libpod/images/pull?reference=alpine&compatMode=true" 200 .error~null .status~".*Download complete.*" diff --git a/test/apiv2/python/rest_api/test_v2_0_0_image.py b/test/apiv2/python/rest_api/test_v2_0_0_image.py index 7882be2059..e62b210ebc 100644 --- a/test/apiv2/python/rest_api/test_v2_0_0_image.py +++ b/test/apiv2/python/rest_api/test_v2_0_0_image.py @@ -23,7 +23,6 @@ def test_list(self): "SharedSize", "VirtualSize", "Labels", - "Containers", ) images = r.json() self.assertIsInstance(images, list) @@ -45,7 +44,6 @@ def test_inspect(self): "Parent", "Comment", "Created", - "Container", "DockerVersion", "Author", "Architecture",