2020-10-12 18:24:19 +00:00
using System ;
2015-06-27 09:43:17 +00:00
using System.Linq ;
using NzbDrone.Common.Extensions ;
using NzbDrone.Core.Indexers ;
2017-10-27 03:21:06 +00:00
using NzbDrone.Core.ThingiProvider.Events ;
2015-06-27 09:43:17 +00:00
namespace NzbDrone.Core.HealthCheck.Checks
{
2017-10-27 03:21:06 +00:00
[CheckOn(typeof(ProviderUpdatedEvent<IIndexer>))]
[CheckOn(typeof(ProviderDeletedEvent<IIndexer>))]
[CheckOn(typeof(ProviderStatusChangedEvent<IIndexer>))]
2015-06-27 09:43:17 +00:00
public class IndexerStatusCheck : HealthCheckBase
{
2017-10-27 03:21:06 +00:00
private readonly IIndexerFactory _providerFactory ;
private readonly IIndexerStatusService _providerStatusService ;
2015-06-27 09:43:17 +00:00
2017-10-27 03:21:06 +00:00
public IndexerStatusCheck ( IIndexerFactory providerFactory , IIndexerStatusService providerStatusService )
2015-06-27 09:43:17 +00:00
{
2017-10-27 03:21:06 +00:00
_providerFactory = providerFactory ;
_providerStatusService = providerStatusService ;
2015-06-27 09:43:17 +00:00
}
public override HealthCheck Check ( )
{
2017-10-27 03:21:06 +00:00
var enabledProviders = _providerFactory . GetAvailableProviders ( ) ;
var backOffProviders = enabledProviders . Join ( _providerStatusService . GetBlockedProviders ( ) ,
2020-10-12 18:24:19 +00:00
i = > i . Definition . Id ,
s = > s . ProviderId ,
( i , s ) = > new { Provider = i , Status = s } )
. Where ( p = > p . Status . InitialFailure . HasValue & &
p . Status . InitialFailure . Value . After (
DateTime . UtcNow . AddHours ( - 6 ) ) )
. ToList ( ) ;
2015-06-27 09:43:17 +00:00
2017-10-27 03:21:06 +00:00
if ( backOffProviders . Empty ( ) )
2015-06-27 09:43:17 +00:00
{
return new HealthCheck ( GetType ( ) ) ;
}
2017-10-27 03:21:06 +00:00
if ( backOffProviders . Count = = enabledProviders . Count )
2015-06-27 09:43:17 +00:00
{
2021-08-04 22:47:40 +00:00
return new HealthCheck ( GetType ( ) , HealthCheckResult . Error , "All indexers are unavailable due to failures" , "#indexers-are-unavailable-due-to-failures" ) ;
2015-06-27 09:43:17 +00:00
}
2021-08-04 22:47:40 +00:00
return new HealthCheck ( GetType ( ) , HealthCheckResult . Warning , string . Format ( "Indexers unavailable due to failures: {0}" , string . Join ( ", " , backOffProviders . Select ( v = > v . Provider . Definition . Name ) ) ) , "#indexers-are-unavailable-due-to-failures" ) ;
2015-06-27 09:43:17 +00:00
}
}
}