github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/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  }