Skip to content

Commit

Permalink
Add azurerm_route_filter_rule for hashicorp#1083 broken
Browse files Browse the repository at this point in the history
  • Loading branch information
Christian Pearce committed Apr 2, 2020
1 parent 3c59d32 commit 59c58c3
Show file tree
Hide file tree
Showing 7 changed files with 641 additions and 0 deletions.
5 changes: 5 additions & 0 deletions azurerm/internal/services/network/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type Client struct {
PublicIPPrefixesClient *network.PublicIPPrefixesClient
RoutesClient *network.RoutesClient
RouteFiltersClient *network.RouteFiltersClient
RouteFilterRulesClient *network.RouteFilterRulesClient
RouteTablesClient *network.RouteTablesClient
SecurityGroupClient *network.SecurityGroupsClient
SecurityRuleClient *network.SecurityRulesClient
Expand Down Expand Up @@ -121,6 +122,9 @@ func NewClient(o *common.ClientOptions) *Client {
RouteFiltersClient := network.NewRouteFiltersClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&RouteFiltersClient.Client, o.ResourceManagerAuthorizer)

RouteFilterRulesClient := network.NewRouteFilterRulesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&RouteFilterRulesClient.Client, o.ResourceManagerAuthorizer)

RouteTablesClient := network.NewRouteTablesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&RouteTablesClient.Client, o.ResourceManagerAuthorizer)

Expand Down Expand Up @@ -179,6 +183,7 @@ func NewClient(o *common.ClientOptions) *Client {
PublicIPPrefixesClient: &PublicIPPrefixesClient,
RoutesClient: &RoutesClient,
RouteFiltersClient: &RouteFiltersClient,
RouteFilterRulesClient: &RouteFilterRulesClient,
RouteTablesClient: &RouteTablesClient,
SecurityGroupClient: &SecurityGroupClient,
SecurityRuleClient: &SecurityRuleClient,
Expand Down
58 changes: 58 additions & 0 deletions azurerm/internal/services/network/data_source_route_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"time"

"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
Expand Down Expand Up @@ -32,6 +33,37 @@ func dataSourceArmRouteFilter() *schema.Resource {

"location": azure.SchemaLocationForDataSource(),

"rules": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},

"access": {
Type: schema.TypeString,
Computed: true,
},

"rule_type": {
Type: schema.TypeString,
Computed: true,
},

"communities": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
},
},

"tags": tags.SchemaDataSource(),
},
}
Expand Down Expand Up @@ -60,6 +92,32 @@ func dataSourceArmRouteFilterRead(d *schema.ResourceData, meta interface{}) erro
if location := resp.Location; location != nil {
d.Set("location", azure.NormalizeLocation(*location))
}
if props := resp.RouteFilterPropertiesFormat; props != nil {
if err := d.Set("rules", flattenRouteFilterDataSourceRules(props.Rules)); err != nil {
return err
}
}

return tags.FlattenAndSet(d, resp.Tags)
}

func flattenRouteFilterDataSourceRules(input *[]network.RouteFilterRule) []interface{} {
results := make([]interface{}, 0)

if rules := input; rules != nil {
for _, rule := range *rules {
r := make(map[string]interface{})

r["name"] = *rule.Name
if props := rule.RouteFilterRulePropertiesFormat; props != nil {
r["access"] = string(props.Access)
r["rule_type"] = *props.RouteFilterRuleType
r["communities"] = utils.FlattenStringSlice(props.Communities)
}

results = append(results, r)
}
}

return results
}
1 change: 1 addition & 0 deletions azurerm/internal/services/network/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ func (r Registration) SupportedResources() map[string]*schema.Resource {
"azurerm_network_watcher_flow_log": resourceArmNetworkWatcherFlowLog(),
"azurerm_network_watcher": resourceArmNetworkWatcher(),
"azurerm_route_filter": resourceArmRouteFilter(),
"azurerm_route_filter_rule": resourceArmRouteFilterRule(),
"azurerm_route_table": resourceArmRouteTable(),
"azurerm_route": resourceArmRoute(),
"azurerm_subnet_network_security_group_association": resourceArmSubnetNetworkSecurityGroupAssociation(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import (
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

var routeFilterResourceName = "azurerm_route_filter"

func resourceArmRouteFilter() *schema.Resource {
return &schema.Resource{
Create: resourceArmRouteFilterCreateUpdate,
Expand Down
204 changes: 204 additions & 0 deletions azurerm/internal/services/network/resource_arm_route_filter_rule.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
package network

import (
"fmt"
"time"

"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-09-01/network"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func resourceArmRouteFilterRule() *schema.Resource {
return &schema.Resource{
Create: resourceArmRouteFilterRuleCreateUpdate,
Read: resourceArmRouteFilterRuleRead,
Update: resourceArmRouteFilterRuleCreateUpdate,
Delete: resourceArmRouteFilterRuleDelete,

Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(30 * time.Minute),
Read: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(30 * time.Minute),
Delete: schema.DefaultTimeout(30 * time.Minute),
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"resource_group_name": azure.SchemaResourceGroupName(),

"route_filter_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"access": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{
string(network.Allow),
string(network.Deny),
}, false),
},

"rule_type": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{
"Community",
}, false),
},

"communities": {
Type: schema.TypeList,
Required: true,
MinItems: 1,
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validation.StringIsNotEmpty,
},
},
},
}
}

func resourceArmRouteFilterRuleCreateUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Network.RouteFilterRulesClient
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

name := d.Get("name").(string)
rfName := d.Get("route_filter_name").(string)
resGroup := d.Get("resource_group_name").(string)

