diff --git a/google/resource_compute_network.go b/google/resource_compute_network.go index 69ba3e86..e62c97d6 100644 --- a/google/resource_compute_network.go +++ b/google/resource_compute_network.go @@ -76,6 +76,11 @@ func resourceComputeNetwork() *schema.Resource { Type: schema.TypeString, Computed: true, }, + "delete_default_routes_on_create": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, "project": { Type: schema.TypeString, Optional: true, @@ -170,6 +175,35 @@ func resourceComputeNetworkCreate(d *schema.ResourceData, meta interface{}) erro log.Printf("[DEBUG] Finished creating Network %q: %#v", d.Id(), res) + if d.Get("delete_default_routes_on_create").(bool) { + token := "" + for paginate := true; paginate; { + networkLink := fmt.Sprintf("%s/%s", url, d.Get("name").(string)) + filter := fmt.Sprintf("(network=\"%s\") AND (destRange=\"0.0.0.0/0\")", networkLink) + log.Printf("[DEBUG] Getting routes for network %q with filter '%q'", d.Get("name").(string), filter) + resp, err := config.clientCompute.Routes.List(project).Filter(filter).Do() + if err != nil { + return fmt.Errorf("Error listing routes in proj: %s", err) + } + + log.Printf("[DEBUG] Found %d routes rules in %q network", len(resp.Items), d.Get("name").(string)) + + for _, route := range resp.Items { + op, err := config.clientCompute.Routes.Delete(project, route.Name).Do() + if err != nil { + return fmt.Errorf("Error deleting route: %s", err) + } + err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting Route") + if err != nil { + return err + } + } + + token = resp.NextPageToken + paginate = token != "" + } + } + return resourceComputeNetworkRead(d, meta) } @@ -186,6 +220,11 @@ func resourceComputeNetworkRead(d *schema.ResourceData, meta interface{}) error return handleNotFoundError(err, d, fmt.Sprintf("ComputeNetwork %q", d.Id())) } + res, err = resourceComputeNetworkDecoder(d, meta, res) + if err != nil { + return err + } + project, err := getProject(d, config) if err != nil { return err @@ -321,6 +360,9 @@ func resourceComputeNetworkImport(d *schema.ResourceData, meta interface{}) ([]* return nil, fmt.Errorf("Error constructing id: %s", err) } d.SetId(id) + // Explicitly set to default as a workaround for `ImportStateVerify` tests, and so that users + // don't see a diff immediately after import. + d.Set("delete_default_routes_on_create", false) return []*schema.ResourceData{d}, nil } @@ -389,3 +431,11 @@ func resourceComputeNetworkEncoder(d *schema.ResourceData, meta interface{}, obj return obj, nil } + +func resourceComputeNetworkDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) { + // Explicitly set to default if not set + if _, ok := d.GetOk("delete_default_routes_on_create"); !ok { + d.Set("delete_default_routes_on_create", false) + } + return res, nil +} diff --git a/google/resource_compute_network_test.go b/google/resource_compute_network_test.go index 2b2e96d3..71942bae 100644 --- a/google/resource_compute_network_test.go +++ b/google/resource_compute_network_test.go @@ -150,6 +150,21 @@ func TestAccComputeNetwork_default_routing_mode(t *testing.T) { }) } +func TestAccComputeNetwork_networkDeleteDefaultRoute(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeNetworkDestroy, + Steps: []resource.TestStep{ + { + Config: testAccComputeNetwork_deleteDefaultRoute(), + }, + }, + }) +} + func testAccCheckComputeNetworkExists(n string, network *compute.Network) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -284,3 +299,12 @@ resource "google_compute_network" "acc_network_routing_mode" { routing_mode = "%s" }`, network, routingMode) } + +func testAccComputeNetwork_deleteDefaultRoute() string { + return fmt.Sprintf(` +resource "google_compute_network" "bar" { + name = "network-test-%s" + delete_default_routes_on_create = true + auto_create_subnetworks = false +}`, acctest.RandString(10)) +} diff --git a/website/docs/r/compute_network.html.markdown b/website/docs/r/compute_network.html.markdown index 9c139d85..fe7819bd 100644 --- a/website/docs/r/compute_network.html.markdown +++ b/website/docs/r/compute_network.html.markdown @@ -97,6 +97,9 @@ The following arguments are supported: If it is not provided, the provider project is used. +* `delete_default_routes_on_create`: If set to `true`, default routes (`0.0.0.0/0`) will be deleted + immediately after network creation. Defaults to `false`. + ## Attributes Reference In addition to the arguments listed above, the following computed attributes are exported: