Allow user to specify a configuration file in VMPOOLER_CONFIG_FILE

variable

Previously, there were two ways to configure Vmpooler, either by
changing the contents of vmpooler.yaml or by assigning the raw YAML
to the VMPOOLER_CONFIG environment variable. This commit adds a new
environment variable called VMPOOLER_CONFIG_FILE that can be assigned
the name of a config file to use. Also fixes #240 by whitelisting the
Symbol class when calling YAML.safe_load in Vmpooler.config.
This commit is contained in:
adamdav 2017-10-06 17:09:31 -07:00 committed by mattkirby
parent 28922df28e
commit 878c93f646
8 changed files with 152 additions and 13 deletions

2
.gitignore vendored
View file

@ -3,6 +3,6 @@
Gemfile.lock Gemfile.lock
Gemfile.local Gemfile.local
vendor vendor
vmpooler.yaml /vmpooler.yaml
.bundle .bundle
coverage coverage

View file

@ -62,17 +62,25 @@ C:\vmpooler > $ENV:VMPOOLER_DEBUG = 'true'
### `VMPOOLER_CONFIG` ### `VMPOOLER_CONFIG`
When `VMPOOLER_CONFIG` is set, vmpooler will read its configuration from the content of the environment variable instead of from the `vmpooler.yaml` configuration file. When `VMPOOLER_CONFIG` is set, vmpooler will read its configuration from the content of the environment variable.
Note that this variable does not point a different configuration file, but stores the contents of a configuration file. Note that this variable does not point to a different configuration file, but stores the contents of a configuration file. You may use `VMPOOLER_CONFIG_FILE` instead to specify a filename.
### `VMPOOLER_CONFIG_FILE`
When `VMPOOLER_CONFIG_FILE` is set, vmpooler will read its configuration from the file specified in the environment variable.
Note that this variable points to a different configuration file, unlike `VMPOOLER_CONFIG`.
## Setup vmpooler Configuration ## Setup vmpooler Configuration
You can either create a `vmpooler.yaml` file or set the `VMPOOLER_CONFIG` environment variable with the equivalent content. You can create a `vmpooler.yaml` file, set the `VMPOOLER_CONFIG` environment variable with the equivalent content, or set the `VMPOOLER_CONFIG_FILE` environment variable with the name of another configuration file to use. `VMPOOLER_CONFIG` takes precedence over `VMPOOLER_CONFIG_FILE`.
Example minimal configuration file: Example minimal configuration file:
```yaml ```yaml
--- ---
:providers: :providers:
:dummy: :dummy:

View file

@ -21,17 +21,19 @@ module Vmpooler
end end
def self.config(filepath = 'vmpooler.yaml') def self.config(filepath = 'vmpooler.yaml')
parsed_config = {} # Take the config either from an ENV config variable or from a config file
config_string = ENV['VMPOOLER_CONFIG'] || begin
# Take the name of the config file either from an ENV variable or from the filepath argument
config_file = ENV['VMPOOLER_CONFIG_FILE'] || filepath
if ENV['VMPOOLER_CONFIG'] # Return the contents of the config file
# Load configuration from ENV File.read(File.expand_path(config_file))
parsed_config = YAML.safe_load(ENV['VMPOOLER_CONFIG'])
else
# Load the configuration file from disk
config_file = File.expand_path(filepath)
parsed_config = YAML.load_file(config_file)
end end
# Parse the YAML config into a Hash
# Whitelist the Symbol class
parsed_config = YAML.safe_load(config_string, [Symbol])
# Bail out if someone attempts to start vmpooler with dummy authentication # Bail out if someone attempts to start vmpooler with dummy authentication
# without enbaling debug mode. # without enbaling debug mode.
if parsed_config[:auth]['provider'] == 'dummy' if parsed_config[:auth]['provider'] == 'dummy'

41
spec/fixtures/vmpooler.yaml vendored Normal file
View file

