pip install --upgrade python-openstackclient python-heatclient
pip freeze
-DELETE_LIST=(`openstack --os-cloud rackspace stack list -f json | \
- jq -r '.[] | \
- select((."Stack Status" == "CREATE_FAILED") or \
- (."Stack Status" == "DELETE_FAILED")) | \
- ."Stack Name"'`)
-for i in "${DELETE_LIST[@]}"; do
- echo "Deleting stack $i"
- openstack --os-cloud rackspace stack delete --yes $i
+#########################
+## FETCH ACTIVE BUILDS ##
+#########################
+# Make sure we fetch active builds on both the releng and sandbox silos
+ACTIVE_BUILDS=()
+for silo in releng sandbox; do
+ JENKINS_URL="https://jenkins.opendaylight.org/$silo//computer/api/json?tree=computer[executors[currentExecutable[url]],oneOffExecutors[currentExecutable[url]]]&xpath=//url&wrapper=builds"
+ wget --no-verbose -O $silo_builds.json $JENKINS_URL
+ sleep 1 # Need to sleep for 1 second otherwise next line causes script to stall
+ ACTIVE_BUILDS=(${ACTIVE_BUILDS[@]} ` \
+ jq -r '.computer[].executors[].currentExecutable.url' $silo_builds.json \
+ | grep -v null | awk -F'/' '{print $6 "-" $7}'`)
+done
+
+##########################
+## DELETE UNUSED STACKS ##
+##########################
+# Search for stacks taht are not in use by either releng or sandbox silos and
+# delete them.
+OS_STACKS=(`openstack --os-cloud rackspace stack list \
+ -f json -c "Stack Name" -c "Stack Status" \
+ --property "stack_status=CREATE_COMPLETE" \
+ --property "stack_status=DELETE_FAILED" \
+ --property "stack_status=CREATE_FAILED" \
+ | jq -r '.[] | ."Stack Name"'`)
+for stack in ${OS_STACKS[@]}; do
+ if [[ "${ACTIVE_BUILDS[@]}" =~ $stack ]]; then
+ # No need to delete stacks if there exists an active build for them
+ continue
+ else
+ echo "Deleting orphaned stack: $stack"
+ openstack --os-cloud rackspace stack delete --yes $stack
+ fi
done
JOB_SUM=`echo $JOB_NAME | sum | awk '{{ print $1 }}'`
VM_NAME="$JOB_SUM-$BUILD_NUMBER"
-openstack --os-cloud rackspace stack create --wait --timeout 15 -t {stack-template} -e $WORKSPACE/opendaylight-infra-environment.yaml --parameter "job_name=$VM_NAME" --parameter "silo=$SILO" $STACK_NAME
-OS_STATUS=`openstack --os-cloud rackspace stack show -f json -c stack_status $STACK_NAME | jq -r '.stack_status'`
-if [ "$OS_STATUS" != "CREATE_COMPLETE" ]; then
- echo "Failed to initialize infrastructure. Quitting..."
- exit 1
-fi
+openstack --os-cloud rackspace stack create -t {stack-template} -e $WORKSPACE/opendaylight-infra-environment.yaml --parameter "job_name=$VM_NAME" --parameter "silo=$SILO" $STACK_NAME
+
+# seq X refers to waiting for X minutes for OpenStack to return
+# a status that is not CREATE_IN_PROGRESS before giving up.
+OS_TIMEOUT=15 # Minutes to wait for OpenStack VM to come online
+echo "Waiting for $OS_TIMEOUT minutes to create $STACK_NAME."
+for i in `seq $OS_TIMEOUT`; do
+ sleep 60
+ OS_STATUS=`openstack --os-cloud rackspace stack show -f json -c stack_status $STACK_NAME | jq -r '.stack_status'`
+ if [ "$OS_STATUS" == "CREATE_COMPLETE" ]; then
+ echo "Stack initialized on infrastructure successful."
+ break
+ elif [ "$OS_STATUS" == "CREATE_FAILED" ]; then
+ echo "ERROR: Failed to initialize infrastructure. Quitting..."
+ exit 1
+ elif [ "$OS_STATUS" == "CREATE_IN_PROGRESS" ]; then
+ echo "Waiting to initialize infrastructure."
+ continue
+ else
+ echo "Unexpected status: $OS_STATUS"
+ fi
+done
- postbuildscript:
builders:
- shell: |
+ #!/bin/bash
if [ -d "$WORKSPACE/.venv-openstack" ]; then
source $WORKSPACE/.venv-openstack/bin/activate
- openstack --os-cloud rackspace stack delete --yes $STACK_NAME
+ OS_STATUS=`openstack --os-cloud rackspace stack show -f json -c stack_status $STACK_NAME | jq -r '.stack_status'`
+ if [ "$OS_STATUS" != "CREATE_IN_PROGRESS" ] && [ "$OS_STATUS" != "DELETE_IN_PROGRESS" ]; then
+ openstack --os-cloud rackspace stack delete --yes $STACK_NAME
+ fi
fi
- shell: !include-raw: include-raw-deploy-archives.sh
- maven-target: