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

     1  package spotinst
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	"github.com/spotinst/spotinst-sdk-go/spotinst"
     9  	"github.com/spotinst/spotinst-sdk-go/spotinst/util/stringutil"
    10  )
    11  
    12  func resourceSpotinstHealthCheck() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceSpotinstHealthCheckCreate,
    15  		Update: resourceSpotinstHealthCheckUpdate,
    16  		Read:   resourceSpotinstHealthCheckRead,
    17  		Delete: resourceSpotinstHealthCheckDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"name": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Optional: true,
    23  			},
    24  
    25  			"resource_id": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Required: true,
    28  			},
    29  
    30  			"check": &schema.Schema{
    31  				Type:     schema.TypeSet,
    32  				Required: true,
    33  				MaxItems: 1,
    34  				Elem: &schema.Resource{
    35  					Schema: map[string]*schema.Schema{
    36  						"protocol": &schema.Schema{
    37  							Type:     schema.TypeString,
    38  							Required: true,
    39  						},
    40  
    41  						"endpoint": &schema.Schema{
    42  							Type:     schema.TypeString,
    43  							Required: true,
    44  						},
    45  
    46  						"port": &schema.Schema{
    47  							Type:     schema.TypeInt,
    48  							Required: true,
    49  						},
    50  
    51  						"interval": &schema.Schema{
    52  							Type:     schema.TypeInt,
    53  							Required: true,
    54  						},
    55  
    56  						"timeout": &schema.Schema{
    57  							Type:     schema.TypeInt,
    58  							Required: true,
    59  						},
    60  					},
    61  				},
    62  			},
    63  
    64  			"threshold": &schema.Schema{
    65  				Type:     schema.TypeSet,
    66  				Required: true,
    67  				MaxItems: 1,
    68  				Elem: &schema.Resource{
    69  					Schema: map[string]*schema.Schema{
    70  						"healthy": &schema.Schema{
    71  							Type:     schema.TypeInt,
    72  							Required: true,
    73  						},
    74  
    75  						"unhealthy": &schema.Schema{
    76  							Type:     schema.TypeInt,
    77  							Required: true,
    78  						},
    79  					},
    80  				},
    81  			},
    82  
    83  			"proxy": &schema.Schema{
    84  				Type:     schema.TypeSet,
    85  				Required: true,
    86  				MaxItems: 1,
    87  				Elem: &schema.Resource{
    88  					Schema: map[string]*schema.Schema{
    89  						"addr": &schema.Schema{
    90  							Type:     schema.TypeString,
    91  							Required: true,
    92  						},
    93  
    94  						"port": &schema.Schema{
    95  							Type:     schema.TypeInt,
    96  							Required: true,
    97  						},
    98  					},
    99  				},
   100  			},
   101  		},
   102  	}
   103  }
   104  
   105  func resourceSpotinstHealthCheckCreate(d *schema.ResourceData, meta interface{}) error {
   106  	client := meta.(*spotinst.Client)
   107  	newHealthCheck, err := buildHealthCheckOpts(d, meta)
   108  	if err != nil {
   109  		return err
   110  	}
   111  	log.Printf("[DEBUG] HealthCheck create configuration: %#v\n", newHealthCheck)
   112  	input := &spotinst.CreateHealthCheckInput{HealthCheck: newHealthCheck}
   113  	resp, err := client.HealthCheckService.Create(input)
   114  	if err != nil {
   115  		return fmt.Errorf("Error creating health check: %s", err)
   116  	}
   117  	d.SetId(spotinst.StringValue(resp.HealthCheck.ID))
   118  	log.Printf("[INFO] HealthCheck created successfully: %s\n", d.Id())
   119  	return resourceSpotinstHealthCheckRead(d, meta)
   120  }
   121  
   122  func resourceSpotinstHealthCheckRead(d *schema.ResourceData, meta interface{}) error {
   123  	client := meta.(*spotinst.Client)
   124  	input := &spotinst.ReadHealthCheckInput{ID: spotinst.String(d.Id())}
   125  	resp, err := client.HealthCheckService.Read(input)
   126  	if err != nil {
   127  		return fmt.Errorf("Error retrieving health check: %s", err)
   128  	}
   129  	if hc := resp.HealthCheck; hc != nil {
   130  		d.Set("name", hc.Name)
   131  		d.Set("resource_id", hc.ResourceID)
   132  
   133  		// Set the check.
   134  		check := make([]map[string]interface{}, 0, 1)
   135  		check = append(check, map[string]interface{}{
   136  			"protocol": hc.Check.Protocol,
   137  			"endpoint": hc.Check.Endpoint,
   138  			"port":     hc.Check.Port,
   139  			"interval": hc.Check.Interval,
   140  			"timeout":  hc.Check.Timeout,
   141  		})
   142  		d.Set("check", check)
   143  
   144  		// Set the threshold.
   145  		threshold := make([]map[string]interface{}, 0, 1)
   146  		threshold = append(threshold, map[string]interface{}{
   147  			"healthy":   hc.Check.Healthy,
   148  			"unhealthy": hc.Check.Unhealthy,
   149  		})
   150  		d.Set("threshold", threshold)
   151  
   152  		// Set the proxy.
   153  		proxy := make([]map[string]interface{}, 0, 1)
   154  		proxy = append(proxy, map[string]interface{}{
   155  			"addr": hc.Addr,
   156  			"port": hc.Port,
   157  		})
   158  		d.Set("proxy", proxy)
   159  	} else {
   160  		d.SetId("")
   161  	}
   162  	return nil
   163  }
   164  
   165  func resourceSpotinstHealthCheckUpdate(d *schema.ResourceData, meta interface{}) error {
   166  	client := meta.(*spotinst.Client)
   167  	healthCheck := &spotinst.HealthCheck{ID: spotinst.String(d.Id())}
   168  	update := false
   169  
   170  	if d.HasChange("name") {
   171  		healthCheck.Name = spotinst.String(d.Get("name").(string))
   172  		update = true
   173  	}
   174  
   175  	if d.HasChange("resource_id") {
   176  		healthCheck.ResourceID = spotinst.String(d.Get("resource_id").(string))
   177  		update = true
   178  	}
   179  
   180  	if d.HasChange("check") {
   181  		if v, ok := d.GetOk("check"); ok {
   182  			if check, err := expandHealthCheckConfig(v); err != nil {
   183  				return err
   184  			} else {
   185  				healthCheck.Check = check
   186  				update = true
   187  			}
   188  		}
   189  	}
   190  
   191  	if d.HasChange("threshold") {
   192  		if v, ok := d.GetOk("threshold"); ok {
   193  			if threshold, err := expandHealthCheckThreshold(v); err != nil {
   194  				return err
   195  			} else {
   196  				healthCheck.Check.HealthCheckThreshold = threshold
   197  				update = true
   198  			}
   199  		}
   200  	}
   201  
   202  	if d.HasChange("proxy") {
   203  		if v, ok := d.GetOk("proxy"); ok {
   204  			if proxy, err := expandHealthCheckProxy(v); err != nil {
   205  				return err
   206  			} else {
   207  				healthCheck.HealthCheckProxy = proxy
   208  				update = true
   209  			}
   210  		}
   211  	}
   212  
   213  	if update {
   214  		log.Printf("[DEBUG] HealthCheck update configuration: %s\n", stringutil.Stringify(healthCheck))
   215  		input := &spotinst.UpdateHealthCheckInput{HealthCheck: healthCheck}
   216  		if _, err := client.HealthCheckService.Update(input); err != nil {
   217  			return fmt.Errorf("Error updating health check %s: %s", d.Id(), err)
   218  		}
   219  	}
   220  
   221  	return resourceSpotinstHealthCheckRead(d, meta)
   222  }
   223  
   224  func resourceSpotinstHealthCheckDelete(d *schema.ResourceData, meta interface{}) error {
   225  	client := meta.(*spotinst.Client)
   226  	log.Printf("[INFO] Deleting health check: %s\n", d.Id())
   227  	input := &spotinst.DeleteHealthCheckInput{ID: spotinst.String(d.Id())}
   228  	if _, err := client.HealthCheckService.Delete(input); err != nil {
   229  		return fmt.Errorf("Error deleting health check: %s", err)
   230  	}
   231  	d.SetId("")
   232  	return nil
   233  }
   234  
   235  // buildHealthCheckOpts builds the Spotinst HealthCheck options.
   236  func buildHealthCheckOpts(d *schema.ResourceData, meta interface{}) (*spotinst.HealthCheck, error) {
   237  	healthCheck := &spotinst.HealthCheck{
   238  		Name:       spotinst.String(d.Get("name").(string)),
   239  		ResourceID: spotinst.String(d.Get("resource_id").(string)),
   240  	}
   241  
   242  	if v, ok := d.GetOk("check"); ok {
   243  		if check, err := expandHealthCheckConfig(v); err != nil {
   244  			return nil, err
   245  		} else {
   246  			healthCheck.Check = check
   247  		}
   248  	}
   249  
   250  	if v, ok := d.GetOk("threshold"); ok {
   251  		if threshold, err := expandHealthCheckThreshold(v); err != nil {
   252  			return nil, err
   253  		} else {
   254  			healthCheck.Check.HealthCheckThreshold = threshold
   255  		}
   256  	}
   257  
   258  	if v, ok := d.GetOk("proxy"); ok {
   259  		if proxy, err := expandHealthCheckProxy(v); err != nil {
   260  			return nil, err
   261  		} else {
   262  			healthCheck.HealthCheckProxy = proxy
   263  		}
   264  	}
   265  
   266  	return healthCheck, nil
   267  }
   268  
   269  // expandHealthCheckConfig expands the Check block.
   270  func expandHealthCheckConfig(data interface{}) (*spotinst.HealthCheckConfig, error) {
   271  	list := data.(*schema.Set).List()
   272  	m := list[0].(map[string]interface{})
   273  	check := &spotinst.HealthCheckConfig{}
   274  
   275  	if v, ok := m["protocol"].(string); ok && v != "" {
   276  		check.Protocol = spotinst.String(v)
   277  	}
   278  
   279  	if v, ok := m["endpoint"].(string); ok && v != "" {
   280  		check.Endpoint = spotinst.String(v)
   281  	}
   282  
   283  	if v, ok := m["port"].(int); ok && v >= 0 {
   284  		check.Port = spotinst.Int(v)
   285  	}
   286  
   287  	if v, ok := m["interval"].(int); ok && v >= 0 {
   288  		check.Interval = spotinst.Int(v)
   289  	}
   290  
   291  	if v, ok := m["timeout"].(int); ok && v >= 0 {
   292  		check.Timeout = spotinst.Int(v)
   293  	}
   294  
   295  	log.Printf("[DEBUG] HealthCheck check configuration: %s\n", stringutil.Stringify(check))
   296  	return check, nil
   297  }
   298  
   299  // expandHealthCheckThreshold expands the Threshold block.
   300  func expandHealthCheckThreshold(data interface{}) (*spotinst.HealthCheckThreshold, error) {
   301  	list := data.(*schema.Set).List()
   302  	m := list[0].(map[string]interface{})
   303  	threshold := &spotinst.HealthCheckThreshold{}
   304  
   305  	if v, ok := m["healthy"].(int); ok && v >= 0 {
   306  		threshold.Healthy = spotinst.Int(v)
   307  	}
   308  
   309  	if v, ok := m["unhealthy"].(int); ok && v >= 0 {
   310  		threshold.Unhealthy = spotinst.Int(v)
   311  	}
   312  
   313  	log.Printf("[DEBUG] HealthCheck threshold configuration: %s\n", stringutil.Stringify(threshold))
   314  	return threshold, nil
   315  }
   316  
   317  // expandHealthCheckProxy expands the Proxy block.
   318  func expandHealthCheckProxy(data interface{}) (*spotinst.HealthCheckProxy, error) {
   319  	list := data.(*schema.Set).List()
   320  	m := list[0].(map[string]interface{})
   321  	proxy := &spotinst.HealthCheckProxy{}
   322  
   323  	if v, ok := m["addr"].(string); ok && v != "" {
   324  		proxy.Addr = spotinst.String(v)
   325  	}
   326  
   327  	if v, ok := m["port"].(int); ok && v > 0 {
   328  		proxy.Port = spotinst.Int(v)
   329  	}
   330  
   331  	log.Printf("[DEBUG] HealthCheck proxy configuration: %s\n", stringutil.Stringify(proxy))
   332  	return proxy, nil
   333  }