Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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 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);
            }
        }
Esempio n. 4
0
        /// <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);
            }
        }