Skip to content

Commit

Permalink
Use the new functionality offered by the go-cloudstack package
Browse files Browse the repository at this point in the history
The updated functionality offers a new means to work with projects.
This commit uses that new functionality for the `cloudstack_network`
resource.
  • Loading branch information
Sander van Harmelen committed Apr 22, 2016
1 parent cbea101 commit 5a65cc9
Show file tree
Hide file tree
Showing 8 changed files with 117 additions and 50 deletions.
39 changes: 30 additions & 9 deletions builtin/providers/cloudstack/resource_cloudstack_disk.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,10 @@ func resourceCloudStackDiskRead(d *schema.ResourceData, meta interface{}) error
cs := meta.(*cloudstack.CloudStackClient)

// Get the volume details
v, count, err := cs.Volume.GetVolumeByID(d.Id())
v, count, err := cs.Volume.GetVolumeByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
d.SetId("")
Expand All @@ -152,7 +155,7 @@ func resourceCloudStackDiskRead(d *schema.ResourceData, meta interface{}) error
}

d.Set("name", v.Name)
d.Set("attach", v.Attached != "") // If attached this will contain a timestamp when attached
d.Set("attach", v.Attached != "") // If attached this contains a timestamp when attached
d.Set("size", int(v.Size/(1024*1024*1024))) // Needed to get GB's again

setValueOrID(d, "disk_offering", v.Diskofferingname, v.Diskofferingid)
Expand All @@ -161,7 +164,10 @@ func resourceCloudStackDiskRead(d *schema.ResourceData, meta interface{}) error

