provider/google: Content field for bucket objects

This commit is contained in:
Lars Wander 2015-11-12 16:20:08 -05:00 committed by Lars Wander
parent 39ae38c627
commit c54966cf7b
2 changed files with 71 additions and 10 deletions

View File

@ -1,7 +1,9 @@
package google
import (
"bytes"
"fmt"
"io"
"log"
"os"
@ -23,26 +25,39 @@ func resourceStorageBucketObject() *schema.Resource {
Required: true,
ForceNew: true,
},
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"source": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"content"},
},
"content": &schema.Schema{
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"source"},
},
"predefined_acl": &schema.Schema{
Type: schema.TypeString,
Deprecated: "Please use resource \"storage_object_acl.predefined_acl\" instead.",
Optional: true,
ForceNew: true,
},
"md5hash": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
"crc32c": &schema.Schema{
Type: schema.TypeString,
Computed: true,
@ -60,11 +75,18 @@ func resourceStorageBucketObjectCreate(d *schema.ResourceData, meta interface{})
bucket := d.Get("bucket").(string)
name := d.Get("name").(string)
source := d.Get("source").(string)
var media io.Reader
file, err := os.Open(source)
if err != nil {
return fmt.Errorf("Error opening %s: %s", source, err)
if v, ok := d.GetOk("source"); ok {
err := error(nil)
media, err = os.Open(v.(string))
if err != nil {
return err
}
} else if v, ok := d.GetOk("content"); ok {
media = bytes.NewReader([]byte(v.(string)))
} else {
return fmt.Errorf("Error, either \"content\" or \"string\" must be specified")
}
objectsService := storage.NewObjectsService(config.clientStorage)
@ -72,15 +94,15 @@ func resourceStorageBucketObjectCreate(d *schema.ResourceData, meta interface{})
insertCall := objectsService.Insert(bucket, object)
insertCall.Name(name)
insertCall.Media(file)
insertCall.Media(media)
if v, ok := d.GetOk("predefined_acl"); ok {
insertCall.PredefinedAcl(v.(string))
}
_, err = insertCall.Do()
_, err := insertCall.Do()
if err != nil {
return fmt.Errorf("Error uploading contents of object %s from %s: %s", name, source, err)
return fmt.Errorf("Error uploading object %s: %s", name, err)
}
return resourceStorageBucketObjectRead(d, meta)

View File

@ -16,6 +16,7 @@ import (
var tf, err = ioutil.TempFile("", "tf-gce-test")
var bucketName = "tf-gce-bucket-test"
var objectName = "tf-gce-test"
var content = "now this is content!"
func TestAccGoogleStorageObject_basic(t *testing.T) {
data := []byte("data data data")
@ -42,6 +43,31 @@ func TestAccGoogleStorageObject_basic(t *testing.T) {
})
}
func TestAccGoogleStorageObject_content(t *testing.T) {
data := []byte(content)
h := md5.New()
h.Write(data)
data_md5 := base64.StdEncoding.EncodeToString(h.Sum(nil))
ioutil.WriteFile(tf.Name(), data, 0644)
resource.Test(t, resource.TestCase{
PreCheck: func() {
if err != nil {
panic(err)
}
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccGoogleStorageObjectDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testGoogleStorageBucketsObjectContent,
Check: testAccCheckGoogleStorageObject(bucketName, objectName, data_md5),
},
},
})
}
func testAccCheckGoogleStorageObject(bucket, object, md5 string) resource.TestCheckFunc {
return func(s *terraform.State) error {
config := testAccProvider.Meta().(*Config)
@ -87,6 +113,19 @@ func testAccGoogleStorageObjectDestroy(s *terraform.State) error {
return nil
}
var testGoogleStorageBucketsObjectContent = 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"
predefined_acl = "projectPrivate"
}
`, bucketName, objectName, content)
var testGoogleStorageBucketsObjectBasic = fmt.Sprintf(`
resource "google_storage_bucket" "bucket" {
name = "%s"