133 lines
3.1 KiB
Go
133 lines
3.1 KiB
Go
|
package google
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/hashicorp/terraform/helper/schema"
|
||
|
|
||
|
"google.golang.org/api/storage/v1"
|
||
|
)
|
||
|
|
||
|
func resourceStorageBucketObject() *schema.Resource {
|
||
|
return &schema.Resource{
|
||
|
Create: resourceStorageBucketObjectCreate,
|
||
|
Read: resourceStorageBucketObjectRead,
|
||
|
Update: resourceStorageBucketObjectUpdate,
|
||
|
Delete: resourceStorageBucketObjectDelete,
|
||
|
|
||
|
Schema: map[string]*schema.Schema{
|
||
|
"bucket": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Required: true,
|
||
|
ForceNew: true,
|
||
|
},
|
||
|
"name": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Required: true,
|
||
|
ForceNew: true,
|
||
|
},
|
||
|
"source": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Required: true,
|
||
|
ForceNew: true,
|
||
|
},
|
||
|
"predefined_acl": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Default: "projectPrivate",
|
||
|
Optional: true,
|
||
|
ForceNew: true,
|
||
|
},
|
||
|
"md5hash": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Computed: true,
|
||
|
},
|
||
|
"crc32c": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Computed: true,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func objectGetId(object *storage.Object) string {
|
||
|
return object.Bucket + "-" + object.Name
|
||
|
}
|
||
|
|
||
|
func resourceStorageBucketObjectCreate(d *schema.ResourceData, meta interface{}) error {
|
||
|
config := meta.(*Config)
|
||
|
|
||
|
bucket := d.Get("bucket").(string)
|
||
|
name := d.Get("name").(string)
|
||
|
source := d.Get("source").(string)
|
||
|
acl := d.Get("predefined_acl").(string)
|
||
|
|
||
|
file, err := os.Open(source)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Error opening %s: %s", source, err)
|
||
|
}
|
||
|
|
||
|
objectsService := storage.NewObjectsService(config.clientStorage)
|
||
|
object := &storage.Object{Bucket: bucket}
|
||
|
|
||
|
insertCall := objectsService.Insert(bucket, object)
|
||
|
insertCall.Name(name)
|
||
|
insertCall.Media(file)
|
||
|
insertCall.PredefinedAcl(acl)
|
||
|
|
||
|
_, err = insertCall.Do()
|
||
|
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Error uploading contents of object %s from %s: %s", name, source, err)
|
||
|
}
|
||
|
|
||
|
return resourceStorageBucketObjectRead(d, meta)
|
||
|
}
|
||
|
|
||
|
func resourceStorageBucketObjectRead(d *schema.ResourceData, meta interface{}) error {
|
||
|
config := meta.(*Config)
|
||
|
|
||
|
bucket := d.Get("bucket").(string)
|
||
|
name := d.Get("name").(string)
|
||
|
|
||
|
objectsService := storage.NewObjectsService(config.clientStorage)
|
||
|
getCall := objectsService.Get(bucket, name)
|
||
|
|
||
|
res, err := getCall.Do()
|
||
|
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Error retrieving contents of object %s: %s", name, err)
|
||
|
}
|
||
|
|
||
|
d.Set("md5hash", res.Md5Hash)
|
||
|
d.Set("crc32c", res.Crc32c)
|
||
|
|
||
|
d.SetId(objectGetId(res))
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func resourceStorageBucketObjectUpdate(d *schema.ResourceData, meta interface{}) error {
|
||
|
// The Cloud storage API doesn't support updating object data contents,
|
||
|
// only metadata. So once we implement metadata we'll have work to do here
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func resourceStorageBucketObjectDelete(d *schema.ResourceData, meta interface{}) error {
|
||
|
config := meta.(*Config)
|
||
|
|
||
|
bucket := d.Get("bucket").(string)
|
||
|
name := d.Get("name").(string)
|
||
|
|
||
|
objectsService := storage.NewObjectsService(config.clientStorage)
|
||
|
|
||
|
DeleteCall := objectsService.Delete(bucket, name)
|
||
|
err := DeleteCall.Do()
|
||
|
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Error deleting contents of object %s: %s", name, err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|