github.com/atsaki/terraform@v0.4.3-0.20150919165407-25bba5967654/builtin/providers/google/resource_storage_bucket_object.go (about)

     1  package google
     2  
     3  import (
     4  	"os"
     5  	"fmt"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  
     9  	"google.golang.org/api/storage/v1"
    10  )
    11  
    12  func resourceStorageBucketObject() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceStorageBucketObjectCreate,
    15  		Read:   resourceStorageBucketObjectRead,
    16  		Update: resourceStorageBucketObjectUpdate,
    17  		Delete: resourceStorageBucketObjectDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"bucket": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  				ForceNew: true,
    24  			},
    25  			"name": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Required: true,
    28  				ForceNew: true,
    29  			},
    30  			"source": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Required: true,
    33  				ForceNew: true,
    34  			},
    35  			"predefined_acl": &schema.Schema{
    36  				Type:     schema.TypeString,
    37  				Default:  "projectPrivate",
    38  				Optional: true,
    39  				ForceNew: true,
    40  			},
    41  			"md5hash": &schema.Schema{
    42  				Type:     schema.TypeString,
    43  				Computed: true,
    44  			},
    45  			"crc32c": &schema.Schema{
    46  				Type:     schema.TypeString,
    47  				Computed: true,
    48  			},
    49  		},
    50  	}
    51  }
    52  
    53  func objectGetId(object *storage.Object) string {
    54  	return object.Bucket + "-" + object.Name
    55  }
    56  
    57  func resourceStorageBucketObjectCreate(d *schema.ResourceData, meta interface{}) error {
    58  	config := meta.(*Config)
    59  
    60  	bucket := d.Get("bucket").(string)
    61  	name := d.Get("name").(string)
    62  	source := d.Get("source").(string)
    63  	acl := d.Get("predefined_acl").(string)
    64  
    65  	file, err := os.Open(source)
    66  	if err != nil {
    67  		return fmt.Errorf("Error opening %s: %s", source, err)
    68  	}
    69  
    70  	objectsService := storage.NewObjectsService(config.clientStorage)
    71  	object := &storage.Object{Bucket: bucket}
    72  
    73  	insertCall := objectsService.Insert(bucket, object)
    74  	insertCall.Name(name)
    75  	insertCall.Media(file)
    76  	insertCall.PredefinedAcl(acl)
    77  
    78  	_, err = insertCall.Do()
    79  
    80  	if err != nil {
    81  		return fmt.Errorf("Error uploading contents of object %s from %s: %s", name, source, err)
    82  	}
    83  
    84  	return resourceStorageBucketObjectRead(d, meta)
    85  }
    86  
    87  func resourceStorageBucketObjectRead(d *schema.ResourceData, meta interface{}) error {
    88  	config := meta.(*Config)
    89  
    90  	bucket := d.Get("bucket").(string)
    91  	name := d.Get("name").(string)
    92  
    93  	objectsService := storage.NewObjectsService(config.clientStorage)
    94  	getCall := objectsService.Get(bucket, name)
    95  
    96  	res, err := getCall.Do()
    97  
    98  	if err != nil {
    99  		return fmt.Errorf("Error retrieving contents of object %s: %s", name, err)
   100  	}
   101  
   102  	d.Set("md5hash", res.Md5Hash)
   103  	d.Set("crc32c", res.Crc32c)
   104  
   105  	d.SetId(objectGetId(res))
   106  
   107  	return nil
   108  }
   109  
   110  func resourceStorageBucketObjectUpdate(d *schema.ResourceData, meta interface{}) error {
   111  	// The Cloud storage API doesn't support updating object data contents,
   112  	// only metadata. So once we implement metadata we'll have work to do here
   113  	return nil
   114  }
   115  
   116  func resourceStorageBucketObjectDelete(d *schema.ResourceData, meta interface{}) error {
   117  	config := meta.(*Config)
   118  
   119  	bucket := d.Get("bucket").(string)
   120  	name := d.Get("name").(string)
   121  
   122  	objectsService := storage.NewObjectsService(config.clientStorage)
   123  
   124  	DeleteCall := objectsService.Delete(bucket, name)
   125  	err := DeleteCall.Do()
   126  
   127  	if err != nil {
   128  		return fmt.Errorf("Error deleting contents of object %s: %s", name, err)
   129  	}
   130  
   131  	return nil
   132  }