engine: Implement change dependency handling
[infra/cicd.git] / jjb / engine / scripts / generate-change-metadata.sh
index 2ad1e5fece6a4c3c07ecbefb0cb953aebdf8c986..ead0a77886da01273e8e2e43c8f0597e9f1a2ada 100755 (executable)
@@ -23,17 +23,78 @@ set -o nounset
 set -o errexit
 set -o pipefail
 
-# NOTE (fdegir): we need to remove $WORKSPACE and clone infra/engine repository
-# as infra/engine is what drives the deployment
-if [[ "$GERRIT_PROJECT" != "infra/engine" ]]; then
-  cd "$HOME" && /bin/rm -rf "$WORKSPACE"
-  echo "Info : Cloning infra/engine repository"
-  git clone -q https://gerrit.nordix.org/infra/engine.git "$WORKSPACE"
-  cd "$WORKSPACE"
-fi
+# NOTE (fdegir): in case if a change depends on another open change in different repo
+# we determine it here and override the version and refspec for that repo
+function determine_dependency() {
+  echo "Info  : Determining dependency"
+  echo "Info  : Commit message is"
+  echo "-------------------------------------------------------------------------"
+  echo "$GERRIT_CHANGE_COMMIT_MESSAGE"
+  echo "-------------------------------------------------------------------------"
+
+  if ! echo "$GERRIT_CHANGE_COMMIT_MESSAGE" | grep -qs "^Depends-On:"; then
+    echo "Info  : No dependency found"
+    return
+  else
+    echo "Info  : Dependency found!"
+    DEPENDENT_CHANGE_ID=$(echo "$GERRIT_CHANGE_COMMIT_MESSAGE" | grep "^Depends-On:" | cut -d":" -f2 | sed 's/\s*//g')
+  fi
+
+  echo "Info  : Processing change $DEPENDENT_CHANGE_ID"
+  declare -a DEPENDENT_CHANGE_METADATA
+  readarray -t DEPENDENT_CHANGE_METADATA < <(curl -s "https://gerrit.nordix.org/changes/?q=$DEPENDENT_CHANGE_ID&o=CURRENT_REVISION" 2>&1 \
+      | grep "project\|status\|current_revision\|ref.*," | sed -e 's/\s//g' -e 's/,//g' -e 's/"//g'| cut -d: -f2)
+
+  # NOTE (fdegir): check if the dependeny change exists
+  # and ignore if it doesn't
+  if [[ -z "${DEPENDENT_CHANGE_METADATA+x}" ]]; then
+    echo "Warn  : Unable to determine dependent change. Ignoring dependency!"
+    return
+  fi
+
+  DEPENDENT_CHANGE_PROJECT="${DEPENDENT_CHANGE_METADATA[0]}"
+  DEPENDENT_CHANGE_STATUS="${DEPENDENT_CHANGE_METADATA[1]}"
+  DEPENDENT_CHANGE_REVISION="${DEPENDENT_CHANGE_METADATA[2]}"
+  DEPENDENT_CHANGE_REFSPEC="${DEPENDENT_CHANGE_METADATA[3]}"
+  echo "-------------------------------------------------------------------------"
+  echo "        DEPENDENT_CHANGE_PROJECT=$DEPENDENT_CHANGE_PROJECT"
+  echo "        DEPENDENT_CHANGE_STATUS=$DEPENDENT_CHANGE_STATUS"
+  echo "        DEPENDENT_CHANGE_REVISION=$DEPENDENT_CHANGE_REVISION"
+  echo "        DEPENDENT_CHANGE_REFSPEC=$DEPENDENT_CHANGE_REFSPEC"
+  echo "-------------------------------------------------------------------------"
+
+  # NOTE (fdegir): we only follow the dependency if the change status is NEW
+  if [[ "$DEPENDENT_CHANGE_STATUS" != "NEW" ]]; then
+    echo "Warn  : Change is not open. Ignoring dependency!"
+    return
+  fi
+
+  # NOTE (fdegir): we do not accept dependency of a change that is sent to same project as the dependent change
+  if [[ "$DEPENDENT_CHANGE_PROJECT" == "$GERRIT_PROJECT" ]]; then
+    echo "Warn  : Change is for the same project. Ignoring dependency!"
+    return
+  fi
+
+  DEPENDENT_COMPONENT="${DEPENDENT_CHANGE_PROJECT//*\//}"
+
+  echo "# dependent change" >> "$CHANGE_METADATA_FILE"
+
+  # NOTE (fdegir): if dependent change is on stack repo, we need to treat it
+  # differently
+  if [[ "$DEPENDENT_CHANGE_PROJECT" =~ /stack/ ]]; then
+    # set vars
+    echo "STACK_TYPE=$DEPENDENT_COMPONENT" >> "$CHANGE_METADATA_FILE"
+    echo "STACK_VERSION=$DEPENDENT_CHANGE_REVISION" >> "$CHANGE_METADATA_FILE"
+    echo "STACK_REFSPEC=$DEPENDENT_CHANGE_REFSPEC" >> "$CHANGE_METADATA_FILE"
+  else
+    echo "NORDIX_$(echo $DEPENDENT_COMPONENT | tr a-z A-Z)_VERSION=$DEPENDENT_CHANGE_REVISION" >> "$CHANGE_METADATA_FILE"
+    echo "NORDIX_$(echo $DEPENDENT_COMPONENT | tr a-z A-Z)_REFSPEC=$DEPENDENT_CHANGE_REFSPEC" >> "$CHANGE_METADATA_FILE"
+  fi
+
+}
 
 # file to record change metadata
