Skip to content

Commit 7fdea1d

Browse files
Add Support for Storage Autoclass (#6870) (#13185)
Fixes #13044 Signed-off-by: Modular Magician <[email protected]> Signed-off-by: Modular Magician <[email protected]>
1 parent 2ae4cf2 commit 7fdea1d

File tree

4 files changed

+109
-0
lines changed

4 files changed

+109
-0
lines changed

.changelog/6870.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
storage: added support for `autoclass` in `google_storage_bucket` resource
3+
```

google/resource_storage_bucket.go

+61
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,24 @@ func resourceStorageBucket() *schema.Resource {
247247
Description: `The bucket's Versioning configuration.`,
248248
},
249249

250+
"autoclass": {
251+
Type: schema.TypeList,
252+
Optional: true,
253+
MaxItems: 1,
254+
ForceNew: true,
255+
Elem: &schema.Resource{
256+
Schema: map[string]*schema.Schema{
257+
"enabled": {
258+
Type: schema.TypeBool,
259+
Required: true,
260+
ForceNew: true,
261+
Description: `While set to true, autoclass automatically transitions objects in your bucket to appropriate storage classes based on each object's access pattern.`,
262+
},
263+
},
264+
},
265+
Description: `The bucket's autoclass configuration.`,
266+
},
267+
250268
"website": {
251269
Type: schema.TypeList,
252270
Optional: true,
@@ -475,6 +493,10 @@ func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error
475493
sb.Versioning = expandBucketVersioning(v)
476494
}
477495

496+
if v, ok := d.GetOk("autoclass"); ok {
497+
sb.Autoclass = expandBucketAutoclass(v)
498+
}
499+
478500
if v, ok := d.GetOk("website"); ok {
479501
sb.Website = expandBucketWebsite(v.([]interface{}))
480502
}
@@ -599,6 +621,12 @@ func resourceStorageBucketUpdate(d *schema.ResourceData, meta interface{}) error
599621
}
600622
}
601623

624+
if d.HasChange("autoclass") {
625+
if v, ok := d.GetOk("autoclass"); ok {
626+
sb.Autoclass = expandBucketAutoclass(v)
627+
}
628+
}
629+
602630
if d.HasChange("website") {
603631
sb.Website = expandBucketWebsite(d.Get("website"))
604632
}
@@ -1047,6 +1075,22 @@ func expandBucketVersioning(configured interface{}) *storage.BucketVersioning {
10471075
return bucketVersioning
10481076
}
10491077

