Fix diff in gates

The gates were using a diff command to determine if 2 tempest.conf
files contains the same sections, options and values.
However, this has turned out to be not a good approach, as the
values in tempest.conf can be written in a different order.
Therefore the patch adds a python script which is able to compare
values in 2 tempest.conf files regardless their order.

Change-Id: I65e30a6e3b4add39dd5b6eaf48e09ba450855dbc
This commit is contained in:
Martin Kopec 2019-01-03 13:39:17 +00:00 committed by Chandan Kumar
parent f53b91c83b
commit 9317a78ac8
2 changed files with 85 additions and 2 deletions

View File

@ -0,0 +1,83 @@
# Copyright 2018 Red Hat, Inc.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# This script is able to compare two ini files specified by arguments, f.e.:
# $ ./compare-ini.py ./file1.ini ./file2.ini
# If some of the values are actually lists divided by commas, f.e.:
#
# [section]
# key = value1,value2,value3
#
# then this script compares these values regardless their order.
import six
from six.moves import configparser
import sys
def compare_ini_files(conf1, path1, conf2, path2):
failed = 0
for section in conf1.sections():
if not conf2.has_section(section):
sys.stderr.write("%s doesn't have %s section.\n" %
(path2, section))
failed = 1
continue
for (key, value) in conf1.items(section):
values1 = value.split(',')
if len(values1) > 1:
# the value contains a list of strings divided by commas,
# e.g. api_extensions
values2 = conf2.get(section, key).split(',')
for i in values1:
if i not in values2:
sys.stderr.write("%s value not in %s.%s of %s\n" %
(i, section, key, path2))
failed = 1
else:
val1 = conf1.get(section, key)
if not conf2.has_option(section, key):
sys.stderr.write("%s doesn't have %s option in %s "
"section.\n" % (path2, key, section))
failed = 1
else:
val2 = conf2.get(section, key)
if not val1 == val2:
sys.stderr.write("%s in %s != %s in %s under %s.%s\n" %
(val1, path1, val2,
path2, section, key))
failed = 1
return failed
if __name__ == '__main__':
if six.PY3:
conf1 = configparser.ConfigParser()
conf2 = configparser.ConfigParser()
else:
conf1 = configparser.SafeConfigParser()
conf2 = configparser.SafeConfigParser()
conf1.read(sys.argv[1])
conf2.read(sys.argv[2])
# compare first file to the other one
ret = compare_ini_files(conf1, sys.argv[1], conf2, sys.argv[2])
# compare the other file to the first one
ret2 = compare_ini_files(conf2, sys.argv[2], conf1, sys.argv[1])
sys.exit(ret or ret2)

View File

@ -85,9 +85,9 @@
chdir: "{{ tempestconf_src_relative_path }}"
executable: /bin/bash
- name: Diff tempest.conf and tempest_profile.conf
- name: Compare tempest.conf and tempest_profile.conf
shell: |
diff ./etc/cloud_tempest.conf ./etc/tempest_profile.conf
python ./roles/generate-tempestconf-file-cloud/tasks/compare-ini.py ./etc/cloud_tempest.conf ./etc/tempest_profile.conf
args:
chdir: "{{ tempestconf_src_relative_path }}"