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  }