Merge "Create Stable Branch Jobs for container4nfv"
[releng.git] / jjb / xci / xci-set-scenario.sh
index 9a6cb51..3e64ab1 100755 (executable)
@@ -8,7 +8,6 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 set -o errexit
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 set -o errexit
-set -o nounset
 set -o pipefail
 
 #----------------------------------------------------------------------
 set -o pipefail
 
 #----------------------------------------------------------------------
@@ -17,14 +16,109 @@ set -o pipefail
 # what you are doing.
 #----------------------------------------------------------------------
 
 # what you are doing.
 #----------------------------------------------------------------------
 
-# This function will determine the impacted generic scenario by processing the
-# change and using diff to see what changed.
-# It currently sets the scenario to os-nosdn-nofeature.
-function determine_generic_scenario() {
-    echo "Processing $GERRIT_PROJECT $GERRIT_REFSPEC"
+# This function allows developers to specify the impacted scenario by adding
+# the info about installer and scenario into the commit message or using
+# the topic branch names. This results in either skipping the real verification
+# totally or skipping the determining the installer and scenario programmatically.
+# It is important to note that this feature is only available to generic scenarios
+# and only single installer/scenario pair is allowed.
+# The input in commit message should be placed at the end of the commit message body,
+# before the signed-off and change-id lines.
+#
+# Pattern to be searched in Commit Message
+#   deploy-scenario:<scenario-name>
+#   installer-type:<installer-type>
+# Examples:
+#   deploy-scenario:os-odl-nofeature
+#   installer-type:osa
+#
+#   deploy-scenario:k8-nosdn-nofeature
+#   installer-type:kubespray
+#
+# Patterns to be searched in topic branch name
+#   skip-verify
+#   skip-deployment
+#   force-verify
+function override_generic_scenario() {
+    echo "Processing $GERRIT_PROJECT patchset $GERRIT_REFSPEC"
+
+    # ensure the metadata we record is consistent for all types of patches including skipped ones
+    # extract releng-xci sha
+    XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
+
+    # extract scenario sha which is same as releng-xci sha for generic scenarios
+    SCENARIO_SHA=$XCI_SHA
+
+    # process topic branch names
+    if [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment|force-verify ]]; then
+        [[ "$GERRIT_TOPIC" =~ force-verify ]] && echo "Forcing CI verification using default scenario and installer!"
+        [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment ]] && echo "Skipping verification!"
+        echo "INSTALLER_TYPE=osa" > $WORK_DIRECTORY/scenario.properties
+        echo "DEPLOY_SCENARIO=os-nosdn-nofeature" >> $WORK_DIRECTORY/scenario.properties
+        echo "XCI_SHA=$XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
+        echo "SCENARIO_SHA=$SCENARIO_SHA" >> $WORK_DIRECTORY/scenario.properties
+        echo "PROJECT_NAME=$GERRIT_PROJECT" >> $WORK_DIRECTORY/scenario.properties
+        exit 0
+    fi
+
+    # process commit message
+    if [[ "$GERRIT_CHANGE_COMMIT_MESSAGE" =~ "installer-type:" && "$GERRIT_CHANGE_COMMIT_MESSAGE" =~ "deploy-scenario:" ]]; then
+        INSTALLER_TYPE=$(echo $GERRIT_CHANGE_COMMIT_MESSAGE | awk '/installer-type:/' RS=" " | cut -d":" -f2)
+        DEPLOY_SCENARIO=$(echo $GERRIT_CHANGE_COMMIT_MESSAGE | awk '/deploy-scenario:/' RS=" " | cut -d":" -f2)
+
+        if [[ -z "$INSTALLER_TYPE" || -z "$DEPLOY_SCENARIO" ]]; then
+            echo "Installer type or deploy scenario is not specified. Falling back to programmatically determining them."
+        else
+            echo "Recording the installer '$INSTALLER_TYPE' and scenario '$DEPLOY_SCENARIO' for downstream jobs"
+            echo "INSTALLER_TYPE=$INSTALLER_TYPE" > $WORK_DIRECTORY/scenario.properties
+            echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> $WORK_DIRECTORY/scenario.properties
+            echo "XCI_SHA=$XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
+            echo "SCENARIO_SHA=$SCENARIO_SHA" >> $WORK_DIRECTORY/scenario.properties
+            echo "PROJECT_NAME=$GERRIT_PROJECT" >> $WORK_DIRECTORY/scenario.properties
+            exit 0
+        fi
+    else
+        echo "Installer type or deploy scenario is not specified. Falling back to programmatically determining them."
+    fi
+}
 
 
-    # set the default scenario
-    DEPLOY_SCENARIO="os-nosdn-nofeature"
+# This function determines the impacted generic scenario by processing the
+# change and using diff to see what changed. If changed files belong to a scenario
+# its name gets recorded for deploying and testing the right scenario.
+#
+# Pattern to be searched in Changeset
+#   releng-xci/scenarios/<scenario>/<impacted files>: <scenario>
+#   releng-xci/xci/installer/osa/<impacted files>: os-nosdn-nofeature
+#   releng-xci/xci/installer/kubespray/<impacted files>: k8-nosdn-nofeature
+#   the rest: os-nosdn-nofeature
+function determine_generic_scenario() {
+    echo "Processing $GERRIT_PROJECT patchset $GERRIT_REFSPEC"
+
+    # get the changeset
+    cd $WORKSPACE
+    SCENARIOS=$(git diff HEAD^..HEAD --name-only -- 'xci/scenarios' | cut -d "/" -f 3 | uniq)
+    # We need to set default scenario for changes that do not mess with scenarios
+    NO_SCENARIOS=$(git diff HEAD^..HEAD --name-only | grep -v 'xci/scenarios' | cut -d "/" -f 3 | uniq)
+    for CHANGED_SCENARIO in $SCENARIOS; do
+        [[ ${DEPLOY_SCENARIO[@]} =~ $CHANGED_SCENARIO ]] || DEPLOY_SCENARIO[${#DEPLOY_SCENARIO[@]}]=$CHANGED_SCENARIO
+    done
+    for CHANGED_FILE in $NO_SCENARIOS; do
+        case $CHANGED_FILE in
+            kubespray)
+                [[ ${DEPLOY_SCENARIO[@]} =~ "k8-nosdn-nofeature" ]] || DEPLOY_SCENARIO[${#DEPLOY_SCENARIO[@]}]='k8-nosdn-nofeature'
+                ;;
+            # Default case (including OSA changes)
+            *)
+                [[ ${DEPLOY_SCENARIO[@]} =~ "os-nosdn-nofeature" ]] || DEPLOY_SCENARIO[${#DEPLOY_SCENARIO[@]}]='os-nosdn-nofeature'
+                ;;
+        esac
+    done
+
+    # extract releng-xci sha
+    XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
+
+    # extract scenario sha which is same as releng-xci sha for generic scenarios
+    SCENARIO_SHA=$XCI_SHA
 }
 
 # This function determines the impacted external scenario by processing the Gerrit
 }
 
 # This function determines the impacted external scenario by processing the Gerrit
@@ -32,9 +126,9 @@ function determine_generic_scenario() {
 # its name gets recorded for deploying and testing the right scenario.
 #
 # Pattern
 # its name gets recorded for deploying and testing the right scenario.
 #
 # Pattern
-# <project-repo>/scenarios/<scenario>/<impacted files>: <scenario>
+#   <project-repo>/scenarios/<scenario>/<impacted files>: <scenario>
 function determine_external_scenario() {
 function determine_external_scenario() {
-    echo "Processing $GERRIT_PROJECT $GERRIT_REFSPEC"
+    echo "Processing $GERRIT_PROJECT patchset $GERRIT_REFSPEC"
 
     # remove the clone that is done via jenkins and place releng-xci there so the
     # things continue functioning properly
 
     # remove the clone that is done via jenkins and place releng-xci there so the
     # things continue functioning properly
@@ -50,11 +144,19 @@ function determine_external_scenario() {
     git fetch -q https://gerrit.opnfv.org/gerrit/$GERRIT_PROJECT $GERRIT_REFSPEC && git checkout -q FETCH_HEAD
 
     # process the diff to find out what scenario(s) are impacted - there should only be 1
     git fetch -q https://gerrit.opnfv.org/gerrit/$GERRIT_PROJECT $GERRIT_REFSPEC && git checkout -q FETCH_HEAD
 
     # process the diff to find out what scenario(s) are impacted - there should only be 1
-    DEPLOY_SCENARIO=$(git diff HEAD^..HEAD --name-only | grep scenarios | awk -F '[/|/]' '{print $2}' | uniq)
+    DEPLOY_SCENARIO+=$(git diff HEAD^..HEAD --name-only | grep scenarios | awk -F '[/|/]' '{print $2}' | uniq)
+
+    # extract releng-xci sha
+    XCI_SHA=$(cd $WORKSPACE && git rev-parse HEAD)
+
+    # extract scenario sha
+    SCENARIO_SHA=$(cd $WORK_DIRECTORY/$GERRIT_PROJECT && git rev-parse HEAD)
 }
 
 echo "Determining the impacted scenario"
 
 }
 
 echo "Determining the impacted scenario"
 
+declare -a DEPLOY_SCENARIO
+
 # ensure GERRIT_TOPIC is set
 GERRIT_TOPIC="${GERRIT_TOPIC:-''}"
 
 # ensure GERRIT_TOPIC is set
 GERRIT_TOPIC="${GERRIT_TOPIC:-''}"
 
@@ -63,21 +165,15 @@ GERRIT_TOPIC="${GERRIT_TOPIC:-''}"
 WORK_DIRECTORY=/tmp/$GERRIT_CHANGE_NUMBER/$DISTRO
 /bin/rm -rf $WORK_DIRECTORY && mkdir -p $WORK_DIRECTORY
 
 WORK_DIRECTORY=/tmp/$GERRIT_CHANGE_NUMBER/$DISTRO
 /bin/rm -rf $WORK_DIRECTORY && mkdir -p $WORK_DIRECTORY
 
-# skip the healthcheck if the patch doesn't impact the deployment
-if [[ "$GERRIT_TOPIC" =~ skip-verify|skip-deployment ]]; then
-    echo "Skipping verify!"
-    echo "DEPLOY_SCENARIO=os-nosdn-nofeature" > $WORK_DIRECTORY/scenario.properties
-    exit 0
-fi
-
 if [[ $GERRIT_PROJECT == "releng-xci" ]]; then
 if [[ $GERRIT_PROJECT == "releng-xci" ]]; then
+    override_generic_scenario
     determine_generic_scenario
 else
     determine_external_scenario
 fi
 
 # ensure single scenario is impacted
     determine_generic_scenario
 else
     determine_external_scenario
 fi
 
 # ensure single scenario is impacted
-if [[ $(echo $DEPLOY_SCENARIO | wc -w) != 1 ]]; then
+    if [[ $(IFS=$'\n' echo ${DEPLOY_SCENARIO[@]} | wc -w) != 1 ]]; then
     echo "Change impacts multiple scenarios!"
     echo "XCI doesn't support testing of changes that impact multiple scenarios currently."
     echo "Please split your change into multiple different/dependent changes, each modifying single scenario."
     echo "Change impacts multiple scenarios!"
     echo "XCI doesn't support testing of changes that impact multiple scenarios currently."
     echo "Please split your change into multiple different/dependent changes, each modifying single scenario."
@@ -85,12 +181,12 @@ if [[ $(echo $DEPLOY_SCENARIO | wc -w) != 1 ]]; then
 fi
 
 # set the installer
 fi
 
 # set the installer
-case $DEPLOY_SCENARIO in
+case ${DEPLOY_SCENARIO[0]} in
     os-*)
     os-*)
-        XCI_INSTALLER=osa
+        INSTALLER_TYPE=osa
         ;;
     k8-*)
         ;;
     k8-*)
-        XCI_INSTALLER=kubespray
+        INSTALLER_TYPE=kubespray
         ;;
     *)
         echo "Unable to determine the installer. Exiting!"
         ;;
     *)
         echo "Unable to determine the installer. Exiting!"
