Skip to content

Commit d1f7a6a

Browse files
rileykarsonDmitry Vlasov
authored and
Dmitry Vlasov
committed
Add Beta support & Beta feature ip_version to google_compute_global_forwarding_rule (hashicorp#265)
* Add versioned Beta support to google_compute_global_forwarding_rule. * Add Beta support for ip_version in google_compute_global_forwarding_rule. * Temporary commit with compute_shared_operation.go changes. * Added a test to see if v1 GFR is still IPV4, moved to a TestCheckFunc * This API returns the original self links, but let's make sure we don't diff.
1 parent 00191b6 commit d1f7a6a

4 files changed

+283
-25
lines changed

google/compute_shared_operation.go

+19
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@ import (
55
"google.golang.org/api/compute/v1"
66
)
77

8+
func computeSharedOperationWait(config *Config, op interface{}, project string, activity string) error {
9+
return computeSharedOperationWaitTime(config, op, project, 4, activity)
10+
}
11+
12+
func computeSharedOperationWaitTime(config *Config, op interface{}, project string, minutes int, activity string) error {
13+
if op == nil {
14+
panic("Attempted to wait on an Operation that was nil.")
15+
}
16+
17+
switch op.(type) {
18+
case *compute.Operation:
19+
return computeOperationWaitTime(config, op.(*compute.Operation), project, activity, minutes)
20+
case *computeBeta.Operation:
21+
return computeBetaOperationWaitGlobalTime(config, op.(*computeBeta.Operation), project, activity, minutes)
22+
default:
23+
panic("Attempted to wait on an Operation of unknown type.")
24+
}
25+
}
26+
827
func computeSharedOperationWaitZone(config *Config, op interface{}, project string, zone, activity string) error {
928
return computeSharedOperationWaitZoneTime(config, op, project, zone, 4, activity)
1029
}

google/resource_compute_global_forwarding_rule.go

+114-25
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@ import (
55
"log"
66

77
"github.com/hashicorp/terraform/helper/schema"
8+
"github.com/hashicorp/terraform/helper/validation"
9+
10+
computeBeta "google.golang.org/api/compute/v0.beta"
811
"google.golang.org/api/compute/v1"
912
)
1013

14+
var GlobalForwardingRuleBaseApiVersion = v1
15+
var GlobalForwardingRuleVersionedFeatures = []Feature{Feature{Version: v0beta, Item: "ip_version"}}
16+
1117
func resourceComputeGlobalForwardingRule() *schema.Resource {
1218
return &schema.Resource{
1319
Create: resourceComputeGlobalForwardingRuleCreate,
@@ -23,8 +29,9 @@ func resourceComputeGlobalForwardingRule() *schema.Resource {
2329
},
2430

2531
"target": &schema.Schema{
26-
Type: schema.TypeString,
27-
Required: true,
32+
Type: schema.TypeString,
33+
Required: true,
34+
DiffSuppressFunc: compareSelfLinkRelativePaths,
2835
},
2936

3037
"description": &schema.Schema{
@@ -53,6 +60,13 @@ func resourceComputeGlobalForwardingRule() *schema.Resource {
5360
ForceNew: true,
5461
},
5562

63+
"ip_version": &schema.Schema{
64+
Type: schema.TypeString,
65+
Optional: true,
66+
ForceNew: true,
67+
ValidateFunc: validation.StringInSlice([]string{"IPV4", "IPV6"}, false),
68+
},
69+
5670
"project": &schema.Schema{
5771
Type: schema.TypeString,
5872
Optional: true,
@@ -75,32 +89,54 @@ func resourceComputeGlobalForwardingRule() *schema.Resource {
7589
}
7690

7791
func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta interface{}) error {
92+
computeApiVersion := getComputeApiVersion(d, GlobalForwardingRuleBaseApiVersion, GlobalForwardingRuleVersionedFeatures)
7893
config := meta.(*Config)
7994

8095
project, err := getProject(d, config)
8196
if err != nil {
8297
return err
8398
}
8499

85-
frule := &compute.ForwardingRule{
100+
frule := &computeBeta.ForwardingRule{
86101
IPAddress: d.Get("ip_address").(string),
87102
IPProtocol: d.Get("ip_protocol").(string),
103+
IpVersion: d.Get("ip_version").(string),
88104
Description: d.Get("description").(string),
89105
Name: d.Get("name").(string),
90106
PortRange: d.Get("port_range").(string),
91107
Target: d.Get("target").(string),
92108
}
93109

94-
op, err := config.clientCompute.GlobalForwardingRules.Insert(
95-
project, frule).Do()
96-
if err != nil {
97-
return fmt.Errorf("Error creating Global Forwarding Rule: %s", err)
110+
var op interface{}
111+
switch computeApiVersion {
112+
case v1:
113+
v1Frule := &compute.ForwardingRule{}
114+
err = Convert(frule, v1Frule)
115+
if err != nil {
116+
return err
117+
}
118+
119+
op, err = config.clientCompute.GlobalForwardingRules.Insert(project, v1Frule).Do()
120+
if err != nil {
121+
return fmt.Errorf("Error creating Global Forwarding Rule: %s", err)
122+
}
123+
case v0beta:
124+
v0BetaFrule := &computeBeta.ForwardingRule{}
125+
err = Convert(frule, v0BetaFrule)
126+
if err != nil {
127+
return err
128+
}
129+
130+
op, err = config.clientComputeBeta.GlobalForwardingRules.Insert(project, v0BetaFrule).Do()
131+
if err != nil {
132+
return fmt.Errorf("Error creating Global Forwarding Rule: %s", err)
133+
}
98134
}
99135

100136
// It probably maybe worked, so store the ID now
101137
d.SetId(frule.Name)
102138

103-
err = computeOperationWait(config, op, project, "Creating Global Fowarding Rule")
139+
err = computeSharedOperationWait(config, op, project, "Creating Global Fowarding Rule")
104140
if err != nil {
105141
return err
106142
}
@@ -109,6 +145,7 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte
109145
}
110146

111147
func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta interface{}) error {
148+
computeApiVersion := getComputeApiVersionUpdate(d, GlobalForwardingRuleBaseApiVersion, GlobalForwardingRuleVersionedFeatures, []Feature{})
112149
config := meta.(*Config)
113150

114151
project, err := getProject(d, config)
@@ -119,15 +156,38 @@ func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta inte
119156
d.Partial(true)
120157

121158
if d.HasChange("target") {
122-
target_name := d.Get("target").(string)
123-
target_ref := &compute.TargetReference{Target: target_name}
124-
op, err := config.clientCompute.GlobalForwardingRules.SetTarget(
125-
project, d.Id(), target_ref).Do()
126-
if err != nil {
127-
return fmt.Errorf("Error updating target: %s", err)
159+
target := d.Get("target").(string)
160+
targetRef := &computeBeta.TargetReference{Target: target}
161+
162+
var op interface{}
163+
switch computeApiVersion {
164+
case v1:
165+
v1TargetRef := &compute.TargetReference{}
166+
err = Convert(targetRef, v1TargetRef)
167+
if err != nil {
168+
return err
169+
}
170+
171+
op, err = config.clientCompute.GlobalForwardingRules.SetTarget(
172+
project, d.Id(), v1TargetRef).Do()
173+
if err != nil {
174+
return fmt.Errorf("Error updating target: %s", err)
175+
}
176+
case v0beta:
177+
v0BetaTargetRef := &compute.TargetReference{}
178+
err = Convert(targetRef, v0BetaTargetRef)
179+
if err != nil {
180+
return err
181+
}
182+
183+
op, err = config.clientCompute.GlobalForwardingRules.SetTarget(
184+
project, d.Id(), v0BetaTargetRef).Do()
185+
if err != nil {
186+
return fmt.Errorf("Error updating target: %s", err)
187+
}
128188
}
129189

130-
err = computeOperationWait(config, op, project, "Updating Global Forwarding Rule")
190+
err = computeSharedOperationWait(config, op, project, "Updating Global Forwarding Rule")
131191
if err != nil {
132192
return err
133193
}
@@ -141,27 +201,48 @@ func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta inte
141201
}
142202

143203
func resourceComputeGlobalForwardingRuleRead(d *schema.ResourceData, meta interface{}) error {
204+
computeApiVersion := getComputeApiVersion(d, GlobalForwardingRuleBaseApiVersion, GlobalForwardingRuleVersionedFeatures)
144205
config := meta.(*Config)
145206

146207
project, err := getProject(d, config)
147208
if err != nil {
148209
return err
149210
}
150211

151-
frule, err := config.clientCompute.GlobalForwardingRules.Get(
152-
project, d.Id()).Do()
153-
if err != nil {
154-
return handleNotFoundError(err, d, fmt.Sprintf("Global Forwarding Rule %q", d.Get("name").(string)))
212+
frule := &computeBeta.ForwardingRule{}
213+
switch computeApiVersion {
214+
case v1:
215+
v1Frule, err := config.clientCompute.GlobalForwardingRules.Get(project, d.Id()).Do()
216+
if err != nil {
217+
return handleNotFoundError(err, d, fmt.Sprintf("Global Forwarding Rule %q", d.Get("name").(string)))
218+
}
219+
220+
err = Convert(v1Frule, frule)
221+
if err != nil {
222+
return err
223+
}
224+
case v0beta:
225+
v0BetaFrule, err := config.clientComputeBeta.GlobalForwardingRules.Get(project, d.Id()).Do()
226+
if err != nil {
227+
return handleNotFoundError(err, d, fmt.Sprintf("Global Forwarding Rule %q", d.Get("name").(string)))
228+
}
229+
230+
err = Convert(v0BetaFrule, frule)
231+
if err != nil {
232+
return err
233+
}
155234
}
156235

157236
d.Set("ip_address", frule.IPAddress)
158237
d.Set("ip_protocol", frule.IPProtocol)
159-
d.Set("self_link", frule.SelfLink)
238+
d.Set("ip_version", frule.IpVersion)
239+
d.Set("self_link", ConvertSelfLinkToV1(frule.SelfLink))
160240

161241
return nil
162242
}
163243

164244
func resourceComputeGlobalForwardingRuleDelete(d *schema.ResourceData, meta interface{}) error {
245+
computeApiVersion := getComputeApiVersion(d, GlobalForwardingRuleBaseApiVersion, GlobalForwardingRuleVersionedFeatures)
165246
config := meta.(*Config)
166247

167248
project, err := getProject(d, config)
@@ -171,13 +252,21 @@ func resourceComputeGlobalForwardingRuleDelete(d *schema.ResourceData, meta inte
171252

172253
// Delete the GlobalForwardingRule
173254
log.Printf("[DEBUG] GlobalForwardingRule delete request")
174-
op, err := config.clientCompute.GlobalForwardingRules.Delete(
175-
project, d.Id()).Do()
176-
if err != nil {
177-
return fmt.Errorf("Error deleting GlobalForwardingRule: %s", err)
255+
var op interface{}
256+
switch computeApiVersion {
257+
case v1:
258+
op, err = config.clientCompute.GlobalForwardingRules.Delete(project, d.Id()).Do()
259+
if err != nil {
260+
return fmt.Errorf("Error deleting GlobalForwardingRule: %s", err)
261+
}
262+
case v0beta:
263+
op, err = config.clientComputeBeta.GlobalForwardingRules.Delete(project, d.Id()).Do()
264+
if err != nil {
265+
return fmt.Errorf("Error deleting GlobalForwardingRule: %s", err)
266+
}
178267
}
179268

180-
err = computeOperationWait(config, op, project, "Deleting GlobalForwarding Rule")
269+
err = computeSharedOperationWait(config, op, project, "Deleting GlobalForwarding Rule")
181270
if err != nil {
182271
return err
183272
}

0 commit comments

Comments
 (0)