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>
This commit is contained in:
		
							parent
							
								
									0c2a43b99d
								
							
						
					
					
						commit
						98c1b23624
					
				| 
						 | 
				
			
			@ -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")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
	}})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue