From 8323e55b6c0d59627c584b49e70d4f6ccfd3c8f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20Rodr=C3=ADguez?= <alejorro70@gmail.com>
Date: Thu, 31 Aug 2017 18:00:40 -0300
Subject: [PATCH] Return a value to check if redis is available on
 /internal/check

---
 lib/api/helpers/internal_helpers.rb |  9 +++++++++
 lib/api/internal.rb                 |  3 ++-
 spec/requests/api/internal_spec.rb  | 11 +++++++++++
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/lib/api/helpers/internal_helpers.rb b/lib/api/helpers/internal_helpers.rb
index f57ff0f2632..4c0db4d42b1 100644
--- a/lib/api/helpers/internal_helpers.rb
+++ b/lib/api/helpers/internal_helpers.rb
@@ -46,6 +46,15 @@ module API
         ::MergeRequests::GetUrlsService.new(project).execute(params[:changes])
       end
 
+      def redis_ping
+        result = Gitlab::Redis::SharedState.with { |redis| redis.ping }
+
+        result == 'PONG'
+      rescue => e
+        Rails.logger.warn("GitLab: An unexpected error occurred in pinging to Redis: #{e}")
+        false
+      end
+
       private
 
       def set_project
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
index 622bd9650e4..85b66593175 100644
--- a/lib/api/internal.rb
+++ b/lib/api/internal.rb
@@ -88,7 +88,8 @@ module API
         {
           api_version: API.version,
           gitlab_version: Gitlab::VERSION,
-          gitlab_rev: Gitlab::REVISION
+          gitlab_rev: Gitlab::REVISION,
+          redis: redis_ping
         }
       end
 
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
index a6c804fb2b3..1494c451543 100644
--- a/spec/requests/api/internal_spec.rb
+++ b/spec/requests/api/internal_spec.rb
@@ -8,10 +8,21 @@ describe API::Internal do
 
   describe "GET /internal/check" do
     it do
+      expect_any_instance_of(Redis).to receive(:ping).and_return('PONG')
+
       get api("/internal/check"), secret_token: secret_token
 
       expect(response).to have_http_status(200)
       expect(json_response['api_version']).to eq(API::API.version)
+      expect(json_response['redis']).to be(true)
+    end
+
+    it 'returns false for field `redis` when redis is unavailable' do
+      expect_any_instance_of(Redis).to receive(:ping).and_raise(Errno::ENOENT)
+
+      get api("/internal/check"), secret_token: secret_token
+
+      expect(json_response['redis']).to be(false)
     end
   end
 
-- 
2.30.9