github.com/sarguru/terraform@v0.6.17-0.20160525232901-8fcdfd7e3dc9/builtin/providers/nsone/resource_monitoringjob.go (about)

     1  package nsone
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/bobtfish/go-nsone-api"
     6  	"github.com/hashicorp/terraform/helper/schema"
     7  	"regexp"
     8  	"strconv"
     9  )
    10  
    11  func monitoringJobResource() *schema.Resource {
    12  	return &schema.Resource{
    13  		Schema: map[string]*schema.Schema{
    14  			"id": &schema.Schema{
    15  				Type:     schema.TypeString,
    16  				Computed: true,
    17  			},
    18  			"name": &schema.Schema{
    19  				Type:     schema.TypeString,
    20  				Required: true,
    21  			},
    22  			"active": &schema.Schema{
    23  				Type:     schema.TypeBool,
    24  				Required: true,
    25  			},
    26  			"regions": &schema.Schema{
    27  				Type:     schema.TypeList,
    28  				Required: true,
    29  				Elem: &schema.Schema{
    30  					Type: schema.TypeString,
    31  				},
    32  			},
    33  			"job_type": &schema.Schema{
    34  				Type:     schema.TypeString,
    35  				Required: true,
    36  				ForceNew: true,
    37  			},
    38  			"frequency": &schema.Schema{
    39  				Type:     schema.TypeInt,
    40  				Required: true,
    41  			},
    42  			"rapid_recheck": &schema.Schema{
    43  				Type:     schema.TypeBool,
    44  				Required: true,
    45  			},
    46  			"policy": &schema.Schema{
    47  				Type:     schema.TypeString,
    48  				Required: true,
    49  				ValidateFunc: func(v interface{}, k string) (ws []string, es []error) {
    50  					value := v.(string)
    51  					if !regexp.MustCompile(`^(all|one|quorum)$`).MatchString(value) {
    52  						es = append(es, fmt.Errorf(
    53  							"only all, one, quorum allowed in %q", k))
    54  					}
    55  					return
    56  				},
    57  			},
    58  			"notes": &schema.Schema{
    59  				Type:     schema.TypeString,
    60  				Optional: true,
    61  			},
    62  			"config": &schema.Schema{
    63  				Type:     schema.TypeMap,
    64  				Required: true,
    65  			},
    66  			"notify_delay": &schema.Schema{
    67  				Type:     schema.TypeInt,
    68  				Optional: true,
    69  			},
    70  			"notify_repeat": &schema.Schema{
    71  				Type:     schema.TypeInt,
    72  				Optional: true,
    73  			},
    74  			"notify_failback": &schema.Schema{
    75  				Type:     schema.TypeBool,
    76  				Optional: true,
    77  			},
    78  			"notify_regional": &schema.Schema{
    79  				Type:     schema.TypeBool,
    80  				Optional: true,
    81  			},
    82  			"notify_list": &schema.Schema{
    83  				Type:     schema.TypeString,
    84  				Optional: true,
    85  			},
    86  			"rules": &schema.Schema{
    87  				Type:     schema.TypeList,
    88  				Optional: true,
    89  				Elem: &schema.Resource{
    90  					Schema: map[string]*schema.Schema{
    91  						"value": &schema.Schema{
    92  							Type:     schema.TypeString,
    93  							Required: true,
    94  						},
    95  						"comparison": &schema.Schema{
    96  							Type:     schema.TypeString,
    97  							Required: true,
    98  						},
    99  						"key": &schema.Schema{
   100  							Type:     schema.TypeString,
   101  							Required: true,
   102  						},
   103  					},
   104  				},
   105  			},
   106  		},
   107  		Create: MonitoringJobCreate,
   108  		Read:   MonitoringJobRead,
   109  		Update: MonitoringJobUpdate,
   110  		Delete: MonitoringJobDelete,
   111  	}
   112  }
   113  
   114  func monitoringJobToResourceData(d *schema.ResourceData, r *nsone.MonitoringJob) error {
   115  	d.SetId(r.Id)
   116  	d.Set("name", r.Name)
   117  	d.Set("job_type", r.JobType)
   118  	d.Set("active", r.Active)
   119  	d.Set("regions", r.Regions)
   120  	d.Set("frequency", r.Frequency)
   121  	d.Set("rapid_recheck", r.RapidRecheck)
   122  	config := make(map[string]string)
   123  	for k, v := range r.Config {
   124  		if k == "ssl" {
   125  			if v.(bool) {
   126  				config[k] = "1"
   127  			} else {
   128  				config[k] = "0"
   129  			}
   130  		} else {
   131  			switch t := v.(type) {
   132  			case string:
   133  				config[k] = t
   134  			case float64:
   135  				config[k] = strconv.FormatFloat(t, 'f', -1, 64)
   136  			}
   137  		}
   138  	}
   139  	err := d.Set("config", config)
   140  	if err != nil {
   141  		panic(fmt.Errorf("[DEBUG] Error setting Config error: %#v %#v", r.Config, err))
   142  	}
   143  	d.Set("policy", r.Policy)
   144  	d.Set("notes", r.Notes)
   145  	d.Set("frequency", r.Frequency)
   146  	d.Set("notify_delay", r.NotifyDelay)
   147  	d.Set("notify_repeat", r.NotifyRepeat)
   148  	d.Set("notify_regional", r.NotifyRegional)
   149  	d.Set("notify_failback", r.NotifyFailback)
   150  	d.Set("notify_list", r.NotifyList)
   151  	if len(r.Rules) > 0 {
   152  		rules := make([]map[string]interface{}, len(r.Rules))
   153  		for i, r := range r.Rules {
   154  			m := make(map[string]interface{})
   155  			m["value"] = r.Value
   156  			m["comparison"] = r.Comparison
   157  			m["key"] = r.Key
   158  			rules[i] = m
   159  		}
   160  	}
   161  	return nil
   162  }
   163  
   164  func resourceDataToMonitoringJob(r *nsone.MonitoringJob, d *schema.ResourceData) error {
   165  	r.Id = d.Id()
   166  	r.Name = d.Get("name").(string)
   167  	r.JobType = d.Get("job_type").(string)
   168  	r.Active = d.Get("active").(bool)
   169  	rawRegions := d.Get("regions").([]interface{})
   170  	r.Regions = make([]string, len(rawRegions))
   171  	for i, v := range rawRegions {
   172  		r.Regions[i] = v.(string)
   173  	}
   174  	r.Frequency = d.Get("frequency").(int)
   175  	r.RapidRecheck = d.Get("rapid_recheck").(bool)
   176  	var rawRules []interface{}
   177  	if rawRules := d.Get("rules"); rawRules != nil {
   178  		r.Rules = make([]nsone.MonitoringJobRule, len(rawRules.([]interface{})))
   179  		for i, v := range rawRules.([]interface{}) {
   180  			rule := v.(map[string]interface{})
   181  			r.Rules[i] = nsone.MonitoringJobRule{
   182  				Value:      rule["value"].(string),
   183  				Comparison: rule["comparison"].(string),
   184  				Key:        rule["key"].(string),
   185  			}
   186  		}
   187  	} else {
   188  		r.Rules = make([]nsone.MonitoringJobRule, 0)
   189  	}
   190  	for i, v := range rawRules {
   191  		rule := v.(map[string]interface{})
   192  		r.Rules[i] = nsone.MonitoringJobRule{
   193  			Comparison: rule["comparison"].(string),
   194  			Key:        rule["key"].(string),
   195  		}
   196  		value := rule["value"].(string)
   197  		if i, err := strconv.Atoi(value); err == nil {
   198  			r.Rules[i].Value = i
   199  		} else {
   200  			r.Rules[i].Value = value
   201  		}
   202  	}
   203  	config := make(map[string]interface{})
   204  	if rawConfig := d.Get("config"); rawConfig != nil {
   205  		for k, v := range rawConfig.(map[string]interface{}) {
   206  			if k == "ssl" {
   207  				if v.(string) == "1" {
   208  					config[k] = true
   209  				}
   210  			} else {
   211  				if i, err := strconv.Atoi(v.(string)); err == nil {
   212  					config[k] = i
   213  				} else {
   214  					config[k] = v
   215  				}
   216  			}
   217  		}
   218  	}
   219  	r.Config = config
   220  	r.RegionScope = "fixed"
   221  	r.Policy = d.Get("policy").(string)
   222  	if v, ok := d.GetOk("notes"); ok {
   223  		r.Notes = v.(string)
   224  	}
   225  	r.Frequency = d.Get("frequency").(int)
   226  	if v, ok := d.GetOk("notify_delay"); ok {
   227  		r.NotifyDelay = v.(int)
   228  	}
   229  	if v, ok := d.GetOk("notify_repeat"); ok {
   230  		r.NotifyRepeat = v.(int)
   231  	}
   232  	if v, ok := d.GetOk("notify_regional"); ok {
   233  		r.NotifyRegional = v.(bool)
   234  	}
   235  	if v, ok := d.GetOk("notify_failback"); ok {
   236  		r.NotifyFailback = v.(bool)
   237  	}
   238  	if v, ok := d.GetOk("notify_list"); ok {
   239  		r.NotifyList = v.(string)
   240  	}
   241  	return nil
   242  }
   243  
   244  // MonitoringJobCreate Creates monitoring job in ns1
   245  func MonitoringJobCreate(d *schema.ResourceData, meta interface{}) error {
   246  	client := meta.(*nsone.APIClient)
   247  	mj := nsone.MonitoringJob{}
   248  	if err := resourceDataToMonitoringJob(&mj, d); err != nil {
   249  		return err
   250  	}
   251  	if err := client.CreateMonitoringJob(&mj); err != nil {
   252  		return err
   253  	}
   254  	return monitoringJobToResourceData(d, &mj)
   255  }
   256  
   257  // MonitoringJobRead reads the given monitoring job from ns1
   258  func MonitoringJobRead(d *schema.ResourceData, meta interface{}) error {
   259  	client := meta.(*nsone.APIClient)
   260  	mj, err := client.GetMonitoringJob(d.Id())
   261  	if err != nil {
   262  		return err
   263  	}
   264  	monitoringJobToResourceData(d, &mj)
   265  	return nil
   266  }
   267  
   268  // MonitoringJobDelete deteltes the given monitoring job from ns1
   269  func MonitoringJobDelete(d *schema.ResourceData, meta interface{}) error {
   270  	client := meta.(*nsone.APIClient)
   271  	err := client.DeleteMonitoringJob(d.Id())
   272  	d.SetId("")
   273  	return err
   274  }
   275  
   276  // MonitoringJobUpdate updates the given monitoring job
   277  func MonitoringJobUpdate(d *schema.ResourceData, meta interface{}) error {
   278  	client := meta.(*nsone.APIClient)
   279  	mj := nsone.MonitoringJob{
   280  		Id: d.Id(),
   281  	}
   282  	if err := resourceDataToMonitoringJob(&mj, d); err != nil {
   283  		return err
   284  	}
   285  	if err := client.UpdateMonitoringJob(&mj); err != nil {
   286  		return err
   287  	}
   288  	monitoringJobToResourceData(d, &mj)
   289  	return nil
   290  }