Skip to content

Commit 43e749c

Browse files
Stelminatorrosbo
authored andcommitted
Add versioning for google storage buckets (#381)
1 parent b1879b2 commit 43e749c

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed

google/resource_storage_bucket.go

+52
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,21 @@ func resourceStorageBucket() *schema.Resource {
141141
},
142142
},
143143

144+
"versioning": &schema.Schema{
145+
Type: schema.TypeList,
146+
Optional: true,
147+
MaxItems: 1,
148+
Elem: &schema.Resource{
149+
Schema: map[string]*schema.Schema{
150+
"enabled": {
151+
Type: schema.TypeBool,
152+
Optional: true,
153+
Default: false,
154+
},
155+
},
156+
},
157+
},
158+
144159
"website": &schema.Schema{
145160
Type: schema.TypeList,
146161
Optional: true,
@@ -218,6 +233,10 @@ func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error
218233
return err
219234
}
220235

236+
if v, ok := d.GetOk("versioning"); ok {
237+
sb.Versioning = expandBucketVersioning(v)
238+
}
239+
221240
if v, ok := d.GetOk("website"); ok {
222241
websites := v.([]interface{})
223242

@@ -282,6 +301,12 @@ func resourceStorageBucketUpdate(d *schema.ResourceData, meta interface{}) error
282301
}
283302
}
284303

304+
if d.HasChange("versioning") {
305+
if v, ok := d.GetOk("versioning"); ok {
306+
sb.Versioning = expandBucketVersioning(v)
307+
}
308+
}
309+
285310
if d.HasChange("website") {
286311
if v, ok := d.GetOk("website"); ok {
287312
websites := v.([]interface{})
@@ -351,6 +376,7 @@ func resourceStorageBucketRead(d *schema.ResourceData, meta interface{}) error {
351376
d.Set("storage_class", res.StorageClass)
352377
d.Set("location", res.Location)
353378
d.Set("cors", flattenCors(res.Cors))
379+
d.Set("versioning", flattenBucketVersioning(res.Versioning))
354380
d.SetId(res.Id)
355381
return nil
356382
}
@@ -448,6 +474,32 @@ func flattenCors(corsRules []*storage.BucketCors) []map[string]interface{} {
448474
return corsRulesSchema
449475
}
450476

477+
func expandBucketVersioning(configured interface{}) *storage.BucketVersioning {
478+
versionings := configured.([]interface{})
479+
versioning := versionings[0].(map[string]interface{})
480+
481+
bucketVersioning := &storage.BucketVersioning{}
482+
483+
bucketVersioning.Enabled = versioning["enabled"].(bool)
484+
bucketVersioning.ForceSendFields = append(bucketVersioning.ForceSendFields, "Enabled")
485+
486+
return bucketVersioning
487+
}
488+
489+
func flattenBucketVersioning(bucketVersioning *storage.BucketVersioning) []map[string]interface{} {
490+
versionings := make([]map[string]interface{}, 0, 1)
491+
492+
if bucketVersioning == nil {
493+
return versionings
494+
}
495+
496+
versioning := map[string]interface{}{
497+
"enabled": bucketVersioning.Enabled,
498+
}
499+
versionings = append(versionings, versioning)
500+
return versionings
501+
}
502+
451503
func resourceGCSBucketLifecycleCreateOrUpdate(d *schema.ResourceData, sb *storage.Bucket) error {
452504
if v, ok := d.GetOk("lifecycle_rule"); ok {
453505
lifecycle_rules := v.([]interface{})

google/resource_storage_bucket_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,30 @@ func TestAccStorageBucket_forceDestroy(t *testing.T) {
325325
})
326326
}
327327

328+
func TestAccStorageBucket_versioning(t *testing.T) {
329+
var bucket storage.Bucket
330+
bucketName := fmt.Sprintf("tf-test-acl-bucket-%d", acctest.RandInt())
331+
332+
resource.Test(t, resource.TestCase{
333+
PreCheck: func() { testAccPreCheck(t) },
334+
Providers: testAccProviders,
335+
CheckDestroy: testAccStorageBucketDestroy,
336+
Steps: []resource.TestStep{
337+
resource.TestStep{
338+
Config: testAccStorageBucket_versioning(bucketName),
339+
Check: resource.ComposeTestCheckFunc(
340+
testAccCheckStorageBucketExists(
341+
"google_storage_bucket.bucket", bucketName, &bucket),
342+
resource.TestCheckResourceAttr(
343+
"google_storage_bucket.bucket", "versioning.#", "1"),
344+
resource.TestCheckResourceAttr(
345+
"google_storage_bucket.bucket", "versioning.0.enabled", "true"),
346+
),
347+
},
348+
},
349+
})
350+
}
351+
328352
func TestAccStorageBucket_cors(t *testing.T) {
329353
var bucket storage.Bucket
330354
bucketName := fmt.Sprintf("tf-test-acl-bucket-%d", acctest.RandInt())
@@ -590,6 +614,17 @@ resource "google_storage_bucket" "bucket" {
590614
`, bucketName)
591615
}
592616

617+
func testAccStorageBucket_versioning(bucketName string) string {
618+
return fmt.Sprintf(`
619+
resource "google_storage_bucket" "bucket" {
620+
name = "%s"
621+
versioning = {
622+
enabled = "true"
623+
}
624+
}
625+
`, bucketName)
626+
}
627+
593628
func testAccStorageBucket_lifecycleRules(bucketName string) string {
594629
return fmt.Sprintf(`
595630
resource "google_storage_bucket" "bucket" {

website/docs/r/storage_bucket.html.markdown

+6
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ to `google_storage_bucket_acl.predefined_acl`.
5858

5959
* `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.
6060

61+
* `versioning` - (Optional) The bucket's [Versioning](https://cloud.google.com/storage/docs/object-versioning) configuration.
62+
6163
* `website` - (Optional) Configuration if the bucket acts as a website. Structure is documented below.
6264

6365
* `cors` - (Optional) The bucket's [Cross-Origin Resource Sharing (CORS)](https://www.w3.org/TR/cors/) configuration. Multiple blocks of this type are permitted. Structure is documented below.
@@ -86,6 +88,10 @@ The `condition` block supports the following elements, and requires at least one
8688

8789
* `num_newer_versions` - (Optional) Relevant only for versioned objects. The number of newer versions of an object to satisfy this condition.
8890

91+
The `versioning` block supports:
92+
93+
* `enabled` - (Optional) While set to `true`, versioning is fully enabled for this bucket.
94+
8995
The `website` block supports:
9096

9197
* `main_page_suffix` - (Optional) Behaves as the bucket's directory index where

0 commit comments

Comments
 (0)