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