Skip to content

Commit 1110a9d

Browse files
authored
Allow warmup api for non-dotnet template sites (#4632)
1 parent fc6a5f4 commit 1110a9d

File tree

7 files changed

+98
-26
lines changed

7 files changed

+98
-26
lines changed

src/WebJobs.Script/Host/ScriptHost.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,13 +466,15 @@ private void GenerateFunctions(IEnumerable<Type> directTypes)
466466
/// </summary>
467467
internal async Task InitializeFunctionDescriptorsAsync(IEnumerable<FunctionMetadata> functionMetadata)
468468
{
469-
_logger.AddingDescriptorProviderForLanguage(_workerRuntime);
470-
if (string.Equals(_workerRuntime, LanguageWorkerConstants.DotNetLanguageWorkerName, StringComparison.OrdinalIgnoreCase))
469+
if (_environment.IsPlaceholderModeEnabled()
470+
|| string.Equals(_workerRuntime, LanguageWorkerConstants.DotNetLanguageWorkerName, StringComparison.OrdinalIgnoreCase))
471471
{
472+
_logger.AddingDescriptorProviderForLanguage(LanguageWorkerConstants.DotNetLanguageWorkerName);
472473
_descriptorProviders.Add(new DotNetFunctionDescriptorProvider(this, ScriptOptions, _bindingProviders, _metricsLogger, _loggerFactory));
473474
}
474475
else
475476
{
477+
_logger.AddingDescriptorProviderForLanguage(_workerRuntime);
476478
_descriptorProviders.Add(new WorkerFunctionDescriptorProvider(this, _workerRuntime, ScriptOptions, _bindingProviders, _functionDispatcher, _loggerFactory));
477479
}
478480

src/WebJobs.Script/Rpc/LanguageWorkerProcess.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ internal class LanguageWorkerProcess : ILanguageWorkerProcess, IDisposable
2626
private bool _disposing;
2727
private Queue<string> _processStdErrDataQueue = new Queue<string>(3);
2828

29-
internal LanguageWorkerProcess()
30-
{
31-
// To help with unit tests
32-
}
33-
3429
internal LanguageWorkerProcess(string runtime,
3530
string workerId,
3631
string rootScriptPath,

test/WebJobs.Script.Tests.Integration/Host/StandbyManager/StandbyManagerE2ETests_Windows.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ await TestHelpers.Await(() =>
8686
public async Task StandbyModeE2E_Java()
8787
{
8888
_settings.Add(EnvironmentSettingNames.AzureWebsiteInstanceId, Guid.NewGuid().ToString());
89+
await Verify_StandbyModeE2E_Java();
90+
}
91+
92+
[Fact]
93+
public async Task StandbyModeE2E_JavaTemplateSite()
94+
{
95+
_settings.Add(EnvironmentSettingNames.AzureWebsiteInstanceId, Guid.NewGuid().ToString());
96+
_settings.Add(LanguageWorkerConstants.FunctionWorkerRuntimeSettingName, LanguageWorkerConstants.JavaLanguageWorkerName);
97+
await Verify_StandbyModeE2E_Java();
98+
}
99+
100+
private async Task Verify_StandbyModeE2E_Java()
101+
{
89102
var environment = new TestEnvironment(_settings);
90103
await InitializeTestHostAsync("Windows_Java", environment);
91104

test/WebJobs.Script.Tests/Rpc/LanguageWorkerChannelManagerTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class LanguageWorkerChannelManagerTests
2727
private Mock<ILanguageWorkerProcessFactory> _languageWorkerProcessFactory;
2828
private ILanguageWorkerChannelFactory _languageWorkerChannelFactory;
2929
private IOptionsMonitor<ScriptApplicationHostOptions> _optionsMonitor;
30+
private Mock<ILanguageWorkerProcess> _languageWorkerProcess;
3031

3132
private string _scriptRootPath = @"c:\testing\FUNCTIONS-TEST";
3233
private IDictionary<string, string> _capabilities = new Dictionary<string, string>()
@@ -42,6 +43,7 @@ public LanguageWorkerChannelManagerTests()
4243
_loggerFactory = new LoggerFactory();
4344
_testEnvironment = new TestEnvironment();
4445
_loggerFactory.AddProvider(_loggerProvider);
46+
_languageWorkerProcess = new Mock<ILanguageWorkerProcess>();
4547
_languageWorkerOptions = new LanguageWorkerOptions
4648
{
4749
WorkerConfigs = TestHelpers.GetTestWorkerConfigs()
@@ -54,7 +56,7 @@ public LanguageWorkerChannelManagerTests()
5456
_optionsMonitor = TestHelpers.CreateOptionsMonitor(applicationHostOptions);
5557

5658
_languageWorkerProcessFactory = new Mock<ILanguageWorkerProcessFactory>();
57-
_languageWorkerProcessFactory.Setup(m => m.CreateLanguageWorkerProcess(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Returns(new LanguageWorkerProcess());
59+
_languageWorkerProcessFactory.Setup(m => m.CreateLanguageWorkerProcess(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Returns(_languageWorkerProcess.Object);
5860

5961
_languageWorkerChannelFactory = new TestLanguageWorkerChannelFactory(_eventManager, null, _scriptRootPath);
6062
_languageWorkerChannelManager = new WebHostLanguageWorkerChannelManager(_eventManager, _testEnvironment, _loggerFactory, _languageWorkerChannelFactory, _optionsMonitor);
@@ -178,4 +180,4 @@ private ILanguageWorkerChannel CreateTestChannel(string language)
178180
return testChannel;
179181
}
180182
}
181-
}
183+
}

test/WebJobs.Script.Tests/Rpc/LanguageWorkerChannelTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public LanguageWorkerChannelTests()
5757
public async Task StartWorkerProcessAsync_Invoked()
5858
{
5959
await _workerChannel.StartWorkerProcessAsync();
60+
_testFunctionRpcService.PublishStartStreamEvent(_workerId);
61+
_testFunctionRpcService.PublishWorkerInitResponseEvent();
6062
_mockLanguageWorkerProcess.Verify(m => m.StartProcess(), Times.Once);
6163
}
6264

@@ -73,6 +75,7 @@ public void SendWorkerInitRequest_PublishesOutboundEvent()
7375
};
7476
RpcEvent rpcEvent = new RpcEvent(_workerId, startStreamMessage);
7577
_workerChannel.SendWorkerInitRequest(rpcEvent);
78+
_testFunctionRpcService.PublishWorkerInitResponseEvent();
7679
var traces = _logger.GetLogMessages();
7780
Assert.True(traces.Any(m => string.Equals(m.FormattedMessage, _expectedLogMsg)));
7881
}
@@ -115,6 +118,7 @@ public void SendSendFunctionEnvironmentReloadRequest_PublishesOutboundEvents()
115118
Environment.SetEnvironmentVariable("TestEmpty", string.Empty);
116119
Environment.SetEnvironmentVariable("TestValid", "TestValue");
117120
_workerChannel.SendFunctionEnvironmentReloadRequest();
121+
_testFunctionRpcService.PublishFunctionEnvironmentReloadResponseEvent();
118122
var traces = _logger.GetLogMessages();
119123
var functionLoadLogs = traces.Where(m => string.Equals(m.FormattedMessage, "Sending FunctionEnvironmentReloadRequest"));
120124
Assert.True(functionLoadLogs.Count() == 1);
@@ -209,4 +213,4 @@ private IEnumerable<FunctionMetadata> GetTestFunctionsList(string runtime)
209213
};
210214
}
211215
}
212-
}
216+
}

