github.com/aspring/terraform@v0.8.2-0.20161216122603-6a8619a5db2e/builtin/providers/docker/resource_docker_container_test.go (about) 1 package docker 2 3 import ( 4 "archive/tar" 5 "bytes" 6 "fmt" 7 "testing" 8 9 dc "github.com/fsouza/go-dockerclient" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func TestAccDockerContainer_basic(t *testing.T) { 15 var c dc.Container 16 resource.Test(t, resource.TestCase{ 17 PreCheck: func() { testAccPreCheck(t) }, 18 Providers: testAccProviders, 19 Steps: []resource.TestStep{ 20 resource.TestStep{ 21 Config: testAccDockerContainerConfig, 22 Check: resource.ComposeTestCheckFunc( 23 testAccContainerRunning("docker_container.foo", &c), 24 ), 25 }, 26 }, 27 }) 28 } 29 30 func TestAccDockerContainer_volume(t *testing.T) { 31 var c dc.Container 32 33 testCheck := func(*terraform.State) error { 34 if len(c.Mounts) != 1 { 35 return fmt.Errorf("Incorrect number of mounts: expected 1, got %d", len(c.Mounts)) 36 } 37 38 for _, v := range c.Mounts { 39 if v.Name != "testAccDockerContainerVolume_volume" { 40 continue 41 } 42 43 if v.Destination != "/tmp/volume" { 44 return fmt.Errorf("Bad destination on mount: expected /tmp/volume, got %q", v.Destination) 45 } 46 47 if v.Mode != "rw" { 48 return fmt.Errorf("Bad mode on mount: expected rw, got %q", v.Mode) 49 } 50 51 return nil 52 } 53 54 return fmt.Errorf("Mount for testAccDockerContainerVolume_volume not found") 55 } 56 57 resource.Test(t, resource.TestCase{ 58 PreCheck: func() { testAccPreCheck(t) }, 59 Providers: testAccProviders, 60 Steps: []resource.TestStep{ 61 resource.TestStep{ 62 Config: testAccDockerContainerVolumeConfig, 63 Check: resource.ComposeTestCheckFunc( 64 testAccContainerRunning("docker_container.foo", &c), 65 testCheck, 66 ), 67 }, 68 }, 69 }) 70 } 71 72 func TestAccDockerContainer_customized(t *testing.T) { 73 var c dc.Container 74 75 testCheck := func(*terraform.State) error { 76 if len(c.Config.Entrypoint) < 3 || 77 (c.Config.Entrypoint[0] != "/bin/bash" && 78 c.Config.Entrypoint[1] != "-c" && 79 c.Config.Entrypoint[2] != "ping localhost") { 80 return fmt.Errorf("Container wrong entrypoint: %s", c.Config.Entrypoint) 81 } 82 83 if c.Config.User != "root:root" { 84 return fmt.Errorf("Container wrong user: %s", c.Config.User) 85 } 86 87 if c.HostConfig.RestartPolicy.Name == "on-failure" { 88 if c.HostConfig.RestartPolicy.MaximumRetryCount != 5 { 89 return fmt.Errorf("Container has wrong restart policy max retry count: %d", c.HostConfig.RestartPolicy.MaximumRetryCount) 90 } 91 } else { 92 return fmt.Errorf("Container has wrong restart policy: %s", c.HostConfig.RestartPolicy.Name) 93 } 94 95 if c.HostConfig.Memory != (512 * 1024 * 1024) { 96 return fmt.Errorf("Container has wrong memory setting: %d", c.HostConfig.Memory) 97 } 98 99 if c.HostConfig.MemorySwap != (2048 * 1024 * 1024) { 100 return fmt.Errorf("Container has wrong memory swap setting: %d\n\r\tPlease check that you machine supports memory swap (you can do that by running 'docker info' command).", c.HostConfig.MemorySwap) 101 } 102 103 if c.HostConfig.CPUShares != 32 { 104 return fmt.Errorf("Container has wrong cpu shares setting: %d", c.HostConfig.CPUShares) 105 } 106 107 if len(c.HostConfig.DNS) != 1 { 108 return fmt.Errorf("Container does not have the correct number of dns entries: %d", len(c.HostConfig.DNS)) 109 } 110 111 if c.HostConfig.DNS[0] != "8.8.8.8" { 112 return fmt.Errorf("Container has wrong dns setting: %v", c.HostConfig.DNS[0]) 113 } 114 115 if len(c.HostConfig.DNSOptions) != 1 { 116 return fmt.Errorf("Container does not have the correct number of dns option entries: %d", len(c.HostConfig.DNS)) 117 } 118 119 if c.HostConfig.DNSOptions[0] != "rotate" { 120 return fmt.Errorf("Container has wrong dns option setting: %v", c.HostConfig.DNS[0]) 121 } 122 123 if len(c.HostConfig.DNSSearch) != 1 { 124 return fmt.Errorf("Container does not have the correct number of dns search entries: %d", len(c.HostConfig.DNS)) 125 } 126 127 if c.HostConfig.DNSSearch[0] != "example.com" { 128 return fmt.Errorf("Container has wrong dns search setting: %v", c.HostConfig.DNS[0]) 129 } 130 131 if c.HostConfig.CPUShares != 32 { 132 return fmt.Errorf("Container has wrong cpu shares setting: %d", c.HostConfig.CPUShares) 133 } 134 135 if c.HostConfig.CPUShares != 32 { 136 return fmt.Errorf("Container has wrong cpu shares setting: %d", c.HostConfig.CPUShares) 137 } 138 139 if c.Config.Labels["env"] != "prod" || c.Config.Labels["role"] != "test" { 140 return fmt.Errorf("Container does not have the correct labels") 141 } 142 143 if c.HostConfig.LogConfig.Type != "json-file" { 144 return fmt.Errorf("Container does not have the correct log config: %s", c.HostConfig.LogConfig.Type) 145 } 146 147 if c.HostConfig.LogConfig.Config["max-size"] != "10m" { 148 return fmt.Errorf("Container does not have the correct max-size log option: %v", c.HostConfig.LogConfig.Config["max-size"]) 149 } 150 151 if c.HostConfig.LogConfig.Config["max-file"] != "20" { 152 return fmt.Errorf("Container does not have the correct max-file log option: %v", c.HostConfig.LogConfig.Config["max-file"]) 153 } 154 155 if len(c.HostConfig.ExtraHosts) != 2 { 156 return fmt.Errorf("Container does not have correct number of extra host entries, got %d", len(c.HostConfig.ExtraHosts)) 157 } 158 159 if c.HostConfig.ExtraHosts[0] != "testhost2:10.0.2.0" { 160 return fmt.Errorf("Container has incorrect extra host string: %q", c.HostConfig.ExtraHosts[0]) 161 } 162 163 if c.HostConfig.ExtraHosts[1] != "testhost:10.0.1.0" { 164 return fmt.Errorf("Container has incorrect extra host string: %q", c.HostConfig.ExtraHosts[1]) 165 } 166 167 return nil 168 } 169 170 resource.Test(t, resource.TestCase{ 171 PreCheck: func() { testAccPreCheck(t) }, 172 Providers: testAccProviders, 173 Steps: []resource.TestStep{ 174 resource.TestStep{ 175 Config: testAccDockerContainerCustomizedConfig, 176 Check: resource.ComposeTestCheckFunc( 177 testAccContainerRunning("docker_container.foo", &c), 178 testCheck, 179 ), 180 }, 181 }, 182 }) 183 } 184 185 func TestAccDockerContainer_upload(t *testing.T) { 186 var c dc.Container 187 188 testCheck := func(*terraform.State) error { 189 client := testAccProvider.Meta().(*dc.Client) 190 191 buf := new(bytes.Buffer) 192 opts := dc.DownloadFromContainerOptions{ 193 OutputStream: buf, 194 Path: "/terraform/test.txt", 195 } 196 197 if err := client.DownloadFromContainer(c.ID, opts); err != nil { 198 return fmt.Errorf("Unable to download a file from container: %s", err) 199 } 200 201 r := bytes.NewReader(buf.Bytes()) 202 tr := tar.NewReader(r) 203 204 if _, err := tr.Next(); err != nil { 205 return fmt.Errorf("Unable to read content of tar archive: %s", err) 206 } 207 208 fbuf := new(bytes.Buffer) 209 fbuf.ReadFrom(tr) 210 content := fbuf.String() 211 212 if content != "foo" { 213 return fmt.Errorf("file content is invalid") 214 } 215 216 return nil 217 } 218 219 resource.Test(t, resource.TestCase{ 220 PreCheck: func() { testAccPreCheck(t) }, 221 Providers: testAccProviders, 222 Steps: []resource.TestStep{ 223 resource.TestStep{ 224 Config: testAccDockerContainerUploadConfig, 225 Check: resource.ComposeTestCheckFunc( 226 testAccContainerRunning("docker_container.foo", &c), 227 testCheck, 228 ), 229 }, 230 }, 231 }) 232 } 233 234 func testAccContainerRunning(n string, container *dc.Container) resource.TestCheckFunc { 235 return func(s *terraform.State) error { 236 rs, ok := s.RootModule().Resources[n] 237 if !ok { 238 return fmt.Errorf("Not found: %s", n) 239 } 240 241 if rs.Primary.ID == "" { 242 return fmt.Errorf("No ID is set") 243 } 244 245 client := testAccProvider.Meta().(*dc.Client) 246 containers, err := client.ListContainers(dc.ListContainersOptions{}) 247 if err != nil { 248 return err 249 } 250 251 for _, c := range containers { 252 if c.ID == rs.Primary.ID { 253 inspected, err := client.InspectContainer(c.ID) 254 if err != nil { 255 return fmt.Errorf("Container could not be inspected: %s", err) 256 } 257 *container = *inspected 258 return nil 259 } 260 } 261 262 return fmt.Errorf("Container not found: %s", rs.Primary.ID) 263 } 264 } 265 266 const testAccDockerContainerConfig = ` 267 resource "docker_image" "foo" { 268 name = "nginx:latest" 269 } 270 271 resource "docker_container" "foo" { 272 name = "tf-test" 273 image = "${docker_image.foo.latest}" 274 } 275 ` 276 277 const testAccDockerContainerVolumeConfig = ` 278 resource "docker_image" "foo" { 279 name = "nginx:latest" 280 } 281 282 resource "docker_volume" "foo" { 283 name = "testAccDockerContainerVolume_volume" 284 } 285 286 resource "docker_container" "foo" { 287 name = "tf-test" 288 image = "${docker_image.foo.latest}" 289 290 volumes { 291 volume_name = "${docker_volume.foo.name}" 292 container_path = "/tmp/volume" 293 read_only = false 294 } 295 } 296 ` 297 298 const testAccDockerContainerCustomizedConfig = ` 299 resource "docker_image" "foo" { 300 name = "nginx:latest" 301 } 302 303 resource "docker_container" "foo" { 304 name = "tf-test" 305 image = "${docker_image.foo.latest}" 306 entrypoint = ["/bin/bash", "-c", "ping localhost"] 307 user = "root:root" 308 restart = "on-failure" 309 destroy_grace_seconds = 10 310 max_retry_count = 5 311 memory = 512 312 memory_swap = 2048 313 cpu_shares = 32 314 dns = ["8.8.8.8"] 315 dns_opts = ["rotate"] 316 dns_search = ["example.com"] 317 labels { 318 env = "prod" 319 role = "test" 320 } 321 log_driver = "json-file" 322 log_opts = { 323 max-size = "10m" 324 max-file = 20 325 } 326 network_mode = "bridge" 327 328 host { 329 host = "testhost" 330 ip = "10.0.1.0" 331 } 332 333 host { 334 host = "testhost2" 335 ip = "10.0.2.0" 336 } 337 } 338 ` 339 340 const testAccDockerContainerUploadConfig = ` 341 resource "docker_image" "foo" { 342 name = "nginx:latest" 343 } 344 345 resource "docker_container" "foo" { 346 name = "tf-test" 347 image = "${docker_image.foo.latest}" 348 349 upload { 350 content = "foo" 351 file = "/terraform/test.txt" 352 } 353 } 354 `