spec/chef/gitlab-ctl-commands/lib/postgresql/decomposition_migration_spec.rb (139 lines of code) (raw):
require 'spec_helper'
$LOAD_PATH << File.join(__dir__, '../../../../files/gitlab-ctl-commands/lib')
require 'gitlab_ctl/util'
require 'postgresql/decomposition_migration'
RSpec.describe PostgreSQL::DecompositionMigration do
let(:ctl) { spy('gitlab ctl') }
let(:confirmation) { StringIO.new('y') }
let(:command_ok) { spy('command spy', error?: false) }
let(:command_fail) { spy('command spy', error?: true) }
let(:migrations_disabled) { false }
describe '#migrate!' do
subject(:instance) { described_class.new(ctl) }
before do
allow(ctl).to receive(:service_enabled?).with('postgresql').and_return(true)
instance.instance_variable_set(:@background_migrations_initally_disabled, migrations_disabled)
$stdin = confirmation
end
after do
$stdin = STDIN
end
context 'when PostgreSQL is not enabled' do
before do
allow(ctl).to receive(:service_enabled?).with('postgresql').and_return(false)
end
it 'exits' do
expect { instance.migrate! }.to raise_error(SystemExit)
end
end
context 'when user does not confirm running the script' do
let(:confirmation) { StringIO.new('n') }
it 'exits' do
expect { instance.migrate! }.to raise_error(SystemExit)
end
end
context 'when external command fails' do
before do
allow(GitlabCtl::Util).to receive(:run_command).with(any_args).and_return(command_fail)
allow(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-rails runner \"Feature.enable(:execute_background_migrations) && Feature.enable(:execute_batched_migrations_on_schedule)\"\n",
timeout: nil
).and_return(command_ok)
end
context 'and background migrations are enabled before starting this script' do
it 'enables background migrations and then exits' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-rails runner \"Feature.enable(:execute_background_migrations) && Feature.enable(:execute_batched_migrations_on_schedule)\"\n",
timeout: nil
).and_return(command_ok)
expect { instance.migrate! }.to raise_error(SystemExit)
end
end
context 'and background migrations are disabled before starting this script' do
let(:migrations_disabled) { true }
it 'exits without enabling background migrations' do
expect(GitlabCtl::Util).not_to receive(:run_command).with(
"gitlab-rails runner \"Feature.enable(:execute_background_migrations) && Feature.enable(:execute_batched_migrations_on_schedule)\"\n"
)
expect { instance.migrate! }.to raise_error(SystemExit)
end
end
end
context 'runs commands needed for migration to decomposed setup' do
before do
allow(GitlabCtl::Util).to receive(:run_command).with(any_args).and_return(command_ok)
end
context 'and background migrations are enabled before starting this script' do
it 'disables background migrations' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-rails runner \"Feature.disable(:execute_background_migrations) && Feature.disable(:execute_batched_migrations_on_schedule)\"\n",
timeout: nil
).and_return(command_ok)
instance.migrate!
end
end
context 'and background migrations are disabled before starting this script' do
let(:migrations_disabled) { true }
it 'does not not disable background migration' do
expect(GitlabCtl::Util).not_to receive(:run_command).with(
"gitlab-rails runner \"Feature.disable(:execute_background_migrations) && Feature.disable(:execute_batched_migrations_on_schedule)\"\n"
)
instance.migrate!
end
end
it 'stops Gitlab except for PostgreSQL' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-ctl stop && gitlab-ctl start postgresql",
timeout: nil
).and_return(command_ok).once
instance.migrate!
end
it 'calls the migration rake task' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-rake gitlab:db:decomposition:migrate",
timeout: 84_600
).and_return(command_ok).once
instance.migrate!
end
it 'runs the reconfigure task' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-ctl reconfigure",
timeout: nil
).and_return(command_ok).once
instance.migrate!
end
it 'enables write locks' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-rake gitlab:db:lock_writes",
timeout: nil
).and_return(command_ok).once
instance.migrate!
end
it 'restarts GitLab' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-ctl restart",
timeout: nil
).and_return(command_ok).once
instance.migrate!
end
context 'and background migrations are enabled before starting this script' do
it 'enables background migrations' do
expect(GitlabCtl::Util).to receive(:run_command).with(
"gitlab-rails runner \"Feature.enable(:execute_background_migrations) && Feature.enable(:execute_batched_migrations_on_schedule)\"\n",
timeout: nil
).and_return(command_ok).once
instance.migrate!
end
end
context 'and background migrations are disabled before starting this script' do
let(:migrations_disabled) { true }
it 'does not not enable background migration' do
expect(GitlabCtl::Util).not_to receive(:run_command).with(
"gitlab-rails runner \"Feature.enable(:execute_background_migrations) && Feature.enable(:execute_batched_migrations_on_schedule)\"\n"
)
instance.migrate!
end
end
end
end
end