1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-09-11 20:12:41 +02:00

New: Option to send notification when a Health Check warning occurs

This commit is contained in:
Devin Buhl 2019-11-04 15:44:33 -05:00 committed by Qstick
parent e0b6bde525
commit 4e07e3bd68
26 changed files with 253 additions and 5 deletions

View File

@ -42,10 +42,13 @@ function EditNotificationModalContent(props) {
onDownload, onDownload,
onUpgrade, onUpgrade,
onRename, onRename,
onHealthIssue,
supportsOnGrab, supportsOnGrab,
supportsOnDownload, supportsOnDownload,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename, supportsOnRename,
supportsOnHealthIssue,
includeHealthWarnings,
tags, tags,
fields, fields,
message message
@ -147,6 +150,35 @@ function EditNotificationModalContent(props) {
/> />
</FormGroup> </FormGroup>
<FormGroup>
<FormLabel>On Health Issue</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="onHealthIssue"
helpText="Be notified on health check failures"
isDisabled={!supportsOnHealthIssue.value}
{...onHealthIssue}
onChange={onInputChange}
/>
</FormGroup>
{
onHealthIssue.value &&
<FormGroup>
<FormLabel>Include Health Warnings</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="includeHealthWarnings"
helpText="Be notified on health warnings in addition to errors"
isDisabled={!supportsOnHealthIssue.value}
{...includeHealthWarnings}
onChange={onInputChange}
/>
</FormGroup>
}
<FormGroup> <FormGroup>
<FormLabel>Tags</FormLabel> <FormLabel>Tags</FormLabel>

View File

@ -58,10 +58,12 @@ class Notification extends Component {
onDownload, onDownload,
onUpgrade, onUpgrade,
onRename, onRename,
onHealthIssue,
supportsOnGrab, supportsOnGrab,
supportsOnDownload, supportsOnDownload,
supportsOnUpgrade, supportsOnUpgrade,
supportsOnRename supportsOnRename,
supportsOnHealthIssue
} = this.props; } = this.props;
return ( return (
@ -102,6 +104,13 @@ class Notification extends Component {
</Label> </Label>
} }
{
supportsOnHealthIssue && onHealthIssue &&
<Label kind={kinds.SUCCESS}>
On Health Issue
</Label>
}
{ {
!onGrab && !onDownload && !onRename && !onGrab && !onDownload && !onRename &&
<Label <Label
@ -140,10 +149,12 @@ Notification.propTypes = {
onDownload: PropTypes.bool.isRequired, onDownload: PropTypes.bool.isRequired,
onUpgrade: PropTypes.bool.isRequired, onUpgrade: PropTypes.bool.isRequired,
onRename: PropTypes.bool.isRequired, onRename: PropTypes.bool.isRequired,
onHealthIssue: PropTypes.bool.isRequired,
supportsOnGrab: PropTypes.bool.isRequired, supportsOnGrab: PropTypes.bool.isRequired,
supportsOnDownload: PropTypes.bool.isRequired, supportsOnDownload: PropTypes.bool.isRequired,
supportsOnUpgrade: PropTypes.bool.isRequired, supportsOnUpgrade: PropTypes.bool.isRequired,
supportsOnRename: PropTypes.bool.isRequired, supportsOnRename: PropTypes.bool.isRequired,
supportsOnHealthIssue: PropTypes.bool.isRequired,
onConfirmDeleteNotification: PropTypes.func.isRequired onConfirmDeleteNotification: PropTypes.func.isRequired
}; };

View File

@ -65,6 +65,11 @@ public override void OnMovieRename(Movie movie)
TestLogger.Info("OnRename was called"); TestLogger.Info("OnRename was called");
} }
public override void OnHealthIssue(NzbDrone.Core.HealthCheck.HealthCheck artist)
{
TestLogger.Info("OnHealthIssue was called");
}
} }
class TestNotificationWithNoEvents : NotificationBase<TestSetting> class TestNotificationWithNoEvents : NotificationBase<TestSetting>
@ -102,6 +107,7 @@ public void should_support_all_if_implemented()
notification.SupportsOnDownload.Should().BeTrue(); notification.SupportsOnDownload.Should().BeTrue();
notification.SupportsOnUpgrade.Should().BeTrue(); notification.SupportsOnUpgrade.Should().BeTrue();
notification.SupportsOnRename.Should().BeTrue(); notification.SupportsOnRename.Should().BeTrue();
notification.SupportsOnHealthIssue.Should().BeTrue();
} }
@ -114,6 +120,7 @@ public void should_support_none_if_none_are_implemented()
notification.SupportsOnDownload.Should().BeFalse(); notification.SupportsOnDownload.Should().BeFalse();
notification.SupportsOnUpgrade.Should().BeFalse(); notification.SupportsOnUpgrade.Should().BeFalse();
notification.SupportsOnRename.Should().BeFalse(); notification.SupportsOnRename.Should().BeFalse();
notification.SupportsOnHealthIssue.Should().BeFalse();
} }
} }

