devstack/tests/test_meta_config.sh

423 lines
8.9 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Tests for DevStack meta-config functions
TOP=$(cd $(dirname "$0")/.. && pwd)
# Import config functions
source $TOP/inc/ini-config
source $TOP/inc/meta-config
set -e
# check_result() tests and reports the result values
# check_result "actual" "expected"
function check_result {
local actual=$1
local expected=$2
if [[ "$actual" == "$expected" ]]; then
echo "OK"
else
echo -e "failed: $actual != $expected\n"
exit 1
fi
}
# mock function-common:die so that it does not
# interrupt our test script
function die {
exit -1
}
function warn {
return 0
}
TEST_1C_ADD="[eee]
type=new
multi = foo2"
function create_test1c {
cat >test1c.conf <<EOF
[eee]
# original comment
type=original
EOF
}
function create_test2a {
cat >test2a.conf <<EOF
[ddd]
# original comment
type=original
EOF
}
function setup_test4 {
mkdir -p test-etc
cat >test-etc/test4.conf <<EOF
[fff]
# original comment
type=original
EOF
TEST4_DIR="test-etc"
TEST4_FILE="test4.conf"
}
cat >test.conf <<EOF
[[test1|test1a.conf]]
[default]
# comment an option
#log_file=./log.conf
log_file=/etc/log.conf
handlers=do not disturb
[aaa]
# the commented option should not change
#handlers=cc,dd
handlers = aa, bb
[[test1|test1b.conf]]
[bbb]
handlers=ee,ff
[ ccc ]
spaces = yes
[[test2|test2a.conf]]
[ddd]
# new comment
type=new
additional=true
[[test1|test1c.conf]]
$TEST_1C_ADD
[[test3|test-space.conf]]
[DEFAULT]
attribute=value
# the above line has a single space
[[test4|\$TEST4_DIR/\$TEST4_FILE]]
[fff]
type=new
[[test-env|test-env.conf]]
[foo]
foo=\${FOO_BAR_BAZ}
local.conf processing doesn't handle '=' in values When attempting to add a libvirt section with a volume_drivers entry to $NOVA_CONF, via a post-config block in the local.conf file, I encountered problems; the value for this attribute takes the form driver=python.import.path.to.driver but the value actually populated in the $NOVA_CONF was truncated at the equals. Taking the iscsi driver setting specified in the official nova.conf documentation as an example, if I have the following in my local.conf file: [[post-config|$NOVA_CONF]] [libvirt] volume_drivers = iscsi=nova.virt.libvirt.volume.LibvirtISCSIVolumeDriver I will see that the generated $NOVA_CONF has the following: [libvirt] volume_driver = iscsi This occurs because the existing handling for a post-config setion, as implemented in merge_config_file(), splits the line on the equals sign, and then uses the first and seconds elements of the resulting array as attribute name and value respectively. However when an equals occurs as part of the value this results in the value being truncated at the first equals in the value. The fix I've implemented, based upon review feedback, extracts the contents of $0 before the first equals as the attr name, and extracts the remainder after the equals as the value. Then it strips the leading and trailing whitespaces from both as appropriate. I've also added test5 to tests/test_config.sh to test for, and verify, correct operation when this scenario is encountered. Similarly I've added test6 to ensure that trailing spaces in values are stripped correctly. Change-Id: Id0cb1e6e1cece21bc5dbf427c4d756af86fbd927 Closes-Bug: #1374482
2014-10-09 16:16:42 -04:00
[[test5|test-equals.conf]]
[DEFAULT]
drivers = driver=python.import.path.Driver
[[test6|test-strip.conf]]
[DEFAULT]
# next line has trailing space
attr = strip_trailing_space
[[test7|test-colon.conf]]
[DEFAULT]
servers=10.11.12.13:80
[[test8|/permission-denied.conf]]
foo=bar
[[test9|\$UNDEF]]
foo=bar
[[test10|does-not-exist-dir/test.conf]]
foo=bar
[[test11|test-same.conf]]
[DEFAULT]
foo=bar
[[test11|test-same.conf]]
[some]
random=config
[[test-multi-sections|test-multi-sections.conf]]
[sec-1]
cfg_item1 = abcd
cfg_item2 = efgh
[sec-2]
cfg_item1 = abcd
cfg_item3 = /1/2/3/4:5
cfg_item4 = end
[sec-3]
cfg_item5 = 5555
cfg_item6 = 6666
cfg_item5 = 5555another
[[test-multiline|test-multiline.conf]]
[multi]
cfg_item1 = ab:cd:ef:gh
cfg_item1 = abcd
cfg_item2 = efgh
cfg_item2 = \${FOO_BAR_BAZ}
[[test11|test-same.conf]]
[another]
non = sense
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
VAL=$(get_meta_section_files test.conf test0)
check_result "$VAL" ""
echo -n "get_meta_section_files: test1 3 files: "
VAL=$(get_meta_section_files test.conf test1)
EXPECT_VAL="test1a.conf
test1b.conf
test1c.conf"
check_result "$VAL" "$EXPECT_VAL"
echo -n "get_meta_section_files: test2 1 file: "
VAL=$(get_meta_section_files test.conf test2)
EXPECT_VAL="test2a.conf"
check_result "$VAL" "$EXPECT_VAL"
# Get a section from a group that doesn't exist
echo -n "get_meta_section: test0 doesn't exist: "
VAL=$(get_meta_section test.conf test0 test0.conf)
check_result "$VAL" ""
# Get a single section from a group with multiple files
echo -n "get_meta_section: test1c single section: "
VAL=$(get_meta_section test.conf test1 test1c.conf)
check_result "$VAL" "$TEST_1C_ADD"
# Get a single section from a group with a single file
echo -n "get_meta_section: test2a single section: "
VAL=$(get_meta_section test.conf test2 test2a.conf)
EXPECT_VAL="[ddd]
# new comment
type=new
additional=true"
check_result "$VAL" "$EXPECT_VAL"
# Get a single section that doesn't exist from a group
echo -n "get_meta_section: test2z.conf not in test2: "
VAL=$(get_meta_section test.conf test2 test2z.conf)
check_result "$VAL" ""
# Get a section from a conf file that doesn't exist
echo -n "get_meta_section: nofile doesn't exist: "
VAL=$(get_meta_section nofile.ini test1)
check_result "$VAL" ""
echo -n "get_meta_section: nofile doesn't exist: "
VAL=$(get_meta_section nofile.ini test0 test0.conf)
check_result "$VAL" ""
echo -n "merge_config_file test1c exists: "
create_test1c
merge_config_file test.conf test1 test1c.conf
VAL=$(cat test1c.conf)
# iniset adds values immediately under the section header
EXPECT_VAL="[eee]
multi = foo2
# original comment
type=new"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test2a exists: "
create_test2a
merge_config_file test.conf test2 test2a.conf
VAL=$(cat test2a.conf)
# iniset adds values immediately under the section header
EXPECT_VAL="[ddd]
additional = true
# original comment
type=new"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test2a not exist: "
rm test2a.conf
merge_config_file test.conf test2 test2a.conf
VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
type = new
additional = true"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test-multi-sections: "
rm -f test-multi-sections.conf
merge_config_file test.conf test-multi-sections test-multi-sections.conf
VAL=$(cat test-multi-sections.conf)
EXPECT_VAL='
[sec-1]
cfg_item1 = abcd
cfg_item2 = efgh
[sec-2]
cfg_item1 = abcd
cfg_item3 = /1/2/3/4:5
cfg_item4 = end
[sec-3]
cfg_item5 = 5555
cfg_item5 = 5555another
cfg_item6 = 6666'
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test-multiline: "
rm -f test-multiline.conf
FOO_BAR_BAZ="foo bar baz"
merge_config_file test.conf test-multiline test-multiline.conf
VAL=$(cat test-multiline.conf)
EXPECT_VAL='
[multi]
cfg_item1 = ab:cd:ef:gh
cfg_item1 = abcd
cfg_item2 = efgh
cfg_item2 = foo bar baz'
check_result "$VAL" "$EXPECT_VAL"
unset FOO_BAR_BAZ
echo -n "merge_config_group test2: "
rm test2a.conf
merge_config_group test.conf test2
VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
type = new
additional = true"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2 no conf file: "
rm test2a.conf
merge_config_group x-test.conf test2
if [[ ! -r test2a.conf ]]; then
echo "OK"
else
echo "failed: $VAL != $EXPECT_VAL"
fi
echo -n "merge_config_file test-space: "
rm -f test-space.conf
merge_config_file test.conf test3 test-space.conf
VAL=$(cat test-space.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[DEFAULT]
attribute = value"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test-env: "
rm -f test-env.conf
FOO_BAR_BAZ="foo bar baz"
merge_config_file test.conf test-env test-env.conf
VAL=$(cat test-env.conf)
EXPECT_VAL='
[foo]
foo = foo bar baz'
check_result "$VAL" "$EXPECT_VAL"
unset FOO_BAR_BAZ
echo -n "merge_config_group test4 variable filename: "
setup_test4
merge_config_group test.conf test4
VAL=$(cat test-etc/test4.conf)
EXPECT_VAL="[fff]
# original comment
type=new"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test4 variable filename (not exist): "
setup_test4
rm test-etc/test4.conf
merge_config_group test.conf test4
VAL=$(cat test-etc/test4.conf)
EXPECT_VAL="
[fff]
type = new"
check_result "$VAL" "$EXPECT_VAL"
local.conf processing doesn't handle '=' in values When attempting to add a libvirt section with a volume_drivers entry to $NOVA_CONF, via a post-config block in the local.conf file, I encountered problems; the value for this attribute takes the form driver=python.import.path.to.driver but the value actually populated in the $NOVA_CONF was truncated at the equals. Taking the iscsi driver setting specified in the official nova.conf documentation as an example, if I have the following in my local.conf file: [[post-config|$NOVA_CONF]] [libvirt] volume_drivers = iscsi=nova.virt.libvirt.volume.LibvirtISCSIVolumeDriver I will see that the generated $NOVA_CONF has the following: [libvirt] volume_driver = iscsi This occurs because the existing handling for a post-config setion, as implemented in merge_config_file(), splits the line on the equals sign, and then uses the first and seconds elements of the resulting array as attribute name and value respectively. However when an equals occurs as part of the value this results in the value being truncated at the first equals in the value. The fix I've implemented, based upon review feedback, extracts the contents of $0 before the first equals as the attr name, and extracts the remainder after the equals as the value. Then it strips the leading and trailing whitespaces from both as appropriate. I've also added test5 to tests/test_config.sh to test for, and verify, correct operation when this scenario is encountered. Similarly I've added test6 to ensure that trailing spaces in values are stripped correctly. Change-Id: Id0cb1e6e1cece21bc5dbf427c4d756af86fbd927 Closes-Bug: #1374482
2014-10-09 16:16:42 -04:00
echo -n "merge_config_file test5 equals in value: "
rm -f test-equals.conf
merge_config_file test.conf test5 test-equals.conf
VAL=$(cat test-equals.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[DEFAULT]
drivers = driver=python.import.path.Driver"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test6 value stripped: "
rm -f test-strip.conf
merge_config_file test.conf test6 test-strip.conf
VAL=$(cat test-strip.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[DEFAULT]
attr = strip_trailing_space"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_file test7 colon in value: "
rm -f test-colon.conf
merge_config_file test.conf test7 test-colon.conf
VAL=$(cat test-colon.conf)
EXPECT_VAL="
[DEFAULT]
servers = 10.11.12.13:80"
check_result "$VAL" "$EXPECT_VAL"
echo "merge_config_file test8 non-touchable conf file: "
set +e
# function is expected to fail and exit, running it
# in a subprocess to let this script proceed
(merge_config_file test.conf test8 /permission-denied.conf)
VAL=$?
EXPECT_VAL=255
check_result "$VAL" "$EXPECT_VAL"
set -e
echo -n "merge_config_group test9 undefined conf file: "
set +e
# function is expected to trigger warn and continue
(merge_config_group test.conf test9)
VAL=$?
EXPECT_VAL=0
check_result "$VAL" "$EXPECT_VAL"
set -e
echo -n "merge_config_group test10 not directory: "
set +e
# function is expected to fail and exit, running it
# in a subprocess to let this script proceed
(merge_config_group test.conf test10)
VAL=$?
EXPECT_VAL=255
check_result "$VAL" "$EXPECT_VAL"
set -e
echo -n "merge_config_file test11 same section: "
rm -f test-same.conf
merge_config_group test.conf test11
VAL=$(cat test-same.conf)
EXPECT_VAL='
[DEFAULT]
foo = bar
[some]
random = config
[another]
non = sense'
check_result "$VAL" "$EXPECT_VAL"
rm -f test.conf test1c.conf test2a.conf \
test-space.conf test-equals.conf test-strip.conf \
test-colon.conf test-env.conf test-multiline.conf \
test-multi-sections.conf test-same.conf
rm -rf test-etc