Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: consistent identity blocks - part 4 #15336

Merged
merged 11 commits into from
Feb 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 4 additions & 61 deletions internal/services/apimanagement/api_management_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import (
"time"

"github.com/Azure/azure-sdk-for-go/services/apimanagement/mgmt/2021-08-01/apimanagement"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema"
"github.com/hashicorp/terraform-provider-azurerm/helpers/azure"
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/schemaz"
msiparse "github.com/hashicorp/terraform-provider-azurerm/internal/services/msi/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/tags"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/timeouts"
Expand Down Expand Up @@ -63,33 +63,7 @@ func dataSourceApiManagementService() *pluginsdk.Resource {
Computed: true,
},

"identity": {
Type: pluginsdk.TypeList,
Computed: true,
Elem: &pluginsdk.Resource{
Schema: map[string]*pluginsdk.Schema{
"type": {
Type: pluginsdk.TypeString,
Computed: true,
},
"principal_id": {
Type: pluginsdk.TypeString,
Computed: true,
},
"tenant_id": {
Type: pluginsdk.TypeString,
Computed: true,
},
"identity_ids": {
Type: pluginsdk.TypeList,
Computed: true,
Elem: &pluginsdk.Schema{
Type: pluginsdk.TypeString,
},
},
},
},
},
"identity": commonschema.SystemAssignedUserAssignedIdentityComputed(),

"notification_sender_email": {
Type: pluginsdk.TypeString,
Expand Down Expand Up @@ -237,9 +211,9 @@ func dataSourceApiManagementRead(d *pluginsdk.ResourceData, meta interface{}) er
d.Set("location", azure.NormalizeLocation(*location))
}

identity, err := flattenApiManagementDataSourceIdentity(resp.Identity)
identity, err := flattenIdentity(resp.Identity)
if err != nil {
return err
return fmt.Errorf("flattening `identity`: %+v", err)
}
if err := d.Set("identity", identity); err != nil {
return fmt.Errorf("setting `identity`: %+v", err)
Expand Down Expand Up @@ -363,37 +337,6 @@ func flattenDataSourceApiManagementAdditionalLocations(input *[]apimanagement.Ad
return results
}

func flattenApiManagementDataSourceIdentity(identity *apimanagement.ServiceIdentity) ([]interface{}, error) {
if identity == nil || identity.Type == apimanagement.ApimIdentityTypeNone {
return make([]interface{}, 0), nil
}

result := make(map[string]interface{})
result["type"] = string(identity.Type)

if identity.PrincipalID != nil {
result["principal_id"] = identity.PrincipalID.String()
}

if identity.TenantID != nil {
result["tenant_id"] = identity.TenantID.String()
}

identityIds := make([]interface{}, 0)
if identity.UserAssignedIdentities != nil {
for key := range identity.UserAssignedIdentities {
parsedId, err := msiparse.UserAssignedIdentityIDInsensitively(key)
if err != nil {
return nil, err
}
identityIds = append(identityIds, parsedId.ID())
}
result["identity_ids"] = identityIds
}

return []interface{}{result}, nil
}

func apiManagementDataSourceHostnameSchema() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"host_name": {
Expand Down
133 changes: 37 additions & 96 deletions internal/services/apimanagement/api_management_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import (

"github.com/Azure/azure-sdk-for-go/services/apimanagement/mgmt/2021-08-01/apimanagement"
"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema"
"github.com/hashicorp/go-azure-helpers/resourcemanager/identity"
"github.com/hashicorp/terraform-provider-azurerm/helpers/azure"
"github.com/hashicorp/terraform-provider-azurerm/helpers/tf"
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
"github.com/hashicorp/terraform-provider-azurerm/internal/location"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/schemaz"
apimValidate "github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/validate"
msiparse "github.com/hashicorp/terraform-provider-azurerm/internal/services/msi/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/msi/validate"
"github.com/hashicorp/terraform-provider-azurerm/internal/tags"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
Expand Down Expand Up @@ -89,43 +89,7 @@ func resourceApiManagementService() *pluginsdk.Resource {
ValidateFunc: apimValidate.ApimSkuName(),
},

"identity": {
Type: pluginsdk.TypeList,
Optional: true,
MaxItems: 1,
Elem: &pluginsdk.Resource{
Schema: map[string]*pluginsdk.Schema{
"type": {
Type: pluginsdk.TypeString,
Optional: true,
Default: string(apimanagement.ApimIdentityTypeNone),
ValidateFunc: validation.StringInSlice([]string{
string(apimanagement.ApimIdentityTypeNone),
string(apimanagement.ApimIdentityTypeSystemAssigned),
string(apimanagement.ApimIdentityTypeUserAssigned),
string(apimanagement.ApimIdentityTypeSystemAssignedUserAssigned),
}, false),
},
"principal_id": {
Type: pluginsdk.TypeString,
Computed: true,
},
"tenant_id": {
Type: pluginsdk.TypeString,
Computed: true,
},
"identity_ids": {
Type: pluginsdk.TypeSet,
Optional: true,
MinItems: 1,
Elem: &pluginsdk.Schema{
Type: pluginsdk.TypeString,
ValidateFunc: validate.UserAssignedIdentityID,
},
},
},
},
},
"identity": commonschema.SystemAssignedUserAssignedIdentityOptional(),

"virtual_network_type": {
Type: pluginsdk.TypeString,
Expand Down Expand Up @@ -673,7 +637,7 @@ func resourceApiManagementServiceCreateUpdate(d *pluginsdk.ResourceData, meta in

// intentionally not gated since we specify a default value (of None) in the expand, which we need on updates
identityRaw := d.Get("identity").([]interface{})
identity, err := expandAzureRmApiManagementIdentity(identityRaw)
identity, err := expandIdentity(identityRaw)
if err != nil {
return fmt.Errorf("expanding `identity`: %+v", err)
}
Expand Down Expand Up @@ -844,9 +808,9 @@ func resourceApiManagementServiceRead(d *pluginsdk.ResourceData, meta interface{
d.Set("location", azure.NormalizeLocation(*location))
}

identity, err := flattenAzureRmApiManagementMachineIdentity(resp.Identity)
identity, err := flattenIdentity(resp.Identity)
if err != nil {
return err
return fmt.Errorf("flattening `identity`: %+v", err)
}
if err := d.Set("identity", identity); err != nil {
return fmt.Errorf("setting `identity`: %+v", err)
Expand Down Expand Up @@ -1305,72 +1269,49 @@ func flattenApiManagementAdditionalLocations(input *[]apimanagement.AdditionalLo
return results
}

func expandAzureRmApiManagementIdentity(vs []interface{}) (*apimanagement.ServiceIdentity, error) {
if len(vs) == 0 {
return &apimanagement.ServiceIdentity{
Type: apimanagement.ApimIdentityTypeNone,
}, nil
}

v := vs[0].(map[string]interface{})
managedServiceIdentity := apimanagement.ServiceIdentity{
Type: apimanagement.ApimIdentityType(v["type"].(string)),
func expandIdentity(input []interface{}) (*apimanagement.ServiceIdentity, error) {
expanded, err := identity.ExpandSystemAndUserAssignedMap(input)
if err != nil {
return nil, err
}

var identityIdSet []interface{}
if identityIds, exists := v["identity_ids"]; exists {
identityIdSet = identityIds.(*pluginsdk.Set).List()
out := apimanagement.ServiceIdentity{
Type: apimanagement.ApimIdentityType(string(expanded.Type)),
}

// If type contains `UserAssigned`, `identity_ids` must be specified and have at least 1 element
if managedServiceIdentity.Type == apimanagement.ApimIdentityTypeUserAssigned || managedServiceIdentity.Type == apimanagement.ApimIdentityTypeSystemAssignedUserAssigned {
if len(identityIdSet) == 0 {
return nil, fmt.Errorf("`identity_ids` must have at least 1 element when `type` includes `UserAssigned`")
}

userAssignedIdentities := make(map[string]*apimanagement.UserIdentityProperties)
for _, id := range identityIdSet {
userAssignedIdentities[id.(string)] = &apimanagement.UserIdentityProperties{}
if expanded.Type == identity.TypeUserAssigned || expanded.Type == identity.TypeSystemAssignedUserAssigned {
out.UserAssignedIdentities = make(map[string]*apimanagement.UserIdentityProperties)
for k := range expanded.IdentityIds {
out.UserAssignedIdentities[k] = &apimanagement.UserIdentityProperties{
// intentionally empty
}
}

managedServiceIdentity.UserAssignedIdentities = userAssignedIdentities
} else if len(identityIdSet) > 0 {
// If type does _not_ contain `UserAssigned` (i.e. is set to `SystemAssigned` or defaulted to `None`), `identity_ids` is not allowed
return nil, fmt.Errorf("`identity_ids` can only be specified when `type` includes `UserAssigned`; but `type` is currently %q", managedServiceIdentity.Type)
}

return &managedServiceIdentity, nil
return &out, nil
}

func flattenAzureRmApiManagementMachineIdentity(identity *apimanagement.ServiceIdentity) ([]interface{}, error) {
if identity == nil || identity.Type == apimanagement.ApimIdentityTypeNone {
return make([]interface{}, 0), nil
}

result := make(map[string]interface{})
result["type"] = string(identity.Type)

if identity.PrincipalID != nil {
result["principal_id"] = identity.PrincipalID.String()
}
func flattenIdentity(input *apimanagement.ServiceIdentity) (*[]interface{}, error) {
var transform *identity.SystemAndUserAssignedMap

if identity.TenantID != nil {
result["tenant_id"] = identity.TenantID.String()
}

identityIds := make([]interface{}, 0)
if identity.UserAssignedIdentities != nil {
for key := range identity.UserAssignedIdentities {
parsedId, err := msiparse.UserAssignedIdentityIDInsensitively(key)
if err != nil {
return nil, err
if input != nil {
transform = &identity.SystemAndUserAssignedMap{
Type: identity.Type(string(input.Type)),
IdentityIds: make(map[string]identity.UserAssignedIdentityDetails),
}
if input.PrincipalID != nil {
transform.PrincipalId = input.PrincipalID.String()
}
if input.TenantID != nil {
transform.TenantId = input.TenantID.String()
}
for k, v := range input.UserAssignedIdentities {
transform.IdentityIds[k] = identity.UserAssignedIdentityDetails{
ClientId: v.ClientID,
PrincipalId: v.PrincipalID,
}
identityIds = append(identityIds, parsedId.ID())
}
result["identity_ids"] = pluginsdk.NewSet(pluginsdk.HashString, identityIds)
}

return []interface{}{result}, nil
return identity.FlattenSystemAndUserAssignedMap(transform)
}

func expandAzureRmApiManagementSkuName(d *pluginsdk.ResourceData) *apimanagement.ServiceSkuProperties {
Expand Down
65 changes: 47 additions & 18 deletions internal/services/appconfiguration/app_configuration_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import (
"strings"
"time"

"github.com/hashicorp/go-azure-helpers/resourcemanager/identity"

"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema"
"github.com/hashicorp/go-azure-helpers/resourcemanager/tags"
"github.com/hashicorp/terraform-provider-azurerm/helpers/azure"
"github.com/hashicorp/terraform-provider-azurerm/helpers/tf"
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
"github.com/hashicorp/terraform-provider-azurerm/internal/identity"
legacyIdentity "github.com/hashicorp/terraform-provider-azurerm/internal/identity"
"github.com/hashicorp/terraform-provider-azurerm/internal/location"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/appconfiguration/sdk/2020-06-01/configurationstores"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/appconfiguration/validate"
Expand All @@ -21,8 +23,6 @@ import (
"github.com/hashicorp/terraform-provider-azurerm/internal/timeouts"
)

type appConfigurationIdentityType = identity.SystemAssignedUserAssigned

func resourceAppConfiguration() *pluginsdk.Resource {
return &pluginsdk.Resource{
Create: resourceAppConfigurationCreate,
Expand Down Expand Up @@ -52,11 +52,9 @@ func resourceAppConfiguration() *pluginsdk.Resource {

"location": azure.SchemaLocation(),

"identity": appConfigurationIdentityType{}.Schema(),
"resource_group_name": azure.SchemaResourceGroupName(),

// the API changed and now returns the rg in lowercase
// revert when https://github.com/Azure/azure-sdk-for-go/issues/6606 is fixed
"resource_group_name": azure.SchemaResourceGroupNameDiffSuppress(),
"identity": commonschema.SystemAssignedUserAssignedIdentityOptional(),

"sku": {
Type: pluginsdk.TypeString,
Expand Down Expand Up @@ -292,7 +290,11 @@ func resourceAppConfigurationRead(d *pluginsdk.ResourceData, meta interface{}) e
d.Set("secondary_read_key", accessKeys.secondaryReadKey)
d.Set("secondary_write_key", accessKeys.secondaryWriteKey)

if err := d.Set("identity", flattenAppConfigurationIdentity(model.Identity)); err != nil {
flattenedIdentity, err := flattenAppConfigurationIdentity(model.Identity)
if err != nil {
return fmt.Errorf("flattening `identity`: %+v", err)
}
if err := d.Set("identity", flattenedIdentity); err != nil {
return fmt.Errorf("setting `identity`: %+v", err)
}

Expand Down Expand Up @@ -389,22 +391,49 @@ func flattenAppConfigurationAccessKey(input configurationstores.ApiKey) []interf
}
}

func expandAppConfigurationIdentity(input []interface{}) (*identity.SystemUserAssignedIdentityMap, error) {
expanded, err := appConfigurationIdentityType{}.Expand(input)
func expandAppConfigurationIdentity(input []interface{}) (*legacyIdentity.SystemUserAssignedIdentityMap, error) {
expanded, err := identity.ExpandSystemAndUserAssignedMap(input)
if err != nil {
return nil, err
}

result := identity.SystemUserAssignedIdentityMap{}
result.FromExpandedConfig(*expanded)
return &result, nil
transform := legacyIdentity.ExpandedConfig{
Type: legacyIdentity.Type(string(expanded.Type)),
PrincipalId: expanded.PrincipalId,
TenantId: expanded.TenantId,
}
if expanded.Type == identity.TypeUserAssigned || expanded.Type == identity.TypeSystemAssignedUserAssigned {
transform.UserAssignedIdentityIds = make([]string, 0)
for k := range expanded.IdentityIds {
transform.UserAssignedIdentityIds = append(transform.UserAssignedIdentityIds, k)
}
}
out := legacyIdentity.SystemUserAssignedIdentityMap{}
out.FromExpandedConfig(transform)
return &out, nil
}

func flattenAppConfigurationIdentity(identity *identity.SystemUserAssignedIdentityMap) []interface{} {
if identity == nil {
return []interface{}{}
func flattenAppConfigurationIdentity(input *legacyIdentity.SystemUserAssignedIdentityMap) (*[]interface{}, error) {
var transform *identity.SystemAndUserAssignedMap

if input != nil {
transform = &identity.SystemAndUserAssignedMap{
Type: identity.Type(string(input.Type)),
IdentityIds: make(map[string]identity.UserAssignedIdentityDetails),
}
if input.PrincipalId != nil {
transform.PrincipalId = *input.PrincipalId
}
if input.TenantId != nil {
transform.TenantId = *input.TenantId
}
for k, v := range input.UserAssignedIdentities {
transform.IdentityIds[k] = identity.UserAssignedIdentityDetails{
ClientId: v.ClientId,
PrincipalId: v.PrincipalId,
}
}
}

config := identity.ToExpandedConfig()
return appConfigurationIdentityType{}.Flatten(&config)
return identity.FlattenSystemAndUserAssignedMap(transform)
}
Loading