View File

@ -0,0 +1,15 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(160)]
public class health_issue_notification : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("Notifications").AddColumn("OnHealthIssue").AsBoolean().WithDefaultValue(0);
Alter.Table("Notifications").AddColumn("IncludeHealthWarnings").AsBoolean().WithDefaultValue(0);
}
}
}

View File

@ -74,7 +74,8 @@ public static void Map()
.Ignore(i => i.SupportsOnGrab) .Ignore(i => i.SupportsOnGrab)
.Ignore(i => i.SupportsOnDownload) .Ignore(i => i.SupportsOnDownload)
.Ignore(i => i.SupportsOnUpgrade) .Ignore(i => i.SupportsOnUpgrade)
.Ignore(i => i.SupportsOnRename); .Ignore(i => i.SupportsOnRename)
.Ignore(i => i.SupportsOnHealthIssue);
Mapper.Entity<MetadataDefinition>().RegisterDefinition("Metadata") Mapper.Entity<MetadataDefinition>().RegisterDefinition("Metadata")
.Ignore(d => d.Tags); .Ignore(d => d.Tags);

View File

@ -0,0 +1,14 @@
using NzbDrone.Common.Messaging;
namespace NzbDrone.Core.HealthCheck
{
public class HealthCheckFailedEvent : IEvent
{
public HealthCheck HealthCheck { get; private set; }
public HealthCheckFailedEvent(HealthCheck healthCheck)
{
HealthCheck = healthCheck;
}
}
}

View File

@ -80,6 +80,11 @@ private void PerformHealthCheck(IProvideHealthCheck[] healthChecks)
else else
{ {
if (_healthCheckResults.Find(result.Source.Name) == null)
{
_eventAggregator.PublishEvent(new HealthCheckFailedEvent(result));
}
_healthCheckResults.Set(result.Source.Name, result); _healthCheckResults.Set(result.Source.Name, result);
} }
} }

View File

@ -26,6 +26,11 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE , message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE , message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE, message.Message, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -8,6 +8,7 @@
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Processes; using NzbDrone.Common.Processes;
using NzbDrone.Core.HealthCheck;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;
using NzbDrone.Core.Movies; using NzbDrone.Core.Movies;
using NzbDrone.Core.Validation; using NzbDrone.Core.Validation;
@ -112,6 +113,18 @@ public override void OnMovieRename(Movie movie)
ExecuteScript(environmentVariables); ExecuteScript(environmentVariables);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
var environmentVariables = new StringDictionary();
environmentVariables.Add("Radarr_EventType", "HealthIssue");
environmentVariables.Add("Radarr_Health_Issue_Level", nameof(healthCheck.Type));
environmentVariables.Add("Radarr_Health_Issue_Message", healthCheck.Message);
environmentVariables.Add("Radarr_Health_Issue_Type", healthCheck.Source.Name);
environmentVariables.Add("Radarr_Health_Issue_Wiki", healthCheck.WikiUrl.ToString() ?? string.Empty);
ExecuteScript(environmentVariables);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -53,6 +53,23 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
var attachments = new List<Embed>
{
new Embed
{
Title = healthCheck.Source.Name,
Text = healthCheck.Message,
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? (int)DiscordColors.Warning : (int)DiscordColors.Success
}
};
var payload = CreatePayload("Health Issue", attachments);
_proxy.SendPayload(payload, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -32,6 +32,10 @@ public override void OnDownload(DownloadMessage message)
_emailService.SendEmail(Settings, MOVIE_DOWNLOADED_TITLE_BRANDED, body); _emailService.SendEmail(Settings, MOVIE_DOWNLOADED_TITLE_BRANDED, body);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message)
{
_emailService.SendEmail(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {

View File

@ -29,6 +29,11 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -10,9 +10,11 @@ public interface INotification : IProvider
void OnGrab(GrabMessage grabMessage); void OnGrab(GrabMessage grabMessage);
void OnDownload(DownloadMessage message); void OnDownload(DownloadMessage message);
void OnMovieRename(Movie movie); void OnMovieRename(Movie movie);
void OnHealthIssue(HealthCheck.HealthCheck healthCheck);
bool SupportsOnGrab { get; } bool SupportsOnGrab { get; }
bool SupportsOnDownload { get; } bool SupportsOnDownload { get; }
bool SupportsOnUpgrade { get; } bool SupportsOnUpgrade { get; }
bool SupportsOnRename { get; } bool SupportsOnRename { get; }
bool SupportsOnHealthIssue { get; }
} }
} }

