Commit 9a56deac authored by manojmj's avatar manojmj

Do not use ES for Global Search when not enabled

This change makes sure that ES is not used when
it is not enabled for search
parent 2ceaff37
---
title: Fix 500 error in global search for blob, wiki_blob and commit search
merge_request: 23326
author:
type: fixed
......@@ -12,14 +12,14 @@ module EE
ELASTICSEARCH_SCOPES = %w(wiki_blobs blobs commits).freeze
override :verify_search_scope!
def verify_search_scope!
if ELASTICSEARCH_SCOPES.include?(params[:scope]) && !elasticsearch?
def verify_search_scope!(resource:)
if ELASTICSEARCH_SCOPES.include?(params[:scope]) && !use_elasticsearch?(resource)
render_api_error!({ error: 'Scope not supported without Elasticsearch!' }, 400)
end
end
def elasticsearch?
::Gitlab::CurrentSettings.elasticsearch_search?
def use_elasticsearch?(resource)
::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: resource)
end
override :process_results
......
......@@ -5,11 +5,10 @@ require 'spec_helper'
describe API::Search do
set(:user) { create(:user) }
set(:group) { create(:group) }
let(:project) { create(:project, :public, :wiki_repo, name: 'awesome project', group: group) }
let(:repo_project) { create(:project, :public, :repository, group: group) }
let(:project) { create(:project, :public, :repository, :wiki_repo, name: 'awesome project', group: group) }
shared_examples 'response is correct' do |schema:, size: 1|
it { expect(response).to have_gitlab_http_status(200) }
it { expect(response).to have_gitlab_http_status(:ok) }
it { expect(response).to match_response_schema(schema) }
it { expect(response).to include_limited_pagination_headers }
it { expect(json_response.size).to eq(size) }
......@@ -19,27 +18,23 @@ describe API::Search do
it 'returns 400 error for wiki_blobs scope' do
get api(endpoint, user), params: { scope: 'wiki_blobs', search: 'awesome' }
expect(response).to have_gitlab_http_status(400)
expect(response).to have_gitlab_http_status(:bad_request)
end
it 'returns 400 error for blobs scope' do
get api(endpoint, user), params: { scope: 'blobs', search: 'monitors' }
expect(response).to have_gitlab_http_status(400)
expect(response).to have_gitlab_http_status(:bad_request)
end
it 'returns 400 error for commits scope' do
get api(endpoint, user), params: { scope: 'commits', search: 'folder' }
expect(response).to have_gitlab_http_status(400)
expect(response).to have_gitlab_http_status(:bad_request)
end
end
shared_examples 'elasticsearch enabled' do
before do
stub_ee_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
end
context 'for wiki_blobs scope', :sidekiq_might_not_need_inline do
before do
wiki = create(:project_wiki, project: project)
......@@ -56,7 +51,7 @@ describe API::Search do
context 'for commits scope', :sidekiq_might_not_need_inline do
before do
repo_project.repository.index_commits_and_blobs
project.repository.index_commits_and_blobs
Gitlab::Elastic::Helper.refresh_index
get api(endpoint, user), params: { scope: 'commits', search: 'folder' }
......@@ -67,7 +62,7 @@ describe API::Search do
context 'for blobs scope', :sidekiq_might_not_need_inline do
before do
repo_project.repository.index_commits_and_blobs
project.repository.index_commits_and_blobs
Gitlab::Elastic::Helper.refresh_index
get api(endpoint, user), params: { scope: 'blobs', search: 'monitors' }
......@@ -77,17 +72,17 @@ describe API::Search do
context 'filters' do
it 'by filename' do
get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'mon filename:PROCESS.md' }
get api("/projects/#{project.id}/search", user), params: { scope: 'blobs', search: 'mon filename:PROCESS.md' }
expect(response).to have_gitlab_http_status(200)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(1)
expect(json_response.first['path']).to eq('PROCESS.md')
end
it 'by path' do
get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'mon path:markdown' }
get api("/projects/#{project.id}/search", user), params: { scope: 'blobs', search: 'mon path:markdown' }
expect(response).to have_gitlab_http_status(200)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(1)
json_response.each do |file|
expect(file['path']).to match(%r[/markdown/])
......@@ -95,9 +90,9 @@ describe API::Search do
end
it 'by extension' do
get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'mon extension:md' }
get api("/projects/#{project.id}/search", user), params: { scope: 'blobs', search: 'mon extension:md' }
expect(response).to have_gitlab_http_status(200)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(3)
json_response.each do |file|
expect(file['path']).to match(/\A.+\.md\z/)
......@@ -108,32 +103,177 @@ describe API::Search do
end
describe 'GET /search' do
let(:endpoint) { '/search' }
context 'with correct params' do
context 'when elasticsearch is disabled' do
it_behaves_like 'elasticsearch disabled' do
let(:endpoint) { '/search' }
end
it_behaves_like 'elasticsearch disabled'
end
context 'when elasticsearch is enabled', :elastic do
it_behaves_like 'elasticsearch enabled' do
let(:endpoint) { '/search' }
before do
stub_ee_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
end
context 'when elasticsearch_limit_indexing is on' do
before do
stub_ee_application_setting(elasticsearch_limit_indexing: true)
end
it_behaves_like 'elasticsearch disabled'
end
context 'when elasticsearch_limit_indexing off' do
before do
stub_ee_application_setting(elasticsearch_limit_indexing: false)
end
it_behaves_like 'elasticsearch enabled'
end
end
end
end
describe "GET /groups/:id/-/search" do
let(:endpoint) { "/groups/#{group.id}/-/search" }
context 'with correct params' do
context 'when elasticsearch is disabled' do
it_behaves_like 'elasticsearch disabled' do
let(:endpoint) { "/groups/#{group.id}/-/search" }
it_behaves_like 'elasticsearch disabled'
end
context 'when elasticsearch is enabled', :elastic do
before do
stub_ee_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
end
context 'when elasticsearch_limit_indexing is on' do
before do
stub_ee_application_setting(elasticsearch_limit_indexing: true)
end
context 'when the namespace is indexed' do
before do
create :elasticsearch_indexed_namespace, namespace: group
end
it_behaves_like 'elasticsearch enabled'
end
context 'when the namespace is not indexed' do
it_behaves_like 'elasticsearch disabled'
end
end
context 'when elasticsearch_limit_indexing off' do
before do
stub_ee_application_setting(elasticsearch_limit_indexing: false)
end
it_behaves_like 'elasticsearch enabled'
end
end
end
end
describe "GET /projects/:id/-/search" do
let(:endpoint) { "/projects/#{project.id}/-/search" }
shared_examples_for 'search enabled' do
context 'for wiki_blobs scope' do
before do
wiki = create(:project_wiki, project: project)
create(:wiki_page, wiki: wiki, attrs: { title: 'home', content: "Awesome page" })
get api(endpoint, user), params: { scope: 'wiki_blobs', search: 'awesome' }
end
it_behaves_like 'response is correct', schema: 'public_api/v4/blobs'
end
context 'for commits scope' do
before do
get api(endpoint, user), params: { scope: 'commits', search: 'folder' }
end
it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details', size: 2
end
context 'for blobs scope' do
before do
get api(endpoint, user), params: { scope: 'blobs', search: 'monitors' }
end
it_behaves_like 'response is correct', schema: 'public_api/v4/blobs', size: 2
context 'filters' do
it 'by filename' do
get api(endpoint, user), params: { scope: 'blobs', search: 'mon filename:PROCESS.md' }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(2)
expect(json_response.first['path']).to eq('PROCESS.md')
expect(json_response.first['filename']).to eq('PROCESS.md')
end
it 'by path' do
get api(endpoint, user), params: { scope: 'blobs', search: 'mon path:markdown' }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(8)
end
it 'by extension' do
get api(endpoint, user), params: { scope: 'blobs', search: 'mon extension:md' }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(11)
end
it 'by ref' do
get api(endpoint, user), params: { scope: 'blobs', search: 'This file is used in tests for ci_environments_status', ref: 'pages-deploy' }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response.size).to eq(1)
end
end
end
end
context 'with correct params' do
context 'when elasticsearch is disabled' do
it_behaves_like 'search enabled'
end
context 'when elasticsearch is enabled', :elastic do
it_behaves_like 'elasticsearch enabled' do
let(:endpoint) { "/groups/#{group.id}/-/search" }
before do
stub_ee_application_setting(elasticsearch_search: true, elasticsearch_indexing: true)
end
context 'when elasticsearch_limit_indexing is on' do
before do
stub_ee_application_setting(elasticsearch_limit_indexing: true)
end
context 'when the project is indexed' do
before do
create :elasticsearch_indexed_project, project: project
end
it_behaves_like 'elasticsearch enabled'
end
context 'when the project is not indexed' do
it_behaves_like 'search enabled'
end
end
context 'when elasticsearch_limit_indexing off' do
before do
stub_ee_application_setting(elasticsearch_limit_indexing: false)
end
it_behaves_like 'elasticsearch enabled'
end
end
end
......
......@@ -47,7 +47,7 @@ module API
SCOPE_ENTITY[params[:scope].to_sym]
end
def verify_search_scope!
def verify_search_scope!(resource:)
# In EE we have additional validation requirements for searches.
# Defining this method here as a noop allows us to easily extend it in
# EE, without having to modify this file directly.
......@@ -73,7 +73,7 @@ module API
use :pagination
end
get do
verify_search_scope!
verify_search_scope!(resource: nil)
check_users_search_allowed!
present search, with: entity
......@@ -94,7 +94,7 @@ module API
use :pagination
end
get ':id/(-/)search' do
verify_search_scope!
verify_search_scope!(resource: user_group)
check_users_search_allowed!
present search(group_id: user_group.id), with: entity
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment