From 98c1b236240a5220118c7a6540440938258d8e07 Mon Sep 17 00:00:00 2001
From: Jhon Honce <jhonce@redhat.com>
Date: Fri, 4 Dec 2020 16:13:58 -0700
Subject: Jira RUN-1106 System handlers updates

* Update tests to reflect system endpoints
* First implementation of compat /system/df, only fields that are
  populated by libpod are set

Signed-off-by: Jhon Honce <jhonce@redhat.com>
---
 pkg/api/handlers/compat/ping.go         |  1 +
 pkg/api/handlers/compat/system.go       | 82 +++++++++++++++++++++++++++++++--
 test/apiv2/rest_api/test_rest_v2_0_0.py | 62 +++++++++++++++++++++++--
 3 files changed, 138 insertions(+), 7 deletions(-)

diff --git a/pkg/api/handlers/compat/ping.go b/pkg/api/handlers/compat/ping.go
index 9f6611b30..5513e902e 100644
--- a/pkg/api/handlers/compat/ping.go
+++ b/pkg/api/handlers/compat/ping.go
@@ -15,6 +15,7 @@ import (
 func Ping(w http.ResponseWriter, r *http.Request) {
 	// Note API-Version and Libpod-API-Version are set in handler_api.go
 	w.Header().Set("BuildKit-Version", "")
+	w.Header().Set("Builder-Version", "")
 	w.Header().Set("Docker-Experimental", "true")
 	w.Header().Set("Cache-Control", "no-cache")
 	w.Header().Set("Pragma", "no-cache")
diff --git a/pkg/api/handlers/compat/system.go b/pkg/api/handlers/compat/system.go
index 322bfa7ed..e21ae160a 100644
--- a/pkg/api/handlers/compat/system.go
+++ b/pkg/api/handlers/compat/system.go
@@ -2,17 +2,91 @@ package compat
 
 import (
 	"net/http"
+	"strings"
 
+	"github.com/containers/podman/v2/libpod"
 	"github.com/containers/podman/v2/pkg/api/handlers"
 	"github.com/containers/podman/v2/pkg/api/handlers/utils"
+	"github.com/containers/podman/v2/pkg/domain/entities"
+	"github.com/containers/podman/v2/pkg/domain/infra/abi"
 	docker "github.com/docker/docker/api/types"
 )
 
 func GetDiskUsage(w http.ResponseWriter, r *http.Request) {
+	options := entities.SystemDfOptions{}
+	runtime := r.Context().Value("runtime").(*libpod.Runtime)
+	ic := abi.ContainerEngine{Libpod: runtime}
+	df, err := ic.SystemDf(r.Context(), options)
+	if err != nil {
+		utils.InternalServerError(w, err)
+	}
+
+	imgs := make([]*docker.ImageSummary, len(df.Images))
+	for i, o := range df.Images {
+		t := docker.ImageSummary{
+			Containers:  int64(o.Containers),
+			Created:     o.Created.Unix(),
+			ID:          o.ImageID,
+			Labels:      map[string]string{},
+			ParentID:    "",
+			RepoDigests: nil,
+			RepoTags:    []string{o.Tag},
+			SharedSize:  o.SharedSize,
+			Size:        o.Size,
+			VirtualSize: o.Size - o.UniqueSize,
+		}
+		imgs[i] = &t
+	}
+
+	ctnrs := make([]*docker.Container, len(df.Containers))
+	for i, o := range df.Containers {
+		t := docker.Container{
+			ID:         o.ContainerID,
+			Names:      []string{o.Names},
+			Image:      o.Image,
+			ImageID:    o.Image,
+			Command:    strings.Join(o.Command, " "),
+			Created:    o.Created.Unix(),
+			Ports:      nil,
+			SizeRw:     o.RWSize,
+			SizeRootFs: o.Size,
+			Labels:     map[string]string{},
+			State:      o.Status,
+			Status:     o.Status,
+			HostConfig: struct {
+				NetworkMode string `json:",omitempty"`
+			}{},
+			NetworkSettings: nil,
+			Mounts:          nil,
+		}
+		ctnrs[i] = &t
+	}
+
+	vols := make([]*docker.Volume, len(df.Volumes))
+	for i, o := range df.Volumes {
+		t := docker.Volume{
+			CreatedAt:  "",
+			Driver:     "",
+			Labels:     map[string]string{},
+			Mountpoint: "",
+			Name:       o.VolumeName,
+			Options:    nil,
+			Scope:      "local",
+			Status:     nil,
+			UsageData: &docker.VolumeUsageData{
+				RefCount: 1,
+				Size:     o.Size,
+			},
+		}
+		vols[i] = &t
+	}
+
 	utils.WriteResponse(w, http.StatusOK, handlers.DiskUsage{DiskUsage: docker.DiskUsage{
-		LayersSize: 0,
-		Images:     nil,
-		Containers: nil,
-		Volumes:    nil,
+		LayersSize:  0,
+		Images:      imgs,
+		Containers:  ctnrs,
+		Volumes:     vols,
+		BuildCache:  []*docker.BuildCache{},
+		BuilderSize: 0,
 	}})
 }
diff --git a/test/apiv2/rest_api/test_rest_v2_0_0.py b/test/apiv2/rest_api/test_rest_v2_0_0.py
index 3d015a896..d8d214e33 100644
--- a/test/apiv2/rest_api/test_rest_v2_0_0.py
+++ b/test/apiv2/rest_api/test_rest_v2_0_0.py
@@ -93,14 +93,21 @@ class TestApi(unittest.TestCase):
         self.assertIsNotNone(r.content)
         _ = json.loads(r.text)
 
+        info = requests.get(PODMAN_URL + "/v1.40/info")
+        self.assertEqual(info.status_code, 200, info.content)
+        _ = json.loads(info.text)
+
     def test_events(self):
         r = requests.get(_url("/events?stream=false"))
         self.assertEqual(r.status_code, 200, r.text)
         self.assertIsNotNone(r.content)
-        for line in r.text.splitlines():
+
+        report = r.text.splitlines()
+        self.assertGreater(len(report), 0, "No events found!")
+        for line in report:
             obj = json.loads(line)
             # Actor.ID is uppercase for compatibility
-            _ = obj["Actor"]["ID"]
+            self.assertIn("ID", obj["Actor"])
 
     def test_containers(self):
         r = requests.get(_url("/containers/json"), timeout=5)
@@ -360,17 +367,38 @@ class TestApi(unittest.TestCase):
         self.assertFalse(search.is_alive(), "/images/search took too long")
 
     def test_ping(self):
+        required_headers = (
+            "API-Version",
+            "Builder-Version",
+            "Docker-Experimental",
+            "Cache-Control",
+            "Pragma",
+            "Pragma",
+        )
+
+        def check_headers(req):
+            for k in required_headers:
+                self.assertIn(k, req.headers)
+
         r = requests.get(PODMAN_URL + "/_ping")
         self.assertEqual(r.status_code, 200, r.text)
+        self.assertEqual(r.text, "OK")
+        check_headers(r)
 
         r = requests.head(PODMAN_URL + "/_ping")
         self.assertEqual(r.status_code, 200, r.text)
+        self.assertEqual(r.text, "")
+        check_headers(r)
 
         r = requests.get(_url("/_ping"))
         self.assertEqual(r.status_code, 200, r.text)
+        self.assertEqual(r.text, "OK")
+        check_headers(r)
 
-        r = requests.get(_url("/_ping"))
+        r = requests.head(_url("/_ping"))
         self.assertEqual(r.status_code, 200, r.text)
+        self.assertEqual(r.text, "")
+        check_headers(r)
 
     def test_history_compat(self):
         r = requests.get(PODMAN_URL + "/v1.40/images/alpine/history")
@@ -474,6 +502,34 @@ class TestApi(unittest.TestCase):
         prune = requests.post(PODMAN_URL + "/v1.40/volumes/prune")
         self.assertEqual(prune.status_code, 200, prune.content)
 
+    def test_auth_compat(self):
+        r = requests.post(
+            PODMAN_URL + "/v1.40/auth",
+            json={
+                "username": "bozo",
+                "password": "wedontneednopasswords",
+                "serveraddress": "https://localhost/v1.40/",
+            },
+        )
+        self.assertEqual(r.status_code, 404, r.content)
+
+    def test_version(self):
+        r = requests.get(PODMAN_URL + "/v1.40/version")
+        self.assertEqual(r.status_code, 200, r.content)
+
+        r = requests.get(_url("/version"))
+        self.assertEqual(r.status_code, 200, r.content)
+
+    def test_df_compat(self):
+        r = requests.get(PODMAN_URL + "/v1.40/system/df")
+        self.assertEqual(r.status_code, 200, r.content)
+
+        obj = json.loads(r.content)
+        self.assertIn("Images", obj)
+        self.assertIn("Containers", obj)
+        self.assertIn("Volumes", obj)
+        self.assertIn("BuildCache", obj)
+
 
 if __name__ == "__main__":
     unittest.main()
-- 
cgit v1.2.3-54-g00ecf