if features.ShouldResourcesBeImported() && d.IsNewResource() {
existing, err := client.Get(ctx, resGroup, rfName, name)
if err != nil {
if !utils.ResponseWasNotFound(existing.Response) {
return fmt.Errorf("Error checking for presence of existing Route Filter Rule %q (Route Filter %q / Resource Group %q): %+v", name, rfName, resGroup, err)
}
}

if existing.ID != nil && *existing.ID != "" {
return tf.ImportAsExistsError("azurerm_route_filter_rule", *existing.ID)
}
}

access := d.Get("access").(string)
ruleType := d.Get("rule_type").(string)
communities := utils.ExpandStringSlice(d.Get("communities").([]interface{}))

locks.ByName(rfName, routeFilterResourceName)
defer locks.UnlockByName(rfName, routeFilterResourceName)

rule := network.RouteFilterRule{
Name: &name,
RouteFilterRulePropertiesFormat: &network.RouteFilterRulePropertiesFormat{
Access: network.Access(access),
RouteFilterRuleType: &ruleType,
Communities: communities,
},
}

future, err := client.CreateOrUpdate(ctx, resGroup, rfName, name, rule)
if err != nil {
return fmt.Errorf("Error Creating/Updating Route Filter Rule %q (Route Filter %q / Resource Group %q): %+v", name, rfName, resGroup, err)
}

if err = future.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("Error waiting for completion for Route Filter Rule %q (Route Filter %q / Resource Group %q): %+v", name, rfName, resGroup, err)
}

read, err := client.Get(ctx, resGroup, rfName, name)
if err != nil {
return err
}
if read.ID == nil {
return fmt.Errorf("Cannot read Route Filter Rule %q (Route Filter %q / Resource Group %q) ID", rfName, name, resGroup)
}
d.SetId(*read.ID)

return resourceArmRouteFilterRuleRead(d, meta)
}

func resourceArmRouteFilterRuleRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Network.RouteFilterRulesClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := azure.ParseAzureResourceID(d.Id())
if err != nil {
return err
}
resGroup := id.ResourceGroup
rfName := id.Path["routeFilters"]
ruleName := id.Path["routeFilterRules"]

resp, err := client.Get(ctx, resGroup, rfName, ruleName)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
d.SetId("")
return nil
}
return fmt.Errorf("Error making Read request on Azure Route Filter Rule %q: %+v", ruleName, err)
}

d.Set("name", ruleName)
d.Set("resource_group_name", resGroup)
d.Set("route_filter_name", rfName)

if props := resp.RouteFilterRulePropertiesFormat; props != nil {
d.Set("access", string(props.Access))
d.Set("rule_type", props.RouteFilterRuleType)
d.Set("communities", utils.FlattenStringSlice(props.Communities))
}

return nil
}

func resourceArmRouteFilterRuleDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Network.RouteFilterRulesClient
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := azure.ParseAzureResourceID(d.Id())
if err != nil {
return err
}
resGroup := id.ResourceGroup
rfName := id.Path["routeFilters"]
ruleName := id.Path["routeFilterRules"]

locks.ByName(rfName, routeFilterResourceName)
defer locks.UnlockByName(rfName, routeFilterResourceName)

future, err := client.Delete(ctx, resGroup, rfName, ruleName)
if err != nil {
return fmt.Errorf("Error deleting Route Filter Rule %q (Route Filter %q / Resource Group %q): %+v", ruleName, rfName, resGroup, err)
}

if err = future.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("Error waiting for deletion of RouteFilterRule %q (RouteFilterRule Table %q / Resource Group %q): %+v", ruleName, rfName, resGroup, err)
}

return nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,29 @@ func TestAccDataSourceAzureRMRouteFilter_basic(t *testing.T) {
})
}

func TestAccDataSourceAzureRMRouteFilter_singleRule(t *testing.T) {
data := acceptance.BuildTestData(t, "data.azurerm_route_table", "test")

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acceptance.PreCheck(t) },
Providers: acceptance.SupportedProviders,
CheckDestroy: testCheckAzureRMRouteFilterDestroy,
Steps: []resource.TestStep{
{
Config: testAccDataSourceAzureRMRouteFilter_singleRule(data),
Check: resource.ComposeTestCheckFunc(
testCheckAzureRMRouteFilterExists(data.ResourceName),
resource.TestCheckResourceAttr(data.ResourceName, "rule.#", "1"),
resource.TestCheckResourceAttr(data.ResourceName, "rule.0.name", "rule1"),
resource.TestCheckResourceAttr(data.ResourceName, "rule.0.access", "Allow"),
resource.TestCheckResourceAttr(data.ResourceName, "rule.0.rule_type", "Community"),
resource.TestCheckResourceAttr(data.ResourceName, "rule.0.communities.0", "12076:53004"),
),
},
},
})
}

func testAccDataSourceAzureRMRouteFilter_basic(data acceptance.TestData) string {
r := testAccAzureRMRouteFilter_basic(data)
return fmt.Sprintf(`
Expand All @@ -38,3 +61,15 @@ data "azurerm_route_filter" "test" {
}
`, r)
}

func testAccDataSourceAzureRMRouteFilter_singleRule(data acceptance.TestData) string {
r := testAccAzureRMRouteFilterRule_basic(data)
return fmt.Sprintf(`
%s
data "azurerm_route_filter" "test" {
name = azurerm_route_filter.test.name
resource_group_name = azurerm_route_filter.test.resource_group_name
}
`, r)
}
Loading

0 comments on commit 59c58c3

Please sign in to comment.