From 318dcfef3599bea42981afa48ae7fefa8252c94e Mon Sep 17 00:00:00 2001 From: Zhen Wang Date: Tue, 13 Aug 2019 11:02:51 -0700 Subject: [PATCH] Don't update condition if status stays False/Unknown for custom plugin --- .../custom_plugin_monitor.go | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/pkg/custompluginmonitor/custom_plugin_monitor.go b/pkg/custompluginmonitor/custom_plugin_monitor.go index 9edd787c..629b2f94 100644 --- a/pkg/custompluginmonitor/custom_plugin_monitor.go +++ b/pkg/custompluginmonitor/custom_plugin_monitor.go @@ -121,74 +121,74 @@ func (c *customPluginMonitor) generateStatus(result cpmtypes.Result) *types.Stat }) } } else { - // For permanent error changes the condition + // For permanent error that changes the condition for i := range c.conditions { condition := &c.conditions[i] if condition.Type == result.Rule.Condition { - status := toConditionStatus(result.ExitStatus) - // change 1: Condition status change from True to False/Unknown - if condition.Status == types.True && status != types.True { - condition.Transition = timestamp - var defaultConditionReason string - var defaultConditionMessage string - for j := range c.config.DefaultConditions { - defaultCondition := &c.config.DefaultConditions[j] - if defaultCondition.Type == result.Rule.Condition { - defaultConditionReason = defaultCondition.Reason - defaultConditionMessage = defaultCondition.Message - break - } + // The condition reason specified in the rule and the result message + // represent the problem happened. We need to know the default condition + // from the config, so that we can set the new condition reason/message + // back when such problem goes away. + var defaultConditionReason string + var defaultConditionMessage string + for j := range c.config.DefaultConditions { + defaultCondition := &c.config.DefaultConditions[j] + if defaultCondition.Type == result.Rule.Condition { + defaultConditionReason = defaultCondition.Reason + defaultConditionMessage = defaultCondition.Message + break } + } - events = append(events, util.GenerateConditionChangeEvent( - condition.Type, - status, - defaultConditionReason, - timestamp, - )) - - condition.Status = status - condition.Message = defaultConditionMessage - condition.Reason = defaultConditionReason + needToUpdateCondition := true + var newReason string + var newMessage string + status := toConditionStatus(result.ExitStatus) + if condition.Status == types.True && status != types.True { + // Scenario 1: Condition status changes from True to False/Unknown + newReason = defaultConditionReason + if newMessage == "" { + newMessage = defaultConditionMessage + } else { + newMessage = result.Message + } } else if condition.Status != types.True && status == types.True { - // change 2: Condition status change from False/Unknown to True - condition.Transition = timestamp - condition.Message = result.Message - events = append(events, util.GenerateConditionChangeEvent( - condition.Type, - status, - result.Rule.Reason, - timestamp, - )) - - condition.Status = status - condition.Reason = result.Rule.Reason + // Scenario 2: Condition status changes from False/Unknown to True + newReason = result.Rule.Reason + newMessage = result.Message } else if condition.Status != status { - // change 3: Condition status change from False to Unknown or vice versa - condition.Transition = timestamp - condition.Message = result.Message - events = append(events, util.GenerateConditionChangeEvent( - condition.Type, - status, - result.Rule.Reason, - timestamp, - )) - - condition.Status = status - condition.Reason = result.Rule.Reason - } else if condition.Status == status && + // Scenario 3: Condition status changes from False to Unknown or vice versa + newReason = defaultConditionReason + if newMessage == "" { + newMessage = defaultConditionMessage + } else { + newMessage = result.Message + } + } else if condition.Status == types.True && status == types.True && (condition.Reason != result.Rule.Reason || (*c.config.PluginGlobalConfig.EnableMessageChangeBasedConditionUpdate && condition.Message != result.Message)) { - // change 4: Condition status do not change. + // Scenario 4: Condition status does not change and it stays true. // condition reason changes or // condition message changes when message based condition update is enabled. + newReason = result.Rule.Reason + newMessage = result.Message + } else { + // Scenario 5: Condition status does not change and it stays False/Unknown. + // This should just be the default reason or message (as a consequence + // of scenario 1 and scenario 3 above). + needToUpdateCondition = false + } + + if needToUpdateCondition { condition.Transition = timestamp - condition.Reason = result.Rule.Reason - condition.Message = result.Message + condition.Status = status + condition.Reason = newReason + condition.Message = newMessage + events = append(events, util.GenerateConditionChangeEvent( condition.Type, status, - condition.Reason, + newReason, timestamp, )) }