Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-01-25 03:11:15 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-01-25 03:11:15 +0300
commitce545ca5d74c9eabf6f2412c1332820c81342271 (patch)
tree33063c2e1b75b22797cd837623e19ca1c0bddd59 /app/models/concerns
parentba0d8b409534f02c23bf2447fd32246926ba4392 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/concerns')
-rw-r--r--app/models/concerns/web_hooks/auto_disabling.rb69
-rw-r--r--app/models/concerns/web_hooks/unstoppable.rb29
2 files changed, 98 insertions, 0 deletions
diff --git a/app/models/concerns/web_hooks/auto_disabling.rb b/app/models/concerns/web_hooks/auto_disabling.rb
new file mode 100644
index 00000000000..2cc17a6f185
--- /dev/null
+++ b/app/models/concerns/web_hooks/auto_disabling.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module WebHooks
+ module AutoDisabling
+ extend ActiveSupport::Concern
+
+ included do
+ # A hook is disabled if:
+ #
+ # - we are no longer in the grace-perod (recent_failures > ?)
+ # - and either:
+ # - disabled_until is nil (i.e. this was set by WebHook#fail!)
+ # - or disabled_until is in the future (i.e. this was set by WebHook#backoff!)
+ scope :disabled, -> do
+ where('recent_failures > ? AND (disabled_until IS NULL OR disabled_until >= ?)',
+ WebHook::FAILURE_THRESHOLD, Time.current)
+ end
+
+ # A hook is executable if:
+ #
+ # - we are still in the grace-period (recent_failures <= ?)
+ # - OR we have exceeded the grace period and neither of the following is true:
+ # - disabled_until is nil (i.e. this was set by WebHook#fail!)
+ # - disabled_until is in the future (i.e. this was set by WebHook#backoff!)
+ scope :executable, -> do
+ where('recent_failures <= ? OR (recent_failures > ? AND (disabled_until IS NOT NULL) AND (disabled_until < ?))',
+ WebHook::FAILURE_THRESHOLD, WebHook::FAILURE_THRESHOLD, Time.current)
+ end
+ end
+
+ def executable?
+ !temporarily_disabled? && !permanently_disabled?
+ end
+
+ def temporarily_disabled?
+ return false if recent_failures <= WebHook::FAILURE_THRESHOLD
+
+ disabled_until.present? && disabled_until >= Time.current
+ end
+
+ def permanently_disabled?
+ return false if disabled_until.present?
+
+ recent_failures > WebHook::FAILURE_THRESHOLD
+ end
+
+ def disable!
+ return if permanently_disabled?
+
+ super
+ end
+
+ def backoff!
+ return if permanently_disabled? || (backoff_count >= WebHook::MAX_FAILURES && temporarily_disabled?)
+
+ super
+ end
+
+ def alert_status
+ if temporarily_disabled?
+ :temporarily_disabled
+ elsif permanently_disabled?
+ :disabled
+ else
+ :executable
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/web_hooks/unstoppable.rb b/app/models/concerns/web_hooks/unstoppable.rb
new file mode 100644
index 00000000000..26284fe3c36
--- /dev/null
+++ b/app/models/concerns/web_hooks/unstoppable.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module WebHooks
+ module Unstoppable
+ extend ActiveSupport::Concern
+
+ included do
+ scope :executable, -> { all }
+
+ scope :disabled, -> { none }
+ end
+
+ def executable?
+ true
+ end
+
+ def temporarily_disabled?
+ false
+ end
+
+ def permanently_disabled?
+ false
+ end
+
+ def alert_status
+ :executable
+ end
+ end
+end