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