blob: ebf2e0f1fd45f41081d74f06f40092b9d423c13a [file] [log] [blame]
#!/usr/bin/env python3
#
# 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.
"""
This file is used to post review results to the ReviewBoard.
"""
import argparse
import sys
import urllib.request as urllib2
from common import ReviewBoardHandler, REVIEWBOARD_URL # noqa
LOG_TAIL_LIMIT = 30
def parse_parameters():
"""Method for parsing arguments for argparse."""
parser = argparse.ArgumentParser(
description="Post review results to Review Board")
parser.add_argument("-u", "--user", type=str, required=True,
help="Review board user name")
parser.add_argument("-p", "--password", type=str, required=True,
help="Review board user password")
parser.add_argument("-r", "--review-id", type=str, required=True,
help="Review ID")
parser.add_argument("-m", "--message", type=str, required=True,
help="The post message")
parser.add_argument("-o", "--outputs-url", type=str, required=True,
help="The output build artifacts URL")
parser.add_argument("-l", "--logs-urls", type=str, required=False,
help="The URLs for the logs to be included in the"
" posted build message")
parser.add_argument("--applied-reviews", type=str, required=False,
help="The Review IDs that have been applied for the"
" current patch")
parser.add_argument("--failed-command", type=str, required=False,
help="The command that failed during the build"
" process")
return parser.parse_args()
def get_build_message(message, outputs_url, logs_urls=None,
applied_reviews=None,
failed_command=None):
"""Retrieves build message."""
if logs_urls is None:
logs_urls = []
if applied_reviews is None:
applied_reviews = []
build_msg = "%s\n\n" % message
if applied_reviews:
build_msg += "Reviews applied: `%s`\n\n" % applied_reviews
if failed_command:
build_msg += "Failed command: `%s`\n\n" % failed_command
build_msg += ("All the build artifacts available"
" at: %s\n\n" % (outputs_url))
logs_msg = ''
for url in logs_urls:
response = urllib2.urlopen(url)
log_content = response.read().decode(sys.getdefaultencoding())
if log_content == '':
continue
file_name = url.split('/')[-1]
logs_msg += "- [%s](%s):\n\n" % (file_name, url)
logs_msg += "```\n"
log_tail = log_content.split("\n")[-LOG_TAIL_LIMIT:]
logs_msg += "\n".join(log_tail)
logs_msg += "```\n\n"
if logs_msg == '':
return build_msg
build_msg += "Relevant logs:\n\n%s" % (logs_msg)
return build_msg.encode(sys.getdefaultencoding())
def main():
"""Posts build result to the ReviewBoard"""
parameters = parse_parameters()
review_request_url = "%s/api/review-requests/%s/" % (REVIEWBOARD_URL,
parameters.review_id)
handler = ReviewBoardHandler(parameters.user, parameters.password)
review_request = handler.api(review_request_url)["review_request"]
logs_urls = []
if parameters.logs_urls:
logs_urls = parameters.logs_urls.split('|')
applied_reviews = []
if parameters.applied_reviews:
applied_reviews = parameters.applied_reviews.split('|')
message = get_build_message(message=parameters.message,
logs_urls=logs_urls,
applied_reviews=applied_reviews,
outputs_url=parameters.outputs_url,
failed_command=parameters.failed_command)
handler.post_review(review_request, message)
if __name__ == '__main__':
main()