Skip to content

Commit 0341734

Browse files
authored
Add checkpoint store MSI auth support (Azure#19082)
1 parent 9a757da commit 0341734

File tree

5 files changed

+41
-5
lines changed

5 files changed

+41
-5
lines changed

sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/src/Config/EventHubClientFactory.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,12 @@ internal IEventHubConsumerClient GetEventHubConsumerClient(string eventHubName,
166166

167167
internal BlobContainerClient GetCheckpointStoreClient()
168168
{
169-
// Fall back to default if not explicitly registered
170-
return new BlobContainerClient(_configuration.GetWebJobsConnectionString(ConnectionStringNames.Storage), _options.CheckpointContainer);
169+
var section = _configuration.GetWebJobsConnectionStringSection(ConnectionStringNames.Storage);
170+
var options = _componentFactory.CreateClientOptions(typeof(BlobClientOptions), null, section);
171+
var credential = _componentFactory.CreateTokenCredential(section);
172+
var client = (BlobServiceClient)_componentFactory.CreateClient(typeof(BlobServiceClient), section, credential, options);
173+
174+
return client.GetBlobContainerClient(_options.CheckpointContainer);
171175
}
172176

173177
internal static string NormalizeConnectionString(string originalConnectionString, string eventHubName)

sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/EventHubEndToEndTests.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ await AssertCanSendReceiveMessage(host =>
160160
host.ConfigureAppConfiguration(configurationBuilder =>
161161
configurationBuilder.AddInMemoryCollection(new Dictionary<string, string>()
162162
{
163-
{"TestConnection", EventHubsTestEnvironment.Instance.EventHubsConnectionString}
163+
{"TestConnection", EventHubsTestEnvironment.Instance.EventHubsConnectionString},
164+
{"AzureWebJobsStorage", StorageTestEnvironment.Instance.StorageConnectionString}
164165
})));
165166
}
166167

@@ -175,9 +176,18 @@ await AssertCanSendReceiveMessage(host =>
175176
{"TestConnection:clientId", EventHubsTestEnvironment.Instance.ClientId},
176177
{"TestConnection:clientSecret", EventHubsTestEnvironment.Instance.ClientSecret},
177178
{"TestConnection:tenantId", EventHubsTestEnvironment.Instance.TenantId},
179+
{"AzureWebJobsStorage:serviceUri", GetServiceUri()},
180+
{"AzureWebJobsStorage:clientId", EventHubsTestEnvironment.Instance.ClientId},
181+
{"AzureWebJobsStorage:clientSecret", EventHubsTestEnvironment.Instance.ClientSecret},
182+
{"AzureWebJobsStorage:tenantId", EventHubsTestEnvironment.Instance.TenantId},
178183
})));
179184
}
180185

186+
private static string GetServiceUri()
187+
{
188+
return "https://" + StorageTestEnvironment.Instance.StorageAccountName + ".blob." + StorageTestEnvironment.Instance.StorageEndpointSuffix;
189+
}
190+
181191
public async Task AssertCanSendReceiveMessage(Action<IHostBuilder> hostConfiguration)
182192
{
183193
var (jobHost, host) = BuildHost<EventHubTestSingleDispatchJobWithConnection>(hostConfiguration);

sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/EventHubsClientFactoryTests.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Azure.Messaging.EventHubs.Consumer;
1010
using Azure.Messaging.EventHubs.Primitives;
1111
using Azure.Messaging.EventHubs.Producer;
12+
using Azure.Storage.Blobs;
1213
using Microsoft.Azure.WebJobs.EventHubs.Processor;
1314
using Microsoft.Extensions.Azure;
1415
using Microsoft.Extensions.Configuration;
@@ -105,7 +106,14 @@ public void UsesDefaultConnectionToStorageAccount()
105106

106107
var configuration = CreateConfiguration(new KeyValuePair<string, string>("AzureWebJobsStorage", "UseDevelopmentStorage=true"));
107108

108-
var factory = new EventHubClientFactory(configuration, Mock.Of<AzureComponentFactory>(), Options.Create(options), new DefaultNameResolver(configuration));
109+
var factoryMock = new Mock<AzureComponentFactory>();
110+
factoryMock.Setup(m => m.CreateClient(
111+
typeof(BlobServiceClient),
112+
It.Is<ConfigurationSection>(c => c.Path == "AzureWebJobsStorage"),
113+
null, null))
114+
.Returns(new BlobServiceClient(configuration["AzureWebJobsStorage"]));
115+
116+
var factory = new EventHubClientFactory(configuration, factoryMock.Object, Options.Create(options), new DefaultNameResolver(configuration));
109117

110118
var client = factory.GetCheckpointStoreClient();
111119
Assert.AreEqual("azure-webjobs-eventhub", client.Name);

sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/tests/WebJobsEventHubTestBase.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ protected void ConfigureTestEventHub(IHostBuilder builder)
7070
builder.AddInMemoryCollection(new Dictionary<string, string>()
7171
{
7272
{"webjobstesthub", _eventHubScope.EventHubName},
73-
{"AzureWebJobsStorage", StorageTestEnvironment.Instance.StorageConnectionString}
7473
});
7574
})
7675
.ConfigureDefaultTestHost<T>(b =>

sdk/eventhub/test-resources.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
"variables": {
6767
"contributorRoleId": "b24988ac-6180-42a0-ab88-20f7382dd24c",
6868
"eventHubsDataOwnerRoleId": "f526a384-b230-433a-b45c-95f59c4a2dec",
69+
"storageDataOwnerRoleId": "b7e6dc6d-f1e8-4753-8033-0f276bb0955b",
6970
"eventHubsNamespace": "[concat('eh-', parameters('baseName'))]",
7071
"storageAccount": "[concat('blb', parameters('baseName'))]",
7172
"defaultSASKeyName": "RootManageSharedAccessKey",
@@ -158,6 +159,20 @@
158159
"principalId": "[parameters('testApplicationOid')]",
159160
"scope": "[resourceGroup().id]"
160161
}
162+
},
163+
{
164+
"type": "Microsoft.Authorization/roleAssignments",
165+
"apiVersion": "2019-04-01-preview",
166+
"name": "[guid(resourceGroup().id, parameters('testApplicationOid'), variables('storageDataOwnerRoleId'))]",
167+
"dependsOn": [
168+
"[resourceId('Microsoft.EventHub/Namespaces', variables('eventHubsNamespace'))]",
169+
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccount'))]"
170+
],
171+
"properties": {
172+
"roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', variables('storageDataOwnerRoleId'))]",
173+
"principalId": "[parameters('testApplicationOid')]",
174+
"scope": "[resourceGroup().id]"
175+
}
161176
}
162177
],
163178
"outputs": {

0 commit comments

Comments
 (0)