in src/PSRule.Rules.Azure/Data/Template/TemplateVisitor.cs [1293:1342]
private static ResourceValue ResourceInstance(TemplateContext context, JObject resource, CopyIndexState copyIndex, string symbolicName)
{
if (resource.TryGetProperty<JValue>(PROPERTY_NAME, out var nameValue))
resource[PROPERTY_NAME] = ResolveToken(context, nameValue);
if (resource.TryGetProperty<JArray>(PROPERTY_DEPENDS_ON, out var dependsOn))
resource[PROPERTY_DEPENDS_ON] = ExpandArray(context, dependsOn);
resource.TryNameProperty(out var name);
resource.TryTypeProperty(out var type);
var deploymentScope = GetDeploymentScope(context, resource, type, out var managementGroup, out var subscriptionId, out var resourceGroupName);
// Get scope if specified.
var scope = context.TryParentResourceId(resource, out var parentIds) && parentIds != null && parentIds.Length > 0 ? parentIds[0] : null;
string resourceId = null;
// Handle special case when resource type is a resource group.
if (StringComparer.OrdinalIgnoreCase.Equals(type, TYPE_RESOURCE_GROUPS))
{
resourceId = ResourceHelper.ResourceGroupId(subscriptionId: subscriptionId, resourceGroup: name);
}
else if (deploymentScope == DeploymentScope.ResourceGroup)
{
resourceId = ResourceHelper.ResourceId(tenant: null, managementGroup: null, subscriptionId: subscriptionId, resourceGroup: resourceGroupName, resourceType: type, resourceName: name, scopeId: scope);
}
else if (deploymentScope == DeploymentScope.Subscription)
{
resourceId = ResourceHelper.ResourceId(tenant: null, managementGroup: null, subscriptionId: subscriptionId, resourceGroup: null, resourceType: type, resourceName: name, scopeId: null);
}
else if (deploymentScope == DeploymentScope.ManagementGroup)
{
resourceId = ResourceHelper.ResourceId(tenant: null, managementGroup: managementGroup, subscriptionId: null, resourceGroup: null, resourceType: type, resourceName: name, scopeId: scope);
}
else if (deploymentScope == DeploymentScope.Tenant)
{
resourceId = ResourceHelper.ResourceId(tenant: "/", managementGroup: null, subscriptionId: null, resourceGroup: null, resourceType: type, resourceName: name, scopeId: "/");
}
_ = context.UpdateResourceScope(resource);
resource[PROPERTY_ID] = resourceId;
var result = new ResourceValue(resourceId, name, type, symbolicName, resource, copyIndex.Clone());
// Map dependencies if any are defined.
resource.TryGetDependencies(out var dependencies);
context.TrackDependencies(result, dependencies);
return result;
}