From 10638a16bb0c515997527ddcbb2caea0ecbccb0e Mon Sep 17 00:00:00 2001
From: kt <kt@katbyte.me>
Date: Wed, 22 Jan 2020 10:12:08 -0800
Subject: [PATCH] =?UTF-8?q?azurerm=5Ftraffic=5Fmanager=5Fprofile=20-=20add?=
 =?UTF-8?q?=20expected=5Fstatus=5Fcode=5Frang=E2=80=A6=20(#5471)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

also changes some TypeSets -> TypeLists as the API ignores all but the first element
---
 ...e_traffic_manager_geographical_location.go |   6 +-
 .../resource_arm_traffic_manager_endpoint.go  |  14 +-
 .../resource_arm_traffic_manager_profile.go   | 242 +++++-----
 ...ource_arm_traffic_manager_endpoint_test.go |  78 ++--
 ...source_arm_traffic_manager_profile_test.go | 419 +++---------------
 .../r/traffic_manager_profile.html.markdown   |   5 +-
 6 files changed, 248 insertions(+), 516 deletions(-)

diff --git a/azurerm/internal/services/trafficmanager/data_source_traffic_manager_geographical_location.go b/azurerm/internal/services/trafficmanager/data_source_traffic_manager_geographical_location.go
index 3786c1104d9b..da62dcad745f 100644
--- a/azurerm/internal/services/trafficmanager/data_source_traffic_manager_geographical_location.go
+++ b/azurerm/internal/services/trafficmanager/data_source_traffic_manager_geographical_location.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/Azure/azure-sdk-for-go/services/trafficmanager/mgmt/2018-04-01/trafficmanager"
 	"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+	"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate"
 	"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
 	"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
 )
@@ -21,8 +22,9 @@ func dataSourceArmTrafficManagerGeographicalLocation() *schema.Resource {
 
 		Schema: map[string]*schema.Schema{
 			"name": {
-				Type:     schema.TypeString,
-				Required: true,
+				Type:         schema.TypeString,
+				Required:     true,
+				ValidateFunc: validate.NoEmptyStrings,
 			},
 		},
 	}
