spec/chef/cookbooks/patroni/libraries/patroni_helper_spec.rb (118 lines of code) (raw):
require 'chef_helper'
RSpec.describe PatroniHelper do
let(:chef_run) do
ChefSpec::SoloRunner.new(step_into: %w(patroni)).converge('gitlab-ee::default')
end
subject(:helper) { PatroniHelper.new(chef_run.node) }
let(:pg_helper) { PgHelper.new(chef_run.node) }
before do
allow(Gitlab).to receive(:[]).and_call_original
end
describe '#ctl_command' do
it 'returns a full path to the ctl_command' do
expect(helper.ctl_command).to eq('/opt/gitlab/embedded/bin/patronictl')
end
end
describe '#bootstrapped?' do
before do
allow(File).to receive(:exist?).and_call_original
end
it 'returns true when patroni.dynamic.json exists in postgresql data directory' do
allow(File).to receive(:exist?).with('/var/opt/gitlab/postgresql/data/patroni.dynamic.json').and_return(true)
expect(helper.bootstrapped?).to eq(true)
end
it 'returns false when patroni.dynamic.json does not exist in postgresql data directory' do
allow(File).to receive(:exist?).with('/var/opt/gitlab/postgresql/data/patroni.dynamic.json').and_return(false)
expect(helper.bootstrapped?).to eq(false)
end
end
describe '#dynamic_settings' do
it 'returns a hash with required keys' do
expected_root_keys = PatroniHelper::DCS_ATTRIBUTES + %w[postgresql slots]
expect(helper.dynamic_settings(pg_helper).keys).to match_array(expected_root_keys)
end
context 'with standby cluster enabled' do
it 'includes standby cluster attributes' do
stub_gitlab_rb(
patroni: {
enable: true,
standby_cluster: {
enable: true
}
}
)
expected_root_keys = PatroniHelper::DCS_ATTRIBUTES + %w[postgresql slots standby_cluster]
expect(helper.dynamic_settings(pg_helper).keys).to match_array(expected_root_keys)
end
end
end
describe '#node_status' do
context 'when Patroni service is down' do
before do
allow_any_instance_of(OmnibusHelper).to receive(:service_up?).and_return(false)
allow_any_instance_of(OmnibusHelper).to receive(:service_up?).with('patroni').and_return(false)
end
it 'returns not running' do
expect(helper.node_status).to eq 'not running'
end
end
context 'when Patroni service is up' do
before do
allow_any_instance_of(OmnibusHelper).to receive(:service_up?).and_return(false)
allow_any_instance_of(OmnibusHelper).to receive(:service_up?).with('patroni').and_return(true)
result = spy('shellout')
allow(helper).to receive(:do_shell_out).and_return(result)
allow(result).to receive(:stdout).and_return(' running')
end
it 'returns running current node state' do
expect(helper.node_status).to eq 'running'
end
end
end
describe '#public_attributes' do
context 'when patroni is enabled' do
it 'returns a hash with required keys' do
stub_gitlab_rb(
patroni: {
enable: true
}
)
expected_patroni_keys = %w(config_dir data_dir log_dir api_address)
expect(helper.public_attributes.keys).to match_array('patroni')
expect(helper.public_attributes['patroni'].keys).to match_array(expected_patroni_keys)
end
end
context 'when patroni is enabled with tls api' do
it 'returns a hash with required keys' do
stub_gitlab_rb(
patroni: {
enable: true,
tls_certificate_file: '/path/to/crt.pem',
tls_key_file: '/path/to/key.pem',
tls_key_password: 'fakepassword',
tls_ca_file: '/path/to/ca.pem',
tls_ciphers: 'CIPHERS LIST',
tls_client_mode: 'optional',
tls_client_certificate_file: '/path/to/client.pem',
tls_client_key_file: '/path/to/client.key'
}
)
expected_tls_cfg = {
'tls_verify' => true,
'ca_file' => '/path/to/ca.pem',
'verify_client' => true,
'client_cert' => '/path/to/client.pem',
'client_key' => '/path/to/client.key'
}
expect(helper.public_attributes.keys).to match_array('patroni')
expect(helper.public_attributes['patroni']).to include(expected_tls_cfg)
expect(helper.public_attributes['patroni']['api_address']).to start_with('https://')
end
end
context 'when patroni is disabled' do
it 'returns an empty hash' do
expect(helper.public_attributes).to be_empty
end
end
end
end