github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/builtin/providers/cloudstack/resources.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"regexp"
     7  
     8  	"github.com/xanzy/go-cloudstack/cloudstack"
     9  )
    10  
    11  type retrieveError struct {
    12  	name  string
    13  	value string
    14  	err   error
    15  }
    16  
    17  func (e *retrieveError) Error() error {
    18  	return fmt.Errorf("Error retrieving UUID of %s %s: %s", e.name, e.value, e.err)
    19  }
    20  
    21  func retrieveUUID(cs *cloudstack.CloudStackClient, name, value string) (uuid string, e *retrieveError) {
    22  	// If the supplied value isn't a UUID, try to retrieve the UUID ourselves
    23  	if isUUID(value) {
    24  		return value, nil
    25  	}
    26  
    27  	log.Printf("[DEBUG] Retrieving UUID of %s: %s", name, value)
    28  
    29  	var err error
    30  	switch name {
    31  	case "disk_offering":
    32  		uuid, err = cs.DiskOffering.GetDiskOfferingID(value)
    33  	case "virtual_machine":
    34  		uuid, err = cs.VirtualMachine.GetVirtualMachineID(value)
    35  	case "service_offering":
    36  		uuid, err = cs.ServiceOffering.GetServiceOfferingID(value)
    37  	case "network_offering":
    38  		uuid, err = cs.NetworkOffering.GetNetworkOfferingID(value)
    39  	case "vpc_offering":
    40  		uuid, err = cs.VPC.GetVPCOfferingID(value)
    41  	case "vpc":
    42  		uuid, err = cs.VPC.GetVPCID(value)
    43  	case "network":
    44  		uuid, err = cs.Network.GetNetworkID(value)
    45  	case "zone":
    46  		uuid, err = cs.Zone.GetZoneID(value)
    47  	case "ipaddress":
    48  		p := cs.Address.NewListPublicIpAddressesParams()
    49  		p.SetIpaddress(value)
    50  		l, e := cs.Address.ListPublicIpAddresses(p)
    51  		if e != nil {
    52  			err = e
    53  			break
    54  		}
    55  		if l.Count == 1 {
    56  			uuid = l.PublicIpAddresses[0].Id
    57  			break
    58  		}
    59  		err = fmt.Errorf("Could not find UUID of IP address: %s", value)
    60  	default:
    61  		return uuid, &retrieveError{name: name, value: value,
    62  			err: fmt.Errorf("Unknown request: %s", name)}
    63  	}
    64  
    65  	if err != nil {
    66  		return uuid, &retrieveError{name: name, value: value, err: err}
    67  	}
    68  
    69  	return uuid, nil
    70  }
    71  
    72  func retrieveTemplateUUID(cs *cloudstack.CloudStackClient, zoneid, value string) (uuid string, e *retrieveError) {
    73  	// If the supplied value isn't a UUID, try to retrieve the UUID ourselves
    74  	if isUUID(value) {
    75  		return value, nil
    76  	}
    77  
    78  	log.Printf("[DEBUG] Retrieving UUID of template: %s", value)
    79  
    80  	uuid, err := cs.Template.GetTemplateID(value, "executable", zoneid)
    81  	if err != nil {
    82  		return uuid, &retrieveError{name: "template", value: value, err: err}
    83  	}
    84  
    85  	return uuid, nil
    86  }
    87  
    88  func isUUID(s string) bool {
    89  	re := regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)
    90  	return re.MatchString(s)
    91  }