@ -0,0 +1,41 @@
---
:providers:
:dummy:
:redis:
server: 'localhost'
:auth:
provider: dummy
:tagfilter:
url: '(.*)\/'
:config:
site_name: 'vmpooler'
# Need to change this on Windows
logfile: '/var/log/vmpooler.log'
task_limit: 10
timeout: 15
vm_checktime: 15
vm_lifetime: 12
vm_lifetime_auth: 24
allowed_tags:
- 'created_by'
- 'project'
domain: 'company.com'
prefix: 'poolvm-'
# Uncomment the lines below to suppress metrics to STDOUT
# :statsd:
# server: 'localhost'
# prefix: 'vmpooler'
# port: 8125
:pools:
- name: 'pool01'
size: 5
provider: dummy
- name: 'pool02'
size: 5
provider: dummy

41
spec/fixtures/vmpooler2.yaml vendored Normal file
View file

@ -0,0 +1,41 @@
---
:providers:
:dummy:
:redis:
server: 'localhost'
:auth:
provider: dummy
:tagfilter:
url: '(.*)\/'
:config:
site_name: 'vmpooler'
# Need to change this on Windows
logfile: '/var/log/vmpooler.log'
task_limit: 10
timeout: 15
vm_checktime: 15
vm_lifetime: 12
vm_lifetime_auth: 24
allowed_tags:
- 'created_by'
- 'project'
domain: 'company.com'
prefix: 'poolvm-'
# Uncomment the lines below to suppress metrics to STDOUT
# :statsd:
# server: 'localhost'
# prefix: 'vmpooler'
# port: 8125
:pools:
- name: 'pool03'
size: 5
provider: dummy
- name: 'pool04'
size: 5
provider: dummy

View file

@ -9,3 +9,11 @@ require 'rspec'
require 'vmpooler' require 'vmpooler'
require 'redis' require 'redis'
require 'vmpooler/statsd' require 'vmpooler/statsd'
def project_root_dir
File.dirname(File.dirname(__FILE__))
end
def fixtures_dir
File.join(project_root_dir, 'spec', 'fixtures')
end

View file

@ -820,7 +820,7 @@ EOT
it 'should honor the insecure setting' do it 'should honor the insecure setting' do
pending('Resolution of issue https://github.com/puppetlabs/vmpooler/issues/207') pending('Resolution of issue https://github.com/puppetlabs/vmpooler/issues/207')
config[:vsphere][:insecure] = false config[:providers][:vsphere][:insecure] = false
expect(RbVmomi::VIM).to receive(:connect).with({ expect(RbVmomi::VIM).to receive(:connect).with({
:host => credentials['server'], :host => credentials['server'],

View file

@ -0,0 +1,39 @@
require 'spec_helper'
describe 'Vmpooler' do
describe '.config' do
let(:config_file) { File.join(fixtures_dir, 'vmpooler2.yaml') }
let(:config) { YAML.load_file(config_file) }
before(:each) do
ENV['VMPOOLER_DEBUG'] = 'true'
ENV['VMPOOLER_CONFIG_FILE'] = nil
ENV['VMPOOLER_CONFIG'] = nil
end
context 'when no config is given' do
it 'defaults to vmpooler.yaml' do
default_config_file = File.join(fixtures_dir, 'vmpooler.yaml')
default_config = YAML.load_file(default_config_file)
Dir.chdir(fixtures_dir) do
expect(Vmpooler.config[:pools]).to eq(default_config[:pools])
end
end
end
context 'when config variable is set' do
it 'should use the config' do
ENV['VMPOOLER_CONFIG'] = config.to_yaml
expect(Vmpooler.config[:pools]).to eq(config[:pools])
end
end
context 'when config file is set' do
it 'should use the file' do
ENV['VMPOOLER_CONFIG_FILE'] = config_file
expect(Vmpooler.config[:pools]).to eq(config[:pools])
end
end
end
end