mirror of
https://github.com/apache/impala.git
synced 2025-12-19 18:12:08 -05:00
Python 3 does not support this old except syntax: except Exception, e: Instead, it needs to be: except Exception as e: This uses impala-futurize to fix all locations of the old syntax. Testing: - The check-python-syntax.sh no longer shows errors for except syntax. Change-Id: I1737281a61fa159c8d91b7d4eea593177c0bd6c9 Reviewed-on: http://gerrit.cloudera.org:8080/19551 Reviewed-by: Joe McDonnell <joemcdonnell@cloudera.com> Reviewed-by: Michael Smith <michael.smith@cloudera.com> Tested-by: Michael Smith <michael.smith@cloudera.com>
126 lines
3.8 KiB
Python
Executable File
126 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you 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.
|
|
"""
|
|
Script which uses a Python "template" to generate a Hadoop-style XML
|
|
configuration file.
|
|
|
|
The "template" is a Python module which should export a global variable called
|
|
'CONFIG'. This variable should be a dictionary of keys/values. The values may
|
|
use the special syntax '${FOO}' to substitute an environment variable (as a
|
|
convenience over manually implementing the same).
|
|
|
|
If you have an existing XML configuration and want to see it in convenient
|
|
python form, you can use a snippet like the following from within the Python
|
|
REPL:
|
|
|
|
import xml.etree.ElementTree as ET
|
|
import pprint
|
|
def convert(path):
|
|
e = ET.parse(path)
|
|
c = dict([(property.findtext('name'), property.findtext('value'))
|
|
for property in e.getroot()])
|
|
pprint.pprint(c, stream=file(path + ".py", "w"))
|
|
|
|
"""
|
|
|
|
from __future__ import with_statement
|
|
import imp
|
|
import os
|
|
import re
|
|
import sys
|
|
from textwrap import dedent
|
|
from xml.sax.saxutils import escape as xmlescape
|
|
|
|
ENV_VAR_RE = re.compile(r'\${(.+?)\}')
|
|
|
|
|
|
def _substitute_env_vars(s):
|
|
""" Substitute ${FOO} with the $FOO environment variable in 's' """
|
|
def lookup_func(match):
|
|
return os.environ[match.group(1)]
|
|
return ENV_VAR_RE.sub(lookup_func, s)
|
|
|
|
|
|
def dump_config(d, source_path, out):
|
|
"""
|
|
Dump a Hadoop-style XML configuration file.
|
|
|
|
'd': a dictionary of name/value pairs.
|
|
'source_path': the path where 'd' was parsed from.
|
|
'out': stream to write to
|
|
"""
|
|
header = """\
|
|
<?xml version="1.0"?>
|
|
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
|
|
<!--
|
|
|
|
NOTE: THIS FILE IS AUTO-GENERATED FROM:
|
|
{source_path}
|
|
|
|
EDITS BY HAND WILL BE LOST!
|
|
|
|
-->
|
|
<configuration>""".format(source_path=os.path.abspath(source_path))
|
|
print >>out, dedent(header)
|
|
for k, v in sorted(d.iteritems()):
|
|
try:
|
|
k_new = _substitute_env_vars(k)
|
|
if isinstance(v, int):
|
|
v = str(v)
|
|
v_new = _substitute_env_vars(v)
|
|
except KeyError as e:
|
|
raise Exception("failed environment variable substitution for value {k}: {e}"
|
|
.format(k=k, e=e))
|
|
print >>out, """\
|
|
<property>
|
|
<name>{name}</name>
|
|
<value>{value}</value>
|
|
</property>""".format(name=xmlescape(k_new), value=xmlescape(v_new))
|
|
print >>out, "</configuration>"
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) != 3:
|
|
print >>sys.stderr, "usage: {prog} <template> <out>".format(prog=sys.argv[0])
|
|
sys.exit(1)
|
|
|
|
_, in_path, out_path = sys.argv
|
|
try:
|
|
mod = imp.load_source('template', in_path)
|
|
except: # noqa
|
|
print >>sys.stderr, "Unable to load template: %s" % in_path
|
|
raise
|
|
conf = mod.__dict__.get('CONFIG')
|
|
if not isinstance(conf, dict):
|
|
raise Exception("module in '{path}' should define a dict named CONFIG"
|
|
.format(path=in_path))
|
|
|
|
tmp_path = out_path + ".tmp"
|
|
with file(tmp_path, "w") as out:
|
|
try:
|
|
dump_config(conf, in_path, out)
|
|
except: # noqa
|
|
os.unlink(tmp_path)
|
|
raise
|
|
os.rename(tmp_path, out_path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|