func()

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
}