Skip to content

Commit 114b646

Browse files
Enable 'zone' to be specified at the provider level instead of per-resource. (#816)
- Fetch Zone attribute any place where it *was* being fetched from the schema by combination schema / provider-level attribute. - Allow region to be unspecified if zone is specified. - Switch one example to using provider-level zone as an example. - Make provider-level zone optional. (Individual resources will fail if they can't find a zone.) - Add tests for getZone and getRegion.
1 parent 9bebdd0 commit 114b646

16 files changed

+258
-78
lines changed

examples/content-based-load-balancing/main.tf

+1-4
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ provider "google" {
44
region = "${var.region}"
55
project = "${var.project_name}"
66
credentials = "${file("${var.credentials_file_path}")}"
7+
zone = "${var.region_zone}"
78
}
89

910
resource "google_compute_instance" "www" {
1011
name = "tf-www-compute"
1112
machine_type = "f1-micro"
12-
zone = "${var.region_zone}"
1313
tags = ["http-tag"]
1414

1515
boot_disk {
@@ -36,7 +36,6 @@ resource "google_compute_instance" "www" {
3636
resource "google_compute_instance" "www-video" {
3737
name = "tf-www-video-compute"
3838
machine_type = "f1-micro"
39-
zone = "${var.region_zone}"
4039
tags = ["http-tag"]
4140

4241
boot_disk {
@@ -66,7 +65,6 @@ resource "google_compute_global_address" "external-address" {
6665

6766
resource "google_compute_instance_group" "www-resources" {
6867
name = "tf-www-resources"
69-
zone = "${var.region_zone}"
7068

7169
instances = ["${google_compute_instance.www.self_link}"]
7270

@@ -78,7 +76,6 @@ resource "google_compute_instance_group" "www-resources" {
7876

7977
resource "google_compute_instance_group" "video-resources" {
8078
name = "tf-video-resources"
81-
zone = "${var.region_zone}"
8279

8380
instances = ["${google_compute_instance.www-video.self_link}"]
8481

google/config.go

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type Config struct {
4343
Credentials string
4444
Project string
4545
Region string
46+
Zone string
4647

4748
clientBilling *cloudbilling.Service
4849
clientCompute *compute.Service

google/data_source_google_compute_instance_group.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func dataSourceGoogleComputeInstanceGroup() *schema.Resource {
1717

1818
"zone": {
1919
Type: schema.TypeString,
20-
Required: true,
20+
Optional: true,
2121
},
2222

2323
"project": {
@@ -74,7 +74,11 @@ func dataSourceGoogleComputeInstanceGroup() *schema.Resource {
7474
}
7575

7676
func dataSourceComputeInstanceGroupRead(d *schema.ResourceData, meta interface{}) error {
77-
zone := d.Get("zone").(string)
77+
78+
zone, err := getZone(d, meta.(*Config))
79+
if err != nil {
80+
return err
81+
}
7882
name := d.Get("name").(string)
7983

8084
d.SetId(fmt.Sprintf("%s/%s", zone, name))

google/data_source_google_container_engine_versions.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func dataSourceGoogleContainerEngineVersions() *schema.Resource {
1717
},
1818
"zone": {
1919
Type: schema.TypeString,
20-
Required: true,
20+
Optional: true,
2121
},
2222
"latest_master_version": {
2323
Type: schema.TypeString,
@@ -49,7 +49,10 @@ func dataSourceGoogleContainerEngineVersionsRead(d *schema.ResourceData, meta in
4949
return err
5050
}
5151

52-
zone := d.Get("zone").(string)
52+
zone, err := getZone(d, meta.(*Config))
53+
if err != nil {
54+
return err
55+
}
5356

5457
resp, err := config.clientContainer.Projects.Zones.GetServerconfig(project, zone).Do()
5558
if err != nil {

google/provider.go

+11
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ func Provider() terraform.ResourceProvider {
4646
"CLOUDSDK_COMPUTE_REGION",
4747
}, nil),
4848
},
49+
50+
"zone": &schema.Schema{
51+
Type: schema.TypeString,
52+
Optional: true,
53+
DefaultFunc: schema.MultiEnvDefaultFunc([]string{
54+
"GOOGLE_ZONE",
55+
"GCLOUD_ZONE",
56+
"CLOUDSDK_COMPUTE_ZONE",
57+
}, nil),
58+
},
4959
},
5060

5161
DataSourcesMap: map[string]*schema.Resource{
@@ -168,6 +178,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
168178
Credentials: credentials,
169179
Project: d.Get("project").(string),
170180
Region: d.Get("region").(string),
181+
Zone: d.Get("zone").(string),
171182
}
172183

173184
if err := config.loadAndValidate(); err != nil {

google/resource_bigtable_instance.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func resourceBigtableInstance() *schema.Resource {
3232

3333
"zone": {
3434
Type: schema.TypeString,
35-
Required: true,
35+
Optional: true,
3636
ForceNew: true,
3737
},
3838

@@ -111,14 +111,19 @@ func resourceBigtableInstanceCreate(d *schema.ResourceData, meta interface{}) er
111111
instanceType = bigtable.PRODUCTION
112112
}
113113

114+
zone, err := getZone(d, config)
115+
if err != nil {
116+
return err
117+
}
118+
114119
instanceConf := &bigtable.InstanceConf{
115120
InstanceId: name,
116121
DisplayName: displayName.(string),
117122
ClusterId: d.Get("cluster_id").(string),
118123
NumNodes: numNodes,
119124
InstanceType: instanceType,
120125
StorageType: storageType,
121-
Zone: d.Get("zone").(string),
126+
Zone: zone,
122127
}
123128

124129
c, err := config.bigtableClientFactory.NewInstanceAdminClient(project)

google/resource_compute_autoscaler.go

+18-8
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func resourceComputeAutoscaler() *schema.Resource {
106106

107107
"zone": &schema.Schema{
108108
Type: schema.TypeString,
109-
Required: true,
109+
Optional: true,
110110
ForceNew: true,
111111
},
112112

@@ -211,12 +211,16 @@ func resourceComputeAutoscalerCreate(d *schema.ResourceData, meta interface{}) e
211211
}
212212

213213
// Get the zone
214-
log.Printf("[DEBUG] Loading zone: %s", d.Get("zone").(string))
214+
z, err := getZone(d, config)
215+
if err != nil {
216+
return err
217+
}
218+
log.Printf("[DEBUG] Loading zone: %s", z)
215219
zone, err := config.clientCompute.Zones.Get(
216-
project, d.Get("zone").(string)).Do()
220+
project, z).Do()
217221
if err != nil {
218222
return fmt.Errorf(
219-
"Error loading zone '%s': %s", d.Get("zone").(string), err)
223+
"Error loading zone '%s': %s", z, err)
220224
}
221225

222226
scaler, err := buildAutoscaler(d)
@@ -293,8 +297,8 @@ func resourceComputeAutoscalerRead(d *schema.ResourceData, meta interface{}) err
293297

294298
var scaler *compute.Autoscaler
295299
var e error
296-
if zone, ok := d.GetOk("zone"); ok {
297-
scaler, e = config.clientCompute.Autoscalers.Get(project, zone.(string), d.Id()).Do()
300+
if zone, _ := getZone(d, config); zone != "" {
301+
scaler, e = config.clientCompute.Autoscalers.Get(project, zone, d.Id()).Do()
298302
if e != nil {
299303
return handleNotFoundError(e, d, fmt.Sprintf("Autoscaler %q", d.Id()))
300304
}
@@ -338,7 +342,10 @@ func resourceComputeAutoscalerUpdate(d *schema.ResourceData, meta interface{}) e
338342
return err
339343
}
340344

341-
zone := d.Get("zone").(string)
345+
zone, err := getZone(d, config)
346+
if err != nil {
347+
return err
348+
}
342349

343350
scaler, err := buildAutoscaler(d)
344351
if err != nil {
@@ -370,7 +377,10 @@ func resourceComputeAutoscalerDelete(d *schema.ResourceData, meta interface{}) e
370377
return err
371378
}
372379

373-
zone := d.Get("zone").(string)
380+
zone, err := getZone(d, config)
381+
if err != nil {
382+
return err
383+
}
374384
op, err := config.clientCompute.Autoscalers.Delete(
375385
project, zone, d.Id()).Do()
376386
if err != nil {

google/resource_compute_disk.go

+22-10
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func resourceComputeDisk() *schema.Resource {
4545

4646
"zone": &schema.Schema{
4747
Type: schema.TypeString,
48-
Required: true,
48+
Optional: true,
4949
ForceNew: true,
5050
},
5151

@@ -130,12 +130,16 @@ func resourceComputeDiskCreate(d *schema.ResourceData, meta interface{}) error {
130130
}
131131

132132
// Get the zone
133-
log.Printf("[DEBUG] Loading zone: %s", d.Get("zone").(string))
133+
z, err := getZone(d, config)
134+
if err != nil {
135+
return err
136+
}
137+
log.Printf("[DEBUG] Loading zone: %s", z)
134138
zone, err := config.clientCompute.Zones.Get(
135-
project, d.Get("zone").(string)).Do()
139+
project, z).Do()
136140
if err != nil {
137141
return fmt.Errorf(
138-
"Error loading zone '%s': %s", d.Get("zone").(string), err)
142+
"Error loading zone '%s': %s", z, err)
139143
}
140144

141145
// Build the disk parameter
@@ -199,7 +203,7 @@ func resourceComputeDiskCreate(d *schema.ResourceData, meta interface{}) error {
199203
}
200204

201205
op, err := config.clientCompute.Disks.Insert(
202-
project, d.Get("zone").(string), disk).Do()
206+
project, z, disk).Do()
203207
if err != nil {
204208
return fmt.Errorf("Error creating disk: %s", err)
205209
}
@@ -221,13 +225,17 @@ func resourceComputeDiskUpdate(d *schema.ResourceData, meta interface{}) error {
221225
if err != nil {
222226
return err
223227
}
228+
z, err := getZone(d, config)
229+
if err != nil {
230+
return err
231+
}
224232
d.Partial(true)
225233
if d.HasChange("size") {
226234
rb := &compute.DisksResizeRequest{
227235
SizeGb: int64(d.Get("size").(int)),
228236
}
229237
op, err := config.clientCompute.Disks.Resize(
230-
project, d.Get("zone").(string), d.Id(), rb).Do()
238+
project, z, d.Id(), rb).Do()
231239
if err != nil {
232240
return fmt.Errorf("Error resizing disk: %s", err)
233241
}
@@ -245,7 +253,7 @@ func resourceComputeDiskUpdate(d *schema.ResourceData, meta interface{}) error {
245253
LabelFingerprint: d.Get("label_fingerprint").(string),
246254
}
247255
op, err := config.clientCompute.Disks.SetLabels(
248-
project, d.Get("zone").(string), d.Id(), &zslr).Do()
256+
project, z, d.Id(), &zslr).Do()
249257
if err != nil {
250258
return fmt.Errorf("Error when setting labels: %s", err)
251259
}
@@ -279,9 +287,9 @@ func resourceComputeDiskRead(d *schema.ResourceData, meta interface{}) error {
279287
}
280288

281289
var disk *compute.Disk
282-
if zone, ok := d.GetOk("zone"); ok {
290+
if zone, _ := getZone(d, config); zone != "" {
283291
disk, err = config.clientCompute.Disks.Get(
284-
project, zone.(string), d.Id()).Do()
292+
project, zone, d.Id()).Do()
285293
if err != nil {
286294
return handleNotFoundError(err, d, fmt.Sprintf("Disk %q", d.Get("name").(string)))
287295
}
@@ -326,6 +334,10 @@ func resourceComputeDiskDelete(d *schema.ResourceData, meta interface{}) error {
326334
if err != nil {
327335
return err
328336
}
337+
z, err := getZone(d, config)
338+
if err != nil {
339+
return err
340+
}
329341

330342
// if disks are attached, they must be detached before the disk can be deleted
331343
if instances, ok := d.Get("users").([]interface{}); ok {
@@ -376,7 +388,7 @@ func resourceComputeDiskDelete(d *schema.ResourceData, meta interface{}) error {
376388

377389
// Delete the disk
378390
op, err := config.clientCompute.Disks.Delete(
379-
project, d.Get("zone").(string), d.Id()).Do()
391+
project, z, d.Id()).Do()
380392
if err != nil {
381393
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
382394
log.Printf("[WARN] Removing Disk %q because it's gone", d.Get("name").(string))

google/resource_compute_instance.go

+20-7
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ func resourceComputeInstance() *schema.Resource {
240240

241241
"zone": &schema.Schema{
242242
Type: schema.TypeString,
243-
Required: true,
243+
Optional: true,
244244
ForceNew: true,
245245
},
246246

@@ -547,7 +547,10 @@ func getInstance(config *Config, d *schema.ResourceData) (*computeBeta.Instance,
547547
if err != nil {
548548
return nil, err
549549
}
550-
zone := d.Get("zone").(string)
550+
zone, err := getZone(d, config)
551+
if err != nil {
552+
return nil, err
553+
}
551554
instance := &computeBeta.Instance{}
552555
switch getComputeApiVersion(d, InstanceBaseApiVersion, InstanceVersionedFeatures) {
553556
case v1:
@@ -576,12 +579,16 @@ func resourceComputeInstanceCreate(d *schema.ResourceData, meta interface{}) err
576579
}
577580

578581
// Get the zone
579-
log.Printf("[DEBUG] Loading zone: %s", d.Get("zone").(string))
582+
z, err := getZone(d, config)
583+
if err != nil {
584+
return err
585+
}
586+
log.Printf("[DEBUG] Loading zone: %s", z)
580587
zone, err := config.clientCompute.Zones.Get(
581-
project, d.Get("zone").(string)).Do()
588+
project, z).Do()
582589
if err != nil {
583590
return fmt.Errorf(
584-
"Error loading zone '%s': %s", d.Get("zone").(string), err)
591+
"Error loading zone '%s': %s", z, err)
585592
}
586593

587594
// Get the machine type
@@ -856,7 +863,10 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err
856863
return err
857864
}
858865

859-
zone := d.Get("zone").(string)
866+
zone, err := getZone(d, config)
867+
if err != nil {
868+
return err
869+
}
860870

861871
instance, err := getInstance(config, d)
862872
if err != nil {
@@ -1200,7 +1210,10 @@ func resourceComputeInstanceDelete(d *schema.ResourceData, meta interface{}) err
12001210
return err
12011211
}
12021212

1203-
zone := d.Get("zone").(string)
1213+
zone, err := getZone(d, config)
1214+
if err != nil {
1215+
return err
1216+
}
12041217
log.Printf("[INFO] Requesting instance deletion: %s", d.Id())
12051218
op, err := config.clientCompute.Instances.Delete(project, zone, d.Id()).Do()
12061219
if err != nil {

0 commit comments

Comments
 (0)