if v.Attached != "" {
// Get the virtual machine details
vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(v.Virtualmachineid)
vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(
v.Virtualmachineid,
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
return err
}
Expand Down Expand Up @@ -290,12 +296,17 @@ func resourceCloudStackDiskAttach(d *schema.ResourceData, meta interface{}) erro
cs := meta.(*cloudstack.CloudStackClient)

// First check if the disk isn't already attached
if attached, err := isAttached(cs, d.Id()); err != nil || attached {
if attached, err := isAttached(d, meta); err != nil || attached {
return err
}

// Retrieve the virtual_machine ID
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
virtualmachineid, e := retrieveID(
cs,
"virtual_machine",
d.Get("virtual_machine").(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand Down Expand Up @@ -329,7 +340,7 @@ func resourceCloudStackDiskDetach(d *schema.ResourceData, meta interface{}) erro
cs := meta.(*cloudstack.CloudStackClient)

// Check if the volume is actually attached, before detaching
if attached, err := isAttached(cs, d.Id()); err != nil || !attached {
if attached, err := isAttached(d, meta); err != nil || !attached {
return err
}

Expand All @@ -342,7 +353,12 @@ func resourceCloudStackDiskDetach(d *schema.ResourceData, meta interface{}) erro
// Detach the currently attached volume
if _, err := cs.Volume.DetachVolume(p); err != nil {
// Retrieve the virtual_machine ID
virtualmachineid, e := retrieveID(cs, "virtual_machine", d.Get("virtual_machine").(string))
virtualmachineid, e := retrieveID(
cs,
"virtual_machine",
d.Get("virtual_machine").(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand Down Expand Up @@ -372,9 +388,14 @@ func resourceCloudStackDiskDetach(d *schema.ResourceData, meta interface{}) erro
return nil
}

func isAttached(cs *cloudstack.CloudStackClient, id string) (bool, error) {
func isAttached(d *schema.ResourceData, meta interface{}) (bool, error) {
cs := meta.(*cloudstack.CloudStackClient)

// Get the volume details
v, _, err := cs.Volume.GetVolumeByID(id)
v, _, err := cs.Volume.GetVolumeByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
return false, err
}
Expand Down
12 changes: 10 additions & 2 deletions builtin/providers/cloudstack/resource_cloudstack_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,12 @@ func resourceCloudStackInstanceCreate(d *schema.ResourceData, meta interface{})
}

// Retrieve the network ID
networkid, e := retrieveID(cs, "network", network.(string))
networkid, e := retrieveID(
cs,
"network",
network.(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand Down Expand Up @@ -250,7 +255,10 @@ func resourceCloudStackInstanceRead(d *schema.ResourceData, meta interface{}) er
cs := meta.(*cloudstack.CloudStackClient)

// Get the virtual machine details
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(d.Id())
vm, count, err := cs.VirtualMachine.GetVirtualMachineByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
log.Printf("[DEBUG] Instance %s does no longer exist", d.Get("name").(string))
Expand Down
19 changes: 16 additions & 3 deletions builtin/providers/cloudstack/resource_cloudstack_ipaddress.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,12 @@ func resourceCloudStackIPAddressCreate(d *schema.ResourceData, meta interface{})
}
if ok {
// Retrieve the network ID
networkid, e := retrieveID(cs, "network", network.(string))
networkid, e := retrieveID(
cs,
"network",
network.(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand All @@ -89,7 +94,12 @@ func resourceCloudStackIPAddressCreate(d *schema.ResourceData, meta interface{})
}
if ok {
// Retrieve the vpc ID
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
vpcid, e := retrieveID(
cs,
"vpc",
vpc.(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand Down Expand Up @@ -118,7 +128,10 @@ func resourceCloudStackIPAddressRead(d *schema.ResourceData, meta interface{}) e
cs := meta.(*cloudstack.CloudStackClient)

// Get the IP address details
ip, count, err := cs.Address.GetPublicIpAddressByID(d.Id())
ip, count, err := cs.Address.GetPublicIpAddressByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
log.Printf(
Expand Down
12 changes: 10 additions & 2 deletions builtin/providers/cloudstack/resource_cloudstack_network.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,12 @@ func resourceCloudStackNetworkCreate(d *schema.ResourceData, meta interface{}) e
}
if ok {
// Retrieve the vpc ID
vpcid, e := retrieveID(cs, "vpc", vpc.(string))
vpcid, e := retrieveID(
cs,
"vpc",
vpc.(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand Down Expand Up @@ -205,7 +210,10 @@ func resourceCloudStackNetworkRead(d *schema.ResourceData, meta interface{}) err
cs := meta.(*cloudstack.CloudStackClient)

// Get the virtual machine details
n, count, err := cs.Network.GetNetworkByID(d.Id())
n, count, err := cs.Network.GetNetworkByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
log.Printf(
Expand Down
31 changes: 22 additions & 9 deletions builtin/providers/cloudstack/resource_cloudstack_port_forward.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,12 @@ func resourceCloudStackPortForwardCreate(d *schema.ResourceData, meta interface{
}

// Retrieve the ipaddress ID
ipaddressid, e := retrieveID(cs, "ip_address", ipaddress.(string))
ipaddressid, e := retrieveID(
cs,
"ip_address",
ipaddress.(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}
Expand Down Expand Up @@ -189,12 +194,20 @@ func createPortForward(
}

// Retrieve the virtual_machine ID
virtualmachineid, e := retrieveID(cs, "virtual_machine", virtualmachine.(string))
virtualmachineid, e := retrieveID(
cs,
"virtual_machine",
virtualmachine.(string),
cloudstack.WithProject(d.Get("project").(string)),
)
if e != nil {
return e.Error()
}

vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(virtualmachineid)
vm, _, err := cs.VirtualMachine.GetVirtualMachineByID(
virtualmachineid,
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
return err
}
Expand Down Expand Up @@ -326,9 +339,9 @@ func resourceCloudStackPortForwardUpdate(d *schema.ResourceData, meta interface{
// set to make sure we end up in a consistent state
forwards := o.(*schema.Set).Intersection(n.(*schema.Set))

// First loop through all the new forwards and create (before destroy) them
if nrs.Len() > 0 {
err := createPortForwards(d, meta, forwards, nrs)
// First loop through all the old forwards and delete them
if ors.Len() > 0 {
err := deletePortForwards(d, meta, forwards, ors)

// We need to update this first to preserve the correct state
d.Set("forward", forwards)
Expand All @@ -338,9 +351,9 @@ func resourceCloudStackPortForwardUpdate(d *schema.ResourceData, meta interface{
}
}

// Then loop through all the old forwards and delete them
if ors.Len() > 0 {
err := deletePortForwards(d, meta, forwards, ors)
// Then loop through all the new forwards and create them
if nrs.Len() > 0 {
err := createPortForwards(d, meta, forwards, nrs)

// We need to update this first to preserve the correct state
d.Set("forward", forwards)
Expand Down
6 changes: 5 additions & 1 deletion builtin/providers/cloudstack/resource_cloudstack_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,11 @@ func resourceCloudStackTemplateRead(d *schema.ResourceData, meta interface{}) er
cs := meta.(*cloudstack.CloudStackClient)

// Get the template details
t, count, err := cs.Template.GetTemplateByID(d.Id(), "executable")
t, count, err := cs.Template.GetTemplateByID(
d.Id(),
"executable",
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
log.Printf(
Expand Down
5 changes: 4 additions & 1 deletion builtin/providers/cloudstack/resource_cloudstack_vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,10 @@ func resourceCloudStackVPCRead(d *schema.ResourceData, meta interface{}) error {
cs := meta.(*cloudstack.CloudStackClient)

// Get the VPC details
v, count, err := cs.VPC.GetVPCByID(d.Id())
v, count, err := cs.VPC.GetVPCByID(
d.Id(),
cloudstack.WithProject(d.Get("project").(string)),
)
if err != nil {
if count == 0 {
log.Printf(
Expand Down
43 changes: 20 additions & 23 deletions builtin/providers/cloudstack/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ import (
"github.com/xanzy/go-cloudstack/cloudstack"
)

// UnlimitedResourceID is a "special" ID to define an unlimited resource
const UnlimitedResourceID = "-1"

// Define a regexp for parsing the port
var splitPorts = regexp.MustCompile(`^(\d+)(?:-(\d+))?$`)

Expand All @@ -28,11 +25,11 @@ func (e *retrieveError) Error() error {
}

func setValueOrID(d *schema.ResourceData, key string, value string, id string) {
if isID(d.Get(key).(string)) {
if cloudstack.IsID(d.Get(key).(string)) {
// If the given id is an empty string, check if the configured value matches
// the UnlimitedResourceID in which case we set id to UnlimitedResourceID
if id == "" && d.Get(key).(string) == UnlimitedResourceID {
id = UnlimitedResourceID
if id == "" && d.Get(key).(string) == cloudstack.UnlimitedResourceID {
id = cloudstack.UnlimitedResourceID
}

d.Set(key, id)
Expand All @@ -41,9 +38,13 @@ func setValueOrID(d *schema.ResourceData, key string, value string, id string) {
}
}

func retrieveID(cs *cloudstack.CloudStackClient, name, value string) (id string, e *retrieveError) {
func retrieveID(
cs *cloudstack.CloudStackClient,
name string,
value string,
opts ...cloudstack.OptionFunc) (id string, e *retrieveError) {
// If the supplied value isn't a ID, try to retrieve the ID ourselves
if isID(value) {
if cloudstack.IsID(value) {
return value, nil
}

Expand All @@ -54,7 +55,7 @@ func retrieveID(cs *cloudstack.CloudStackClient, name, value string) (id string,
case "disk_offering":
id, err = cs.DiskOffering.GetDiskOfferingID(value)
case "virtual_machine":
id, err = cs.VirtualMachine.GetVirtualMachineID(value)
id, err = cs.VirtualMachine.GetVirtualMachineID(value, opts...)
case "service_offering":
id, err = cs.ServiceOffering.GetServiceOfferingID(value)
case "network_offering":
Expand All @@ -64,14 +65,20 @@ func retrieveID(cs *cloudstack.CloudStackClient, name, value string) (id string,
case "vpc_offering":
id, err = cs.VPC.GetVPCOfferingID(value)
case "vpc":
id, err = cs.VPC.GetVPCID(value)
id, err = cs.VPC.GetVPCID(value, opts...)
case "network":
id, err = cs.Network.GetNetworkID(value)
id, err = cs.Network.GetNetworkID(value, opts...)
case "zone":
id, err = cs.Zone.GetZoneID(value)
case "ip_address":
p := cs.Address.NewListPublicIpAddressesParams()
p.SetIpaddress(value)
for _, fn := range opts {
if e := fn(cs, p); e != nil {
err = e
break
}
}
l, e := cs.Address.ListPublicIpAddresses(p)
if e != nil {
err = e
Expand Down Expand Up @@ -109,7 +116,7 @@ func retrieveID(cs *cloudstack.CloudStackClient, name, value string) (id string,

func retrieveTemplateID(cs *cloudstack.CloudStackClient, zoneid, value string) (id string, e *retrieveError) {
// If the supplied value isn't a ID, try to retrieve the ID ourselves
if isID(value) {
if cloudstack.IsID(value) {
return value, nil
}

Expand All @@ -123,12 +130,6 @@ func retrieveTemplateID(cs *cloudstack.CloudStackClient, zoneid, value string) (
return id, nil
}

// ID can be either a UUID or a UnlimitedResourceID
func isID(id string) bool {
re := regexp.MustCompile(`^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|-1)$`)
return re.MatchString(id)
}

// RetryFunc is the function retried n times
type RetryFunc func() (interface{}, error)

Expand Down Expand Up @@ -183,12 +184,8 @@ func setCidrList(rule map[string]interface{}, cidrList string) {
rule["cidr_list"] = cidrs
}

type projectidSetter interface {
SetProjectid(string)
}

// If there is a project supplied, we retrieve and set the project id
func setProjectid(p projectidSetter, cs *cloudstack.CloudStackClient, d *schema.ResourceData) error {
func setProjectid(p cloudstack.ProjectIDSetter, cs *cloudstack.CloudStackClient, d *schema.ResourceData) error {
if project, ok := d.GetOk("project"); ok {
projectid, e := retrieveID(cs, "project", project.(string))
if e != nil {
Expand Down

0 comments on commit 5a65cc9

Please sign in to comment.