X-Git-Url: https://gerrit.linuxfoundation.org/infra/gitweb?a=blobdiff_plain;f=shell%2Fjob-cost.sh;h=c5fb009a596ba3b9abf6ba149a68ad0450c62b5c;hb=b5f829055f4d8def12d62aa9e91456e5645924db;hp=6493a6ef71266d8aa1ab29fd9e568ce68bbc5c81;hpb=5fe90576c6f500ff92fbe7b76e42aad7d5d35fcd;p=releng%2Fglobal-jjb.git diff --git a/shell/job-cost.sh b/shell/job-cost.sh index 6493a6ef..c5fb009a 100644 --- a/shell/job-cost.sh +++ b/shell/job-cost.sh @@ -8,14 +8,28 @@ # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html ############################################################################## -echo "---> build-cost.sh" +echo "---> job-cost.sh" set -euf -o pipefail # shellcheck disable=SC1090 source ~/lf-env.sh -lf-activate-venv python-openstackclient +if [[ ! -f /run/cloud-init/result.json && ! -f stack-cost ]]; then + # Don't attempt to calculate job cost as build is not running in a + # cloud environment + echo "INFO: Skipping job cost calculation" + exit 0 +fi + +# AWS job cost not supported, exit +cloudtype="$(jq -r .v1.datasource /run/cloud-init/result.json)" +if [[ $cloudtype == "DataSourceEc2Local" ]]; then + echo "INFO: Not able to calculate job cost on AWS" + exit 0 +fi + +lf-activate-venv zipp==1.1.0 python-openstackclient urllib3~=1.26.15 if [[ -z ${JOB_NAME:-} ]]; then lf-echo-error "Required Env Variable Unset/Empty: JOB_NAME" @@ -39,21 +53,37 @@ else fi # Retrieve the current uptime (in seconds) -uptime=$(awk '{print $1}' /proc/uptime) -# Convert to integer by truncating fractional part' and round up by one -((uptime=${uptime%\.*}+1)) +# And Convert to integer by truncating fractional part' and round up by one +uptime=$(awk '{print int($1 + 1)}' /proc/uptime) +# EC2 and OpenStack have simiar instace metadata APIs at this IP +# AWS docs: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html +# Nova docs: https://docs.openstack.org/nova/latest/user/metadata.html +set +e instance_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type) +result=$? +if [[ "$result" -ne 0 ]]; then + echo "INFO: Unable to retrieve instance type. Skipping job cost..." + exit 0 +fi +set -e echo "INFO: Retrieving Pricing Info for: $instance_type" url="https://pricing.vexxhost.net/v1/pricing/$instance_type/cost?seconds=$uptime" -jason_block=$(curl -s "$url") +json_block=$(curl -s "$url") -cost=$(jq .cost <<< "$jason_block") -resource=$(jq .resource <<< "$jason_block" | tr -d '"') +# check if JSON returned and can be parsed +if jq . <<< "$json_block" > /dev/null 2>&1; then + cost=$(jq .cost <<< "$json_block") + resource=$(jq .resource <<< "$json_block" | tr -d '"') +else + echo "ERROR: Pricing API returned invalid json" + cost=0 + resource='unknown' +fi # Archive the cost date -mkdir -p "$WORKSPACE/archives/cost" +mkdir -p "${WORKSPACE}/archives/cost" echo "INFO: Archiving Costs" @@ -61,7 +91,6 @@ echo "INFO: Archiving Costs" # This format is readable by spreadsheet and is easily sortable date=$(TZ=GMT date +'%Y-%m-%d %H:%M:%S') -cat << EOF > "$WORKSPACE/archives/cost.csv" -$JOB_NAME,$BUILD_NUMBER,$date,$resource,$uptime,$cost,$stack_cost -EOF - +# Format the uptime, cost & stack_cost fields +printf "%s,%s,%s,%s,%d,%.2f,%.2f,%s\n" "${JOB_NAME:-}" "${BUILD_NUMBER:-}" "$date" \ + "$resource" "$uptime" "$cost" "$stack_cost" "${BUILD_RESULT:-}" > "${WORKSPACE}/archives/cost.csv"