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  }