Merge "Fix parsing multiline ini files"

This commit is contained in:
Jenkins 2016-02-09 13:03:00 +00:00 committed by Gerrit Code Review
commit e38334ffb0
2 changed files with 64 additions and 4 deletions

View File

@ -21,6 +21,7 @@ except ImportError:
import logging
import os
import re
import StringIO
class Config:
@ -65,7 +66,7 @@ class Config:
EXPORT = re.compile(r"^\s*export\s+([^=^#^\s]+)\s*=\s*([^#^\n]*)\s*$",
re.MULTILINE)
INI = re.compile(r"^\s*([^=#\s]+)\s*=[\t]*([^#\n]*)\s*$")
INI = re.compile(r"^\s*([^=#\s]+)\s*=[\t]*([^#\n]*)\s*$", re.MULTILINE)
def osrc_parse(lines):
"""
@ -76,7 +77,27 @@ def osrc_parse(lines):
return find_all(EXPORT, lines)
def ini_parse(lines):
return find_all(INI, lines)
"""
:param lines:
:type lines: str
:return:
"""
try:
fd = StringIO.StringIO(lines)
parser = configparser.ConfigParser()
parser.readfp(fd)
return dict(parser.items('default'))
except Exception as e:
try:
# TODO: Remove the parsing of ini-like file via regex
conf = find_all(INI, lines)
logging.warning("Using non-INI files for database configuration"
"file is deprecated. Falling back to Regex.")
logging.warning("INI parser error was: {}".format(str(e)))
return conf
except Exception:
logging.warning("Couldn't parse non-INI config file using Regex")
raise
def find_all(regex, lines):
return dict([(k.strip(), utils.dequote(v.strip())) for k, v in

View File

@ -16,9 +16,10 @@ import unittest
from freezer import config
class TestConfig(unittest.TestCase):
def test_export(self):
str = """unset OS_DOMAIN_NAME
string = """unset OS_DOMAIN_NAME
export OS_AUTH_URL="http://abracadabra/v3"
export OS_PROJECT_NAME=abracadabra_project
export OS_USERNAME=abracadabra_username
@ -29,5 +30,43 @@ class TestConfig(unittest.TestCase):
export OS_AUTH_VERSION=3
export OS_CACERT=/etc/ssl/certs/ca-certificates.crt
export OS_ENDPOINT_TYPE=internalURL"""
res = config.osrc_parse(str)
res = config.osrc_parse(string)
self.assertEqual("http://abracadabra/v3", res["OS_AUTH_URL"])
def test_ini_like(self):
string = """# This is a comment line
#
host = 127.0.0.1
port = 3306
user = openstack
password = 'aNiceQuotedPassword'
password2 = "aNiceQuotedPassword"
spaced = value"""
res = config.ini_parse(string)
self.assertEqual('127.0.0.1', res['host'])
self.assertEqual('openstack', res['user'])
self.assertEqual('3306', res['port'])
self.assertEqual('aNiceQuotedPassword', res['password'])
self.assertEqual('aNiceQuotedPassword', res['password2'])
self.assertEqual('value', res['spaced'])
def test_ini(self):
string = """[default]
# This is a comment line
#
host = 127.0.0.1
port = 3306
user = openstack
password = 'aNiceQuotedPassword'
password2 = "aNiceQuotedPassword"
spaced = value"""
res = config.ini_parse(string)
self.assertEqual('127.0.0.1', res['host'])
self.assertEqual('openstack', res['user'])
self.assertEqual('3306', res['port'])
self.assertEqual('aNiceQuotedPassword', res['password'])
self.assertEqual('aNiceQuotedPassword', res['password2'])
self.assertEqual('value', res['spaced'])