X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=jjb%2Fopendaylight-infra-cleanup-stale-stacks.sh;h=18a5a969136446f9c34141215e98ffc529fe7708;hb=171eb327c007a331ea111ff98dc94a26a3704de2;hp=f44ac51079794a844d02635f17ade872e8ec106f;hpb=9b034261eefff94c09d5b8cac46fb1fcd87aab2c;p=releng%2Fbuilder.git diff --git a/jjb/opendaylight-infra-cleanup-stale-stacks.sh b/jjb/opendaylight-infra-cleanup-stale-stacks.sh index f44ac5107..18a5a9691 100644 --- a/jjb/opendaylight-infra-cleanup-stale-stacks.sh +++ b/jjb/opendaylight-infra-cleanup-stale-stacks.sh @@ -1,16 +1,84 @@ #!/bin/bash -virtualenv $WORKSPACE/.venv -source $WORKSPACE/.venv/bin/activate +# SPDX-License-Identifier: EPL-1.0 +############################################################################## +# Copyright (c) 2017 The Linux Foundation and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# which accompanies this distribution, and is available at +# http://www.eclipse.org/legal/epl-v10.html +############################################################################## + +virtualenv "/tmp/v/openstack" +# shellcheck source=/tmp/v/openstack/bin/activate disable=SC1091 +source "/tmp/v/openstack/bin/activate" pip install --upgrade pip pip install --upgrade python-openstackclient python-heatclient -pip freeze +pip install --upgrade pipdeptree +pipdeptree + +######################### +## FETCH ACTIVE BUILDS ## +######################### +# Fetch stack list before fetching active builds to minimize race condition +# where we might be try to delete stacks while jobs are trying to start +OS_STACKS=($(openstack 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"')) + +# 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 -nv -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 $4 "-" $6 "-" $7}')) +done -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 +########################## +## DELETE UNUSED STACKS ## +########################## +# Search for stacks that are not in use by either releng or sandbox silos and +# delete them. +for STACK_NAME in "${OS_STACKS[@]}"; do + STACK_STATUS=$(openstack stack show -f json -c "stack_status" "$STACK_NAME" | jq -r '."stack_status"') + if [[ "${ACTIVE_BUILDS[*]}" =~ $STACK_NAME ]]; then + # No need to delete stacks if there exists an active build for them + continue + else + case "$STACK_STATUS" in + DELETE_IN_PROGRESS) + echo "skipping delete, $STACK_NAME is already DELETE in progress." + continue + ;; + DELETE_FAILED) + echo "Stack delete failed, trying to stack abandon now." + # stack abandon does not work on RS, therefore requires acquiring a token + # and using http delete method to abondon DELETE_FAILED stacks + # Todo: remove the change once RS fixes the issue upstream + # openstack stack abandon "$STACK_NAME" + STACK_ID=$(openstack stack show -f json -c "id" "$STACK_NAME" | jq -r '."id"') + TOKEN=$(openstack token issue -f json -c id | jq -r '.id') + curl -si -X DELETE -H "Content-Type: application/json" -H "Accept: application/json"\ + -H "x-auth-token: $TOKEN"\ + "https://dfw.orchestration.api.rackspacecloud.com/v1/904885/stacks/$STACK_NAME/$STACK_ID/abandon" + STACK_SHOW=$(openstack stack show "$STACK_NAME") + echo "$STACK_SHOW" + continue + ;; + CREATE_COMPLETE|CREATE_FAILED) + echo "Deleting orphaned stack: $STACK_NAME" + openstack stack delete --yes "$STACK_NAME" + continue + ;; + *) + continue + ;; + esac + fi done