github.com/anfernee/terraform@v0.6.16-0.20160430000239-06e5085a92f2/builtin/providers/aws/resource_aws_s3_bucket_test.go (about) 1 package aws 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "reflect" 7 "regexp" 8 "strconv" 9 "testing" 10 11 "github.com/hashicorp/terraform/helper/acctest" 12 "github.com/hashicorp/terraform/helper/resource" 13 "github.com/hashicorp/terraform/terraform" 14 15 "github.com/aws/aws-sdk-go/aws" 16 "github.com/aws/aws-sdk-go/aws/awserr" 17 "github.com/aws/aws-sdk-go/service/s3" 18 ) 19 20 func TestAccAWSS3Bucket_basic(t *testing.T) { 21 rInt := acctest.RandInt() 22 arnRegexp := regexp.MustCompile( 23 "^arn:aws:s3:::") 24 25 resource.Test(t, resource.TestCase{ 26 PreCheck: func() { testAccPreCheck(t) }, 27 /* 28 IDRefreshName: "aws_s3_bucket.bucket", 29 IDRefreshIgnore: []string{"force_destroy"}, 30 */ 31 Providers: testAccProviders, 32 CheckDestroy: testAccCheckAWSS3BucketDestroy, 33 Steps: []resource.TestStep{ 34 resource.TestStep{ 35 Config: testAccAWSS3BucketConfig(rInt), 36 Check: resource.ComposeTestCheckFunc( 37 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 38 resource.TestCheckResourceAttr( 39 "aws_s3_bucket.bucket", "hosted_zone_id", HostedZoneIDForRegion("us-west-2")), 40 resource.TestCheckResourceAttr( 41 "aws_s3_bucket.bucket", "region", "us-west-2"), 42 resource.TestCheckResourceAttr( 43 "aws_s3_bucket.bucket", "website_endpoint", ""), 44 resource.TestMatchResourceAttr( 45 "aws_s3_bucket.bucket", "arn", arnRegexp), 46 ), 47 }, 48 }, 49 }) 50 } 51 52 func TestAccAWSS3Bucket_Policy(t *testing.T) { 53 rInt := acctest.RandInt() 54 55 resource.Test(t, resource.TestCase{ 56 PreCheck: func() { testAccPreCheck(t) }, 57 Providers: testAccProviders, 58 CheckDestroy: testAccCheckAWSS3BucketDestroy, 59 Steps: []resource.TestStep{ 60 resource.TestStep{ 61 Config: testAccAWSS3BucketConfigWithPolicy(rInt), 62 Check: resource.ComposeTestCheckFunc( 63 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 64 testAccCheckAWSS3BucketPolicy( 65 "aws_s3_bucket.bucket", testAccAWSS3BucketPolicy(rInt)), 66 ), 67 }, 68 resource.TestStep{ 69 Config: testAccAWSS3BucketConfig(rInt), 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 72 testAccCheckAWSS3BucketPolicy( 73 "aws_s3_bucket.bucket", ""), 74 ), 75 }, 76 resource.TestStep{ 77 Config: testAccAWSS3BucketConfigWithEmptyPolicy(rInt), 78 Check: resource.ComposeTestCheckFunc( 79 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 80 testAccCheckAWSS3BucketPolicy( 81 "aws_s3_bucket.bucket", ""), 82 ), 83 }, 84 }, 85 }) 86 } 87 88 func TestAccAWSS3Bucket_UpdateAcl(t *testing.T) { 89 ri := acctest.RandInt() 90 preConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAcl, ri) 91 postConfig := fmt.Sprintf(testAccAWSS3BucketConfigWithAclUpdate, ri) 92 93 resource.Test(t, resource.TestCase{ 94 PreCheck: func() { testAccPreCheck(t) }, 95 Providers: testAccProviders, 96 CheckDestroy: testAccCheckAWSS3BucketDestroy, 97 Steps: []resource.TestStep{ 98 resource.TestStep{ 99 Config: preConfig, 100 Check: resource.ComposeTestCheckFunc( 101 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 102 resource.TestCheckResourceAttr( 103 "aws_s3_bucket.bucket", "acl", "public-read"), 104 ), 105 }, 106 resource.TestStep{ 107 Config: postConfig, 108 Check: resource.ComposeTestCheckFunc( 109 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 110 resource.TestCheckResourceAttr( 111 "aws_s3_bucket.bucket", "acl", "private"), 112 ), 113 }, 114 }, 115 }) 116 } 117 118 func TestAccAWSS3Bucket_Website_Simple(t *testing.T) { 119 rInt := acctest.RandInt() 120 resource.Test(t, resource.TestCase{ 121 PreCheck: func() { testAccPreCheck(t) }, 122 Providers: testAccProviders, 123 CheckDestroy: testAccCheckAWSS3BucketDestroy, 124 Steps: []resource.TestStep{ 125 resource.TestStep{ 126 Config: testAccAWSS3BucketWebsiteConfig(rInt), 127 Check: resource.ComposeTestCheckFunc( 128 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 129 testAccCheckAWSS3BucketWebsite( 130 "aws_s3_bucket.bucket", "index.html", "", "", ""), 131 resource.TestCheckResourceAttr( 132 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 133 ), 134 }, 135 resource.TestStep{ 136 Config: testAccAWSS3BucketWebsiteConfigWithError(rInt), 137 Check: resource.ComposeTestCheckFunc( 138 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 139 testAccCheckAWSS3BucketWebsite( 140 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 141 resource.TestCheckResourceAttr( 142 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 143 ), 144 }, 145 resource.TestStep{ 146 Config: testAccAWSS3BucketConfig(rInt), 147 Check: resource.ComposeTestCheckFunc( 148 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 149 testAccCheckAWSS3BucketWebsite( 150 "aws_s3_bucket.bucket", "", "", "", ""), 151 resource.TestCheckResourceAttr( 152 "aws_s3_bucket.bucket", "website_endpoint", ""), 153 ), 154 }, 155 }, 156 }) 157 } 158 159 func TestAccAWSS3Bucket_WebsiteRedirect(t *testing.T) { 160 rInt := acctest.RandInt() 161 resource.Test(t, resource.TestCase{ 162 PreCheck: func() { testAccPreCheck(t) }, 163 Providers: testAccProviders, 164 CheckDestroy: testAccCheckAWSS3BucketDestroy, 165 Steps: []resource.TestStep{ 166 resource.TestStep{ 167 Config: testAccAWSS3BucketWebsiteConfigWithRedirect(rInt), 168 Check: resource.ComposeTestCheckFunc( 169 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 170 testAccCheckAWSS3BucketWebsite( 171 "aws_s3_bucket.bucket", "", "", "", "hashicorp.com"), 172 resource.TestCheckResourceAttr( 173 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 174 ), 175 }, 176 resource.TestStep{ 177 Config: testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(rInt), 178 Check: resource.ComposeTestCheckFunc( 179 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 180 testAccCheckAWSS3BucketWebsite( 181 "aws_s3_bucket.bucket", "", "", "https", "hashicorp.com"), 182 resource.TestCheckResourceAttr( 183 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 184 ), 185 }, 186 resource.TestStep{ 187 Config: testAccAWSS3BucketConfig(rInt), 188 Check: resource.ComposeTestCheckFunc( 189 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 190 testAccCheckAWSS3BucketWebsite( 191 "aws_s3_bucket.bucket", "", "", "", ""), 192 resource.TestCheckResourceAttr( 193 "aws_s3_bucket.bucket", "website_endpoint", ""), 194 ), 195 }, 196 }, 197 }) 198 } 199 200 func TestAccAWSS3Bucket_WebsiteRoutingRules(t *testing.T) { 201 rInt := acctest.RandInt() 202 resource.Test(t, resource.TestCase{ 203 PreCheck: func() { testAccPreCheck(t) }, 204 Providers: testAccProviders, 205 CheckDestroy: testAccCheckAWSS3BucketDestroy, 206 Steps: []resource.TestStep{ 207 resource.TestStep{ 208 Config: testAccAWSS3BucketWebsiteConfigWithRoutingRules(rInt), 209 Check: resource.ComposeTestCheckFunc( 210 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 211 testAccCheckAWSS3BucketWebsite( 212 "aws_s3_bucket.bucket", "index.html", "error.html", "", ""), 213 testAccCheckAWSS3BucketWebsiteRoutingRules( 214 "aws_s3_bucket.bucket", 215 []*s3.RoutingRule{ 216 &s3.RoutingRule{ 217 Condition: &s3.Condition{ 218 KeyPrefixEquals: aws.String("docs/"), 219 }, 220 Redirect: &s3.Redirect{ 221 ReplaceKeyPrefixWith: aws.String("documents/"), 222 }, 223 }, 224 }, 225 ), 226 resource.TestCheckResourceAttr( 227 "aws_s3_bucket.bucket", "website_endpoint", testAccWebsiteEndpoint(rInt)), 228 ), 229 }, 230 resource.TestStep{ 231 Config: testAccAWSS3BucketConfig(rInt), 232 Check: resource.ComposeTestCheckFunc( 233 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 234 testAccCheckAWSS3BucketWebsite( 235 "aws_s3_bucket.bucket", "", "", "", ""), 236 testAccCheckAWSS3BucketWebsiteRoutingRules("aws_s3_bucket.bucket", nil), 237 resource.TestCheckResourceAttr( 238 "aws_s3_bucket.bucket", "website_endpoint", ""), 239 ), 240 }, 241 }, 242 }) 243 } 244 245 // Test TestAccAWSS3Bucket_shouldFailNotFound is designed to fail with a "plan 246 // not empty" error in Terraform, to check against regresssions. 247 // See https://github.com/hashicorp/terraform/pull/2925 248 func TestAccAWSS3Bucket_shouldFailNotFound(t *testing.T) { 249 rInt := acctest.RandInt() 250 resource.Test(t, resource.TestCase{ 251 PreCheck: func() { testAccPreCheck(t) }, 252 Providers: testAccProviders, 253 CheckDestroy: testAccCheckAWSS3BucketDestroy, 254 Steps: []resource.TestStep{ 255 resource.TestStep{ 256 Config: testAccAWSS3BucketDestroyedConfig(rInt), 257 Check: resource.ComposeTestCheckFunc( 258 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 259 testAccCheckAWSS3DestroyBucket("aws_s3_bucket.bucket"), 260 ), 261 ExpectNonEmptyPlan: true, 262 }, 263 }, 264 }) 265 } 266 267 func TestAccAWSS3Bucket_Versioning(t *testing.T) { 268 rInt := acctest.RandInt() 269 resource.Test(t, resource.TestCase{ 270 PreCheck: func() { testAccPreCheck(t) }, 271 Providers: testAccProviders, 272 CheckDestroy: testAccCheckAWSS3BucketDestroy, 273 Steps: []resource.TestStep{ 274 resource.TestStep{ 275 Config: testAccAWSS3BucketConfig(rInt), 276 Check: resource.ComposeTestCheckFunc( 277 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 278 testAccCheckAWSS3BucketVersioning( 279 "aws_s3_bucket.bucket", ""), 280 ), 281 }, 282 resource.TestStep{ 283 Config: testAccAWSS3BucketConfigWithVersioning(rInt), 284 Check: resource.ComposeTestCheckFunc( 285 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 286 testAccCheckAWSS3BucketVersioning( 287 "aws_s3_bucket.bucket", s3.BucketVersioningStatusEnabled), 288 ), 289 }, 290 resource.TestStep{ 291 Config: testAccAWSS3BucketConfigWithDisableVersioning(rInt), 292 Check: resource.ComposeTestCheckFunc( 293 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 294 testAccCheckAWSS3BucketVersioning( 295 "aws_s3_bucket.bucket", s3.BucketVersioningStatusSuspended), 296 ), 297 }, 298 }, 299 }) 300 } 301 302 func TestAccAWSS3Bucket_Cors(t *testing.T) { 303 rInt := acctest.RandInt() 304 resource.Test(t, resource.TestCase{ 305 PreCheck: func() { testAccPreCheck(t) }, 306 Providers: testAccProviders, 307 CheckDestroy: testAccCheckAWSS3BucketDestroy, 308 Steps: []resource.TestStep{ 309 resource.TestStep{ 310 Config: testAccAWSS3BucketConfigWithCORS(rInt), 311 Check: resource.ComposeTestCheckFunc( 312 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 313 testAccCheckAWSS3BucketCors( 314 "aws_s3_bucket.bucket", 315 []*s3.CORSRule{ 316 &s3.CORSRule{ 317 AllowedHeaders: []*string{aws.String("*")}, 318 AllowedMethods: []*string{aws.String("PUT"), aws.String("POST")}, 319 AllowedOrigins: []*string{aws.String("https://www.example.com")}, 320 ExposeHeaders: []*string{aws.String("x-amz-server-side-encryption"), aws.String("ETag")}, 321 MaxAgeSeconds: aws.Int64(3000), 322 }, 323 }, 324 ), 325 ), 326 }, 327 }, 328 }) 329 } 330 331 func TestAccAWSS3Bucket_Logging(t *testing.T) { 332 rInt := acctest.RandInt() 333 resource.Test(t, resource.TestCase{ 334 PreCheck: func() { testAccPreCheck(t) }, 335 Providers: testAccProviders, 336 CheckDestroy: testAccCheckAWSS3BucketDestroy, 337 Steps: []resource.TestStep{ 338 resource.TestStep{ 339 Config: testAccAWSS3BucketConfigWithLogging(rInt), 340 Check: resource.ComposeTestCheckFunc( 341 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 342 testAccCheckAWSS3BucketLogging( 343 "aws_s3_bucket.bucket", "aws_s3_bucket.log_bucket", "log/"), 344 ), 345 }, 346 }, 347 }) 348 } 349 350 func TestAccAWSS3Bucket_Lifecycle(t *testing.T) { 351 rInt := acctest.RandInt() 352 resource.Test(t, resource.TestCase{ 353 PreCheck: func() { testAccPreCheck(t) }, 354 Providers: testAccProviders, 355 CheckDestroy: testAccCheckAWSS3BucketDestroy, 356 Steps: []resource.TestStep{ 357 resource.TestStep{ 358 Config: testAccAWSS3BucketConfigWithLifecycle(rInt), 359 Check: resource.ComposeTestCheckFunc( 360 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 361 resource.TestCheckResourceAttr( 362 "aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"), 363 resource.TestCheckResourceAttr( 364 "aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"), 365 resource.TestCheckResourceAttr( 366 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.days", "365"), 367 resource.TestCheckResourceAttr( 368 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.date", ""), 369 resource.TestCheckResourceAttr( 370 "aws_s3_bucket.bucket", "lifecycle_rule.0.expiration.2613713285.expired_object_delete_marker", "false"), 371 resource.TestCheckResourceAttr( 372 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.date", ""), 373 resource.TestCheckResourceAttr( 374 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.days", "30"), 375 resource.TestCheckResourceAttr( 376 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.2000431762.storage_class", "STANDARD_IA"), 377 resource.TestCheckResourceAttr( 378 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.date", ""), 379 resource.TestCheckResourceAttr( 380 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.days", "60"), 381 resource.TestCheckResourceAttr( 382 "aws_s3_bucket.bucket", "lifecycle_rule.0.transition.6450812.storage_class", "GLACIER"), 383 resource.TestCheckResourceAttr( 384 "aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"), 385 resource.TestCheckResourceAttr( 386 "aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"), 387 resource.TestCheckResourceAttr( 388 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.date", "2016-01-12"), 389 resource.TestCheckResourceAttr( 390 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.days", "0"), 391 resource.TestCheckResourceAttr( 392 "aws_s3_bucket.bucket", "lifecycle_rule.1.expiration.2855832418.expired_object_delete_marker", "false"), 393 ), 394 }, 395 resource.TestStep{ 396 Config: testAccAWSS3BucketConfigWithVersioningLifecycle(rInt), 397 Check: resource.ComposeTestCheckFunc( 398 testAccCheckAWSS3BucketExists("aws_s3_bucket.bucket"), 399 resource.TestCheckResourceAttr( 400 "aws_s3_bucket.bucket", "lifecycle_rule.0.id", "id1"), 401 resource.TestCheckResourceAttr( 402 "aws_s3_bucket.bucket", "lifecycle_rule.0.prefix", "path1/"), 403 resource.TestCheckResourceAttr( 404 "aws_s3_bucket.bucket", "lifecycle_rule.0.enabled", "true"), 405 resource.TestCheckResourceAttr( 406 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_expiration.80908210.days", "365"), 407 resource.TestCheckResourceAttr( 408 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.days", "30"), 409 resource.TestCheckResourceAttr( 410 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.1377917700.storage_class", "STANDARD_IA"), 411 resource.TestCheckResourceAttr( 412 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.days", "60"), 413 resource.TestCheckResourceAttr( 414 "aws_s3_bucket.bucket", "lifecycle_rule.0.noncurrent_version_transition.2528035817.storage_class", "GLACIER"), 415 resource.TestCheckResourceAttr( 416 "aws_s3_bucket.bucket", "lifecycle_rule.1.id", "id2"), 417 resource.TestCheckResourceAttr( 418 "aws_s3_bucket.bucket", "lifecycle_rule.1.prefix", "path2/"), 419 resource.TestCheckResourceAttr( 420 "aws_s3_bucket.bucket", "lifecycle_rule.1.enabled", "false"), 421 resource.TestCheckResourceAttr( 422 "aws_s3_bucket.bucket", "lifecycle_rule.1.noncurrent_version_expiration.80908210.days", "365"), 423 ), 424 }, 425 }, 426 }) 427 } 428 429 func testAccCheckAWSS3BucketDestroy(s *terraform.State) error { 430 conn := testAccProvider.Meta().(*AWSClient).s3conn 431 432 for _, rs := range s.RootModule().Resources { 433 if rs.Type != "aws_s3_bucket" { 434 continue 435 } 436 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 437 Bucket: aws.String(rs.Primary.ID), 438 }) 439 if err != nil { 440 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NoSuchBucket" { 441 return nil 442 } 443 return err 444 } 445 } 446 return nil 447 } 448 449 func testAccCheckAWSS3BucketExists(n string) resource.TestCheckFunc { 450 return func(s *terraform.State) error { 451 rs, ok := s.RootModule().Resources[n] 452 if !ok { 453 return fmt.Errorf("Not found: %s", n) 454 } 455 456 if rs.Primary.ID == "" { 457 return fmt.Errorf("No S3 Bucket ID is set") 458 } 459 460 conn := testAccProvider.Meta().(*AWSClient).s3conn 461 _, err := conn.HeadBucket(&s3.HeadBucketInput{ 462 Bucket: aws.String(rs.Primary.ID), 463 }) 464 465 if err != nil { 466 return fmt.Errorf("S3Bucket error: %v", err) 467 } 468 return nil 469 } 470 } 471 472 func testAccCheckAWSS3DestroyBucket(n string) resource.TestCheckFunc { 473 return func(s *terraform.State) error { 474 rs, ok := s.RootModule().Resources[n] 475 if !ok { 476 return fmt.Errorf("Not found: %s", n) 477 } 478 479 if rs.Primary.ID == "" { 480 return fmt.Errorf("No S3 Bucket ID is set") 481 } 482 483 conn := testAccProvider.Meta().(*AWSClient).s3conn 484 _, err := conn.DeleteBucket(&s3.DeleteBucketInput{ 485 Bucket: aws.String(rs.Primary.ID), 486 }) 487 488 if err != nil { 489 return fmt.Errorf("Error destroying Bucket (%s) in testAccCheckAWSS3DestroyBucket: %s", rs.Primary.ID, err) 490 } 491 return nil 492 } 493 } 494 495 func testAccCheckAWSS3BucketPolicy(n string, policy string) resource.TestCheckFunc { 496 return func(s *terraform.State) error { 497 rs, _ := s.RootModule().Resources[n] 498 conn := testAccProvider.Meta().(*AWSClient).s3conn 499 500 out, err := conn.GetBucketPolicy(&s3.GetBucketPolicyInput{ 501 Bucket: aws.String(rs.Primary.ID), 502 }) 503 504 if err != nil { 505 if policy == "" { 506 // expected 507 return nil 508 } else { 509 return fmt.Errorf("GetBucketPolicy error: %v, expected %s", err, policy) 510 } 511 } 512 513 if v := out.Policy; v == nil { 514 if policy != "" { 515 return fmt.Errorf("bad policy, found nil, expected: %s", policy) 516 } 517 } else { 518 expected := make(map[string]interface{}) 519 if err := json.Unmarshal([]byte(policy), &expected); err != nil { 520 return err 521 } 522 actual := make(map[string]interface{}) 523 if err := json.Unmarshal([]byte(*v), &actual); err != nil { 524 return err 525 } 526 527 if !reflect.DeepEqual(expected, actual) { 528 return fmt.Errorf("bad policy, expected: %#v, got %#v", expected, actual) 529 } 530 } 531 532 return nil 533 } 534 } 535 536 func testAccCheckAWSS3BucketWebsite(n string, indexDoc string, errorDoc string, redirectProtocol string, redirectTo string) resource.TestCheckFunc { 537 return func(s *terraform.State) error { 538 rs, _ := s.RootModule().Resources[n] 539 conn := testAccProvider.Meta().(*AWSClient).s3conn 540 541 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 542 Bucket: aws.String(rs.Primary.ID), 543 }) 544 545 if err != nil { 546 if indexDoc == "" { 547 // If we want to assert that the website is not there, than 548 // this error is expected 549 return nil 550 } else { 551 return fmt.Errorf("S3BucketWebsite error: %v", err) 552 } 553 } 554 555 if v := out.IndexDocument; v == nil { 556 if indexDoc != "" { 557 return fmt.Errorf("bad index doc, found nil, expected: %s", indexDoc) 558 } 559 } else { 560 if *v.Suffix != indexDoc { 561 return fmt.Errorf("bad index doc, expected: %s, got %#v", indexDoc, out.IndexDocument) 562 } 563 } 564 565 if v := out.ErrorDocument; v == nil { 566 if errorDoc != "" { 567 return fmt.Errorf("bad error doc, found nil, expected: %s", errorDoc) 568 } 569 } else { 570 if *v.Key != errorDoc { 571 return fmt.Errorf("bad error doc, expected: %s, got %#v", errorDoc, out.ErrorDocument) 572 } 573 } 574 575 if v := out.RedirectAllRequestsTo; v == nil { 576 if redirectTo != "" { 577 return fmt.Errorf("bad redirect to, found nil, expected: %s", redirectTo) 578 } 579 } else { 580 if *v.HostName != redirectTo { 581 return fmt.Errorf("bad redirect to, expected: %s, got %#v", redirectTo, out.RedirectAllRequestsTo) 582 } 583 if redirectProtocol != "" && v.Protocol != nil && *v.Protocol != redirectProtocol { 584 return fmt.Errorf("bad redirect protocol to, expected: %s, got %#v", redirectProtocol, out.RedirectAllRequestsTo) 585 } 586 } 587 588 return nil 589 } 590 } 591 592 func testAccCheckAWSS3BucketWebsiteRoutingRules(n string, routingRules []*s3.RoutingRule) resource.TestCheckFunc { 593 return func(s *terraform.State) error { 594 rs, _ := s.RootModule().Resources[n] 595 conn := testAccProvider.Meta().(*AWSClient).s3conn 596 597 out, err := conn.GetBucketWebsite(&s3.GetBucketWebsiteInput{ 598 Bucket: aws.String(rs.Primary.ID), 599 }) 600 601 if err != nil { 602 if routingRules == nil { 603 return nil 604 } 605 return fmt.Errorf("GetBucketWebsite error: %v", err) 606 } 607 608 if !reflect.DeepEqual(out.RoutingRules, routingRules) { 609 return fmt.Errorf("bad routing rule, expected: %v, got %v", routingRules, out.RoutingRules) 610 } 611 612 return nil 613 } 614 } 615 616 func testAccCheckAWSS3BucketVersioning(n string, versioningStatus string) resource.TestCheckFunc { 617 return func(s *terraform.State) error { 618 rs, _ := s.RootModule().Resources[n] 619 conn := testAccProvider.Meta().(*AWSClient).s3conn 620 621 out, err := conn.GetBucketVersioning(&s3.GetBucketVersioningInput{ 622 Bucket: aws.String(rs.Primary.ID), 623 }) 624 625 if err != nil { 626 return fmt.Errorf("GetBucketVersioning error: %v", err) 627 } 628 629 if v := out.Status; v == nil { 630 if versioningStatus != "" { 631 return fmt.Errorf("bad error versioning status, found nil, expected: %s", versioningStatus) 632 } 633 } else { 634 if *v != versioningStatus { 635 return fmt.Errorf("bad error versioning status, expected: %s, got %s", versioningStatus, *v) 636 } 637 } 638 639 return nil 640 } 641 } 642 643 func testAccCheckAWSS3BucketCors(n string, corsRules []*s3.CORSRule) resource.TestCheckFunc { 644 return func(s *terraform.State) error { 645 rs, _ := s.RootModule().Resources[n] 646 conn := testAccProvider.Meta().(*AWSClient).s3conn 647 648 out, err := conn.GetBucketCors(&s3.GetBucketCorsInput{ 649 Bucket: aws.String(rs.Primary.ID), 650 }) 651 652 if err != nil { 653 return fmt.Errorf("GetBucketCors error: %v", err) 654 } 655 656 if !reflect.DeepEqual(out.CORSRules, corsRules) { 657 return fmt.Errorf("bad error cors rule, expected: %v, got %v", corsRules, out.CORSRules) 658 } 659 660 return nil 661 } 662 } 663 664 func testAccCheckAWSS3BucketLogging(n, b, p string) resource.TestCheckFunc { 665 return func(s *terraform.State) error { 666 rs, _ := s.RootModule().Resources[n] 667 conn := testAccProvider.Meta().(*AWSClient).s3conn 668 669 out, err := conn.GetBucketLogging(&s3.GetBucketLoggingInput{ 670 Bucket: aws.String(rs.Primary.ID), 671 }) 672 673 if err != nil { 674 return fmt.Errorf("GetBucketLogging error: %v", err) 675 } 676 677 tb, _ := s.RootModule().Resources[b] 678 679 if v := out.LoggingEnabled.TargetBucket; v == nil { 680 if tb.Primary.ID != "" { 681 return fmt.Errorf("bad target bucket, found nil, expected: %s", tb.Primary.ID) 682 } 683 } else { 684 if *v != tb.Primary.ID { 685 return fmt.Errorf("bad target bucket, expected: %s, got %s", tb.Primary.ID, *v) 686 } 687 } 688 689 if v := out.LoggingEnabled.TargetPrefix; v == nil { 690 if p != "" { 691 return fmt.Errorf("bad target prefix, found nil, expected: %s", p) 692 } 693 } else { 694 if *v != p { 695 return fmt.Errorf("bad target prefix, expected: %s, got %s", p, *v) 696 } 697 } 698 699 return nil 700 } 701 } 702 703 // These need a bit of randomness as the name can only be used once globally 704 // within AWS 705 func testAccWebsiteEndpoint(randInt int) string { 706 return fmt.Sprintf("tf-test-bucket-%d.s3-website-us-west-2.amazonaws.com", randInt) 707 } 708 709 func testAccAWSS3BucketPolicy(randInt int) string { 710 return fmt.Sprintf(`{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::tf-test-bucket-%d/*" } ] }`, randInt) 711 } 712 713 func testAccAWSS3BucketConfig(randInt int) string { 714 return fmt.Sprintf(` 715 resource "aws_s3_bucket" "bucket" { 716 bucket = "tf-test-bucket-%d" 717 acl = "public-read" 718 } 719 `, randInt) 720 } 721 722 func testAccAWSS3BucketWebsiteConfig(randInt int) string { 723 return fmt.Sprintf(` 724 resource "aws_s3_bucket" "bucket" { 725 bucket = "tf-test-bucket-%d" 726 acl = "public-read" 727 728 website { 729 index_document = "index.html" 730 } 731 } 732 `, randInt) 733 } 734 735 func testAccAWSS3BucketWebsiteConfigWithError(randInt int) string { 736 return fmt.Sprintf(` 737 resource "aws_s3_bucket" "bucket" { 738 bucket = "tf-test-bucket-%d" 739 acl = "public-read" 740 741 website { 742 index_document = "index.html" 743 error_document = "error.html" 744 } 745 } 746 `, randInt) 747 } 748 749 func testAccAWSS3BucketWebsiteConfigWithRedirect(randInt int) string { 750 return fmt.Sprintf(` 751 resource "aws_s3_bucket" "bucket" { 752 bucket = "tf-test-bucket-%d" 753 acl = "public-read" 754 755 website { 756 redirect_all_requests_to = "hashicorp.com" 757 } 758 } 759 `, randInt) 760 } 761 762 func testAccAWSS3BucketWebsiteConfigWithHttpsRedirect(randInt int) string { 763 return fmt.Sprintf(` 764 resource "aws_s3_bucket" "bucket" { 765 bucket = "tf-test-bucket-%d" 766 acl = "public-read" 767 768 website { 769 redirect_all_requests_to = "https://hashicorp.com" 770 } 771 } 772 `, randInt) 773 } 774 775 func testAccAWSS3BucketWebsiteConfigWithRoutingRules(randInt int) string { 776 return fmt.Sprintf(` 777 resource "aws_s3_bucket" "bucket" { 778 bucket = "tf-test-bucket-%d" 779 acl = "public-read" 780 781 website { 782 index_document = "index.html" 783 error_document = "error.html" 784 routing_rules = <<EOF 785 [{ 786 "Condition": { 787 "KeyPrefixEquals": "docs/" 788 }, 789 "Redirect": { 790 "ReplaceKeyPrefixWith": "documents/" 791 } 792 }] 793 EOF 794 } 795 } 796 `, randInt) 797 } 798 799 func testAccAWSS3BucketConfigWithPolicy(randInt int) string { 800 return fmt.Sprintf(` 801 resource "aws_s3_bucket" "bucket" { 802 bucket = "tf-test-bucket-%d" 803 acl = "public-read" 804 policy = %s 805 } 806 `, randInt, strconv.Quote(testAccAWSS3BucketPolicy(randInt))) 807 } 808 809 func testAccAWSS3BucketDestroyedConfig(randInt int) string { 810 return fmt.Sprintf(` 811 resource "aws_s3_bucket" "bucket" { 812 bucket = "tf-test-bucket-%d" 813 acl = "public-read" 814 } 815 `, randInt) 816 } 817 818 func testAccAWSS3BucketConfigWithEmptyPolicy(randInt int) string { 819 return fmt.Sprintf(` 820 resource "aws_s3_bucket" "bucket" { 821 bucket = "tf-test-bucket-%d" 822 acl = "public-read" 823 policy = "" 824 } 825 `, randInt) 826 } 827 828 func testAccAWSS3BucketConfigWithVersioning(randInt int) string { 829 return fmt.Sprintf(` 830 resource "aws_s3_bucket" "bucket" { 831 bucket = "tf-test-bucket-%d" 832 acl = "public-read" 833 versioning { 834 enabled = true 835 } 836 } 837 `, randInt) 838 } 839 840 func testAccAWSS3BucketConfigWithDisableVersioning(randInt int) string { 841 return fmt.Sprintf(` 842 resource "aws_s3_bucket" "bucket" { 843 bucket = "tf-test-bucket-%d" 844 acl = "public-read" 845 versioning { 846 enabled = false 847 } 848 } 849 `, randInt) 850 } 851 852 func testAccAWSS3BucketConfigWithCORS(randInt int) string { 853 return fmt.Sprintf(` 854 resource "aws_s3_bucket" "bucket" { 855 bucket = "tf-test-bucket-%d" 856 acl = "public-read" 857 cors_rule { 858 allowed_headers = ["*"] 859 allowed_methods = ["PUT","POST"] 860 allowed_origins = ["https://www.example.com"] 861 expose_headers = ["x-amz-server-side-encryption","ETag"] 862 max_age_seconds = 3000 863 } 864 } 865 `, randInt) 866 } 867 868 var testAccAWSS3BucketConfigWithAcl = ` 869 resource "aws_s3_bucket" "bucket" { 870 bucket = "tf-test-bucket-%d" 871 acl = "public-read" 872 } 873 ` 874 875 var testAccAWSS3BucketConfigWithAclUpdate = ` 876 resource "aws_s3_bucket" "bucket" { 877 bucket = "tf-test-bucket-%d" 878 acl = "private" 879 } 880 ` 881 882 func testAccAWSS3BucketConfigWithLogging(randInt int) string { 883 return fmt.Sprintf(` 884 resource "aws_s3_bucket" "log_bucket" { 885 bucket = "tf-test-log-bucket-%d" 886 acl = "log-delivery-write" 887 } 888 resource "aws_s3_bucket" "bucket" { 889 bucket = "tf-test-bucket-%d" 890 acl = "private" 891 logging { 892 target_bucket = "${aws_s3_bucket.log_bucket.id}" 893 target_prefix = "log/" 894 } 895 } 896 `, randInt, randInt) 897 } 898 899 func testAccAWSS3BucketConfigWithLifecycle(randInt int) string { 900 return fmt.Sprintf(` 901 resource "aws_s3_bucket" "bucket" { 902 bucket = "tf-test-bucket-%d" 903 acl = "private" 904 lifecycle_rule { 905 id = "id1" 906 prefix = "path1/" 907 enabled = true 908 909 expiration { 910 days = 365 911 } 912 913 transition { 914 days = 30 915 storage_class = "STANDARD_IA" 916 } 917 transition { 918 days = 60 919 storage_class = "GLACIER" 920 } 921 } 922 lifecycle_rule { 923 id = "id2" 924 prefix = "path2/" 925 enabled = true 926 927 expiration { 928 date = "2016-01-12" 929 } 930 } 931 } 932 `, randInt) 933 } 934 935 func testAccAWSS3BucketConfigWithVersioningLifecycle(randInt int) string { 936 return fmt.Sprintf(` 937 resource "aws_s3_bucket" "bucket" { 938 bucket = "tf-test-bucket-%d" 939 acl = "private" 940 versioning { 941 enabled = false 942 } 943 lifecycle_rule { 944 id = "id1" 945 prefix = "path1/" 946 enabled = true 947 948 noncurrent_version_expiration { 949 days = 365 950 } 951 noncurrent_version_transition { 952 days = 30 953 storage_class = "STANDARD_IA" 954 } 955 noncurrent_version_transition { 956 days = 60 957 storage_class = "GLACIER" 958 } 959 } 960 lifecycle_rule { 961 id = "id2" 962 prefix = "path2/" 963 enabled = false 964 965 noncurrent_version_expiration { 966 days = 365 967 } 968 } 969 } 970 `, randInt) 971 }