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