github.com/btobolaski/terraform@v0.6.4-0.20150928030114-0c3f2a915c02/builtin/providers/cloudstack/resource_cloudstack_vpc.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	"github.com/xanzy/go-cloudstack/cloudstack"
    10  )
    11  
    12  func resourceCloudStackVPC() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceCloudStackVPCCreate,
    15  		Read:   resourceCloudStackVPCRead,
    16  		Update: resourceCloudStackVPCUpdate,
    17  		Delete: resourceCloudStackVPCDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"name": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  			},
    24  
    25  			"display_text": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Optional: true,
    28  				Computed: true,
    29  			},
    30  
    31  			"cidr": &schema.Schema{
    32  				Type:     schema.TypeString,
    33  				Required: true,
    34  				ForceNew: true,
    35  			},
    36  
    37  			"vpc_offering": &schema.Schema{
    38  				Type:     schema.TypeString,
    39  				Required: true,
    40  				ForceNew: true,
    41  			},
    42  
    43  			"network_domain": &schema.Schema{
    44  				Type:     schema.TypeString,
    45  				Optional: true,
    46  				ForceNew: true,
    47  			},
    48  
    49  			"project": &schema.Schema{
    50  				Type:     schema.TypeString,
    51  				Optional: true,
    52  				ForceNew: true,
    53  			},
    54  
    55  			"zone": &schema.Schema{
    56  				Type:     schema.TypeString,
    57  				Required: true,
    58  				ForceNew: true,
    59  			},
    60  		},
    61  	}
    62  }
    63  
    64  func resourceCloudStackVPCCreate(d *schema.ResourceData, meta interface{}) error {
    65  	cs := meta.(*cloudstack.CloudStackClient)
    66  
    67  	name := d.Get("name").(string)
    68  
    69  	// Retrieve the vpc_offering UUID
    70  	vpcofferingid, e := retrieveUUID(cs, "vpc_offering", d.Get("vpc_offering").(string))
    71  	if e != nil {
    72  		return e.Error()
    73  	}
    74  
    75  	// Retrieve the zone UUID
    76  	zoneid, e := retrieveUUID(cs, "zone", d.Get("zone").(string))
    77  	if e != nil {
    78  		return e.Error()
    79  	}
    80  
    81  	// Set the display text
    82  	displaytext, ok := d.GetOk("display_text")
    83  	if !ok {
    84  		displaytext = name
    85  	}
    86  
    87  	// Create a new parameter struct
    88  	p := cs.VPC.NewCreateVPCParams(
    89  		d.Get("cidr").(string),
    90  		displaytext.(string),
    91  		name,
    92  		vpcofferingid,
    93  		zoneid,
    94  	)
    95  
    96  	// If there is a network domain supplied, make sure to add it to the request
    97  	if networkDomain, ok := d.GetOk("network_domain"); ok {
    98  		// Set the network domain
    99  		p.SetNetworkdomain(networkDomain.(string))
   100  	}
   101  
   102  	// If there is a project supplied, we retrieve and set the project id
   103  	if project, ok := d.GetOk("project"); ok {
   104  		// Retrieve the project UUID
   105  		projectid, e := retrieveUUID(cs, "project", project.(string))
   106  		if e != nil {
   107  			return e.Error()
   108  		}
   109  		// Set the default project ID
   110  		p.SetProjectid(projectid)
   111  	}
   112  
   113  	// Create the new VPC
   114  	r, err := cs.VPC.CreateVPC(p)
   115  	if err != nil {
   116  		return fmt.Errorf("Error creating VPC %s: %s", name, err)
   117  	}
   118  
   119  	d.SetId(r.Id)
   120  
   121  	return resourceCloudStackVPCRead(d, meta)
   122  }
   123  
   124  func resourceCloudStackVPCRead(d *schema.ResourceData, meta interface{}) error {
   125  	cs := meta.(*cloudstack.CloudStackClient)
   126  
   127  	// Get the VPC details
   128  	v, count, err := cs.VPC.GetVPCByID(d.Id())
   129  	if err != nil {
   130  		if count == 0 {
   131  			log.Printf(
   132  				"[DEBUG] VPC %s does no longer exist", d.Get("name").(string))
   133  			d.SetId("")
   134  			return nil
   135  		}
   136  
   137  		return err
   138  	}
   139  
   140  	d.Set("name", v.Name)
   141  	d.Set("display_text", v.Displaytext)
   142  	d.Set("cidr", v.Cidr)
   143  	d.Set("network_domain", v.Networkdomain)
   144  
   145  	// Get the VPC offering details
   146  	o, _, err := cs.VPC.GetVPCOfferingByID(v.Vpcofferingid)
   147  	if err != nil {
   148  		return err
   149  	}
   150  
   151  	setValueOrUUID(d, "vpc_offering", o.Name, v.Vpcofferingid)
   152  	setValueOrUUID(d, "project", v.Project, v.Projectid)
   153  	setValueOrUUID(d, "zone", v.Zonename, v.Zoneid)
   154  
   155  	return nil
   156  }
   157  
   158  func resourceCloudStackVPCUpdate(d *schema.ResourceData, meta interface{}) error {
   159  	cs := meta.(*cloudstack.CloudStackClient)
   160  
   161  	// Check if the name or display text is changed
   162  	if d.HasChange("name") || d.HasChange("display_text") {
   163  		// Create a new parameter struct
   164  		p := cs.VPC.NewUpdateVPCParams(d.Id())
   165  
   166  		// Set the display text
   167  		displaytext, ok := d.GetOk("display_text")
   168  		if !ok {
   169  			displaytext = d.Get("name")
   170  		}
   171  		// Set the (new) display text
   172  		p.SetDisplaytext(displaytext.(string))
   173  
   174  		// Update the VPC
   175  		_, err := cs.VPC.UpdateVPC(p)
   176  		if err != nil {
   177  			return fmt.Errorf(
   178  				"Error updating VPC %s: %s", d.Get("name").(string), err)
   179  		}
   180  	}
   181  
   182  	return resourceCloudStackVPCRead(d, meta)
   183  }
   184  
   185  func resourceCloudStackVPCDelete(d *schema.ResourceData, meta interface{}) error {
   186  	cs := meta.(*cloudstack.CloudStackClient)
   187  
   188  	// Create a new parameter struct
   189  	p := cs.VPC.NewDeleteVPCParams(d.Id())
   190  
   191  	// Delete the VPC
   192  	_, err := cs.VPC.DeleteVPC(p)
   193  	if err != nil {
   194  		// This is a very poor way to be told the UUID does no longer exist :(
   195  		if strings.Contains(err.Error(), fmt.Sprintf(
   196  			"Invalid parameter id value=%s due to incorrect long value format, "+
   197  				"or entity does not exist", d.Id())) {
   198  			return nil
   199  		}
   200  
   201  		return fmt.Errorf("Error deleting VPC %s: %s", d.Get("name").(string), err)
   202  	}
   203  
   204  	return nil
   205  }