Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Region to Provider #25

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 20 additions & 7 deletions openstack/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"crypto/tls"
"crypto/x509"
"fmt"
"log"
"net/http"
"os"

Expand All @@ -24,6 +25,7 @@ type Config struct {
IdentityEndpoint string
Insecure bool
Password string
Region string
Swauth bool
TenantID string
TenantName string
Expand Down Expand Up @@ -135,44 +137,55 @@ func (c *Config) loadAndValidate() error {
return nil
}

func (c *Config) determineRegion(region string) string {
// If a resource-level region was not specified, and a provider-level region was set,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to get an 'empty' region in here?

Do we need to check for that condition?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's still possible to not set a region at all. I've tested this and it works as expected. I'll update the docs to mention no region is possible for single-region catalogs.

// use the provider-level region.
if region == "" && c.Region != "" {
region = c.Region
}

log.Printf("[DEBUG] OpenStack Region is: %s", region)
return region
}

func (c *Config) blockStorageV1Client(region string) (*gophercloud.ServiceClient, error) {
return openstack.NewBlockStorageV1(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}

func (c *Config) blockStorageV2Client(region string) (*gophercloud.ServiceClient, error) {
return openstack.NewBlockStorageV2(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}

func (c *Config) computeV2Client(region string) (*gophercloud.ServiceClient, error) {
return openstack.NewComputeV2(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}

func (c *Config) dnsV2Client(region string) (*gophercloud.ServiceClient, error) {
return openstack.NewDNSV2(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}

func (c *Config) imageV2Client(region string) (*gophercloud.ServiceClient, error) {
return openstack.NewImageServiceV2(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}

func (c *Config) networkingV2Client(region string) (*gophercloud.ServiceClient, error) {
return openstack.NewNetworkV2(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}
Expand All @@ -187,7 +200,7 @@ func (c *Config) objectStorageV1Client(region string) (*gophercloud.ServiceClien
}

return openstack.NewObjectStorageV1(c.osClient, gophercloud.EndpointOpts{
Region: region,
Region: c.determineRegion(region),
Availability: c.getEndpointType(),
})
}
Expand Down
10 changes: 5 additions & 5 deletions openstack/data_source_openstack_images_image_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ func dataSourceImagesImageV2() *schema.Resource {

Schema: map[string]*schema.Schema{
"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},

"name": {
Expand Down Expand Up @@ -143,7 +143,7 @@ func dataSourceImagesImageV2() *schema.Resource {
// dataSourceImagesImageV2Read performs the image lookup.
func dataSourceImagesImageV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
imageClient, err := config.imageV2Client(GetRegion(d))
imageClient, err := config.imageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack image client: %s", err)
}
Expand Down
15 changes: 8 additions & 7 deletions openstack/data_source_openstack_networking_network_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {
Read: dataSourceNetworkingNetworkV2Read,

Schema: map[string]*schema.Schema{
"region": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
"network_id": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Expand All @@ -29,11 +35,6 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {
Type: schema.TypeString,
Optional: true,
},
"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
},
"tenant_id": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Expand All @@ -57,7 +58,7 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {

func dataSourceNetworkingNetworkV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
networkingClient, err := config.networkingV2Client(GetRegion(d))
networkingClient, err := config.networkingV2Client(GetRegion(d, config))

listOpts := networks.ListOpts{
ID: d.Get("network_id").(string),
Expand Down Expand Up @@ -111,7 +112,7 @@ func dataSourceNetworkingNetworkV2Read(d *schema.ResourceData, meta interface{})
d.Set("admin_state_up", strconv.FormatBool(network.AdminStateUp))
d.Set("shared", strconv.FormatBool(network.Shared))
d.Set("tenant_id", network.TenantID)
d.Set("region", GetRegion(d))
d.Set("region", GetRegion(d, config))

return nil
}
10 changes: 10 additions & 0 deletions openstack/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ func Provider() terraform.ResourceProvider {
Description: descriptions["auth_url"],
},

"region": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Description: descriptions["region"],
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
},

"user_name": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -187,6 +194,8 @@ func init() {
descriptions = map[string]string{
"auth_url": "The Identity authentication URL.",

"region": "The OpenStack region to connect to.",

"user_name": "Username to login with.",

"user_id": "User ID to login with.",
Expand Down Expand Up @@ -231,6 +240,7 @@ func configureProvider(d *schema.ResourceData) (interface{}, error) {
IdentityEndpoint: d.Get("auth_url").(string),
Insecure: d.Get("insecure").(bool),
Password: d.Get("password").(string),
Region: d.Get("region").(string),
Swauth: d.Get("swauth").(bool),
Token: d.Get("token").(string),
TenantID: d.Get("tenant_id").(string),
Expand Down
14 changes: 7 additions & 7 deletions openstack/resource_openstack_blockstorage_volume_attach_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ func resourceBlockStorageVolumeAttachV2() *schema.Resource {

Schema: map[string]*schema.Schema{
"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},

"volume_id": &schema.Schema{
Expand Down Expand Up @@ -136,7 +136,7 @@ func resourceBlockStorageVolumeAttachV2() *schema.Resource {

func resourceBlockStorageVolumeAttachV2Create(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
client, err := config.blockStorageV2Client(GetRegion(d))
client, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand Down Expand Up @@ -276,7 +276,7 @@ func resourceBlockStorageVolumeAttachV2Create(d *schema.ResourceData, meta inter

func resourceBlockStorageVolumeAttachV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
client, err := config.blockStorageV2Client(GetRegion(d))
client, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand Down Expand Up @@ -307,7 +307,7 @@ func resourceBlockStorageVolumeAttachV2Read(d *schema.ResourceData, meta interfa

func resourceBlockStorageVolumeAttachV2Delete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
client, err := config.blockStorageV2Client(GetRegion(d))
client, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand Down
21 changes: 11 additions & 10 deletions openstack/resource_openstack_blockstorage_volume_v1.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@ func resourceBlockStorageVolumeV1() *schema.Resource {

Schema: map[string]*schema.Schema{
"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},

"size": &schema.Schema{
Type: schema.TypeInt,
Required: true,
Expand Down Expand Up @@ -111,7 +112,7 @@ func resourceBlockStorageVolumeV1() *schema.Resource {

func resourceBlockStorageVolumeV1Create(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand Down Expand Up @@ -165,7 +166,7 @@ func resourceBlockStorageVolumeV1Create(d *schema.ResourceData, meta interface{}
func resourceBlockStorageVolumeV1Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)

blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand All @@ -185,7 +186,7 @@ func resourceBlockStorageVolumeV1Read(d *schema.ResourceData, meta interface{})
d.Set("source_vol_id", v.SourceVolID)
d.Set("volume_type", v.VolumeType)
d.Set("metadata", v.Metadata)
d.Set("region", GetRegion(d))
d.Set("region", GetRegion(d, config))

attachments := make([]map[string]interface{}, len(v.Attachments))
for i, attachment := range v.Attachments {
Expand All @@ -202,7 +203,7 @@ func resourceBlockStorageVolumeV1Read(d *schema.ResourceData, meta interface{})

func resourceBlockStorageVolumeV1Update(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand All @@ -226,7 +227,7 @@ func resourceBlockStorageVolumeV1Update(d *schema.ResourceData, meta interface{}

func resourceBlockStorageVolumeV1Delete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand All @@ -239,7 +240,7 @@ func resourceBlockStorageVolumeV1Delete(d *schema.ResourceData, meta interface{}
// make sure this volume is detached from all instances before deleting
if len(v.Attachments) > 0 {
log.Printf("[DEBUG] detaching volumes")
if computeClient, err := config.computeV2Client(GetRegion(d)); err != nil {
if computeClient, err := config.computeV2Client(GetRegion(d, config)); err != nil {
return err
} else {
for _, volumeAttachment := range v.Attachments {
Expand Down
21 changes: 11 additions & 10 deletions openstack/resource_openstack_blockstorage_volume_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@ func resourceBlockStorageVolumeV2() *schema.Resource {

Schema: map[string]*schema.Schema{
"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},

"size": &schema.Schema{
Type: schema.TypeInt,
Required: true,
Expand Down Expand Up @@ -121,7 +122,7 @@ func resourceBlockStorageVolumeV2() *schema.Resource {

func resourceBlockStorageVolumeV2Create(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand Down Expand Up @@ -176,7 +177,7 @@ func resourceBlockStorageVolumeV2Create(d *schema.ResourceData, meta interface{}

func resourceBlockStorageVolumeV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand All @@ -196,7 +197,7 @@ func resourceBlockStorageVolumeV2Read(d *schema.ResourceData, meta interface{})
d.Set("source_vol_id", v.SourceVolID)
d.Set("volume_type", v.VolumeType)
d.Set("metadata", v.Metadata)
d.Set("region", GetRegion(d))
d.Set("region", GetRegion(d, config))

attachments := make([]map[string]interface{}, len(v.Attachments))
for i, attachment := range v.Attachments {
Expand All @@ -213,7 +214,7 @@ func resourceBlockStorageVolumeV2Read(d *schema.ResourceData, meta interface{})

func resourceBlockStorageVolumeV2Update(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand All @@ -237,7 +238,7 @@ func resourceBlockStorageVolumeV2Update(d *schema.ResourceData, meta interface{}

func resourceBlockStorageVolumeV2Delete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d))
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
}
Expand All @@ -250,7 +251,7 @@ func resourceBlockStorageVolumeV2Delete(d *schema.ResourceData, meta interface{}
// make sure this volume is detached from all instances before deleting
if len(v.Attachments) > 0 {
log.Printf("[DEBUG] detaching volumes")
if computeClient, err := config.computeV2Client(GetRegion(d)); err != nil {
if computeClient, err := config.computeV2Client(GetRegion(d, config)); err != nil {
return err
} else {
for _, volumeAttachment := range v.Attachments {
Expand Down
Loading