diff --git a/builtin/providers/azurerm/resource_arm_network_interface_card.go b/builtin/providers/azurerm/resource_arm_network_interface_card.go index ddcc7a454..6b4797bf7 100644 --- a/builtin/providers/azurerm/resource_arm_network_interface_card.go +++ b/builtin/providers/azurerm/resource_arm_network_interface_card.go @@ -139,6 +139,8 @@ func resourceArmNetworkInterface() *schema.Resource { Optional: true, Computed: true, }, + + "tags": tagsSchema(), }, } } @@ -152,6 +154,7 @@ func resourceArmNetworkInterfaceCreate(d *schema.ResourceData, meta interface{}) name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) + tags := d.Get("tags").(map[string]interface{}) properties := network.InterfacePropertiesFormat{} @@ -198,6 +201,7 @@ func resourceArmNetworkInterfaceCreate(d *schema.ResourceData, meta interface{}) Name: &name, Location: &location, Properties: &properties, + Tags: expandTags(tags), } resp, err := ifaceClient.CreateOrUpdate(resGroup, name, iface) @@ -271,6 +275,8 @@ func resourceArmNetworkInterfaceRead(d *schema.ResourceData, meta interface{}) e } } + flattenAndSetTags(d, resp.Tags) + return nil } diff --git a/builtin/providers/azurerm/resource_arm_network_interface_card_test.go b/builtin/providers/azurerm/resource_arm_network_interface_card_test.go index 26db03ed5..893601013 100644 --- a/builtin/providers/azurerm/resource_arm_network_interface_card_test.go +++ b/builtin/providers/azurerm/resource_arm_network_interface_card_test.go @@ -26,6 +26,40 @@ func TestAccAzureRMNetworkInterface_basic(t *testing.T) { }) } +func TestAccAzureRMNetworkInterface_withTags(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMNetworkInterfaceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAzureRMNetworkInterface_withTags, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), + resource.TestCheckResourceAttr( + "azurerm_network_interface.test", "tags.#", "2"), + resource.TestCheckResourceAttr( + "azurerm_network_interface.test", "tags.environment", "Production"), + resource.TestCheckResourceAttr( + "azurerm_network_interface.test", "tags.cost_center", "MSFT"), + ), + }, + + resource.TestStep{ + Config: testAccAzureRMNetworkInterface_withTagsUpdate, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMNetworkInterfaceExists("azurerm_network_interface.test"), + resource.TestCheckResourceAttr( + "azurerm_network_interface.test", "tags.#", "1"), + resource.TestCheckResourceAttr( + "azurerm_network_interface.test", "tags.environment", "staging"), + ), + }, + }, + }) +} + ///TODO: Re-enable this test when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed //func TestAccAzureRMNetworkInterface_addingIpConfigurations(t *testing.T) { // @@ -142,6 +176,81 @@ resource "azurerm_network_interface" "test" { } ` +var testAccAzureRMNetworkInterface_withTags = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} + +resource "azurerm_virtual_network" "test" { + name = "acceptanceTestVirtualNetwork1" + address_space = ["10.0.0.0/16"] + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" +} + +resource "azurerm_subnet" "test" { + name = "testsubnet" + resource_group_name = "${azurerm_resource_group.test.name}" + virtual_network_name = "${azurerm_virtual_network.test.name}" + address_prefix = "10.0.2.0/24" +} + +resource "azurerm_network_interface" "test" { + name = "acceptanceTestNetworkInterface1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + + ip_configuration { + name = "testconfiguration1" + subnet_id = "${azurerm_subnet.test.id}" + private_ip_address_allocation = "dynamic" + } + + tags { + environment = "Production" + cost_center = "MSFT" + } +} +` + +var testAccAzureRMNetworkInterface_withTagsUpdate = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} + +resource "azurerm_virtual_network" "test" { + name = "acceptanceTestVirtualNetwork1" + address_space = ["10.0.0.0/16"] + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" +} + +resource "azurerm_subnet" "test" { + name = "testsubnet" + resource_group_name = "${azurerm_resource_group.test.name}" + virtual_network_name = "${azurerm_virtual_network.test.name}" + address_prefix = "10.0.2.0/24" +} + +resource "azurerm_network_interface" "test" { + name = "acceptanceTestNetworkInterface1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + + ip_configuration { + name = "testconfiguration1" + subnet_id = "${azurerm_subnet.test.id}" + private_ip_address_allocation = "dynamic" + } + + tags { + environment = "staging" + } +} +` + //TODO: Re-enable this test when https://github.com/Azure/azure-sdk-for-go/issues/259 is fixed //var testAccAzureRMNetworkInterface_extraIpConfiguration = ` //resource "azurerm_resource_group" "test" { diff --git a/builtin/providers/azurerm/resource_arm_network_security_group.go b/builtin/providers/azurerm/resource_arm_network_security_group.go index 6c7a836b4..cb885c834 100644 --- a/builtin/providers/azurerm/resource_arm_network_security_group.go +++ b/builtin/providers/azurerm/resource_arm_network_security_group.go @@ -118,6 +118,8 @@ func resourceArmNetworkSecurityGroup() *schema.Resource { }, Set: resourceArmNetworkSecurityGroupRuleHash, }, + + "tags": tagsSchema(), }, } } @@ -129,6 +131,7 @@ func resourceArmNetworkSecurityGroupCreate(d *schema.ResourceData, meta interfac name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) + tags := d.Get("tags").(map[string]interface{}) sgRules, sgErr := expandAzureRmSecurityRules(d) if sgErr != nil { @@ -141,6 +144,7 @@ func resourceArmNetworkSecurityGroupCreate(d *schema.ResourceData, meta interfac Properties: &network.SecurityGroupPropertiesFormat{ SecurityRules: &sgRules, }, + Tags: expandTags(tags), } resp, err := secClient.CreateOrUpdate(resGroup, name, sg) @@ -187,6 +191,8 @@ func resourceArmNetworkSecurityGroupRead(d *schema.ResourceData, meta interface{ d.Set("security_rule", flattenNetworkSecurityRules(resp.Properties.SecurityRules)) } + flattenAndSetTags(d, resp.Tags) + return nil } diff --git a/builtin/providers/azurerm/resource_arm_network_security_group_test.go b/builtin/providers/azurerm/resource_arm_network_security_group_test.go index 129176a7d..64c4f9944 100644 --- a/builtin/providers/azurerm/resource_arm_network_security_group_test.go +++ b/builtin/providers/azurerm/resource_arm_network_security_group_test.go @@ -26,6 +26,40 @@ func TestAccAzureRMNetworkSecurityGroup_basic(t *testing.T) { }) } +func TestAccAzureRMNetworkSecurityGroup_withTags(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMNetworkSecurityGroupDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAzureRMNetworkSecurityGroup_withTags, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), + resource.TestCheckResourceAttr( + "azurerm_network_security_group.test", "tags.#", "2"), + resource.TestCheckResourceAttr( + "azurerm_network_security_group.test", "tags.environment", "Production"), + resource.TestCheckResourceAttr( + "azurerm_network_security_group.test", "tags.cost_center", "MSFT"), + ), + }, + + resource.TestStep{ + Config: testAccAzureRMNetworkSecurityGroup_withTagsUpdate, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMNetworkSecurityGroupExists("azurerm_network_security_group.test"), + resource.TestCheckResourceAttr( + "azurerm_network_security_group.test", "tags.#", "1"), + resource.TestCheckResourceAttr( + "azurerm_network_security_group.test", "tags.environment", "staging"), + ), + }, + }, + }) +} + func TestAccAzureRMNetworkSecurityGroup_addingExtraRules(t *testing.T) { resource.Test(t, resource.TestCase{ @@ -169,3 +203,63 @@ resource "azurerm_network_security_group" "test" { } } ` + +var testAccAzureRMNetworkSecurityGroup_withTags = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} + +resource "azurerm_network_security_group" "test" { + name = "acceptanceTestSecurityGroup1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + + security_rule { + name = "test123" + priority = 100 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "*" + source_address_prefix = "*" + destination_address_prefix = "*" + } + + + tags { + environment = "Production" + cost_center = "MSFT" + } +} +` + +var testAccAzureRMNetworkSecurityGroup_withTagsUpdate = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} + +resource "azurerm_network_security_group" "test" { + name = "acceptanceTestSecurityGroup1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + + security_rule { + name = "test123" + priority = 100 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "*" + source_address_prefix = "*" + destination_address_prefix = "*" + } + + tags { + environment = "staging" + } +} +` diff --git a/builtin/providers/azurerm/resource_arm_public_ip.go b/builtin/providers/azurerm/resource_arm_public_ip.go index 0c5b03b26..6b47f4167 100644 --- a/builtin/providers/azurerm/resource_arm_public_ip.go +++ b/builtin/providers/azurerm/resource_arm_public_ip.go @@ -79,6 +79,8 @@ func resourceArmPublicIp() *schema.Resource { Type: schema.TypeString, Computed: true, }, + + "tags": tagsSchema(), }, } } @@ -92,6 +94,7 @@ func resourceArmPublicIpCreate(d *schema.ResourceData, meta interface{}) error { name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) + tags := d.Get("tags").(map[string]interface{}) properties := network.PublicIPAddressPropertiesFormat{ PublicIPAllocationMethod: network.IPAllocationMethod(d.Get("public_ip_address_allocation").(string)), @@ -126,6 +129,7 @@ func resourceArmPublicIpCreate(d *schema.ResourceData, meta interface{}) error { Name: &name, Location: &location, Properties: &properties, + Tags: expandTags(tags), } resp, err := publicIPClient.CreateOrUpdate(resGroup, name, publicIp) @@ -176,6 +180,8 @@ func resourceArmPublicIpRead(d *schema.ResourceData, meta interface{}) error { d.Set("ip_address", resp.Properties.IPAddress) } + flattenAndSetTags(d, resp.Tags) + return nil } diff --git a/builtin/providers/azurerm/resource_arm_public_ip_test.go b/builtin/providers/azurerm/resource_arm_public_ip_test.go index c1e66762f..36ee500a9 100644 --- a/builtin/providers/azurerm/resource_arm_public_ip_test.go +++ b/builtin/providers/azurerm/resource_arm_public_ip_test.go @@ -96,6 +96,40 @@ func TestAccAzureRMPublicIpStatic_basic(t *testing.T) { }) } +func TestAccAzureRMPublicIpStatic_withTags(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMPublicIpDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAzureRMVPublicIpStatic_withTags, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), + resource.TestCheckResourceAttr( + "azurerm_public_ip.test", "tags.#", "2"), + resource.TestCheckResourceAttr( + "azurerm_public_ip.test", "tags.environment", "Production"), + resource.TestCheckResourceAttr( + "azurerm_public_ip.test", "tags.cost_center", "MSFT"), + ), + }, + + resource.TestStep{ + Config: testAccAzureRMVPublicIpStatic_withTagsUpdate, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMPublicIpExists("azurerm_public_ip.test"), + resource.TestCheckResourceAttr( + "azurerm_public_ip.test", "tags.#", "1"), + resource.TestCheckResourceAttr( + "azurerm_public_ip.test", "tags.environment", "staging"), + ), + }, + }, + }) +} + func TestAccAzureRMPublicIpStatic_update(t *testing.T) { resource.Test(t, resource.TestCase{ @@ -242,3 +276,38 @@ resource "azurerm_public_ip" "test" { public_ip_address_allocation = "dynamic" } ` + +var testAccAzureRMVPublicIpStatic_withTags = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} +resource "azurerm_public_ip" "test" { + name = "acceptanceTestPublicIp1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + public_ip_address_allocation = "static" + + tags { + environment = "Production" + cost_center = "MSFT" + } +} +` + +var testAccAzureRMVPublicIpStatic_withTagsUpdate = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} +resource "azurerm_public_ip" "test" { + name = "acceptanceTestPublicIp1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + public_ip_address_allocation = "static" + + tags { + environment = "staging" + } +} +` diff --git a/builtin/providers/azurerm/resource_arm_route_table.go b/builtin/providers/azurerm/resource_arm_route_table.go index 615aaba72..616d6291e 100644 --- a/builtin/providers/azurerm/resource_arm_route_table.go +++ b/builtin/providers/azurerm/resource_arm_route_table.go @@ -80,6 +80,8 @@ func resourceArmRouteTable() *schema.Resource { Elem: &schema.Schema{Type: schema.TypeString}, Set: schema.HashString, }, + + "tags": tagsSchema(), }, } } @@ -93,10 +95,12 @@ func resourceArmRouteTableCreate(d *schema.ResourceData, meta interface{}) error name := d.Get("name").(string) location := d.Get("location").(string) resGroup := d.Get("resource_group_name").(string) + tags := d.Get("tags").(map[string]interface{}) routeSet := network.RouteTable{ Name: &name, Location: &location, + Tags: expandTags(tags), } if _, ok := d.GetOk("route"); ok { @@ -165,6 +169,8 @@ func resourceArmRouteTableRead(d *schema.ResourceData, meta interface{}) error { } } + flattenAndSetTags(d, resp.Tags) + return nil } diff --git a/builtin/providers/azurerm/resource_arm_route_table_test.go b/builtin/providers/azurerm/resource_arm_route_table_test.go index 1ec93602e..552dfd94f 100644 --- a/builtin/providers/azurerm/resource_arm_route_table_test.go +++ b/builtin/providers/azurerm/resource_arm_route_table_test.go @@ -74,6 +74,40 @@ func TestAccAzureRMRouteTable_basic(t *testing.T) { }) } +func TestAccAzureRMRouteTable_withTags(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMRouteTableDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAzureRMRouteTable_withTags, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMRouteTableExists("azurerm_route_table.test"), + resource.TestCheckResourceAttr( + "azurerm_route_table.test", "tags.#", "2"), + resource.TestCheckResourceAttr( + "azurerm_route_table.test", "tags.environment", "Production"), + resource.TestCheckResourceAttr( + "azurerm_route_table.test", "tags.cost_center", "MSFT"), + ), + }, + + resource.TestStep{ + Config: testAccAzureRMRouteTable_withTagsUpdate, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMRouteTableExists("azurerm_route_table.test"), + resource.TestCheckResourceAttr( + "azurerm_route_table.test", "tags.#", "1"), + resource.TestCheckResourceAttr( + "azurerm_route_table.test", "tags.environment", "staging"), + ), + }, + }, + }) +} + func TestAccAzureRMRouteTable_multipleRoutes(t *testing.T) { resource.Test(t, resource.TestCase{ @@ -199,3 +233,50 @@ resource "azurerm_route_table" "test" { } } ` + +var testAccAzureRMRouteTable_withTags = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} + +resource "azurerm_route_table" "test" { + name = "acceptanceTestSecurityGroup1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + + route { + name = "route1" + address_prefix = "*" + next_hop_type = "internet" + } + + tags { + environment = "Production" + cost_center = "MSFT" + } +} +` + +var testAccAzureRMRouteTable_withTagsUpdate = ` +resource "azurerm_resource_group" "test" { + name = "acceptanceTestResourceGroup1" + location = "West US" +} + +resource "azurerm_route_table" "test" { + name = "acceptanceTestSecurityGroup1" + location = "West US" + resource_group_name = "${azurerm_resource_group.test.name}" + + route { + name = "route1" + address_prefix = "*" + next_hop_type = "internet" + } + + tags { + environment = "staging" + } +} +` diff --git a/website/source/docs/providers/azurerm/r/network_interface.html.markdown b/website/source/docs/providers/azurerm/r/network_interface.html.markdown index ef392a288..5dfd4fc57 100644 --- a/website/source/docs/providers/azurerm/r/network_interface.html.markdown +++ b/website/source/docs/providers/azurerm/r/network_interface.html.markdown @@ -34,6 +34,10 @@ resource "azurerm_virtual_network" "test" { name = "subnet3" address_prefix = "10.0.3.0/24" } + + tags { + environment = "Production" + } } ``` @@ -59,6 +63,8 @@ The following arguments are supported: * `ip_configuration` - (Optional) Collection of ipConfigurations associated with this NIC. Each `ip_configuration` block supports fields documented below. +* `tags` - (Optional) A mapping of tags to assign to the resource. + The `ip_configuration` block supports: * `name` - (Required) User-defined name of the IP. diff --git a/website/source/docs/providers/azurerm/r/network_security_group.html.markdown b/website/source/docs/providers/azurerm/r/network_security_group.html.markdown index 6d52f59aa..69f936122 100644 --- a/website/source/docs/providers/azurerm/r/network_security_group.html.markdown +++ b/website/source/docs/providers/azurerm/r/network_security_group.html.markdown @@ -34,7 +34,12 @@ resource "azurerm_network_security_group" "test" { source_address_prefix = "*" destination_address_prefix = "*" } + + tags { + environment = "Production" + } } + ``` ## Argument Reference @@ -52,6 +57,8 @@ The following arguments are supported: * `security_rule` - (Optional) Can be specified multiple times to define multiple security rules. Each `security_rule` block supports fields documented below. +* `tags` - (Optional) A mapping of tags to assign to the resource. + The `security_rule` block supports: diff --git a/website/source/docs/providers/azurerm/r/public_ip.html.markdown b/website/source/docs/providers/azurerm/r/public_ip.html.markdown index 63ccbc5bc..62c1cb149 100644 --- a/website/source/docs/providers/azurerm/r/public_ip.html.markdown +++ b/website/source/docs/providers/azurerm/r/public_ip.html.markdown @@ -23,6 +23,10 @@ resource "azurerm_public_ip" "test" { location = "West US" resource_group_name = "${azurerm_resource_group.test.name}" public_ip_address_allocation = "static" + + tags { + environment = "Production" + } } ``` @@ -46,6 +50,8 @@ The following arguments are supported: * `reverse_fqdn` - (Optional) A fully qualified domain name that resolves to this public IP address. If the reverseFqdn is specified, then a PTR DNS record is created pointing from the IP address in the in-addr.arpa domain to the reverse FQDN. +* `tags` - (Optional) A mapping of tags to assign to the resource. + ## Attributes Reference The following attributes are exported: diff --git a/website/source/docs/providers/azurerm/r/route_table.html.markdown b/website/source/docs/providers/azurerm/r/route_table.html.markdown index b75df1346..8dd38a336 100644 --- a/website/source/docs/providers/azurerm/r/route_table.html.markdown +++ b/website/source/docs/providers/azurerm/r/route_table.html.markdown @@ -28,6 +28,10 @@ resource "azurerm_route_table" "test" { address_prefix = "*" next_hop_type = "internet" } + + tags { + environment = "Production" + } } ``` @@ -46,6 +50,8 @@ The following arguments are supported: * `route` - (Optional) Can be specified multiple times to define multiple routes. Each `route` block supports fields documented below. +* `tags` - (Optional) A mapping of tags to assign to the resource. + The `route` block supports: * `name` - (Required) The name of the route.