terraform/vendor/github.com/terraform-providers/terraform-provider-openstack/openstack/data_source_openstack_compu...

224 lines
5.1 KiB
Go

package openstack
import (
"fmt"
"log"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
"github.com/hashicorp/terraform/helper/schema"
)
func dataSourceComputeFlavorV2() *schema.Resource {
return &schema.Resource{
Read: dataSourceComputeFlavorV2Read,
Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
"flavor_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"name", "min_ram", "min_disk"},
},
"name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"flavor_id"},
},
"min_ram": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"flavor_id"},
},
"ram": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
},
"vcpus": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
},
"min_disk": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"flavor_id"},
},
"disk": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
},
"swap": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
},
"rx_tx_factor": {
Type: schema.TypeFloat,
Optional: true,
ForceNew: true,
},
// Computed values
"extra_specs": {
Type: schema.TypeMap,
Computed: true,
},
"is_public": {
Type: schema.TypeBool,
Computed: true,
},
},
}
}
// dataSourceComputeFlavorV2Read performs the flavor lookup.
func dataSourceComputeFlavorV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
computeClient, err := config.computeV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack compute client: %s", err)
}
var allFlavors []flavors.Flavor
if v := d.Get("flavor_id").(string); v != "" {
flavor, err := flavors.Get(computeClient, v).Extract()
if err != nil {
if _, ok := err.(gophercloud.ErrDefault404); ok {
return fmt.Errorf("No Flavor found")
}
return fmt.Errorf("Unable to retrieve OpenStack %s flavor: %s", v, err)
}
allFlavors = append(allFlavors, *flavor)
} else {
listOpts := flavors.ListOpts{
MinDisk: d.Get("min_disk").(int),
MinRAM: d.Get("min_ram").(int),
AccessType: flavors.PublicAccess,
}
log.Printf("[DEBUG] openstack_compute_flavor_v2 ListOpts: %#v", listOpts)
allPages, err := flavors.ListDetail(computeClient, listOpts).AllPages()
if err != nil {
return fmt.Errorf("Unable to query OpenStack flavors: %s", err)
}
allFlavors, err = flavors.ExtractFlavors(allPages)
if err != nil {
return fmt.Errorf("Unable to retrieve OpenStack flavors: %s", err)
}
}
// Loop through all flavors to find a more specific one.
if len(allFlavors) > 0 {
var filteredFlavors []flavors.Flavor
for _, flavor := range allFlavors {
if v := d.Get("name").(string); v != "" {
if flavor.Name != v {
continue
}
}
// d.GetOk is used because 0 might be a valid choice.
if v, ok := d.GetOk("ram"); ok {
if flavor.RAM != v.(int) {
continue
}
}
if v, ok := d.GetOk("vcpus"); ok {
if flavor.VCPUs != v.(int) {
continue
}
}
if v, ok := d.GetOk("disk"); ok {
if flavor.Disk != v.(int) {
continue
}
}
if v, ok := d.GetOk("swap"); ok {
if flavor.Swap != v.(int) {
continue
}
}
if v, ok := d.GetOk("rx_tx_factor"); ok {
if flavor.RxTxFactor != v.(float64) {
continue
}
}
filteredFlavors = append(filteredFlavors, flavor)
}
allFlavors = filteredFlavors
}
if len(allFlavors) < 1 {
return fmt.Errorf("Your query returned no results. " +
"Please change your search criteria and try again.")
}
if len(allFlavors) > 1 {
log.Printf("[DEBUG] Multiple results found: %#v", allFlavors)
return fmt.Errorf("Your query returned more than one result. " +
"Please try a more specific search criteria")
}
return dataSourceComputeFlavorV2Attributes(d, computeClient, &allFlavors[0])
}
// dataSourceComputeFlavorV2Attributes populates the fields of a Flavor resource.
func dataSourceComputeFlavorV2Attributes(
d *schema.ResourceData, computeClient *gophercloud.ServiceClient, flavor *flavors.Flavor) error {
log.Printf("[DEBUG] Retrieved openstack_compute_flavor_v2 %s: %#v", flavor.ID, flavor)
d.SetId(flavor.ID)
d.Set("name", flavor.Name)
d.Set("flavor_id", flavor.ID)
d.Set("disk", flavor.Disk)
d.Set("ram", flavor.RAM)
d.Set("rx_tx_factor", flavor.RxTxFactor)
d.Set("swap", flavor.Swap)
d.Set("vcpus", flavor.VCPUs)
d.Set("is_public", flavor.IsPublic)
es, err := flavors.ListExtraSpecs(computeClient, d.Id()).Extract()
if err != nil {
return err
}
if err := d.Set("extra_specs", es); err != nil {
log.Printf("[WARN] Unable to set extra_specs for openstack_compute_flavor_v2 %s: %s", d.Id(), err)
}
return nil
}