terraform/builtin/providers/ultradns/resource_ultradns_probe_pin...

219 lines
5.6 KiB
Go

package ultradns
import (
"fmt"
"log"
"github.com/Ensighten/udnssdk"
"github.com/hashicorp/terraform/helper/schema"
)
func resourceUltradnsProbePing() *schema.Resource {
return &schema.Resource{
Create: resourceUltradnsProbePingCreate,
Read: resourceUltradnsProbePingRead,
Update: resourceUltradnsProbePingUpdate,
Delete: resourceUltradnsProbePingDelete,
Schema: map[string]*schema.Schema{
// Key
"zone": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"pool_record": &schema.Schema{
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
// Required
"agents": &schema.Schema{
Type: schema.TypeList,
Required: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"threshold": &schema.Schema{
Type: schema.TypeInt,
Required: true,
},
// Optional
"interval": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Default: "FIVE_MINUTES",
},
"ping_probe": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: schemaPingProbe(),
},
// Computed
"id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
},
},
}
}
func resourceUltradnsProbePingCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*udnssdk.Client)
r, err := makePingProbeResource(d)
if err != nil {
return fmt.Errorf("Could not load ultradns_probe_ping configuration: %v", err)
}
log.Printf("[INFO] ultradns_probe_ping create: %#v, detail: %#v", r, r.Details.Detail)
resp, err := client.Probes.Create(r.Key().RRSetKey(), r.ProbeInfoDTO())
if err != nil {
return fmt.Errorf("create failed: %v", err)
}
uri := resp.Header.Get("Location")
d.Set("uri", uri)
d.SetId(uri)
log.Printf("[INFO] ultradns_probe_ping.id: %v", d.Id())
return resourceUltradnsProbePingRead(d, meta)
}
func resourceUltradnsProbePingRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*udnssdk.Client)
r, err := makePingProbeResource(d)
if err != nil {
return fmt.Errorf("Could not load ultradns_probe_ping configuration: %v", err)
}
log.Printf("[DEBUG] ultradns_probe_ping read: %#v", r)
probe, _, err := client.Probes.Find(r.Key())
log.Printf("[DEBUG] ultradns_probe_ping response: %#v", probe)
if err != nil {
uderr, ok := err.(*udnssdk.ErrorResponseList)
if ok {
for _, r := range uderr.Responses {
// 70002 means Probes Not Found
if r.ErrorCode == 70002 {
d.SetId("")
return nil
}
return fmt.Errorf("not found: %s", err)
}
}
return fmt.Errorf("not found: %s", err)
}
return populateResourceDataFromPingProbe(probe, d)
}
func resourceUltradnsProbePingUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*udnssdk.Client)
r, err := makePingProbeResource(d)
if err != nil {
return fmt.Errorf("Could not load ultradns_probe_ping configuration: %v", err)
}
log.Printf("[INFO] ultradns_probe_ping update: %+v", r)
_, err = client.Probes.Update(r.Key(), r.ProbeInfoDTO())
if err != nil {
return fmt.Errorf("update failed: %s", err)
}
return resourceUltradnsProbePingRead(d, meta)
}
func resourceUltradnsProbePingDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*udnssdk.Client)
r, err := makePingProbeResource(d)
if err != nil {
return fmt.Errorf("Could not load ultradns_probe_ping configuration: %s", err)
}
log.Printf("[INFO] ultradns_probe_ping delete: %+v", r)
_, err = client.Probes.Delete(r.Key())
if err != nil {
return fmt.Errorf("delete failed: %s", err)
}
return nil
}
// Resource Helpers
func makePingProbeResource(d *schema.ResourceData) (probeResource, error) {
p := probeResource{}
p.Zone = d.Get("zone").(string)
p.Name = d.Get("name").(string)
p.ID = d.Id()
p.Interval = d.Get("interval").(string)
p.PoolRecord = d.Get("pool_record").(string)
p.Threshold = d.Get("threshold").(int)
for _, a := range d.Get("agents").([]interface{}) {
p.Agents = append(p.Agents, a.(string))
}
p.Type = udnssdk.PingProbeType
pps := d.Get("ping_probe").([]interface{})
if len(pps) >= 1 {
if len(pps) > 1 {
return p, fmt.Errorf("ping_probe: only 0 or 1 blocks alowed, got: %#v", len(pps))
}
p.Details = makePingProbeDetails(pps[0])
}
return p, nil
}
func makePingProbeDetails(configured interface{}) *udnssdk.ProbeDetailsDTO {
data := configured.(map[string]interface{})
// Convert limits from flattened set format to mapping.
ls := make(map[string]udnssdk.ProbeDetailsLimitDTO)
for _, limit := range data["limit"].(*schema.Set).List() {
l := limit.(map[string]interface{})
name := l["name"].(string)
ls[name] = *makeProbeDetailsLimit(l)
}
res := udnssdk.ProbeDetailsDTO{
Detail: udnssdk.PingProbeDetailsDTO{
Limits: ls,
PacketSize: data["packet_size"].(int),
Packets: data["packets"].(int),
},
}
return &res
}
func populateResourceDataFromPingProbe(p udnssdk.ProbeInfoDTO, d *schema.ResourceData) error {
d.SetId(p.ID)
d.Set("pool_record", p.PoolRecord)
d.Set("interval", p.Interval)
d.Set("agents", p.Agents)
d.Set("threshold", p.Threshold)
pd, err := p.Details.PingProbeDetails()
if err != nil {
return fmt.Errorf("ProbeInfo.details could not be unmarshalled: %v, Details: %#v", err, p.Details)
}
pp := map[string]interface{}{
"packets": pd.Packets,
"packet_size": pd.PacketSize,
"limit": makeSetFromLimits(pd.Limits),
}
err = d.Set("ping_probe", []map[string]interface{}{pp})
if err != nil {
return fmt.Errorf("ping_probe set failed: %v, from %#v", err, pp)
}
return nil
}