test/WebJobs.Script.Tests/Rpc/LanguageWorkerProcessTests.cs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,64 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System.Linq;
5+
using Microsoft.Azure.WebJobs.Script.Eventing;
56
using Microsoft.Azure.WebJobs.Script.Rpc;
7+
using Moq;
68
using Xunit;
79

810
namespace Microsoft.Azure.WebJobs.Script.Tests.Rpc
911
{
1012
public class LanguageWorkerProcessTests
1113
{
14+
private LanguageWorkerProcess _languageWorkerProcess;
15+
16+
public LanguageWorkerProcessTests()
17+
{
18+
var eventManager = new Mock<IScriptEventManager>();
19+
var workerProcessFactory = new Mock<IWorkerProcessFactory>();
20+
var processRegistry = new Mock<IProcessRegistry>();
21+
var rpcServer = new TestRpcServer();
22+
var languageWorkerConsoleLogSource = new Mock<ILanguageWorkerConsoleLogSource>();
23+
var scriptJobHostEnvironment = new Mock<IScriptJobHostEnvironment>();
24+
var testEnv = new TestEnvironment();
25+
_languageWorkerProcess = new LanguageWorkerProcess("node",
26+
"testworkerId",
27+
"testrootPath",
28+
rpcServer.Uri,
29+
null,
30+
eventManager.Object,
31+
workerProcessFactory.Object,
32+
processRegistry.Object,
33+
new TestLogger("test"),
34+
languageWorkerConsoleLogSource.Object);
35+
}
36+
1237
[Fact]
1338
public void ErrorMessageQueue_Empty()
1439
{
15-
LanguageWorkerProcess languageWorkerProcess = new LanguageWorkerProcess();
16-
Assert.Empty(languageWorkerProcess.ProcessStdErrDataQueue);
40+
Assert.Empty(_languageWorkerProcess.ProcessStdErrDataQueue);
1741
}
1842

1943
[Fact]
2044
public void ErrorMessageQueue_Enqueue_Success()
2145
{
22-
LanguageWorkerProcess languageWorkerProcess = new LanguageWorkerProcess();
23-
LanguageWorkerChannelUtilities.AddStdErrMessage(languageWorkerProcess.ProcessStdErrDataQueue, "Error1");
24-
LanguageWorkerChannelUtilities.AddStdErrMessage(languageWorkerProcess.ProcessStdErrDataQueue, "Error2");
46+
LanguageWorkerChannelUtilities.AddStdErrMessage(_languageWorkerProcess.ProcessStdErrDataQueue, "Error1");
47+
LanguageWorkerChannelUtilities.AddStdErrMessage(_languageWorkerProcess.ProcessStdErrDataQueue, "Error2");
2548

26-
Assert.True(languageWorkerProcess.ProcessStdErrDataQueue.Count == 2);
27-
string exceptionMessage = string.Join(",", languageWorkerProcess.ProcessStdErrDataQueue.Where(s => !string.IsNullOrEmpty(s)));
49+
Assert.True(_languageWorkerProcess.ProcessStdErrDataQueue.Count == 2);
50+
string exceptionMessage = string.Join(",", _languageWorkerProcess.ProcessStdErrDataQueue.Where(s => !string.IsNullOrEmpty(s)));
2851
Assert.Equal("Error1,Error2", exceptionMessage);
2952
}
3053

3154
[Fact]
3255
public void ErrorMessageQueue_Full_Enqueue_Success()
3356
{
34-
LanguageWorkerProcess languageWorkerProcess = new LanguageWorkerProcess();
35-
LanguageWorkerChannelUtilities.AddStdErrMessage(languageWorkerProcess.ProcessStdErrDataQueue, "Error1");
36-
LanguageWorkerChannelUtilities.AddStdErrMessage(languageWorkerProcess.ProcessStdErrDataQueue, "Error2");
37-
LanguageWorkerChannelUtilities.AddStdErrMessage(languageWorkerProcess.ProcessStdErrDataQueue, "Error3");
38-
LanguageWorkerChannelUtilities.AddStdErrMessage(languageWorkerProcess.ProcessStdErrDataQueue, "Error4");
39-
Assert.True(languageWorkerProcess.ProcessStdErrDataQueue.Count == 3);
40-
string exceptionMessage = string.Join(",", languageWorkerProcess.ProcessStdErrDataQueue.Where(s => !string.IsNullOrEmpty(s)));
57+
LanguageWorkerChannelUtilities.AddStdErrMessage(_languageWorkerProcess.ProcessStdErrDataQueue, "Error1");
58+
LanguageWorkerChannelUtilities.AddStdErrMessage(_languageWorkerProcess.ProcessStdErrDataQueue, "Error2");
59+
LanguageWorkerChannelUtilities.AddStdErrMessage(_languageWorkerProcess.ProcessStdErrDataQueue, "Error3");
60+
LanguageWorkerChannelUtilities.AddStdErrMessage(_languageWorkerProcess.ProcessStdErrDataQueue, "Error4");
61+
Assert.True(_languageWorkerProcess.ProcessStdErrDataQueue.Count == 3);
62+
string exceptionMessage = string.Join(",", _languageWorkerProcess.ProcessStdErrDataQueue.Where(s => !string.IsNullOrEmpty(s)));
4163
Assert.Equal("Error2,Error3,Error4", exceptionMessage);
4264
}
4365

@@ -60,4 +82,4 @@ public void IsLanguageWorkerConsoleLog_Returns_False(string msg)
6082
Assert.False(LanguageWorkerChannelUtilities.IsLanguageWorkerConsoleLog(msg));
6183
}
6284
}
63-
}
85+
}

