148 lines
5.5 KiB
Bash
Executable File
148 lines
5.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Script removes virtual machines and other artifacts older than HOURS_LIMIT (24 hours by default) from Azure
|
|
|
|
. /usr/share/beakerlib/beakerlib.sh
|
|
|
|
|
|
# Delete old objects based on the $TAG_NAME tag value defined in a previous execution of the script
|
|
delete_old_resources() {
|
|
local resource_type="$1"
|
|
|
|
# list resources older than $TIMESTAMP based on the $TAG_NAME tag created in a previous run
|
|
rlRun -c -s 'az resource list --resource-type $resource_type --query "[?tags.$TAG_NAME < \`$TIMESTAMP\`].name" --output tsv' 0 "Get a list of $resource_type older than $TIMESTAMP"
|
|
resources_to_delete=$(cat $rlRun_LOG)
|
|
|
|
if [ -n "$resources_to_delete" ]; then
|
|
for object in $resources_to_delete; do
|
|
rlRun -t -c "az resource delete --resource-type=$resource_type --name $object --resource-group $AZURE_RESOURCE_GROUP"
|
|
done
|
|
else
|
|
rlLogInfo "No $resource_type older than $TIMESTAMP was found."
|
|
fi
|
|
}
|
|
|
|
# Find objects without the $TAG_NAME tag and create the tag with the current date/time value
|
|
tag_new_resources() {
|
|
local resource_type="$1"
|
|
|
|
# list resources without the $TAG_NAME tag
|
|
rlRun -c -s 'az resource list --resource-type $resource_type --query "[?tags.$TAG_NAME == null].name" --output tsv' 0 "Get a list of $resource_type without the $TAG_NAME tag."
|
|
resources_without_tag=$(cat $rlRun_LOG)
|
|
|
|
if [ -n "$resources_without_tag" ]; then
|
|
now=$(date -u '+%FT%T')
|
|
for object in $resources_without_tag; do
|
|
rlRun -t -c 'az resource update --resource-type $resource_type --name $object --resource-group $AZURE_RESOURCE_GROUP --set "tags.$TAG_NAME=$now"' 0 "Add tag $TAG_NAME:$now to $resource_type: $object"
|
|
done
|
|
else
|
|
rlLogInfo "No $resource_type without the $TAG_NAME tag was found."
|
|
fi
|
|
}
|
|
|
|
rlJournalStart
|
|
rlPhaseStartSetup
|
|
if [ -z "$AZURE_SUBSCRIPTION_ID" ]; then
|
|
rlFail "AZURE_SUBSCRIPTION_ID is empty!"
|
|
else
|
|
rlLogInfo "AZURE_SUBSCRIPTION_ID is configured"
|
|
fi
|
|
|
|
if [ -z "$AZURE_TENANT" ]; then
|
|
rlFail "AZURE_TENANT is empty!"
|
|
else
|
|
rlLogInfo "AZURE_TENANT is configured"
|
|
fi
|
|
|
|
if [ -z "$AZURE_CLIENT_ID" ]; then
|
|
rlFail "AZURE_CLIENT_ID is empty!"
|
|
else
|
|
rlLogInfo "AZURE_CLIENT_ID is configured"
|
|
fi
|
|
|
|
if [ -z "$AZURE_SECRET" ]; then
|
|
rlFail "AZURE_SECRET is empty!"
|
|
else
|
|
rlLogInfo "AZURE_SECRET is configured"
|
|
fi
|
|
|
|
export AZURE_RESOURCE_GROUP="${AZURE_RESOURCE_GROUP:-composer}"
|
|
rlLogInfo "AZURE_RESOURCE_GROUP=$AZURE_RESOURCE_GROUP"
|
|
|
|
export AZURE_STORAGE_ACCOUNT="${AZURE_STORAGE_ACCOUNT:-composerredhat}"
|
|
rlLogInfo "AZURE_STORAGE_ACCOUNT=$AZURE_STORAGE_ACCOUNT"
|
|
|
|
export AZURE_STORAGE_CONTAINER="${AZURE_STORAGE_CONTAINER:-composerredhat}"
|
|
rlLogInfo "AZURE_STORAGE_CONTAINER=$AZURE_STORAGE_CONTAINER"
|
|
|
|
# VMs older than HOURS_LIMIT will be deleted
|
|
HOURS_LIMIT="${HOURS_LIMIT:-24}"
|
|
export TIMESTAMP=`date -u -d "$HOURS_LIMIT hours ago" '+%FT%T'`
|
|
|
|
rlLogInfo "HOURS_LIMIT=$HOURS_LIMIT"
|
|
rlLogInfo "TIMESTAMP=$TIMESTAMP"
|
|
|
|
# It's not easily possible to get creation date/time of Azure objects.
|
|
# Use a tag to record when the object was seen for the first time
|
|
# and remove objects based on the value of the tag. The value is UTC
|
|
# date/time, format: 2019-01-29T15:16:40
|
|
TAG_NAME="first_seen"
|
|
|
|
# Use Microsoft repository to install azure-cli
|
|
rlRun -t -c "rpm --import https://packages.microsoft.com/keys/microsoft.asc"
|
|
cat > /etc/yum.repos.d/azure-cli.repo << __EOF__
|
|
[azure-cli]
|
|
name=Azure CLI
|
|
baseurl=https://packages.microsoft.com/yumrepos/azure-cli
|
|
enabled=1
|
|
gpgcheck=1
|
|
gpgkey=https://packages.microsoft.com/keys/microsoft.asc
|
|
__EOF__
|
|
rlRun -c -t "dnf install -y azure-cli"
|
|
|
|
# sign in
|
|
rlRun -c -t 'az login --service-principal --username "$AZURE_CLIENT_ID" --password "$AZURE_SECRET" --tenant "$AZURE_TENANT"'
|
|
rlPhaseEnd
|
|
|
|
# A list of Azure resources we want to clean
|
|
resource_types="
|
|
Microsoft.Compute/virtualMachines
|
|
Microsoft.Network/networkInterfaces
|
|
Microsoft.Network/publicIPAddresses
|
|
Microsoft.Network/networkSecurityGroups
|
|
Microsoft.Compute/disks
|
|
Microsoft.Compute/images
|
|
"
|
|
|
|
# Remove old resources and tag new resources
|
|
for resource_type in $resource_types; do
|
|
rlPhaseStartTest "Delete old $resource_type"
|
|
delete_old_resources $resource_type
|
|
rlPhaseEnd
|
|
|
|
rlPhaseStartTest "Tag new $resource_type"
|
|
tag_new_resources $resource_type
|
|
rlPhaseEnd
|
|
done
|
|
|
|
rlPhaseStartTest "Delete old blobs"
|
|
# get a list of blobs older than $TIMESTAMP
|
|
rlRun -c -s 'az storage blob list --container-name $AZURE_STORAGE_CONTAINER --query "[?properties.creationTime < \`$TIMESTAMP\`].[name,properties.creationTime]" --output tsv'
|
|
blobs_to_delete=$(cat $rlRun_LOG)
|
|
|
|
if [ -n "$blobs_to_delete" ]; then
|
|
while read name creation_time; do
|
|
rlLogInfo "Removing blob $name created $creation_time"
|
|
rlRun -t -c "az storage blob delete --container-name $AZURE_STORAGE_CONTAINER --name $name"
|
|
done <<< "$blobs_to_delete"
|
|
else
|
|
rlLogInfo "No blob older than $TIMESTAMP was found."
|
|
fi
|
|
rlPhaseEnd
|
|
|
|
rlPhaseStartCleanup
|
|
rlRun -c -t "rm -f /etc/yum.repos.d/azure-cli.repo"
|
|
rlPhaseEnd
|
|
|
|
rlJournalEnd
|
|
rlJournalPrintText
|