github.com/renier/terraform@v0.7.8-0.20161024133817-eb8a9ef5471a/builtin/providers/scaleway/resource_scaleway_volume.go (about)

     1  package scaleway
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	"github.com/scaleway/scaleway-cli/pkg/api"
     9  )
    10  
    11  const gb uint64 = 1000 * 1000 * 1000
    12  
    13  func resourceScalewayVolume() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceScalewayVolumeCreate,
    16  		Read:   resourceScalewayVolumeRead,
    17  		Update: resourceScalewayVolumeUpdate,
    18  		Delete: resourceScalewayVolumeDelete,
    19  		Importer: &schema.ResourceImporter{
    20  			State: schema.ImportStatePassthrough,
    21  		},
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"name": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  			},
    28  			"size_in_gb": &schema.Schema{
    29  				Type:     schema.TypeInt,
    30  				Required: true,
    31  				ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
    32  					value := v.(int)
    33  					if value < 1 || value > 150 {
    34  						errors = append(errors, fmt.Errorf("%q be more than 1 and less than 150", k))
    35  					}
    36  					return
    37  				},
    38  			},
    39  			"type": &schema.Schema{
    40  				Type:     schema.TypeString,
    41  				Required: true,
    42  				ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
    43  					value := v.(string)
    44  					if value != "l_ssd" {
    45  						errors = append(errors, fmt.Errorf("%q must be l_ssd", k))
    46  					}
    47  					return
    48  				},
    49  			},
    50  			"server": &schema.Schema{
    51  				Type:     schema.TypeString,
    52  				Computed: true,
    53  			},
    54  		},
    55  	}
    56  }
    57  
    58  func resourceScalewayVolumeCreate(d *schema.ResourceData, m interface{}) error {
    59  	scaleway := m.(*Client).scaleway
    60  	size := uint64(d.Get("size_in_gb").(int)) * gb
    61  	req := api.ScalewayVolumeDefinition{
    62  		Name:         d.Get("name").(string),
    63  		Size:         size,
    64  		Type:         d.Get("type").(string),
    65  		Organization: scaleway.Organization,
    66  	}
    67  	volumeID, err := scaleway.PostVolume(req)
    68  	if err != nil {
    69  		return fmt.Errorf("Error Creating volume: %q", err)
    70  	}
    71  	d.SetId(volumeID)
    72  	return resourceScalewayVolumeRead(d, m)
    73  }
    74  
    75  func resourceScalewayVolumeRead(d *schema.ResourceData, m interface{}) error {
    76  	scaleway := m.(*Client).scaleway
    77  	volume, err := scaleway.GetVolume(d.Id())
    78  	if err != nil {
    79  		if serr, ok := err.(api.ScalewayAPIError); ok {
    80  			log.Printf("[DEBUG] Error reading volume: %q\n", serr.APIMessage)
    81  
    82  			if serr.StatusCode == 404 {
    83  				d.SetId("")
    84  				return nil
    85  			}
    86  		}
    87  
    88  		return err
    89  	}
    90  	d.Set("name", volume.Name)
    91  	d.Set("size_in_gb", volume.Size/gb)
    92  	d.Set("type", volume.VolumeType)
    93  	d.Set("server", "")
    94  	if volume.Server != nil {
    95  		d.Set("server", volume.Server.Identifier)
    96  	}
    97  	return nil
    98  }
    99  
   100  func resourceScalewayVolumeUpdate(d *schema.ResourceData, m interface{}) error {
   101  	scaleway := m.(*Client).scaleway
   102  
   103  	var req api.ScalewayVolumePutDefinition
   104  	if d.HasChange("name") {
   105  		req.Name = String(d.Get("name").(string))
   106  	}
   107  
   108  	if d.HasChange("size_in_gb") {
   109  		size := uint64(d.Get("size_in_gb").(int)) * gb
   110  		req.Size = &size
   111  	}
   112  
   113  	scaleway.PutVolume(d.Id(), req)
   114  	return resourceScalewayVolumeRead(d, m)
   115  }
   116  
   117  func resourceScalewayVolumeDelete(d *schema.ResourceData, m interface{}) error {
   118  	scaleway := m.(*Client).scaleway
   119  	err := scaleway.DeleteVolume(d.Id())
   120  	if err != nil {
   121  		if serr, ok := err.(api.ScalewayAPIError); ok {
   122  			if serr.StatusCode == 404 {
   123  				d.SetId("")
   124  				return nil
   125  			}
   126  		}
   127  		return err
   128  	}
   129  	d.SetId("")
   130  	return nil
   131  }