From ba049f02c44d20d0aec25d95399753168ced282e Mon Sep 17 00:00:00 2001 From: fbeltrao Date: Sun, 30 Dec 2018 21:07:21 +0100 Subject: [PATCH] Fix Redis sample, adding Queue example. Fixes #8 --- .vscode/settings.json | 4 ++ samples/EventGridSample/.vscode/settings.json | 4 ++ .../EventGridSample/EventGridSample.csproj | 2 +- samples/EventGridSample/local.settings.json | 5 +- samples/RedisSample/.vscode/extensions.json | 6 +++ samples/RedisSample/.vscode/launch.json | 11 +++++ samples/RedisSample/.vscode/settings.json | 8 ++++ samples/RedisSample/.vscode/tasks.json | 46 +++++++++++++++++++ .../QueueTriggerWithRedisFunctions.cs | 37 +++++++++++++++ samples/RedisSample/RedisSample.csproj | 3 +- samples/RedisSample/local.settings.json | 3 +- samples/SignalRSample/SignalRSample.csproj | 2 +- .../AzureFunctionExtensions.csproj | 2 +- .../Redis/RedisConfiguration.cs | 12 +---- .../Redis/RedisDatabaseManager.cs | 6 +-- .../Redis/RedisOutputAsyncCollector.cs | 10 +--- src/AzureFunctionExtensions/Startup.cs | 2 + .../AzureFunctionExtensions.Test.csproj | 6 +-- .../RedisOutputAsyncCollectorTest.cs | 23 ++++++---- 19 files changed, 148 insertions(+), 44 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 samples/EventGridSample/.vscode/settings.json create mode 100644 samples/RedisSample/.vscode/extensions.json create mode 100644 samples/RedisSample/.vscode/launch.json create mode 100644 samples/RedisSample/.vscode/settings.json create mode 100644 samples/RedisSample/.vscode/tasks.json create mode 100644 samples/RedisSample/QueueTriggerWithRedisFunctions.cs diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f198012 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "azureFunctions.projectLanguage": "C#", + "azureFunctions.projectRuntime": "~2" +} \ No newline at end of file diff --git a/samples/EventGridSample/.vscode/settings.json b/samples/EventGridSample/.vscode/settings.json new file mode 100644 index 0000000..7d83454 --- /dev/null +++ b/samples/EventGridSample/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "azureFunctions.projectLanguage": "C#Script", + "azureFunctions.projectRuntime": "~2" +} \ No newline at end of file diff --git a/samples/EventGridSample/EventGridSample.csproj b/samples/EventGridSample/EventGridSample.csproj index d3d04a7..d772fc3 100644 --- a/samples/EventGridSample/EventGridSample.csproj +++ b/samples/EventGridSample/EventGridSample.csproj @@ -4,7 +4,7 @@ v2 - + diff --git a/samples/EventGridSample/local.settings.json b/samples/EventGridSample/local.settings.json index 0ad9a26..add0190 100644 --- a/samples/EventGridSample/local.settings.json +++ b/samples/EventGridSample/local.settings.json @@ -1,10 +1,11 @@ { "IsEncrypted": false, "Values": { + "FUNCTIONS_WORKER_RUNTIME": "dotnet", "AzureWebJobsStorage": "UseDevelopmentStorage=true", "AzureWebJobsDashboard": "UseDevelopmentStorage=true", "AzureWebJobs_ExtensionsPath": ".", - "eventgrid_sas": "EFgFqSaABprKP0Ww7jgf8TCY9L6lE3cVrB4+nVeloxc=", - "eventgrid_endpoint": "https://frbtest.westeurope-1.eventgrid.azure.net/api/events" + "eventgrid_sas": "", + "eventgrid_endpoint": "https://xxxxx.westeurope-1.eventgrid.azure.net/api/events" } } \ No newline at end of file diff --git a/samples/RedisSample/.vscode/extensions.json b/samples/RedisSample/.vscode/extensions.json new file mode 100644 index 0000000..3a030cc --- /dev/null +++ b/samples/RedisSample/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "ms-azuretools.vscode-azurefunctions", + "ms-vscode.csharp" + ] +} diff --git a/samples/RedisSample/.vscode/launch.json b/samples/RedisSample/.vscode/launch.json new file mode 100644 index 0000000..761e83b --- /dev/null +++ b/samples/RedisSample/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to C# Functions", + "type": "coreclr", + "request": "attach", + "processId": "${command:azureFunctions.pickProcess}" + } + ] +} diff --git a/samples/RedisSample/.vscode/settings.json b/samples/RedisSample/.vscode/settings.json new file mode 100644 index 0000000..bff468d --- /dev/null +++ b/samples/RedisSample/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "azureFunctions.projectRuntime": "~2", + "azureFunctions.projectLanguage": "C#", + "azureFunctions.templateFilter": "Verified", + "azureFunctions.deploySubpath": "bin/Release/netstandard2.0/publish", + "azureFunctions.preDeployTask": "publish", + "debug.internalConsoleOptions": "neverOpen" +} diff --git a/samples/RedisSample/.vscode/tasks.json b/samples/RedisSample/.vscode/tasks.json new file mode 100644 index 0000000..f97abf5 --- /dev/null +++ b/samples/RedisSample/.vscode/tasks.json @@ -0,0 +1,46 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "clean", + "command": "dotnet clean", + "type": "shell", + "problemMatcher": "$msCompile" + }, + { + "label": "build", + "command": "dotnet build", + "type": "shell", + "dependsOn": "clean", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": "$msCompile" + }, + { + "label": "clean release", + "command": "dotnet clean --configuration Release", + "type": "shell", + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet publish --configuration Release", + "type": "shell", + "dependsOn": "clean release", + "problemMatcher": "$msCompile" + }, + { + "label": "runFunctionsHost", + "type": "shell", + "dependsOn": "build", + "options": { + "cwd": "${workspaceFolder}/bin/Debug/netstandard2.0" + }, + "command": "func host start", + "isBackground": true, + "problemMatcher": "$func-watch" + } + ] +} diff --git a/samples/RedisSample/QueueTriggerWithRedisFunctions.cs b/samples/RedisSample/QueueTriggerWithRedisFunctions.cs new file mode 100644 index 0000000..4364f89 --- /dev/null +++ b/samples/RedisSample/QueueTriggerWithRedisFunctions.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading.Tasks; +using Fbeltrao.AzureFunctionExtensions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Azure.WebJobs; +using Microsoft.Azure.WebJobs.Extensions.Http; +using Microsoft.Azure.WebJobs.Host; +using Microsoft.Extensions.Logging; +using StackExchange.Redis; + +namespace Fbeltrao.RedisSample +{ + public static class QueueTriggerWithRedisFunctions + { + [FunctionName(nameof(MoveQueueItemToRedis))] + public static async Task MoveQueueItemToRedis( + [QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem, + [RedisDatabase(Connection = "%redis_connectionstring%")] IDatabase db, + ILogger log) + { + await db.ListRightPushAsync("my-queue", myQueueItem); + log.LogInformation($"Queue trigger pushed to redis list: {myQueueItem}"); + } + + + [FunctionName(nameof(GetRedisList))] + public static async Task GetRedisList( + [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, + [RedisDatabase(Connection = "%redis_connectionstring%")] IDatabase db, + ILogger log) + { + var values = await db.ListRangeAsync("my-queue"); + return new OkObjectResult(new { values }); + } + } +} diff --git a/samples/RedisSample/RedisSample.csproj b/samples/RedisSample/RedisSample.csproj index 6163ca6..e26077d 100644 --- a/samples/RedisSample/RedisSample.csproj +++ b/samples/RedisSample/RedisSample.csproj @@ -9,7 +9,8 @@ - + + diff --git a/samples/RedisSample/local.settings.json b/samples/RedisSample/local.settings.json index a97382e..caf6535 100644 --- a/samples/RedisSample/local.settings.json +++ b/samples/RedisSample/local.settings.json @@ -1,10 +1,11 @@ { "IsEncrypted": false, "Values": { + "FUNCTIONS_WORKER_RUNTIME": "dotnet", "AzureWebJobsStorage": "UseDevelopmentStorage=true", "AzureWebJobsDashboard": "UseDevelopmentStorage=true", "AzureWebJobs_ExtensionsPath": ".", - "redis_connectionstring": "10.211.55.2:6379", + "redis_connectionstring": "192.168.1.124:6379", "redis_setvalueinredis_key": "mySample" } } \ No newline at end of file diff --git a/samples/SignalRSample/SignalRSample.csproj b/samples/SignalRSample/SignalRSample.csproj index 32cd4ab..4948a3a 100644 --- a/samples/SignalRSample/SignalRSample.csproj +++ b/samples/SignalRSample/SignalRSample.csproj @@ -4,7 +4,7 @@ v2 - + diff --git a/src/AzureFunctionExtensions/AzureFunctionExtensions.csproj b/src/AzureFunctionExtensions/AzureFunctionExtensions.csproj index 389d7ea..b347d0e 100644 --- a/src/AzureFunctionExtensions/AzureFunctionExtensions.csproj +++ b/src/AzureFunctionExtensions/AzureFunctionExtensions.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/AzureFunctionExtensions/Redis/RedisConfiguration.cs b/src/AzureFunctionExtensions/Redis/RedisConfiguration.cs index 864bed8..2022649 100644 --- a/src/AzureFunctionExtensions/Redis/RedisConfiguration.cs +++ b/src/AzureFunctionExtensions/Redis/RedisConfiguration.cs @@ -12,15 +12,7 @@ namespace Fbeltrao.AzureFunctionExtensions public class RedisConfiguration : IExtensionConfigProvider { private readonly IRedisDatabaseManager redisDatabaseManager; - - /// - /// Constructor - /// - public RedisConfiguration() : this(RedisDatabaseManager.GetInstance()) - { - - } - + /// /// Constructor /// @@ -69,7 +61,7 @@ public void Initialize(ExtensionConfigContext context) // Redis output binding context .AddBindingRule() - .BindToCollector(attr => new RedisOutputAsyncCollector(this, attr)); + .BindToCollector(attr => new RedisOutputAsyncCollector(this, attr, this.redisDatabaseManager)); // Redis database (input) binding context diff --git a/src/AzureFunctionExtensions/Redis/RedisDatabaseManager.cs b/src/AzureFunctionExtensions/Redis/RedisDatabaseManager.cs index 90c8c20..38c0bea 100644 --- a/src/AzureFunctionExtensions/Redis/RedisDatabaseManager.cs +++ b/src/AzureFunctionExtensions/Redis/RedisDatabaseManager.cs @@ -15,15 +15,11 @@ public class RedisDatabaseManager : IRedisDatabaseManager /// /// Constructor /// - protected RedisDatabaseManager() + public RedisDatabaseManager() { connections = new System.Collections.Concurrent.ConcurrentDictionary>(); } - static RedisDatabaseManager instance = new RedisDatabaseManager(); - public static IRedisDatabaseManager GetInstance() => instance; - - /// /// Gets the redis database /// diff --git a/src/AzureFunctionExtensions/Redis/RedisOutputAsyncCollector.cs b/src/AzureFunctionExtensions/Redis/RedisOutputAsyncCollector.cs index 800668a..ce08736 100644 --- a/src/AzureFunctionExtensions/Redis/RedisOutputAsyncCollector.cs +++ b/src/AzureFunctionExtensions/Redis/RedisOutputAsyncCollector.cs @@ -24,15 +24,7 @@ public class RedisOutputAsyncCollector : IAsyncCollector /// /// /// - public RedisOutputAsyncCollector(RedisConfiguration config, RedisOutputAttribute attr) : this(config, attr, RedisDatabaseManager.GetInstance()) - { - } - - /// - /// Constructor - /// - /// - /// + /// public RedisOutputAsyncCollector(RedisConfiguration config, RedisOutputAttribute attr, IRedisDatabaseManager redisDatabaseManager) { this.config = config; diff --git a/src/AzureFunctionExtensions/Startup.cs b/src/AzureFunctionExtensions/Startup.cs index a3c45ad..1f1422c 100644 --- a/src/AzureFunctionExtensions/Startup.cs +++ b/src/AzureFunctionExtensions/Startup.cs @@ -1,5 +1,6 @@ using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Hosting; +using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; @@ -19,6 +20,7 @@ public void Configure(IWebJobsBuilder builder) builder.AddExtension(); builder.AddExtension(); builder.AddExtension(); + builder.Services.AddSingleton(typeof(IRedisDatabaseManager), typeof(RedisDatabaseManager)); } } } diff --git a/test/AzureFunctionExtensions.Test/AzureFunctionExtensions.Test.csproj b/test/AzureFunctionExtensions.Test/AzureFunctionExtensions.Test.csproj index 2db84a6..f3b94be 100644 --- a/test/AzureFunctionExtensions.Test/AzureFunctionExtensions.Test.csproj +++ b/test/AzureFunctionExtensions.Test/AzureFunctionExtensions.Test.csproj @@ -12,9 +12,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers diff --git a/test/AzureFunctionExtensions.Test/RedisOutputAsyncCollectorTest.cs b/test/AzureFunctionExtensions.Test/RedisOutputAsyncCollectorTest.cs index 5568208..8599fbc 100644 --- a/test/AzureFunctionExtensions.Test/RedisOutputAsyncCollectorTest.cs +++ b/test/AzureFunctionExtensions.Test/RedisOutputAsyncCollectorTest.cs @@ -15,7 +15,8 @@ public class RedisOutputAsyncCollectorTest [Fact] public async Task SetKeyValue_ConnectionInConfig_KeyInAttribute_OperationInAttribute_SetsValue() { - var config = new RedisConfiguration() + var connectionManager = new Mock(); + var config = new RedisConfiguration(connectionManager.Object) { Connection = "localhost:3679", }; @@ -28,7 +29,7 @@ public async Task SetKeyValue_ConnectionInConfig_KeyInAttribute_OperationInAttri var redisDatabase = new RedisDatabaseMock(); - var connectionManager = new Mock(); + connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1)) .Returns(redisDatabase); @@ -49,7 +50,8 @@ await target.AddAsync(new RedisOutput() [Fact] public async Task IncrementValue_ConnectionInConfig_KeyInAttribute_OperationInAttribute_WithoutIncrementValue_IncrementsOne() { - var config = new RedisConfiguration() + var connectionManager = new Mock(); + var config = new RedisConfiguration(connectionManager.Object) { Connection = "localhost:3679", }; @@ -62,7 +64,7 @@ public async Task IncrementValue_ConnectionInConfig_KeyInAttribute_OperationInAt var redisDatabase = new RedisDatabaseMock(); - var connectionManager = new Mock(); + connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1)) .Returns(redisDatabase); @@ -82,7 +84,8 @@ await target.AddAsync(new RedisOutput() [Fact] public async Task IncrementValue_ConnectionInConfig_KeyInAttribute_OperationInAttribute_By10_Increments10() { - var config = new RedisConfiguration() + var connectionManager = new Mock(); + var config = new RedisConfiguration(connectionManager.Object) { Connection = "localhost:3679", }; @@ -95,7 +98,7 @@ public async Task IncrementValue_ConnectionInConfig_KeyInAttribute_OperationInAt var redisDatabase = new RedisDatabaseMock(); - var connectionManager = new Mock(); + connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1)) .Returns(redisDatabase); @@ -117,7 +120,8 @@ await target.AddAsync(new RedisOutput() [Fact] public async Task ListRightPush_ConnectionInConfig_KeyInAttribute_OperationInAttribute_AddsItemToEndOfList() { - var config = new RedisConfiguration() + var connectionManager = new Mock(); + var config = new RedisConfiguration(connectionManager.Object) { Connection = "localhost:3679", }; @@ -130,7 +134,6 @@ public async Task ListRightPush_ConnectionInConfig_KeyInAttribute_OperationInAtt var redisDatabase = new RedisDatabaseMock(); - var connectionManager = new Mock(); connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1)) .Returns(redisDatabase); @@ -159,7 +162,8 @@ await target.AddAsync(new RedisOutput() [Fact] public async Task ListLeftPush_ConnectionInConfig_KeyInAttribute_OperationInAttribute_AddsItemToStartOfList() { - var config = new RedisConfiguration() + var connectionManager = new Mock(); + var config = new RedisConfiguration(connectionManager.Object) { Connection = "localhost:3679", }; @@ -172,7 +176,6 @@ public async Task ListLeftPush_ConnectionInConfig_KeyInAttribute_OperationInAttr var redisDatabase = new RedisDatabaseMock(); - var connectionManager = new Mock(); connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1)) .Returns(redisDatabase);