github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/triton/resource_vlan.go (about)

     1  package triton
     2  
     3  import (
     4  	"errors"
     5  	"strconv"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	"github.com/joyent/triton-go"
     9  )
    10  
    11  func resourceVLAN() *schema.Resource {
    12  	return &schema.Resource{
    13  		Create:   resourceVLANCreate,
    14  		Exists:   resourceVLANExists,
    15  		Read:     resourceVLANRead,
    16  		Update:   resourceVLANUpdate,
    17  		Delete:   resourceVLANDelete,
    18  		Timeouts: fastResourceTimeout,
    19  		Importer: &schema.ResourceImporter{
    20  			State: schema.ImportStatePassthrough,
    21  		},
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"vlan_id": {
    25  				Description: "Number between 0-4095 indicating VLAN ID",
    26  				Required:    true,
    27  				ForceNew:    true,
    28  				Type:        schema.TypeInt,
    29  				ValidateFunc: func(val interface{}, field string) (warn []string, err []error) {
    30  					value := val.(int)
    31  					if value < 0 || value > 4095 {
    32  						err = append(err, errors.New("vlan_id must be between 0 and 4095"))
    33  					}
    34  					return
    35  				},
    36  			},
    37  			"name": {
    38  				Description: "Unique name to identify VLAN",
    39  				Required:    true,
    40  				Type:        schema.TypeString,
    41  			},
    42  			"description": {
    43  				Description: "Description of the VLAN",
    44  				Optional:    true,
    45  				Type:        schema.TypeString,
    46  			},
    47  		},
    48  	}
    49  }
    50  
    51  func resourceVLANCreate(d *schema.ResourceData, meta interface{}) error {
    52  	client := meta.(*triton.Client)
    53  
    54  	vlan, err := client.Fabrics().CreateFabricVLAN(&triton.CreateFabricVLANInput{
    55  		ID:          d.Get("vlan_id").(int),
    56  		Name:        d.Get("name").(string),
    57  		Description: d.Get("description").(string),
    58  	})
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	d.SetId(strconv.Itoa(vlan.ID))
    64  	return resourceVLANRead(d, meta)
    65  }
    66  
    67  func resourceVLANExists(d *schema.ResourceData, meta interface{}) (bool, error) {
    68  	client := meta.(*triton.Client)
    69  
    70  	id, err := resourceVLANIDInt(d.Id())
    71  	if err != nil {
    72  		return false, err
    73  	}
    74  
    75  	return resourceExists(client.Fabrics().GetFabricVLAN(&triton.GetFabricVLANInput{
    76  		ID: id,
    77  	}))
    78  }
    79  
    80  func resourceVLANRead(d *schema.ResourceData, meta interface{}) error {
    81  	client := meta.(*triton.Client)
    82  
    83  	id, err := resourceVLANIDInt(d.Id())
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	vlan, err := client.Fabrics().GetFabricVLAN(&triton.GetFabricVLANInput{
    89  		ID: id,
    90  	})
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	d.Set("vlan_id", vlan.ID)
    96  	d.Set("name", vlan.Name)
    97  	d.Set("description", vlan.Description)
    98  
    99  	return nil
   100  }
   101  
   102  func resourceVLANUpdate(d *schema.ResourceData, meta interface{}) error {
   103  	client := meta.(*triton.Client)
   104  
   105  	vlan, err := client.Fabrics().UpdateFabricVLAN(&triton.UpdateFabricVLANInput{
   106  		ID:          d.Get("vlan_id").(int),
   107  		Name:        d.Get("name").(string),
   108  		Description: d.Get("description").(string),
   109  	})
   110  	if err != nil {
   111  		return err
   112  	}
   113  
   114  	d.SetId(strconv.Itoa(vlan.ID))
   115  	return resourceVLANRead(d, meta)
   116  }
   117  
   118  func resourceVLANDelete(d *schema.ResourceData, meta interface{}) error {
   119  	client := meta.(*triton.Client)
   120  
   121  	id, err := resourceVLANIDInt(d.Id())
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	return client.Fabrics().DeleteFabricVLAN(&triton.DeleteFabricVLANInput{
   127  		ID: id,
   128  	})
   129  }
   130  
   131  func resourceVLANIDInt(id string) (int, error) {
   132  	result, err := strconv.ParseInt(id, 10, 32)
   133  	if err != nil {
   134  		return -1, err
   135  	}
   136  
   137  	return int(result), nil
   138  }