public IActionResult DrainStatus([FromServices] IScriptHostManager scriptHostManager) { if (Utility.TryGetHostService(scriptHostManager, out IFunctionActivityStatusProvider functionActivityStatusProvider) && Utility.TryGetHostService(scriptHostManager, out IDrainModeManager drainModeManager)) { var functionActivityStatus = functionActivityStatusProvider.GetStatus(); DrainModeState state = DrainModeState.Disabled; if (drainModeManager.IsDrainModeEnabled) { state = (functionActivityStatus.OutstandingInvocations == 0 && functionActivityStatus.OutstandingRetries == 0) ? DrainModeState.Completed : DrainModeState.InProgress; } DrainModeStatus status = new DrainModeStatus() { State = state }; string message = $"Drain Status: {JsonConvert.SerializeObject(state, Formatting.Indented)}, Activity Status: {JsonConvert.SerializeObject(functionActivityStatus, Formatting.Indented)}"; _logger.LogDebug(message); return(Ok(status)); } else { return(StatusCode(StatusCodes.Status503ServiceUnavailable)); } }
public void GetDrainStatus_HostRunning_ReturnsExpected(int outstandingRetries, int outstandingInvocations, DrainModeState expectedState) { var scriptHostManagerMock = new Mock <IScriptHostManager>(MockBehavior.Strict); var functionActivityStatusProvider = new Mock <IFunctionActivityStatusProvider>(MockBehavior.Strict); var drainModeManager = new Mock <IDrainModeManager>(MockBehavior.Strict); functionActivityStatusProvider.Setup(x => x.GetStatus()).Returns(new FunctionActivityStatus() { OutstandingRetries = outstandingRetries, OutstandingInvocations = outstandingInvocations }); var serviceProviderMock = scriptHostManagerMock.As <IServiceProvider>(); serviceProviderMock.Setup(x => x.GetService(typeof(IFunctionActivityStatusProvider))).Returns(functionActivityStatusProvider.Object); serviceProviderMock.Setup(x => x.GetService(typeof(IDrainModeManager))).Returns(drainModeManager.Object); drainModeManager.Setup(x => x.IsDrainModeEnabled).Returns(expectedState != DrainModeState.Disabled); var result = (OkObjectResult)_hostController.DrainStatus(scriptHostManagerMock.Object); Assert.Equal(expectedState, (result.Value as DrainModeStatus).State); }