Skip to content

Commit c662cc7

Browse files
modular-magicianrileykarson
authored andcommitted
Terraform: allow deletion of default route upon network creation (#3391)
<!-- This change is generated by MagicModules. --> Original Author: @drebes
1 parent 0fc12ab commit c662cc7

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

google/resource_compute_network.go

+50
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ func resourceComputeNetwork() *schema.Resource {
7676
Type: schema.TypeString,
7777
Computed: true,
7878
},
79+
"delete_default_routes_on_create": {
80+
Type: schema.TypeBool,
81+
Optional: true,
82+
Default: false,
83+
},
7984
"project": {
8085
Type: schema.TypeString,
8186
Optional: true,
@@ -170,6 +175,35 @@ func resourceComputeNetworkCreate(d *schema.ResourceData, meta interface{}) erro
170175

171176
log.Printf("[DEBUG] Finished creating Network %q: %#v", d.Id(), res)
172177

178+
if d.Get("delete_default_routes_on_create").(bool) {
179+
token := ""
180+
for paginate := true; paginate; {
181+
networkLink := fmt.Sprintf("%s/%s", url, d.Get("name").(string))
182+
filter := fmt.Sprintf("(network=\"%s\") AND (destRange=\"0.0.0.0/0\")", networkLink)
183+
log.Printf("[DEBUG] Getting routes for network %q with filter '%q'", d.Get("name").(string), filter)
184+
resp, err := config.clientCompute.Routes.List(project).Filter(filter).Do()
185+
if err != nil {
186+
return fmt.Errorf("Error listing routes in proj: %s", err)
187+
}
188+
189+
log.Printf("[DEBUG] Found %d routes rules in %q network", len(resp.Items), d.Get("name").(string))
190+
191+
for _, route := range resp.Items {
192+
op, err := config.clientCompute.Routes.Delete(project, route.Name).Do()
193+
if err != nil {
194+
return fmt.Errorf("Error deleting route: %s", err)
195+
}
196+
err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting Route")
197+
if err != nil {
198+
return err
199+
}
200+
}
201+
202+
token = resp.NextPageToken
203+
paginate = token != ""
204+
}
205+
}
206+
173207
return resourceComputeNetworkRead(d, meta)
174208
}
175209

@@ -186,6 +220,11 @@ func resourceComputeNetworkRead(d *schema.ResourceData, meta interface{}) error
186220
return handleNotFoundError(err, d, fmt.Sprintf("ComputeNetwork %q", d.Id()))
187221
}
188222

223+
res, err = resourceComputeNetworkDecoder(d, meta, res)
224+
if err != nil {
225+
return err
226+
}
227+
189228
project, err := getProject(d, config)
190229
if err != nil {
191230
return err
@@ -321,6 +360,9 @@ func resourceComputeNetworkImport(d *schema.ResourceData, meta interface{}) ([]*
321360
return nil, fmt.Errorf("Error constructing id: %s", err)
322361
}
323362
d.SetId(id)
363+
// Explicitly set to default as a workaround for `ImportStateVerify` tests, and so that users
364+
// don't see a diff immediately after import.
365+
d.Set("delete_default_routes_on_create", false)
324366

325367
return []*schema.ResourceData{d}, nil
326368
}
@@ -389,3 +431,11 @@ func resourceComputeNetworkEncoder(d *schema.ResourceData, meta interface{}, obj
389431

390432
return obj, nil
391433
}
434+
435+
func resourceComputeNetworkDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
436+
// Explicitly set to default if not set
437+
if _, ok := d.GetOk("delete_default_routes_on_create"); !ok {
438+
d.Set("delete_default_routes_on_create", false)
439+
}
440+
return res, nil
441+
}

google/resource_compute_network_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,21 @@ func TestAccComputeNetwork_default_routing_mode(t *testing.T) {
150150
})
151151
}
152152

153+
func TestAccComputeNetwork_networkDeleteDefaultRoute(t *testing.T) {
154+
t.Parallel()
155+
156+
resource.Test(t, resource.TestCase{
157+
PreCheck: func() { testAccPreCheck(t) },
158+
Providers: testAccProviders,
159+
CheckDestroy: testAccCheckComputeNetworkDestroy,
160+
Steps: []resource.TestStep{
161+
{
162+
Config: testAccComputeNetwork_deleteDefaultRoute(),
163+
},
164+
},
165+
})
166+
}
167+
153168
func testAccCheckComputeNetworkExists(n string, network *compute.Network) resource.TestCheckFunc {
154169
return func(s *terraform.State) error {
155170
rs, ok := s.RootModule().Resources[n]
@@ -284,3 +299,12 @@ resource "google_compute_network" "acc_network_routing_mode" {
284299
routing_mode = "%s"
285300
}`, network, routingMode)
286301
}
302+
303+
func testAccComputeNetwork_deleteDefaultRoute() string {
304+
return fmt.Sprintf(`
305+
resource "google_compute_network" "bar" {
306+
name = "network-test-%s"
307+
delete_default_routes_on_create = true
308+
auto_create_subnetworks = false
309+
}`, acctest.RandString(10))
310+
}

website/docs/r/compute_network.html.markdown

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ The following arguments are supported:
9797
If it is not provided, the provider project is used.
9898

9999

100+
* `delete_default_routes_on_create`: If set to `true`, default routes (`0.0.0.0/0`) will be deleted
101+
immediately after network creation. Defaults to `false`.
102+
100103
## Attributes Reference
101104

102105
In addition to the arguments listed above, the following computed attributes are exported:

0 commit comments

Comments
 (0)