)]}'
{".zuul.yaml":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"change_message_id":"a4ee84586a64706b851c334f32e0a3d2c767ea0f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Initial set of jobs that will be extended over time as"},{"line_number":2,"context_line":"# we get things working."},{"line_number":3,"context_line":"- project:"},{"line_number":4,"context_line":"    templates:"},{"line_number":5,"context_line":"      - build-openstack-docs-pti"},{"line_number":6,"context_line":"      - openstack-lower-constraints-jobs"},{"line_number":7,"context_line":"      - openstack-python-jobs"},{"line_number":8,"context_line":"      - openstack-python35-jobs"},{"line_number":9,"context_line":"      - openstack-python36-jobs"},{"line_number":10,"context_line":"    check:"},{"line_number":11,"context_line":"      jobs:"},{"line_number":12,"context_line":"        - build-openstack-api-ref"},{"line_number":13,"context_line":"        - openstack-tox-functional"},{"line_number":14,"context_line":"        - openstack-tox-functional-py35"},{"line_number":15,"context_line":"        - openstack-tox-functional-py36"},{"line_number":16,"context_line":"        - placement-tempest-gabbi:"},{"line_number":17,"context_line":"            voting: false"},{"line_number":18,"context_line":"    gate:"},{"line_number":19,"context_line":"      jobs:"},{"line_number":20,"context_line":"        - build-openstack-api-ref"},{"line_number":21,"context_line":"        - openstack-tox-functional"},{"line_number":22,"context_line":"        - openstack-tox-functional-py35"},{"line_number":23,"context_line":"        - openstack-tox-functional-py36"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"- job:"},{"line_number":26,"context_line":"    name: placement-tempest-gabbi"},{"line_number":27,"context_line":"    parent: devstack-tempest"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3f79a3b5_b60d3d3f","line":24,"range":{"start_line":3,"start_character":2,"end_line":24,"end_character":0},"updated":"2018-09-19 18:12:41.000000000","message":"Job placement-tempest-gabbi not defined","commit_id":"cbb97ebff4fcfff335db3d95dc25fc3e7f0666ca"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"change_message_id":"a4ee84586a64706b851c334f32e0a3d2c767ea0f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        - openstack-tox-functional-py35"},{"line_number":23,"context_line":"        - openstack-tox-functional-py36"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"- job:"},{"line_number":26,"context_line":"    name: placement-tempest-gabbi"},{"line_number":27,"context_line":"    parent: devstack-tempest"},{"line_number":28,"context_line":"    timeout: 10800"},{"line_number":29,"context_line":"    description: |"},{"line_number":30,"context_line":"        Test placement integration with gabbi."},{"line_number":31,"context_line":"    required-projects:"},{"line_number":32,"context_line":"        - openstack/keystone"},{"line_number":33,"context_line":"        - openstack/neutron"},{"line_number":34,"context_line":"        - openstack/nova"},{"line_number":35,"context_line":"        - openstack/placement"},{"line_number":36,"context_line":"    vars:"},{"line_number":37,"context_line":"      tempest_test_regex: \u0027gabbi\u0027"},{"line_number":38,"context_line":"      devstack_localrc:"},{"line_number":39,"context_line":"        # gabbi-tempest is currently unofficial so pull it in as a hack"},{"line_number":40,"context_line":"        TEMPEST_PLUGINS: \u0027git+git://github.com/cdent/gabbi-tempest.git#egg\u003dgabbi-tempest\u0027"},{"line_number":41,"context_line":"        # because why not"},{"line_number":42,"context_line":"        USE_PYTHON3: True"},{"line_number":43,"context_line":"      devstack_services:"},{"line_number":44,"context_line":"        # turn off some stuff we don\u0027t strictly need"},{"line_number":45,"context_line":"        s-account: false"},{"line_number":46,"context_line":"        s-container: false"},{"line_number":47,"context_line":"        s-object: false"},{"line_number":48,"context_line":"        s-proxy: false"},{"line_number":49,"context_line":"        c-api: false"},{"line_number":50,"context_line":"        c-bak: false"},{"line_number":51,"context_line":"        c-sch: false"},{"line_number":52,"context_line":"        c-vol: false"},{"line_number":53,"context_line":"        cinder: false"},{"line_number":54,"context_line":"    tasks:"},{"line_number":55,"context_line":"      name: perf check"},{"line_number":56,"context_line":"      executable: /bin/bash"},{"line_number":57,"context_line":"      # Probably move this out of here, but let\u0027s see how it goes."},{"line_number":58,"context_line":"      cmd: |"},{"line_number":59,"context_line":"        set -x"},{"line_number":60,"context_line":"        # Do some performance related information gathering for placement."},{"line_number":61,"context_line":"        EXPLANATION\u003d\""},{"line_number":62,"context_line":"        This output combines output from placeload with timing information"},{"line_number":63,"context_line":"        gathered via curl. The placeload output is the current maximum"},{"line_number":64,"context_line":"        microversion of placement followed by an encoded representation of"},{"line_number":65,"context_line":"        what it has done. Lowercase \u0027r\u0027, \u0027i\u0027, \u0027a\u0027, and \u0027t\u0027 indicate successful"},{"line_number":66,"context_line":"        creation of a resource provider and setting inventory, aggregates, and"},{"line_number":67,"context_line":"        traits on that resource provider."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        If there are upper case versions of any of those letters, a failure"},{"line_number":70,"context_line":"        happened for a single request. The letter will be followed by the"},{"line_number":71,"context_line":"        HTTP status code and the resource provider uuid. These can be used"},{"line_number":72,"context_line":"        to find the relevant entry in logs/screen-placement-api.txt.gz."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        Note that placeload does not exit with an error code when this"},{"line_number":75,"context_line":"        happens. It merely reports and moves on. Under correct circumstances"},{"line_number":76,"context_line":"        the right output is a long string of 4000 characters containing"},{"line_number":77,"context_line":"        \u0027r\u0027, \u0027i\u0027, \u0027a\u0027, \u0027t\u0027 in random order (because async)."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        After that are three aggregate uuids, and then the output"},{"line_number":80,"context_line":"        of two timed curl requests."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        If no timed requests are present it means that the expected number"},{"line_number":83,"context_line":"        of resource providers were not created. At this time, only resource"},{"line_number":84,"context_line":"        providers are counted, not whether they have the correct inventory,"},{"line_number":85,"context_line":"        aggregates, or traits."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        \""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # This aggregate uuid is a static value in placeload."},{"line_number":91,"context_line":"        AGGREGATE\u003d\"14a5c8a3-5a99-4e8f-88be-00d85fcb1c17\""},{"line_number":92,"context_line":"        TRAIT\u003d\"HW_CPU_X86_AVX2\""},{"line_number":93,"context_line":"        PLACEMENT_QUERY\u003d\"resources\u003dVCPU:1,DISK_GB:10,MEMORY_MB:256\u0026member_of\u003d${AGGREGATE}\u0026required\u003d${TRAIT}\""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        BASE\u003d${BASE:-/opt/stack}"},{"line_number":96,"context_line":"        source ${BASE}/new/devstack/functions"},{"line_number":97,"context_line":"        source ${BASE}/new/devstack/lib/placement"},{"line_number":98,"context_line":"        # Putting the log here ought to mean it is automatically gathered by zuul"},{"line_number":99,"context_line":"        LOG\u003d${BASE}/logs/placement-perf.txt"},{"line_number":100,"context_line":"        COUNT\u003d1000"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        function check_placement {"},{"line_number":103,"context_line":"            local placement_url"},{"line_number":104,"context_line":"            local rp_count"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"            python -m virtualenv -p python3 .placeload"},{"line_number":107,"context_line":"            . .placeload/bin/activate"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            # install placeload"},{"line_number":110,"context_line":"            pip install \u0027placeload\u003d\u003d0.3.0\u0027"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"            # Turn off keystone auth"},{"line_number":113,"context_line":"            iniset -sudo $PLACEMENT_CONF DEFAULT auth_strategy noauth2"},{"line_number":114,"context_line":"            restart_service devstack@placement-api"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            # get placement endpoint"},{"line_number":117,"context_line":"            placement_url\u003d$(get_endpoint_url placement public)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"            # load with placeload"},{"line_number":120,"context_line":"            ("},{"line_number":121,"context_line":"                echo \"$EXPLANATION\""},{"line_number":122,"context_line":"                placeload $placement_url $COUNT"},{"line_number":123,"context_line":"            ) | tee -a $LOG"},{"line_number":124,"context_line":"            rp_count\u003d$(curl -H \u0027x-auth-token: admin\u0027 $placement_url/resource_providers |json_pp|grep -c \u0027\"name\"\u0027)"},{"line_number":125,"context_line":"            # Skip curl and note if we failed to create the required number of rps"},{"line_number":126,"context_line":"            if [[ $rp_count -ge $COUNT ]]; then"},{"line_number":127,"context_line":"                ("},{"line_number":128,"context_line":"                    echo \u0027##### TIMING GET /allocation_candidates\u0027"},{"line_number":129,"context_line":"                    time curl -s -H \u0027x-auth-token: admin\u0027 -H \u0027openstack-api-version: placement 1.21\u0027 \"$placement_url/allocation_candidates?${PLACEMENT_QUERY}\" \u003e /dev/null"},{"line_number":130,"context_line":"                    time curl -s -H \u0027x-auth-token: admin\u0027 -H \u0027openstack-api-version: placement 1.21\u0027 \"$placement_url/allocation_candidates?${PLACEMENT_QUERY}\" \u003e /dev/null"},{"line_number":131,"context_line":"                ) 2\u003e\u00261 | tee -a $LOG"},{"line_number":132,"context_line":"            else"},{"line_number":133,"context_line":"                ("},{"line_number":134,"context_line":"                    echo \"Unable to create expected number of resource providers. Expected: ${COUNT}, Got: $rp_count\""},{"line_number":135,"context_line":"                    echo \"See job-output.txt.gz and logs/screen-placement-api.txt.gz for additional detail.\""},{"line_number":136,"context_line":"                ) | tee -a $LOG"},{"line_number":137,"context_line":"            fi"},{"line_number":138,"context_line":"            deactivate"},{"line_number":139,"context_line":"        }"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Be admin"},{"line_number":142,"context_line":"        set +x"},{"line_number":143,"context_line":"        source $BASE/new/devstack/openrc admin"},{"line_number":144,"context_line":"        set -x"},{"line_number":145,"context_line":"        check_placement"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3f79a3b5_1613d166","line":145,"range":{"start_line":25,"start_character":2,"end_line":145,"end_character":0},"updated":"2018-09-19 18:12:41.000000000","message":"extra keys not allowed @ data[\u0027tasks\u0027]","commit_id":"cbb97ebff4fcfff335db3d95dc25fc3e7f0666ca"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"change_message_id":"6bb894ae63af1d447ef258860120fae8043e2dda","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Initial set of jobs that will be extended over time as"},{"line_number":2,"context_line":"# we get things working."},{"line_number":3,"context_line":"- project:"},{"line_number":4,"context_line":"    templates:"},{"line_number":5,"context_line":"      - publish-openstack-docs-pti"},{"line_number":6,"context_line":"      - openstack-cover-jobs"},{"line_number":7,"context_line":"      - openstack-lower-constraints-jobs"},{"line_number":8,"context_line":"      - openstack-python-jobs"},{"line_number":9,"context_line":"      - openstack-python35-jobs"},{"line_number":10,"context_line":"      - openstack-python36-jobs"},{"line_number":11,"context_line":"    check:"},{"line_number":12,"context_line":"      jobs:"},{"line_number":13,"context_line":"        - openstack-tox-functional"},{"line_number":14,"context_line":"        - openstack-tox-functional-py35"},{"line_number":15,"context_line":"        - openstack-tox-functional-py36"},{"line_number":16,"context_line":"        - placement-gabbi-tempest"},{"line_number":17,"context_line":"        - placement-perfload"},{"line_number":18,"context_line":"    gate:"},{"line_number":19,"context_line":"      jobs:"},{"line_number":20,"context_line":"        - openstack-tox-functional"},{"line_number":21,"context_line":"        - openstack-tox-functional-py35"},{"line_number":22,"context_line":"        - openstack-tox-functional-py36"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"- job:"},{"line_number":25,"context_line":"    name: placement-gabbi-tempest"},{"line_number":26,"context_line":"    parent: gabbi-tempest"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"3f79a3b5_e7bcac6c","line":23,"range":{"start_line":3,"start_character":2,"end_line":23,"end_character":0},"updated":"2018-11-21 11:01:52.000000000","message":"Job placement-perfload not defined","commit_id":"d46e62a433caff7c1b163284cc1b149699349364"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"change_message_id":"6bb894ae63af1d447ef258860120fae8043e2dda","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        c-vol: false"},{"line_number":42,"context_line":"        cinder: false"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"- job:"},{"line_number":45,"context_line":"    name: placement-perfload"},{"line_number":46,"context_line":"    parent: devstack-minimal"},{"line_number":47,"context_line":"    description: |"},{"line_number":48,"context_line":"        Run a tiny devstack with just placement and keystone and log placement"},{"line_number":49,"context_line":"        performance."},{"line_number":50,"context_line":"    required_projects:"},{"line_number":51,"context_line":"        - git.openstack.org/openstack/keystone"},{"line_number":52,"context_line":"        - git.openstack.org/openstack/placement"},{"line_number":53,"context_line":"    run: playbooks/perfload.yaml"},{"line_number":54,"context_line":"    vars:"},{"line_number":55,"context_line":"      devstack_services:"},{"line_number":56,"context_line":"        mysql: true"},{"line_number":57,"context_line":"        placement-api: true"},{"line_number":58,"context_line":"        key: true"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"3f79a3b5_c7b73088","line":58,"range":{"start_line":44,"start_character":2,"end_line":58,"end_character":0},"updated":"2018-11-21 11:01:52.000000000","message":"extra keys not allowed @ data[\u0027required_projects\u0027]","commit_id":"d46e62a433caff7c1b163284cc1b149699349364"}],"gate/post_test_perf_check.sh":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9551247a2de738392e7a4aa3a3d3a9955a3f7494","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pip install \u0027placeload\u003d\u003d0.3.0\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # Turn off keystone auth"},{"line_number":56,"context_line":"    iniset -sudo $PLACEMENT_CONF DEFAULT auth_strategy noauth2"},{"line_number":57,"context_line":"    restart_service devstack@placement-api"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # get placement endpoint"}],"source_content_type":"text/x-sh","patch_set":1,"id":"3f79a3b5_a0dadae5","line":56,"updated":"2018-09-19 14:37:01.000000000","message":"t\u0027would be interesting to see the impact of adding keystone integration into the mix and seeing how much performance drops as a result. (just pontificating here, nothing more)","commit_id":"3c3ea303b4754be6bb3b2128508e7d90d9c0df7f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0c6a5ef415536085b594339308e40adfeaaa4bcb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pip install \u0027placeload\u003d\u003d0.3.0\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # Turn off keystone auth"},{"line_number":56,"context_line":"    iniset -sudo $PLACEMENT_CONF DEFAULT auth_strategy noauth2"},{"line_number":57,"context_line":"    restart_service devstack@placement-api"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # get placement endpoint"}],"source_content_type":"text/x-sh","patch_set":1,"id":"3f79a3b5_76e00598","line":56,"in_reply_to":"3f79a3b5_26a102aa","updated":"2018-09-19 18:04:53.000000000","message":"I\u0027ve remembered the other reason: placeload is currently dumb with regard to auth. It could easily be updated to look for $TOKEN or similar.","commit_id":"3c3ea303b4754be6bb3b2128508e7d90d9c0df7f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"82889be17bc5e6ed53cda38e49e5d054256cf310","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pip install \u0027placeload\u003d\u003d0.3.0\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # Turn off keystone auth"},{"line_number":56,"context_line":"    iniset -sudo $PLACEMENT_CONF DEFAULT auth_strategy noauth2"},{"line_number":57,"context_line":"    restart_service devstack@placement-api"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # get placement endpoint"}],"source_content_type":"text/x-sh","patch_set":1,"id":"3f79a3b5_db57c759","line":56,"in_reply_to":"3f79a3b5_a0dadae5","updated":"2018-09-19 15:12:38.000000000","message":"We could do both, perhaps? The initial reason for doing it noauth was to remove any question of keystone\u0027s impact. But yeah, both would be nice and is easy to do.","commit_id":"3c3ea303b4754be6bb3b2128508e7d90d9c0df7f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6dcccc43ac56041cb096f783033a390ab7ef3c98","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    pip install \u0027placeload\u003d\u003d0.3.0\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    # Turn off keystone auth"},{"line_number":56,"context_line":"    iniset -sudo $PLACEMENT_CONF DEFAULT auth_strategy noauth2"},{"line_number":57,"context_line":"    restart_service devstack@placement-api"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # get placement endpoint"}],"source_content_type":"text/x-sh","patch_set":1,"id":"3f79a3b5_26a102aa","line":56,"in_reply_to":"3f79a3b5_db57c759","updated":"2018-09-19 15:39:41.000000000","message":"Oh, totally. I wasn\u0027t suggesting you needed to make any changes to the way this currently works, just that I\u0027d be curious to see the impact to performance :)","commit_id":"3c3ea303b4754be6bb3b2128508e7d90d9c0df7f"}],"playbooks/perfload.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da9553c329e4eae5cf2e1221f49646e2b8d49318","unresolved":false,"context_lines":[{"line_number":16,"context_line":"    - name: placement performance"},{"line_number":17,"context_line":"      shell:"},{"line_number":18,"context_line":"        executable: /bin/bash"},{"line_number":19,"context_line":"        # TODO(cdent): Change this task to a role?"},{"line_number":20,"context_line":"        cmd: |"},{"line_number":21,"context_line":"          set -x"},{"line_number":22,"context_line":"          # Do some performance related information gathering for placement."}],"source_content_type":"text/x-yaml","patch_set":32,"id":"3f79a3b5_1a011904","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":50},"updated":"2018-12-04 14:48:38.000000000","message":"Would that let it be in a script file of its own rather than inlined in YAML? Because (and I\u0027m sure I\u0027ve said this before) that\u0027s ew.","commit_id":"e6545dc2b28774e6c8f8ac4f7c53c2a73349d774"}],"playbooks/tempest-gabbi-link.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f7607143957d12011052243406cd3683deb6d84","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    - name: placement performance"},{"line_number":36,"context_line":"      shell:"},{"line_number":37,"context_line":"        executable: /bin/bash"},{"line_number":38,"context_line":"        # TODO(cdent): Change this task to a role?"},{"line_number":39,"context_line":"        cmd: |"},{"line_number":40,"context_line":"          set -x"},{"line_number":41,"context_line":"          # Do some performance related information gathering for placement."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3f79a3b5_090c1691","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":50},"updated":"2018-10-02 17:01:06.000000000","message":"Would that allow us to put the script into a file again, instead of embedding shell code within yaml, which is yuck?","commit_id":"6646fa5e7b5cef96a21b6f2599bbf9405997f573"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3efd5ed08eeaf13b176fccb566cb12ef4a3eb2dd","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    - name: placement performance"},{"line_number":36,"context_line":"      shell:"},{"line_number":37,"context_line":"        executable: /bin/bash"},{"line_number":38,"context_line":"        # TODO(cdent): Change this task to a role?"},{"line_number":39,"context_line":"        cmd: |"},{"line_number":40,"context_line":"          set -x"},{"line_number":41,"context_line":"          # Do some performance related information gathering for placement."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3f79a3b5_ac20904a","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":50},"in_reply_to":"3f79a3b5_090c1691","updated":"2018-10-02 17:07:47.000000000","message":"Not specifically, no. It would merely put it in its own yaml file. tasks are sort of second class citizens in ansible, by convention.\n\nThe benefit of having the shell in the yaml that I can think of are:\n\n* it makes the commands visible in ARA reports, which isn\u0027t necessarily a huge deal but can be nice\n* it makes it so we don\u0027t have to know where the script is when calling it from different ansible tasks or roles. That is: the script becomes a member of the ansible/zuul universe. I\u0027m not certain if that is a win or not.\n\nFor the most part I\u0027m just trying to get it to work, somehow. The number of iterations to get it to this point was too many.","commit_id":"6646fa5e7b5cef96a21b6f2599bbf9405997f573"}]}
