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