Add additional properties for google resource storage bucket object. (#14259)

This commit is contained in:
emily 2017-05-08 16:35:47 -07:00 committed by Dana Hoffman
parent 8b252d19ab
commit 64c2e68de9
3 changed files with 246 additions and 6 deletions

View File

@ -32,6 +32,37 @@ func resourceStorageBucketObject() *schema.Resource {
ForceNew: true,
},
"cache_control": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
},
"content_disposition": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
},
"content_encoding": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
},
"content_language": &schema.Schema{
Type: schema.TypeString,
ForceNew: true,
Optional: true,
},
"content_type": &schema.Schema{
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Computed: true,
},
"content": &schema.Schema{
Type: schema.TypeString,
Optional: true,
@ -62,6 +93,13 @@ func resourceStorageBucketObject() *schema.Resource {
ForceNew: true,
ConflictsWith: []string{"content"},
},
"storage_class": &schema.Schema{
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Computed: true,
},
},
}
}
@ -92,6 +130,30 @@ func resourceStorageBucketObjectCreate(d *schema.ResourceData, meta interface{})
objectsService := storage.NewObjectsService(config.clientStorage)
object := &storage.Object{Bucket: bucket}
if v, ok := d.GetOk("cache_control"); ok {
object.CacheControl = v.(string)
}
if v, ok := d.GetOk("content_disposition"); ok {
object.ContentDisposition = v.(string)
}
if v, ok := d.GetOk("content_encoding"); ok {
object.ContentEncoding = v.(string)
}
if v, ok := d.GetOk("content_language"); ok {
object.ContentLanguage = v.(string)
}
if v, ok := d.GetOk("content_type"); ok {
object.ContentType = v.(string)
}
if v, ok := d.GetOk("storage_class"); ok {
object.StorageClass = v.(string)
}
insertCall := objectsService.Insert(bucket, object)
insertCall.Name(name)
insertCall.Media(media)
@ -133,6 +195,12 @@ func resourceStorageBucketObjectRead(d *schema.ResourceData, meta interface{}) e
d.Set("md5hash", res.Md5Hash)
d.Set("crc32c", res.Crc32c)
d.Set("cache_control", res.CacheControl)
d.Set("content_disposition", res.ContentDisposition)
d.Set("content_encoding", res.ContentEncoding)
d.Set("content_language", res.ContentLanguage)
d.Set("content_type", res.ContentType)
d.Set("storage_class", res.StorageClass)
d.SetId(objectGetId(res))

View File

