diff --git a/.zuul.yaml b/.zuul.yaml index 1181d33dd..b0e3c62a4 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -14,8 +14,31 @@ - openstack-tox-functional - openstack-tox-functional-py35 - openstack-tox-functional-py36 + - placement-perfload: + voting: false gate: jobs: - openstack-tox-functional - openstack-tox-functional-py35 - openstack-tox-functional-py36 + +# TODO(cdent): Using devstack (even minimal) here is more than we need. We +# ought to be able to take a blank node, install placement on it, use +# environment variables for configuration, run placeload, and collect the logs. +# However, that requires more knowledge of zuul and ansible than I currently +# have and we can iterate. +- job: + name: placement-perfload + parent: devstack-minimal + description: | + Run a tiny devstack with just placement and keystone and log placement + performance. + required-projects: + - git.openstack.org/openstack/keystone + - git.openstack.org/openstack/placement + run: playbooks/perfload.yaml + vars: + devstack_services: + mysql: true + placement-api: true + key: true diff --git a/gate/post_test_perf_check.sh b/gate/post_test_perf_check.sh deleted file mode 100755 index 5037d9716..000000000 --- a/gate/post_test_perf_check.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash -x - -# 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/screen-placement-api.txt.gz. - -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, and then the output -of two timed curl requests. - -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}" - -BASE=${BASE:-/opt/stack} -source ${BASE}/new/devstack/functions -source ${BASE}/new/devstack/lib/nova -source ${BASE}/new/devstack/lib/placement -# Putting the log here ought to mean it is automatically gathered by zuul -LOG=${BASE}/logs/placement-perf.txt -COUNT=1000 - -function check_placement { - local placement_url - local rp_count - - python -m virtualenv -p python3 .placeload - . .placeload/bin/activate - - # install placeload - pip install 'placeload==0.3.0' - - # Turn off keystone auth - iniset -sudo $NOVA_CONF DEFAULT auth_strategy noauth2 - restart_service devstack@placement-api - - # get placement endpoint - placement_url=$(get_endpoint_url placement public) - - # load with placeload - ( - echo "$EXPLANATION" - placeload $placement_url $COUNT - ) | tee -a $LOG - rp_count=$(curl -H 'x-auth-token: admin' $placement_url/resource_providers |json_pp|grep -c '"name"') - # Skip curl and note if we failed to create the required number of rps - if [[ $rp_count -ge $COUNT ]]; then - ( - echo '##### TIMING GET /allocation_candidates' - time curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement 1.21' "$placement_url/allocation_candidates?${PLACEMENT_QUERY}" > /dev/null - time curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement 1.21' "$placement_url/allocation_candidates?${PLACEMENT_QUERY}" > /dev/null - ) 2>&1 | tee -a $LOG - else - ( - echo "Unable to create expected number of resource providers. Expected: ${COUNT}, Got: $rp_count" - echo "See job-output.txt.gz and logs/screen-placement-api.txt.gz for additional detail." - ) | tee -a $LOG - fi - deactivate -} - -# Be admin -set +x -source $BASE/new/devstack/openrc admin -set -x -check_placement diff --git a/playbooks/perfload.yaml b/playbooks/perfload.yaml new file mode 100644 index 000000000..5be09f6dc --- /dev/null +++ b/playbooks/perfload.yaml @@ -0,0 +1,111 @@ +- hosts: all + # Do the default devstack orchestration and then follow with perfload + strategy: linear + roles: + - orchestrate-devstack + +- hosts: all + tasks: + # Borrowed from devstack tasks but we want it early. + - name: Ensure {{ ansible_user_dir }}/logs exists + become: true + file: + path: "{{ ansible_user_dir }}/logs" + state: directory + owner: "{{ ansible_user }}" + - name: placement performance + shell: + executable: /bin/bash + # TODO(cdent): Change this task to a role? + cmd: | + set -x + # 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/screen-placement-api.txt.gz. + + 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, and then the output + of two timed curl requests. + + 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}" + RETURN_CODE=0 + + BASE=${BASE:-/opt/stack} + source ${BASE}/devstack/functions + source ${BASE}/devstack/lib/placement + # Putting the log here ought to mean it is automatically gathered by zuul + LOG=placement-perf.txt + LOG_DEST={{ ansible_user_dir }}/logs + COUNT=1000 + + function check_placement { + local placement_url + local rp_count + + python -m virtualenv -p python3 .placeload + . .placeload/bin/activate + + # install placeload + pip install 'placeload==0.3.0' + + # Turn off keystone auth + iniset -sudo $PLACEMENT_CONF api auth_strategy noauth2 + restart_service devstack@placement-api + + # get placement endpoint + placement_url=$(get_endpoint_url placement public) + + # load with placeload + ( + echo "$EXPLANATION" + placeload $placement_url $COUNT + ) | tee -a $LOG + rp_count=$(curl -H 'x-auth-token: admin' $placement_url/resource_providers |json_pp|grep -c '"name"') + # Skip curl and note if we failed to create the required number of rps + if [[ $rp_count -ge $COUNT ]]; then + ( + echo '##### TIMING GET /allocation_candidates' + time curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement 1.21' "$placement_url/allocation_candidates?${PLACEMENT_QUERY}" > /dev/null + time curl -s -H 'x-auth-token: admin' -H 'openstack-api-version: placement 1.21' "$placement_url/allocation_candidates?${PLACEMENT_QUERY}" > /dev/null + ) 2>&1 | tee -a $LOG + else + ( + echo "Unable to create expected number of resource providers. Expected: ${COUNT}, Got: $rp_count" + echo "See job-output.txt.gz and logs/screen-placement-api.txt.gz for additional detail." + RETURN_CODE=1 + ) | tee -a $LOG + fi + deactivate + sudo cp -p $LOG $LOG_DEST + } + + # Be admin + set +x + source $BASE/devstack/openrc admin + set -x + check_placement + exit $RETURN_CODE