Add missing config file read to tempest init

The update_local_conf() portion of tempest init was never reading the
config file. In the case we prepopulate a tempest.conf from the global
state /etc dir this would result in tempest init duplicating options
and sections that already existed. This commit fixes the issue by
simply reading the file before we do any operations.

Also add test coverage to ensure existing settings are not overwritten.

Co-authored-by: Augustina Ragwitz <auggy@cpan.org>
Change-Id: Ie629df246fc40777f2017b78e4073ae833b64deb
This commit is contained in:
Matthew Treinish 2016-08-09 14:44:44 -04:00 committed by Augustina Ragwitz
parent 2a472d8f25
commit 3c39bb6ef6
2 changed files with 67 additions and 10 deletions

View File

@ -89,18 +89,28 @@ class TempestInit(command.Command):
with open(testr_conf_path, 'w+') as testr_conf_file:
testr_conf_file.write(testr_conf)
def update_local_conf(self, conf_path, lock_dir, log_dir):
def get_configparser(self, conf_path):
config_parse = moves.configparser.SafeConfigParser()
config_parse.optionxform = str
with open(conf_path, 'a+') as conf_file:
# Set local lock_dir in tempest conf
if not config_parse.has_section('oslo_concurrency'):
config_parse.add_section('oslo_concurrency')
config_parse.set('oslo_concurrency', 'lock_path', lock_dir)
# Set local log_dir in tempest conf
config_parse.set('DEFAULT', 'log_dir', log_dir)
# Set default log filename to tempest.log
config_parse.set('DEFAULT', 'log_file', 'tempest.log')
# get any existing values if a config file already exists
if os.path.isfile(conf_path):
# use read() for Python 2 and 3 compatibility
config_parse.read(conf_path)
return config_parse
def update_local_conf(self, conf_path, lock_dir, log_dir):
config_parse = self.get_configparser(conf_path)
# Set local lock_dir in tempest conf
if not config_parse.has_section('oslo_concurrency'):
config_parse.add_section('oslo_concurrency')
config_parse.set('oslo_concurrency', 'lock_path', lock_dir)
# Set local log_dir in tempest conf
config_parse.set('DEFAULT', 'log_dir', log_dir)
# Set default log filename to tempest.log
config_parse.set('DEFAULT', 'log_file', 'tempest.log')
# write out a new file with the updated configurations
with open(conf_path, 'w+') as conf_file:
config_parse.write(conf_file)
def copy_config(self, etc_dir, config_dir):

View File

@ -45,6 +45,7 @@ class TestTempestInit(base.TestCase):
init_cmd = init.TempestInit(None, None)
local_sample_conf_file = os.path.join(etc_dir_path,
'tempest.conf.sample')
# Verify no sample config file exist
self.assertFalse(os.path.isfile(local_sample_conf_file))
init_cmd.generate_sample_config(local_dir.path)
@ -53,6 +54,52 @@ class TestTempestInit(base.TestCase):
self.assertTrue(os.path.isfile(local_sample_conf_file))
self.assertGreater(os.path.getsize(local_sample_conf_file), 0)
def test_update_local_conf(self):
local_dir = self.useFixture(fixtures.TempDir())
etc_dir_path = os.path.join(local_dir.path, 'etc/')
os.mkdir(etc_dir_path)
lock_dir = os.path.join(local_dir.path, 'tempest_lock')
config_path = os.path.join(etc_dir_path, 'tempest.conf')
log_dir = os.path.join(local_dir.path, 'logs')
init_cmd = init.TempestInit(None, None)
# Generate the config file
init_cmd.generate_sample_config(local_dir.path)
# Create a conf file with populated values
config_parser_pre = init_cmd.get_configparser(config_path)
with open(config_path, 'w+') as conf_file:
# create the same section init will check for and add values to
config_parser_pre.add_section('oslo_concurrency')
config_parser_pre.set('oslo_concurrency', 'TEST', local_dir.path)
# create a new section
config_parser_pre.add_section('TEST')
config_parser_pre.set('TEST', 'foo', "bar")
config_parser_pre.write(conf_file)
# Update the config file the same way tempest init does
init_cmd.update_local_conf(config_path, lock_dir, log_dir)
# parse the new config file to verify it
config_parser_post = init_cmd.get_configparser(config_path)
# check that our value in oslo_concurrency wasn't overwritten
self.assertTrue(config_parser_post.has_section('oslo_concurrency'))
self.assertEqual(config_parser_post.get('oslo_concurrency', 'TEST'),
local_dir.path)
# check that the lock directory was set correctly
self.assertEqual(config_parser_post.get('oslo_concurrency',
'lock_path'), lock_dir)
# check that our new section still exists and wasn't modified
self.assertTrue(config_parser_post.has_section('TEST'))
self.assertEqual(config_parser_post.get('TEST', 'foo'), 'bar')
# check that the DEFAULT values are correct
# NOTE(auggy): has_section ignores DEFAULT
self.assertEqual(config_parser_post.get('DEFAULT', 'log_dir'), log_dir)
def test_create_working_dir_with_existing_local_dir_non_empty(self):
fake_local_dir = self.useFixture(fixtures.TempDir())
fake_local_conf_dir = self.useFixture(fixtures.TempDir())