9171aae39f
This uses curl -f when writing an allocation in order to detect when the server has responded with a HTTP error code and then fails the job if so. The idea behind this is to catch when PUT /allocations/{consumer_uuid} required parameters change and the perfload jobs need to be updated. The curl -S option is also added to show the error if curl fails. Change-Id: Ic06e64b1031ff37d7ada55449ae71cd39b1298a2
135 lines
5.0 KiB
Bash
Executable File
135 lines
5.0 KiB
Bash
Executable File
#!/bin/bash -x
|
|
|
|
WORK_DIR=$1
|
|
|
|
# Do some performance related information gathering for placement.
|
|
EXPLANATION="
|
|
This output combines output from placeload with timing information
|
|
gathered via curl. The placeload output is the current maximum
|
|
microversion of placement followed by an encoded representation of
|
|
what it has done. Lowercase 'r', 'i', 'a', and 't' indicate successful
|
|
creation of a resource provider and setting inventory, aggregates, and
|
|
traits on that resource provider.
|
|
|
|
If there are upper case versions of any of those letters, a failure
|
|
happened for a single request. The letter will be followed by the
|
|
HTTP status code and the resource provider uuid. These can be used
|
|
to find the relevant entry in logs/placement-api.log.
|
|
|
|
Note that placeload does not exit with an error code when this
|
|
happens. It merely reports and moves on. Under correct circumstances
|
|
the right output is a long string of 4000 characters containing
|
|
'r', 'i', 'a', 't' in random order (because async).
|
|
|
|
After that are three aggregate uuids, timing information for the
|
|
placeload run, and then timing information for two identical curl
|
|
requests for allocation candidates.
|
|
|
|
If no timed requests are present it means that the expected number
|
|
of resource providers were not created. At this time, only resource
|
|
providers are counted, not whether they have the correct inventory,
|
|
aggregates, or traits.
|
|
|
|
"
|
|
|
|
# This aggregate uuid is a static value in placeload.
|
|
AGGREGATE="14a5c8a3-5a99-4e8f-88be-00d85fcb1c17"
|
|
TRAIT="HW_CPU_X86_AVX2"
|
|
PLACEMENT_QUERY="resources=VCPU:1,DISK_GB:10,MEMORY_MB:256&member_of=${AGGREGATE}&required=${TRAIT}"
|
|
PLACEMENT_URL="http://127.0.0.1:8000"
|
|
|
|
|
|
LOG=placement-perf.txt
|
|
LOG_DEST=${WORK_DIR}/logs
|
|
COUNT=1000
|
|
|
|
# Apache Benchmark Concurrency
|
|
AB_CONCURRENT=10
|
|
# Apache Benchmark Total Requests
|
|
AB_COUNT=500
|
|
|
|
trap "sudo cp -p $LOG $LOG_DEST" EXIT
|
|
|
|
function time_candidates {
|
|
(
|
|
echo "##### TIMING GET /allocation_candidates?${PLACEMENT_QUERY} twice"
|
|
time curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement latest' "${PLACEMENT_URL}/allocation_candidates?${PLACEMENT_QUERY}" > /dev/null
|
|
time curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement latest' "${PLACEMENT_URL}/allocation_candidates?${PLACEMENT_QUERY}" > /dev/null
|
|
) 2>&1 | tee -a $LOG
|
|
}
|
|
|
|
function ab_bench {
|
|
(
|
|
echo "#### Running apache benchmark"
|
|
ab -c $AB_CONCURRENT -n $AB_COUNT -H 'x-auth-token: admin' -H 'openstack-api-version: placement latest' "${PLACEMENT_URL}/allocation_candidates?${PLACEMENT_QUERY}"
|
|
) 2>&1 | tee -a $LOG
|
|
}
|
|
|
|
function write_allocation {
|
|
# Take the first allocation request and send it back as a well-formed allocation
|
|
curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement latest' "${PLACEMENT_URL}/allocation_candidates?${PLACEMENT_QUERY}&limit=5" \
|
|
| jq --arg proj $(uuidgen) --arg user $(uuidgen) '.allocation_requests[0] + {consumer_generation: null, project_id: $proj, user_id: $user, consumer_type: "TEST"}' \
|
|
| curl -f -s -S -H 'x-auth-token: admin' -H 'content-type: application/json' -H 'openstack-api-version: placement latest' \
|
|
-X PUT -d @- "${PLACEMENT_URL}/allocations/$(uuidgen)"
|
|
rc=$?
|
|
# curl -f will fail silently on server errors and return code 22
|
|
# When used with -s, --silent, -S makes curl show an error message if it fails
|
|
# If we failed to write an allocation, skip measurements and log a message
|
|
if [[ $rc -eq 22 ]]; then
|
|
echo "Failed to write allocation due to a server error. See logs/placement-api.log for additional detail."
|
|
exit 1
|
|
elif [[ $rc -ne 0 ]]; then
|
|
echo "Failed to write allocation, curl returned code: $rc. See job-output.txt for additional detail."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function load_candidates {
|
|
time_candidates
|
|
for iter in {1..99}; do
|
|
echo "##### Writing allocation ${iter}" | tee -a $LOG
|
|
write_allocation
|
|
time_candidates
|
|
done
|
|
}
|
|
|
|
function check_placement {
|
|
local rp_count
|
|
local code
|
|
code=0
|
|
|
|
python3 -m venv .placeload
|
|
. .placeload/bin/activate
|
|
|
|
# install placeload
|
|
pip install 'placeload==0.3.0'
|
|
|
|
set +x
|
|
# load with placeload
|
|
(
|
|
echo "$EXPLANATION"
|
|
# preheat the aggregates to avoid https://bugs.launchpad.net/nova/+bug/1804453
|
|
placeload $PLACEMENT_URL 10
|
|
echo "##### TIMING placeload creating $COUNT resource providers with inventory, aggregates and traits."
|
|
time placeload $PLACEMENT_URL $COUNT
|
|
) 2>&1 | tee -a $LOG
|
|
rp_count=$(curl -H 'x-auth-token: admin' ${PLACEMENT_URL}/resource_providers |json_pp|grep -c '"name"')
|
|
# If we failed to create the required number of rps, skip measurements and
|
|
# log a message.
|
|
if [[ $rp_count -ge $COUNT ]]; then
|
|
load_candidates
|
|
ab_bench
|
|
else
|
|
(
|
|
echo "Unable to create expected number of resource providers. Expected: ${COUNT}, Got: $rp_count"
|
|
echo "See job-output.txt.gz and logs/placement-api.log for additional detail."
|
|
) | tee -a $LOG
|
|
code=1
|
|
fi
|
|
set -x
|
|
deactivate
|
|
exit $code
|
|
}
|
|
|
|
check_placement
|