Skip to content

Commit 3bb9312

Browse files
pmcatomineystack72
authored andcommitted
provider/azurerm: support import of routes, fix route_table (hashicorp#10389)
* provider/azurerm: support import of route TF_ACC=1 go test ./builtin/providers/azurerm -v -run TestAccAzureRMRoute_import -timeout 120m === RUN TestAccAzureRMRoute_importBasic --- PASS: TestAccAzureRMRoute_importBasic (166.99s) PASS ok github.com/hashicorp/terraform/builtin/providers/azurerm 167.066s * provider/azurerm: fix route_table not setting routes The resource wasn't actually setting the routes in the create/update method, this went unnoticed as it also didn't read the routes array back to state. Fixes hashicorp#10316 TF_ACC=1 go test ./builtin/providers/azurerm -v -run TestAccAzureRMRouteTable -timeout 120m === RUN TestAccAzureRMRouteTable_basic --- PASS: TestAccAzureRMRouteTable_basic (122.96s) === RUN TestAccAzureRMRouteTable_disappears --- PASS: TestAccAzureRMRouteTable_disappears (121.12s) === RUN TestAccAzureRMRouteTable_withTags --- PASS: TestAccAzureRMRouteTable_withTags (136.01s) === RUN TestAccAzureRMRouteTable_multipleRoutes --- PASS: TestAccAzureRMRouteTable_multipleRoutes (155.44s) PASS ok github.com/hashicorp/terraform/builtin/providers/azurerm 535.612s * provider/azurerm: support import of route_table TF_ACC=1 go test ./builtin/providers/azurerm -v -run TestAccAzureRMRouteTable_import -timeout 120m === RUN TestAccAzureRMRouteTable_importBasic --- PASS: TestAccAzureRMRouteTable_importBasic (121.90s) PASS ok github.com/hashicorp/terraform/builtin/providers/azurerm 121.978s
1 parent 5cda81a commit 3bb9312

7 files changed

Lines changed: 149 additions & 27 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package azurerm
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/acctest"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
)
10+
11+
func TestAccAzureRMRouteTable_importBasic(t *testing.T) {
12+
resourceName := "azurerm_route_table.test"
13+
14+
ri := acctest.RandInt()
15+
config := fmt.Sprintf(testAccAzureRMRouteTable_basic, ri, ri)
16+
17+
resource.Test(t, resource.TestCase{
18+
PreCheck: func() { testAccPreCheck(t) },
19+
Providers: testAccProviders,
20+
CheckDestroy: testCheckAzureRMRouteTableDestroy,
21+
Steps: []resource.TestStep{
22+
resource.TestStep{
23+
Config: config,
24+
},
25+
26+
resource.TestStep{
27+
ResourceName: resourceName,
28+
ImportState: true,
29+
ImportStateVerify: true,
30+
},
31+
},
32+
})
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package azurerm
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/acctest"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
)
10+
11+
func TestAccAzureRMRoute_importBasic(t *testing.T) {
12+
resourceName := "azurerm_route.test"
13+
14+
ri := acctest.RandInt()
15+
config := fmt.Sprintf(testAccAzureRMRoute_basic, ri, ri, ri)
16+
17+
resource.Test(t, resource.TestCase{
18+
PreCheck: func() { testAccPreCheck(t) },
19+
Providers: testAccProviders,
20+
CheckDestroy: testCheckAzureRMRouteDestroy,
21+
Steps: []resource.TestStep{
22+
resource.TestStep{
23+
Config: config,
24+
},
25+
26+
resource.TestStep{
27+
ResourceName: resourceName,
28+
ImportState: true,
29+
ImportStateVerify: true,
30+
},
31+
},
32+
})
33+
}

