diff --git a/src/DurableWorker/DurableController.cs b/src/DurableWorker/DurableController.cs index 59c6f6b6..54516da1 100644 --- a/src/DurableWorker/DurableController.cs +++ b/src/DurableWorker/DurableController.cs @@ -31,7 +31,7 @@ internal class DurableController private readonly ILogger _logger; private bool isExternalDFSdkEnabled { get; } = - PowerShellWorkerConfiguration.GetBoolean("ExternalDurablePowerShellSDK") ?? false; + PowerShellWorkerConfiguration.GetBoolean(Utils.ExternalDurableSdkEnvVariable) ?? false; public DurableController( DurableFunctionInfo durableDurableFunctionInfo, @@ -81,7 +81,7 @@ private void tryEnablingExternalSDK() else if (isExternalSdkLoaded) { // External SDK is in the session, but customer did not explicitly enable it. Report the potential of runtime errors. - _logger.Log(isUserOnlyLog: false, LogLevel.Error, String.Format(PowerShellWorkerStrings.PotentialDurableSDKClash, Utils.ExternalDurableSdkName)); + _logger.Log(isUserOnlyLog: false, LogLevel.Error, String.Format(PowerShellWorkerStrings.PotentialDurableSDKClash, Utils.ExternalDurableSdkName, Utils.ExternalDurableSdkEnvVariable)); } } diff --git a/src/Utility/Utils.cs b/src/Utility/Utils.cs index df068e5b..e8d3a3d1 100644 --- a/src/Utility/Utils.cs +++ b/src/Utility/Utils.cs @@ -28,6 +28,7 @@ internal class Utils internal const string ExternalDurableSdkName = "AzureFunctions.PowerShell.Durable.SDK"; internal const string IsOrchestrationFailureKey = "IsOrchestrationFailure"; internal const string TracePipelineObjectCmdlet = "Microsoft.Azure.Functions.PowerShellWorker\\Trace-PipelineObject"; + internal const string ExternalDurableSdkEnvVariable = "ExternalDurablePowerShellSDK"; internal readonly static object BoxedTrue = (object)true; internal readonly static object BoxedFalse = (object)false; diff --git a/test/Unit/Durable/DurableControllerTests.cs b/test/Unit/Durable/DurableControllerTests.cs index 065232c7..31971888 100644 --- a/test/Unit/Durable/DurableControllerTests.cs +++ b/test/Unit/Durable/DurableControllerTests.cs @@ -286,6 +286,37 @@ internal void ExternalDurableSdkIsNotConfiguredByDefault(DurableFunctionType dur _mockPowerShellServices.Verify(_ => _.EnableExternalDurableSDK(), Times.Never); } + [Fact] + internal void WarnsUserToSetExternalSdkEnvVariable() + { + // "forget" to enable DF external SDK through enviroment variable + Environment.SetEnvironmentVariable("ExternalDurablePowerShellSDK", "false"); + + var mockLogger = new Mock(); + var durableFunctionType = DurableFunctionType.OrchestrationFunction; + var durableController = CreateDurableController(durableFunctionType, logger: mockLogger.Object); + var inputData = GetDurableBindings(durableFunctionType); + + _mockPowerShellServices.Setup(_ => _.SetOrchestrationContext( + It.IsAny(), + out It.Ref.IsAny)).Returns(_orchestrationBindingInfo); + _mockOrchestrationInvoker.Setup(_ => _.SetExternalInvoker(It.IsAny())); + + _mockPowerShellServices.Setup(_ => _.HasExternalDurableSDK()).Returns(false); + _mockPowerShellServices.Setup(_ => _.EnableExternalDurableSDK()).Throws(new Exception("should not be called")); + + // detect SDK is loaded + _mockPowerShellServices.Setup(_ => _.isExternalDurableSdkLoaded()).Returns(true); + durableController.InitializeBindings(inputData, out var hasExternalSDK); + + Assert.False(hasExternalSDK); + _mockPowerShellServices.Verify(_ => _.EnableExternalDurableSDK(), Times.Never); + + // validate that warning is communicated through the logger + var expectedMessage = string.Format(PowerShellWorkerStrings.PotentialDurableSDKClash, Utils.ExternalDurableSdkName, Utils.ExternalDurableSdkEnvVariable); + mockLogger.Verify(_ => _.Log(false, RpcLog.Types.Level.Error, It.Is(s => s.Equals(expectedMessage)), null), Times.Once); + } + [Theory] [InlineData(DurableFunctionType.None)] [InlineData(DurableFunctionType.OrchestrationFunction)] @@ -328,15 +359,21 @@ internal void ExternalDurableSdkCanBeEnabled(DurableFunctionType durableFunction private DurableController CreateDurableController( DurableFunctionType durableFunctionType, - string durableClientBindingName = null) + string durableClientBindingName = null, + ILogger logger = null) { var durableFunctionInfo = new DurableFunctionInfo(durableFunctionType, durableClientBindingName); + if (logger == null) + { + logger = _testLogger; + } + return new DurableController( durableFunctionInfo, _mockPowerShellServices.Object, _mockOrchestrationInvoker.Object, - _testLogger); + logger); } private static ParameterBinding CreateParameterBinding(string parameterName, object value)