(POOLER-137) Support integer environment variables

This commit updates vmpooler to set configuration values received via environment variables to integer values when an integer value is expected. Without this change vmpooler does not support setting integer values via environment variables. Additionally, testing is added for configuring vmpooler via environment variables.

To support this testing the gem climate_control is added, which allows
for testing environment variables without those set variables leaking to
other tests.
This commit is contained in:
kirby@puppetlabs.com 2019-01-16 16:44:14 -08:00
parent a1704b239e
commit d94b14a4d8
5 changed files with 249 additions and 17 deletions

222
spec/unit/env_config.rb Normal file
View file

@ -0,0 +1,222 @@
require 'vmpooler'
require 'climate_control'
require 'mock_redis'
describe 'Vmpooler' do
describe 'config' do
describe 'environment variables' do
test_integer = '5'
test_string = 'test_string'
test_bool = 'true'
test_cases = [
['migration_limit', test_integer, nil],
['task_limit', test_integer, 10],
['vm_checktime', test_integer, 1],
['vm_lifetime', test_integer, 24],
['timeout', test_integer, nil],
['vm_lifetime_auth', test_integer, nil],
['max_tries', test_integer, nil],
['retry_factor', test_integer, nil],
['prefix', test_string, ""],
['logfile', test_string, nil],
['site_name', test_string, nil],
['domain', test_string, nil],
['clone_target', test_string, nil],
['create_folders', test_bool, nil],
['create_template_delta_disks', test_bool, nil],
['experimental_features', test_bool, nil],
['purge_unconfigured_folders', test_bool, nil],
['usage_stats', test_bool, nil],
]
test_cases.each do |key, value, default|
it "should set a value for #{key}" do
with_modified_env "#{key.upcase}": value do
test_value = value
test_value = Integer(value) if value =~ /\d/
config = Vmpooler.config
expect(config[:config][key]).to eq(test_value)
end
end
it "should set a default value for each #{key}" do
config = Vmpooler.config
expect(config[:config][key]).to eq(default)
end
if value =~ /\d/
it "should not set bad_data as a value for #{key}" do
with_modified_env "#{key.upcase}": 'bad_data' do
config = Vmpooler.config
expect(config[:config][key]).to eq(default)
end
end
end
end
end
describe 'redis environment variables' do
let(:redis) { MockRedis.new }
test_cases = [
['server', 'redis', 'localhost'],
['port', '4567', nil],
['password', 'testpass', nil],
['data_ttl', '500', 168],
]
test_cases.each do |key, value, default|
it "should set a value for #{key}" do
allow(Vmpooler).to receive(:new_redis).and_return(redis)
with_modified_env "REDIS_#{key.upcase}": value do
test_value = value
test_value = Integer(value) if value =~ /\d/
config = Vmpooler.config
expect(config[:redis][key]).to eq(test_value)
end
end
it "should set a default value for each #{key}" do
config = Vmpooler.config
expect(config[:redis][key]).to eq(default)
end
if value =~ /\d/
it "should not set bad_data as a value for #{key}" do
with_modified_env "#{key.upcase}": 'bad_data' do
config = Vmpooler.config
expect(config[:redis][key]).to eq(default)
end
end
end
end
end
describe 'statsd environment variables' do
test_cases = [
['prefix', 'vmpooler', nil],
['port', '4567', nil],
]
test_cases.each do |key, value, default|
it "should set a value for #{key}" do
with_modified_env STATSD_SERVER: 'test', "STATSD_#{key.upcase}": value do
test_value = value
test_value = Integer(value) if value =~ /\d/
config = Vmpooler.config
expect(config[:statsd][key]).to eq(test_value) end
end
it "should set a default value for each #{key}" do
with_modified_env STATSD_SERVER: 'test' do
config = Vmpooler.config
expect(config[:statsd][key]).to eq(default)
end
end
if value =~ /\d/
it "should not set bad_data as a value for #{key}" do
with_modified_env STATSD_SERVER: 'test', "STATSD_#{key.upcase}": 'bad_data' do
config = Vmpooler.config
expect(config[:statsd][key]).to eq(default)
end
end
end
end
end
describe 'graphite environment variables' do
test_cases = [
['prefix', 'vmpooler', nil],
['port', '4567', nil],
]
test_cases.each do |key, value, default|
it "should set a value for #{key}" do
with_modified_env GRAPHITE_SERVER: 'test', "GRAPHITE_#{key.upcase}": value do
test_value = value
test_value = Integer(value) if value =~ /\d/
config = Vmpooler.config
expect(config[:graphite][key]).to eq(test_value)
end
end
it "should set a default value for each #{key}" do
with_modified_env GRAPHITE_SERVER: 'test' do
config = Vmpooler.config
expect(config[:graphite][key]).to eq(default)
end
end
if value =~ /\d/
it "should not set bad_data as a value for #{key}" do
with_modified_env GRAPHITE_SERVER: 'test', "GRAPHITE_#{key.upcase}": 'bad_data' do
config = Vmpooler.config
expect(config[:graphite][key]).to eq(default)
end
end
end
end
end
describe 'ldap environment variables' do
test_cases = [
['host', 'test', nil],
['port', '4567', nil],
['base', 'dc=example,dc=com', nil],
['user_object', 'uid', nil],
]
test_cases.each do |key, value, default|
it "should set a value for #{key}" do
with_modified_env AUTH_PROVIDER: 'ldap', "LDAP_#{key.upcase}": value do
test_value = value
test_value = Integer(value) if value =~ /\d/
config = Vmpooler.config
expect(config[:auth][:ldap][key]).to eq(test_value)
end
end
it "should set a default value for each #{key}" do
with_modified_env AUTH_PROVIDER: 'ldap' do
config = Vmpooler.config
expect(config[:auth][:ldap][key]).to eq(default)
end
end
if value =~ /\d/
it "should not set bad_data as a value for #{key}" do
with_modified_env AUTH_PROVIDER: 'ldap', "LDAP_#{key.upcase}": 'bad_data' do
config = Vmpooler.config
expect(config[:auth][:ldap][key]).to eq(default)
end
end
end
end
end
end
def with_modified_env(options, &block)
ClimateControl.modify(options, &block)
end
end