github.com/OpenFlowLabs/moby@v17.12.1-ce-rc2+incompatible/integration-cli/docker_cli_prune_unix_test.go (about) 1 // +build !windows 2 3 package main 4 5 import ( 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "strconv" 10 "strings" 11 "time" 12 13 "github.com/docker/docker/integration-cli/checker" 14 "github.com/docker/docker/integration-cli/cli" 15 "github.com/docker/docker/integration-cli/daemon" 16 "github.com/go-check/check" 17 ) 18 19 func pruneNetworkAndVerify(c *check.C, d *daemon.Swarm, kept, pruned []string) { 20 _, err := d.Cmd("network", "prune", "--force") 21 c.Assert(err, checker.IsNil) 22 23 for _, s := range kept { 24 waitAndAssert(c, defaultReconciliationTimeout, func(*check.C) (interface{}, check.CommentInterface) { 25 out, err := d.Cmd("network", "ls", "--format", "{{.Name}}") 26 c.Assert(err, checker.IsNil) 27 return out, nil 28 }, checker.Contains, s) 29 } 30 31 for _, s := range pruned { 32 waitAndAssert(c, defaultReconciliationTimeout, func(*check.C) (interface{}, check.CommentInterface) { 33 out, err := d.Cmd("network", "ls", "--format", "{{.Name}}") 34 c.Assert(err, checker.IsNil) 35 return out, nil 36 }, checker.Not(checker.Contains), s) 37 } 38 } 39 40 func (s *DockerSwarmSuite) TestPruneNetwork(c *check.C) { 41 d := s.AddDaemon(c, true, true) 42 _, err := d.Cmd("network", "create", "n1") // used by container (testprune) 43 c.Assert(err, checker.IsNil) 44 _, err = d.Cmd("network", "create", "n2") 45 c.Assert(err, checker.IsNil) 46 _, err = d.Cmd("network", "create", "n3", "--driver", "overlay") // used by service (testprunesvc) 47 c.Assert(err, checker.IsNil) 48 _, err = d.Cmd("network", "create", "n4", "--driver", "overlay") 49 c.Assert(err, checker.IsNil) 50 51 cName := "testprune" 52 _, err = d.Cmd("run", "-d", "--name", cName, "--net", "n1", "busybox", "top") 53 c.Assert(err, checker.IsNil) 54 55 serviceName := "testprunesvc" 56 replicas := 1 57 out, err := d.Cmd("service", "create", "--detach", "--no-resolve-image", 58 "--name", serviceName, 59 "--replicas", strconv.Itoa(replicas), 60 "--network", "n3", 61 "busybox", "top") 62 c.Assert(err, checker.IsNil) 63 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 64 waitAndAssert(c, defaultReconciliationTimeout, d.CheckActiveContainerCount, checker.Equals, replicas+1) 65 66 // prune and verify 67 pruneNetworkAndVerify(c, d, []string{"n1", "n3"}, []string{"n2", "n4"}) 68 69 // remove containers, then prune and verify again 70 _, err = d.Cmd("rm", "-f", cName) 71 c.Assert(err, checker.IsNil) 72 _, err = d.Cmd("service", "rm", serviceName) 73 c.Assert(err, checker.IsNil) 74 waitAndAssert(c, defaultReconciliationTimeout, d.CheckActiveContainerCount, checker.Equals, 0) 75 76 pruneNetworkAndVerify(c, d, []string{}, []string{"n1", "n3"}) 77 } 78 79 func (s *DockerDaemonSuite) TestPruneImageDangling(c *check.C) { 80 s.d.StartWithBusybox(c) 81 82 out, _, err := s.d.BuildImageWithOut("test", 83 `FROM busybox 84 LABEL foo=bar`, true, "-q") 85 c.Assert(err, checker.IsNil) 86 id := strings.TrimSpace(out) 87 88 out, err = s.d.Cmd("images", "-q", "--no-trunc") 89 c.Assert(err, checker.IsNil) 90 c.Assert(strings.TrimSpace(out), checker.Contains, id) 91 92 out, err = s.d.Cmd("image", "prune", "--force") 93 c.Assert(err, checker.IsNil) 94 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) 95 96 out, err = s.d.Cmd("images", "-q", "--no-trunc") 97 c.Assert(err, checker.IsNil) 98 c.Assert(strings.TrimSpace(out), checker.Contains, id) 99 100 out, err = s.d.Cmd("image", "prune", "--force", "--all") 101 c.Assert(err, checker.IsNil) 102 c.Assert(strings.TrimSpace(out), checker.Contains, id) 103 104 out, err = s.d.Cmd("images", "-q", "--no-trunc") 105 c.Assert(err, checker.IsNil) 106 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) 107 } 108 109 func (s *DockerSuite) TestPruneContainerUntil(c *check.C) { 110 out := cli.DockerCmd(c, "run", "-d", "busybox").Combined() 111 id1 := strings.TrimSpace(out) 112 cli.WaitExited(c, id1, 5*time.Second) 113 114 until := daemonUnixTime(c) 115 116 out = cli.DockerCmd(c, "run", "-d", "busybox").Combined() 117 id2 := strings.TrimSpace(out) 118 cli.WaitExited(c, id2, 5*time.Second) 119 120 out = cli.DockerCmd(c, "container", "prune", "--force", "--filter", "until="+until).Combined() 121 c.Assert(strings.TrimSpace(out), checker.Contains, id1) 122 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 123 124 out = cli.DockerCmd(c, "ps", "-a", "-q", "--no-trunc").Combined() 125 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 126 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 127 } 128 129 func (s *DockerSuite) TestPruneContainerLabel(c *check.C) { 130 out := cli.DockerCmd(c, "run", "-d", "--label", "foo", "busybox").Combined() 131 id1 := strings.TrimSpace(out) 132 cli.WaitExited(c, id1, 5*time.Second) 133 134 out = cli.DockerCmd(c, "run", "-d", "--label", "bar", "busybox").Combined() 135 id2 := strings.TrimSpace(out) 136 cli.WaitExited(c, id2, 5*time.Second) 137 138 out = cli.DockerCmd(c, "run", "-d", "busybox").Combined() 139 id3 := strings.TrimSpace(out) 140 cli.WaitExited(c, id3, 5*time.Second) 141 142 out = cli.DockerCmd(c, "run", "-d", "--label", "foobar", "busybox").Combined() 143 id4 := strings.TrimSpace(out) 144 cli.WaitExited(c, id4, 5*time.Second) 145 146 // Add a config file of label=foobar, that will have no impact if cli is label!=foobar 147 config := `{"pruneFilters": ["label=foobar"]}` 148 d, err := ioutil.TempDir("", "integration-cli-") 149 c.Assert(err, checker.IsNil) 150 defer os.RemoveAll(d) 151 err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644) 152 c.Assert(err, checker.IsNil) 153 154 // With config.json only, prune based on label=foobar 155 out = cli.DockerCmd(c, "--config", d, "container", "prune", "--force").Combined() 156 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 157 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 158 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3) 159 c.Assert(strings.TrimSpace(out), checker.Contains, id4) 160 161 out = cli.DockerCmd(c, "container", "prune", "--force", "--filter", "label=foo").Combined() 162 c.Assert(strings.TrimSpace(out), checker.Contains, id1) 163 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 164 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3) 165 166 out = cli.DockerCmd(c, "ps", "-a", "-q", "--no-trunc").Combined() 167 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 168 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 169 c.Assert(strings.TrimSpace(out), checker.Contains, id3) 170 171 out = cli.DockerCmd(c, "container", "prune", "--force", "--filter", "label!=bar").Combined() 172 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 173 c.Assert(strings.TrimSpace(out), checker.Contains, id3) 174 175 out = cli.DockerCmd(c, "ps", "-a", "-q", "--no-trunc").Combined() 176 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 177 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3) 178 179 // With config.json label=foobar and CLI label!=foobar, CLI label!=foobar supersede 180 out = cli.DockerCmd(c, "--config", d, "container", "prune", "--force", "--filter", "label!=foobar").Combined() 181 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 182 183 out = cli.DockerCmd(c, "ps", "-a", "-q", "--no-trunc").Combined() 184 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 185 } 186 187 func (s *DockerSuite) TestPruneVolumeLabel(c *check.C) { 188 out, _ := dockerCmd(c, "volume", "create", "--label", "foo") 189 id1 := strings.TrimSpace(out) 190 c.Assert(id1, checker.Not(checker.Equals), "") 191 192 out, _ = dockerCmd(c, "volume", "create", "--label", "bar") 193 id2 := strings.TrimSpace(out) 194 c.Assert(id2, checker.Not(checker.Equals), "") 195 196 out, _ = dockerCmd(c, "volume", "create") 197 id3 := strings.TrimSpace(out) 198 c.Assert(id3, checker.Not(checker.Equals), "") 199 200 out, _ = dockerCmd(c, "volume", "create", "--label", "foobar") 201 id4 := strings.TrimSpace(out) 202 c.Assert(id4, checker.Not(checker.Equals), "") 203 204 // Add a config file of label=foobar, that will have no impact if cli is label!=foobar 205 config := `{"pruneFilters": ["label=foobar"]}` 206 d, err := ioutil.TempDir("", "integration-cli-") 207 c.Assert(err, checker.IsNil) 208 defer os.RemoveAll(d) 209 err = ioutil.WriteFile(filepath.Join(d, "config.json"), []byte(config), 0644) 210 c.Assert(err, checker.IsNil) 211 212 // With config.json only, prune based on label=foobar 213 out, _ = dockerCmd(c, "--config", d, "volume", "prune", "--force") 214 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 215 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 216 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3) 217 c.Assert(strings.TrimSpace(out), checker.Contains, id4) 218 219 out, _ = dockerCmd(c, "volume", "prune", "--force", "--filter", "label=foo") 220 c.Assert(strings.TrimSpace(out), checker.Contains, id1) 221 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 222 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3) 223 224 out, _ = dockerCmd(c, "volume", "ls", "--format", "{{.Name}}") 225 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 226 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 227 c.Assert(strings.TrimSpace(out), checker.Contains, id3) 228 229 out, _ = dockerCmd(c, "volume", "prune", "--force", "--filter", "label!=bar") 230 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 231 c.Assert(strings.TrimSpace(out), checker.Contains, id3) 232 233 out, _ = dockerCmd(c, "volume", "ls", "--format", "{{.Name}}") 234 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 235 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id3) 236 237 // With config.json label=foobar and CLI label!=foobar, CLI label!=foobar supersede 238 out, _ = dockerCmd(c, "--config", d, "volume", "prune", "--force", "--filter", "label!=foobar") 239 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 240 241 out, _ = dockerCmd(c, "volume", "ls", "--format", "{{.Name}}") 242 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 243 } 244 245 func (s *DockerSuite) TestPruneNetworkLabel(c *check.C) { 246 dockerCmd(c, "network", "create", "--label", "foo", "n1") 247 dockerCmd(c, "network", "create", "--label", "bar", "n2") 248 dockerCmd(c, "network", "create", "n3") 249 250 out, _ := dockerCmd(c, "network", "prune", "--force", "--filter", "label=foo") 251 c.Assert(strings.TrimSpace(out), checker.Contains, "n1") 252 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n2") 253 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n3") 254 255 out, _ = dockerCmd(c, "network", "prune", "--force", "--filter", "label!=bar") 256 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n1") 257 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n2") 258 c.Assert(strings.TrimSpace(out), checker.Contains, "n3") 259 260 out, _ = dockerCmd(c, "network", "prune", "--force") 261 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n1") 262 c.Assert(strings.TrimSpace(out), checker.Contains, "n2") 263 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), "n3") 264 } 265 266 func (s *DockerDaemonSuite) TestPruneImageLabel(c *check.C) { 267 s.d.StartWithBusybox(c) 268 269 out, _, err := s.d.BuildImageWithOut("test1", 270 `FROM busybox 271 LABEL foo=bar`, true, "-q") 272 c.Assert(err, checker.IsNil) 273 id1 := strings.TrimSpace(out) 274 out, err = s.d.Cmd("images", "-q", "--no-trunc") 275 c.Assert(err, checker.IsNil) 276 c.Assert(strings.TrimSpace(out), checker.Contains, id1) 277 278 out, _, err = s.d.BuildImageWithOut("test2", 279 `FROM busybox 280 LABEL bar=foo`, true, "-q") 281 c.Assert(err, checker.IsNil) 282 id2 := strings.TrimSpace(out) 283 out, err = s.d.Cmd("images", "-q", "--no-trunc") 284 c.Assert(err, checker.IsNil) 285 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 286 287 out, err = s.d.Cmd("image", "prune", "--force", "--all", "--filter", "label=foo=bar") 288 c.Assert(err, checker.IsNil) 289 c.Assert(strings.TrimSpace(out), checker.Contains, id1) 290 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 291 292 out, err = s.d.Cmd("image", "prune", "--force", "--all", "--filter", "label!=bar=foo") 293 c.Assert(err, checker.IsNil) 294 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 295 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) 296 297 out, err = s.d.Cmd("image", "prune", "--force", "--all", "--filter", "label=bar=foo") 298 c.Assert(err, checker.IsNil) 299 c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) 300 c.Assert(strings.TrimSpace(out), checker.Contains, id2) 301 }