github.com/sixgill/terraform@v0.9.0-beta2.0.20170316214032-033f6226ae50/builtin/providers/scaleway/resource_scaleway_ip.go (about) 1 package scaleway 2 3 import ( 4 "log" 5 "sync" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "github.com/scaleway/scaleway-cli/pkg/api" 9 ) 10 11 func resourceScalewayIP() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourceScalewayIPCreate, 14 Read: resourceScalewayIPRead, 15 Update: resourceScalewayIPUpdate, 16 Delete: resourceScalewayIPDelete, 17 Importer: &schema.ResourceImporter{ 18 State: schema.ImportStatePassthrough, 19 }, 20 21 Schema: map[string]*schema.Schema{ 22 "server": &schema.Schema{ 23 Type: schema.TypeString, 24 Optional: true, 25 }, 26 "ip": &schema.Schema{ 27 Type: schema.TypeString, 28 Computed: true, 29 }, 30 }, 31 } 32 } 33 34 var mu = sync.Mutex{} 35 36 func resourceScalewayIPCreate(d *schema.ResourceData, m interface{}) error { 37 scaleway := m.(*Client).scaleway 38 mu.Lock() 39 defer mu.Unlock() 40 resp, err := scaleway.NewIP() 41 if err != nil { 42 return err 43 } 44 45 d.SetId(resp.IP.ID) 46 return resourceScalewayIPUpdate(d, m) 47 } 48 49 func resourceScalewayIPRead(d *schema.ResourceData, m interface{}) error { 50 scaleway := m.(*Client).scaleway 51 log.Printf("[DEBUG] Reading IP\n") 52 53 resp, err := scaleway.GetIP(d.Id()) 54 if err != nil { 55 log.Printf("[DEBUG] Error reading ip: %q\n", err) 56 if serr, ok := err.(api.ScalewayAPIError); ok { 57 if serr.StatusCode == 404 { 58 d.SetId("") 59 return nil 60 } 61 } 62 return err 63 } 64 65 d.Set("ip", resp.IP.Address) 66 if resp.IP.Server != nil { 67 d.Set("server", resp.IP.Server.Identifier) 68 } 69 return nil 70 } 71 72 func resourceScalewayIPUpdate(d *schema.ResourceData, m interface{}) error { 73 scaleway := m.(*Client).scaleway 74 if d.HasChange("server") { 75 if d.Get("server").(string) != "" { 76 log.Printf("[DEBUG] Attaching IP %q to server %q\n", d.Id(), d.Get("server").(string)) 77 if err := scaleway.AttachIP(d.Id(), d.Get("server").(string)); err != nil { 78 return err 79 } 80 } else { 81 log.Printf("[DEBUG] Detaching IP %q\n", d.Id()) 82 return scaleway.DetachIP(d.Id()) 83 } 84 } 85 86 return resourceScalewayIPRead(d, m) 87 } 88 89 func resourceScalewayIPDelete(d *schema.ResourceData, m interface{}) error { 90 scaleway := m.(*Client).scaleway 91 err := scaleway.DeleteIP(d.Id()) 92 if err != nil { 93 return err 94 } 95 d.SetId("") 96 return nil 97 }