Terraform: allow deletion of default route upon network creation (#3391)

<!-- This change is generated by MagicModules. -->
Original Author: @drebes
This commit is contained in:
The Magician 2019-04-05 15:17:23 -07:00 committed by Riley Karson
parent 0fc12ab85d
commit c662cc75ba
3 changed files with 77 additions and 0 deletions

View File

@ -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
}

View File

@ -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))
}

View File

@ -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: