in internal/resources/providers/azurelib/governance/management_group.go [81:123]
func (p *provider) scan(ctx context.Context) (map[string]Subscription, error) {
const (
managementGroupType = "microsoft.management/managementgroups"
subscriptionType = "microsoft.resources/subscriptions"
ancestorChainPropertyName = "managementGroupAncestorsChain"
)
assets, err := p.client.ListAllAssetTypesByName(
ctx,
"resourcecontainers",
[]string{managementGroupType, subscriptionType},
)
if err != nil {
return nil, fmt.Errorf("failed to scan resources: %w", err)
}
managementGroups := make(map[string]ManagementGroup)
for _, asset := range lo.Filter(assets, typeFilter(managementGroupType)) {
managementGroups[asset.Name] = ManagementGroup{
FullyQualifiedID: asset.Id,
DisplayName: strings.FirstNonEmpty(asset.DisplayName, asset.Name),
}
}
subscriptions := make(map[string]Subscription)
for _, asset := range lo.Filter(assets, typeFilter(subscriptionType)) {
chain, ok := asset.Properties[ancestorChainPropertyName].([]any)
if !ok || len(chain) == 0 {
continue
}
parent, _ := chain[0].(map[string]any)
mg := managementGroups[strings.FromMap(parent, "name")]
subscriptions[asset.SubscriptionId] = Subscription{
FullyQualifiedID: asset.Id,
ShortID: asset.SubscriptionId,
DisplayName: strings.FirstNonEmpty(asset.DisplayName, asset.Name),
ManagementGroup: mg,
}
}
return subscriptions, nil
}