|
9 | 9 | "time"
|
10 | 10 |
|
11 | 11 | "github.com/hashicorp/terraform-plugin-testing/helper/resource"
|
| 12 | + "github.com/hashicorp/terraform-plugin-testing/plancheck" |
12 | 13 | "github.com/hashicorp/terraform-plugin-testing/terraform"
|
13 | 14 |
|
14 | 15 | "github.com/hashicorp/terraform-provider-google/google/acctest"
|
@@ -1545,6 +1546,147 @@ func TestAccStorageBucket_SoftDeletePolicy(t *testing.T) {
|
1545 | 1546 | })
|
1546 | 1547 | }
|
1547 | 1548 |
|
| 1549 | +// testcase to create HNS bucket and |
| 1550 | +// forcenew to recreate the bucket if HNS set to false |
| 1551 | +func TestAccStorageBucket_basic_hns(t *testing.T) { |
| 1552 | + t.Parallel() |
| 1553 | + |
| 1554 | + bucketName := acctest.TestBucketName(t) |
| 1555 | + acctest.VcrTest(t, resource.TestCase{ |
| 1556 | + PreCheck: func() { acctest.AccTestPreCheck(t) }, |
| 1557 | + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), |
| 1558 | + CheckDestroy: testAccStorageBucketDestroyProducer(t), |
| 1559 | + Steps: []resource.TestStep{ |
| 1560 | + { |
| 1561 | + Config: testAccStorageBucket_basic_hns(bucketName, true), |
| 1562 | + Check: resource.ComposeTestCheckFunc( |
| 1563 | + resource.TestCheckResourceAttr( |
| 1564 | + "google_storage_bucket.bucket", "hierarchical_namespace.0.enabled", "true"), |
| 1565 | + ), |
| 1566 | + }, |
| 1567 | + { |
| 1568 | + ResourceName: "google_storage_bucket.bucket", |
| 1569 | + ImportState: true, |
| 1570 | + ImportStateVerify: true, |
| 1571 | + ImportStateVerifyIgnore: []string{"force_destroy"}, |
| 1572 | + }, |
| 1573 | + { |
| 1574 | + Config: testAccStorageBucket_basic_hns_with_data(bucketName, false), |
| 1575 | + }, |
| 1576 | + { |
| 1577 | + ResourceName: "google_storage_bucket.bucket", |
| 1578 | + ImportState: true, |
| 1579 | + ImportStateVerify: true, |
| 1580 | + ImportStateVerifyIgnore: []string{"force_destroy"}, |
| 1581 | + }, |
| 1582 | + { |
| 1583 | + Config: testAccStorageBucket_uniformBucketAccessOnly(bucketName, true), |
| 1584 | + ConfigPlanChecks: resource.ConfigPlanChecks{ |
| 1585 | + PreApply: []plancheck.PlanCheck{ |
| 1586 | + plancheck.ExpectEmptyPlan(), |
| 1587 | + }, |
| 1588 | + }, |
| 1589 | + }, |
| 1590 | + { |
| 1591 | + ResourceName: "google_storage_bucket.bucket", |
| 1592 | + ImportState: true, |
| 1593 | + ImportStateVerify: true, |
| 1594 | + ImportStateVerifyIgnore: []string{"force_destroy"}, |
| 1595 | + }, |
| 1596 | + }, |
| 1597 | + }) |
| 1598 | +} |
| 1599 | + |
| 1600 | +func TestAccStorageBucket_hns_force_destroy(t *testing.T) { |
| 1601 | + t.Parallel() |
| 1602 | + |
| 1603 | + bucketName := acctest.TestBucketName(t) |
| 1604 | + |
| 1605 | + acctest.VcrTest(t, resource.TestCase{ |
| 1606 | + PreCheck: func() { acctest.AccTestPreCheck(t) }, |
| 1607 | + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), |
| 1608 | + CheckDestroy: testAccStorageBucketDestroyProducer(t), |
| 1609 | + Steps: []resource.TestStep{ |
| 1610 | + { |
| 1611 | + Config: testAccStorageBucket_basic_hns_with_data(bucketName, true), |
| 1612 | + Check: resource.ComposeTestCheckFunc( |
| 1613 | + testAccCheckStorageBucketPutFolderItem(t, bucketName), |
| 1614 | + ), |
| 1615 | + }, |
| 1616 | + }, |
| 1617 | + }) |
| 1618 | +} |
| 1619 | + |
| 1620 | +func testAccCheckStorageBucketPutFolderItem(t *testing.T, bucketName string) resource.TestCheckFunc { |
| 1621 | + return func(s *terraform.State) error { |
| 1622 | + config := acctest.GoogleProviderConfig(t) |
| 1623 | + |
| 1624 | + data := bytes.NewBufferString("test") |
| 1625 | + dataReader := bytes.NewReader(data.Bytes()) |
| 1626 | + folderName := fmt.Sprintf("tf-test/tf-test-folder-%d/", acctest.RandInt(t)) |
| 1627 | + emptyfolderName := fmt.Sprintf("tf-test/tf-test-folder-%d/", acctest.RandInt(t)) |
| 1628 | + object := &storage.Object{Name: folderName + "bucketDestroyTestFile"} |
| 1629 | + |
| 1630 | + folder := storage.Folder{ |
| 1631 | + Bucket: bucketName, |
| 1632 | + Name: folderName, |
| 1633 | + } |
| 1634 | + |
| 1635 | + emptyFolder := storage.Folder{ |
| 1636 | + Bucket: bucketName, |
| 1637 | + Name: emptyfolderName, |
| 1638 | + } |
| 1639 | + |
| 1640 | + if res, err := config.NewStorageClient(config.UserAgent).Folders.Insert(bucketName, &folder).Recursive(true).Do(); err == nil { |
| 1641 | + log.Printf("[INFO] Created folder %v at location %v\n\n", res.Name, res.SelfLink) |
| 1642 | + } else { |
| 1643 | + return fmt.Errorf("Folders.Insert failed: %v", err) |
| 1644 | + } |
| 1645 | + |
| 1646 | + // This needs to use Media(io.Reader) call, otherwise it does not go to /upload API and fails |
| 1647 | + if res, err := config.NewStorageClient(config.UserAgent).Objects.Insert(bucketName, object).Media(dataReader).Do(); err == nil { |
| 1648 | + log.Printf("[INFO] Created object %v at location %v\n\n", res.Name, res.SelfLink) |
| 1649 | + } else { |
| 1650 | + return fmt.Errorf("Objects.Insert failed: %v", err) |
| 1651 | + } |
| 1652 | + |
| 1653 | + if res, err := config.NewStorageClient(config.UserAgent).Folders.Insert(bucketName, &emptyFolder).Recursive(true).Do(); err == nil { |
| 1654 | + log.Printf("[INFO] Created folder %v at location %v\n\n", res.Name, res.SelfLink) |
| 1655 | + } else { |
| 1656 | + return fmt.Errorf("Folders.Insert failed: %v", err) |
| 1657 | + } |
| 1658 | + |
| 1659 | + return nil |
| 1660 | + } |
| 1661 | +} |
| 1662 | + |
| 1663 | +func testAccStorageBucket_basic_hns(bucketName string, enabled bool) string { |
| 1664 | + return fmt.Sprintf(` |
| 1665 | +resource "google_storage_bucket" "bucket" { |
| 1666 | + name = "%s" |
| 1667 | + location = "US" |
| 1668 | + uniform_bucket_level_access = true |
| 1669 | + hierarchical_namespace { |
| 1670 | + enabled = %t |
| 1671 | + } |
| 1672 | +} |
| 1673 | +`, bucketName, enabled) |
| 1674 | +} |
| 1675 | + |
| 1676 | +func testAccStorageBucket_basic_hns_with_data(bucketName string, enabled bool) string { |
| 1677 | + return fmt.Sprintf(` |
| 1678 | +resource "google_storage_bucket" "bucket" { |
| 1679 | + name = "%s" |
| 1680 | + location = "US" |
| 1681 | + uniform_bucket_level_access = true |
| 1682 | + hierarchical_namespace { |
| 1683 | + enabled = %t |
| 1684 | + } |
| 1685 | + force_destroy= true |
| 1686 | +} |
| 1687 | +`, bucketName, enabled) |
| 1688 | +} |
| 1689 | + |
1548 | 1690 | func testAccCheckStorageBucketExists(t *testing.T, n string, bucketName string, bucket *storage.Bucket) resource.TestCheckFunc {
|
1549 | 1691 | return func(s *terraform.State) error {
|
1550 | 1692 | rs, ok := s.RootModule().Resources[n]
|
|
0 commit comments