test/WebJobs.Script.Tests/Rpc/TestFunctionRpcService.cs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ public void PublishFunctionEnvironmentReloadResponseEvent()
5959
_eventManager.Publish(new InboundEvent(_workerId, responseMessage));
6060
}
6161

62+
public void PublishWorkerInitResponseEvent()
63+
{
64+
StatusResult statusResult = new StatusResult()
65+
{
66+
Status = StatusResult.Types.Status.Success
67+
};
68+
WorkerInitResponse initResponse = new WorkerInitResponse()
69+
{
70+
Result = statusResult
71+
};
72+
StreamingMessage responseMessage = new StreamingMessage()
73+
{
74+
WorkerInitResponse = initResponse
75+
};
76+
_eventManager.Publish(new InboundEvent(_workerId, responseMessage));
77+
}
78+
6279
public static FunctionEnvironmentReloadResponse GetTestFunctionEnvReloadResponse()
6380
{
6481
StatusResult statusResult = new StatusResult()
@@ -89,5 +106,22 @@ public void PublishInvocationResponseEvent()
89106
};
90107
_eventManager.Publish(new InboundEvent(_workerId, responseMessage));
91108
}
109+
110+
public void PublishStartStreamEvent(string workerId)
111+
{
112+
StatusResult statusResult = new StatusResult()
113+
{
114+
Status = StatusResult.Types.Status.Success
115+
};
116+
StartStream startStream = new StartStream()
117+
{
118+
WorkerId = workerId
119+
};
120+
StreamingMessage responseMessage = new StreamingMessage()
121+
{
122+
StartStream = startStream
123+
};
124+
_eventManager.Publish(new InboundEvent(_workerId, responseMessage));
125+
}
92126
}
93-
}
127+
}

0 commit comments

Comments
 (0)