github.com/uriddle/docker@v0.0.0-20210926094723-4072e6aeb013/integration-cli/docker_api_inspect_test.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "strings" 7 8 "github.com/docker/docker/pkg/integration/checker" 9 "github.com/docker/docker/pkg/stringutils" 10 "github.com/docker/engine-api/types" 11 "github.com/docker/engine-api/types/versions/v1p20" 12 "github.com/go-check/check" 13 ) 14 15 func (s *DockerSuite) TestInspectApiContainerResponse(c *check.C) { 16 testRequires(c, DaemonIsLinux) 17 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 18 19 cleanedContainerID := strings.TrimSpace(out) 20 keysBase := []string{"Id", "State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", 21 "ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "MountLabel", "ProcessLabel", "GraphDriver"} 22 23 cases := []struct { 24 version string 25 keys []string 26 }{ 27 {"v1.20", append(keysBase, "Mounts")}, 28 {"v1.19", append(keysBase, "Volumes", "VolumesRW")}, 29 } 30 31 for _, cs := range cases { 32 body := getInspectBody(c, cs.version, cleanedContainerID) 33 34 var inspectJSON map[string]interface{} 35 err := json.Unmarshal(body, &inspectJSON) 36 c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version %s", cs.version)) 37 38 for _, key := range cs.keys { 39 _, ok := inspectJSON[key] 40 c.Check(ok, checker.True, check.Commentf("%s does not exist in response for version %s", key, cs.version)) 41 } 42 43 //Issue #6830: type not properly converted to JSON/back 44 _, ok := inspectJSON["Path"].(bool) 45 c.Assert(ok, checker.False, check.Commentf("Path of `true` should not be converted to boolean `true` via JSON marshalling")) 46 } 47 } 48 49 func (s *DockerSuite) TestInspectApiContainerVolumeDriverLegacy(c *check.C) { 50 testRequires(c, DaemonIsLinux) 51 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 52 53 cleanedContainerID := strings.TrimSpace(out) 54 55 cases := []string{"v1.19", "v1.20"} 56 for _, version := range cases { 57 body := getInspectBody(c, version, cleanedContainerID) 58 59 var inspectJSON map[string]interface{} 60 err := json.Unmarshal(body, &inspectJSON) 61 c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version %s", version)) 62 63 config, ok := inspectJSON["Config"] 64 c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) 65 cfg := config.(map[string]interface{}) 66 _, ok = cfg["VolumeDriver"] 67 c.Assert(ok, checker.True, check.Commentf("Api version %s expected to include VolumeDriver in 'Config'", version)) 68 } 69 } 70 71 func (s *DockerSuite) TestInspectApiContainerVolumeDriver(c *check.C) { 72 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 73 74 cleanedContainerID := strings.TrimSpace(out) 75 76 body := getInspectBody(c, "v1.21", cleanedContainerID) 77 78 var inspectJSON map[string]interface{} 79 err := json.Unmarshal(body, &inspectJSON) 80 c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version 1.21")) 81 82 config, ok := inspectJSON["Config"] 83 c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) 84 cfg := config.(map[string]interface{}) 85 _, ok = cfg["VolumeDriver"] 86 c.Assert(ok, checker.False, check.Commentf("Api version 1.21 expected to not include VolumeDriver in 'Config'")) 87 88 config, ok = inspectJSON["HostConfig"] 89 c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) 90 cfg = config.(map[string]interface{}) 91 _, ok = cfg["VolumeDriver"] 92 c.Assert(ok, checker.True, check.Commentf("Api version 1.21 expected to include VolumeDriver in 'HostConfig'")) 93 } 94 95 func (s *DockerSuite) TestInspectApiImageResponse(c *check.C) { 96 dockerCmd(c, "tag", "busybox:latest", "busybox:mytag") 97 98 endpoint := "/images/busybox/json" 99 status, body, err := sockRequest("GET", endpoint, nil) 100 101 c.Assert(err, checker.IsNil) 102 c.Assert(status, checker.Equals, http.StatusOK) 103 104 var imageJSON types.ImageInspect 105 err = json.Unmarshal(body, &imageJSON) 106 c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for latest version")) 107 c.Assert(imageJSON.RepoTags, checker.HasLen, 2) 108 109 c.Assert(stringutils.InSlice(imageJSON.RepoTags, "busybox:latest"), checker.Equals, true) 110 c.Assert(stringutils.InSlice(imageJSON.RepoTags, "busybox:mytag"), checker.Equals, true) 111 } 112 113 // #17131, #17139, #17173 114 func (s *DockerSuite) TestInspectApiEmptyFieldsInConfigPre121(c *check.C) { 115 testRequires(c, DaemonIsLinux) 116 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 117 118 cleanedContainerID := strings.TrimSpace(out) 119 120 cases := []string{"v1.19", "v1.20"} 121 for _, version := range cases { 122 body := getInspectBody(c, version, cleanedContainerID) 123 124 var inspectJSON map[string]interface{} 125 err := json.Unmarshal(body, &inspectJSON) 126 c.Assert(err, checker.IsNil, check.Commentf("Unable to unmarshal body for version %s", version)) 127 config, ok := inspectJSON["Config"] 128 c.Assert(ok, checker.True, check.Commentf("Unable to find 'Config'")) 129 cfg := config.(map[string]interface{}) 130 for _, f := range []string{"MacAddress", "NetworkDisabled", "ExposedPorts"} { 131 _, ok := cfg[f] 132 c.Check(ok, checker.True, check.Commentf("Api version %s expected to include %s in 'Config'", version, f)) 133 } 134 } 135 } 136 137 func (s *DockerSuite) TestInspectApiBridgeNetworkSettings120(c *check.C) { 138 testRequires(c, DaemonIsLinux) 139 out, _ := dockerCmd(c, "run", "-d", "busybox", "top") 140 containerID := strings.TrimSpace(out) 141 waitRun(containerID) 142 143 body := getInspectBody(c, "v1.20", containerID) 144 145 var inspectJSON v1p20.ContainerJSON 146 err := json.Unmarshal(body, &inspectJSON) 147 c.Assert(err, checker.IsNil) 148 149 settings := inspectJSON.NetworkSettings 150 c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0) 151 } 152 153 func (s *DockerSuite) TestInspectApiBridgeNetworkSettings121(c *check.C) { 154 testRequires(c, DaemonIsLinux) 155 out, _ := dockerCmd(c, "run", "-d", "busybox", "top") 156 containerID := strings.TrimSpace(out) 157 waitRun(containerID) 158 159 body := getInspectBody(c, "v1.21", containerID) 160 161 var inspectJSON types.ContainerJSON 162 err := json.Unmarshal(body, &inspectJSON) 163 c.Assert(err, checker.IsNil) 164 165 settings := inspectJSON.NetworkSettings 166 c.Assert(settings.IPAddress, checker.Not(checker.HasLen), 0) 167 c.Assert(settings.Networks["bridge"], checker.Not(checker.IsNil)) 168 c.Assert(settings.IPAddress, checker.Equals, settings.Networks["bridge"].IPAddress) 169 }