@@ -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 GlobalAddressBaseApiVersion = v1
15
+ var GlobalAddressVersionedFeatures = []Feature {Feature {Version : v0beta , Item : "ip_version" }}
16
+
11
17
func resourceComputeGlobalAddress () * schema.Resource {
12
18
return & schema.Resource {
13
19
Create : resourceComputeGlobalAddressCreate ,
@@ -16,16 +22,19 @@ func resourceComputeGlobalAddress() *schema.Resource {
16
22
Importer : & schema.ResourceImporter {
17
23
State : schema .ImportStatePassthrough ,
18
24
},
25
+
19
26
Schema : map [string ]* schema.Schema {
20
27
"name" : & schema.Schema {
21
28
Type : schema .TypeString ,
22
29
Required : true ,
23
30
ForceNew : true ,
24
31
},
25
32
26
- "address" : & schema.Schema {
27
- Type : schema .TypeString ,
28
- Computed : true ,
33
+ "ip_version" : & schema.Schema {
34
+ Type : schema .TypeString ,
35
+ Optional : true ,
36
+ ForceNew : true ,
37
+ ValidateFunc : validation .StringInSlice ([]string {"IPV4" , "IPV6" }, false ),
29
38
},
30
39
31
40
"project" : & schema.Schema {
@@ -34,6 +43,11 @@ func resourceComputeGlobalAddress() *schema.Resource {
34
43
ForceNew : true ,
35
44
},
36
45
46
+ "address" : & schema.Schema {
47
+ Type : schema .TypeString ,
48
+ Computed : true ,
49
+ },
50
+
37
51
"self_link" : & schema.Schema {
38
52
Type : schema .TypeString ,
39
53
Computed : true ,
@@ -43,6 +57,7 @@ func resourceComputeGlobalAddress() *schema.Resource {
43
57
}
44
58
45
59
func resourceComputeGlobalAddressCreate (d * schema.ResourceData , meta interface {}) error {
60
+ computeApiVersion := getComputeApiVersion (d , GlobalAddressBaseApiVersion , GlobalAddressVersionedFeatures )
46
61
config := meta .(* Config )
47
62
48
63
project , err := getProject (d , config )
@@ -51,17 +66,41 @@ func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}
51
66
}
52
67
53
68
// Build the address parameter
54
- addr := & compute.Address {Name : d .Get ("name" ).(string )}
55
- op , err := config .clientCompute .GlobalAddresses .Insert (
56
- project , addr ).Do ()
57
- if err != nil {
58
- return fmt .Errorf ("Error creating address: %s" , err )
69
+ addr := & computeBeta.Address {
70
+ Name : d .Get ("name" ).(string ),
71
+ IpVersion : d .Get ("ip_version" ).(string ),
72
+ }
73
+
74
+ var op interface {}
75
+ switch computeApiVersion {
76
+ case v1 :
77
+ v1Addr := & compute.Address {}
78
+ err = Convert (addr , v1Addr )
79
+ if err != nil {
80
+ return err
81
+ }
82
+
83
+ op , err = config .clientCompute .GlobalAddresses .Insert (project , v1Addr ).Do ()
84
+ if err != nil {
85
+ return fmt .Errorf ("Error creating address: %s" , err )
86
+ }
87
+ case v0beta :
88
+ v0BetaAddr := & computeBeta.Address {}
89
+ err = Convert (addr , v0BetaAddr )
90
+ if err != nil {
91
+ return err
92
+ }
93
+
94
+ op , err = config .clientComputeBeta .GlobalAddresses .Insert (project , v0BetaAddr ).Do ()
95
+ if err != nil {
96
+ return fmt .Errorf ("Error creating address: %s" , err )
97
+ }
59
98
}
60
99
61
100
// It probably maybe worked, so store the ID now
62
101
d .SetId (addr .Name )
63
102
64
- err = computeOperationWait (config , op , project , "Creating Global Address" )
103
+ err = computeSharedOperationWait (config , op , project , "Creating Global Address" )
65
104
if err != nil {
66
105
return err
67
106
}
@@ -70,27 +109,48 @@ func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}
70
109
}
71
110
72
111
func resourceComputeGlobalAddressRead (d * schema.ResourceData , meta interface {}) error {
112
+ computeApiVersion := getComputeApiVersion (d , GlobalAddressBaseApiVersion , GlobalAddressVersionedFeatures )
73
113
config := meta .(* Config )
74
114
75
115
project , err := getProject (d , config )
76
116
if err != nil {
77
117
return err
78
118
}
79
119
80
- addr , err := config .clientCompute .GlobalAddresses .Get (
81
- project , d .Id ()).Do ()
82
- if err != nil {
83
- return handleNotFoundError (err , d , fmt .Sprintf ("Global Address %q" , d .Get ("name" ).(string )))
120
+ addr := & computeBeta.Address {}
121
+ switch computeApiVersion {
122
+ case v1 :
123
+ v1Addr , err := config .clientCompute .GlobalAddresses .Get (project , d .Id ()).Do ()
124
+ if err != nil {
125
+ return handleNotFoundError (err , d , fmt .Sprintf ("Global Address %q" , d .Get ("name" ).(string )))
126
+ }
127
+
128
+ err = Convert (v1Addr , addr )
129
+ if err != nil {
130
+ return err
131
+ }
132
+ case v0beta :
133
+ v0BetaAddr , err := config .clientComputeBeta .GlobalAddresses .Get (project , d .Id ()).Do ()
134
+ if err != nil {
135
+ return handleNotFoundError (err , d , fmt .Sprintf ("Global Address %q" , d .Get ("name" ).(string )))
136
+ }
137
+
138
+ err = Convert (v0BetaAddr , addr )
139
+ if err != nil {
140
+ return err
141
+ }
84
142
}
85
143
86
- d .Set ("address" , addr .Address )
87
- d .Set ("self_link" , addr .SelfLink )
88
144
d .Set ("name" , addr .Name )
145
+ d .Set ("ip_version" , addr .IpVersion )
146
+ d .Set ("address" , addr .Address )
147
+ d .Set ("self_link" , ConvertSelfLinkToV1 (addr .SelfLink ))
89
148
90
149
return nil
91
150
}
92
151
93
152
func resourceComputeGlobalAddressDelete (d * schema.ResourceData , meta interface {}) error {
153
+ computeApiVersion := getComputeApiVersion (d , GlobalAddressBaseApiVersion , GlobalAddressVersionedFeatures )
94
154
config := meta .(* Config )
95
155
96
156
project , err := getProject (d , config )
@@ -100,13 +160,21 @@ func resourceComputeGlobalAddressDelete(d *schema.ResourceData, meta interface{}
100
160
101
161
// Delete the address
102
162
log .Printf ("[DEBUG] address delete request" )
103
- op , err := config .clientCompute .GlobalAddresses .Delete (
104
- project , d .Id ()).Do ()
105
- if err != nil {
106
- return fmt .Errorf ("Error deleting address: %s" , err )
163
+ var op interface {}
164
+ switch computeApiVersion {
165
+ case v1 :
166
+ op , err = config .clientCompute .GlobalAddresses .Delete (project , d .Id ()).Do ()
167
+ if err != nil {
168
+ return fmt .Errorf ("Error deleting address: %s" , err )
169
+ }
170
+ case v0beta :
171
+ op , err = config .clientComputeBeta .GlobalAddresses .Delete (project , d .Id ()).Do ()
172
+ if err != nil {
173
+ return fmt .Errorf ("Error deleting address: %s" , err )
174
+ }
107
175
}
108
176
109
- err = computeOperationWait (config , op , project , "Deleting Global Address" )
177
+ err = computeSharedOperationWait (config , op , project , "Deleting Global Address" )
110
178
if err != nil {
111
179
return err
112
180
}
0 commit comments