Commit 05c87a33 authored by Andreas Brandl's avatar Andreas Brandl

Merge branch 'ali/write-db-testing-files-to-directory' into 'master'

Write DB testing output files to a directory

See merge request gitlab-org/gitlab!60549
parents 83573e22 940fe552
...@@ -4,6 +4,9 @@ module Gitlab ...@@ -4,6 +4,9 @@ module Gitlab
module Database module Database
module Migrations module Migrations
class Instrumentation class Instrumentation
RESULT_DIR = Rails.root.join('tmp', 'migration-testing').freeze
STATS_FILENAME = 'migration-stats.json'
attr_reader :observations attr_reader :observations
def initialize(observers = ::Gitlab::Database::Migrations::Observers.all_observers) def initialize(observers = ::Gitlab::Database::Migrations::Observers.all_observers)
......
...@@ -217,9 +217,11 @@ namespace :gitlab do ...@@ -217,9 +217,11 @@ namespace :gitlab do
end end
desc 'Run migrations with instrumentation' desc 'Run migrations with instrumentation'
task :migration_testing, [:result_file] => :environment do |_, args| task migration_testing: :environment do
result_file = args[:result_file] || raise("Please specify result_file argument") result_dir = Gitlab::Database::Migrations::Instrumentation::RESULT_DIR
raise "File exists already, won't overwrite: #{result_file}" if File.exist?(result_file) raise "Directory exists already, won't overwrite: #{result_dir}" if File.exist?(result_dir)
Dir.mkdir(result_dir)
verbose_was = ActiveRecord::Migration.verbose verbose_was = ActiveRecord::Migration.verbose
ActiveRecord::Migration.verbose = true ActiveRecord::Migration.verbose = true
...@@ -240,7 +242,7 @@ namespace :gitlab do ...@@ -240,7 +242,7 @@ namespace :gitlab do
end end
ensure ensure
if instrumentation if instrumentation
File.open(result_file, 'wb+') do |io| File.open(File.join(result_dir, Gitlab::Database::Migrations::Instrumentation::STATS_FILENAME), 'wb+') do |io|
io << instrumentation.observations.to_json io << instrumentation.observations.to_json
end end
end end
......
...@@ -298,15 +298,15 @@ RSpec.describe 'gitlab:db namespace rake task' do ...@@ -298,15 +298,15 @@ RSpec.describe 'gitlab:db namespace rake task' do
end end
describe '#migrate_with_instrumentation' do describe '#migrate_with_instrumentation' do
subject { run_rake_task('gitlab:db:migration_testing', "[#{filename}]") } subject { run_rake_task('gitlab:db:migration_testing') }
let(:ctx) { double('ctx', migrations: all_migrations, schema_migration: double, get_all_versions: existing_versions) } let(:ctx) { double('ctx', migrations: all_migrations, schema_migration: double, get_all_versions: existing_versions) }
let(:instrumentation) { instance_double(Gitlab::Database::Migrations::Instrumentation, observations: observations) } let(:instrumentation) { instance_double(Gitlab::Database::Migrations::Instrumentation, observations: observations) }
let(:existing_versions) { [1] } let(:existing_versions) { [1] }
let(:all_migrations) { [double('migration1', version: 1), pending_migration] } let(:all_migrations) { [double('migration1', version: 1), pending_migration] }
let(:pending_migration) { double('migration2', version: 2) } let(:pending_migration) { double('migration2', version: 2) }
let(:filename) { 'results-file.json'} let(:filename) { Gitlab::Database::Migrations::Instrumentation::STATS_FILENAME }
let(:buffer) { StringIO.new } let!(:directory) { Dir.mktmpdir }
let(:observations) { %w[some data] } let(:observations) { %w[some data] }
before do before do
...@@ -316,17 +316,19 @@ RSpec.describe 'gitlab:db namespace rake task' do ...@@ -316,17 +316,19 @@ RSpec.describe 'gitlab:db namespace rake task' do
allow(instrumentation).to receive(:observe).and_yield allow(instrumentation).to receive(:observe).and_yield
allow(File).to receive(:open).with(filename, 'wb+').and_yield(buffer) allow(Dir).to receive(:mkdir)
allow(File).to receive(:exist?).with(directory).and_return(false)
stub_const('Gitlab::Database::Migrations::Instrumentation::RESULT_DIR', directory)
end end
it 'fails when given no filename argument' do after do
expect { run_rake_task('gitlab:db:migration_testing') }.to raise_error(/specify result_file/) FileUtils.rm_rf([directory])
end end
it 'fails when the given file already exists' do it 'fails when the directory already exists' do
expect(File).to receive(:exist?).with(filename).and_return(true) expect(File).to receive(:exist?).with(directory).and_return(true)
expect { subject }.to raise_error(/File exists/) expect { subject }.to raise_error(/Directory exists/)
end end
it 'instruments the pending migration' do it 'instruments the pending migration' do
...@@ -344,7 +346,7 @@ RSpec.describe 'gitlab:db namespace rake task' do ...@@ -344,7 +346,7 @@ RSpec.describe 'gitlab:db namespace rake task' do
it 'writes observations out to JSON file' do it 'writes observations out to JSON file' do
subject subject
expect(buffer.string).to eq(observations.to_json) expect(File.read(File.join(directory, filename))).to eq(observations.to_json)
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