From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8D92843217; Fri, 27 Oct 2023 15:06:14 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 879A042DF0; Fri, 27 Oct 2023 15:06:14 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id F316B42D45 for ; Fri, 27 Oct 2023 15:06:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1698411972; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bbhZKkgXNYvfRf1ITOFNr7SKQwfpOWDX5fyWIyvi7To=; b=Fjw5IHrXORvdv4NAvAQK/iquVMJyJ2Ec6k1RRVXQiAxTW931ypHgl+DeAFDUhUmAB0LILr adjGU29DjGY5RRv2IJIGUZJG0MNNS1lDMnhGns2f6m/pCixziETFVwrnN1Mx03zwWI8C4f g+ImZ/IjIL8b5qWvCp8QN3+k7p/HmrY= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-36-KrrgZsUCM_Gy_aNeuZ56FA-1; Fri, 27 Oct 2023 09:06:11 -0400 X-MC-Unique: KrrgZsUCM_Gy_aNeuZ56FA-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BD8F61C01E96 for ; Fri, 27 Oct 2023 13:06:10 +0000 (UTC) Received: from RHTPC1VM0NT.lan (unknown [10.22.9.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7A10F492BE7; Fri, 27 Oct 2023 13:06:10 +0000 (UTC) From: Aaron Conole To: Michael Santana Cc: Dumitru Ceara , David Marchand , Ilya Maximets , ci@dpdk.org Subject: [RFC 2/2] recheck: Add a recheck parser for patchwork comments Date: Fri, 27 Oct 2023 09:06:09 -0400 Message-ID: <20231027130609.3035396-2-aconole@redhat.com> In-Reply-To: <20231027130609.3035396-1-aconole@redhat.com> References: <20231027130609.3035396-1-aconole@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: ci@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK CI discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ci-bounces@dpdk.org Add a recheck parsing tool that will allow for labs to build a recheck workflow based on specific recheck labels and projects, with an associated state machine and querying interface. The output of the recheck parsing tool is json and can be fed to jq or other json parsing utilities for better field support. Signed-off-by: Aaron Conole --- pw_mon | 59 +++++++++++++++++++++++++++++- recheck_tool | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ series_db_lib.sh | 62 +++++++++++++++++++++++++++++++- 3 files changed, 212 insertions(+), 2 deletions(-) create mode 100755 recheck_tool diff --git a/pw_mon b/pw_mon index 01bdd25..d5ad8f5 100755 --- a/pw_mon +++ b/pw_mon @@ -1,6 +1,6 @@ #!/bin/sh # SPDX-Identifier: gpl-2.0-or-later -# Copyright (C) 2018, Red Hat, Inc. +# Copyright (C) 2018-2023 Red Hat, Inc. # # Monitors a project on a patchwork instance for new series submissions # Records the submissions in the series database (and emits them on the @@ -44,6 +44,7 @@ if [ "$1" != "" ]; then fi fi +recheck_filter="" while [ "$1" != "" ]; do if echo "$1" | grep -E ^--pw-project= >/dev/null 2>&1; then @@ -59,6 +60,13 @@ while [ "$1" != "" ]; do echo " --add-filter-recheck=filter Adds a filter to flag that a recheck needs to be done" echo "" exit 0 + elif echo "$1" | grep -E ^--add-filter-recheck= >/dev/null 2>&1; then + filter_str=$(echo "$1" | sed s/--add-filter-recheck=//) + recheck_filter="$filter_str $recheck_filter" + shift + else + echo "Uknown option: $1" + exit 1 fi done @@ -179,7 +187,56 @@ function check_superseded_series() { done } +function run_recheck() { + local recheck_list=$(echo "$7" | sed -e 's/^Recheck-request: // ' -e 's/,/ /g') + + for filter in $recheck_filter; do + for check in $recheck_list; do + if [ "$filter" == "$check" ]; then + insert_recheck_request_if_needed "$1" "$3" "$8" "$check" "$2" + fi + done + done +} + +function check_patch_for_retest_request() { + local patch_url="$1" + + local patch_comments_url=$(curl -s "$userpw" "$patch_url" | jq -rc '.comments') + if [ "Xnull" != "X$patch_comments_url" ]; then + local comments_json=$(curl -s "$userpw" "$patch_comments_url") + + local seq_end=$(echo "$comments_json" | jq -rc 'length') + if [ "$seq_end" -a $seq_end -gt 0 ]; then + seq_end=$((seq_end-1)) + for comment_id in $(seq 0 $seq_end); do + local recheck_requested=$(echo "$comments_json" | jq -rc ".[$comment_id].content" | grep "^Recheck-request: ") + if [ "X$recheck_requested" != "X" ]; then + local msgid=$(echo "$comments_json" | jq -rc ".[$comment_id].msgid") + run_recheck "$pw_instance" "$series_id" "$project" "$url" "$repo" "$branchname" "$recheck_requested" "$msgid" + fi + done + fi + fi +} + +function check_series_needs_retest() { + local pw_instance="$1" + + series_get_active_branches "$pw_instance" | while IFS=\| read -r series_id project url repo branchname; do + local patch_comments_url=$(curl -s "$userpw" "$url" | jq -rc '.patches[] | .url') + + for patch in $patch_comments_url; do + check_patch_for_retest_request $patch + done + done +} + check_undownloaded_series "$pw_instance" "$pw_project" check_completed_series "$pw_instance" "$pw_project" check_new_series "$pw_instance" "$pw_project" check_superseded_series "$pw_instance" + +# check for retest requests after a series is still passing all the +# checks above +check_series_needs_retest "$pw_instance" diff --git a/recheck_tool b/recheck_tool new file mode 100755 index 0000000..f346e1c --- /dev/null +++ b/recheck_tool @@ -0,0 +1,93 @@ +#!/bin/sh +# SPDX-Identifier: gpl-2.0-or-later +# Copyright (C) 2023 Red Hat, Inc. +# +# Licensed under the terms of the GNU General Public License as published +# by the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. You may obtain a copy of the +# license at +# +# https://www.gnu.org/licenses/old-licenses/gpl-2.0.html +# +# 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. + +mode="select" + +while [ "$1" != "" ]; do + if echo "$1" | grep -E ^--help >/dev/null 2>&1; then + echo "recheck / retest state machine script" + echo "" + echo "$0:" + echo " --pw-project=: Patchwork project." + echo " --pw-instance=: Patchwork instance." + echo " --filter=: Job / request for recheck." + echo " --state=<0..>: Resync state ID." + echo " --msgid=: Message ID to select." + echo " --update: Set tool in update mode" + echo " --new-state=<0..>: New state ID to set" + echo " --series-id=<..>: Series ID" + echo "" + echo "Will spit out a parsable json for each db line when selecting" + exit 0 + elif echo "$1" | grep -E ^--pw-project= >/dev/null 2>&1; then + pw_project=$(echo "$1" | sed s/--pw-project=//) + elif echo "$1" | grep -E ^--pw-instance= >/dev/null 2>&1; then + pw_instance=$(echo "$1" | sed s/--pw-instance=//) + elif echo "$1" | grep -E ^--filter= >/dev/null 2>&1; then + filter=$(echo "$1" | sed s/--filter=//) + elif echo "$1" | grep -E ^--state= >/dev/null 2>&1; then + recheck_state=$(echo "$1" | sed s/--state=//) + elif echo "$1" | grep -E ^--msgid= >/dev/null 2>&1; then + message_id=$(echo "$1" | sed s/--msgid=//) + elif echo "$1" | grep -E ^--update >/dev/null 2>&1; then + mode="update" + elif echo "$1" | grep -E ^--new-state= >/dev/null 2>&1; then + new_recheck_state=$(echo "$1" | sed s/--new-state=//) + elif echo "$1" | grep -E ^--series-id= >/dev/null 2>&1; then + series_id=$(echo "$1" | sed s/--series-id=//) + else + echo "unknown option $1" + exit 1 + fi + shift +done + +source $(dirname $0)/series_db_lib.sh + +if [ "$mode" == "select" ]; then + echo "{\"rechecks\":[" + for request in $(get_recheck_requests_by_project "$pw_instance" \ + "$pw_project" \ + "$recheck_state" \ + "$filter"); do + message_id=$(echo $request | cut -d\| -f1) + series_id=$(echo $request | cut -d\| -f2) + echo "{\"pw_instance\": \"$pw_instance\", \"series_id\":$series_id, \"msg_id\":\"$message_id\", \"state\":\"$recheck_state\", \"requested\": \"$filter\"}" + done + echo "]}" +elif [ "$mode" == "update" ]; then + if [ "X$new_recheck_state" == "X" -o "X$series_id" == "X" ]; then + echo "Need to set a series-id and a new recheck state when updating." + exit 1 + fi + + request=$(get_recheck_request "$pw_instance" "$pw_project" "$message_id" \ + "$filter" "$series_id" "$recheck_state") + if [ "X$request" == "X" ]; then + echo "{\"result\":\"notfound\"}" + exit 0 + fi + + set_recheck_request_state "$pw_instance" "$pw_project" "$message_id" \ + "$filter" "$series_id" "$new_recheck_state" + + echo "{\"result\":\"executed\",\"recheck\":{\"pw_instance\": \"$pw_instance\", \"series_id\":$series_id, \"msg_id\":\"$message_id\", \"state\":\"$new_recheck_state\", \"requested\": \"$filter\"}}" +else + echo "Uknown state: $mode" + exit 1 +fi + diff --git a/series_db_lib.sh b/series_db_lib.sh index 6c2d98e..a729337 100644 --- a/series_db_lib.sh +++ b/series_db_lib.sh @@ -1,6 +1,6 @@ #!/bin/sh # SPDX-Identifier: gpl-2.0-or-later -# Copyright (C) 2018,2019 Red Hat, Inc. +# Copyright (C) 2018-2023 Red Hat, Inc. # # Licensed under the terms of the GNU General Public License as published # by the Free Software Foundation; either version 2 of the License, or @@ -114,6 +114,21 @@ EOF run_db_command "INSERT INTO series_schema_version(id) values (7);" fi + run_db_command "select * from series_schema_version;" | egrep '^8$' > /dev/null 2>&1 + if [ $? -eq 1 ]; then + sqlite3 ${HOME}/.series-db </dev/null 2>&1; then + echo "INSERT INTO recheck_requests (recheck_message_id, recheck_requested_by, recheck_series, patchwork_instance, patchwork_project, recheck_sync) values (\"$recheck_msgid\", \"$recheck_requested_by\", \"$recheck_series\", \"$recheck_instance\", \"$recheck_project\", 0);" | series_db_execute + fi +} + +function get_recheck_request() { + local recheck_instance="$1" + local recheck_project="$2" + local recheck_msgid="$3" + local recheck_requested_by="$4" + local recheck_series="$5" + local recheck_state="$6" + + echo "select * from recheck_requests where patchwork_instance=\"$recheck_instance\" and patchwork_project=\"$recheck_project\" and recheck_requested_by=\"$recheck_requested_by\" and recheck_series=\"$recheck_series\" and recheck_message_id=\"$recheck_msgid\" and recheck_sync=$recheck_state;" | series_db_execute +} + +function set_recheck_request_state() { + local recheck_instance="$1" + local recheck_project="$2" + local recheck_msgid="$3" + local recheck_requested_by="$4" + local recheck_series="$5" + local recheck_state="$6" + + echo "UPDATE recheck_requests set recheck_sync=$recheck_state where patchwork_instance=\"$recheck_instance\" and patchwork_project=\"$recheck_project\" and recheck_requested_by=\"$recheck_requested_by\" and recheck_series=\"$recheck_series\";" | series_db_execute +} -- 2.41.0