builtin/providers/azurerm/resource_arm_route.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package azurerm
33
import (
44
"fmt"
55
"net/http"
6+
"strings"
67

78
"github.com/Azure/azure-sdk-for-go/arm/network"
89
"github.com/hashicorp/terraform/helper/schema"
@@ -14,6 +15,9 @@ func resourceArmRoute() *schema.Resource {
1415
Read: resourceArmRouteRead,
1516
Update: resourceArmRouteCreate,
1617
Delete: resourceArmRouteDelete,
18+
Importer: &schema.ResourceImporter{
19+
State: schema.ImportStatePassthrough,
20+
},
1721

1822
Schema: map[string]*schema.Schema{
1923
"name": {
@@ -43,6 +47,9 @@ func resourceArmRoute() *schema.Resource {
4347
Type: schema.TypeString,
4448
Required: true,
4549
ValidateFunc: validateRouteTableNextHopType,
50+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
51+
return strings.ToLower(old) == strings.ToLower(new)
52+
},
4653
},
4754

4855
"next_hop_in_ip_address": {
@@ -120,6 +127,16 @@ func resourceArmRouteRead(d *schema.ResourceData, meta interface{}) error {
120127
return fmt.Errorf("Error making Read request on Azure Route %s: %s", routeName, err)
121128
}
122129

130+
d.Set("name", routeName)
131+
d.Set("resource_group_name", resGroup)
132+
d.Set("route_table_name", rtName)
133+
d.Set("address_prefix", resp.Properties.AddressPrefix)
134+
d.Set("next_hop_type", string(resp.Properties.NextHopType))
135+
136+
if resp.Properties.NextHopIPAddress != nil {
137+
d.Set("next_hop_in_ip_address", resp.Properties.NextHopIPAddress)
138+
}
139+
123140
return nil
124141
}
125142

builtin/providers/azurerm/resource_arm_route_table.go

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ func resourceArmRouteTable() *schema.Resource {
1818
Read: resourceArmRouteTableRead,
1919
Update: resourceArmRouteTableCreate,
2020
Delete: resourceArmRouteTableDelete,
21+
Importer: &schema.ResourceImporter{
22+
State: schema.ImportStatePassthrough,
23+
},
2124

2225
Schema: map[string]*schema.Schema{
2326
"name": {
@@ -73,7 +76,6 @@ func resourceArmRouteTable() *schema.Resource {
7376

7477
"subnets": {
7578
Type: schema.TypeSet,
76-
Optional: true,
7779
Computed: true,
7880
Elem: &schema.Schema{Type: schema.TypeString},
7981
Set: schema.HashString,
@@ -102,15 +104,16 @@ func resourceArmRouteTableCreate(d *schema.ResourceData, meta interface{}) error
102104
}
103105

104106
if _, ok := d.GetOk("route"); ok {
105-
properties := network.RouteTablePropertiesFormat{}
106107
routes, routeErr := expandAzureRmRouteTableRoutes(d)
107108
if routeErr != nil {
108109
return fmt.Errorf("Error Building list of Route Table Routes: %s", routeErr)
109110
}
111+
110112
if len(routes) > 0 {
111-
routeSet.Properties = &properties
113+
routeSet.Properties = &network.RouteTablePropertiesFormat{
114+
Routes: &routes,
115+
}
112116
}
113-
114117
}
115118

116119
_, err := routeTablesClient.CreateOrUpdate(resGroup, name, routeSet, make(chan struct{}))
@@ -150,19 +153,22 @@ func resourceArmRouteTableRead(d *schema.ResourceData, meta interface{}) error {
150153
return fmt.Errorf("Error making Read request on Azure Route Table %s: %s", name, err)
151154
}
152155

153-
if resp.Properties.Subnets != nil {
154-
if len(*resp.Properties.Subnets) > 0 {
155-
subnets := make([]string, 0, len(*resp.Properties.Subnets))
156-
for _, subnet := range *resp.Properties.Subnets {
157-
id := subnet.ID
158-
subnets = append(subnets, *id)
159-
}
156+
d.Set("name", name)
157+
d.Set("resource_group_name", resGroup)
158+
d.Set("location", resp.Location)
160159

161-
if err := d.Set("subnets", subnets); err != nil {
162-
return err
163-
}
160+
if resp.Properties.Routes != nil {
161+
d.Set("route", schema.NewSet(resourceArmRouteTableRouteHash, flattenAzureRmRouteTableRoutes(resp.Properties.Routes)))
162+
}
163+
164+
subnets := []string{}
165+
if resp.Properties.Subnets != nil {
166+
for _, subnet := range *resp.Properties.Subnets {
167+
id := subnet.ID
168+
subnets = append(subnets, *id)
164169
}
165170
}
171+
d.Set("subnets", subnets)
166172

167173
flattenAndSetTags(d, resp.Tags)
168174

@@ -215,12 +221,29 @@ func expandAzureRmRouteTableRoutes(d *schema.ResourceData) ([]network.Route, err
215221
return routes, nil
216222
}
217223

224+
func flattenAzureRmRouteTableRoutes(routes *[]network.Route) []interface{} {
225+
results := make([]interface{}, 0, len(*routes))
226+
227+
for _, route := range *routes {
228+
r := make(map[string]interface{})
229+
r["name"] = *route.Name
230+
r["address_prefix"] = *route.Properties.AddressPrefix
231+
r["next_hop_type"] = string(route.Properties.NextHopType)
232+
if route.Properties.NextHopIPAddress != nil {
233+
r["next_hop_in_ip_address"] = *route.Properties.NextHopIPAddress
234+
}
235+
results = append(results, r)
236+
}
237+
238+
return results
239+
}
240+
218241
func resourceArmRouteTableRouteHash(v interface{}) int {
219242
var buf bytes.Buffer
220243
m := v.(map[string]interface{})
221244
buf.WriteString(fmt.Sprintf("%s-", m["name"].(string)))
222245
buf.WriteString(fmt.Sprintf("%s-", m["address_prefix"].(string)))
223-
buf.WriteString(fmt.Sprintf("%s-", m["next_hop_type"].(string)))
246+
buf.WriteString(fmt.Sprintf("%s-", strings.ToLower(m["next_hop_type"].(string))))
224247

225248
return hashcode.String(buf.String())
226249
}

builtin/providers/azurerm/resource_arm_route_table_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,8 @@ resource "azurerm_route_table" "test" {
262262
263263
route {
264264
name = "route1"
265-
address_prefix = "*"
266-
next_hop_type = "internet"
265+
address_prefix = "10.1.0.0/16"
266+
next_hop_type = "vnetlocal"
267267
}
268268
}
269269
`
@@ -281,14 +281,14 @@ resource "azurerm_route_table" "test" {
281281
282282
route {
283283
name = "route1"
284-
address_prefix = "*"
285-
next_hop_type = "internet"
284+
address_prefix = "10.1.0.0/16"
285+
next_hop_type = "vnetlocal"
286286
}
287287
288288
route {
289289
name = "route2"
290-
address_prefix = "*"
291-
next_hop_type = "virtualappliance"
290+
address_prefix = "10.2.0.0/16"
291+
next_hop_type = "vnetlocal"
292292
}
293293
}
294294
`
@@ -306,8 +306,8 @@ resource "azurerm_route_table" "test" {
306306
307307
route {
308308
name = "route1"
309-
address_prefix = "*"
310-
next_hop_type = "internet"
309+
address_prefix = "10.1.0.0/16"
310+
next_hop_type = "vnetlocal"
311311
}
312312
313313
tags {
@@ -330,8 +330,8 @@ resource "azurerm_route_table" "test" {
330330
331331
route {
332332
name = "route1"
333-
address_prefix = "*"
334-
next_hop_type = "internet"
333+
address_prefix = "10.1.0.0/16"
334+
next_hop_type = "vnetlocal"
335335
}
336336
337337
tags {

website/source/docs/providers/azurerm/r/route.html.markdown

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,11 @@ The following arguments are supported:
5959
The following attributes are exported:
6060

6161
* `id` - The Route ID.
62+
63+
## Import
64+
65+
66+
Routes can be imported using the `resource id`, e.g.
67+
```
68+
terraform import azurerm_route.testRoute /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Network/routeTables/mytable1/routes/myroute1
69+
```

website/source/docs/providers/azurerm/r/route_table.html.markdown

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ resource "azurerm_route_table" "test" {
2525
2626
route {
2727
name = "route1"
28-
address_prefix = "*"
29-
next_hop_type = "internet"
28+
address_prefix = "10.1.0.0/16"
29+
next_hop_type = "vnetlocal"
3030
}
3131
3232
tags {
@@ -69,3 +69,11 @@ The following attributes are exported:
6969

7070
* `id` - The Route Table ID.
7171
* `subnets` - The collection of Subnets associated with this route table.
72+
73+
## Import
74+
75+
76+
Route Tables can be imported using the `resource id`, e.g.
77+
```
78+
terraform import azurerm_route_table.test /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Network/routeTables/mytable1
79+
```

0 commit comments

Comments
 (0)