@@ -100,13 +196,21 @@ esac
 
 # save the installer and scenario names into java properties file
 # so they can be injected to downstream jobs via envInject
 
 # save the installer and scenario names into java properties file
 # so they can be injected to downstream jobs via envInject
-echo "Recording the installer '$XCI_INSTALLER' and scenario '$DEPLOY_SCENARIO' for downstream jobs"
-echo "XCI_INSTALLER=$XCI_INSTALLER" > $WORK_DIRECTORY/scenario.properties
+echo "Recording the installer '$INSTALLER_TYPE' and scenario '${DEPLOY_SCENARIO[0]}' and SHAs for downstream jobs"
+echo "INSTALLER_TYPE=$INSTALLER_TYPE" > $WORK_DIRECTORY/scenario.properties
 echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> $WORK_DIRECTORY/scenario.properties
 echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> $WORK_DIRECTORY/scenario.properties
+echo "XCI_SHA=$XCI_SHA" >> $WORK_DIRECTORY/scenario.properties
+echo "SCENARIO_SHA=$SCENARIO_SHA" >> $WORK_DIRECTORY/scenario.properties
+echo "PROJECT_NAME=$GERRIT_PROJECT" >> $WORK_DIRECTORY/scenario.properties
+
+# skip scenario support check if the job is promotion job
+if [[ "$JOB_NAME" =~ (os|k8) ]]; then
+    exit 0
+fi
 
 # skip the deployment if the scenario is not supported on this distro
 OPNFV_SCENARIO_REQUIREMENTS=$WORKSPACE/xci/opnfv-scenario-requirements.yml
 
 # skip the deployment if the scenario is not supported on this distro
 OPNFV_SCENARIO_REQUIREMENTS=$WORKSPACE/xci/opnfv-scenario-requirements.yml
-if ! sed -n "/^- scenario: $DEPLOY_SCENARIO$/,/^$/p" $OPNFV_SCENARIO_REQUIREMENTS | grep -q $DISTRO; then
-    echo "# SKIPPED: Scenario $DEPLOY_SCENARIO is NOT supported on $DISTRO"
+if ! sed -n "/^- scenario: ${DEPLOY_SCENARIO[0]}$/,/^$/p" $OPNFV_SCENARIO_REQUIREMENTS | grep -q $DISTRO; then
+    echo "# SKIPPED: Scenario ${DEPLOY_SCENARIO[0]} is NOT supported on $DISTRO"
     exit 0
 fi
     exit 0
 fi