github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/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  }