From c3a79ed8edf929909ba06b039be7a7fbbb5a3863 Mon Sep 17 00:00:00 2001 From: Krzysztof Cwalina Date: Tue, 15 Oct 2024 15:14:12 -0700 Subject: [PATCH 1/2] cleaned up workspace APIs --- ...rovisioning.CloudMachine.netstandard2.0.cs | 50 +++++++-------- .../src/AzureSdkExtensions/KeyVaultFeature.cs | 16 ++--- .../src/AzureSdkExtensions/OpenAIFeature.cs | 61 ++++++++----------- .../src/Core/ClientCache.cs | 13 ++-- .../src/Core/ClientWorkspace.cs | 50 +++++++++++++++ .../src/Core/WorkspaceClient.cs | 35 ----------- .../src/OFX/CloudMachineWorkspace.cs | 31 ++++------ .../src/OFX/MessagingServices.cs | 50 ++++++++------- .../src/OFX/StorageServices.cs | 9 +-- 9 files changed, 159 insertions(+), 156 deletions(-) create mode 100644 sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientWorkspace.cs delete mode 100644 sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/WorkspaceClient.cs diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/api/Azure.Provisioning.CloudMachine.netstandard2.0.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/api/Azure.Provisioning.CloudMachine.netstandard2.0.cs index fcc2bf4f4892..12e3eeac255f 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/api/Azure.Provisioning.CloudMachine.netstandard2.0.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/api/Azure.Provisioning.CloudMachine.netstandard2.0.cs @@ -6,17 +6,15 @@ public partial class CloudMachineClient : Azure.CloudMachine.CloudMachineWorkspa public Azure.CloudMachine.MessagingServices Messaging { get { throw null; } } public Azure.CloudMachine.StorageServices Storage { get { throw null; } } } - public partial class CloudMachineWorkspace : Azure.Core.WorkspaceClient + public partial class CloudMachineWorkspace : Azure.Core.ClientWorkspace { public CloudMachineWorkspace(Azure.Core.TokenCredential? credential = null, Microsoft.Extensions.Configuration.IConfiguration? configuration = null) { } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] - public override Azure.Core.TokenCredential Credential { get { throw null; } } - [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public string Id { get { throw null; } } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override bool Equals(object? obj) { throw null; } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] - public override Azure.Core.ClientConfiguration? GetConfiguration(string clientId, string? instanceId = null) { throw null; } + public override Azure.Core.ClientConnectionOptions GetConnectionOptions(System.Type clientType, string? instanceId = null) { throw null; } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public override int GetHashCode() { throw null; } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] @@ -46,30 +44,34 @@ namespace Azure.Core public partial class ClientCache { public ClientCache() { } - public T Get(string id, System.Func value) where T : class { throw null; } + public T Get(System.Func value, string? id = null) where T : class { throw null; } + } + public enum ClientConnectionKind + { + EntraId = 0, + ApiKey = 1, + OutOfBand = 2, } [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] - public readonly partial struct ClientConfiguration + public readonly partial struct ClientConnectionOptions { private readonly object _dummy; private readonly int _dummyPrimitive; - public ClientConfiguration(string endpoint, string? apiKey = null) { throw null; } - public string? ApiKey { get { throw null; } } - public Azure.Core.CredentialType CredentialType { get { throw null; } } - public string Endpoint { get { throw null; } } + public ClientConnectionOptions(string subclientId) { throw null; } + public ClientConnectionOptions(System.Uri endpoint, Azure.Core.TokenCredential credential) { throw null; } + public ClientConnectionOptions(System.Uri endpoint, string apiKey) { throw null; } + public string? ApiKeyCredential { get { throw null; } } + public Azure.Core.ClientConnectionKind ConnectionKind { get { throw null; } } + public System.Uri? Endpoint { get { throw null; } } + public string? Id { get { throw null; } } + public Azure.Core.TokenCredential? TokenCredential { get { throw null; } } } - public enum CredentialType + public abstract partial class ClientWorkspace { - EntraId = 0, - ApiKey = 1, - } - public abstract partial class WorkspaceClient - { - protected WorkspaceClient() { } - public abstract Azure.Core.TokenCredential Credential { get; } + protected ClientWorkspace() { } [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public Azure.Core.ClientCache Subclients { get { throw null; } } - public abstract Azure.Core.ClientConfiguration? GetConfiguration(string clientId, string? instanceId = null); + public abstract Azure.Core.ClientConnectionOptions GetConnectionOptions(System.Type clientType, string? instanceId = null); } } namespace Azure.Provisioning.CloudMachine @@ -96,7 +98,7 @@ namespace Azure.Provisioning.CloudMachine.KeyVault { public static partial class KeyVaultExtensions { - public static Azure.Security.KeyVault.Secrets.SecretClient GetKeyVaultSecretsClient(this Azure.Core.WorkspaceClient workspace) { throw null; } + public static Azure.Security.KeyVault.Secrets.SecretClient GetKeyVaultSecretsClient(this Azure.Core.ClientWorkspace workspace) { throw null; } } public partial class KeyVaultFeature : Azure.Provisioning.CloudMachine.CloudMachineFeature { @@ -107,6 +109,10 @@ public override void AddTo(Azure.Provisioning.CloudMachine.CloudMachineInfrastru } namespace Azure.Provisioning.CloudMachine.OpenAI { + public static partial class AzureOpenAIExtensions + { + public static OpenAI.Chat.ChatClient GetOpenAIChatClient(this Azure.Core.ClientWorkspace workspace) { throw null; } + } public partial class OpenAIFeature : Azure.Provisioning.CloudMachine.CloudMachineFeature { public OpenAIFeature(string model, string modelVersion) { } @@ -114,8 +120,4 @@ public OpenAIFeature(string model, string modelVersion) { } public string ModelVersion { get { throw null; } } public override void AddTo(Azure.Provisioning.CloudMachine.CloudMachineInfrastructure cloudMachine) { } } - public static partial class OpenAIFeatureExtensions - { - public static OpenAI.Chat.ChatClient GetOpenAIChatClient(this Azure.Core.WorkspaceClient workspace) { throw null; } - } } diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/KeyVaultFeature.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/KeyVaultFeature.cs index bba2556237ea..231cb2fc24a7 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/KeyVaultFeature.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/KeyVaultFeature.cs @@ -64,19 +64,13 @@ public override void AddTo(CloudMachineInfrastructure infrastructure) public static class KeyVaultExtensions { - public static SecretClient GetKeyVaultSecretsClient(this WorkspaceClient workspace) + public static SecretClient GetKeyVaultSecretsClient(this ClientWorkspace workspace) { - ClientConfiguration? connectionMaybe = workspace.GetConfiguration(typeof(SecretClient).FullName); - if (connectionMaybe == null) + ClientConnectionOptions connection = workspace.GetConnectionOptions(typeof(SecretClient)); + if (connection.ConnectionKind == ClientConnectionKind.EntraId) { - throw new Exception("Connection not found"); + return new(connection.Endpoint, connection.TokenCredential); } - - ClientConfiguration connection = connectionMaybe.Value; - if (connection.CredentialType == CredentialType.EntraId) - { - return new(new Uri(connection.Endpoint), workspace.Credential); - } - throw new Exception("ApiKey not supported"); + throw new Exception("API key not supported"); } } diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/OpenAIFeature.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/OpenAIFeature.cs index e2f4d65be3a8..171f62053e00 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/OpenAIFeature.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/AzureSdkExtensions/OpenAIFeature.cs @@ -3,10 +3,7 @@ using System; using System.ClientModel; -using System.ClientModel.Primitives; -using System.Diagnostics.Contracts; using Azure.AI.OpenAI; -using Azure.CloudMachine; using Azure.Core; using Azure.Provisioning.Authorization; using Azure.Provisioning.CognitiveServices; @@ -62,44 +59,36 @@ public override void AddTo(CloudMachineInfrastructure cloudMachine) } } -public static class OpenAIFeatureExtensions +public static class AzureOpenAIExtensions { - public static ChatClient GetOpenAIChatClient(this WorkspaceClient workspace) + public static ChatClient GetOpenAIChatClient(this ClientWorkspace workspace) { - string chatClientId = typeof(ChatClient).FullName; - - ChatClient client = workspace.Subclients.Get(chatClientId, () => + ChatClient chatClient = workspace.Subclients.Get(() => { - string azureOpenAIClientId = typeof(AzureOpenAIClient).FullName; - - AzureOpenAIClient aoia = workspace.Subclients.Get(azureOpenAIClientId, () => - { - ClientConfiguration? connectionMaybe = workspace.GetConfiguration(typeof(AzureOpenAIClient).FullName); - if (connectionMaybe == null) throw new Exception("Connection not found"); + AzureOpenAIClient aoiaClient = workspace.Subclients.Get(() => CreateAzureOpenAIClient(workspace)); + return workspace.CreateChatClient(aoiaClient); + }); - ClientConfiguration connection = connectionMaybe.Value; - Uri endpoint = new(connection.Endpoint); - var clientOptions = new AzureOpenAIClientOptions(); - if (connection.CredentialType == CredentialType.EntraId) - { - AzureOpenAIClient aoai = new(endpoint, workspace.Credential, clientOptions); - return aoai; - } - else - { - AzureOpenAIClient aoai = new(endpoint, new ApiKeyCredential(connection.ApiKey!), clientOptions); - return aoai; - } - }); + return chatClient; + } - string azureOpenAIChatClientId = typeof(ChatClient).FullName; - ClientConfiguration? connectionMaybe = workspace.GetConfiguration(azureOpenAIChatClientId); - if (connectionMaybe == null) throw new Exception("Connection not found"); - var connection = connectionMaybe.Value; - ChatClient chat = aoia.GetChatClient(connection.Endpoint); - return chat; - }); + private static AzureOpenAIClient CreateAzureOpenAIClient(this ClientWorkspace workspace) + { + ClientConnectionOptions connection = workspace.GetConnectionOptions(typeof(AzureOpenAIClient)); + if (connection.ConnectionKind == ClientConnectionKind.EntraId) + { + return new(connection.Endpoint, connection.TokenCredential); + } + else + { + return new(connection.Endpoint, new ApiKeyCredential(connection.ApiKeyCredential!)); + } + } - return client; + private static ChatClient CreateChatClient(this ClientWorkspace workspace, AzureOpenAIClient client) + { + ClientConnectionOptions connection = workspace.GetConnectionOptions(typeof(ChatClient)); + ChatClient chat = client.GetChatClient(connection.Id); + return chat; } } diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientCache.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientCache.cs index 0cef9c35b12d..235fcba38d1d 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientCache.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientCache.cs @@ -9,17 +9,16 @@ namespace Azure.Core; // TODO: this is a very demo implementation. We need to do better public class ClientCache { - private readonly Dictionary _clients = new Dictionary(); + private readonly Dictionary<(Type, string?), object> _clients = new Dictionary<(Type, string?), object>(); - // TODO: consider uisng ICLientCreator instead of Func - public T Get(string id, Func value) where T: class + public T Get(Func value, string? id = default) where T: class { + var client = (typeof(T), id); lock (_clients) { - if (_clients.TryGetValue(id, out object cached)) + if (_clients.TryGetValue(client, out object cached)) { - T client = (T)cached; - return client; + return (T)cached; } if (_clients.Count > 100) @@ -27,7 +26,7 @@ public T Get(string id, Func value) where T: class GC(); } T created = value(); - _clients.Add(id, created); + _clients.Add(client, created); return created; } diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientWorkspace.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientWorkspace.cs new file mode 100644 index 000000000000..a40d2d5aae1f --- /dev/null +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/ClientWorkspace.cs @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.ComponentModel; + +namespace Azure.Core; + +public abstract class ClientWorkspace +{ + public abstract ClientConnectionOptions GetConnectionOptions(Type clientType, string? instanceId = default); + + [EditorBrowsable(EditorBrowsableState.Never)] + public ClientCache Subclients { get; } = new ClientCache(); +} + +public readonly struct ClientConnectionOptions +{ + public ClientConnectionOptions(Uri endpoint, string apiKey) + { + Endpoint = endpoint; + ApiKeyCredential = apiKey; + ConnectionKind = ClientConnectionKind.ApiKey; + } + public ClientConnectionOptions(Uri endpoint, TokenCredential credential) + { + Endpoint = endpoint; + TokenCredential = credential; + ConnectionKind = ClientConnectionKind.EntraId; + } + public ClientConnectionOptions(string subclientId) + { + Id = subclientId; + ConnectionKind = ClientConnectionKind.OutOfBand; + } + + public ClientConnectionKind ConnectionKind { get; } + + public Uri? Endpoint { get; } + public string? Id { get; } + public string? ApiKeyCredential { get; } + public TokenCredential? TokenCredential { get; } +} + +public enum ClientConnectionKind +{ + EntraId, + ApiKey, + OutOfBand +} diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/WorkspaceClient.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/WorkspaceClient.cs deleted file mode 100644 index 77277b61b5ab..000000000000 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/Core/WorkspaceClient.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.ComponentModel; - -namespace Azure.Core; - -public abstract class WorkspaceClient -{ - public abstract TokenCredential Credential { get; } - - public abstract ClientConfiguration? GetConfiguration(string clientId, string? instanceId = default); - - [EditorBrowsable(EditorBrowsableState.Never)] - public ClientCache Subclients { get; } = new ClientCache(); -} - -public readonly struct ClientConfiguration -{ - public ClientConfiguration(string endpoint, string? apiKey = default) - { - Endpoint = endpoint; - ApiKey = apiKey; - CredentialType = apiKey == default ? CredentialType.EntraId : CredentialType.ApiKey; - } - public string Endpoint { get; } - public string? ApiKey { get; } - public CredentialType CredentialType { get; } -} - -public enum CredentialType -{ - EntraId, - ApiKey, -} diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/CloudMachineWorkspace.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/CloudMachineWorkspace.cs index f0bafdd3997c..35ac9e306d1f 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/CloudMachineWorkspace.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/CloudMachineWorkspace.cs @@ -10,17 +10,16 @@ namespace Azure.CloudMachine; -public class CloudMachineWorkspace : WorkspaceClient +public class CloudMachineWorkspace : ClientWorkspace { - [EditorBrowsable(EditorBrowsableState.Never)] - public string Id { get; } - - [EditorBrowsable(EditorBrowsableState.Never)] - public override TokenCredential Credential { get; } = new ChainedTokenCredential( + private TokenCredential Credential { get; } = new ChainedTokenCredential( new AzureCliCredential(), new AzureDeveloperCliCredential() ); + [EditorBrowsable(EditorBrowsableState.Never)] + public string Id { get; } + [SuppressMessage("Usage", "AZC0007:DO provide a minimal constructor that takes only the parameters required to connect to the service.", Justification = "")] public CloudMachineWorkspace(TokenCredential? credential = default, IConfiguration? configuration = default) { @@ -45,29 +44,25 @@ public CloudMachineWorkspace(TokenCredential? credential = default, IConfigurati } [EditorBrowsable(EditorBrowsableState.Never)] - public override ClientConfiguration? GetConfiguration(string clientId, string? instanceId = default) + public override ClientConnectionOptions GetConnectionOptions(Type clientType, string? instanceId = default) { + string clientId = clientType.FullName; switch (clientId) { case "Azure.Security.KeyVault.Secrets.SecretClient": - return new ClientConfiguration($"https://{this.Id}.vault.azure.net/"); + return new ClientConnectionOptions(new($"https://{this.Id}.vault.azure.net/"), Credential); case "Azure.Messaging.ServiceBus.ServiceBusClient": - return new ClientConfiguration($"{this.Id}.servicebus.windows.net"); + return new ClientConnectionOptions(new($"{this.Id}.servicebus.windows.net"), Credential); case "Azure.Messaging.ServiceBus.ServiceBusSender": if (instanceId == default) instanceId = "cm_default_topic_sender"; - return new ClientConfiguration(instanceId); + return new ClientConnectionOptions(instanceId); case "Azure.Storage.Blobs.BlobContainerClient": if (instanceId == default) instanceId = "default"; - return new ClientConfiguration($"https://{this.Id}.blob.core.windows.net/{instanceId}"); + return new ClientConnectionOptions(new($"https://{this.Id}.blob.core.windows.net/{instanceId}"), Credential); case "Azure.AI.OpenAI.AzureOpenAIClient": - string endpoint = $"https://{this.Id}.openai.azure.com"; - string? key = null; // Environment.GetEnvironmentVariable("openai_cm_key"); - if (key != null) - return new ClientConfiguration(endpoint, key); - else - return new ClientConfiguration(endpoint); + return new ClientConnectionOptions(new($"https://{this.Id}.openai.azure.com"), Credential); case "OpenAI.Chat.ChatClient": - return new ClientConfiguration(this.Id); + return new ClientConnectionOptions(Id); default: throw new Exception($"unknown client {clientId}"); } diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs index 4e7dcbcd9615..6b2dc19d3018 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using Azure.Core; using Azure.Messaging.ServiceBus; namespace Azure.CloudMachine; @@ -13,7 +14,7 @@ public readonly struct MessagingServices public void SendMessage(object serializable) { - ServiceBusSender sender = GetSender(); + ServiceBusSender sender = GetServiceBusSender(); BinaryData serialized = BinaryData.FromObjectAsJson(serializable); ServiceBusMessage message = new(serialized); @@ -22,30 +23,37 @@ public void SendMessage(object serializable) #pragma warning restore AZC0102 // Do not use GetAwaiter().GetResult(). } - private ServiceBusSender GetSender() + public void WhenMessageReceived(Action received) + { + throw new NotImplementedException(); + } + + private ServiceBusClient GetServiceBusClient() + { + MessagingServices messagingServices = this; + ServiceBusClient client = _cm.Subclients.Get(() => messagingServices.CreateClient()); + return client; + } + + private ServiceBusSender GetServiceBusSender() { - string senderClientId = typeof(ServiceBusSender).FullName; - CloudMachineClient cm = _cm; - ServiceBusSender sender = _cm.Subclients.Get(senderClientId, () => - { - string serviceBusClientId = typeof(ServiceBusClient).FullName; - ServiceBusClient sb = cm.Subclients.Get(serviceBusClientId, () => - { - string sbNamespace = cm.GetConfiguration(serviceBusClientId)!.Value.Endpoint; - ServiceBusClient sb = new(sbNamespace, cm.Credential); - return sb; - }); - - string ServiceBusSenderId = typeof(ServiceBusClient).FullName; - string defaultTopic = cm.GetConfiguration(ServiceBusSenderId)!.Value.Endpoint; - ServiceBusSender sender = sb.CreateSender(defaultTopic); - return sender; - }); + MessagingServices messagingServices = this; + ServiceBusSender sender = _cm.Subclients.Get(() => messagingServices.GreateSender()); return sender; } - public void WhenMessageReceived(Action received) + private ServiceBusSender GreateSender() { - throw new NotImplementedException(); + ServiceBusClient client = GetServiceBusClient(); + + ClientConnectionOptions connection = _cm.GetConnectionOptions(typeof(ServiceBusClient)); + ServiceBusSender sender = client.CreateSender(connection.Id); + return sender; + } + private ServiceBusClient CreateClient() + { + ClientConnectionOptions connection = _cm.GetConnectionOptions(typeof(ServiceBusClient)); + ServiceBusClient client = new(connection.Id, connection.TokenCredential); + return client; } } diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/StorageServices.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/StorageServices.cs index e5541501255a..8afd6e458fc9 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/StorageServices.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/StorageServices.cs @@ -3,6 +3,7 @@ using System; using System.Threading.Tasks; +using Azure.Core; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; @@ -15,16 +16,16 @@ public readonly struct StorageServices private BlobContainerClient GetDefaultContainer() { - string blobContainerClientId = typeof(BlobContainerClient).FullName; CloudMachineClient cm = _cm; - BlobContainerClient container = cm.Subclients.Get(blobContainerClientId, () => + BlobContainerClient container = _cm.Subclients.Get(() => { - string endpoint = cm.GetConfiguration(blobContainerClientId)!.Value.Endpoint; - BlobContainerClient container = new(new Uri(endpoint), cm.Credential); + ClientConnectionOptions connection = cm.GetConnectionOptions(typeof(BlobContainerClient)); + BlobContainerClient container = new(connection.Endpoint, connection.TokenCredential); return container; }); return container; } + public string UploadBlob(object json, string? name = default) { BlobContainerClient container = GetDefaultContainer(); From 5df377ad6cd31fafda74c250e129b57a7e7ee00c Mon Sep 17 00:00:00 2001 From: Krzysztof Cwalina Date: Tue, 15 Oct 2024 15:49:12 -0700 Subject: [PATCH 2/2] PR feedback --- .../src/OFX/MessagingServices.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs index 6b2dc19d3018..c17f795d0c06 100644 --- a/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs +++ b/sdk/provisioning/Azure.Provisioning.CloudMachine/src/OFX/MessagingServices.cs @@ -38,11 +38,11 @@ private ServiceBusClient GetServiceBusClient() private ServiceBusSender GetServiceBusSender() { MessagingServices messagingServices = this; - ServiceBusSender sender = _cm.Subclients.Get(() => messagingServices.GreateSender()); + ServiceBusSender sender = _cm.Subclients.Get(() => messagingServices.CreateSender()); return sender; } - private ServiceBusSender GreateSender() + private ServiceBusSender CreateSender() { ServiceBusClient client = GetServiceBusClient();