View File

@ -27,6 +27,11 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, message.Message, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -47,6 +47,13 @@ public override void OnMovieRename(Movie movie)
} }
} }
public override void OnHealthIssue(HealthCheck.HealthCheck message)
{
if (Settings.Notify)
{
_mediaBrowserService.Notify(Settings, HEALTH_ISSUE_TITLE_BRANDED, message.Message);
}
}
public override ValidationResult Test() public override ValidationResult Test()
{ {

View File

@ -10,9 +10,11 @@ namespace NzbDrone.Core.Notifications
{ {
protected const string MOVIE_GRABBED_TITLE = "Movie Grabbed"; protected const string MOVIE_GRABBED_TITLE = "Movie Grabbed";
protected const string MOVIE_DOWNLOADED_TITLE = "Movie Downloaded"; protected const string MOVIE_DOWNLOADED_TITLE = "Movie Downloaded";
protected const string HEALTH_ISSUE_TITLE = "Health Check Failure";
protected const string MOVIE_GRABBED_TITLE_BRANDED = "Radarr - " + MOVIE_GRABBED_TITLE; protected const string MOVIE_GRABBED_TITLE_BRANDED = "Radarr - " + MOVIE_GRABBED_TITLE;
protected const string MOVIE_DOWNLOADED_TITLE_BRANDED = "Radarr - " + MOVIE_DOWNLOADED_TITLE; protected const string MOVIE_DOWNLOADED_TITLE_BRANDED = "Radarr - " + MOVIE_DOWNLOADED_TITLE;
protected const string HEALTH_ISSUE_TITLE_BRANDED = "Radarr - " + HEALTH_ISSUE_TITLE;
public abstract string Name { get; } public abstract string Name { get; }
@ -42,10 +44,16 @@ public virtual void OnMovieRename(Movie movie)
} }
public virtual void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
}
public bool SupportsOnGrab => HasConcreteImplementation("OnGrab"); public bool SupportsOnGrab => HasConcreteImplementation("OnGrab");
public bool SupportsOnRename => HasConcreteImplementation("OnMovieRename"); public bool SupportsOnRename => HasConcreteImplementation("OnMovieRename");
public bool SupportsOnDownload => HasConcreteImplementation("OnDownload"); public bool SupportsOnDownload => HasConcreteImplementation("OnDownload");
public bool SupportsOnUpgrade => SupportsOnDownload; public bool SupportsOnUpgrade => SupportsOnDownload;
public bool SupportsOnHealthIssue => HasConcreteImplementation("OnHealthIssue");
protected TSettings Settings => (TSettings)Definition.Settings; protected TSettings Settings => (TSettings)Definition.Settings;

View File

@ -8,11 +8,14 @@ public class NotificationDefinition : ProviderDefinition
public bool OnDownload { get; set; } public bool OnDownload { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnHealthIssue { get; set; }
public bool SupportsOnGrab { get; set; } public bool SupportsOnGrab { get; set; }
public bool SupportsOnDownload { get; set; } public bool SupportsOnDownload { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnHealthIssue { get; set; }
public bool IncludeHealthWarnings { get; set; }
public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade); public override bool Enable => OnGrab || OnDownload || (OnDownload && OnUpgrade) || OnHealthIssue;
} }
} }

View File

