)]}'
{"playbooks/library/copy_updates":[{"author":{"_account_id":12892,"name":"Nolan Brubaker","email":"nolan.brubaker@rackspace.com","username":"nrb"},"change_message_id":"286bfcf4e86f65c0f2310fa9b41b84c587056377","unresolved":false,"context_lines":[{"line_number":25,"context_line":"module: copy_updates"},{"line_number":26,"context_line":"short_description: Copies source file with updates to remote location."},{"line_number":27,"context_line":"description:"},{"line_number":28,"context_line":"     - The M(copy_updates) module copies a json file on the local box, applies somes updates to the json and copies it to  remote location."},{"line_number":29,"context_line":"options:"},{"line_number":30,"context_line":"  src:"},{"line_number":31,"context_line":"    description:"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"fa963961_f0b442d2","line":28,"updated":"2015-03-26 19:01:35.000000000","message":"typo: 2 spaces","commit_id":"42f4c7f36b4c47de3712f6871dab6c3f5764ae52"},{"author":{"_account_id":12892,"name":"Nolan Brubaker","email":"nolan.brubaker@rackspace.com","username":"nrb"},"change_message_id":"286bfcf4e86f65c0f2310fa9b41b84c587056377","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        # Check if the src and different and replace the dest."},{"line_number":118,"context_line":"        check_file(dest)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        dest_json \u003d get_json_from_file(dest) "},{"line_number":121,"context_line":"        if src_json !\u003d dest_json:"},{"line_number":122,"context_line":"            print \"Source and dest json not equal\""},{"line_number":123,"context_line":"            if backup:"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"fa963961_709cb269","line":120,"updated":"2015-03-26 19:01:35.000000000","message":"typo: space at the end of the line","commit_id":"42f4c7f36b4c47de3712f6871dab6c3f5764ae52"},{"author":{"_account_id":12892,"name":"Nolan Brubaker","email":"nolan.brubaker@rackspace.com","username":"nrb"},"change_message_id":"286bfcf4e86f65c0f2310fa9b41b84c587056377","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        else:"},{"line_number":130,"context_line":"            changed \u003d False"},{"line_number":131,"context_line":"    else:"},{"line_number":132,"context_line":"        # create the dest if it doens\u0027t exist already"},{"line_number":133,"context_line":"        dest_file \u003d os.path.split(dest)[-1]"},{"line_number":134,"context_line":"        dest_file_loc \u003d os.path.split(dest)[0]"},{"line_number":135,"context_line":"        if not os.path.exists(dest_file_loc):"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"fa963961_d095be40","line":132,"updated":"2015-03-26 19:01:35.000000000","message":"typo: doesn\u0027t","commit_id":"42f4c7f36b4c47de3712f6871dab6c3f5764ae52"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"da9b358b_d5f25c06","updated":"2015-03-28 02:15:45.000000000","message":"While most of the modules within ansible do not follow PEP/FLAKE8 I would like to see this module refactored to pass a FLAKE8 test.","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"aa2bb1438adfb2a6ba6b28fbacc75e7b7d82cb48","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"da9b358b_6ad6d4c6","in_reply_to":"da9b358b_d5f25c06","updated":"2015-03-30 20:48:05.000000000","message":"If we\u0027d like to enforce PEP8 we should probably set-up a gate job for that. The question is do we want to follow generic flake8 or do we want to use OpenStack\u0027s hacking package (which builds atop flake8)?\n\nWe could maybe also roll this into our existing check-lint job.","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import collections"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"DOCUMENTATION \u003d \u0027\u0027\u0027"},{"line_number":23,"context_line":"---"},{"line_number":24,"context_line":"module: copy_updates"},{"line_number":25,"context_line":"short_description: Copies source file (json only) with updates to dest location."}],"source_content_type":"application/octet-stream","patch_set":5,"id":"da9b358b_35bbc810","line":22,"updated":"2015-03-28 02:15:45.000000000","message":"Total nit: The document strings should be triple double quotes which match that of openstack python style guidelines.","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"EXAMPLES \u003d \u0027\u0027\u0027"},{"line_number":51,"context_line":"# Get the src, apply the updates and copy to dest if it differs from copied version"},{"line_number":52,"context_line":"- copy: src\u003d/src/config.json updates\u003d{\"key1\": \"val1\"} dest\u003d/dest/config.json owner\u003dfoo group\u003dfoo mode\u003d0644"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"# Back up the original dest and copy the updated src  to dest if it differs from copied version"},{"line_number":55,"context_line":"- copy: src\u003d/mine/ntp.conf dest\u003d/etc/ntp.conf owner\u003droot group\u003droot mode\u003d644 backup\u003dyes"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"da9b358b_b5ceb8b2","line":52,"updated":"2015-03-28 02:15:45.000000000","message":"NIT: In the examples it would be nice to have them formatted to match that to our style guidelines. IE:\n\n- copy_update:\n    src: \"/src/config.json\"\n    updates: \"{\u0027key1\u0027: \u0027val1\u0027}\"\n    dest: \"/dest/config.json\"\n    owner: \"foo\"\n    group: \"foo\"\n    mode: \"0644\"","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"}],"playbooks/plugins/action_plugins/copy_updates.py":[{"author":{"_account_id":12892,"name":"Nolan Brubaker","email":"nolan.brubaker@rackspace.com","username":"nrb"},"change_message_id":"1cd1e8e12008c46a060b793d2a79c0209bc3ded5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"import tempfile"},{"line_number":28,"context_line":"import pipes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"## fixes https://github.com/ansible/ansible/issues/3518"},{"line_number":31,"context_line":"# http://mypy.pythonblogs.com/12_mypy/archive/1253_workaround_for_python_bug_ascii_codec_cant_encode_character_uxa0_in_position_111_ordinal_not_in_range128.html"},{"line_number":32,"context_line":"import sys"},{"line_number":33,"context_line":"reload(sys)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa963961_19a59103","line":30,"updated":"2015-03-26 20:05:07.000000000","message":"So this appears to be patched in upstream ansible, based on the issue - why is it included here? Was there extension?\n\nAlso, if we copied any of it, it should be GPL, since Ansible is GPL.","commit_id":"d5980ab1012456de6a1b1c8d8683d3c933661a14"},{"author":{"_account_id":1613,"name":"Sudarshan Acharya","email":"sudarshan.acharya@gmail.com","username":"sudarshan.acharya"},"change_message_id":"26f96684a273ecdfba6a1b7dd529312c4d3c30b7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"import tempfile"},{"line_number":28,"context_line":"import pipes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"## fixes https://github.com/ansible/ansible/issues/3518"},{"line_number":31,"context_line":"# http://mypy.pythonblogs.com/12_mypy/archive/1253_workaround_for_python_bug_ascii_codec_cant_encode_character_uxa0_in_position_111_ordinal_not_in_range128.html"},{"line_number":32,"context_line":"import sys"},{"line_number":33,"context_line":"reload(sys)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa963961_84f25499","line":30,"in_reply_to":"fa963961_19a59103","updated":"2015-03-26 20:48:44.000000000","message":"Will clean this up and more. But I did base it on some of the ansible modules.  So yeah, probably a better idea to use the Ansible License.","commit_id":"d5980ab1012456de6a1b1c8d8683d3c933661a14"}],"playbooks/roles/os_keystone/defaults/main.yml":[{"author":{"_account_id":12892,"name":"Nolan Brubaker","email":"nolan.brubaker@rackspace.com","username":"nrb"},"change_message_id":"286bfcf4e86f65c0f2310fa9b41b84c587056377","unresolved":false,"context_lines":[{"line_number":112,"context_line":"## Policy vars"},{"line_number":113,"context_line":"policy_data:"},{"line_number":114,"context_line":"  identity:create_region: \"rule:admin_required\""},{"line_number":115,"context_line":"  identity:update_region: \"rule:admin_required\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"# Common apt packages"},{"line_number":118,"context_line":"keystone_apt_packages:"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"fa963961_90dbb61b","line":115,"updated":"2015-03-26 19:01:35.000000000","message":"What effect do these policy settings have on the JSON data copy?\n\nMy understanding is that the JSON data copying happens outside of Keystone, thus the policies wouldn\u0027t affect this.","commit_id":"42f4c7f36b4c47de3712f6871dab6c3f5764ae52"},{"author":{"_account_id":12892,"name":"Nolan Brubaker","email":"nolan.brubaker@rackspace.com","username":"nrb"},"change_message_id":"f2b6e276434794896533503079a3aaf9932e4f97","unresolved":false,"context_lines":[{"line_number":113,"context_line":"#policy_data:"},{"line_number":114,"context_line":"#  identity:create_region: \"rule:admin_required\""},{"line_number":115,"context_line":"#  identity:update_region: \"rule:admin_required\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"# Common apt packages"},{"line_number":118,"context_line":"keystone_apt_packages:"},{"line_number":119,"context_line":"  - apache2"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"fa963961_727db61b","line":116,"updated":"2015-03-27 15:49:32.000000000","message":"Are these example values? If they are, a comment noting that would be very helpful.","commit_id":"21abdc5526daaf8e358574c6a9a58b6a4b3adb1e"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":110,"context_line":"#     ..."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"## Policy vars"},{"line_number":113,"context_line":"# Provide a list of access controls to update the default policy.json with. These changes will be merged "},{"line_number":114,"context_line":"# with the access controls in the default policy.json. E.g."},{"line_number":115,"context_line":"#policy_data:"},{"line_number":116,"context_line":"#  identity:create_region: \"rule:admin_required\""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"da9b358b_1537a4b1","line":113,"updated":"2015-03-28 02:15:45.000000000","message":"nit: white space","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"}],"playbooks/roles/os_keystone/tasks/keystone_post_install.yml":[{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"da9b358b_d5aa5c85","side":"PARENT","updated":"2015-03-28 02:15:45.000000000","message":"Can the entire temp file drop be removed and done inside the module using something like ``io.BytesIO`` which would provide you a file like object instead of having to drop and removing temporary files?","commit_id":"866409fa1e4699db8376f82717ea600df9ed18c8"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    group: \"{{ keystone_system_group_name }}\""},{"line_number":35,"context_line":"    mode: \"{{ item.mode|default(\u00270644\u0027) }}\""},{"line_number":36,"context_line":"  with_items:"},{"line_number":37,"context_line":"    - { src: \"policy.json\", dest: \"~/.ansible/tmp/keystone_policy.json\" }"},{"line_number":38,"context_line":"    - { src: \"keystone-paste.ini\", dest: \"/etc/keystone/keystone-paste.ini\" }"},{"line_number":39,"context_line":"    - { src: \"keystone-wsgi.py\", dest: \"/var/www/cgi-bin/keystone/admin\", mode: \"0755\" }"},{"line_number":40,"context_line":"    - { src: \"keystone-wsgi.py\", dest: \"/var/www/cgi-bin/keystone/main\", mode: \"0755\" }"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"da9b358b_f5d7a021","line":37,"updated":"2015-03-28 02:15:45.000000000","message":"does this need to go to the \"~/.ansible/tmp/keystone_policy.json\" destination?","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  tags:"},{"line_number":44,"context_line":"    - keystone-config"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"- name: Apply updates to Policy file"},{"line_number":47,"context_line":"  action: copy_updates"},{"line_number":48,"context_line":"    src\u003d\"{{ item.src }}\""},{"line_number":49,"context_line":"    updates\u003d\"{{ policy_data|default(\u0027{}\u0027) }}\""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"da9b358b_b5459818","line":46,"updated":"2015-03-28 02:15:45.000000000","message":"This task should be formatted using dictionary formatting instead of string formatting.","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    - keystone-config"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"- name: Apply updates to Policy file"},{"line_number":47,"context_line":"  action: copy_updates"},{"line_number":48,"context_line":"    src\u003d\"{{ item.src }}\""},{"line_number":49,"context_line":"    updates\u003d\"{{ policy_data|default(\u0027{}\u0027) }}\""},{"line_number":50,"context_line":"    dest\u003d\"{{ item.dest }}\""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"da9b358b_d557fcc8","line":47,"updated":"2015-03-28 02:15:45.000000000","message":"Action is not a requirement, you can call the module specifically. IE \n\n- name: \n    copy_update: \n    src: \"{{ item.src }}\"\n    ....","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"},{"author":{"_account_id":7353,"name":"Kevin Carter","email":"kevin@cloudnull.com","username":"cloudnull"},"change_message_id":"7d70a844850f95f195689f5f4cfdfab478c39d04","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    group\u003d\"{{ keystone_system_group_name }}\""},{"line_number":53,"context_line":"    mode\u003d\"{{ item.mode|default(\u00270644\u0027) }}\""},{"line_number":54,"context_line":"  with_items:"},{"line_number":55,"context_line":"    - { src: \"~/.ansible/tmp/keystone_policy.json\", dest: \"/etc/keystone/policy.json\" }"},{"line_number":56,"context_line":"  notify:"},{"line_number":57,"context_line":"    - Restart Apache"},{"line_number":58,"context_line":"  tags:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"da9b358b_152c4449","line":55,"updated":"2015-03-28 02:15:45.000000000","message":"The update argument should be in the iterable items. which will make it so that other updates on policy additional policy files can be namespace appropriately. This would translate to another field in the list of dictionaries. but follow the same variable pattern. I\u0027d suspect that the module would look something like this:\n\n- name: some awesome name\n    copy_update: \n    src: \"{{ item.src }}\"\n    updates: \"{{ iteam.policy_data|default(\u0027{}\u0027) }}\"\n    dest: \"{{ item.dest }}\"\n    owner: \"{{ keystone_system_user_name }}\"\n    group: \"{{ keystone_system_group_name }}\"\n    mode: \"{{ item.mode|default(\u00270644\u0027) }}\"\n  with_items:\n    - { src: \"~/.ansible/tmp/keystone_policy.json\", dest: \"/etc/keystone/policy.json\", policy_data: \"{{ keystone_policy_overrides|default({}) }}\" }","commit_id":"59255ceeca9b7df1a6fdfa1c8a1b93039352ddfc"}]}
