Browse Source

Fixes #4856 - No message on monitoring/health_check if S3 backend is e. g. not available

Martin Gruner 1 year ago
parent
commit
c19cec9ce7

+ 5 - 7
app/models/store/provider/s3.rb

@@ -61,13 +61,11 @@ module Store::Provider::S3
     def ping?
       return false if !client
 
-      begin
-        client.head_bucket(bucket: bucket)
-        true
-      rescue => e
-        Rails.logger.error { "#{name}: #{e.message}" }
-        false
-      end
+      client.head_bucket(bucket: bucket)
+      true
+    rescue => e
+      Rails.logger.error { "#{name}: #{e.message}" }
+      false
     end
 
     def ping!

+ 4 - 0
i18n/zammad.pot

@@ -11296,6 +11296,10 @@ msgstr ""
 msgid "The PGP signature key has been revoked."
 msgstr ""
 
+#: lib/monitoring_helper/health_checker/s3_storage_availability.rb
+msgid "The Simple Storage Service is not available."
+msgstr ""
+
 #: app/assets/javascripts/app/controllers/_channel/telegram.coffee
 msgid "The Telegram bot could not be saved."
 msgstr ""

+ 16 - 0
lib/monitoring_helper/health_checker/s3_storage_availability.rb

@@ -0,0 +1,16 @@
+# Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
+
+module MonitoringHelper
+  class HealthChecker
+    class S3StorageAvailability < Backend
+
+      def run_health_check
+        return if Setting.get('storage_provider') != 'S3'
+
+        return if Store::Provider::S3.ping?
+
+        response.issues.push __('The Simple Storage Service is not available.')
+      end
+    end
+  end
+end

+ 44 - 0
spec/lib/monitoring_helper/health_checker/s3_storage_availability_spec.rb

@@ -0,0 +1,44 @@
+# Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe MonitoringHelper::HealthChecker::S3StorageAvailability, integration: true do
+  let(:instance) { described_class.new }
+
+  before do
+    Setting.set('storage_provider', storage_provider)
+  end
+
+  describe '#check_health' do
+
+    context 'with storage_provider DB' do
+      let(:storage_provider) { 'DB' }
+
+      it 'reports no issue' do
+        expect(instance.check_health.issues).to be_blank
+      end
+    end
+
+    context 'with storage_provider S3' do
+      let(:storage_provider) { 'S3' }
+
+      context 'with service present' do
+        it 'reports no issue' do
+          expect(instance.check_health.issues).to be_blank
+        end
+      end
+
+      context 'with service missing' do
+        before do
+          allow(Store::Provider::S3).to receive(:ping?).and_return(false)
+        end
+
+        it 'reports an issue' do
+          expect(instance.check_health.issues.first).to eq('The Simple Storage Service is not available.')
+        end
+
+      end
+    end
+
+  end
+end