github.com/anuaimi/terraform@v0.6.4-0.20150904235404-2bf9aec61da8/builtin/providers/google/resource_storage_bucket.go (about)

     1  package google
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"log"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  
    10  	"google.golang.org/api/storage/v1"
    11  )
    12  
    13  func resourceStorageBucket() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceStorageBucketCreate,
    16  		Read:   resourceStorageBucketRead,
    17  		Update: resourceStorageBucketUpdate,
    18  		Delete: resourceStorageBucketDelete,
    19  
    20  		Schema: map[string]*schema.Schema{
    21  			"name": &schema.Schema{
    22  				Type:     schema.TypeString,
    23  				Required: true,
    24  				ForceNew: true,
    25  			},
    26  			"predefined_acl": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Default:  "projectPrivate",
    29  				Optional: true,
    30  				ForceNew: true,
    31  			},
    32  			"location": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Default:  "US",
    35  				Optional: true,
    36  				ForceNew: true,
    37  			},
    38  			"force_destroy": &schema.Schema{
    39  				Type:     schema.TypeBool,
    40  				Optional: true,
    41  				Default:  false,
    42  			},
    43  		},
    44  	}
    45  }
    46  
    47  func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error {
    48  	config := meta.(*Config)
    49  
    50  	// Get the bucket and acl
    51  	bucket := d.Get("name").(string)
    52  	acl := d.Get("predefined_acl").(string)
    53  	location := d.Get("location").(string)
    54  
    55  	// Create a bucket, setting the acl, location and name.
    56  	sb := &storage.Bucket{Name: bucket, Location: location}
    57  	res, err := config.clientStorage.Buckets.Insert(config.Project, sb).PredefinedAcl(acl).Do()
    58  
    59  	if err != nil {
    60  		fmt.Printf("Error creating bucket %s: %v", bucket, err)
    61  		return err
    62  	}
    63  
    64  	log.Printf("[DEBUG] Created bucket %v at location %v\n\n", res.Name, res.SelfLink)
    65  
    66  	// Assign the bucket ID as the resource ID
    67  	d.SetId(res.Id)
    68  
    69  	return nil
    70  }
    71  
    72  func resourceStorageBucketUpdate(d *schema.ResourceData, meta interface{}) error {
    73  	// Only thing you can currently change is force_delete (all other properties have ForceNew)
    74  	// which is just terraform object state change, so nothing to do here
    75  	return nil
    76  }
    77  
    78  func resourceStorageBucketRead(d *schema.ResourceData, meta interface{}) error {
    79  	config := meta.(*Config)
    80  
    81  	// Get the bucket and acl
    82  	bucket := d.Get("name").(string)
    83  	res, err := config.clientStorage.Buckets.Get(bucket).Do()
    84  
    85  	if err != nil {
    86  		fmt.Printf("Error reading bucket %s: %v", bucket, err)
    87  		return err
    88  	}
    89  
    90  	log.Printf("[DEBUG] Read bucket %v at location %v\n\n", res.Name, res.SelfLink)
    91  
    92  	// Update the bucket ID according to the resource ID
    93  	d.SetId(res.Id)
    94  
    95  	return nil
    96  }
    97  
    98  func resourceStorageBucketDelete(d *schema.ResourceData, meta interface{}) error {
    99  	config := meta.(*Config)
   100  
   101  	// Get the bucket
   102  	bucket := d.Get("name").(string)
   103  
   104  	for {
   105  		res, err := config.clientStorage.Objects.List(bucket).Do()
   106  		if err != nil {
   107  			fmt.Printf("Error Objects.List failed: %v", err)
   108  			return err
   109  		}
   110  
   111  		if len(res.Items) != 0 {
   112  			if d.Get("force_destroy").(bool) {
   113  				// purge the bucket...
   114  				log.Printf("[DEBUG] GCS Bucket attempting to forceDestroy\n\n")
   115  
   116  				for _, object := range res.Items {
   117  					log.Printf("[DEBUG] Found %s", object.Name)
   118  					if err := config.clientStorage.Objects.Delete(bucket, object.Name).Do(); err != nil {
   119  						log.Fatalf("Error trying to delete object: %s %s\n\n", object.Name, err)
   120  					} else {
   121  						log.Printf("Object deleted: %s \n\n", object.Name)
   122  					}
   123  				}
   124  
   125  			} else {
   126  				delete_err := errors.New("Error trying to delete a bucket containing objects without `force_destroy` set to true")
   127  				log.Printf("Error! %s : %s\n\n", bucket, delete_err)
   128  				return delete_err
   129  			}
   130  		} else {
   131  			break // 0 items, bucket empty
   132  		}
   133  	}
   134  
   135  	// remove empty bucket
   136  	err := config.clientStorage.Buckets.Delete(bucket).Do()
   137  	if err != nil {
   138  		fmt.Printf("Error deleting bucket %s: %v\n\n", bucket, err)
   139  		return err
   140  	}
   141  	log.Printf("[DEBUG] Deleted bucket %v\n\n", bucket)
   142  
   143  	return nil
   144  }