github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/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 "zone": &schema.Schema{ 44 Type: schema.TypeString, 45 Required: true, 46 ForceNew: true, 47 }, 48 }, 49 } 50 } 51 52 func resourceCloudStackVPCCreate(d *schema.ResourceData, meta interface{}) error { 53 cs := meta.(*cloudstack.CloudStackClient) 54 55 name := d.Get("name").(string) 56 57 // Retrieve the vpc_offering UUID 58 vpcofferingid, e := retrieveUUID(cs, "vpc_offering", d.Get("vpc_offering").(string)) 59 if e != nil { 60 return e.Error() 61 } 62 63 // Retrieve the zone UUID 64 zoneid, e := retrieveUUID(cs, "zone", d.Get("zone").(string)) 65 if e != nil { 66 return e.Error() 67 } 68 69 // Set the display text 70 displaytext, ok := d.GetOk("display_text") 71 if !ok { 72 displaytext = name 73 } 74 75 // Create a new parameter struct 76 p := cs.VPC.NewCreateVPCParams(d.Get("cidr").(string), displaytext.(string), name, vpcofferingid, zoneid) 77 78 // Create the new VPC 79 r, err := cs.VPC.CreateVPC(p) 80 if err != nil { 81 return fmt.Errorf("Error creating VPC %s: %s", name, err) 82 } 83 84 d.SetId(r.Id) 85 86 return resourceCloudStackVPCRead(d, meta) 87 } 88 89 func resourceCloudStackVPCRead(d *schema.ResourceData, meta interface{}) error { 90 cs := meta.(*cloudstack.CloudStackClient) 91 92 // Get the VPC details 93 v, count, err := cs.VPC.GetVPCByID(d.Id()) 94 if err != nil { 95 if count == 0 { 96 log.Printf( 97 "[DEBUG] VPC %s does no longer exist", d.Get("name").(string)) 98 d.SetId("") 99 return nil 100 } 101 102 return err 103 } 104 105 d.Set("name", v.Name) 106 d.Set("display_text", v.Displaytext) 107 d.Set("cidr", v.Cidr) 108 d.Set("zone", v.Zonename) 109 110 // Get the VPC offering details 111 o, _, err := cs.VPC.GetVPCOfferingByID(v.Vpcofferingid) 112 if err != nil { 113 return err 114 } 115 116 d.Set("vpc_offering", o.Name) 117 118 return nil 119 } 120 121 func resourceCloudStackVPCUpdate(d *schema.ResourceData, meta interface{}) error { 122 cs := meta.(*cloudstack.CloudStackClient) 123 124 // Check if the name or display text is changed 125 if d.HasChange("name") || d.HasChange("display_text") { 126 // Create a new parameter struct 127 p := cs.VPC.NewUpdateVPCParams(d.Id()) 128 129 // Set the display text 130 displaytext, ok := d.GetOk("display_text") 131 if !ok { 132 displaytext = d.Get("name") 133 } 134 // Set the (new) display text 135 p.SetDisplaytext(displaytext.(string)) 136 137 // Update the VPC 138 _, err := cs.VPC.UpdateVPC(p) 139 if err != nil { 140 return fmt.Errorf( 141 "Error updating VPC %s: %s", d.Get("name").(string), err) 142 } 143 } 144 145 return resourceCloudStackVPCRead(d, meta) 146 } 147 148 func resourceCloudStackVPCDelete(d *schema.ResourceData, meta interface{}) error { 149 cs := meta.(*cloudstack.CloudStackClient) 150 151 // Create a new parameter struct 152 p := cs.VPC.NewDeleteVPCParams(d.Id()) 153 154 // Delete the VPC 155 _, err := cs.VPC.DeleteVPC(p) 156 if err != nil { 157 // This is a very poor way to be told the UUID does no longer exist :( 158 if strings.Contains(err.Error(), fmt.Sprintf( 159 "Invalid parameter id value=%s due to incorrect long value format, "+ 160 "or entity does not exist", d.Id())) { 161 return nil 162 } 163 164 return fmt.Errorf("Error deleting VPC %s: %s", d.Get("name").(string), err) 165 } 166 167 return nil 168 }