Skip to content

Commit b1c4ec2

Browse files
committed
provider/openstack: Add Region to Provider
This commit adds the region argument to the OpenStack provider. This enables a user to specify the region once at the provider-level and have all resources within that provider be built in that region. If a resource-level region was specified, it is still recognized and will override the provider-level region.
1 parent 6278902 commit b1c4ec2

40 files changed

Lines changed: 355 additions & 328 deletions

File tree

‎openstack/config.go‎

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"crypto/tls"
55
"crypto/x509"
66
"fmt"
7+
"log"
78
"net/http"
89
"os"
910

@@ -24,6 +25,7 @@ type Config struct {
2425
IdentityEndpoint string
2526
Insecure bool
2627
Password string
28+
Region string
2729
Swauth bool
2830
TenantID string
2931
TenantName string
@@ -135,44 +137,55 @@ func (c *Config) loadAndValidate() error {
135137
return nil
136138
}
137139

140+
func (c *Config) determineRegion(region string) string {
141+
// If a resource-level region was not specified, and a provider-level region was set,
142+
// use the provider-level region.
143+
if region == "" && c.Region != "" {
144+
region = c.Region
145+
}
146+
147+
log.Printf("[DEBUG] OpenStack Region is: %s", region)
148+
return region
149+
}
150+
138151
func (c *Config) blockStorageV1Client(region string) (*gophercloud.ServiceClient, error) {
139152
return openstack.NewBlockStorageV1(c.osClient, gophercloud.EndpointOpts{
140-
Region: region,
153+
Region: c.determineRegion(region),
141154
Availability: c.getEndpointType(),
142155
})
143156
}
144157

145158
func (c *Config) blockStorageV2Client(region string) (*gophercloud.ServiceClient, error) {
146159
return openstack.NewBlockStorageV2(c.osClient, gophercloud.EndpointOpts{
147-
Region: region,
160+
Region: c.determineRegion(region),
148161
Availability: c.getEndpointType(),
149162
})
150163
}
151164

152165
func (c *Config) computeV2Client(region string) (*gophercloud.ServiceClient, error) {
153166
return openstack.NewComputeV2(c.osClient, gophercloud.EndpointOpts{
154-
Region: region,
167+
Region: c.determineRegion(region),
155168
Availability: c.getEndpointType(),
156169
})
157170
}
158171

159172
func (c *Config) dnsV2Client(region string) (*gophercloud.ServiceClient, error) {
160173
return openstack.NewDNSV2(c.osClient, gophercloud.EndpointOpts{
161-
Region: region,
174+
Region: c.determineRegion(region),
162175
Availability: c.getEndpointType(),
163176
})
164177
}
165178

166179
func (c *Config) imageV2Client(region string) (*gophercloud.ServiceClient, error) {
167180
return openstack.NewImageServiceV2(c.osClient, gophercloud.EndpointOpts{
168-
Region: region,
181+
Region: c.determineRegion(region),
169182
Availability: c.getEndpointType(),
170183
})
171184
}
172185

173186
func (c *Config) networkingV2Client(region string) (*gophercloud.ServiceClient, error) {
174187
return openstack.NewNetworkV2(c.osClient, gophercloud.EndpointOpts{
175-
Region: region,
188+
Region: c.determineRegion(region),
176189
Availability: c.getEndpointType(),
177190
})
178191
}
@@ -187,7 +200,7 @@ func (c *Config) objectStorageV1Client(region string) (*gophercloud.ServiceClien
187200
}
188201

189202
return openstack.NewObjectStorageV1(c.osClient, gophercloud.EndpointOpts{
190-
Region: region,
203+
Region: c.determineRegion(region),
191204
Availability: c.getEndpointType(),
192205
})
193206
}

