diff --git a/azurerm/internal/services/datafactory/data_factory_resource.go b/azurerm/internal/services/datafactory/data_factory_resource.go index aeeb99ee4d07..66243e37fd03 100644 --- a/azurerm/internal/services/datafactory/data_factory_resource.go +++ b/azurerm/internal/services/datafactory/data_factory_resource.go @@ -29,9 +29,10 @@ func resourceDataFactory() *pluginsdk.Resource { Update: resourceDataFactoryCreateUpdate, Delete: resourceDataFactoryDelete, - SchemaVersion: 1, + SchemaVersion: 2, StateUpgraders: pluginsdk.StateUpgrades(map[int]pluginsdk.StateUpgrade{ 0: migration.DataFactoryV0ToV1{}, + 1: migration.DataFactoryV1ToV2{}, }), // TODO: replace this with an importer which validates the ID during import diff --git a/azurerm/internal/services/datafactory/data_factory_resource_migration.go b/azurerm/internal/services/datafactory/data_factory_resource_migration.go deleted file mode 100644 index 11ab5f1f2b13..000000000000 --- a/azurerm/internal/services/datafactory/data_factory_resource_migration.go +++ /dev/null @@ -1,35 +0,0 @@ -package datafactory - -import ( - "fmt" - "log" - - "github.com/Azure/azure-sdk-for-go/services/datafactory/mgmt/2018-06-01/datafactory" - "github.com/hashicorp/terraform-plugin-sdk/terraform" -) - -func ResourceDataFactoryMigrateState( - v int, is *terraform.InstanceState, _ interface{}) (*terraform.InstanceState, error) { - switch v { - case 0: - log.Println("[INFO] Found AzureRM DataFactory State v0; migrating to v1") - return migrateDataFactoryStateV0toV1(is) - default: - return is, fmt.Errorf("Unexpected schema version: %d", v) - } -} - -func migrateDataFactoryStateV0toV1(is *terraform.InstanceState) (*terraform.InstanceState, error) { - if is.Empty() { - log.Println("[DEBUG] Empty InstanceState; nothing to migrate.") - return is, nil - } - - log.Printf("[DEBUG] ARM Data Factory Attributes before Migration: %#v", is.Attributes) - - is.Attributes["public_network_enabled"] = string(datafactory.PublicNetworkAccessEnabled) - - log.Printf("[DEBUG] ARM Data Factory Attributes after State Migration: %#v", is.Attributes) - - return is, nil -} diff --git a/azurerm/internal/services/datafactory/data_factory_resource_test.go b/azurerm/internal/services/datafactory/data_factory_resource_test.go index 6f93425b707c..267a4d3bd521 100644 --- a/azurerm/internal/services/datafactory/data_factory_resource_test.go +++ b/azurerm/internal/services/datafactory/data_factory_resource_test.go @@ -237,7 +237,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name } @@ -256,7 +256,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name @@ -279,7 +279,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name @@ -303,7 +303,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name @@ -326,7 +326,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name @@ -353,7 +353,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name @@ -380,7 +380,7 @@ resource "azurerm_resource_group" "test" { } resource "azurerm_data_factory" "test" { - name = "acctestdf%d" + name = "acctestDF%d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name diff --git a/azurerm/internal/services/datafactory/migration/data_factory.go b/azurerm/internal/services/datafactory/migration/data_factory.go index 3082b1ffc357..d99d8a500705 100644 --- a/azurerm/internal/services/datafactory/migration/data_factory.go +++ b/azurerm/internal/services/datafactory/migration/data_factory.go @@ -5,10 +5,12 @@ import ( "log" "github.com/Azure/azure-sdk-for-go/services/datafactory/mgmt/2018-06-01/datafactory" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/datafactory/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/pluginsdk" ) var _ pluginsdk.StateUpgrade = DataFactoryV0ToV1{} +var _ pluginsdk.StateUpgrade = DataFactoryV1ToV2{} type DataFactoryV0ToV1 struct{} @@ -139,3 +141,159 @@ func (DataFactoryV0ToV1) UpgradeFunc() pluginsdk.StateUpgraderFunc { return rawState, nil } } + +type DataFactoryV1ToV2 struct{} + +func (DataFactoryV1ToV2) Schema() map[string]*pluginsdk.Schema { + return map[string]*pluginsdk.Schema{ + "name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "location": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "resource_group_name": { + Type: pluginsdk.TypeString, + Required: true, + ForceNew: true, + }, + + "identity": { + Type: pluginsdk.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &pluginsdk.Resource{ + Schema: map[string]*pluginsdk.Schema{ + "type": { + Type: pluginsdk.TypeString, + Required: true, + }, + "identity_ids": { + Type: pluginsdk.TypeList, + Optional: true, + Elem: &pluginsdk.Schema{ + Type: pluginsdk.TypeString, + }, + }, + "principal_id": { + Type: pluginsdk.TypeString, + Computed: true, + }, + "tenant_id": { + Type: pluginsdk.TypeString, + Computed: true, + }, + }, + }, + }, + + "github_configuration": { + Type: pluginsdk.TypeList, + Optional: true, + MaxItems: 1, + ConflictsWith: []string{"vsts_configuration"}, + Elem: &pluginsdk.Resource{ + Schema: map[string]*pluginsdk.Schema{ + "account_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "branch_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "git_url": { + Type: pluginsdk.TypeString, + Required: true, + }, + "repository_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "root_folder": { + Type: pluginsdk.TypeString, + Required: true, + }, + }, + }, + }, + + "vsts_configuration": { + Type: pluginsdk.TypeList, + Optional: true, + MaxItems: 1, + ConflictsWith: []string{"github_configuration"}, + Elem: &pluginsdk.Resource{ + Schema: map[string]*pluginsdk.Schema{ + "account_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "branch_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "project_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "repository_name": { + Type: pluginsdk.TypeString, + Required: true, + }, + "root_folder": { + Type: pluginsdk.TypeString, + Required: true, + }, + "tenant_id": { + Type: pluginsdk.TypeString, + Required: true, + }, + }, + }, + }, + "public_network_enabled": { + Type: pluginsdk.TypeBool, + Optional: true, + Default: true, + }, + + "customer_managed_key_id": { + Type: pluginsdk.TypeString, + Optional: true, + RequiredWith: []string{"identity.0.identity_ids"}, + }, + + "tags": { + Type: pluginsdk.TypeMap, + Optional: true, + Elem: &pluginsdk.Schema{ + Type: pluginsdk.TypeString, + }, + }, + } +} + +func (DataFactoryV1ToV2) UpgradeFunc() pluginsdk.StateUpgraderFunc { + return func(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + log.Printf("[DEBUG] Updating `id` if resourceName is in upper case") + + oldId := rawState["id"].(string) + id, err := parse.DataFactoryID(oldId) + if err != nil { + return nil, err + } + + id.FactoryName = rawState["name"].(string) + rawState["id"] = id.ID() + + return rawState, nil + } +} diff --git a/azurerm/internal/services/datafactory/migration/data_factory_test.go b/azurerm/internal/services/datafactory/migration/data_factory_test.go new file mode 100644 index 000000000000..fd209429c9ed --- /dev/null +++ b/azurerm/internal/services/datafactory/migration/data_factory_test.go @@ -0,0 +1,33 @@ +package migration + +import ( + "context" + "testing" +) + +func TestDataFactoryMigrateState(t *testing.T) { + cases := map[string]struct { + StateVersion int + InputAttributes map[string]interface{} + ExpectedNewID string + }{ + "name_upper_case": { + StateVersion: 1, + InputAttributes: map[string]interface{}{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.DataFactory/factories/acctest", + "name": "ACCTEST", + "location": "westeurope", + "resource_group_name": "resGroup1", + }, + ExpectedNewID: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.DataFactory/factories/ACCTEST", + }, + } + + for _, tc := range cases { + newID, _ := DataFactoryV1ToV2{}.UpgradeFunc()(context.TODO(), tc.InputAttributes, nil) + + if newID["id"].(string) != tc.ExpectedNewID { + t.Fatalf("ID migration failed, expected %q, got: %q", tc.ExpectedNewID, newID["id"].(string)) + } + } +}