/// <summary>Waits for a container to be ready</summary> /// <param name="statusProvider">The status provider.</param> /// <returns></returns> /// <exception cref="InvalidOperationException">Initialize sequence timed-out.</exception> public async Task <Status> WaitAsync( IResourceStatusProvider statusProvider) { var timer = Stopwatch.StartNew(); Status status = Status.NotReady; while (timer.Elapsed < _settings.WaitTimeout && !status.IsReady) { try { var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(5)); status = await statusProvider.IsReadyAsync(cts.Token); } catch (Exception ex) { Trace.TraceWarning($"Container status error. {_settings.Name} -> {ex.Message}"); } if (!status.IsReady) { await _manager.ConsumeLogsAsync(TimeSpan.FromSeconds(intervallInSeconds)); Trace.TraceWarning($"Container is not yet {_settings.Name} not ready. --> {status.Message}"); } } if (!status.IsReady) { throw new InvalidOperationException( $"Initialize sequence timed-out. {status.Message}\r\n{_manager.Instance.Logs}"); } return(status); }
/// <summary> /// Waits a specific resource to initialize by checking his status. /// </summary> public static async Task <Status> WaitAsync( IResourceStatusProvider statusProvider, IImageSettings settings) { return(await WaitAsync( statusProvider, TimeSpan.FromSeconds(30), settings)); }
internal static async Task <Status> WaitAsync( IResourceStatusProvider statusProvider, TimeSpan timeout, IImageSettings settings) { Stopwatch timer = Stopwatch.StartNew(); Status status = Status.NotReady; while (timer.Elapsed < timeout && !status.IsReady) { try { status = await statusProvider.IsReadyAsync(); } catch { // We are not interested in any client errors } await Task.Delay(TimeSpan.FromSeconds(2)); } if (!status.IsReady) { throw new InvalidOperationException( $"Initialize sequence timed-out. {status.Message}\r\n{settings.Logs}"); } return(status); }
/// <summary>Waits for a container to be ready</summary> /// <param name="statusProvider">The status provider.</param> /// <returns></returns> /// <exception cref="InvalidOperationException">Initialize sequence timed-out.</exception> public async Task <Status> WaitAsync(IResourceStatusProvider statusProvider) { using (var cancellation = new CancellationTokenSource()) { _settings.Logger.Verbose($"Wait to start for {_settings.WaitTimeout}"); var retries = 1; cancellation.CancelAfter(_settings.WaitTimeout); Status status = Status.NotReady; while (!cancellation.IsCancellationRequested && !status.IsReady) { try { using (var singleRunCancellation = new CancellationTokenSource()) { _settings.Logger.Verbose($"Try read container status [run {retries++}]"); singleRunCancellation.CancelAfter(_readyTimeout); status = await statusProvider.IsReadyAsync(singleRunCancellation.Token); _settings.Logger.ContainerStatus(status); } } catch (Exception ex) { _settings.Logger.Verbose("Container status error", ex); } if (!status.IsReady && !cancellation.IsCancellationRequested) { await Task.Delay(_delayNotReady); _settings.Logger.Verbose("Container is not ready"); } } if (!status.IsReady) { await _manager.ConsumeLogsAsync(_consumeLogsInterval); throw new InvalidOperationException( $"Initialize sequence timed-out (see test output). {status.Message}"); } return(status); } }
/// <summary>Waits for a container to be ready</summary> /// <param name="statusProvider">The status provider.</param> /// <returns></returns> /// <exception cref="InvalidOperationException">Initialize sequence timed-out.</exception> public async Task <Status> WaitAsync(IResourceStatusProvider statusProvider) { using (var cancellation = new CancellationTokenSource()) { cancellation.CancelAfter(_settings.WaitTimeout); Status status = Status.NotReady; while (!cancellation.IsCancellationRequested && !status.IsReady) { try { using (var singleRunCancellation = new CancellationTokenSource()) { singleRunCancellation.CancelAfter(_readyTimeout); status = await statusProvider.IsReadyAsync(singleRunCancellation.Token); } } catch (Exception ex) { Trace.TraceWarning($"Container status error. {_settings.Name} -> {ex.Message}"); } if (!status.IsReady) { await _manager.ConsumeLogsAsync(_consumeLogsInterval); Trace.TraceWarning($"Container is not yet {_settings.Name} not ready. --> {status.Message}"); } } if (!status.IsReady) { string logs = string.Join("\n", _manager.Instance.Logs.Distinct()); throw new InvalidOperationException( $"Initialize sequence timed-out. {status.Message}\r\n{logs}"); } return(status); } }