‎openstack/data_source_openstack_images_image_v2.go‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ func dataSourceImagesImageV2() *schema.Resource {
1717

1818
Schema: map[string]*schema.Schema{
1919
"region": &schema.Schema{
20-
Type: schema.TypeString,
21-
Required: true,
22-
ForceNew: true,
23-
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
20+
Type: schema.TypeString,
21+
Optional: true,
22+
Computed: true,
23+
ForceNew: true,
2424
},
2525

2626
"name": {
@@ -143,7 +143,7 @@ func dataSourceImagesImageV2() *schema.Resource {
143143
// dataSourceImagesImageV2Read performs the image lookup.
144144
func dataSourceImagesImageV2Read(d *schema.ResourceData, meta interface{}) error {
145145
config := meta.(*Config)
146-
imageClient, err := config.imageV2Client(GetRegion(d))
146+
imageClient, err := config.imageV2Client(GetRegion(d, config))
147147
if err != nil {
148148
return fmt.Errorf("Error creating OpenStack image client: %s", err)
149149
}

‎openstack/data_source_openstack_networking_network_v2.go‎

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {
1717
Read: dataSourceNetworkingNetworkV2Read,
1818

1919
Schema: map[string]*schema.Schema{
20+
"region": &schema.Schema{
21+
Type: schema.TypeString,
22+
Optional: true,
23+
Computed: true,
24+
ForceNew: true,
25+
},
2026
"network_id": &schema.Schema{
2127
Type: schema.TypeString,
2228
Optional: true,
@@ -29,11 +35,6 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {
2935
Type: schema.TypeString,
3036
Optional: true,
3137
},
32-
"region": &schema.Schema{
33-
Type: schema.TypeString,
34-
Required: true,
35-
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
36-
},
3738
"tenant_id": &schema.Schema{
3839
Type: schema.TypeString,
3940
Optional: true,
@@ -57,7 +58,7 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {
5758

5859
func dataSourceNetworkingNetworkV2Read(d *schema.ResourceData, meta interface{}) error {
5960
config := meta.(*Config)
60-
networkingClient, err := config.networkingV2Client(GetRegion(d))
61+
networkingClient, err := config.networkingV2Client(GetRegion(d, config))
6162

6263
listOpts := networks.ListOpts{
6364
ID: d.Get("network_id").(string),
@@ -111,7 +112,7 @@ func dataSourceNetworkingNetworkV2Read(d *schema.ResourceData, meta interface{})
111112
d.Set("admin_state_up", strconv.FormatBool(network.AdminStateUp))
112113
d.Set("shared", strconv.FormatBool(network.Shared))
113114
d.Set("tenant_id", network.TenantID)
114-
d.Set("region", GetRegion(d))
115+
d.Set("region", GetRegion(d, config))
115116

116117
return nil
117118
}

‎openstack/provider.go‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ func Provider() terraform.ResourceProvider {
2020
Description: descriptions["auth_url"],
2121
},
2222

23+
"region": &schema.Schema{
24+
Type: schema.TypeString,
25+
Optional: true,
26+
Description: descriptions["region"],
27+
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
28+
},
29+
2330
"user_name": &schema.Schema{
2431
Type: schema.TypeString,
2532
Optional: true,
@@ -187,6 +194,8 @@ func init() {
187194
descriptions = map[string]string{
188195
"auth_url": "The Identity authentication URL.",
189196

197+
"region": "The OpenStack region to connect to.",
198+
190199
"user_name": "Username to login with.",
191200

192201
"user_id": "User ID to login with.",
@@ -231,6 +240,7 @@ func configureProvider(d *schema.ResourceData) (interface{}, error) {
231240
IdentityEndpoint: d.Get("auth_url").(string),
232241
Insecure: d.Get("insecure").(bool),
233242
Password: d.Get("password").(string),
243+
Region: d.Get("region").(string),
234244
Swauth: d.Get("swauth").(bool),
235245
Token: d.Get("token").(string),
236246
TenantID: d.Get("tenant_id").(string),

‎openstack/resource_openstack_blockstorage_volume_attach_v2.go‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ func resourceBlockStorageVolumeAttachV2() *schema.Resource {
2626

2727
Schema: map[string]*schema.Schema{
2828
"region": &schema.Schema{
29-
Type: schema.TypeString,
30-
Required: true,
31-
ForceNew: true,
32-
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
29+
Type: schema.TypeString,
30+
Optional: true,
31+
Computed: true,
32+
ForceNew: true,
3333
},
3434

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

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

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

308308
func resourceBlockStorageVolumeAttachV2Delete(d *schema.ResourceData, meta interface{}) error {
309309
config := meta.(*Config)
310-
client, err := config.blockStorageV2Client(GetRegion(d))
310+
client, err := config.blockStorageV2Client(GetRegion(d, config))
311311
if err != nil {
312312
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
313313
}

‎openstack/resource_openstack_blockstorage_volume_v1.go‎

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ func resourceBlockStorageVolumeV1() *schema.Resource {
3131

3232
Schema: map[string]*schema.Schema{
3333
"region": &schema.Schema{
34-
Type: schema.TypeString,
35-
Required: true,
36-
ForceNew: true,
37-
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
34+
Type: schema.TypeString,
35+
Optional: true,
36+
Computed: true,
37+
ForceNew: true,
3838
},
39+
3940
"size": &schema.Schema{
4041
Type: schema.TypeInt,
4142
Required: true,
@@ -111,7 +112,7 @@ func resourceBlockStorageVolumeV1() *schema.Resource {
111112

112113
func resourceBlockStorageVolumeV1Create(d *schema.ResourceData, meta interface{}) error {
113114
config := meta.(*Config)
114-
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
115+
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
115116
if err != nil {
116117
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
117118
}
@@ -165,7 +166,7 @@ func resourceBlockStorageVolumeV1Create(d *schema.ResourceData, meta interface{}
165166
func resourceBlockStorageVolumeV1Read(d *schema.ResourceData, meta interface{}) error {
166167
config := meta.(*Config)
167168

168-
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
169+
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
169170
if err != nil {
170171
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
171172
}
@@ -185,7 +186,7 @@ func resourceBlockStorageVolumeV1Read(d *schema.ResourceData, meta interface{})
185186
d.Set("source_vol_id", v.SourceVolID)
186187
d.Set("volume_type", v.VolumeType)
187188
d.Set("metadata", v.Metadata)
188-
d.Set("region", GetRegion(d))
189+
d.Set("region", GetRegion(d, config))
189190

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

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

227228
func resourceBlockStorageVolumeV1Delete(d *schema.ResourceData, meta interface{}) error {
228229
config := meta.(*Config)
229-
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d))
230+
blockStorageClient, err := config.blockStorageV1Client(GetRegion(d, config))
230231
if err != nil {
231232
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
232233
}
@@ -239,7 +240,7 @@ func resourceBlockStorageVolumeV1Delete(d *schema.ResourceData, meta interface{}
239240
// make sure this volume is detached from all instances before deleting
240241
if len(v.Attachments) > 0 {
241242
log.Printf("[DEBUG] detaching volumes")
242-
if computeClient, err := config.computeV2Client(GetRegion(d)); err != nil {
243+
if computeClient, err := config.computeV2Client(GetRegion(d, config)); err != nil {
243244
return err
244245
} else {
245246
for _, volumeAttachment := range v.Attachments {

‎openstack/resource_openstack_blockstorage_volume_v2.go‎

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ func resourceBlockStorageVolumeV2() *schema.Resource {
3131

3232
Schema: map[string]*schema.Schema{
3333
"region": &schema.Schema{
34-
Type: schema.TypeString,
35-
Required: true,
36-
ForceNew: true,
37-
DefaultFunc: schema.EnvDefaultFunc("OS_REGION_NAME", ""),
34+
Type: schema.TypeString,
35+
Optional: true,
36+
Computed: true,
37+
ForceNew: true,
3838
},
39+
3940
"size": &schema.Schema{
4041
Type: schema.TypeInt,
4142
Required: true,
@@ -121,7 +122,7 @@ func resourceBlockStorageVolumeV2() *schema.Resource {
121122

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

177178
func resourceBlockStorageVolumeV2Read(d *schema.ResourceData, meta interface{}) error {
178179
config := meta.(*Config)
179-
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d))
180+
blockStorageClient, err := config.blockStorageV2Client(GetRegion(d, config))
180181
if err != nil {
181182
return fmt.Errorf("Error creating OpenStack block storage client: %s", err)
182183
}
@@ -196,7 +197,7 @@ func resourceBlockStorageVolumeV2Read(d *schema.ResourceData, meta interface{})
196197
d.Set("source_vol_id", v.SourceVolID)
197198
d.Set("volume_type", v.VolumeType)
198199
d.Set("metadata", v.Metadata)
199-
d.Set("region", GetRegion(d))
200+
d.Set("region", GetRegion(d, config))
200201

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

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

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

0 commit comments

Comments
 (0)