140 lines
3.5 KiB
Go
140 lines
3.5 KiB
Go
package librato
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/hashicorp/terraform/helper/resource"
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
"github.com/henrikhodne/go-librato/librato"
|
|
)
|
|
|
|
func resourceLibratoSpace() *schema.Resource {
|
|
return &schema.Resource{
|
|
Create: resourceLibratoSpaceCreate,
|
|
Read: resourceLibratoSpaceRead,
|
|
Update: resourceLibratoSpaceUpdate,
|
|
Delete: resourceLibratoSpaceDelete,
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
"name": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
ForceNew: false,
|
|
},
|
|
"id": &schema.Schema{
|
|
Type: schema.TypeInt,
|
|
Computed: true,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func resourceLibratoSpaceCreate(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*librato.Client)
|
|
|
|
name := d.Get("name").(string)
|
|
|
|
space, _, err := client.Spaces.Create(&librato.Space{Name: librato.String(name)})
|
|
if err != nil {
|
|
return fmt.Errorf("Error creating Librato space %s: %s", name, err)
|
|
}
|
|
|
|
resource.Retry(1*time.Minute, func() *resource.RetryError {
|
|
_, _, err := client.Spaces.Get(*space.ID)
|
|
if err != nil {
|
|
if errResp, ok := err.(*librato.ErrorResponse); ok && errResp.Response.StatusCode == 404 {
|
|
return resource.RetryableError(err)
|
|
}
|
|
return resource.NonRetryableError(err)
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return resourceLibratoSpaceReadResult(d, space)
|
|
}
|
|
|
|
func resourceLibratoSpaceRead(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*librato.Client)
|
|
|
|
id, err := strconv.ParseUint(d.Id(), 10, 0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
space, _, err := client.Spaces.Get(uint(id))
|
|
if err != nil {
|
|
if errResp, ok := err.(*librato.ErrorResponse); ok && errResp.Response.StatusCode == 404 {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
return fmt.Errorf("Error reading Librato Space %s: %s", d.Id(), err)
|
|
}
|
|
|
|
return resourceLibratoSpaceReadResult(d, space)
|
|
}
|
|
|
|
func resourceLibratoSpaceReadResult(d *schema.ResourceData, space *librato.Space) error {
|
|
d.SetId(strconv.FormatUint(uint64(*space.ID), 10))
|
|
if err := d.Set("id", *space.ID); err != nil {
|
|
return err
|
|
}
|
|
if err := d.Set("name", *space.Name); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func resourceLibratoSpaceUpdate(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*librato.Client)
|
|
id, err := strconv.ParseUint(d.Id(), 10, 0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if d.HasChange("name") {
|
|
newName := d.Get("name").(string)
|
|
log.Printf("[INFO] Modifying name space attribute for %d: %#v", id, newName)
|
|
if _, err = client.Spaces.Edit(uint(id), &librato.Space{Name: &newName}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return resourceLibratoSpaceRead(d, meta)
|
|
}
|
|
|
|
func resourceLibratoSpaceDelete(d *schema.ResourceData, meta interface{}) error {
|
|
client := meta.(*librato.Client)
|
|
id, err := strconv.ParseUint(d.Id(), 10, 0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Printf("[INFO] Deleting Space: %d", id)
|
|
_, err = client.Spaces.Delete(uint(id))
|
|
if err != nil {
|
|
if errResp, ok := err.(*librato.ErrorResponse); ok && errResp.Response.StatusCode == 404 {
|
|
log.Printf("Space %s not found", d.Id())
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
return fmt.Errorf("Error deleting space: %s", err)
|
|
}
|
|
|
|
resource.Retry(1*time.Minute, func() *resource.RetryError {
|
|
_, _, err := client.Spaces.Get(uint(id))
|
|
if err != nil {
|
|
if errResp, ok := err.(*librato.ErrorResponse); ok && errResp.Response.StatusCode == 404 {
|
|
return nil
|
|
}
|
|
return resource.NonRetryableError(err)
|
|
}
|
|
return resource.RetryableError(fmt.Errorf("space still exists"))
|
|
})
|
|
|
|
d.SetId("")
|
|
return nil
|
|
}
|