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 }