Skip to content

Commit b4e06ac

Browse files
authored
Merge pull request #1163 from stu-mck/allowPreProvisionedAWSClients
Enable supply of pre-provisoned AWS clients
2 parents 9cb9cbe + e1829f8 commit b4e06ac

10 files changed

+64
-23
lines changed

src/providers/WorkflowCore.Providers.AWS/README.md

+12
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ services.AddWorkflow(cfg =>
3434
If any AWS resources do not exists, they will be automatcially created. By default, all DynamoDB tables and indexes will be provisioned with a throughput of 1, you can modify these values from the AWS console.
3535
You may also specify a prefix for the dynamo table names.
3636

37+
If you have a preconfigured dynamoClient, you can pass this in instead of the credentials and config
38+
```C#
39+
var client = new AmazonDynamoDBClient();
40+
var sqsClient = new AmazonSQSClient();
41+
services.AddWorkflow(cfg =>
42+
{
43+
cfg.UseAwsDynamoPersistenceWithProvisionedClient(client, "table-prefix");
44+
cfg.UseAwsDynamoLockingWithProvisionedClient(client, "workflow-core-locks");
45+
cfg.UseAwsSimpleQueueServiceWithProvisionedClient(sqsClient, "queues-prefix");
46+
});
47+
```
48+
3749

3850
## Usage (Kinesis)
3951

src/providers/WorkflowCore.Providers.AWS/ServiceCollectionExtensions.cs

+35-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using Amazon;
33
using Amazon.DynamoDBv2;
4+
using Amazon.Kinesis;
45
using Amazon.Runtime;
56
using Amazon.SQS;
67
using Microsoft.Extensions.Logging;
@@ -15,28 +16,55 @@ public static class ServiceCollectionExtensions
1516
{
1617
public static WorkflowOptions UseAwsSimpleQueueService(this WorkflowOptions options, AWSCredentials credentials, AmazonSQSConfig config, string queuesPrefix = "workflowcore")
1718
{
18-
options.UseQueueProvider(sp => new SQSQueueProvider(credentials, config, sp.GetService<ILoggerFactory>(), queuesPrefix));
19+
var sqsClient = new AmazonSQSClient(credentials, config);
20+
return options.UseAwsSimpleQueueServiceWithProvisionedClient(sqsClient, queuesPrefix);
21+
}
22+
23+
public static WorkflowOptions UseAwsSimpleQueueServiceWithProvisionedClient(this WorkflowOptions options, AmazonSQSClient sqsClient, string queuesPrefix = "workflowcore")
24+
{
25+
options.UseQueueProvider(sp => new SQSQueueProvider(sqsClient, sp.GetService<ILoggerFactory>(), queuesPrefix));
1926
return options;
2027
}
2128

2229
public static WorkflowOptions UseAwsDynamoLocking(this WorkflowOptions options, AWSCredentials credentials, AmazonDynamoDBConfig config, string tableName)
2330
{
24-
options.UseDistributedLockManager(sp => new DynamoLockProvider(credentials, config, tableName, sp.GetService<ILoggerFactory>(), sp.GetService<IDateTimeProvider>()));
31+
var dbClient = new AmazonDynamoDBClient(credentials, config);
32+
return options.UseAwsDynamoLockingWithProvisionedClient(dbClient, tableName);
33+
}
34+
35+
public static WorkflowOptions UseAwsDynamoLockingWithProvisionedClient (this WorkflowOptions options, AmazonDynamoDBClient dynamoClient, string tableName)
36+
{
37+
options.UseDistributedLockManager(sp => new DynamoLockProvider(dynamoClient, tableName, sp.GetService<ILoggerFactory>(), sp.GetService<IDateTimeProvider>()));
2538
return options;
2639
}
2740

2841
public static WorkflowOptions UseAwsDynamoPersistence(this WorkflowOptions options, AWSCredentials credentials, AmazonDynamoDBConfig config, string tablePrefix)
2942
{
30-
options.Services.AddTransient<IDynamoDbProvisioner>(sp => new DynamoDbProvisioner(credentials, config, tablePrefix, sp.GetService<ILoggerFactory>()));
31-
options.UsePersistence(sp => new DynamoPersistenceProvider(credentials, config, sp.GetService<IDynamoDbProvisioner>(), tablePrefix, sp.GetService<ILoggerFactory>()));
43+
var dbClient = new AmazonDynamoDBClient(credentials, config);
44+
return options.UseAwsDynamoPersistenceWithProvisionedClient(dbClient, tablePrefix);
45+
}
46+
47+
public static WorkflowOptions UseAwsDynamoPersistenceWithProvisionedClient(this WorkflowOptions options, AmazonDynamoDBClient dynamoClient, string tablePrefix)
48+
{
49+
options.Services.AddTransient<IDynamoDbProvisioner>(sp => new DynamoDbProvisioner(dynamoClient, tablePrefix, sp.GetService<ILoggerFactory>()));
50+
options.UsePersistence(sp => new DynamoPersistenceProvider(dynamoClient, sp.GetService<IDynamoDbProvisioner>(), tablePrefix, sp.GetService<ILoggerFactory>()));
3251
return options;
3352
}
3453

3554
public static WorkflowOptions UseAwsKinesis(this WorkflowOptions options, AWSCredentials credentials, RegionEndpoint region, string appName, string streamName)
3655
{
37-
options.Services.AddTransient<IKinesisTracker>(sp => new KinesisTracker(credentials, region, "workflowcore_kinesis", sp.GetService<ILoggerFactory>()));
38-
options.Services.AddTransient<IKinesisStreamConsumer>(sp => new KinesisStreamConsumer(credentials, region, sp.GetService<IKinesisTracker>(), sp.GetService<IDistributedLockProvider>(), sp.GetService<ILoggerFactory>(), sp.GetService<IDateTimeProvider>()));
39-
options.UseEventHub(sp => new KinesisProvider(credentials, region, appName, streamName, sp.GetService<IKinesisStreamConsumer>(), sp.GetService<ILoggerFactory>()));
56+
var kinesisClient = new AmazonKinesisClient(credentials, region);
57+
var dynamoClient = new AmazonDynamoDBClient(credentials, region);
58+
59+
return options.UseAwsKinesisWithProvisionedClients(kinesisClient, dynamoClient,appName, streamName);
60+
61+
}
62+
63+
public static WorkflowOptions UseAwsKinesisWithProvisionedClients(this WorkflowOptions options, AmazonKinesisClient kinesisClient, AmazonDynamoDBClient dynamoDbClient, string appName, string streamName)
64+
{
65+
options.Services.AddTransient<IKinesisTracker>(sp => new KinesisTracker(dynamoDbClient, "workflowcore_kinesis", sp.GetService<ILoggerFactory>()));
66+
options.Services.AddTransient<IKinesisStreamConsumer>(sp => new KinesisStreamConsumer(kinesisClient, sp.GetService<IKinesisTracker>(), sp.GetService<IDistributedLockProvider>(), sp.GetService<ILoggerFactory>(), sp.GetService<IDateTimeProvider>()));
67+
options.UseEventHub(sp => new KinesisProvider(kinesisClient, appName, streamName, sp.GetService<IKinesisStreamConsumer>(), sp.GetService<ILoggerFactory>()));
4068
return options;
4169
}
4270
}

src/providers/WorkflowCore.Providers.AWS/Services/DynamoDbProvisioner.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ public class DynamoDbProvisioner : IDynamoDbProvisioner
1515
private readonly IAmazonDynamoDB _client;
1616
private readonly string _tablePrefix;
1717

18-
public DynamoDbProvisioner(AWSCredentials credentials, AmazonDynamoDBConfig config, string tablePrefix, ILoggerFactory logFactory)
18+
public DynamoDbProvisioner(AmazonDynamoDBClient dynamoDBClient, string tablePrefix, ILoggerFactory logFactory)
1919
{
2020
_logger = logFactory.CreateLogger<DynamoDbProvisioner>();
21-
_client = new AmazonDynamoDBClient(credentials, config);
21+
_client = dynamoDBClient;
2222
_tablePrefix = tablePrefix;
2323
}
2424

src/providers/WorkflowCore.Providers.AWS/Services/DynamoLockProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ public class DynamoLockProvider : IDistributedLockProvider
2525
private readonly AutoResetEvent _mutex = new AutoResetEvent(true);
2626
private readonly IDateTimeProvider _dateTimeProvider;
2727

28-
public DynamoLockProvider(AWSCredentials credentials, AmazonDynamoDBConfig config, string tableName, ILoggerFactory logFactory, IDateTimeProvider dateTimeProvider)
28+
public DynamoLockProvider(AmazonDynamoDBClient dynamoDBClient, string tableName, ILoggerFactory logFactory, IDateTimeProvider dateTimeProvider)
2929
{
3030
_logger = logFactory.CreateLogger<DynamoLockProvider>();
31-
_client = new AmazonDynamoDBClient(credentials, config);
31+
_client = dynamoDBClient;
3232
_localLocks = new List<string>();
3333
_tableName = tableName;
3434
_nodeId = Guid.NewGuid().ToString();

src/providers/WorkflowCore.Providers.AWS/Services/DynamoPersistenceProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ public class DynamoPersistenceProvider : IPersistenceProvider
2626

2727
public bool SupportsScheduledCommands => false;
2828

29-
public DynamoPersistenceProvider(AWSCredentials credentials, AmazonDynamoDBConfig config, IDynamoDbProvisioner provisioner, string tablePrefix, ILoggerFactory logFactory)
29+
public DynamoPersistenceProvider(AmazonDynamoDBClient dynamoDBClient, IDynamoDbProvisioner provisioner, string tablePrefix, ILoggerFactory logFactory)
3030
{
3131
_logger = logFactory.CreateLogger<DynamoPersistenceProvider>();
32-
_client = new AmazonDynamoDBClient(credentials, config);
32+
_client = dynamoDBClient;
3333
_tablePrefix = tablePrefix;
3434
_provisioner = provisioner;
3535
}

src/providers/WorkflowCore.Providers.AWS/Services/KinesisProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ public class KinesisProvider : ILifeCycleEventHub
2626
private readonly int _defaultShardCount = 1;
2727
private bool _started = false;
2828

29-
public KinesisProvider(AWSCredentials credentials, RegionEndpoint region, string appName, string streamName, IKinesisStreamConsumer consumer, ILoggerFactory logFactory)
29+
public KinesisProvider(AmazonKinesisClient kinesisClient, string appName, string streamName, IKinesisStreamConsumer consumer, ILoggerFactory logFactory)
3030
{
3131
_logger = logFactory.CreateLogger(GetType());
3232
_appName = appName;
3333
_streamName = streamName;
3434
_consumer = consumer;
3535
_serializer = new JsonSerializer();
3636
_serializer.TypeNameHandling = TypeNameHandling.All;
37-
_client = new AmazonKinesisClient(credentials, region);
37+
_client = kinesisClient;
3838
}
3939

4040
public async Task PublishNotification(LifeCycleEvent evt)

src/providers/WorkflowCore.Providers.AWS/Services/KinesisStreamConsumer.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ public class KinesisStreamConsumer : IKinesisStreamConsumer, IDisposable
2525
private ICollection<ShardSubscription> _subscribers = new HashSet<ShardSubscription>();
2626
private readonly IDateTimeProvider _dateTimeProvider;
2727

28-
public KinesisStreamConsumer(AWSCredentials credentials, RegionEndpoint region, IKinesisTracker tracker, IDistributedLockProvider lockManager, ILoggerFactory logFactory, IDateTimeProvider dateTimeProvider)
28+
public KinesisStreamConsumer(AmazonKinesisClient kinesisClient, IKinesisTracker tracker, IDistributedLockProvider lockManager, ILoggerFactory logFactory, IDateTimeProvider dateTimeProvider)
2929
{
3030
_logger = logFactory.CreateLogger(GetType());
3131
_tracker = tracker;
3232
_lockManager = lockManager;
33-
_client = new AmazonKinesisClient(credentials, region);
33+
_client = kinesisClient;
3434
_processTask = new Task(Process);
3535
_processTask.Start();
3636
_dateTimeProvider = dateTimeProvider;

src/providers/WorkflowCore.Providers.AWS/Services/KinesisTracker.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ public class KinesisTracker : IKinesisTracker
1717
private readonly string _tableName;
1818
private bool _tableConfirmed = false;
1919

20-
public KinesisTracker(AWSCredentials credentials, RegionEndpoint region, string tableName, ILoggerFactory logFactory)
20+
public KinesisTracker(AmazonDynamoDBClient client, string tableName, ILoggerFactory logFactory)
2121
{
2222
_logger = logFactory.CreateLogger(GetType());
23-
_client = new AmazonDynamoDBClient(credentials, region);
23+
_client = client;
2424
_tableName = tableName;
2525
}
2626

src/providers/WorkflowCore.Providers.AWS/Services/SQSQueueProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ public class SQSQueueProvider : IQueueProvider
2121

2222
public bool IsDequeueBlocking => true;
2323

24-
public SQSQueueProvider(AWSCredentials credentials, AmazonSQSConfig config, ILoggerFactory logFactory, string queuesPrefix)
24+
public SQSQueueProvider(AmazonSQSClient sqsClient, ILoggerFactory logFactory, string queuesPrefix)
2525
{
2626
_logger = logFactory.CreateLogger<SQSQueueProvider>();
27-
_client = new AmazonSQSClient(credentials, config);
27+
_client = sqsClient;
2828
_queuesPrefix = queuesPrefix;
2929
}
3030

test/WorkflowCore.Tests.DynamoDB/DynamoPersistenceProviderFixture.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ protected override IPersistenceProvider Subject
2626
if (_subject == null)
2727
{
2828
var cfg = new AmazonDynamoDBConfig { ServiceURL = DynamoDbDockerSetup.ConnectionString };
29-
var provisioner = new DynamoDbProvisioner(DynamoDbDockerSetup.Credentials, cfg, "unittests", new LoggerFactory());
30-
var client = new DynamoPersistenceProvider(DynamoDbDockerSetup.Credentials, cfg, provisioner, "unittests", new LoggerFactory());
29+
var dbClient = new AmazonDynamoDBClient(DynamoDbDockerSetup.Credentials, cfg);
30+
var provisioner = new DynamoDbProvisioner(dbClient, "unittests", new LoggerFactory());
31+
var client = new DynamoPersistenceProvider(dbClient, provisioner, "unittests", new LoggerFactory());
3132
client.EnsureStoreExists();
3233
_subject = client;
3334
}

0 commit comments

Comments
 (0)