blob: 74f7fb93091201eb9a4ed1e1c468c8275c777684 [file] [log] [blame]
#!/usr/bin/env ambari-python-wrap
'''
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.
'''
import getopt
import json
import urllib2
import re
from os import path
import xml.etree.ElementTree as ET
import sys
json_stack_version_re = re.compile("(\S*)-((\d\.*)+)")
family_map = {"redhat6": "centos6",
"redhat7": "centos7"}
HELP_STRING = 'Usage: urlinfo_processor.py -u <urlinfo.json path> -s <stack folder>'
XML_HEADER = """<?xml version="1.0"?>
<!--
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.
-->
"""
def get_json_content(path):
try:
response = urllib2.urlopen(path)
content = response.read()
except:
content = open(path, "r").read()
return json.loads(content)
def replace_url_in_repoinfo_xml(repoinfo_xml_path, repo_id, repo_info):
tree = ET.parse(repoinfo_xml_path)
root = tree.getroot()
for os_tag in root.findall("os"):
family = os_tag.get("family", None)
# hack, in hdp_urlinfo.json we have centos, but in repoinfo.xml it mapped to redhat
family = family_map[family] if family in family_map else family
for repo_tag in os_tag.findall("repo"):
repo_id_tag = repo_tag.find("repoid")
if repo_id_tag is not None and repo_id_tag.text == repo_id:
baseurl_tag = repo_tag.find("baseurl")
if baseurl_tag is not None and family in repo_info:
if family in repo_info:
print "URLINFO_PROCESSOR: replacing {0} to {1} for repo id:{2} and family:{3}".format(baseurl_tag.text,
repo_info[family],
repo_id,
family)
baseurl_tag.text = repo_info[family]
with open(repoinfo_xml_path, "w") as out:
out.write(XML_HEADER)
tree.write(out)
def replace_urls(stack_location, repo_version_path):
repo_dict = get_json_content(repo_version_path)
repo_dict = {(json_stack_version_re.findall(ver)[0][1], ver): conf["latest"] for ver, conf in repo_dict.iteritems()}
for version_info, repo_info in repo_dict.iteritems():
stack_version, repo_id = version_info
repoinfo_xml_path = path.join(stack_location, stack_version, "repos", "repoinfo.xml")
if path.exists(repoinfo_xml_path):
replace_url_in_repoinfo_xml(repoinfo_xml_path, repo_id, repo_info)
def main(argv):
urlinfo_path = ''
stack_folder = ''
try:
opts, args = getopt.getopt(argv, "u:s:", ["urlinfo=", "stack_folder="])
except getopt.GetoptError:
print HELP_STRING
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print HELP_STRING
sys.exit()
elif opt in ("-u", "--urlinfo"):
urlinfo_path = arg
elif opt in ("-s", "--stack_folder"):
stack_folder = arg
if not urlinfo_path or not stack_folder:
print HELP_STRING
sys.exit(2)
print "URLINFO_PROCESSOR: starting replacement of repo urls"
replace_urls(stack_folder, urlinfo_path)
print "URLINFO_PROCESSOR: replacement finished"
if __name__ == "__main__":
main(sys.argv[1:])