github.com/hobbeswalsh/terraform@v0.3.7-0.20150619183303-ad17cf55a0fa/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 }