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