- export CHANGE_METADATA_FILE="$WORKSPACE/change.properties"
+export CHANGE_METADATA_FILE="$WORKSPACE/change.properties"
 /bin/rm -f "$CHANGE_METADATA_FILE"
 
 echo "Info  : Generating change metadata"
@@ -49,13 +110,9 @@ if [[ "$GERRIT_PROJECT" =~ /stack/ ]]; then
   export STACK_VERSION="$GERRIT_PATCHSET_REVISION"
   export STACK_REFSPEC="$GERRIT_REFSPEC"
 
-  # log info to console
-  echo "        STACK_TYPE=$STACK_TYPE"
-  echo "        STACK_VERSION=$GERRIT_PATCHSET_REVISION"
-  echo "        STACK_REFSPEC=$GERRIT_REFSPEC"
-
   # record vars to properties file
   echo "STACK_TYPE=$STACK_TYPE" >> "$CHANGE_METADATA_FILE"
+  echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> "$CHANGE_METADATA_FILE"
   echo "STACK_VERSION=$STACK_VERSION" >> "$CHANGE_METADATA_FILE"
   echo "STACK_REFSPEC=$STACK_REFSPEC" >> "$CHANGE_METADATA_FILE"
 elif [[ "$GERRIT_PROJECT" =~ /installer/ ]]; then
@@ -63,25 +120,23 @@ elif [[ "$GERRIT_PROJECT" =~ /installer/ ]]; then
   case "${ENGINE_COMPONENT}" in
     kolla)
       export STACK_TYPE="openstack"
+      echo "Info  : Deploy scenario is overriden by job to $DEPLOY_SCENARIO"
       ;;
     kubespray)
       export STACK_TYPE="kubernetes"
+      echo "Info  : Deploy scenario is overriden by job to $DEPLOY_SCENARIO"
       ;;
     oom)
       export STACK_TYPE="onap"
+      echo "Info  : Deploy scenario is overriden by job to $DEPLOY_SCENARIO"
       ;;
     *) echo "ERROR : Invalid engine component $ENGINE_COMPONENT"; exit 1;;
   esac
   export STACK_VERSION="$GERRIT_BRANCH"
 
-  # log info to console
-  echo "        STACK_TYPE=$STACK_TYPE"
-  echo "        STACK_VERSION=$STACK_VERSION"
-  echo "        NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_VERSION=$GERRIT_PATCHSET_REVISION"
-  echo "        NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_REFSPEC=$GERRIT_REFSPEC"
-
   # record vars to properties file
   echo "STACK_TYPE=$STACK_TYPE" >> "$CHANGE_METADATA_FILE"
+  echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> "$CHANGE_METADATA_FILE"
   echo "STACK_VERSION=$STACK_VERSION" >> "$CHANGE_METADATA_FILE"
   echo "NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_VERSION=$GERRIT_PATCHSET_REVISION" >> "$CHANGE_METADATA_FILE"
   echo "NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_REFSPEC=$GERRIT_REFSPEC" >> "$CHANGE_METADATA_FILE"
@@ -90,14 +145,9 @@ else
   export STACK_TYPE=kubernetes
   export STACK_VERSION=$GERRIT_BRANCH
 
-  # log info to console
-  echo "        STACK_TYPE=$STACK_TYPE"
-  echo "        STACK_VERSION=$STACK_VERSION"
-  echo "        NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_VERSION=$GERRIT_PATCHSET_REVISION"
-  echo "        NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_REFSPEC=$GERRIT_REFSPEC"
-
   # record vars to properties file
-  echo "STACK_TYPE=kubernetes" >> "$CHANGE_METADATA_FILE"
+  echo "STACK_TYPE=$STACK_TYPE" >> "$CHANGE_METADATA_FILE"
+  echo "DEPLOY_SCENARIO=$DEPLOY_SCENARIO" >> "$CHANGE_METADATA_FILE"
   echo "STACK_VERSION=$STACK_VERSION" >> "$CHANGE_METADATA_FILE"
   echo "NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_VERSION=$GERRIT_PATCHSET_REVISION" >> "$CHANGE_METADATA_FILE"
   echo "NORDIX_$(echo $ENGINE_COMPONENT | tr a-z A-Z)_REFSPEC=$GERRIT_REFSPEC" >> "$CHANGE_METADATA_FILE"
@@ -125,6 +175,10 @@ NORDIX_ARM_REPO=nordix-${STACK_TYPE}
 NORDIX_ARTIFACT_URL=$NORDIX_ARTIFACT_URL
 EOF
 
+# NOTE (fdegir): we generated the change metadata file normally until here
+# we now determine the dependency as the last step to ensure we override vars
+determine_dependency
+
 echo "Info  : Change metadata"
 echo "-------------------------------------------------------------------------"
 cat "$CHANGE_METADATA_FILE"