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 }