diff --git a/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_endpoint.go b/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_endpoint.go
index d1fd7f8badb6..2adc9a8ecc47 100644
--- a/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_endpoint.go
+++ b/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_endpoint.go
@@ -38,15 +38,17 @@ func resourceArmTrafficManagerEndpoint() *schema.Resource {
 
 		Schema: map[string]*schema.Schema{
 			"name": {
-				Type:     schema.TypeString,
-				Required: true,
-				ForceNew: true,
+				Type:         schema.TypeString,
+				Required:     true,
+				ForceNew:     true,
+				ValidateFunc: validate.NoEmptyStrings,
 			},
 
 			"profile_name": {
-				Type:     schema.TypeString,
-				Required: true,
-				ForceNew: true,
+				Type:         schema.TypeString,
+				Required:     true,
+				ForceNew:     true,
+				ValidateFunc: validate.NoEmptyStrings,
 			},
 
 			"resource_group_name": azure.SchemaResourceGroupNameDiffSuppress(),
diff --git a/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_profile.go b/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_profile.go
index 39991b3ab057..446df59aebae 100644
--- a/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_profile.go
+++ b/azurerm/internal/services/trafficmanager/resource_arm_traffic_manager_profile.go
@@ -1,19 +1,19 @@
 package trafficmanager
 
 import (
-	"bytes"
 	"fmt"
 	"log"
+	"strconv"
 	"strings"
 	"time"
 
 	"github.com/Azure/azure-sdk-for-go/services/trafficmanager/mgmt/2018-04-01/trafficmanager"
-	"github.com/hashicorp/terraform-plugin-sdk/helper/hashcode"
 	"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/suppress"
 	"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
+	"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate"
 	"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/tags"
@@ -40,9 +40,10 @@ func resourceArmTrafficManagerProfile() *schema.Resource {
 
 		Schema: map[string]*schema.Schema{
 			"name": {
-				Type:     schema.TypeString,
-				Required: true,
-				ForceNew: true,
+				Type:         schema.TypeString,
+				Required:     true,
+				ForceNew:     true,
+				ValidateFunc: validate.NoEmptyStrings,
 			},
 
 			"resource_group_name": azure.SchemaResourceGroupNameDiffSuppress(),
@@ -72,8 +73,9 @@ func resourceArmTrafficManagerProfile() *schema.Resource {
 			},
 
 			"dns_config": {
-				Type:     schema.TypeSet,
+				Type:     schema.TypeList,
 				Required: true,
+				MaxItems: 1,
 				Elem: &schema.Resource{
 					Schema: map[string]*schema.Schema{
 						"relative_name": {
@@ -88,20 +90,23 @@ func resourceArmTrafficManagerProfile() *schema.Resource {
 						},
 					},
 				},
-				Set: resourceAzureRMTrafficManagerDNSConfigHash,
-			},
-
-			// inlined from dns_config for ease of use
-			"fqdn": {
-				Type:     schema.TypeString,
-				Computed: true,
 			},
 
 			"monitor_config": {
-				Type:     schema.TypeSet,
+				Type:     schema.TypeList,
 				Required: true,
+				MaxItems: 1,
 				Elem: &schema.Resource{
 					Schema: map[string]*schema.Schema{
+						"expected_status_code_ranges": {
+							Type:     schema.TypeList,
+							Optional: true,
+							Elem: &schema.Schema{
+								Type:         schema.TypeString,
+								ValidateFunc: validateTrafficManagerProfileStatusCodeRange,
+							},
+						},
+
 						"protocol": {
 							Type:     schema.TypeString,
 							Required: true,
@@ -112,27 +117,32 @@ func resourceArmTrafficManagerProfile() *schema.Resource {
 							}, true),
 							DiffSuppressFunc: suppress.CaseDifference,
 						},
+
 						"port": {
 							Type:         schema.TypeInt,
 							Required:     true,
 							ValidateFunc: validation.IntBetween(1, 65535),
 						},
+
 						"path": {
 							Type:     schema.TypeString,
 							Optional: true,
 						},
+
 						"interval_in_seconds": {
 							Type:         schema.TypeInt,
 							Optional:     true,
 							ValidateFunc: validation.IntInSlice([]int{10, 30}),
 							Default:      30,
 						},
+
 						"timeout_in_seconds": {
 							Type:         schema.TypeInt,
 							Optional:     true,
 							ValidateFunc: validation.IntBetween(5, 10),
 							Default:      10,
 						},
+
 						"tolerated_number_of_failures": {
 							Type:         schema.TypeInt,
 							Optional:     true,
@@ -141,7 +151,11 @@ func resourceArmTrafficManagerProfile() *schema.Resource {
 						},
 					},
 				},
-				Set: resourceAzureRMTrafficManagerMonitorConfigHash,
+			},
+
+			"fqdn": {
+				Type:     schema.TypeString,
+				Computed: true,
 			},
 
 			"tags": tags.Schema(),
@@ -157,16 +171,13 @@ func resourceArmTrafficManagerProfileCreateUpdate(d *schema.ResourceData, meta i
 	log.Printf("[INFO] preparing arguments for TrafficManager Profile creation.")
 
 	name := d.Get("name").(string)
-	// must be provided in request
-	location := "global"
-	resGroup := d.Get("resource_group_name").(string)
-	t := d.Get("tags").(map[string]interface{})
+	resourceGroup := d.Get("resource_group_name").(string)
 
 	if features.ShouldResourcesBeImported() && d.IsNewResource() {
-		existing, err := client.Get(ctx, resGroup, name)
+		existing, err := client.Get(ctx, resourceGroup, name)
 		if err != nil {
 			if !utils.ResponseWasNotFound(existing.Response) {
-				return fmt.Errorf("Error checking for presence of existing TrafficManager profile %s (resource group %s) ID", name, resGroup)
+				return fmt.Errorf("Error checking for presence of existing TrafficManager profile %s (resource group %s) ID", name, resourceGroup)
 			}
 		}
 
@@ -175,29 +186,36 @@ func resourceArmTrafficManagerProfileCreateUpdate(d *schema.ResourceData, meta i
 		}
 	}
 
-	props, err := getArmTrafficManagerProfileProperties(d)
-	if err != nil {
-		// There isn't any additional messaging needed for this error
-		return err
+	profile := trafficmanager.Profile{
+		Name:     &name,
+		Location: utils.String("global"), // must be provided in request
+		ProfileProperties: &trafficmanager.ProfileProperties{
+			TrafficRoutingMethod: trafficmanager.TrafficRoutingMethod(d.Get("traffic_routing_method").(string)),
+			DNSConfig:            expandArmTrafficManagerDNSConfig(d),
+			MonitorConfig:        expandArmTrafficManagerMonitorConfig(d),
+		},
+		Tags: tags.Expand(d.Get("tags").(map[string]interface{})),
 	}
 
-	profile := trafficmanager.Profile{
-		Name:              &name,
-		Location:          &location,
-		ProfileProperties: props,
-		Tags:              tags.Expand(t),
+	if status, ok := d.GetOk("profile_status"); ok {
+		profile.ProfileStatus = trafficmanager.ProfileStatus(status.(string))
+	}
+
+	if *profile.ProfileProperties.MonitorConfig.IntervalInSeconds == int64(10) &&
+		*profile.ProfileProperties.MonitorConfig.TimeoutInSeconds == int64(10) {
+		return fmt.Errorf("`timeout_in_seconds` must be between `5` and `9` when `interval_in_seconds` is set to `10`")
 	}
 
-	if _, err := client.CreateOrUpdate(ctx, resGroup, name, profile); err != nil {
+	if _, err := client.CreateOrUpdate(ctx, resourceGroup, name, profile); err != nil {
 		return err
 	}
 
-	read, err := client.Get(ctx, resGroup, name)
+	read, err := client.Get(ctx, resourceGroup, name)
 	if err != nil {
-		return err
+		return fmt.Errorf("Error reading TrafficManager profile %s (resource group %s): %v", name, resourceGroup, err)
 	}
 	if read.ID == nil {
-		return fmt.Errorf("Cannot read TrafficManager profile %s (resource group %s) ID", name, resGroup)
+		return fmt.Errorf("Cannot read TrafficManager profile %s (resource group %s) ID", name, resourceGroup)
 	}
 
 	d.SetId(*read.ID)
@@ -214,10 +232,10 @@ func resourceArmTrafficManagerProfileRead(d *schema.ResourceData, meta interface
 	if err != nil {
 		return err
 	}
-	resGroup := id.ResourceGroup
+	resourceGroup := id.ResourceGroup
 	name := id.Path["trafficManagerProfiles"]
 
-	resp, err := client.Get(ctx, resGroup, name)
+	resp, err := client.Get(ctx, resourceGroup, name)
 	if err != nil {
 		if utils.ResponseWasNotFound(resp.Response) {
 			d.SetId("")
@@ -226,23 +244,21 @@ func resourceArmTrafficManagerProfileRead(d *schema.ResourceData, meta interface
 		return fmt.Errorf("Error making Read request on Traffic Manager Profile %s: %+v", name, err)
 	}
 
-	profile := *resp.ProfileProperties
-
-	// update appropriate values
-	d.Set("resource_group_name", resGroup)
+	d.Set("resource_group_name", resourceGroup)
 	d.Set("name", resp.Name)
-	d.Set("profile_status", profile.ProfileStatus)
-	d.Set("traffic_routing_method", profile.TrafficRoutingMethod)
-
-	dnsFlat := flattenAzureRMTrafficManagerProfileDNSConfig(profile.DNSConfig)
-	d.Set("dns_config", schema.NewSet(resourceAzureRMTrafficManagerDNSConfigHash, dnsFlat))
 
-	// fqdn is actually inside DNSConfig, inlined for simpler reference
-	d.Set("fqdn", profile.DNSConfig.Fqdn)
+	if profile := resp.ProfileProperties; profile != nil {
+		d.Set("profile_status", profile.ProfileStatus)
+		d.Set("traffic_routing_method", profile.TrafficRoutingMethod)
 
-	monitorFlat := flattenAzureRMTrafficManagerProfileMonitorConfig(profile.MonitorConfig)
-	d.Set("monitor_config", schema.NewSet(resourceAzureRMTrafficManagerMonitorConfigHash, monitorFlat))
+		d.Set("dns_config", flattenAzureRMTrafficManagerProfileDNSConfig(profile.DNSConfig))
+		d.Set("monitor_config", flattenAzureRMTrafficManagerProfileMonitorConfig(profile.MonitorConfig))
 
+		// fqdn is actually inside DNSConfig, inlined for simpler reference
+		if dns := profile.DNSConfig; dns != nil {
+			d.Set("fqdn", dns.Fqdn)
+		}
+	}
 	return tags.FlattenAndSet(d, resp.Tags)
 }
 
@@ -255,10 +271,10 @@ func resourceArmTrafficManagerProfileDelete(d *schema.ResourceData, meta interfa
 	if err != nil {
 		return err
 	}
-	resGroup := id.ResourceGroup
+	resourceGroup := id.ResourceGroup
 	name := id.Path["trafficManagerProfiles"]
 
-	resp, err := client.Delete(ctx, resGroup, name)
+	resp, err := client.Delete(ctx, resourceGroup, name)
 	if err != nil {
 		if !utils.ResponseWasNotFound(resp.Response) {
 			return err
@@ -268,54 +284,38 @@ func resourceArmTrafficManagerProfileDelete(d *schema.ResourceData, meta interfa
 	return nil
 }
 
-func getArmTrafficManagerProfileProperties(d *schema.ResourceData) (*trafficmanager.ProfileProperties, error) {
-	routingMethod := d.Get("traffic_routing_method").(string)
-
-	montiorConfig, err := expandArmTrafficManagerMonitorConfig(d)
-	if err != nil {
-		return nil, fmt.Errorf("Error expanding `montior_config`: %+v", err)
-	}
-	props := &trafficmanager.ProfileProperties{
-		TrafficRoutingMethod: trafficmanager.TrafficRoutingMethod(routingMethod),
-		DNSConfig:            expandArmTrafficManagerDNSConfig(d),
-		MonitorConfig:        montiorConfig,
-	}
-
-	if status, ok := d.GetOk("profile_status"); ok {
-		s := status.(string)
-		props.ProfileStatus = trafficmanager.ProfileStatus(s)
-	}
-
-	return props, nil
-}
-
-func expandArmTrafficManagerMonitorConfig(d *schema.ResourceData) (*trafficmanager.MonitorConfig, error) {
-	monitorSets := d.Get("monitor_config").(*schema.Set).List()
+func expandArmTrafficManagerMonitorConfig(d *schema.ResourceData) *trafficmanager.MonitorConfig {
+	monitorSets := d.Get("monitor_config").([]interface{})
 	monitor := monitorSets[0].(map[string]interface{})
 
-	proto := monitor["protocol"].(string)
-	port := int64(monitor["port"].(int))
-	path := monitor["path"].(string)
-	interval := int64(monitor["interval_in_seconds"].(int))
-	timeout := int64(monitor["timeout_in_seconds"].(int))
-	tolerated := int64(monitor["tolerated_number_of_failures"].(int))
+	cfg := trafficmanager.MonitorConfig{
+		Protocol:                  trafficmanager.MonitorProtocol(monitor["protocol"].(string)),
+		Port:                      utils.Int64(int64(monitor["port"].(int))),
+		Path:                      utils.String(monitor["path"].(string)),
+		IntervalInSeconds:         utils.Int64(int64(monitor["interval_in_seconds"].(int))),
+		TimeoutInSeconds:          utils.Int64(int64(monitor["timeout_in_seconds"].(int))),
+		ToleratedNumberOfFailures: utils.Int64(int64(monitor["tolerated_number_of_failures"].(int))),
+	}
 
-	if interval == int64(10) && timeout == int64(10) {
-		return nil, fmt.Errorf("`timeout_in_seconds` must be between `5` and `9` when `interval_in_seconds` is set to `10`")
+	if v, ok := monitor["expected_status_code_ranges"].([]interface{}); ok {
+		ranges := make([]trafficmanager.MonitorConfigExpectedStatusCodeRangesItem, 0)
+		for _, r := range v {
+			parts := strings.Split(r.(string), "-")
+			min, _ := strconv.Atoi(parts[0])
+			max, _ := strconv.Atoi(parts[1])
+			ranges = append(ranges, trafficmanager.MonitorConfigExpectedStatusCodeRangesItem{
+				Min: utils.Int32(int32(min)),
+				Max: utils.Int32(int32(max)),
+			})
+		}
+		cfg.ExpectedStatusCodeRanges = &ranges
 	}
 
-	return &trafficmanager.MonitorConfig{
-		Protocol:                  trafficmanager.MonitorProtocol(proto),
-		Port:                      &port,
-		Path:                      &path,
-		IntervalInSeconds:         &interval,
-		TimeoutInSeconds:          &timeout,
-		ToleratedNumberOfFailures: &tolerated,
-	}, nil
+	return &cfg
 }
 
 func expandArmTrafficManagerDNSConfig(d *schema.ResourceData) *trafficmanager.DNSConfig {
-	dnsSets := d.Get("dns_config").(*schema.Set).List()
+	dnsSets := d.Get("dns_config").([]interface{})
 	dns := dnsSets[0].(map[string]interface{})
 
 	name := dns["relative_name"].(string)
@@ -350,43 +350,45 @@ func flattenAzureRMTrafficManagerProfileMonitorConfig(cfg *trafficmanager.Monito
 	result["timeout_in_seconds"] = int(*cfg.TimeoutInSeconds)
 	result["tolerated_number_of_failures"] = int(*cfg.ToleratedNumberOfFailures)
 
-	return []interface{}{result}
-}
-
-func resourceAzureRMTrafficManagerDNSConfigHash(v interface{}) int {
-	var buf bytes.Buffer
+	if v := cfg.ExpectedStatusCodeRanges; v != nil {
+		ranges := make([]string, 0)
+		for _, r := range *v {
+			if r.Min == nil || r.Max == nil {
+				continue
+			}
 
-	if m, ok := v.(map[string]interface{}); ok {
-		buf.WriteString(fmt.Sprintf("%s-", m["relative_name"].(string)))
-		buf.WriteString(fmt.Sprintf("%d-", m["ttl"].(int)))
+			ranges = append(ranges, fmt.Sprintf("%d-%d", *r.Min, *r.Max))
+		}
+		result["expected_status_code_ranges"] = ranges
 	}
 
-	return hashcode.String(buf.String())
+	return []interface{}{result}
 }
 
-func resourceAzureRMTrafficManagerMonitorConfigHash(v interface{}) int {
-	var buf bytes.Buffer
-
-	if m, ok := v.(map[string]interface{}); ok {
-		buf.WriteString(fmt.Sprintf("%s-", strings.ToLower(m["protocol"].(string))))
-		buf.WriteString(fmt.Sprintf("%d-", m["port"].(int)))
-
-		if v, ok := m["path"]; ok && v != "" {
-			buf.WriteString(fmt.Sprintf("%s-", m["path"].(string)))
-		}
+func validateTrafficManagerProfileStatusCodeRange(i interface{}, k string) (warnings []string, errors []error) {
+	v, ok := i.(string)
+	if !ok {
+		errors = append(errors, fmt.Errorf("expected type of %s to be string", k))
+		return warnings, errors
+	}
 
-		if v, ok := m["interval_in_seconds"]; ok && v != "" {
-			buf.WriteString(fmt.Sprintf("%d-", m["interval_in_seconds"].(int)))
-		}
+	parts := strings.Split(v, "-")
+	if len(parts) != 2 {
+		errors = append(errors, fmt.Errorf("expected %s to contain a single '-', got %v", k, i))
+		return warnings, errors
+	}
 
-		if v, ok := m["timeout_in_seconds"]; ok && v != "" {
-			buf.WriteString(fmt.Sprintf("%d-", m["timeout_in_seconds"].(int)))
-		}
+	_, err := strconv.Atoi(parts[0])
+	if err != nil {
+		errors = append(errors, fmt.Errorf("expected %s on the left of - to be an integer, got %v: %v", k, i, err))
+		return warnings, errors
+	}
 
-		if v, ok := m["tolerated_number_of_failures"]; ok && v != "" {
-			buf.WriteString(fmt.Sprintf("%d-", m["tolerated_number_of_failures"].(int)))
-		}
+	_, err = strconv.Atoi(parts[1])
+	if err != nil {
+		errors = append(errors, fmt.Errorf("expected %s on the right of - to be an integer, got %v: %v", k, i, err))
+		return warnings, errors
 	}
 
-	return hashcode.String(buf.String())
+	return warnings, errors
 }
diff --git a/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_endpoint_test.go b/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_endpoint_test.go
index 262b9b55fd73..93af256268de 100644
--- a/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_endpoint_test.go
+++ b/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_endpoint_test.go
@@ -419,17 +419,17 @@ func testCheckAzureRMTrafficManagerEndpointDestroy(s *terraform.State) error {
 func testAccAzureRMTrafficManagerEndpoint_basic(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Weighted"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -487,17 +487,17 @@ resource "azurerm_traffic_manager_endpoint" "import" {
 func testAccAzureRMTrafficManagerEndpoint_basicDisableExternal(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Weighted"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -540,17 +540,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternal" {
 func testAccAzureRMTrafficManagerEndpoint_weight(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Weighted"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -584,17 +584,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_updateWeight(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Weighted"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -627,17 +627,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_priority(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Priority"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -671,17 +671,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_updatePriority(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Priority"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -715,17 +715,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_subnets(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Subnet"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -769,17 +769,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_updateSubnets(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Subnet"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -815,17 +815,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_headers(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Priority"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -863,17 +863,17 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_updateHeaders(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Priority"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -911,7 +911,7 @@ resource "azurerm_traffic_manager_endpoint" "testExternalNew" {
 func testAccAzureRMTrafficManagerEndpoint_nestedEndpoints(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
@@ -973,7 +973,7 @@ resource "azurerm_traffic_manager_endpoint" "externalChild" {
 func testAccAzureRMTrafficManagerEndpoint_location(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
@@ -1008,7 +1008,7 @@ resource "azurerm_traffic_manager_endpoint" "test" {
 func testAccAzureRMTrafficManagerEndpoint_locationUpdated(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
@@ -1043,17 +1043,17 @@ resource "azurerm_traffic_manager_endpoint" "test" {
 func testAccAzureRMTrafficManagerEndpoint_geoMappings(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Geographic"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 100
   }
 
@@ -1082,17 +1082,17 @@ resource "azurerm_traffic_manager_endpoint" "test" {
 func testAccAzureRMTrafficManagerEndpoint_geoMappingsUpdated(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Geographic"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 100
   }
 
diff --git a/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_profile_test.go b/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_profile_test.go
index 14f3f327aea1..3c50dc098bc3 100644
--- a/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_profile_test.go
+++ b/azurerm/internal/services/trafficmanager/tests/resource_arm_traffic_manager_profile_test.go
@@ -14,16 +14,7 @@ import (
 	"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features"
 )
 
-func getTrafficManagerFQDN(hostname string) (string, error) {
-	environment, err := acceptance.Environment()
-	if err != nil {
-		return "", err
-	}
-	dnsSuffix := environment.TrafficManagerDNSSuffix
-	return fmt.Sprintf("%s.%s", hostname, dnsSuffix), nil
-}
-
-func TestAccAzureRMTrafficManagerProfile_geographic(t *testing.T) {
+func TestAccAzureRMTrafficManagerProfile_basic(t *testing.T) {
 	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
 
 	resource.ParallelTest(t, resource.TestCase{
@@ -32,59 +23,30 @@ func TestAccAzureRMTrafficManagerProfile_geographic(t *testing.T) {
 		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
 		Steps: []resource.TestStep{
 			{
-				Config: testAccAzureRMTrafficManagerProfile_geographic(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Geographic"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
 					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Geographic"),
+					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fmt.Sprintf("acctest-tmp-%d.trafficmanager.net", data.RandomInteger)),
 				),
 			},
 			data.ImportStep(),
 		},
 	})
 }
-func TestAccAzureRMTrafficManagerProfile_requiresImport(t *testing.T) {
-	if !features.ShouldResourcesBeImported() {
-		t.Skip("Skipping since resources aren't required to be imported")
-		return
-	}
 
-	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
-	resource.ParallelTest(t, resource.TestCase{
-		PreCheck:     func() { acceptance.PreCheck(t) },
-		Providers:    acceptance.SupportedProviders,
-		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
-		Steps: []resource.TestStep{
-			{
-				Config: testAccAzureRMTrafficManagerProfile_geographic(data),
-				Check: resource.ComposeTestCheckFunc(
-					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Geographic"),
-				),
-			},
-			data.RequiresImportErrorStep(testAccAzureRMTrafficManagerProfile_requiresImport),
-		},
-	})
-}
-
-func TestAccAzureRMTrafficManagerProfile_weighted(t *testing.T) {
+func TestAccAzureRMTrafficManagerProfile_complete(t *testing.T) {
 	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
 
-	fqdn, err := getTrafficManagerFQDN(fmt.Sprintf("acctesttmp%d", data.RandomInteger))
-	if err != nil {
-		t.Fatalf("Error obtaining Azure Region: %+v", err)
-	}
-
 	resource.ParallelTest(t, resource.TestCase{
 		PreCheck:     func() { acceptance.PreCheck(t) },
 		Providers:    acceptance.SupportedProviders,
 		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
 		Steps: []resource.TestStep{
 			{
-				Config: testAccAzureRMTrafficManagerProfile_weighted(data),
+				Config: testAccAzureRMTrafficManagerProfile_complete(data),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Weighted"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
 				),
 			},
 			data.ImportStep(),
@@ -92,51 +54,25 @@ func TestAccAzureRMTrafficManagerProfile_weighted(t *testing.T) {
 	})
 }
 
-func TestAccAzureRMTrafficManagerProfile_weightedTCP(t *testing.T) {
+func TestAccAzureRMTrafficManagerProfile_update(t *testing.T) {
 	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
 
-	fqdn, err := getTrafficManagerFQDN(fmt.Sprintf("acctesttmp%d", data.RandomInteger))
-	if err != nil {
-		t.Fatalf("Error obtaining Azure Region: %+v", err)
-	}
-
 	resource.ParallelTest(t, resource.TestCase{
 		PreCheck:     func() { acceptance.PreCheck(t) },
 		Providers:    acceptance.SupportedProviders,
 		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
 		Steps: []resource.TestStep{
 			{
-				Config: testAccAzureRMTrafficManagerProfile_weightedTCP(data),
+				Config: testAccAzureRMTrafficManagerProfile_complete(data),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Weighted"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
 				),
 			},
 			data.ImportStep(),
-		},
-	})
-}
-
-func TestAccAzureRMTrafficManagerProfile_performance(t *testing.T) {
-	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
-
-	fqdn, err := getTrafficManagerFQDN(fmt.Sprintf("acctesttmp%d", data.RandomInteger))
-	if err != nil {
-		t.Fatalf("Error obtaining Azure Region: %+v", err)
-	}
-
-	resource.ParallelTest(t, resource.TestCase{
-		PreCheck:     func() { acceptance.PreCheck(t) },
-		Providers:    acceptance.SupportedProviders,
-		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
-		Steps: []resource.TestStep{
 			{
-				Config: testAccAzureRMTrafficManagerProfile_performance(data),
+				Config: testAccAzureRMTrafficManagerProfile_completeUpdated(data),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Performance"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
 				),
 			},
 			data.ImportStep(),
@@ -144,147 +80,80 @@ func TestAccAzureRMTrafficManagerProfile_performance(t *testing.T) {
 	})
 }
 
-func TestAccAzureRMTrafficManagerProfile_priority(t *testing.T) {
-	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
-
-	fqdn, err := getTrafficManagerFQDN(fmt.Sprintf("acctesttmp%d", data.RandomInteger))
-	if err != nil {
-		t.Fatalf("Error obtaining Azure Region: %+v", err)
+func TestAccAzureRMTrafficManagerProfile_requiresImport(t *testing.T) {
+	if !features.ShouldResourcesBeImported() {
+		t.Skip("Skipping since resources aren't required to be imported")
+		return
 	}
 
-	resource.ParallelTest(t, resource.TestCase{
-		PreCheck:     func() { acceptance.PreCheck(t) },
-		Providers:    acceptance.SupportedProviders,
-		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
-		Steps: []resource.TestStep{
-			{
-				Config: testAccAzureRMTrafficManagerProfile_priority(data),
-				Check: resource.ComposeTestCheckFunc(
-					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Priority"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
-				),
-			},
-			data.ImportStep(),
-		},
-	})
-}
-
-func TestAccAzureRMTrafficManagerProfile_withTags(t *testing.T) {
 	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
-
 	resource.ParallelTest(t, resource.TestCase{
 		PreCheck:     func() { acceptance.PreCheck(t) },
 		Providers:    acceptance.SupportedProviders,
 		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
 		Steps: []resource.TestStep{
 			{
-				Config: testAccAzureRMTrafficManagerProfile_withTags(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Geographic"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "tags.%", "2"),
-					resource.TestCheckResourceAttr(data.ResourceName, "tags.environment", "Production"),
-					resource.TestCheckResourceAttr(data.ResourceName, "tags.cost_center", "MSFT"),
-				),
-			},
-			{
-				Config: testAccAzureRMTrafficManagerProfile_withTagsUpdated(data),
-				Check: resource.ComposeTestCheckFunc(
-					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "tags.%", "1"),
-					resource.TestCheckResourceAttr(data.ResourceName, "tags.environment", "staging"),
+					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Geographic"),
 				),
 			},
-			data.ImportStep(),
+			data.RequiresImportErrorStep(testAccAzureRMTrafficManagerProfile_requiresImport),
 		},
 	})
 }
 
-func TestAccAzureRMTrafficManagerProfile_performanceToGeographic(t *testing.T) {
+func TestAccAzureRMTrafficManagerProfile_cycleMethod(t *testing.T) {
 	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
 
-	fqdn, err := getTrafficManagerFQDN(fmt.Sprintf("acctesttmp%d", data.RandomInteger))
-	if err != nil {
-		t.Fatalf("Error obtaining Azure Region: %+v", err)
-	}
-
 	resource.ParallelTest(t, resource.TestCase{
 		PreCheck:     func() { acceptance.PreCheck(t) },
 		Providers:    acceptance.SupportedProviders,
 		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
 		Steps: []resource.TestStep{
 			{
-				Config: testAccAzureRMTrafficManagerProfile_performance(data),
-				Check: resource.ComposeTestCheckFunc(
-					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Performance"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
-				),
-			},
-			{
-				Config: testAccAzureRMTrafficManagerProfile_geographic(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Geographic"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
 					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Geographic"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
+					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fmt.Sprintf("acctest-tmp-%d.trafficmanager.net", data.RandomInteger)),
 				),
 			},
-		},
-	})
-}
-
-func TestAccAzureRMTrafficManagerProfile_priorityToWeighted(t *testing.T) {
-	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
-
-	fqdn, err := getTrafficManagerFQDN(fmt.Sprintf("acctesttmp%d", data.RandomInteger))
-	if err != nil {
-		t.Fatalf("Error obtaining Azure Region: %+v", err)
-	}
-
-	resource.ParallelTest(t, resource.TestCase{
-		PreCheck:     func() { acceptance.PreCheck(t) },
-		Providers:    acceptance.SupportedProviders,
-		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
-		Steps: []resource.TestStep{
+			data.ImportStep(),
 			{
-				Config: testAccAzureRMTrafficManagerProfile_priority(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Weighted"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Priority"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
+					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Weighted"),
+					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fmt.Sprintf("acctest-tmp-%d.trafficmanager.net", data.RandomInteger)),
 				),
 			},
+			data.ImportStep(),
 			{
-				Config: testAccAzureRMTrafficManagerProfile_weighted(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Subnet"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
-					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Weighted"),
-					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fqdn),
+					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Subnet"),
+					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fmt.Sprintf("acctest-tmp-%d.trafficmanager.net", data.RandomInteger)),
 				),
 			},
-		},
-	})
-}
-
-func TestAccAzureRMTrafficManagerProfile_fastEndpointFailoverSettings(t *testing.T) {
-	data := acceptance.BuildTestData(t, "azurerm_traffic_manager_profile", "test")
-
-	resource.ParallelTest(t, resource.TestCase{
-		PreCheck:     func() { acceptance.PreCheck(t) },
-		Providers:    acceptance.SupportedProviders,
-		CheckDestroy: testCheckAzureRMTrafficManagerProfileDestroy,
-		Steps: []resource.TestStep{
+			data.ImportStep(),
 			{
-				Config: testAccAzureRMTrafficManagerProfile_failover(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Priority"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
+					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Priority"),
+					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fmt.Sprintf("acctest-tmp-%d.trafficmanager.net", data.RandomInteger)),
 				),
 			},
 			data.ImportStep(),
 			{
-				Config: testAccAzureRMTrafficManagerProfile_failoverUpdate(data),
+				Config: testAccAzureRMTrafficManagerProfile_basic(data, "Performance"),
 				Check: resource.ComposeTestCheckFunc(
 					testCheckAzureRMTrafficManagerProfileExists(data.ResourceName),
+					resource.TestCheckResourceAttr(data.ResourceName, "traffic_routing_method", "Performance"),
+					resource.TestCheckResourceAttr(data.ResourceName, "fqdn", fmt.Sprintf("acctest-tmp-%d.trafficmanager.net", data.RandomInteger)),
 				),
 			},
 			data.ImportStep(),
@@ -365,20 +234,20 @@ func testCheckAzureRMTrafficManagerProfileDestroy(s *terraform.State) error {
 	return nil
 }
 
-func testAccAzureRMTrafficManagerProfile_geographic(data acceptance.TestData) string {
+func testAccAzureRMTrafficManagerProfile_basic(data acceptance.TestData, method string) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
+  name     = "acctestRG-traffic-%[1]d"
+  location = "%[2]s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%[1]d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Geographic"
+  traffic_routing_method = "%[3]s"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%[1]d"
     ttl           = 30
   }
 
@@ -388,10 +257,11 @@ resource "azurerm_traffic_manager_profile" "test" {
     path     = "/"
   }
 }
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
+`, data.RandomInteger, data.Locations.Primary, method)
 }
+
 func testAccAzureRMTrafficManagerProfile_requiresImport(data acceptance.TestData) string {
-	template := testAccAzureRMTrafficManagerProfile_geographic(data)
+	template := testAccAzureRMTrafficManagerProfile_basic(data, "Geographic")
 	return fmt.Sprintf(`
 %s
 
@@ -401,7 +271,7 @@ resource "azurerm_traffic_manager_profile" "import" {
   traffic_routing_method = "${azurerm_traffic_manager_profile.test.traffic_routing_method}"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
@@ -414,223 +284,78 @@ resource "azurerm_traffic_manager_profile" "import" {
 `, template, data.RandomInteger)
 }
 
-func testAccAzureRMTrafficManagerProfile_weighted(data acceptance.TestData) string {
+func testAccAzureRMTrafficManagerProfile_complete(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
-  resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Weighted"
-
-  dns_config {
-    relative_name = "acctesttmp%d"
-    ttl           = 30
-  }
-
-  monitor_config {
-    protocol = "https"
-    port     = 443
-    path     = "/"
-  }
-}
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
-}
-
-func testAccAzureRMTrafficManagerProfile_weightedTCP(data acceptance.TestData) string {
-	return fmt.Sprintf(`
-resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
-}
-
-resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
-  resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Weighted"
-
-  dns_config {
-    relative_name = "acctesttmp%d"
-    ttl           = 30
-  }
-
-  monitor_config {
-    protocol = "tcp"
-    port     = 443
-  }
-}
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
-}
-
-func testAccAzureRMTrafficManagerProfile_performance(data acceptance.TestData) string {
-	return fmt.Sprintf(`
-resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
-}
-
-resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Performance"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
   monitor_config {
-    protocol = "https"
-    port     = 443
-    path     = "/"
-  }
-}
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
-}
-
-func testAccAzureRMTrafficManagerProfile_priority(data acceptance.TestData) string {
-	return fmt.Sprintf(`
-resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
-}
-
-resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
-  resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Priority"
-
-  dns_config {
-    relative_name = "acctesttmp%d"
-    ttl           = 30
-  }
-
-  monitor_config {
-    protocol = "https"
-    port     = 443
-    path     = "/"
-  }
-}
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
-}
-
-func testAccAzureRMTrafficManagerProfile_withTags(data acceptance.TestData) string {
-	return fmt.Sprintf(`
-resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
-}
+    expected_status_code_ranges = [
+      "100-101",
+      "301-303",
+    ]
 
-resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
-  resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Priority"
-
-  dns_config {
-    relative_name = "acctesttmp%d"
-    ttl           = 30
-  }
+    protocol = "tcp"
+    port     = 777
 
-  monitor_config {
-    protocol = "https"
-    port     = 443
-    path     = "/"
+    interval_in_seconds          = 30
+    timeout_in_seconds           = 9
+    tolerated_number_of_failures = 6
   }
 
   tags = {
-    environment = "Production"
-    cost_center = "MSFT"
+    Environment = "Production"
+    cost_center = "acctest"
   }
 }
 `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
 }
 
-func testAccAzureRMTrafficManagerProfile_withTagsUpdated(data acceptance.TestData) string {
+func testAccAzureRMTrafficManagerProfile_completeUpdated(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Priority"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-rename-%d"
     ttl           = 30
   }
 
   monitor_config {
+    expected_status_code_ranges = [
+      "302-304",
+    ]
+
     protocol = "https"
-    port     = 443
+    port     = 442
     path     = "/"
-  }
-
-  tags = {
-    environment = "staging"
-  }
-}
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
-}
-
-func testAccAzureRMTrafficManagerProfile_failover(data acceptance.TestData) string {
-	return fmt.Sprintf(`
-resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
-}
-
-resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
-  resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Performance"
 
-  dns_config {
-    relative_name = "acctesttmp%d"
-    ttl           = 30
-  }
-
-  monitor_config {
-    protocol                     = "https"
-    port                         = 443
-    path                         = "/"
     interval_in_seconds          = 30
     timeout_in_seconds           = 6
     tolerated_number_of_failures = 3
   }
-}
-`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
-}
-
-func testAccAzureRMTrafficManagerProfile_failoverUpdate(data acceptance.TestData) string {
-	return fmt.Sprintf(`
-resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
-  location = "%s"
-}
-
-resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
-  resource_group_name    = "${azurerm_resource_group.test.name}"
-  traffic_routing_method = "Performance"
-
-  dns_config {
-    relative_name = "acctesttmp%d"
-    ttl           = 30
-  }
 
-  monitor_config {
-    protocol                     = "https"
-    port                         = 443
-    path                         = "/"
-    interval_in_seconds          = 30
-    timeout_in_seconds           = 9
-    tolerated_number_of_failures = 6
+  tags = {
+    Environment = "staging"
   }
 }
 `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger)
@@ -639,17 +364,17 @@ resource "azurerm_traffic_manager_profile" "test" {
 func testAccAzureRMTrafficManagerProfile_failoverError(data acceptance.TestData) string {
 	return fmt.Sprintf(`
 resource "azurerm_resource_group" "test" {
-  name     = "acctestRG-%d"
+  name     = "acctestRG-traffic-%d"
   location = "%s"
 }
 
 resource "azurerm_traffic_manager_profile" "test" {
-  name                   = "acctesttmp%d"
+  name                   = "acctest-TMP-%d"
   resource_group_name    = "${azurerm_resource_group.test.name}"
   traffic_routing_method = "Performance"
 
   dns_config {
-    relative_name = "acctesttmp%d"
+    relative_name = "acctest-tmp-%d"
     ttl           = 30
   }
 
diff --git a/website/docs/r/traffic_manager_profile.html.markdown b/website/docs/r/traffic_manager_profile.html.markdown
index 43e9bad2a51d..fa218546addb 100644
--- a/website/docs/r/traffic_manager_profile.html.markdown
+++ b/website/docs/r/traffic_manager_profile.html.markdown
@@ -93,13 +93,14 @@ The `dns_config` block supports:
 
 The `monitor_config` block supports:
 
-* `protocol` - (Required) The protocol used by the monitoring checks, supported
-    values are `HTTP`, `HTTPS` and `TCP`.
+* `protocol` - (Required) The protocol used by the monitoring checks, supported values are `HTTP`, `HTTPS` and `TCP`.
 
 * `port` - (Required) The port number used by the monitoring checks.
 
 * `path` - (Optional) The path used by the monitoring checks. Required when `protocol` is set to `HTTP` or `HTTPS` - cannot be set when `protocol` is set to `TCP`.
 
+* `expected_status_code_ranges` - (Optional) A list of status code ranges in the format of `100-101`.
+
 * `interval_in_seconds` - (Optional) The interval used to check the endpoint health from a Traffic Manager probing agent. You can specify two values here: `30` (normal probing) and `10` (fast probing). The default value is `30`.
 
 * `timeout_in_seconds` - (Optional) The amount of time the Traffic Manager probing agent should wait before considering that check a failure when a health check probe is sent to the endpoint. If `interval_in_seconds` is set to `30`, then `timeout_in_seconds` can be between `5` and `10`. The default value is `10`. If `interval_in_seconds` is set to `10`, then valid values are between `5` and `9` and `timeout_in_seconds` is required.