github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/integration-cli/docker_api_inspect_test.go (about) 1 package main 2 3 import ( 4 "context" 5 "encoding/json" 6 "strings" 7 8 "github.com/docker/docker/api/types" 9 "github.com/docker/docker/api/types/versions/v1p20" 10 "github.com/docker/docker/client" 11 "github.com/go-check/check" 12 "gotest.tools/assert" 13 is "gotest.tools/assert/cmp" 14 ) 15 16 func (s *DockerSuite) TestInspectAPIContainerResponse(c *check.C) { 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 type acase struct { 24 version string 25 keys []string 26 } 27 28 var cases []acase 29 30 if testEnv.OSType == "windows" { 31 cases = []acase{ 32 {"v1.25", append(keysBase, "Mounts")}, 33 } 34 35 } else { 36 cases = []acase{ 37 {"v1.20", append(keysBase, "Mounts")}, 38 {"v1.19", append(keysBase, "Volumes", "VolumesRW")}, 39 } 40 } 41 42 for _, cs := range cases { 43 body := getInspectBody(c, cs.version, cleanedContainerID) 44 45 var inspectJSON map[string]interface{} 46 err := json.Unmarshal(body, &inspectJSON) 47 assert.NilError(c, err, "Unable to unmarshal body for version %s", cs.version) 48 49 for _, key := range cs.keys { 50 _, ok := inspectJSON[key] 51 assert.Check(c, ok, "%s does not exist in response for version %s", key, cs.version) 52 } 53 54 //Issue #6830: type not properly converted to JSON/back 55 _, ok := inspectJSON["Path"].(bool) 56 assert.Assert(c, !ok, "Path of `true` should not be converted to boolean `true` via JSON marshalling") 57 } 58 } 59 60 func (s *DockerSuite) TestInspectAPIContainerVolumeDriverLegacy(c *check.C) { 61 // No legacy implications for Windows 62 testRequires(c, DaemonIsLinux) 63 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 64 65 cleanedContainerID := strings.TrimSpace(out) 66 67 cases := []string{"v1.19", "v1.20"} 68 for _, version := range cases { 69 body := getInspectBody(c, version, cleanedContainerID) 70 71 var inspectJSON map[string]interface{} 72 err := json.Unmarshal(body, &inspectJSON) 73 assert.NilError(c, err, "Unable to unmarshal body for version %s", version) 74 75 config, ok := inspectJSON["Config"] 76 assert.Assert(c, ok, "Unable to find 'Config'") 77 cfg := config.(map[string]interface{}) 78 _, ok = cfg["VolumeDriver"] 79 assert.Assert(c, ok, "API version %s expected to include VolumeDriver in 'Config'", version) 80 } 81 } 82 83 func (s *DockerSuite) TestInspectAPIContainerVolumeDriver(c *check.C) { 84 out, _ := dockerCmd(c, "run", "-d", "--volume-driver", "local", "busybox", "true") 85 86 cleanedContainerID := strings.TrimSpace(out) 87 88 body := getInspectBody(c, "v1.25", cleanedContainerID) 89 90 var inspectJSON map[string]interface{} 91 err := json.Unmarshal(body, &inspectJSON) 92 assert.NilError(c, err, "Unable to unmarshal body for version 1.25") 93 94 config, ok := inspectJSON["Config"] 95 assert.Assert(c, ok, "Unable to find 'Config'") 96 cfg := config.(map[string]interface{}) 97 _, ok = cfg["VolumeDriver"] 98 assert.Assert(c, !ok, "API version 1.25 expected to not include VolumeDriver in 'Config'") 99 100 config, ok = inspectJSON["HostConfig"] 101 assert.Assert(c, ok, "Unable to find 'HostConfig'") 102 cfg = config.(map[string]interface{}) 103 _, ok = cfg["VolumeDriver"] 104 assert.Assert(c, ok, "API version 1.25 expected to include VolumeDriver in 'HostConfig'") 105 } 106 107 func (s *DockerSuite) TestInspectAPIImageResponse(c *check.C) { 108 dockerCmd(c, "tag", "busybox:latest", "busybox:mytag") 109 cli, err := client.NewClientWithOpts(client.FromEnv) 110 assert.NilError(c, err) 111 defer cli.Close() 112 113 imageJSON, _, err := cli.ImageInspectWithRaw(context.Background(), "busybox") 114 assert.NilError(c, err) 115 116 assert.Check(c, len(imageJSON.RepoTags) == 2) 117 assert.Check(c, is.Contains(imageJSON.RepoTags, "busybox:latest")) 118 assert.Check(c, is.Contains(imageJSON.RepoTags, "busybox:mytag")) 119 } 120 121 // #17131, #17139, #17173 122 func (s *DockerSuite) TestInspectAPIEmptyFieldsInConfigPre121(c *check.C) { 123 // Not relevant on Windows 124 testRequires(c, DaemonIsLinux) 125 out, _ := dockerCmd(c, "run", "-d", "busybox", "true") 126 127 cleanedContainerID := strings.TrimSpace(out) 128 129 cases := []string{"v1.19", "v1.20"} 130 for _, version := range cases { 131 body := getInspectBody(c, version, cleanedContainerID) 132 133 var inspectJSON map[string]interface{} 134 err := json.Unmarshal(body, &inspectJSON) 135 assert.NilError(c, err, "Unable to unmarshal body for version %s", version) 136 config, ok := inspectJSON["Config"] 137 assert.Assert(c, ok, "Unable to find 'Config'") 138 cfg := config.(map[string]interface{}) 139 for _, f := range []string{"MacAddress", "NetworkDisabled", "ExposedPorts"} { 140 _, ok := cfg[f] 141 assert.Check(c, ok, "API version %s expected to include %s in 'Config'", version, f) 142 } 143 } 144 } 145 146 func (s *DockerSuite) TestInspectAPIBridgeNetworkSettings120(c *check.C) { 147 // Not relevant on Windows, and besides it doesn't have any bridge network settings 148 testRequires(c, DaemonIsLinux) 149 out, _ := dockerCmd(c, "run", "-d", "busybox", "top") 150 containerID := strings.TrimSpace(out) 151 waitRun(containerID) 152 153 body := getInspectBody(c, "v1.20", containerID) 154 155 var inspectJSON v1p20.ContainerJSON 156 err := json.Unmarshal(body, &inspectJSON) 157 assert.NilError(c, err) 158 159 settings := inspectJSON.NetworkSettings 160 assert.Assert(c, len(settings.IPAddress) != 0) 161 } 162 163 func (s *DockerSuite) TestInspectAPIBridgeNetworkSettings121(c *check.C) { 164 // Windows doesn't have any bridge network settings 165 testRequires(c, DaemonIsLinux) 166 out, _ := dockerCmd(c, "run", "-d", "busybox", "top") 167 containerID := strings.TrimSpace(out) 168 waitRun(containerID) 169 170 body := getInspectBody(c, "v1.21", containerID) 171 172 var inspectJSON types.ContainerJSON 173 err := json.Unmarshal(body, &inspectJSON) 174 assert.NilError(c, err) 175 176 settings := inspectJSON.NetworkSettings 177 assert.Assert(c, len(settings.IPAddress) != 0) 178 assert.Assert(c, settings.Networks["bridge"] != nil) 179 assert.Equal(c, settings.IPAddress, settings.Networks["bridge"].IPAddress) 180 }