github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/builtin/providers/profitbricks/resource_profitbricks_datacenter.go (about) 1 package profitbricks 2 3 import ( 4 "fmt" 5 "github.com/hashicorp/terraform/helper/schema" 6 "github.com/profitbricks/profitbricks-sdk-go" 7 "log" 8 "runtime" 9 "strings" 10 "time" 11 ) 12 13 func resourceProfitBricksDatacenter() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceProfitBricksDatacenterCreate, 16 Read: resourceProfitBricksDatacenterRead, 17 Update: resourceProfitBricksDatacenterUpdate, 18 Delete: resourceProfitBricksDatacenterDelete, 19 Schema: map[string]*schema.Schema{ 20 21 //Datacenter parameters 22 "name": { 23 Type: schema.TypeString, 24 Required: true, 25 }, 26 27 "location": { 28 Type: schema.TypeString, 29 Required: true, 30 }, 31 "description": { 32 Type: schema.TypeString, 33 Optional: true, 34 Computed: true, 35 }, 36 }, 37 } 38 } 39 40 func resourceProfitBricksDatacenterCreate(d *schema.ResourceData, meta interface{}) error { 41 config := meta.(*Config) 42 profitbricks.SetAuth(config.Username, config.Password) 43 44 datacenter := profitbricks.Datacenter{ 45 Properties: profitbricks.DatacenterProperties{ 46 Name: d.Get("name").(string), 47 Location: d.Get("location").(string), 48 }, 49 } 50 51 if attr, ok := d.GetOk("description"); ok { 52 datacenter.Properties.Description = attr.(string) 53 } 54 dc := profitbricks.CreateDatacenter(datacenter) 55 56 if dc.StatusCode > 299 { 57 return fmt.Errorf( 58 "Error creating data center (%s) (%s)", d.Id(), dc.Response) 59 } 60 d.SetId(dc.Id) 61 62 log.Printf("[INFO] DataCenter Id: %s", d.Id()) 63 64 err := waitTillProvisioned(meta, dc.Headers.Get("Location")) 65 if err != nil { 66 return err 67 } 68 return resourceProfitBricksDatacenterRead(d, meta) 69 } 70 71 func resourceProfitBricksDatacenterRead(d *schema.ResourceData, meta interface{}) error { 72 config := meta.(*Config) 73 74 profitbricks.SetAuth(config.Username, config.Password) 75 datacenter := profitbricks.GetDatacenter(d.Id()) 76 if datacenter.StatusCode > 299 { 77 return fmt.Errorf("Error while fetching a data center ID %s %s", d.Id(), datacenter.Response) 78 } 79 80 d.Set("name", datacenter.Properties.Name) 81 d.Set("location", datacenter.Properties.Location) 82 d.Set("description", datacenter.Properties.Description) 83 return nil 84 } 85 86 func resourceProfitBricksDatacenterUpdate(d *schema.ResourceData, meta interface{}) error { 87 config := meta.(*Config) 88 89 profitbricks.SetAuth(config.Username, config.Password) 90 91 obj := profitbricks.DatacenterProperties{} 92 93 if d.HasChange("name") { 94 _, newName := d.GetChange("name") 95 96 obj.Name = newName.(string) 97 } 98 99 if d.HasChange("description") { 100 _, newDescription := d.GetChange("description") 101 obj.Description = newDescription.(string) 102 } 103 104 resp := profitbricks.PatchDatacenter(d.Id(), obj) 105 waitTillProvisioned(meta, resp.Headers.Get("Location")) 106 return resourceProfitBricksDatacenterRead(d, meta) 107 } 108 109 func resourceProfitBricksDatacenterDelete(d *schema.ResourceData, meta interface{}) error { 110 config := meta.(*Config) 111 112 profitbricks.SetAuth(config.Username, config.Password) 113 dcid := d.Id() 114 resp := profitbricks.DeleteDatacenter(dcid) 115 116 if resp.StatusCode > 299 { 117 return fmt.Errorf("An error occured while deleting the data center ID %s %s", d.Id(), string(resp.Body)) 118 } 119 err := waitTillProvisioned(meta, resp.Headers.Get("Location")) 120 if err != nil { 121 return err 122 } 123 d.SetId("") 124 return nil 125 } 126 127 func waitTillProvisioned(meta interface{}, path string) error { 128 config := meta.(*Config) 129 profitbricks.SetAuth(config.Username, config.Password) 130 131 for i := 0; i < config.Retries; i++ { 132 request := profitbricks.GetRequestStatus(path) 133 pc, _, _, ok := runtime.Caller(1) 134 details := runtime.FuncForPC(pc) 135 if ok && details != nil { 136 log.Printf("[DEBUG] Called from %s", details.Name()) 137 } 138 log.Printf("[DEBUG] Request status: %s", request.Metadata.Status) 139 log.Printf("[DEBUG] Request status path: %s", path) 140 141 if request.Metadata.Status == "DONE" { 142 return nil 143 } 144 if request.Metadata.Status == "FAILED" { 145 146 return fmt.Errorf("Request failed with following error: %s", request.Metadata.Message) 147 } 148 time.Sleep(10 * time.Second) 149 i++ 150 } 151 return fmt.Errorf("Timeout has expired") 152 } 153 154 func getImageId(dcId string, imageName string, imageType string) string { 155 if imageName == "" { 156 return "" 157 } 158 dc := profitbricks.GetDatacenter(dcId) 159 if dc.StatusCode > 299 { 160 log.Print(fmt.Errorf("Error while fetching a data center ID %s %s", dcId, dc.Response)) 161 } 162 163 images := profitbricks.ListImages() 164 if images.StatusCode > 299 { 165 log.Print(fmt.Errorf("Error while fetching the list of images %s", images.Response)) 166 } 167 168 if len(images.Items) > 0 { 169 for _, i := range images.Items { 170 imgName := "" 171 if i.Properties.Name != "" { 172 imgName = i.Properties.Name 173 } 174 175 if imageType == "SSD" { 176 imageType = "HDD" 177 } 178 if imgName != "" && strings.Contains(strings.ToLower(imgName), strings.ToLower(imageName)) && i.Properties.ImageType == imageType && i.Properties.Location == dc.Properties.Location && i.Properties.Public == true { 179 return i.Id 180 } 181 } 182 } 183 return "" 184 }