@ -13,6 +13,7 @@ public interface INotificationFactory : IProviderFactory<INotification, Notifica
List<INotification> OnDownloadEnabled(); List<INotification> OnDownloadEnabled();
List<INotification> OnUpgradeEnabled(); List<INotification> OnUpgradeEnabled();
List<INotification> OnRenameEnabled(); List<INotification> OnRenameEnabled();
List<INotification> OnHealthIssueEnabled();
} }
public class NotificationFactory : ProviderFactory<INotification, NotificationDefinition>, INotificationFactory public class NotificationFactory : ProviderFactory<INotification, NotificationDefinition>, INotificationFactory
@ -42,6 +43,11 @@ public List<INotification> OnRenameEnabled()
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList(); return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnRename).ToList();
} }
public List<INotification> OnHealthIssueEnabled()
{
return GetAvailableProviders().Where(n => ((NotificationDefinition)n.Definition).OnHealthIssue).ToList();
}
public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition) public override void SetProviderCharacteristics(INotification provider, NotificationDefinition definition)
{ {
base.SetProviderCharacteristics(provider, definition); base.SetProviderCharacteristics(provider, definition);
@ -50,6 +56,7 @@ public override void SetProviderCharacteristics(INotification provider, Notifica
definition.SupportsOnDownload = provider.SupportsOnDownload; definition.SupportsOnDownload = provider.SupportsOnDownload;
definition.SupportsOnUpgrade = provider.SupportsOnUpgrade; definition.SupportsOnUpgrade = provider.SupportsOnUpgrade;
definition.SupportsOnRename = provider.SupportsOnRename; definition.SupportsOnRename = provider.SupportsOnRename;
definition.SupportsOnHealthIssue = provider.SupportsOnHealthIssue;
} }
} }
} }

View File

@ -4,6 +4,7 @@
using NLog; using NLog;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.HealthCheck;
using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
@ -15,7 +16,8 @@ namespace NzbDrone.Core.Notifications
public class NotificationService public class NotificationService
: IHandle<MovieRenamedEvent>, : IHandle<MovieRenamedEvent>,
IHandle<MovieGrabbedEvent>, IHandle<MovieGrabbedEvent>,
IHandle<MovieDownloadedEvent> IHandle<MovieDownloadedEvent>,
IHandle<HealthCheckFailedEvent>
{ {
private readonly INotificationFactory _notificationFactory; private readonly INotificationFactory _notificationFactory;
@ -63,6 +65,21 @@ private bool ShouldHandleMovie(ProviderDefinition definition, Movie movie)
return false; return false;
} }
private bool ShouldHandleHealthFailure(HealthCheck.HealthCheck healthCheck, bool includeWarnings)
{
if (healthCheck.Type == HealthCheckResult.Error)
{
return true;
}
if (healthCheck.Type == HealthCheckResult.Warning && includeWarnings)
{
return true;
}
return false;
}
public void Handle(MovieGrabbedEvent message) public void Handle(MovieGrabbedEvent message)
{ {
var grabMessage = new GrabMessage var grabMessage = new GrabMessage
@ -138,5 +155,24 @@ public void Handle(MovieRenamedEvent message)
} }
} }
} }
public void Handle(HealthCheckFailedEvent message)
{
foreach (var notification in _notificationFactory.OnHealthIssueEnabled())
{
try
{
if (ShouldHandleHealthFailure(message.HealthCheck, ((NotificationDefinition)notification.Definition).IncludeHealthWarnings))
{
notification.OnHealthIssue(message.HealthCheck);
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Unable to send OnHealthIssue notification to: " + notification.Definition.Name);
}
}
}
} }
} }

View File

