Fix: Handle error in job-cost.sh without failing
[releng/global-jjb.git] / shell / job-cost.sh
index 34ab5e7..c5fb009 100644 (file)
@@ -15,13 +15,21 @@ set -euf -o pipefail
 # shellcheck disable=SC1090
 source ~/lf-env.sh
 
+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
-if grep -qi amazon /sys/devices/virtual/dmi/id/bios_vendor ; then
-  echo "INFO: Not able to calculate job cost on AWS"
-  exit 0
+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 python-openstackclient
+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"
@@ -45,31 +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"
 json_block=$(curl -s "$url")
 
 # check if JSON returned and can be parsed
-if jq <<< "$json_block"; then
+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=0
+    resource='unknown'
 fi
 
 # Archive the cost date
-mkdir -p "$WORKSPACE/archives/cost"
+mkdir -p "${WORKSPACE}/archives/cost"
 
 echo "INFO: Archiving Costs"
 
@@ -77,6 +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"