Commit 1df518ff authored by Sean McGivern's avatar Sean McGivern

Merge branch 'storage-validation-improvement' into 'master'

Improve storage validation after configuration structure update

See merge request !9811
parents 1dc2e185 46214d5e
...@@ -13,24 +13,27 @@ def storage_validation_error(message) ...@@ -13,24 +13,27 @@ def storage_validation_error(message)
raise "#{message}. Please fix this in your gitlab.yml before starting GitLab." raise "#{message}. Please fix this in your gitlab.yml before starting GitLab."
end end
def validate_storages def validate_storages_config
storage_validation_error('No repository storage path defined') if Gitlab.config.repositories.storages.empty? storage_validation_error('No repository storage path defined') if Gitlab.config.repositories.storages.empty?
Gitlab.config.repositories.storages.each do |name, repository_storage| Gitlab.config.repositories.storages.each do |name, repository_storage|
storage_validation_error("\"#{name}\" is not a valid storage name") unless storage_name_valid?(name) storage_validation_error("\"#{name}\" is not a valid storage name") unless storage_name_valid?(name)
if repository_storage.is_a?(String) if repository_storage.is_a?(String)
error = "#{name} is not a valid storage, because it has no `path` key. " \ raise "#{name} is not a valid storage, because it has no `path` key. " \
"It may be configured as:\n\n#{name}:\n path: #{repository_storage}\n\n" \ "It may be configured as:\n\n#{name}:\n path: #{repository_storage}\n\n" \
"Refer to gitlab.yml.example for an updated example" "For source installations, update your config/gitlab.yml Refer to gitlab.yml.example for an updated example.\n\n" \
"If you're using the Gitlab Development Kit, you can update your configuration running `gdk reconfigure`.\n"
storage_validation_error(error)
end end
if !repository_storage.is_a?(Hash) || repository_storage['path'].nil? if !repository_storage.is_a?(Hash) || repository_storage['path'].nil?
storage_validation_error("#{name} is not a valid storage, because it has no `path` key. Refer to gitlab.yml.example for an updated example") storage_validation_error("#{name} is not a valid storage, because it has no `path` key. Refer to gitlab.yml.example for an updated example")
end end
end
end
def validate_storages_paths
Gitlab.config.repositories.storages.each do |name, repository_storage|
parent_name, _parent_path = find_parent_path(name, repository_storage['path']) parent_name, _parent_path = find_parent_path(name, repository_storage['path'])
if parent_name if parent_name
storage_validation_error("#{name} is a nested path of #{parent_name}. Nested paths are not supported for repository storages") storage_validation_error("#{name} is a nested path of #{parent_name}. Nested paths are not supported for repository storages")
...@@ -38,4 +41,5 @@ def validate_storages ...@@ -38,4 +41,5 @@ def validate_storages
end end
end end
validate_storages unless Rails.env.test? || ENV['SKIP_STORAGE_VALIDATION'] == 'true' validate_storages_config
validate_storages_paths unless Rails.env.test? || ENV['SKIP_STORAGE_VALIDATION'] == 'true'
...@@ -12,63 +12,77 @@ describe '6_validations', lib: true do ...@@ -12,63 +12,77 @@ describe '6_validations', lib: true do
FileUtils.rm_rf('tmp/tests/paths') FileUtils.rm_rf('tmp/tests/paths')
end end
context 'with correct settings' do describe 'validate_storages_config' do
before do context 'with correct settings' do
mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/d' }) before do
end mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/d' })
end
it 'passes through' do it 'passes through' do
expect { validate_storages }.not_to raise_error expect { validate_storages_config }.not_to raise_error
end
end end
end
context 'with invalid storage names' do context 'with invalid storage names' do
before do before do
mock_storages('name with spaces' => { 'path' => 'tmp/tests/paths/a/b/c' }) mock_storages('name with spaces' => { 'path' => 'tmp/tests/paths/a/b/c' })
end end
it 'throws an error' do it 'throws an error' do
expect { validate_storages }.to raise_error('"name with spaces" is not a valid storage name. Please fix this in your gitlab.yml before starting GitLab.') expect { validate_storages_config }.to raise_error('"name with spaces" is not a valid storage name. Please fix this in your gitlab.yml before starting GitLab.')
end
end end
end
context 'with nested storage paths' do context 'with incomplete settings' do
before do before do
mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/c/d' }) mock_storages('foo' => {})
end end
it 'throws an error' do it 'throws an error suggesting the user to update its settings' do
expect { validate_storages }.to raise_error('bar is a nested path of foo. Nested paths are not supported for repository storages. Please fix this in your gitlab.yml before starting GitLab.') expect { validate_storages_config }.to raise_error('foo is not a valid storage, because it has no `path` key. Refer to gitlab.yml.example for an updated example. Please fix this in your gitlab.yml before starting GitLab.')
end
end end
end
context 'with similar but un-nested storage paths' do context 'with deprecated settings structure' do
before do before do
mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/c2' }) mock_storages('foo' => 'tmp/tests/paths/a/b/c')
end end
it 'passes through' do it 'throws an error suggesting the user to update its settings' do
expect { validate_storages }.not_to raise_error expect { validate_storages_config }.to raise_error("foo is not a valid storage, because it has no `path` key. It may be configured as:\n\nfoo:\n path: tmp/tests/paths/a/b/c\n\nFor source installations, update your config/gitlab.yml Refer to gitlab.yml.example for an updated example.\n\nIf you're using the Gitlab Development Kit, you can update your configuration running `gdk reconfigure`.\n")
end
end end
end end
context 'with incomplete settings' do describe 'validate_storages_paths' do
before do context 'with correct settings' do
mock_storages('foo' => {}) before do
end mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/d' })
end
it 'throws an error suggesting the user to update its settings' do it 'passes through' do
expect { validate_storages }.to raise_error('foo is not a valid storage, because it has no `path` key. Refer to gitlab.yml.example for an updated example. Please fix this in your gitlab.yml before starting GitLab.') expect { validate_storages_paths }.not_to raise_error
end
end end
end
context 'with deprecated settings structure' do context 'with nested storage paths' do
before do before do
mock_storages('foo' => 'tmp/tests/paths/a/b/c') mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/c/d' })
end
it 'throws an error' do
expect { validate_storages_paths }.to raise_error('bar is a nested path of foo. Nested paths are not supported for repository storages. Please fix this in your gitlab.yml before starting GitLab.')
end
end end
it 'throws an error suggesting the user to update its settings' do context 'with similar but un-nested storage paths' do
expect { validate_storages }.to raise_error("foo is not a valid storage, because it has no `path` key. It may be configured as:\n\nfoo:\n path: tmp/tests/paths/a/b/c\n\nRefer to gitlab.yml.example for an updated example. Please fix this in your gitlab.yml before starting GitLab.") before do
mock_storages('foo' => { 'path' => 'tmp/tests/paths/a/b/c' }, 'bar' => { 'path' => 'tmp/tests/paths/a/b/c2' })
end
it 'passes through' do
expect { validate_storages_paths }.not_to raise_error
end
end end
end end
......
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