github.com/bradfeehan/terraform@v0.7.0-rc3.0.20170529055808-34b45c5ad841/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 Computed: true, 25 }, 26 "ip": { 27 Type: schema.TypeString, 28 Computed: true, 29 }, 30 }, 31 } 32 } 33 34 func resourceScalewayIPCreate(d *schema.ResourceData, m interface{}) error { 35 scaleway := m.(*Client).scaleway 36 37 mu.Lock() 38 resp, err := scaleway.NewIP() 39 mu.Unlock() 40 if err != nil { 41 return err 42 } 43 44 d.SetId(resp.IP.ID) 45 return resourceScalewayIPUpdate(d, m) 46 } 47 48 func resourceScalewayIPRead(d *schema.ResourceData, m interface{}) error { 49 scaleway := m.(*Client).scaleway 50 log.Printf("[DEBUG] Reading IP\n") 51 52 resp, err := scaleway.GetIP(d.Id()) 53 if err != nil { 54 log.Printf("[DEBUG] Error reading ip: %q\n", err) 55 if serr, ok := err.(api.ScalewayAPIError); ok { 56 if serr.StatusCode == 404 { 57 d.SetId("") 58 return nil 59 } 60 } 61 return err 62 } 63 64 d.Set("ip", resp.IP.Address) 65 if resp.IP.Server != nil { 66 d.Set("server", resp.IP.Server.Identifier) 67 } 68 return nil 69 } 70 71 func resourceScalewayIPUpdate(d *schema.ResourceData, m interface{}) error { 72 scaleway := m.(*Client).scaleway 73 74 mu.Lock() 75 defer mu.Unlock() 76 77 if d.HasChange("server") { 78 if d.Get("server").(string) != "" { 79 log.Printf("[DEBUG] Attaching IP %q to server %q\n", d.Id(), d.Get("server").(string)) 80 if err := scaleway.AttachIP(d.Id(), d.Get("server").(string)); err != nil { 81 return err 82 } 83 } else { 84 log.Printf("[DEBUG] Detaching IP %q\n", d.Id()) 85 return scaleway.DetachIP(d.Id()) 86 } 87 } 88 89 return resourceScalewayIPRead(d, m) 90 } 91 92 func resourceScalewayIPDelete(d *schema.ResourceData, m interface{}) error { 93 scaleway := m.(*Client).scaleway 94 95 mu.Lock() 96 defer mu.Unlock() 97 98 err := scaleway.DeleteIP(d.Id()) 99 if err != nil { 100 return err 101 } 102 d.SetId("") 103 return nil 104 }