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 }