github.com/bengesoff/terraform@v0.3.1-0.20141018223233-b25a53629922/builtin/providers/digitalocean/resource_digitalocean_record.go (about) 1 package digitalocean 2 3 import ( 4 "fmt" 5 "log" 6 "strings" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 "github.com/pearkes/digitalocean" 10 ) 11 12 func resourceRecord() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceRecordCreate, 15 Read: resourceRecordRead, 16 Update: resourceRecordUpdate, 17 Delete: resourceRecordDelete, 18 19 Schema: map[string]*schema.Schema{ 20 "type": &schema.Schema{ 21 Type: schema.TypeString, 22 Required: true, 23 ForceNew: true, 24 }, 25 26 "domain": &schema.Schema{ 27 Type: schema.TypeString, 28 Required: true, 29 ForceNew: true, 30 }, 31 32 "name": &schema.Schema{ 33 Type: schema.TypeString, 34 Optional: true, 35 }, 36 37 "port": &schema.Schema{ 38 Type: schema.TypeString, 39 Optional: true, 40 Computed: true, 41 ForceNew: true, 42 }, 43 44 "priority": &schema.Schema{ 45 Type: schema.TypeString, 46 Optional: true, 47 Computed: true, 48 ForceNew: true, 49 }, 50 51 "weight": &schema.Schema{ 52 Type: schema.TypeString, 53 Optional: true, 54 Computed: true, 55 ForceNew: true, 56 }, 57 58 "value": &schema.Schema{ 59 Type: schema.TypeString, 60 Optional: true, 61 Computed: true, 62 ForceNew: true, 63 }, 64 }, 65 } 66 } 67 68 func resourceRecordCreate(d *schema.ResourceData, meta interface{}) error { 69 p := meta.(*ResourceProvider) 70 client := p.client 71 72 newRecord := digitalocean.CreateRecord{ 73 Type: d.Get("type").(string), 74 Name: d.Get("name").(string), 75 Data: d.Get("value").(string), 76 Priority: d.Get("priority").(string), 77 Port: d.Get("port").(string), 78 Weight: d.Get("weight").(string), 79 } 80 81 log.Printf("[DEBUG] record create configuration: %#v", newRecord) 82 recId, err := client.CreateRecord(d.Get("domain").(string), &newRecord) 83 if err != nil { 84 return fmt.Errorf("Failed to create record: %s", err) 85 } 86 87 d.SetId(recId) 88 log.Printf("[INFO] Record ID: %s", d.Id()) 89 90 return resourceRecordRead(d, meta) 91 } 92 93 func resourceRecordUpdate(d *schema.ResourceData, meta interface{}) error { 94 p := meta.(*ResourceProvider) 95 client := p.client 96 97 var updateRecord digitalocean.UpdateRecord 98 if v, ok := d.GetOk("name"); ok { 99 updateRecord.Name = v.(string) 100 } 101 102 log.Printf("[DEBUG] record update configuration: %#v", updateRecord) 103 err := client.UpdateRecord(d.Get("domain").(string), d.Id(), &updateRecord) 104 if err != nil { 105 return fmt.Errorf("Failed to update record: %s", err) 106 } 107 108 return resourceRecordRead(d, meta) 109 } 110 111 func resourceRecordDelete(d *schema.ResourceData, meta interface{}) error { 112 p := meta.(*ResourceProvider) 113 client := p.client 114 115 log.Printf( 116 "[INFO] Deleting record: %s, %s", d.Get("domain").(string), d.Id()) 117 err := client.DestroyRecord(d.Get("domain").(string), d.Id()) 118 if err != nil { 119 // If the record is somehow already destroyed, mark as 120 // succesfully gone 121 if strings.Contains(err.Error(), "404 Not Found") { 122 return nil 123 } 124 125 return fmt.Errorf("Error deleting record: %s", err) 126 } 127 128 return nil 129 } 130 131 func resourceRecordRead(d *schema.ResourceData, meta interface{}) error { 132 p := meta.(*ResourceProvider) 133 client := p.client 134 135 rec, err := client.RetrieveRecord(d.Get("domain").(string), d.Id()) 136 if err != nil { 137 // If the record is somehow already destroyed, mark as 138 // succesfully gone 139 if strings.Contains(err.Error(), "404 Not Found") { 140 d.SetId("") 141 return nil 142 } 143 144 return err 145 } 146 147 d.Set("name", rec.Name) 148 d.Set("type", rec.Type) 149 d.Set("value", rec.Data) 150 d.Set("weight", rec.StringWeight()) 151 d.Set("priority", rec.StringPriority()) 152 d.Set("port", rec.StringPort()) 153 154 return nil 155 }