github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/clc/resource_clc_load_balancer_pool.go (about)

     1  package clc
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strconv"
     7  
     8  	clc "github.com/CenturyLinkCloud/clc-sdk"
     9  	"github.com/CenturyLinkCloud/clc-sdk/lb"
    10  
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  )
    13  
    14  func resourceCLCLoadBalancerPool() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceCLCLoadBalancerPoolCreate,
    17  		Read:   resourceCLCLoadBalancerPoolRead,
    18  		Update: resourceCLCLoadBalancerPoolUpdate,
    19  		Delete: resourceCLCLoadBalancerPoolDelete,
    20  		Schema: map[string]*schema.Schema{
    21  			// pool args
    22  			"port": &schema.Schema{
    23  				Type:     schema.TypeInt,
    24  				Required: true,
    25  			},
    26  			"data_center": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  			},
    30  			"load_balancer": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Required: true,
    33  			},
    34  			"method": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Optional: true,
    37  				Default:  "roundRobin",
    38  			},
    39  			"persistence": &schema.Schema{
    40  				Type:     schema.TypeString,
    41  				Optional: true,
    42  				Default:  "standard",
    43  			},
    44  			"nodes": &schema.Schema{
    45  				Type:     schema.TypeList,
    46  				Required: true,
    47  				Elem:     &schema.Schema{Type: schema.TypeMap},
    48  			},
    49  		},
    50  	}
    51  }
    52  
    53  func resourceCLCLoadBalancerPoolCreate(d *schema.ResourceData, meta interface{}) error {
    54  	client := meta.(*clc.Client)
    55  	dc := d.Get("data_center").(string)
    56  	lbid := d.Get("load_balancer").(string)
    57  
    58  	s1 := d.Get("method").(string)
    59  	m := lb.LeastConn
    60  	if s1 == string(lb.RoundRobin) {
    61  		m = lb.RoundRobin
    62  	}
    63  	s2 := d.Get("persistence").(string)
    64  	p := lb.Standard
    65  	if s2 == string(lb.Sticky) {
    66  		p = lb.Sticky
    67  	}
    68  	r2 := lb.Pool{
    69  		Port:        d.Get("port").(int),
    70  		Method:      m,
    71  		Persistence: p,
    72  	}
    73  	lbp, err := client.LB.CreatePool(dc, lbid, r2)
    74  	if err != nil {
    75  		return fmt.Errorf("Failed creating pool under %v/%v: %v", dc, lbid, err)
    76  	}
    77  	d.SetId(lbp.ID)
    78  	return resourceCLCLoadBalancerPoolUpdate(d, meta)
    79  }
    80  
    81  func resourceCLCLoadBalancerPoolRead(d *schema.ResourceData, meta interface{}) error {
    82  	client := meta.(*clc.Client)
    83  	dc := d.Get("data_center").(string)
    84  	lbid := d.Get("load_balancer").(string)
    85  	id := d.Id()
    86  	pool, err := client.LB.GetPool(dc, lbid, id)
    87  	if err != nil {
    88  		log.Printf("[INFO] Failed fetching pool %v/%v. Marking destroyed", lbid, d.Id())
    89  		d.SetId("")
    90  		return nil
    91  	}
    92  	nodes, err := client.LB.GetAllNodes(dc, lbid, id)
    93  	nodes2 := make([]lb.Node, len(nodes))
    94  	for i, n := range nodes {
    95  		nodes2[i] = *n
    96  	}
    97  	pool.Nodes = nodes2
    98  	d.Set("port", pool.Port)
    99  	d.Set("method", pool.Method)
   100  	d.Set("persistence", pool.Persistence)
   101  	d.Set("nodes", pool.Nodes)
   102  	d.Set("links", pool.Links)
   103  	return nil
   104  }
   105  
   106  func resourceCLCLoadBalancerPoolUpdate(d *schema.ResourceData, meta interface{}) error {
   107  	client := meta.(*clc.Client)
   108  	dc := d.Get("data_center").(string)
   109  	lbid := d.Get("load_balancer").(string)
   110  	id := d.Id()
   111  	pool, err := client.LB.GetPool(dc, lbid, d.Id())
   112  	pool.Port = 0 // triggers empty value => omission from POST
   113  
   114  	if d.HasChange("method") {
   115  		d.SetPartial("method")
   116  		pool.Method = lb.Method(d.Get("method").(string))
   117  	}
   118  	if d.HasChange("persistence") {
   119  		d.SetPartial("persistence")
   120  		pool.Persistence = lb.Persistence(d.Get("persistence").(string))
   121  	}
   122  	err = client.LB.UpdatePool(dc, lbid, id, *pool)
   123  	if err != nil {
   124  		return fmt.Errorf("Failed updating pool %v: %v", id, err)
   125  	}
   126  
   127  	if d.HasChange("nodes") {
   128  		d.SetPartial("nodes")
   129  		nodes, err := parseNodes(d)
   130  		if err != nil {
   131  			return err
   132  		}
   133  		err = client.LB.UpdateNodes(dc, lbid, id, nodes...)
   134  		if err != nil {
   135  			return fmt.Errorf("Failed updating pool nodes %v: %v", id, err)
   136  		}
   137  	}
   138  	return resourceCLCLoadBalancerPoolRead(d, meta)
   139  }
   140  
   141  func resourceCLCLoadBalancerPoolDelete(d *schema.ResourceData, meta interface{}) error {
   142  	client := meta.(*clc.Client)
   143  	dc := d.Get("data_center").(string)
   144  	lbid := d.Get("load_balancer").(string)
   145  	id := d.Id()
   146  	err := client.LB.DeletePool(dc, lbid, id)
   147  	if err != nil {
   148  		return fmt.Errorf("Failed deleting pool %v: %v", id, err)
   149  	}
   150  	return nil
   151  }
   152  
   153  func parseNodes(d *schema.ResourceData) ([]lb.Node, error) {
   154  	var nodes []lb.Node
   155  	raw := d.Get("nodes")
   156  	if raw == nil {
   157  		log.Println("WARNING: pool missing nodes")
   158  		return nil, nil
   159  	}
   160  	if arr, ok := raw.([]interface{}); ok {
   161  		for _, v := range arr {
   162  			m := v.(map[string]interface{})
   163  			p, err := strconv.Atoi(m["privatePort"].(string))
   164  			if err != nil {
   165  				log.Printf("[WARN] Failed parsing port '%v'. skipping", m["privatePort"])
   166  				continue
   167  			}
   168  			n := lb.Node{
   169  				Status:      m["status"].(string),
   170  				IPaddress:   m["ipAddress"].(string),
   171  				PrivatePort: p,
   172  			}
   173  			nodes = append(nodes, n)
   174  		}
   175  	} else {
   176  		return nil, fmt.Errorf("Failed parsing nodes from pool spec: %v", raw)
   177  	}
   178  	return nodes, nil
   179  }