github.com/hobbeswalsh/terraform@v0.3.7-0.20150619183303-ad17cf55a0fa/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 109 setValueOrUUID(d, "zone", v.Zonename, v.Zoneid) 110 111 // Get the VPC offering details 112 o, _, err := cs.VPC.GetVPCOfferingByID(v.Vpcofferingid) 113 if err != nil { 114 return err 115 } 116 117 setValueOrUUID(d, "vpc_offering", o.Name, v.Vpcofferingid) 118 119 return nil 120 } 121 122 func resourceCloudStackVPCUpdate(d *schema.ResourceData, meta interface{}) error { 123 cs := meta.(*cloudstack.CloudStackClient) 124 125 // Check if the name or display text is changed 126 if d.HasChange("name") || d.HasChange("display_text") { 127 // Create a new parameter struct 128 p := cs.VPC.NewUpdateVPCParams(d.Id()) 129 130 // Set the display text 131 displaytext, ok := d.GetOk("display_text") 132 if !ok { 133 displaytext = d.Get("name") 134 } 135 // Set the (new) display text 136 p.SetDisplaytext(displaytext.(string)) 137 138 // Update the VPC 139 _, err := cs.VPC.UpdateVPC(p) 140 if err != nil { 141 return fmt.Errorf( 142 "Error updating VPC %s: %s", d.Get("name").(string), err) 143 } 144 } 145 146 return resourceCloudStackVPCRead(d, meta) 147 } 148 149 func resourceCloudStackVPCDelete(d *schema.ResourceData, meta interface{}) error { 150 cs := meta.(*cloudstack.CloudStackClient) 151 152 // Create a new parameter struct 153 p := cs.VPC.NewDeleteVPCParams(d.Id()) 154 155 // Delete the VPC 156 _, err := cs.VPC.DeleteVPC(p) 157 if err != nil { 158 // This is a very poor way to be told the UUID does no longer exist :( 159 if strings.Contains(err.Error(), fmt.Sprintf( 160 "Invalid parameter id value=%s due to incorrect long value format, "+ 161 "or entity does not exist", d.Id())) { 162 return nil 163 } 164 165 return fmt.Errorf("Error deleting VPC %s: %s", d.Get("name").(string), err) 166 } 167 168 return nil 169 }