@ -64,7 +64,113 @@ func TestAccGoogleStorageObject_content(t *testing.T) {
Steps: []resource.TestStep{
resource.TestStep{
Config: testGoogleStorageBucketsObjectContent(bucketName),
Check: testAccCheckGoogleStorageObject(bucketName, objectName, data_md5),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleStorageObject(bucketName, objectName, data_md5),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "content_type", "text/plain; charset=utf-8"),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "storage_class", "STANDARD"),
),
},
},
})
}
func TestAccGoogleStorageObject_withContentCharacteristics(t *testing.T) {
bucketName := testBucketName()
data := []byte(content)
h := md5.New()
h.Write(data)
data_md5 := base64.StdEncoding.EncodeToString(h.Sum(nil))
ioutil.WriteFile(tf.Name(), data, 0644)
disposition, encoding, language, content_type := "inline", "compress", "en", "binary/octet-stream"
resource.Test(t, resource.TestCase{
PreCheck: func() {
if err != nil {
panic(err)
}
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccGoogleStorageObjectDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testGoogleStorageBucketsObject_optionalContentFields(
bucketName, disposition, encoding, language, content_type),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleStorageObject(bucketName, objectName, data_md5),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "content_disposition", disposition),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "content_encoding", encoding),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "content_language", language),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "content_type", content_type),
),
},
},
})
}
func TestAccGoogleStorageObject_cacheControl(t *testing.T) {
bucketName := testBucketName()
data := []byte(content)
h := md5.New()
h.Write(data)
data_md5 := base64.StdEncoding.EncodeToString(h.Sum(nil))
ioutil.WriteFile(tf.Name(), data, 0644)
cacheControl := "private"
resource.Test(t, resource.TestCase{
PreCheck: func() {
if err != nil {
panic(err)
}
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccGoogleStorageObjectDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testGoogleStorageBucketsObject_cacheControl(bucketName, cacheControl),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleStorageObject(bucketName, objectName, data_md5),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "cache_control", cacheControl),
),
},
},
})
}
func TestAccGoogleStorageObject_storageClass(t *testing.T) {
bucketName := testBucketName()
data := []byte(content)
h := md5.New()
h.Write(data)
data_md5 := base64.StdEncoding.EncodeToString(h.Sum(nil))
ioutil.WriteFile(tf.Name(), data, 0644)
storageClass := "MULTI_REGIONAL"
resource.Test(t, resource.TestCase{
PreCheck: func() {
if err != nil {
panic(err)
}
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccGoogleStorageObjectDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testGoogleStorageBucketsObject_storageClass(bucketName, storageClass),
Check: resource.ComposeTestCheckFunc(
testAccCheckGoogleStorageObject(bucketName, objectName, data_md5),
resource.TestCheckResourceAttr(
"google_storage_bucket_object.object", "storage_class", storageClass),
),
},
},
})
@ -129,6 +235,7 @@ resource "google_storage_bucket_object" "object" {
}
`, bucketName, objectName, content)
}
func testGoogleStorageBucketsObjectBasic(bucketName string) string {
return fmt.Sprintf(`
resource "google_storage_bucket" "bucket" {
@ -143,3 +250,52 @@ resource "google_storage_bucket_object" "object" {
}
`, bucketName, objectName, tf.Name())
}
func testGoogleStorageBucketsObject_optionalContentFields(
bucketName, disposition, encoding, language, content_type string) string {
return fmt.Sprintf(`
resource "google_storage_bucket" "bucket" {
name = "%s"
}
resource "google_storage_bucket_object" "object" {
name = "%s"
bucket = "${google_storage_bucket.bucket.name}"
content = "%s"
content_disposition = "%s"
content_encoding = "%s"
content_language = "%s"
content_type = "%s"
}
`, bucketName, objectName, content, disposition, encoding, language, content_type)
}
func testGoogleStorageBucketsObject_cacheControl(bucketName, cacheControl string) string {
return fmt.Sprintf(`
resource "google_storage_bucket" "bucket" {
name = "%s"
}
resource "google_storage_bucket_object" "object" {
name = "%s"
bucket = "${google_storage_bucket.bucket.name}"
source = "%s"
cache_control = "%s"
}
`, bucketName, objectName, tf.Name(), cacheControl)
}
func testGoogleStorageBucketsObject_storageClass(bucketName string, storageClass string) string {
return fmt.Sprintf(`
resource "google_storage_bucket" "bucket" {
name = "%s"
}
resource "google_storage_bucket_object" "object" {
name = "%s"
bucket = "${google_storage_bucket.bucket.name}"
content = "%s"
storage_class = "%s"
}
`, bucketName, objectName, content, storageClass)
}

View File

@ -8,7 +8,7 @@ description: |-
# google\_storage\_bucket\_object
Creates a new object inside an exisiting bucket in Google cloud storage service (GCS). Currently, it does not support creating custom ACLs. For more information see [the official documentation](https://cloud.google.com/storage/docs/overview) and [API](https://cloud.google.com/storage/docs/json_api).
Creates a new object inside an existing bucket in Google cloud storage service (GCS). Currently, it does not support creating custom ACLs. For more information see [the official documentation](https://cloud.google.com/storage/docs/overview) and [API](https://cloud.google.com/storage/docs/json_api).
## Example Usage
@ -31,17 +31,33 @@ The following arguments are supported:
* `name` - (Required) The name of the object.
- - -
One of the following is required:
* `content` - (Optional) Data as `string` to be uploaded. Must be defined if
`source` is not.
* `source` - (Optional) A path to the data you want to upload. Must be defined
if `content` is not.
- - -
* `cache_control` - (Optional) [Cache-Control](https://tools.ietf.org/html/rfc7234#section-5.2)
directive to specify caching behavior of object data. If omitted and object is accessible to all anonymous users, the default will be public, max-age=3600
* `content_disposition` - (Optional) [Content-Disposition](https://tools.ietf.org/html/rfc6266) of the object data.
* `content_encoding` - (Optional) [Content-Encoding](https://tools.ietf.org/html/rfc7231#section-3.1.2.2) of the object data.
* `content_language` - (Optional) [Content-Language](https://tools.ietf.org/html/rfc7231#section-3.1.3.2) of the object data.
* `content_type` - (Optional) [Content-Type](https://tools.ietf.org/html/rfc7231#section-3.1.1.5) of the object data. Defaults to "application/octet-stream" or "text/plain; charset=utf-8".
* `predefined_acl` - (Optional, Deprecated) The [canned GCS ACL](https://cloud.google.com/storage/docs/access-control#predefined-acl) apply. Please switch
to `google_storage_object_acl.predefined_acl`.
* `source` - (Optional) A path to the data you want to upload. Must be defined
if `content` is not.
* `storage_class` - (Optional) The [StorageClass](https://cloud.google.com/storage/docs/storage-classes) of the new bucket object.
Supported values include: `MULTI_REGIONAL`, `REGIONAL`, `NEARLINE`, `COLDLINE`. If not provided, this defaults to the bucket's default
storage class or to a [standard](https://cloud.google.com/storage/docs/storage-classes#standard) class.
## Attributes Reference