Skip to content

Commit 68f2e35

Browse files
authored
Add Beta support & Beta feature ip_version to google_compute_global_address (#250)
* Make google_compute_global_address a versioned resource with Beta support. * Added Beta support for ip_version in google_compute_global_address. * Move checks to TestCheckFuncs, add a regression test for IPV4 on v1 resources. * Consolidated TestCheckFuncs to a single function. * Add missing return statement. * Fix IPV4 test * Clarified comment.
1 parent 9de33c7 commit 68f2e35

File tree

3 files changed

+178
-20
lines changed

3 files changed

+178
-20
lines changed

google/resource_compute_global_address.go

+88-20
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 GlobalAddressBaseApiVersion = v1
15+
var GlobalAddressVersionedFeatures = []Feature{Feature{Version: v0beta, Item: "ip_version"}}
16+
1117
func resourceComputeGlobalAddress() *schema.Resource {
1218
return &schema.Resource{
1319
Create: resourceComputeGlobalAddressCreate,
@@ -16,16 +22,19 @@ func resourceComputeGlobalAddress() *schema.Resource {
1622
Importer: &schema.ResourceImporter{
1723
State: schema.ImportStatePassthrough,
1824
},
25+
1926
Schema: map[string]*schema.Schema{
2027
"name": &schema.Schema{
2128
Type: schema.TypeString,
2229
Required: true,
2330
ForceNew: true,
2431
},
2532

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),
2938
},
3039

3140
"project": &schema.Schema{
@@ -34,6 +43,11 @@ func resourceComputeGlobalAddress() *schema.Resource {
3443
ForceNew: true,
3544
},
3645

46+
"address": &schema.Schema{
47+
Type: schema.TypeString,
48+
Computed: true,
49+
},
50+
3751
"self_link": &schema.Schema{
3852
Type: schema.TypeString,
3953
Computed: true,
@@ -43,6 +57,7 @@ func resourceComputeGlobalAddress() *schema.Resource {
4357
}
4458

4559
func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}) error {
60+
computeApiVersion := getComputeApiVersion(d, GlobalAddressBaseApiVersion, GlobalAddressVersionedFeatures)
4661
config := meta.(*Config)
4762

4863
project, err := getProject(d, config)
@@ -51,17 +66,41 @@ func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}
5166
}
5267

5368
// 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+
}
5998
}
6099

61100
// It probably maybe worked, so store the ID now
62101
d.SetId(addr.Name)
63102

64-
err = computeOperationWait(config, op, project, "Creating Global Address")
103+
err = computeSharedOperationWait(config, op, project, "Creating Global Address")
65104
if err != nil {
66105
return err
67106
}
@@ -70,27 +109,48 @@ func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}
70109
}
71110

72111
func resourceComputeGlobalAddressRead(d *schema.ResourceData, meta interface{}) error {
112+
computeApiVersion := getComputeApiVersion(d, GlobalAddressBaseApiVersion, GlobalAddressVersionedFeatures)
73113
config := meta.(*Config)
74114

75115
project, err := getProject(d, config)
76116
if err != nil {
77117
return err
78118
}
79119

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+
}
84142
}
85143

86-
d.Set("address", addr.Address)
87-
d.Set("self_link", addr.SelfLink)
88144
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))
89148

90149
return nil
91150
}
92151

93152
func resourceComputeGlobalAddressDelete(d *schema.ResourceData, meta interface{}) error {
153+
computeApiVersion := getComputeApiVersion(d, GlobalAddressBaseApiVersion, GlobalAddressVersionedFeatures)
94154
config := meta.(*Config)
95155

96156
project, err := getProject(d, config)
@@ -100,13 +160,21 @@ func resourceComputeGlobalAddressDelete(d *schema.ResourceData, meta interface{}
100160

101161
// Delete the address
102162
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+
}
107175
}
108176

109-
err = computeOperationWait(config, op, project, "Deleting Global Address")
177+
err = computeSharedOperationWait(config, op, project, "Deleting Global Address")
110178
if err != nil {
111179
return err
112180
}

google/resource_compute_global_address_test.go

+85
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"github.com/hashicorp/terraform/helper/acctest"
88
"github.com/hashicorp/terraform/helper/resource"
99
"github.com/hashicorp/terraform/terraform"
10+
11+
computeBeta "google.golang.org/api/compute/v0.beta"
1012
"google.golang.org/api/compute/v1"
1113
)
1214

