From eaaca499922c4a322bf61b7d9f288a447b1079ba Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <rothberg@redhat.com>
Date: Mon, 19 Jul 2021 10:23:21 +0200
Subject: compat: image create: handle platform correctly

Handle the platform parameter correctly.  The parameter was only parsed
in presence of credentials and the code was a bit complex.  Also add a
regression test.

Fixes: #10977
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
---
 pkg/api/handlers/compat/images.go | 35 ++++++++++-------------------------
 test/apiv2/10-images.at           |  5 +++++
 2 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/pkg/api/handlers/compat/images.go b/pkg/api/handlers/compat/images.go
index 7baa1145a..6f8fb21f0 100644
--- a/pkg/api/handlers/compat/images.go
+++ b/pkg/api/handlers/compat/images.go
@@ -266,41 +266,26 @@ func CreateImageFromImage(w http.ResponseWriter, r *http.Request) {
 	}
 	defer auth.RemoveAuthfile(authfile)
 
-	platformSpecs := strings.Split(query.Platform, "/") // split query into its parts
-
-	addOS := true // default assume true due to structure of if/else below
-	addArch := false
-	addVariant := false
-
-	if len(platformSpecs) > 1 { // if we have two arguments then we have os and arch
-		addArch = true
-		if len(platformSpecs) > 2 { // if we have 3 arguments then we have os arch and variant
-			addVariant = true
-		}
-	} else if len(platformSpecs) == 0 {
-		addOS = false
-	}
-
 	pullOptions := &libimage.PullOptions{}
 	pullOptions.AuthFilePath = authfile
 	if authConf != nil {
 		pullOptions.Username = authConf.Username
 		pullOptions.Password = authConf.Password
 		pullOptions.IdentityToken = authConf.IdentityToken
-		if addOS { // if the len is not 0
-			pullOptions.OS = platformSpecs[0]
-			if addArch {
-				pullOptions.Architecture = platformSpecs[1]
-			}
-			if addVariant {
-				pullOptions.Variant = platformSpecs[2]
-			}
-		}
 	}
 	pullOptions.Writer = os.Stderr // allows for debugging on the server
 
-	progress := make(chan types.ProgressProperties)
+	// Handle the platform.
+	platformSpecs := strings.Split(query.Platform, "/")
+	pullOptions.OS = platformSpecs[0] // may be empty
+	if len(platformSpecs) > 1 {
+		pullOptions.Architecture = platformSpecs[1]
+		if len(platformSpecs) > 2 {
+			pullOptions.Variant = platformSpecs[2]
+		}
+	}
 
+	progress := make(chan types.ProgressProperties)
 	pullOptions.Progress = progress
 
 	pullResChan := make(chan pullResult)
diff --git a/test/apiv2/10-images.at b/test/apiv2/10-images.at
index 9e464dbc7..195b11ff0 100644
--- a/test/apiv2/10-images.at
+++ b/test/apiv2/10-images.at
@@ -45,6 +45,11 @@ t POST "images/create?fromImage=alpine" 200 .error~null .status~".*Download comp
 
 t POST "images/create?fromImage=alpine&tag=latest" 200
 
+# 10977 - handle platform parameter correctly
+t POST "images/create?fromImage=alpine&platform=linux/arm64" 200
+t GET  "images/alpine/json" 200 \
+  .Architecture=arm64
+
 # Make sure that new images are pulled
 old_iid=$(podman image inspect --format "{{.ID}}" docker.io/library/alpine:latest)
 podman rmi -f docker.io/library/alpine:latest
-- 
cgit v1.2.3-54-g00ecf