Skip to content

Commit b2b4d96

Browse files
authored
bugfix for the restriction on infoblox_ipvX_network resource updates for 'gateway' and 'reserve_ip'/'reserve_ipv6' fields (#196)
1 parent c0504a7 commit b2b4d96

File tree

2 files changed

+144
-35
lines changed

2 files changed

+144
-35
lines changed

infoblox/resource_infoblox_network.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func resourceNetwork() *schema.Resource {
5151
Optional: true,
5252
Description: "Gateway's IP address of the network. By default, the first IP address is set as gateway address; if the value is 'none' then the network has no gateway.",
5353
Computed: true,
54+
// TODO: implement full support for this field
5455
},
5556
"comment": {
5657
Type: schema.TypeString,
@@ -200,7 +201,13 @@ func resourceNetworkRead(d *schema.ResourceData, m interface{}) error {
200201
d.SetId(obj.Ref)
201202
return nil
202203
}
203-
func resourceNetworkUpdate(d *schema.ResourceData, m interface{}) error {
204+
func resourceNetworkUpdate(d *schema.ResourceData, m interface{}) (err error) {
205+
206+
defer func() {
207+
if err != nil {
208+
d.Partial(true)
209+
}
210+
}()
204211

205212
networkViewName := d.Get("network_view").(string)
206213
if d.HasChange("network_view") {
@@ -212,13 +219,16 @@ func resourceNetworkUpdate(d *schema.ResourceData, m interface{}) error {
212219
if d.HasChange("reserve_ip") {
213220
return fmt.Errorf("changing the value of 'reserve_ip' field is not allowed")
214221
}
222+
if d.HasChange("reserve_ipv6") {
223+
return fmt.Errorf("changing the value of 'reserve_ipv6' field is not allowed")
224+
}
215225
if d.HasChange("gateway") {
216226
return fmt.Errorf("changing the value of 'gateway' field is not allowed")
217227
}
218228
extAttrJSON := d.Get("ext_attrs").(string)
219229
extAttrs := make(map[string]interface{})
220230
if extAttrJSON != "" {
221-
if err := json.Unmarshal([]byte(extAttrJSON), &extAttrs); err != nil {
231+
if err = json.Unmarshal([]byte(extAttrJSON), &extAttrs); err != nil {
222232
return fmt.Errorf("cannot process 'ext_attrs' field: %s", err.Error())
223233
}
224234
}
@@ -241,8 +251,6 @@ func resourceNetworkUpdate(d *schema.ResourceData, m interface{}) error {
241251
comment = commentVal.(string)
242252
}
243253

244-
var err error
245-
246254
Network, err = objMgr.UpdateNetwork(d.Id(), extAttrs, comment)
247255
if err != nil {
248256
return fmt.Errorf("Updation of IPv4 Network under network view '%s' failed: '%s'", networkViewName, err.Error())

infoblox/resource_infoblox_network_test.go

Lines changed: 132 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,14 @@ package infoblox
22

33
import (
44
"fmt"
5+
"regexp"
56
"testing"
67

78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
910
ibclient "github.com/infobloxopen/infoblox-go-client/v2"
1011
)
1112

12-
var testAccresourceIPv4NetworkCreate = fmt.Sprintf(`
13-
resource "infoblox_ipv4_network" "foo"{
14-
network_view="default"
15-
cidr="10.10.0.0/24"
16-
reserve_ip = 5
17-
gateway = "10.10.0.250"
18-
comment = "10.0.0.0/24 network created"
19-
ext_attrs = jsonencode({
20-
"Network Name"= "demo-network"
21-
"Tenant ID" = "terraform_test_tenant"
22-
"Location" = "Test loc."
23-
"Site" = "Test site"
24-
})
25-
}`)
26-
27-
var testAccresourceIPv6NetworkCreate = fmt.Sprintf(`
28-
resource "infoblox_ipv6_network" "foo"{
29-
network_view="default"
30-
cidr="2001:db8:abcd:12::/64"
31-
reserve_ipv6 = 10
32-
comment = "2001:db8:abcd:12::/64 network created"
33-
ext_attrs = jsonencode({
34-
"Tenant ID" = "terraform_test_tenant"
35-
"Network Name"= "demo-network"
36-
"Location" = "Test loc."
37-
"Site" = "Test site"
38-
})
39-
}`)
40-
4113
func validateNetwork(
4214
resourceName string,
4315
expectedValue *ibclient.Network) resource.TestCheckFunc {
@@ -122,14 +94,29 @@ func testAccCheckNetworkDestroy(s *terraform.State) error {
12294
return nil
12395
}
12496

97+
var updateNotAllowedErrorRegexp = regexp.MustCompile("changing the value of '.+' field is not allowed")
98+
12599
func TestAcc_resourceNetwork_ipv4(t *testing.T) {
126100
resource.Test(t, resource.TestCase{
127101
PreCheck: func() { testAccPreCheck(t) },
128102
Providers: testAccProviders,
129103
CheckDestroy: testAccCheckNetworkDestroy,
130104
Steps: []resource.TestStep{
131105
{
132-
Config: testAccresourceIPv4NetworkCreate,
106+
Config: `
107+
resource "infoblox_ipv4_network" "foo"{
108+
network_view="default"
109+
cidr="10.10.0.0/24"
110+
reserve_ip = 5
111+
gateway = "10.10.0.250"
112+
comment = "10.0.0.0/24 network created"
113+
ext_attrs = jsonencode({
114+
"Network Name"= "demo-network"
115+
"Tenant ID" = "terraform_test_tenant"
116+
"Location" = "Test loc."
117+
"Site" = "Test site"
118+
})
119+
}`,
133120
Check: validateNetwork(
134121
"infoblox_ipv4_network.foo",
135122
&ibclient.Network{
@@ -144,6 +131,76 @@ func TestAcc_resourceNetwork_ipv4(t *testing.T) {
144131
},
145132
),
146133
},
134+
{
135+
Config: `
136+
resource "infoblox_ipv4_network" "foo"{
137+
network_view="default"
138+
cidr="10.10.0.0/24"
139+
reserve_ip = 6
140+
gateway = "10.10.0.250"
141+
comment = "10.0.0.0/24 network created"
142+
ext_attrs = jsonencode({
143+
"Network Name"= "demo-network"
144+
"Tenant ID" = "terraform_test_tenant"
145+
"Location" = "Test loc."
146+
"Site" = "Test site"
147+
})
148+
}`,
149+
ExpectError: updateNotAllowedErrorRegexp,
150+
},
151+
{
152+
Config: `
153+
resource "infoblox_ipv4_network" "foo"{
154+
network_view="default"
155+
cidr="10.10.0.0/24"
156+
reserve_ip = 6
157+
gateway = "10.10.0.250"
158+
comment = "10.0.0.0/24 network created"
159+
ext_attrs = jsonencode({
160+
"Network Name"= "demo-network"
161+
"Tenant ID" = "terraform_test_tenant"
162+
"Location" = "Test loc."
163+
"Site" = "Test site"
164+
})
165+
}`,
166+
// double-check that the next update (with the same changes) returns an error as well
167+
// (in case the field to be updated is 'computed' and the main code do not clear it to the previous state)
168+
ExpectError: updateNotAllowedErrorRegexp,
169+
},
170+
{
171+
Config: `
172+
resource "infoblox_ipv4_network" "foo"{
173+
network_view="default"
174+
cidr="10.10.0.0/24"
175+
reserve_ip = 5
176+
gateway = "10.10.0.251"
177+
comment = "10.0.0.0/24 network created"
178+
ext_attrs = jsonencode({
179+
"Network Name"= "demo-network"
180+
"Tenant ID" = "terraform_test_tenant"
181+
"Location" = "Test loc."
182+
"Site" = "Test site"
183+
})
184+
}`,
185+
ExpectError: updateNotAllowedErrorRegexp,
186+
},
187+
{
188+
Config: `
189+
resource "infoblox_ipv4_network" "foo"{
190+
network_view="default"
191+
cidr="10.10.0.0/24"
192+
reserve_ip = 5
193+
gateway = "10.10.0.251"
194+
comment = "10.0.0.0/24 network created"
195+
ext_attrs = jsonencode({
196+
"Network Name"= "demo-network"
197+
"Tenant ID" = "terraform_test_tenant"
198+
"Location" = "Test loc."
199+
"Site" = "Test site"
200+
})
201+
}`,
202+
ExpectError: updateNotAllowedErrorRegexp,
203+
},
147204
},
148205
})
149206
}
@@ -155,7 +212,19 @@ func TestAcc_resourceNetwork_ipv6(t *testing.T) {
155212
CheckDestroy: testAccCheckNetworkDestroy,
156213
Steps: []resource.TestStep{
157214
{
158-
Config: testAccresourceIPv6NetworkCreate,
215+
Config: `
216+
resource "infoblox_ipv6_network" "foo"{
217+
network_view="default"
218+
cidr="2001:db8:abcd:12::/64"
219+
reserve_ipv6 = 10
220+
comment = "2001:db8:abcd:12::/64 network created"
221+
ext_attrs = jsonencode({
222+
"Tenant ID" = "terraform_test_tenant"
223+
"Network Name"= "demo-network"
224+
"Location" = "Test loc."
225+
"Site" = "Test site"
226+
})
227+
}`,
159228
Check: validateNetwork(
160229
"infoblox_ipv6_network.foo",
161230
&ibclient.Network{
@@ -170,6 +239,38 @@ func TestAcc_resourceNetwork_ipv6(t *testing.T) {
170239
},
171240
),
172241
},
242+
{
243+
Config: `
244+
resource "infoblox_ipv6_network" "foo"{
245+
network_view="default"
246+
cidr="2001:db8:abcd:12::/64"
247+
reserve_ipv6 = 11
248+
comment = "2001:db8:abcd:12::/64 network created"
249+
ext_attrs = jsonencode({
250+
"Tenant ID" = "terraform_test_tenant"
251+
"Network Name"= "demo-network"
252+
"Location" = "Test loc."
253+
"Site" = "Test site"
254+
})
255+
}`,
256+
ExpectError: updateNotAllowedErrorRegexp,
257+
},
258+
{
259+
Config: `
260+
resource "infoblox_ipv6_network" "foo"{
261+
network_view="default"
262+
cidr="2001:db8:abcd:12::/64"
263+
reserve_ipv6 = 11
264+
comment = "2001:db8:abcd:12::/64 network created"
265+
ext_attrs = jsonencode({
266+
"Tenant ID" = "terraform_test_tenant"
267+
"Network Name"= "demo-network"
268+
"Location" = "Test loc."
269+
"Site" = "Test site"
270+
})
271+
}`,
272+
ExpectError: updateNotAllowedErrorRegexp,
273+
},
173274
},
174275
})
175276
}

0 commit comments

Comments
 (0)