@@ -23,6 +25,29 @@ func TestAccComputeGlobalAddress_basic(t *testing.T) {
2325
Check: resource.ComposeTestCheckFunc(
2426
testAccCheckComputeGlobalAddressExists(
2527
"google_compute_global_address.foobar", &addr),
28+
29+
// implicitly IPV4 - if we don't send an ip_version, we don't get one back even when using Beta apis
30+
testAccCheckComputeBetaGlobalAddressIpVersion("google_compute_global_address.foobar", ""),
31+
),
32+
},
33+
},
34+
})
35+
}
36+
37+
func TestAccComputeGlobalAddress_ipv6(t *testing.T) {
38+
var addr computeBeta.Address
39+
40+
resource.Test(t, resource.TestCase{
41+
PreCheck: func() { testAccPreCheck(t) },
42+
Providers: testAccProviders,
43+
CheckDestroy: testAccCheckComputeGlobalAddressDestroy,
44+
Steps: []resource.TestStep{
45+
resource.TestStep{
46+
Config: testAccComputeGlobalAddress_ipv6,
47+
Check: resource.ComposeTestCheckFunc(
48+
testAccCheckComputeBetaGlobalAddressExists(
49+
"google_compute_global_address.foobar", &addr),
50+
testAccCheckComputeBetaGlobalAddressIpVersion("google_compute_global_address.foobar", "IPV6"),
2651
),
2752
},
2853
},
@@ -76,7 +101,67 @@ func testAccCheckComputeGlobalAddressExists(n string, addr *compute.Address) res
76101
}
77102
}
78103

104+
func testAccCheckComputeBetaGlobalAddressExists(n string, addr *computeBeta.Address) resource.TestCheckFunc {
105+
return func(s *terraform.State) error {
106+
rs, ok := s.RootModule().Resources[n]
107+
if !ok {
108+
return fmt.Errorf("Not found: %s", n)
109+
}
110+
111+
if rs.Primary.ID == "" {
112+
return fmt.Errorf("No ID is set")
113+
}
114+
115+
config := testAccProvider.Meta().(*Config)
116+
117+
found, err := config.clientComputeBeta.GlobalAddresses.Get(config.Project, rs.Primary.ID).Do()
118+
if err != nil {
119+
return err
120+
}
121+
122+
if found.Name != rs.Primary.ID {
123+
return fmt.Errorf("Addr not found")
124+
}
125+
126+
*addr = *found
127+
128+
return nil
129+
}
130+
}
131+
132+
func testAccCheckComputeBetaGlobalAddressIpVersion(n, version string) resource.TestCheckFunc {
133+
return func(s *terraform.State) error {
134+
rs, ok := s.RootModule().Resources[n]
135+
if !ok {
136+
return fmt.Errorf("Not found: %s", n)
137+
}
138+
139+
if rs.Primary.ID == "" {
140+
return fmt.Errorf("No ID is set")
141+
}
142+
143+
config := testAccProvider.Meta().(*Config)
144+
145+
addr, err := config.clientComputeBeta.GlobalAddresses.Get(config.Project, rs.Primary.ID).Do()
146+
if err != nil {
147+
return err
148+
}
149+
150+
if addr.IpVersion != version {
151+
return fmt.Errorf("Expected IP version to be %s, got %s", version, addr.IpVersion)
152+
}
153+
154+
return nil
155+
}
156+
}
157+
79158
var testAccComputeGlobalAddress_basic = fmt.Sprintf(`
80159
resource "google_compute_global_address" "foobar" {
81160
name = "address-test-%s"
82161
}`, acctest.RandString(10))
162+
163+
var testAccComputeGlobalAddress_ipv6 = fmt.Sprintf(`
164+
resource "google_compute_global_address" "foobar" {
165+
name = "address-test-%s"
166+
ip_version = "IPV6"
167+
}`, acctest.RandString(10))

website/docs/r/compute_global_address.html.markdown

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ The following arguments are supported:
3333
* `project` - (Optional) The project in which the resource belongs. If it
3434
is not provided, the provider project is used.
3535

36+
- - -
37+
38+
* `ip_version` - (Optional, Beta) The IP Version that will be used by this address.
39+
One of `"IPV4"` or `"IPV6"`.
40+
3641
## Attributes Reference
3742

3843
In addition to the arguments listed above, the following computed attributes are

0 commit comments

Comments
 (0)