Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update google_compute_router_interface import, acctest, docs #14356

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/7758.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
compute: fixed an import bug for `google_compute_router_interface` that happened when project was not set in the provider configuration or via environment variable
```
42 changes: 29 additions & 13 deletions google/resource_compute_router_interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -366,19 +366,35 @@ func resourceComputeRouterInterfaceDelete(d *schema.ResourceData, meta interface

func resourceComputeRouterInterfaceImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
parts := strings.Split(d.Id(), "/")
if len(parts) != 3 {
return nil, fmt.Errorf("Invalid router interface specifier. Expecting {region}/{router}/{interface}")
}

if err := d.Set("region", parts[0]); err != nil {
return nil, fmt.Errorf("Error setting region: %s", err)
}
if err := d.Set("router", parts[1]); err != nil {
return nil, fmt.Errorf("Error setting router: %s", err)
}
if err := d.Set("name", parts[2]); err != nil {
return nil, fmt.Errorf("Error setting name: %s", err)
switch len(parts) {
case 3:
// {{region}}/{{router}}/{{name}} import id
if err := d.Set("region", parts[0]); err != nil {
return nil, fmt.Errorf("error setting region: %s", err)
}
if err := d.Set("router", parts[1]); err != nil {
return nil, fmt.Errorf("error setting router: %s", err)
}
if err := d.Set("name", parts[2]); err != nil {
return nil, fmt.Errorf("error setting name: %s", err)
}
return []*schema.ResourceData{d}, nil
case 4:
// {{project}}/{{region}}/{{router}}/{{name}} import id
if err := d.Set("project", parts[0]); err != nil {
return nil, fmt.Errorf("error setting project: %s", err)
}
if err := d.Set("region", parts[1]); err != nil {
return nil, fmt.Errorf("error setting region: %s", err)
}
if err := d.Set("router", parts[2]); err != nil {
return nil, fmt.Errorf("error setting router: %s", err)
}
if err := d.Set("name", parts[3]); err != nil {
return nil, fmt.Errorf("error setting name: %s", err)
}
return []*schema.ResourceData{d}, nil
}

return []*schema.ResourceData{d}, nil
return nil, fmt.Errorf("invalid router interface specifier. Expecting either {region}/{router}/{interface} or {project}/{region}/{router}/{interface} import id format")
}
44 changes: 28 additions & 16 deletions google/resource_compute_router_interface_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,36 @@ import (
func TestAccComputeRouterInterface_basic(t *testing.T) {
t.Parallel()

routerName := fmt.Sprintf("tf-test-router-%s", RandString(t, 10))
name := fmt.Sprintf("tf-test-router-%s", RandString(t, 10))
context := map[string]interface{}{
"name": name,
"region": "us-central1",
}
importIdFourPart := fmt.Sprintf("%s/%s/%s/%s", GetTestProjectFromEnv(), context["region"], context["name"], context["name"]) // name reused in config

VcrTest(t, resource.TestCase{
PreCheck: func() { AccTestPreCheck(t) },
ProtoV5ProviderFactories: ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckComputeRouterInterfaceDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccComputeRouterInterfaceBasic(routerName),
Config: testAccComputeRouterInterfaceBasic(context),
Check: testAccCheckComputeRouterInterfaceExists(
t, "google_compute_router_interface.foobar"),
},
{
ResourceName: "google_compute_router_interface.foobar",
ImportState: true, // Will use the 3 part {{region}}/{{router}}/{{name}} import id by default as it's the id in state
ImportStateVerify: true,
},
{
ResourceName: "google_compute_router_interface.foobar",
ImportState: true,
ImportStateId: importIdFourPart, // Make test step use 4 part {{project}}/{{region}}/{{router}}/{{name}} import id
ImportStateVerify: true,
},
{
Config: testAccComputeRouterInterfaceKeepRouter(routerName),
Config: testAccComputeRouterInterfaceKeepRouter(name),
Check: testAccCheckComputeRouterInterfaceDelete(
t, "google_compute_router_interface.foobar"),
},
Expand Down Expand Up @@ -227,40 +239,40 @@ func testAccCheckComputeRouterInterfaceExists(t *testing.T, n string) resource.T
}
}

func testAccComputeRouterInterfaceBasic(routerName string) string {
return fmt.Sprintf(`
func testAccComputeRouterInterfaceBasic(context map[string]interface{}) string {
return Nprintf(`
resource "google_compute_network" "foobar" {
name = "%s-net"
name = "%{name}-net"
}

resource "google_compute_subnetwork" "foobar" {
name = "%s-subnet"
name = "%{name}-subnet"
network = google_compute_network.foobar.self_link
ip_cidr_range = "10.0.0.0/16"
region = "us-central1"
region = "%{region}"
}

resource "google_compute_address" "foobar" {
name = "%s-addr"
name = "%{name}-addr"
region = google_compute_subnetwork.foobar.region
}

resource "google_compute_vpn_gateway" "foobar" {
name = "%s-gateway"
name = "%{name}-gateway"
network = google_compute_network.foobar.self_link
region = google_compute_subnetwork.foobar.region
}

resource "google_compute_forwarding_rule" "foobar_esp" {
name = "%s-fr1"
name = "%{name}-fr1"
region = google_compute_vpn_gateway.foobar.region
ip_protocol = "ESP"
ip_address = google_compute_address.foobar.address
target = google_compute_vpn_gateway.foobar.self_link
}

resource "google_compute_forwarding_rule" "foobar_udp500" {
name = "%s-fr2"
name = "%{name}-fr2"
region = google_compute_forwarding_rule.foobar_esp.region
ip_protocol = "UDP"
port_range = "500-500"
Expand All @@ -269,7 +281,7 @@ resource "google_compute_forwarding_rule" "foobar_udp500" {
}

resource "google_compute_forwarding_rule" "foobar_udp4500" {
name = "%s-fr3"
name = "%{name}-fr3"
region = google_compute_forwarding_rule.foobar_udp500.region
ip_protocol = "UDP"
port_range = "4500-4500"
Expand All @@ -278,7 +290,7 @@ resource "google_compute_forwarding_rule" "foobar_udp4500" {
}

resource "google_compute_router" "foobar" {
name = "%s"
name = "%{name}"
region = google_compute_forwarding_rule.foobar_udp500.region
network = google_compute_network.foobar.self_link
bgp {
Expand All @@ -287,12 +299,12 @@ resource "google_compute_router" "foobar" {
}

resource "google_compute_router_interface" "foobar" {
name = "%s"
name = "%{name}"
router = google_compute_router.foobar.name
region = google_compute_router.foobar.region
ip_range = "169.254.3.1/30"
}
`, routerName, routerName, routerName, routerName, routerName, routerName, routerName, routerName, routerName)
`, context)
}

func testAccComputeRouterInterfaceRedundant(routerName string) string {
Expand Down
3 changes: 2 additions & 1 deletion website/docs/r/compute_router_interface.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,9 @@ This resource provides the following

## Import

Router interfaces can be imported using the `region`, `router`, and `name`, e.g.
Router interfaces can be imported using the `project` (optional), `region`, `router`, and `name`, e.g.

```
$ terraform import google_compute_router_interface.foobar my-project/us-central1/router-1/interface-1
$ terraform import google_compute_router_interface.foobar us-central1/router-1/interface-1
```