in desktop/src/app/utils/arm-resource-utils/arm-resource-utils.ts [147:197]
private static _resourceDescriptorParser(id: string): ResourceDescriptor {
if (!this.isResourceId(id)) {
throw new InvalidArmResourceIdError("Invalid resource id: " + id);
}
// extract the subscription id and resource group id, if available.
let tokens = ArmResourceUtils.regExpSubscriptionAndResourceGroupExtractor.exec(id);
const result = new ResourceDescriptor();
result.subscription = tokens && tokens[1] || undefined;
result.resourceGroup = tokens && tokens[2] || undefined;
// prefix all ids with '/providers/Microsoft.Resources'. This allows us to generically look
// for the last '/providers' token and whatever follows (the resources) in any type of resource.
id = "/providers/Microsoft.Resources" + id;
// extract the provider and resources. produces [ id, provider, resources ]
tokens = ArmResourceUtils.regExpProviderExtractor.exec(id);
if (!tokens) {
throw new InvalidArmResourceIdError("Invalid resource id: " + id);
}
result.provider = tokens[1];
const resources = tokens[2];
// extract all resource types and instances.
let partialType = result.provider;
result.type = undefined;
result.types = [];
result.resource = null;
result.resources = [];
result.resourceMap = {};
// eslint-disable-next-line
while (tokens = ArmResourceUtils.regExpResourceTypeExtractor.exec(resources)) {
if (!tokens) {
throw new InvalidArmResourceIdError("Invalid resource id: " + id);
}
result.types.push(tokens[1]);
result.type = tokens[1]; // Keeps last.
result.resources.push(tokens[2]);
result.resource = tokens[2]; // Keeps last.
partialType += "/" + result.type;
result.resourceMap[partialType] = result.resource;
}
return result;
}