github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/google/resource_storage_bucket_object.go (about) 1 package google 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "log" 8 "os" 9 10 "github.com/hashicorp/terraform/helper/schema" 11 12 "google.golang.org/api/googleapi" 13 "google.golang.org/api/storage/v1" 14 ) 15 16 func resourceStorageBucketObject() *schema.Resource { 17 return &schema.Resource{ 18 Create: resourceStorageBucketObjectCreate, 19 Read: resourceStorageBucketObjectRead, 20 Delete: resourceStorageBucketObjectDelete, 21 22 Schema: map[string]*schema.Schema{ 23 "bucket": &schema.Schema{ 24 Type: schema.TypeString, 25 Required: true, 26 ForceNew: true, 27 }, 28 29 "name": &schema.Schema{ 30 Type: schema.TypeString, 31 Required: true, 32 ForceNew: true, 33 }, 34 35 "cache_control": &schema.Schema{ 36 Type: schema.TypeString, 37 ForceNew: true, 38 Optional: true, 39 }, 40 41 "content_disposition": &schema.Schema{ 42 Type: schema.TypeString, 43 ForceNew: true, 44 Optional: true, 45 }, 46 47 "content_encoding": &schema.Schema{ 48 Type: schema.TypeString, 49 ForceNew: true, 50 Optional: true, 51 }, 52 53 "content_language": &schema.Schema{ 54 Type: schema.TypeString, 55 ForceNew: true, 56 Optional: true, 57 }, 58 59 "content_type": &schema.Schema{ 60 Type: schema.TypeString, 61 Optional: true, 62 ForceNew: true, 63 Computed: true, 64 }, 65 66 "content": &schema.Schema{ 67 Type: schema.TypeString, 68 Optional: true, 69 ForceNew: true, 70 ConflictsWith: []string{"source"}, 71 }, 72 73 "crc32c": &schema.Schema{ 74 Type: schema.TypeString, 75 Computed: true, 76 }, 77 78 "md5hash": &schema.Schema{ 79 Type: schema.TypeString, 80 Computed: true, 81 }, 82 83 "predefined_acl": &schema.Schema{ 84 Type: schema.TypeString, 85 Deprecated: "Please use resource \"storage_object_acl.predefined_acl\" instead.", 86 Optional: true, 87 ForceNew: true, 88 }, 89 90 "source": &schema.Schema{ 91 Type: schema.TypeString, 92 Optional: true, 93 ForceNew: true, 94 ConflictsWith: []string{"content"}, 95 }, 96 97 "storage_class": &schema.Schema{ 98 Type: schema.TypeString, 99 Optional: true, 100 ForceNew: true, 101 Computed: true, 102 }, 103 }, 104 } 105 } 106 107 func objectGetId(object *storage.Object) string { 108 return object.Bucket + "-" + object.Name 109 } 110 111 func resourceStorageBucketObjectCreate(d *schema.ResourceData, meta interface{}) error { 112 config := meta.(*Config) 113 114 bucket := d.Get("bucket").(string) 115 name := d.Get("name").(string) 116 var media io.Reader 117 118 if v, ok := d.GetOk("source"); ok { 119 err := error(nil) 120 media, err = os.Open(v.(string)) 121 if err != nil { 122 return err 123 } 124 } else if v, ok := d.GetOk("content"); ok { 125 media = bytes.NewReader([]byte(v.(string))) 126 } else { 127 return fmt.Errorf("Error, either \"content\" or \"string\" must be specified") 128 } 129 130 objectsService := storage.NewObjectsService(config.clientStorage) 131 object := &storage.Object{Bucket: bucket} 132 133 if v, ok := d.GetOk("cache_control"); ok { 134 object.CacheControl = v.(string) 135 } 136 137 if v, ok := d.GetOk("content_disposition"); ok { 138 object.ContentDisposition = v.(string) 139 } 140 141 if v, ok := d.GetOk("content_encoding"); ok { 142 object.ContentEncoding = v.(string) 143 } 144 145 if v, ok := d.GetOk("content_language"); ok { 146 object.ContentLanguage = v.(string) 147 } 148 149 if v, ok := d.GetOk("content_type"); ok { 150 object.ContentType = v.(string) 151 } 152 153 if v, ok := d.GetOk("storage_class"); ok { 154 object.StorageClass = v.(string) 155 } 156 157 insertCall := objectsService.Insert(bucket, object) 158 insertCall.Name(name) 159 insertCall.Media(media) 160 if v, ok := d.GetOk("predefined_acl"); ok { 161 insertCall.PredefinedAcl(v.(string)) 162 } 163 164 _, err := insertCall.Do() 165 166 if err != nil { 167 return fmt.Errorf("Error uploading object %s: %s", name, err) 168 } 169 170 return resourceStorageBucketObjectRead(d, meta) 171 } 172 173 func resourceStorageBucketObjectRead(d *schema.ResourceData, meta interface{}) error { 174 config := meta.(*Config) 175 176 bucket := d.Get("bucket").(string) 177 name := d.Get("name").(string) 178 179 objectsService := storage.NewObjectsService(config.clientStorage) 180 getCall := objectsService.Get(bucket, name) 181 182 res, err := getCall.Do() 183 184 if err != nil { 185 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 186 log.Printf("[WARN] Removing Bucket Object %q because it's gone", d.Get("name").(string)) 187 // The resource doesn't exist anymore 188 d.SetId("") 189 190 return nil 191 } 192 193 return fmt.Errorf("Error retrieving contents of object %s: %s", name, err) 194 } 195 196 d.Set("md5hash", res.Md5Hash) 197 d.Set("crc32c", res.Crc32c) 198 d.Set("cache_control", res.CacheControl) 199 d.Set("content_disposition", res.ContentDisposition) 200 d.Set("content_encoding", res.ContentEncoding) 201 d.Set("content_language", res.ContentLanguage) 202 d.Set("content_type", res.ContentType) 203 d.Set("storage_class", res.StorageClass) 204 205 d.SetId(objectGetId(res)) 206 207 return nil 208 } 209 210 func resourceStorageBucketObjectDelete(d *schema.ResourceData, meta interface{}) error { 211 config := meta.(*Config) 212 213 bucket := d.Get("bucket").(string) 214 name := d.Get("name").(string) 215 216 objectsService := storage.NewObjectsService(config.clientStorage) 217 218 DeleteCall := objectsService.Delete(bucket, name) 219 err := DeleteCall.Do() 220 221 if err != nil { 222 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 223 log.Printf("[WARN] Removing Bucket Object %q because it's gone", name) 224 // The resource doesn't exist anymore 225 d.SetId("") 226 227 return nil 228 } 229 230 return fmt.Errorf("Error deleting contents of object %s: %s", name, err) 231 } 232 233 return nil 234 }