@@ -5,9 +5,15 @@ import (
5
5
"log"
6
6
7
7
"github.com/hashicorp/terraform/helper/schema"
8
+ "github.com/hashicorp/terraform/helper/validation"
9
+
10
+ computeBeta "google.golang.org/api/compute/v0.beta"
8
11
"google.golang.org/api/compute/v1"
9
12
)
10
13
14
+ var GlobalForwardingRuleBaseApiVersion = v1
15
+ var GlobalForwardingRuleVersionedFeatures = []Feature {Feature {Version : v0beta , Item : "ip_version" }}
16
+
11
17
func resourceComputeGlobalForwardingRule () * schema.Resource {
12
18
return & schema.Resource {
13
19
Create : resourceComputeGlobalForwardingRuleCreate ,
@@ -23,8 +29,9 @@ func resourceComputeGlobalForwardingRule() *schema.Resource {
23
29
},
24
30
25
31
"target" : & schema.Schema {
26
- Type : schema .TypeString ,
27
- Required : true ,
32
+ Type : schema .TypeString ,
33
+ Required : true ,
34
+ DiffSuppressFunc : compareSelfLinkRelativePaths ,
28
35
},
29
36
30
37
"description" : & schema.Schema {
@@ -53,6 +60,13 @@ func resourceComputeGlobalForwardingRule() *schema.Resource {
53
60
ForceNew : true ,
54
61
},
55
62
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
+
56
70
"project" : & schema.Schema {
57
71
Type : schema .TypeString ,
58
72
Optional : true ,
@@ -75,32 +89,54 @@ func resourceComputeGlobalForwardingRule() *schema.Resource {
75
89
}
76
90
77
91
func resourceComputeGlobalForwardingRuleCreate (d * schema.ResourceData , meta interface {}) error {
92
+ computeApiVersion := getComputeApiVersion (d , GlobalForwardingRuleBaseApiVersion , GlobalForwardingRuleVersionedFeatures )
78
93
config := meta .(* Config )
79
94
80
95
project , err := getProject (d , config )
81
96
if err != nil {
82
97
return err
83
98
}
84
99
85
- frule := & compute .ForwardingRule {
100
+ frule := & computeBeta .ForwardingRule {
86
101
IPAddress : d .Get ("ip_address" ).(string ),
87
102
IPProtocol : d .Get ("ip_protocol" ).(string ),
103
+ IpVersion : d .Get ("ip_version" ).(string ),
88
104
Description : d .Get ("description" ).(string ),
89
105
Name : d .Get ("name" ).(string ),
90
106
PortRange : d .Get ("port_range" ).(string ),
91
107
Target : d .Get ("target" ).(string ),
92
108
}
93
109
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
+ }
98
134
}
99
135
100
136
// It probably maybe worked, so store the ID now
101
137
d .SetId (frule .Name )
102
138
103
- err = computeOperationWait (config , op , project , "Creating Global Fowarding Rule" )
139
+ err = computeSharedOperationWait (config , op , project , "Creating Global Fowarding Rule" )
104
140
if err != nil {
105
141
return err
106
142
}
@@ -109,6 +145,7 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte
109
145
}
110
146
111
147
func resourceComputeGlobalForwardingRuleUpdate (d * schema.ResourceData , meta interface {}) error {
148
+ computeApiVersion := getComputeApiVersionUpdate (d , GlobalForwardingRuleBaseApiVersion , GlobalForwardingRuleVersionedFeatures , []Feature {})
112
149
config := meta .(* Config )
113
150
114
151
project , err := getProject (d , config )
@@ -119,15 +156,38 @@ func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta inte
119
156
d .Partial (true )
120
157
121
158
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
+ }
128
188
}
129
189
130
- err = computeOperationWait (config , op , project , "Updating Global Forwarding Rule" )
190
+ err = computeSharedOperationWait (config , op , project , "Updating Global Forwarding Rule" )
131
191
if err != nil {
132
192
return err
133
193
}
@@ -141,27 +201,48 @@ func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta inte
141
201
}
142
202
143
203
func resourceComputeGlobalForwardingRuleRead (d * schema.ResourceData , meta interface {}) error {
204
+ computeApiVersion := getComputeApiVersion (d , GlobalForwardingRuleBaseApiVersion , GlobalForwardingRuleVersionedFeatures )
144
205
config := meta .(* Config )
145
206
146
207
project , err := getProject (d , config )
147
208
if err != nil {
148
209
return err
149
210
}
150
211
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
+ }
155
234
}
156
235
157
236
d .Set ("ip_address" , frule .IPAddress )
158
237
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 ))
160
240
161
241
return nil
162
242
}
163
243
164
244
func resourceComputeGlobalForwardingRuleDelete (d * schema.ResourceData , meta interface {}) error {
245
+ computeApiVersion := getComputeApiVersion (d , GlobalForwardingRuleBaseApiVersion , GlobalForwardingRuleVersionedFeatures )
165
246
config := meta .(* Config )
166
247
167
248
project , err := getProject (d , config )
@@ -171,13 +252,21 @@ func resourceComputeGlobalForwardingRuleDelete(d *schema.ResourceData, meta inte
171
252
172
253
// Delete the GlobalForwardingRule
173
254
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
+ }
178
267
}
179
268
180
- err = computeOperationWait (config , op , project , "Deleting GlobalForwarding Rule" )
269
+ err = computeSharedOperationWait (config , op , project , "Deleting GlobalForwarding Rule" )
181
270
if err != nil {
182
271
return err
183
272
}
0 commit comments