134 lines
2.7 KiB
Go
134 lines
2.7 KiB
Go
package oneandone
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
"strings"
|
|
)
|
|
|
|
func resourceOneandOnePublicIp() *schema.Resource {
|
|
return &schema.Resource{
|
|
|
|
Create: resourceOneandOnePublicIpCreate,
|
|
Read: resourceOneandOnePublicIpRead,
|
|
Update: resourceOneandOnePublicIpUpdate,
|
|
Delete: resourceOneandOnePublicIpDelete,
|
|
Schema: map[string]*schema.Schema{
|
|
"ip_type": { //IPV4 or IPV6
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"reverse_dns": {
|
|
Type: schema.TypeString,
|
|
Optional: true,
|
|
},
|
|
"datacenter": {
|
|
Type: schema.TypeString,
|
|
Optional: true,
|
|
},
|
|
"ip_address": {
|
|
Type: schema.TypeString,
|
|
Computed: true,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func resourceOneandOnePublicIpCreate(d *schema.ResourceData, meta interface{}) error {
|
|
config := meta.(*Config)
|
|
|
|
var reverse_dns string
|
|
var datacenter_id string
|
|
|
|
if raw, ok := d.GetOk("reverse_dns"); ok {
|
|
reverse_dns = raw.(string)
|
|
}
|
|
|
|
if raw, ok := d.GetOk("datacenter"); ok {
|
|
dcs, err := config.API.ListDatacenters()
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("An error occured while fetching list of datacenters %s", err)
|
|
|
|
}
|
|
|
|
decenter := raw.(string)
|
|
for _, dc := range dcs {
|
|
if strings.ToLower(dc.CountryCode) == strings.ToLower(decenter) {
|
|
datacenter_id = dc.Id
|
|
break
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
ip_id, ip, err := config.API.CreatePublicIp(d.Get("ip_type").(string), reverse_dns, datacenter_id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = config.API.WaitForState(ip, "ACTIVE", 10, config.Retries)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
d.SetId(ip_id)
|
|
|
|
return resourceOneandOnePublicIpRead(d, meta)
|
|
}
|
|
|
|
func resourceOneandOnePublicIpRead(d *schema.ResourceData, meta interface{}) error {
|
|
config := meta.(*Config)
|
|
|
|
ip, err := config.API.GetPublicIp(d.Id())
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), "404") {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
return err
|
|
}
|
|
|
|
d.Set("ip_address", ip.IpAddress)
|
|
d.Set("revers_dns", ip.ReverseDns)
|
|
d.Set("datacenter", ip.Datacenter.CountryCode)
|
|
d.Set("ip_type", ip.Type)
|
|
|
|
return nil
|
|
}
|
|
|
|
func resourceOneandOnePublicIpUpdate(d *schema.ResourceData, meta interface{}) error {
|
|
config := meta.(*Config)
|
|
|
|
if d.HasChange("reverse_dns") {
|
|
_, n := d.GetChange("reverse_dns")
|
|
ip, err := config.API.UpdatePublicIp(d.Id(), n.(string))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = config.API.WaitForState(ip, "ACTIVE", 10, config.Retries)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return resourceOneandOnePublicIpRead(d, meta)
|
|
}
|
|
|
|
func resourceOneandOnePublicIpDelete(d *schema.ResourceData, meta interface{}) error {
|
|
config := meta.(*Config)
|
|
|
|
ip, err := config.API.DeletePublicIp(d.Id())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = config.API.WaitUntilDeleted(ip)
|
|
if err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|