Fix auto-delete default network in google_project. (#1336)

* Use projectId and enable required compute API

* Delete firewall rules before deleting default network
This commit is contained in:
Vincent Roseberry 2018-04-16 10:25:49 -07:00 committed by GitHub
parent 59697c6f6b
commit 49191c5d91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 12 deletions

View File

@ -195,9 +195,12 @@ func resourceComputeNetworkDelete(d *schema.ResourceData, meta interface{}) erro
return err return err
} }
// Delete the network return deleteComputeNetwork(project, d.Id(), config)
}
func deleteComputeNetwork(project, network string, config *Config) error {
op, err := config.clientCompute.Networks.Delete( op, err := config.clientCompute.Networks.Delete(
project, d.Id()).Do() project, network).Do()
if err != nil { if err != nil {
return fmt.Errorf("Error deleting network: %s", err) return fmt.Errorf("Error deleting network: %s", err)
} }
@ -206,7 +209,5 @@ func resourceComputeNetworkDelete(d *schema.ResourceData, meta interface{}) erro
if err != nil { if err != nil {
return err return err
} }
d.SetId("")
return nil return nil
} }

View File

@ -151,15 +151,13 @@ func resourceGoogleProjectCreate(d *schema.ResourceData, meta interface{}) error
// people if we don't have to. The GCP Console is doing the same thing - creating // people if we don't have to. The GCP Console is doing the same thing - creating
// a network and deleting it in the background. // a network and deleting it in the background.
if !d.Get("auto_create_network").(bool) { if !d.Get("auto_create_network").(bool) {
op, err := config.clientCompute.Networks.Delete( // The compute API has to be enabled before we can delete a network.
project.Name, "default").Do() if err = enableService("compute.googleapis.com", project.ProjectId, config); err != nil {
if err != nil { return fmt.Errorf("Error enabling the Compute Engine API required to delete the default network: %s", err)
return fmt.Errorf("Error deleting network: %s", err)
} }
err = computeOperationWaitTime(config.clientCompute, op, project.Name, "Deleting Network", 10) if err = forceDeleteComputeNetwork(project.ProjectId, "default", config); err != nil {
if err != nil { return fmt.Errorf("Error deleting default network in project %s: %s", project.ProjectId, err)
return err
} }
} }
return nil return nil
@ -343,3 +341,35 @@ func resourceProjectImportState(d *schema.ResourceData, meta interface{}) ([]*sc
d.Set("auto_create_network", true) d.Set("auto_create_network", true)
return []*schema.ResourceData{d}, nil return []*schema.ResourceData{d}, nil
} }
// Delete a compute network along with the firewall rules inside it.
func forceDeleteComputeNetwork(projectId, networkName string, config *Config) error {
networkLink := fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/global/networks/%s", projectId, networkName)
token := ""
for paginate := true; paginate; {
filter := fmt.Sprintf("network eq %s", networkLink)
resp, err := config.clientCompute.Firewalls.List(projectId).Filter(filter).Do()
if err != nil {
return fmt.Errorf("Error listing firewall rules in proj: %s", err)
}
log.Printf("[DEBUG] Found %d firewall rules in %q network", len(resp.Items), networkName)
for _, firewall := range resp.Items {
op, err := config.clientCompute.Firewalls.Delete(projectId, firewall.Name).Do()
if err != nil {
return fmt.Errorf("Error deleting firewall: %s", err)
}
err = computeSharedOperationWait(config.clientCompute, op, projectId, "Deleting Firewall")
if err != nil {
return err
}
}
token = resp.NextPageToken
paginate = token != ""
}
return deleteComputeNetwork(projectId, networkName, config)
}

View File

@ -153,6 +153,23 @@ func TestAccProject_labels(t *testing.T) {
}) })
} }
func TestAccProject_deleteDefaultNetwork(t *testing.T) {
t.Parallel()
org := getTestOrgFromEnv(t)
pid := "terraform-" + acctest.RandString(10)
billingId := getTestBillingAccountFromEnv(t)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccProject_deleteDefaultNetwork(pid, pname, org, billingId),
},
},
})
}
func testAccCheckGoogleProjectExists(r, pid string) resource.TestCheckFunc { func testAccCheckGoogleProjectExists(r, pid string) resource.TestCheckFunc {
return func(s *terraform.State) error { return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[r] rs, ok := s.RootModule().Resources[r]
@ -286,6 +303,17 @@ resource "google_project" "acceptance" {
return r + l return r + l
} }
func testAccProject_deleteDefaultNetwork(pid, name, org, billing string) string {
return fmt.Sprintf(`
resource "google_project" "acceptance" {
project_id = "%s"
name = "%s"
org_id = "%s"
billing_account = "%s" # requires billing to enable compute API
auto_create_network = false
}`, pid, name, org, billing)
}
func skipIfEnvNotSet(t *testing.T, envs ...string) { func skipIfEnvNotSet(t *testing.T, envs ...string) {
for _, k := range envs { for _, k := range envs {
if os.Getenv(k) == "" { if os.Getenv(k) == "" {

View File

@ -100,7 +100,8 @@ The following arguments are supported:
* `auto_create_network` - (Optional) Create the 'default' network automatically. Default true. * `auto_create_network` - (Optional) Create the 'default' network automatically. Default true.
Note: this might be more accurately described as "Delete Default Network", since the network Note: this might be more accurately described as "Delete Default Network", since the network
is created automatically then deleted before project creation returns, but we choose this is created automatically then deleted before project creation returns, but we choose this
name to match the GCP Console UI. name to match the GCP Console UI. Setting this field to false will enable the Compute Engine
API which is required to delete the network.
## Attributes Reference ## Attributes Reference