1078+
func expandBucketAutoclass(configured interface{}) *storage.BucketAutoclass {
1079+
autoclassList := configured.([]interface{})
1080+
if len(autoclassList) == 0 {
1081+
return nil
1082+
}
1083+
1084+
autoclass := autoclassList[0].(map[string]interface{})
1085+
1086+
bucketAutoclass := &storage.BucketAutoclass{}
1087+
1088+
bucketAutoclass.Enabled = autoclass["enabled"].(bool)
1089+
bucketAutoclass.ForceSendFields = append(bucketAutoclass.ForceSendFields, "Enabled")
1090+
1091+
return bucketAutoclass
1092+
}
1093+
10501094
func flattenBucketVersioning(bucketVersioning *storage.BucketVersioning) []map[string]interface{} {
10511095
versionings := make([]map[string]interface{}, 0, 1)
10521096

@@ -1061,6 +1105,20 @@ func flattenBucketVersioning(bucketVersioning *storage.BucketVersioning) []map[s
10611105
return versionings
10621106
}
10631107

1108+
func flattenBucketAutoclass(bucketAutoclass *storage.BucketAutoclass) []map[string]interface{} {
1109+
autoclassList := make([]map[string]interface{}, 0, 1)
1110+
1111+
if bucketAutoclass == nil {
1112+
return autoclassList
1113+
}
1114+
1115+
autoclass := map[string]interface{}{
1116+
"enabled": bucketAutoclass.Enabled,
1117+
}
1118+
autoclassList = append(autoclassList, autoclass)
1119+
return autoclassList
1120+
}
1121+
10641122
func flattenBucketLifecycle(lifecycle *storage.BucketLifecycle) []map[string]interface{} {
10651123
if lifecycle == nil || lifecycle.Rule == nil {
10661124
return []map[string]interface{}{}
@@ -1499,6 +1557,9 @@ func setStorageBucket(d *schema.ResourceData, config *Config, res *storage.Bucke
14991557
if err := d.Set("versioning", flattenBucketVersioning(res.Versioning)); err != nil {
15001558
return fmt.Errorf("Error setting versioning: %s", err)
15011559
}
1560+
if err := d.Set("autoclass", flattenBucketAutoclass(res.Autoclass)); err != nil {
1561+
return fmt.Errorf("Error setting autoclass: %s", err)
1562+
}
15021563
if err := d.Set("lifecycle_rule", flattenBucketLifecycle(res.Lifecycle)); err != nil {
15031564
return fmt.Errorf("Error setting lifecycle_rule: %s", err)
15041565
}

google/resource_storage_bucket_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,33 @@ func TestAccStorageBucket_basic(t *testing.T) {
5353
})
5454
}
5555

56+
func TestAccStorageBucket_basicWithAutoclass(t *testing.T) {
57+
t.Parallel()
58+
59+
bucketName := testBucketName(t)
60+
61+
vcrTest(t, resource.TestCase{
62+
PreCheck: func() { testAccPreCheck(t) },
63+
Providers: testAccProviders,
64+
CheckDestroy: testAccStorageBucketDestroyProducer(t),
65+
Steps: []resource.TestStep{
66+
{
67+
Config: testAccStorageBucket_basicWithAutoclass(bucketName),
68+
Check: resource.ComposeTestCheckFunc(
69+
resource.TestCheckResourceAttr(
70+
"google_storage_bucket.bucket", "force_destroy", "false"),
71+
),
72+
},
73+
{
74+
ResourceName: "google_storage_bucket.bucket",
75+
ImportState: true,
76+
ImportStateVerify: true,
77+
ImportStateVerifyIgnore: []string{"force_destroy"},
78+
},
79+
},
80+
})
81+
}
82+
5683
func TestAccStorageBucket_requesterPays(t *testing.T) {
5784
t.Parallel()
5885

@@ -1329,6 +1356,18 @@ resource "google_storage_bucket" "bucket" {
13291356
`, bucketName)
13301357
}
13311358

1359+
func testAccStorageBucket_basicWithAutoclass(bucketName string) string {
1360+
return fmt.Sprintf(`
1361+
resource "google_storage_bucket" "bucket" {
1362+
name = "%s"
1363+
location = "US"
1364+
autoclass {
1365+
enabled = true
1366+
}
1367+
}
1368+
`, bucketName)
1369+
}
1370+
13321371
func testAccStorageBucket_requesterPays(bucketName string, pays bool) string {
13331372
return fmt.Sprintf(`
13341373
resource "google_storage_bucket" "bucket" {

website/docs/r/storage_bucket.html.markdown

+6
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ The following arguments are supported:
101101

102102
* `storage_class` - (Optional, Default: 'STANDARD') The [Storage Class](https://cloud.google.com/storage/docs/storage-classes) of the new bucket. Supported values include: `STANDARD`, `MULTI_REGIONAL`, `REGIONAL`, `NEARLINE`, `COLDLINE`, `ARCHIVE`.
103103

104+
* `autoclass` - (Optional) The bucket's [Autoclass](https://cloud.google.com/storage/docs/autoclass) configuration. Structure is [documented below](#nested_autoclass).
105+
104106
* `lifecycle_rule` - (Optional) The bucket's [Lifecycle Rules](https://cloud.google.com/storage/docs/lifecycle#configuration) configuration. Multiple blocks of this type are permitted. Structure is [documented below](#nested_lifecycle_rule).
105107

106108
* `versioning` - (Optional) The bucket's [Versioning](https://cloud.google.com/storage/docs/object-versioning) configuration. Structure is [documented below](#nested_versioning).
@@ -163,6 +165,10 @@ The following arguments are supported:
163165

164166
* `noncurrent_time_before` - (Optional) Relevant only for versioned objects. The date in RFC 3339 (e.g. `2017-06-13`) when the object became nonconcurrent.
165167

168+
<a name="nested_autoclass"></a>The `autoclass` block supports:
169+
170+
* `enabled` - (Required) While set to `true`, autoclass automatically transitions objects in your bucket to appropriate storage classes based on each object's access pattern.
171+
166172
<a name="nested_versioning"></a>The `versioning` block supports:
167173

168174
* `enabled` - (Required) While set to `true`, versioning is fully enabled for this bucket.

0 commit comments

Comments
 (0)