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