// Tries to load Function Maps from local folder private static async Task<FunctionMapsMap> GetFunctionMapsFromFolderAsync(string folderName) { var result = new FunctionMapsMap(); string binFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string functionMapsFolder = Path.Combine(binFolder, "..", folderName, Globals.FunctionMapFolderName); if (!Directory.Exists(functionMapsFolder)) { return result; } foreach(var filePath in Directory.EnumerateFiles(functionMapsFolder, $"{Globals.FunctionMapFilePrefix}*.json")) { var nameParts = Path.GetFileName(filePath).Split('.'); if (nameParts.Length < 2) { continue; } string taskHubName = nameParts.Length > 2 ? nameParts[1] : string.Empty; string json = await File.ReadAllTextAsync(filePath); result.TryAdd(taskHubName, json); } return result; }
// Tries to load Function Maps from underlying Azure Storage private static async Task<FunctionMapsMap> GetFunctionMapsFromStorageAsync() { var result = new FunctionMapsMap(); try { string connectionString = Environment.GetEnvironmentVariable(EnvVariableNames.AzureWebJobsStorage); var blobClient = CloudStorageAccount.Parse(connectionString).CreateCloudBlobClient(); // Listing all blobs in durable-functions-monitor/function-maps folder var container = blobClient.GetContainerReference(Globals.TemplateContainerName); string functionMapFolderName = Globals.FunctionMapFolderName + "/"; var fileNames = await container.ListBlobsAsync(functionMapFolderName); // Loading blobs in parallel await Task.WhenAll(fileNames.Select(async templateName => { var blob = await blobClient.GetBlobReferenceFromServerAsync(templateName.Uri); // Expecting the blob name to be like "dfm-function-map.[TaskHubName].json" or just "dfm-function-map.json" var nameParts = blob.Name.Substring(functionMapFolderName.Length).Split('.'); if (nameParts.Length < 2 || nameParts.First() != Globals.FunctionMapFilePrefix || nameParts.Last() != "json") { return; } string taskHubName = nameParts.Length > 2 ? nameParts[1] : string.Empty; using (var stream = new MemoryStream()) { await blob.DownloadToStreamAsync(stream); string templateText = Encoding.UTF8.GetString(stream.ToArray()); result.TryAdd(taskHubName, templateText); } })); } catch (Exception) { // Intentionally swallowing all exceptions here } return result; }