@ -29,6 +29,11 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE_BRANDED, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -26,6 +26,11 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -70,6 +70,23 @@ public override void OnMovieRename(Movie movie)
_proxy.SendPayload(payload, Settings); _proxy.SendPayload(payload, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
var attachments = new List<Attachment>
{
new Attachment
{
Title = healthCheck.Source.Name,
Text = healthCheck.Message,
Color = healthCheck.Type == HealthCheck.HealthCheckResult.Warning ? "warning" : "danger"
}
};
var payload = CreatePayload("Health Issue", attachments);
_proxy.SendPayload(payload, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -26,6 +26,11 @@ public override void OnDownload(DownloadMessage message)
_proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings); _proxy.SendNotification(MOVIE_DOWNLOADED_TITLE, message.Message, Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_proxy.SendNotification(HEALTH_ISSUE_TITLE, healthCheck.Message, Settings);
}
public override ValidationResult Test() public override ValidationResult Test()
{ {
var failures = new List<ValidationFailure>(); var failures = new List<ValidationFailure>();

View File

@ -29,6 +29,11 @@ public override void OnDownload(DownloadMessage message)
_twitterService.SendNotification($"[Radarr] Imported: {message.Message}", Settings); _twitterService.SendNotification($"[Radarr] Imported: {message.Message}", Settings);
} }
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
_twitterService.SendNotification($"Health Issue: {healthCheck.Message}", Settings);
}
public override object RequestAction(string action, IDictionary<string, string> query) public override object RequestAction(string action, IDictionary<string, string> query)
{ {
if (action == "startOAuth") if (action == "startOAuth")

View File

@ -41,7 +41,12 @@ public override void OnMovieRename(Movie movie)
UpdateAndCleanMovie(movie); UpdateAndCleanMovie(movie);
} }
public override string Name => "Kodi (XBMC)"; public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
{
Notify(Settings, HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message);
}
public override string Name => "Kodi";
public override ValidationResult Test() public override ValidationResult Test()
{ {

View File

@ -9,10 +9,13 @@ public class NotificationResource : ProviderResource
public bool OnDownload { get; set; } public bool OnDownload { get; set; }
public bool OnUpgrade { get; set; } public bool OnUpgrade { get; set; }
public bool OnRename { get; set; } public bool OnRename { get; set; }
public bool OnHealthIssue { get; set; }
public bool SupportsOnGrab { get; set; } public bool SupportsOnGrab { get; set; }
public bool SupportsOnDownload { get; set; } public bool SupportsOnDownload { get; set; }
public bool SupportsOnUpgrade { get; set; } public bool SupportsOnUpgrade { get; set; }
public bool SupportsOnRename { get; set; } public bool SupportsOnRename { get; set; }
public bool SupportsOnHealthIssue { get; set; }
public bool IncludeHealthWarnings { get; set; }
public string TestCommand { get; set; } public string TestCommand { get; set; }
} }
@ -28,10 +31,13 @@ public override NotificationResource ToResource(NotificationDefinition definitio
resource.OnDownload = definition.OnDownload; resource.OnDownload = definition.OnDownload;
resource.OnUpgrade = definition.OnUpgrade; resource.OnUpgrade = definition.OnUpgrade;
resource.OnRename = definition.OnRename; resource.OnRename = definition.OnRename;
resource.OnHealthIssue = definition.OnHealthIssue;
resource.SupportsOnGrab = definition.SupportsOnGrab; resource.SupportsOnGrab = definition.SupportsOnGrab;
resource.SupportsOnDownload = definition.SupportsOnDownload; resource.SupportsOnDownload = definition.SupportsOnDownload;
resource.SupportsOnUpgrade = definition.SupportsOnUpgrade; resource.SupportsOnUpgrade = definition.SupportsOnUpgrade;
resource.SupportsOnRename = definition.SupportsOnRename; resource.SupportsOnRename = definition.SupportsOnRename;
resource.SupportsOnHealthIssue = definition.SupportsOnHealthIssue;
resource.IncludeHealthWarnings = definition.IncludeHealthWarnings;
return resource; return resource;
} }
@ -46,10 +52,13 @@ public override NotificationDefinition ToModel(NotificationResource resource)
definition.OnDownload = resource.OnDownload; definition.OnDownload = resource.OnDownload;
definition.OnUpgrade = resource.OnUpgrade; definition.OnUpgrade = resource.OnUpgrade;
definition.OnRename = resource.OnRename; definition.OnRename = resource.OnRename;
definition.OnHealthIssue = resource.OnHealthIssue;
definition.SupportsOnGrab = resource.SupportsOnGrab; definition.SupportsOnGrab = resource.SupportsOnGrab;
definition.SupportsOnDownload = resource.SupportsOnDownload; definition.SupportsOnDownload = resource.SupportsOnDownload;
definition.SupportsOnUpgrade = resource.SupportsOnUpgrade; definition.SupportsOnUpgrade = resource.SupportsOnUpgrade;
definition.SupportsOnRename = resource.SupportsOnRename; definition.SupportsOnRename = resource.SupportsOnRename;
definition.SupportsOnHealthIssue = resource.SupportsOnHealthIssue;
definition.IncludeHealthWarnings = resource.IncludeHealthWarnings;
return definition; return definition;
} }