in src/PSRule.Rules.Azure/Data/Template/TemplateVisitor.cs [1354:1398]
private static DeploymentScope GetDeploymentScope(TemplateContext context, JObject resource, string type, out string managementGroup, out string subscriptionId, out string resourceGroupName)
{
if (!IsDeploymentResource(type))
{
if (context.Deployment.DeploymentScope == DeploymentScope.ManagementGroup)
{
managementGroup = context.ManagementGroup.Name;
resourceGroupName = null;
subscriptionId = null;
return context.Deployment.DeploymentScope;
}
managementGroup = null;
resourceGroupName = context.ResourceGroup.Name;
subscriptionId = context.Subscription.SubscriptionId;
return context.Deployment.DeploymentScope;
}
// Handle special case for cross-scope deployments which may have an alternative subscription or resource group set.
subscriptionId = ResolveDeploymentScopeProperty(context, resource, PROPERTY_SUBSCRIPTION_ID, contextValue:
context.Deployment.DeploymentScope == DeploymentScope.Subscription ||
context.Deployment.DeploymentScope == DeploymentScope.ResourceGroup ? context.Subscription.SubscriptionId : null);
resourceGroupName = ResolveDeploymentScopeProperty(context, resource, PROPERTY_RESOURCE_GROUP, contextValue:
context.Deployment.DeploymentScope == DeploymentScope.ResourceGroup ? context.ResourceGroup.Name : null);
managementGroup = ResolveDeploymentScopeProperty(context, resource, PROPERTY_MANAGEMENT_GROUP, contextValue:
context.Deployment.DeploymentScope == DeploymentScope.ManagementGroup ? context.ManagementGroup.Name : null);
// Update the deployment scope.
if (context.Deployment.DeploymentScope == DeploymentScope.ResourceGroup || resourceGroupName != null)
{
return DeploymentScope.ResourceGroup;
}
if (context.Deployment.DeploymentScope == DeploymentScope.Subscription || subscriptionId != null)
{
return DeploymentScope.Subscription;
}
if (context.Deployment.DeploymentScope == DeploymentScope.ManagementGroup || managementGroup != null)
{
return DeploymentScope.ManagementGroup;
}
return context.Deployment.DeploymentScope;
}