)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"560cca10b33ca69148ded227d3696fa4f2ac9c7b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add support for testing custom RBAC requirements"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Will update/add unit tests. Just want feedback on this change."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I8ba89ab5e134b15e97ac20a7aacbfd70896e192f"},{"line_number":12,"context_line":"Implements: blueprint support-custom-yaml"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5f201791_ce5ad0f1","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":62},"updated":"2017-06-23 20:24:52.000000000","message":"Also, add this as a comment, don\u0027t need to add here. This\u0027ll also need a reno.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add support for testing custom RBAC requirements"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Will update/add unit tests. Just want feedback on this change."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I8ba89ab5e134b15e97ac20a7aacbfd70896e192f"},{"line_number":12,"context_line":"Implements: blueprint support-custom-yaml"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5f201791_0d0a8a1e","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":62},"in_reply_to":"5f201791_ce5ad0f1","updated":"2017-06-29 22:05:26.000000000","message":"Thanks, I will add the reno as well.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Change-Id: I8ba89ab5e134b15e97ac20a7aacbfd70896e192f"},{"line_number":18,"context_line":"Implements: blueprint support-custom-yaml"},{"line_number":19,"context_line":"Co-Authored-By: Sangeet Gupta \u003csg774j@att.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: David Purcell \u003cd.purcell222@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f1d235d_5ec92976","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":54},"updated":"2017-06-30 00:03:20.000000000","message":"Is this true?","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Change-Id: I8ba89ab5e134b15e97ac20a7aacbfd70896e192f"},{"line_number":18,"context_line":"Implements: blueprint support-custom-yaml"},{"line_number":19,"context_line":"Co-Authored-By: Sangeet Gupta \u003csg774j@att.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: David Purcell \u003cd.purcell222@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f1d235d_f1181182","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":54},"in_reply_to":"3f1d235d_5ec92976","updated":"2017-06-30 20:33:27.000000000","message":"He wrote the unit tests internally","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"}],"patrole_tempest_plugin/config.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                help\u003d\"If true, throws RbacParsingException for\""},{"line_number":32,"context_line":"                     \" policies which don\u0027t exist. If false, \""},{"line_number":33,"context_line":"                     \"throws skipException.\"),"},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027cinder_policy_file\u0027,"},{"line_number":35,"context_line":"               default\u003d\u0027/etc/cinder/policy.json\u0027,"},{"line_number":36,"context_line":"               help\u003d\"Location of the neutron policy file.\"),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027glance_policy_file\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_1b648c21","line":34,"updated":"2017-06-23 20:22:22.000000000","message":"Want to make a note of this here:\n\nNeed to add TODO explaining that we need to support reading these JSON files from other hosts, possibly using v3 identity policy API.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                help\u003d\"If true, throws RbacParsingException for\""},{"line_number":32,"context_line":"                     \" policies which don\u0027t exist. If false, \""},{"line_number":33,"context_line":"                     \"throws skipException.\"),"},{"line_number":34,"context_line":"    cfg.StrOpt(\u0027cinder_policy_file\u0027,"},{"line_number":35,"context_line":"               default\u003d\u0027/etc/cinder/policy.json\u0027,"},{"line_number":36,"context_line":"               help\u003d\"Location of the neutron policy file.\"),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027glance_policy_file\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_cd0ff22b","line":34,"in_reply_to":"5f201791_1b648c21","updated":"2017-06-29 22:05:26.000000000","message":"done in next PS","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    cfg.StrOpt(\u0027nova_policy_file\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027/etc/nova/policy.json\u0027,"},{"line_number":48,"context_line":"               help\u003d\"Location of the nova policy file.\"),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027test_custom_requirements\u0027,"},{"line_number":50,"context_line":"               default\u003dFalse,"},{"line_number":51,"context_line":"               help\u003d\"Run Patrole against your requirements yaml\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027custom_requirements_file\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_3b7ce8b3","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":14},"updated":"2017-06-23 20:22:22.000000000","message":"Make this a BoolOpt.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    cfg.StrOpt(\u0027nova_policy_file\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027/etc/nova/policy.json\u0027,"},{"line_number":48,"context_line":"               help\u003d\"Location of the nova policy file.\"),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027test_custom_requirements\u0027,"},{"line_number":50,"context_line":"               default\u003dFalse,"},{"line_number":51,"context_line":"               help\u003d\"Run Patrole against your requirements yaml\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027custom_requirements_file\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_b74d29c5","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":14},"in_reply_to":"5f201791_3b7ce8b3","updated":"2017-06-29 22:05:26.000000000","message":"done in next PS","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               help\u003d\"Location of the nova policy file.\"),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027test_custom_requirements\u0027,"},{"line_number":50,"context_line":"               default\u003dFalse,"},{"line_number":51,"context_line":"               help\u003d\"Run Patrole against your requirements yaml\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027custom_requirements_file\u0027,"},{"line_number":53,"context_line":"               help\u003d\"Location of the yaml file that defines your RBAC \""},{"line_number":54,"context_line":"                    \"requirements\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_fbc1d0e5","line":51,"range":{"start_line":51,"start_character":20,"end_line":51,"end_character":64},"updated":"2017-06-23 20:22:22.000000000","message":"May we provide further inline documentation for what this means? For example of what I mean, see how Nova provides a lot of inline documentation for some of its config options:\n\nhttps://github.com/openstack/nova/blob/master/nova/conf/availability_zone.py#L47\n\nThe same triple-quote pattern can be adopted here.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               help\u003d\"Location of the nova policy file.\"),"},{"line_number":49,"context_line":"    cfg.StrOpt(\u0027test_custom_requirements\u0027,"},{"line_number":50,"context_line":"               default\u003dFalse,"},{"line_number":51,"context_line":"               help\u003d\"Run Patrole against your requirements yaml\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027custom_requirements_file\u0027,"},{"line_number":53,"context_line":"               help\u003d\"Location of the yaml file that defines your RBAC \""},{"line_number":54,"context_line":"                    \"requirements\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_57cc9533","line":51,"range":{"start_line":51,"start_character":20,"end_line":51,"end_character":64},"in_reply_to":"5f201791_fbc1d0e5","updated":"2017-06-29 22:05:26.000000000","message":"done in next PS","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               default\u003dFalse,"},{"line_number":51,"context_line":"               help\u003d\"Run Patrole against your requirements yaml\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027custom_requirements_file\u0027,"},{"line_number":53,"context_line":"               help\u003d\"Location of the yaml file that defines your RBAC \""},{"line_number":54,"context_line":"                    \"requirements\")"},{"line_number":55,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_7badc02f","line":54,"range":{"start_line":53,"start_character":21,"end_line":54,"end_character":32},"updated":"2017-06-23 20:22:22.000000000","message":"See above. I think it should be noted that the requirements file must be located on the same host as where Patrole is running.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":50,"context_line":"               default\u003dFalse,"},{"line_number":51,"context_line":"               help\u003d\"Run Patrole against your requirements yaml\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\u0027custom_requirements_file\u0027,"},{"line_number":53,"context_line":"               help\u003d\"Location of the yaml file that defines your RBAC \""},{"line_number":54,"context_line":"                    \"requirements\")"},{"line_number":55,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_f7dcc1e4","line":54,"range":{"start_line":53,"start_character":21,"end_line":54,"end_character":32},"in_reply_to":"5f201791_7badc02f","updated":"2017-06-29 22:05:26.000000000","message":"done in next PS","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    cfg.StrOpt(\u0027nova_policy_file\u0027,"},{"line_number":49,"context_line":"               default\u003d\u0027/etc/nova/policy.json\u0027,"},{"line_number":50,"context_line":"               help\u003d\"Location of the nova policy file.\"),"},{"line_number":51,"context_line":"    cfg.BoolOpt(\u0027test_custom_requirements\u0027,"},{"line_number":52,"context_line":"                default\u003dFalse,"},{"line_number":53,"context_line":"                help\u003d\"\"\""},{"line_number":54,"context_line":"This option determines whether Patrole should run against a"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_beba7ddb","line":51,"updated":"2017-06-30 00:03:20.000000000","message":"This is really helpful and thorough now :)","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\u0027custom_requirements_file\u0027 which defines RBAC requirements. The"},{"line_number":56,"context_line":"purpose of setting this flag to True is to verify that RBAC policy"},{"line_number":57,"context_line":"is in accordance to requirements. The idea is that the"},{"line_number":58,"context_line":"\u0027custom_requirements_file\u0027 pefectly defines what the RBAC requirements are."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Here are the possible outcomes when running the Patrole tests against"},{"line_number":61,"context_line":"a \u0027custom_requirements_file\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_3eed4def","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":26},"updated":"2017-06-30 00:03:20.000000000","message":"nit, with ticks: `custom_requirements_file`","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\u0027custom_requirements_file\u0027 which defines RBAC requirements. The"},{"line_number":56,"context_line":"purpose of setting this flag to True is to verify that RBAC policy"},{"line_number":57,"context_line":"is in accordance to requirements. The idea is that the"},{"line_number":58,"context_line":"\u0027custom_requirements_file\u0027 pefectly defines what the RBAC requirements are."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Here are the possible outcomes when running the Patrole tests against"},{"line_number":61,"context_line":"a \u0027custom_requirements_file\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_74474f4d","line":58,"range":{"start_line":58,"start_character":0,"end_line":58,"end_character":26},"in_reply_to":"3f1d235d_3eed4def","updated":"2017-06-30 20:33:27.000000000","message":"fixed","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    - \u003callowed_role\u003e"},{"line_number":93,"context_line":"```"},{"line_number":94,"context_line":"Where:"},{"line_number":95,"context_line":"service \u003d the service that is being tested(cinder, nova, etc)"},{"line_number":96,"context_line":"api_action \u003d the policy action that is being tested. Examples:"},{"line_number":97,"context_line":"             - volume:create"},{"line_number":98,"context_line":"             - os_compute_api:servers:start"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_1ebcd1da","line":95,"range":{"start_line":95,"start_character":42,"end_line":95,"end_character":43},"updated":"2017-06-30 00:03:20.000000000","message":"nit: include space","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    - \u003callowed_role\u003e"},{"line_number":93,"context_line":"```"},{"line_number":94,"context_line":"Where:"},{"line_number":95,"context_line":"service \u003d the service that is being tested(cinder, nova, etc)"},{"line_number":96,"context_line":"api_action \u003d the policy action that is being tested. Examples:"},{"line_number":97,"context_line":"             - volume:create"},{"line_number":98,"context_line":"             - os_compute_api:servers:start"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_f4a91fdf","line":95,"range":{"start_line":95,"start_character":42,"end_line":95,"end_character":43},"in_reply_to":"3f1d235d_1ebcd1da","updated":"2017-06-30 20:33:27.000000000","message":"fixed","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":55,"context_line":"`custom_requirements_file` which defines RBAC requirements. The"},{"line_number":56,"context_line":"purpose of setting this flag to True is to verify that RBAC policy"},{"line_number":57,"context_line":"is in accordance to requirements. The idea is that the"},{"line_number":58,"context_line":"`custom_requirements_file` pefectly defines what the RBAC requirements are."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Here are the possible outcomes when running the Patrole tests against"},{"line_number":61,"context_line":"a `custom_requirements_file`:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_080cb740","line":58,"range":{"start_line":58,"start_character":27,"end_line":58,"end_character":35},"updated":"2017-07-07 14:38:04.000000000","message":"perfectly","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":55,"context_line":"`custom_requirements_file` which defines RBAC requirements. The"},{"line_number":56,"context_line":"purpose of setting this flag to True is to verify that RBAC policy"},{"line_number":57,"context_line":"is in accordance to requirements. The idea is that the"},{"line_number":58,"context_line":"`custom_requirements_file` pefectly defines what the RBAC requirements are."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Here are the possible outcomes when running the Patrole tests against"},{"line_number":61,"context_line":"a `custom_requirements_file`:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_ae45cb45","line":58,"range":{"start_line":58,"start_character":27,"end_line":58,"end_character":35},"in_reply_to":"3f1d235d_080cb740","updated":"2017-07-07 15:15:56.000000000","message":"thanks for catching this","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"}],"patrole_tempest_plugin/rbac_rule_validation.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def action(service, rule\u003d\u0027\u0027, admin_only\u003dFalse, expected_error_code\u003d403,"},{"line_number":35,"context_line":"           extra_target_data\u003dNone):"},{"line_number":36,"context_line":"    \"\"\"A decorator which does a policy check and matches it against test run."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    A decorator which allows for positive and negative RBAC testing. Given"},{"line_number":39,"context_line":"    an OpenStack service and a policy action enforced by that service, an"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_aecf94ae","line":36,"updated":"2017-06-23 20:22:22.000000000","message":"This docstring will have to be updated to mention the requirements yaml because currently it assumes usage of oslo.policy parsing logic only.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def action(service, rule\u003d\u0027\u0027, admin_only\u003dFalse, expected_error_code\u003d403,"},{"line_number":35,"context_line":"           extra_target_data\u003dNone):"},{"line_number":36,"context_line":"    \"\"\"A decorator which does a policy check and matches it against test run."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    A decorator which allows for positive and negative RBAC testing. Given"},{"line_number":39,"context_line":"    an OpenStack service and a policy action enforced by that service, an"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_8d5c5a19","line":36,"in_reply_to":"5f201791_aecf94ae","updated":"2017-06-29 22:05:26.000000000","message":"done in next PS","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                    \u0027`rbac_rule_validation` decorator can only be applied to \u0027"},{"line_number":79,"context_line":"                    \u0027an instance of `tempest.test.BaseTestCase`.\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            # Test RBAC against custom requirements"},{"line_number":82,"context_line":"            if CONF.rbac.test_custom_requirements is \"True\":"},{"line_number":83,"context_line":"                authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":84,"context_line":"                    CONF.rbac.custom_requirements_file, service)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_aef674f8","line":81,"range":{"start_line":81,"start_character":11,"end_line":81,"end_character":51},"updated":"2017-06-23 20:22:22.000000000","message":"# Test RBAC against custom requirements file. Otherwise\n# use oslo.policy.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                    \u0027`rbac_rule_validation` decorator can only be applied to \u0027"},{"line_number":79,"context_line":"                    \u0027an instance of `tempest.test.BaseTestCase`.\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            # Test RBAC against custom requirements"},{"line_number":82,"context_line":"            if CONF.rbac.test_custom_requirements is \"True\":"},{"line_number":83,"context_line":"                authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":84,"context_line":"                    CONF.rbac.custom_requirements_file, service)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_2da30602","line":81,"range":{"start_line":81,"start_character":11,"end_line":81,"end_character":51},"in_reply_to":"5f201791_aef674f8","updated":"2017-06-29 22:05:26.000000000","message":"done","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                    \u0027an instance of `tempest.test.BaseTestCase`.\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            # Test RBAC against custom requirements"},{"line_number":82,"context_line":"            if CONF.rbac.test_custom_requirements is \"True\":"},{"line_number":83,"context_line":"                authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":84,"context_line":"                    CONF.rbac.custom_requirements_file, service)"},{"line_number":85,"context_line":"                allowed \u003d authority.get_permission(rule, CONF.rbac.rbac_test_role)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_9b609c03","line":82,"range":{"start_line":82,"start_character":15,"end_line":82,"end_character":59},"updated":"2017-06-23 20:22:22.000000000","message":"If this is a BoolOpt we can just do:\n\nif CONF.rbac.test_custom_requirements:\n    ...","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                    \u0027an instance of `tempest.test.BaseTestCase`.\u0027)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            # Test RBAC against custom requirements"},{"line_number":82,"context_line":"            if CONF.rbac.test_custom_requirements is \"True\":"},{"line_number":83,"context_line":"                authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":84,"context_line":"                    CONF.rbac.custom_requirements_file, service)"},{"line_number":85,"context_line":"                allowed \u003d authority.get_permission(rule, CONF.rbac.rbac_test_role)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_edb06e45","line":82,"range":{"start_line":82,"start_character":15,"end_line":82,"end_character":59},"in_reply_to":"5f201791_9b609c03","updated":"2017-06-29 22:05:26.000000000","message":"done","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":84,"context_line":"                    CONF.rbac.custom_requirements_file, service)"},{"line_number":85,"context_line":"                allowed \u003d authority.get_permission(rule, CONF.rbac.rbac_test_role)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            else:"},{"line_number":88,"context_line":"                if admin_only:"},{"line_number":89,"context_line":"                    LOG.info(\"As admin_only is True, only admin role should be \""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_2eb4a434","line":86,"updated":"2017-06-23 20:22:22.000000000","message":"nit: extra newline","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":84,"context_line":"                    CONF.rbac.custom_requirements_file, service)"},{"line_number":85,"context_line":"                allowed \u003d authority.get_permission(rule, CONF.rbac.rbac_test_role)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            else:"},{"line_number":88,"context_line":"                if admin_only:"},{"line_number":89,"context_line":"                    LOG.info(\"As admin_only is True, only admin role should be \""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_cdab72d3","line":86,"in_reply_to":"5f201791_2eb4a434","updated":"2017-06-29 22:05:26.000000000","message":"done","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    an OpenStack service and a policy action enforced by that service, an"},{"line_number":42,"context_line":"    oslo.policy lookup is performed by calling `authority.get_permission`."},{"line_number":43,"context_line":"    Alternatively, the RBAC tests can run against a YAML file that defines"},{"line_number":44,"context_line":"    policy requirements. The benefit of doing so is that it becomes possible"},{"line_number":45,"context_line":"    to confirm whether the written policy is in accordance with the"},{"line_number":46,"context_line":"    requirements."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    The following cases are possible:"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_5e6da996","line":46,"range":{"start_line":44,"start_character":24,"end_line":46,"end_character":17},"updated":"2017-06-30 00:03:20.000000000","message":"We don\u0027t need this here, can explain benefits in follow-up documentation.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    an OpenStack service and a policy action enforced by that service, an"},{"line_number":42,"context_line":"    oslo.policy lookup is performed by calling `authority.get_permission`."},{"line_number":43,"context_line":"    Alternatively, the RBAC tests can run against a YAML file that defines"},{"line_number":44,"context_line":"    policy requirements. The benefit of doing so is that it becomes possible"},{"line_number":45,"context_line":"    to confirm whether the written policy is in accordance with the"},{"line_number":46,"context_line":"    requirements."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    The following cases are possible:"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_b4d96784","line":46,"range":{"start_line":44,"start_character":24,"end_line":46,"end_character":17},"in_reply_to":"3f1d235d_5e6da996","updated":"2017-06-30 20:33:27.000000000","message":"Ok I will take it out from here. So will the follow-up documentation go here or elsewhere?","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"881b18239c6fac12a0087c594b7d1b167903fc26","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    try:"},{"line_number":149,"context_line":"        role \u003d CONF.rbac.rbac_test_role"},{"line_number":150,"context_line":"        formatted_target_data \u003d _format_extra_target_data("},{"line_number":151,"context_line":"            test_obj, extra_target_data)"},{"line_number":152,"context_line":"        policy_parser \u003d rbac_policy_parser.RbacPolicyParser("},{"line_number":153,"context_line":"            project_id, user_id, service,"},{"line_number":154,"context_line":"            extra_target_data\u003dformatted_target_data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_be9ddd5a","line":151,"range":{"start_line":150,"start_character":8,"end_line":151,"end_character":40},"updated":"2017-06-30 00:07:59.000000000","message":"See comment below. This should only run in the \"else\" block.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    try:"},{"line_number":149,"context_line":"        role \u003d CONF.rbac.rbac_test_role"},{"line_number":150,"context_line":"        formatted_target_data \u003d _format_extra_target_data("},{"line_number":151,"context_line":"            test_obj, extra_target_data)"},{"line_number":152,"context_line":"        policy_parser \u003d rbac_policy_parser.RbacPolicyParser("},{"line_number":153,"context_line":"            project_id, user_id, service,"},{"line_number":154,"context_line":"            extra_target_data\u003dformatted_target_data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_74ff4faa","line":151,"range":{"start_line":150,"start_character":8,"end_line":151,"end_character":40},"in_reply_to":"3f1d235d_be9ddd5a","updated":"2017-06-30 20:33:27.000000000","message":"fixed","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        role \u003d CONF.rbac.rbac_test_role"},{"line_number":150,"context_line":"        formatted_target_data \u003d _format_extra_target_data("},{"line_number":151,"context_line":"            test_obj, extra_target_data)"},{"line_number":152,"context_line":"        policy_parser \u003d rbac_policy_parser.RbacPolicyParser("},{"line_number":153,"context_line":"            project_id, user_id, service,"},{"line_number":154,"context_line":"            extra_target_data\u003dformatted_target_data)"},{"line_number":155,"context_line":"        # Test RBAC against custom requirements. Otherwise use oslo.policy"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_fed7d522","line":152,"updated":"2017-06-30 00:03:20.000000000","message":"This entire group of code can be simplified to:\n\nif CONF.rbac.test_custom_requirements:\n    authority \u003d rbac_yaml_parser.RbacAuthority(\n                CONF.rbac.custom_requirements_file, service)\nelse:\n    authority \u003d rbac_policy_parser.RbacPolicyParser(\n            project_id, user_id, service,\n            extra_target_data\u003dformatted_target_data)\nis_allowed \u003d authority.allowed(rule_name, role)","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        role \u003d CONF.rbac.rbac_test_role"},{"line_number":150,"context_line":"        formatted_target_data \u003d _format_extra_target_data("},{"line_number":151,"context_line":"            test_obj, extra_target_data)"},{"line_number":152,"context_line":"        policy_parser \u003d rbac_policy_parser.RbacPolicyParser("},{"line_number":153,"context_line":"            project_id, user_id, service,"},{"line_number":154,"context_line":"            extra_target_data\u003dformatted_target_data)"},{"line_number":155,"context_line":"        # Test RBAC against custom requirements. Otherwise use oslo.policy"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_340af7d1","line":152,"in_reply_to":"3f1d235d_fed7d522","updated":"2017-06-30 20:33:27.000000000","message":"fixed","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            project_id, user_id, service,"},{"line_number":154,"context_line":"            extra_target_data\u003dformatted_target_data)"},{"line_number":155,"context_line":"        # Test RBAC against custom requirements. Otherwise use oslo.policy"},{"line_number":156,"context_line":"        if CONF.rbac.test_custom_requirements is True:"},{"line_number":157,"context_line":"            authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":158,"context_line":"                CONF.rbac.custom_requirements_file, service)"},{"line_number":159,"context_line":"            is_allowed \u003d authority.allowed(rule_name, CONF.rbac.rbac_test_role)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_9ef8e1c4","line":156,"range":{"start_line":156,"start_character":21,"end_line":156,"end_character":45},"updated":"2017-06-30 00:03:20.000000000","message":"Since this is a BoolOpt I *think* this can only ever be True or False so we could simply to:\n\nif CONF.rbac.test_custom_requirements:\n    ...","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            project_id, user_id, service,"},{"line_number":154,"context_line":"            extra_target_data\u003dformatted_target_data)"},{"line_number":155,"context_line":"        # Test RBAC against custom requirements. Otherwise use oslo.policy"},{"line_number":156,"context_line":"        if CONF.rbac.test_custom_requirements is True:"},{"line_number":157,"context_line":"            authority \u003d rbac_yaml_parser.RbacAuthority("},{"line_number":158,"context_line":"                CONF.rbac.custom_requirements_file, service)"},{"line_number":159,"context_line":"            is_allowed \u003d authority.allowed(rule_name, CONF.rbac.rbac_test_role)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_343317ae","line":156,"range":{"start_line":156,"start_character":21,"end_line":156,"end_character":45},"in_reply_to":"3f1d235d_9ef8e1c4","updated":"2017-06-30 20:33:27.000000000","message":"fixed","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"}],"patrole_tempest_plugin/rbac_utils.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":178,"context_line":"class RbacPermissions(object):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @abc.abstractmethod"},{"line_number":181,"context_line":"    def allowed(self, rule_name, role):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_1ed2915d","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":21},"updated":"2017-06-30 00:03:20.000000000","message":"I think RbacAuthority is a better name for this.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":178,"context_line":"class RbacPermissions(object):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @abc.abstractmethod"},{"line_number":181,"context_line":"    def allowed(self, rule_name, role):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_9459cb5b","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":21},"in_reply_to":"3f1d235d_1ed2915d","updated":"2017-06-30 20:33:27.000000000","message":"done","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":178,"context_line":"class RbacPermissions(object):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @abc.abstractmethod"},{"line_number":181,"context_line":"    def allowed(self, rule_name, role):"},{"line_number":182,"context_line":"        \"\"\"Determine whether the role should be able to perform the API\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_bed03d52","line":179,"updated":"2017-06-30 00:03:20.000000000","message":"We should add documentation here in a follow-up patch explaining what this class is for. This patch is big enough and the next one can be focused on documentation.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":178,"context_line":"class RbacPermissions(object):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @abc.abstractmethod"},{"line_number":181,"context_line":"    def allowed(self, rule_name, role):"},{"line_number":182,"context_line":"        \"\"\"Determine whether the role should be able to perform the API\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_5431f30a","line":179,"in_reply_to":"3f1d235d_bed03d52","updated":"2017-06-30 20:33:27.000000000","message":"will add a TODO","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"}],"patrole_tempest_plugin/rbac_yaml_parser.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        def __init__(self, filepath):"},{"line_number":31,"context_line":"            with open(filepath) as f:"},{"line_number":32,"context_line":"                RoleParser.Inner._rbac_map \u003d list(yaml.safe_load_all(f))"},{"line_number":33,"context_line":"                f.close()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, filepath):"},{"line_number":36,"context_line":"        if RoleParser._inner is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_ae7314b1","line":33,"range":{"start_line":33,"start_character":16,"end_line":33,"end_character":25},"updated":"2017-06-23 20:22:22.000000000","message":"This is done in __exit__ by the open contextmanager, so can be removed.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        def __init__(self, filepath):"},{"line_number":31,"context_line":"            with open(filepath) as f:"},{"line_number":32,"context_line":"                RoleParser.Inner._rbac_map \u003d list(yaml.safe_load_all(f))"},{"line_number":33,"context_line":"                f.close()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, filepath):"},{"line_number":36,"context_line":"        if RoleParser._inner is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_465cc94a","line":33,"range":{"start_line":33,"start_character":16,"end_line":33,"end_character":25},"in_reply_to":"5f201791_ae7314b1","updated":"2017-06-29 22:05:26.000000000","message":"done","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class RbacAuthority(object):"},{"line_number":52,"context_line":"    def __init__(self, filepath\u003dNone, component\u003dNone):"},{"line_number":53,"context_line":"        if filepath is not None and component is not None:"},{"line_number":54,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def createMap(self, dictionary):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_1b1b6c81","line":53,"updated":"2017-06-23 20:22:22.000000000","message":"Need to initialize self.roles_dict to None or else L60 will throw AttributeError.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class RbacAuthority(object):"},{"line_number":52,"context_line":"    def __init__(self, filepath\u003dNone, component\u003dNone):"},{"line_number":53,"context_line":"        if filepath is not None and component is not None:"},{"line_number":54,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def createMap(self, dictionary):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_062b7194","line":53,"in_reply_to":"5f201791_1b1b6c81","updated":"2017-06-29 22:05:26.000000000","message":"done","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if filepath is not None and component is not None:"},{"line_number":54,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def createMap(self, dictionary):"},{"line_number":57,"context_line":"        self.roles_dict \u003d dictionary"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def get_permission(self, api, role):"},{"line_number":60,"context_line":"        if self.roles_dict is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_ce577002","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":36},"updated":"2017-06-23 20:22:22.000000000","message":"Is this used anywhere? It should also be create_map to be Pythonic.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if filepath is not None and component is not None:"},{"line_number":54,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def createMap(self, dictionary):"},{"line_number":57,"context_line":"        self.roles_dict \u003d dictionary"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def get_permission(self, api, role):"},{"line_number":60,"context_line":"        if self.roles_dict is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_e1fe1f04","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":36},"in_reply_to":"5f201791_ce577002","updated":"2017-06-29 22:05:26.000000000","message":"removed","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a48de6ce321d30ec3f45a00cae586b852e246d59","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def createMap(self, dictionary):"},{"line_number":57,"context_line":"        self.roles_dict \u003d dictionary"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def get_permission(self, api, role):"},{"line_number":60,"context_line":"        if self.roles_dict is None:"},{"line_number":61,"context_line":"            raise exceptions.InvalidConfiguration(\"Roles dictionary is empty!\")"},{"line_number":62,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_62798d2d","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":22},"updated":"2017-06-24 02:34:38.000000000","message":"Also, see the function _is_allowed in rbac_rule_validation. Some of this logic is already there.\n\nI think it\u0027d be useful to create an abstract base class that RbacAuthority and RbacPolicyParser inherit from with the requirement of an \"allowed\" function to be implemented.\n\nThen this function can be renamed to \"allowed\" which should return True or False.\n\nAfter that, the logic in _is_allowed in rbac_rule_validation can reference the correct class depending on the CONF value you introduced which calls allowed. Then it\u0027ll print out the LOG.debug() stuff that\u0027s redundantly included below.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def createMap(self, dictionary):"},{"line_number":57,"context_line":"        self.roles_dict \u003d dictionary"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def get_permission(self, api, role):"},{"line_number":60,"context_line":"        if self.roles_dict is None:"},{"line_number":61,"context_line":"            raise exceptions.InvalidConfiguration(\"Roles dictionary is empty!\")"},{"line_number":62,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_2692edf7","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":22},"in_reply_to":"5f201791_62798d2d","updated":"2017-06-29 22:05:26.000000000","message":"Fixed in next PS. Not sure where this abstract class should go, for now I just put it in rbac_utils.py","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def get_permission(self, api, role):"},{"line_number":60,"context_line":"        if self.roles_dict is None:"},{"line_number":61,"context_line":"            raise exceptions.InvalidConfiguration(\"Roles dictionary is empty!\")"},{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            _api \u003d self.roles_dict[api]"},{"line_number":64,"context_line":"            if role in _api:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_4eb9202c","line":61,"range":{"start_line":61,"start_character":51,"end_line":61,"end_character":77},"updated":"2017-06-23 20:22:22.000000000","message":"Something like:\n\nRoles dictionary parsed from requirements file is empty. Ensure the requirements file is correctly formatted.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def get_permission(self, api, role):"},{"line_number":60,"context_line":"        if self.roles_dict is None:"},{"line_number":61,"context_line":"            raise exceptions.InvalidConfiguration(\"Roles dictionary is empty!\")"},{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            _api \u003d self.roles_dict[api]"},{"line_number":64,"context_line":"            if role in _api:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_6140cf36","line":61,"range":{"start_line":61,"start_character":51,"end_line":61,"end_character":77},"in_reply_to":"5f201791_4eb9202c","updated":"2017-06-29 22:05:26.000000000","message":"fixed","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                LOG.debug(\"[API]: %s, [Role]: %s is allowed!\", api, role)"},{"line_number":66,"context_line":"                return True"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                LOG.debug(\"[API]: %s, [Role]: %s  is NOT allowed!\", api, role)"},{"line_number":69,"context_line":"                return False"},{"line_number":70,"context_line":"        except KeyError:"},{"line_number":71,"context_line":"            raise KeyError(\"\u0027%s\u0027 API is not defined in the master data file\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_2e46e450","line":68,"range":{"start_line":68,"start_character":49,"end_line":68,"end_character":50},"updated":"2017-06-23 20:22:22.000000000","message":"nit: extra space","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                LOG.debug(\"[API]: %s, [Role]: %s is allowed!\", api, role)"},{"line_number":66,"context_line":"                return True"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                LOG.debug(\"[API]: %s, [Role]: %s  is NOT allowed!\", api, role)"},{"line_number":69,"context_line":"                return False"},{"line_number":70,"context_line":"        except KeyError:"},{"line_number":71,"context_line":"            raise KeyError(\"\u0027%s\u0027 API is not defined in the master data file\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_81740b9b","line":68,"range":{"start_line":68,"start_character":49,"end_line":68,"end_character":50},"in_reply_to":"5f201791_2e46e450","updated":"2017-06-29 22:05:26.000000000","message":"log lines removed as they are now redundant.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"85721ddfd4ad5f6de3c4d947c29e3e6533ca6ca3","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                LOG.debug(\"[API]: %s, [Role]: %s  is NOT allowed!\", api, role)"},{"line_number":69,"context_line":"                return False"},{"line_number":70,"context_line":"        except KeyError:"},{"line_number":71,"context_line":"            raise KeyError(\"\u0027%s\u0027 API is not defined in the master data file\""},{"line_number":72,"context_line":"                           % api)"},{"line_number":73,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f201791_ae0c343b","line":71,"range":{"start_line":71,"start_character":59,"end_line":71,"end_character":70},"updated":"2017-06-23 20:22:22.000000000","message":"\"roles yaml file\" to be consistent with L46. I think we should be calling this \"roles yaml file\" or \"requirements yaml file\" (whichever) consistently everywhere.","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"2adf27154e749e9131865b7b0fce4a85621e8c59","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                LOG.debug(\"[API]: %s, [Role]: %s  is NOT allowed!\", api, role)"},{"line_number":69,"context_line":"                return False"},{"line_number":70,"context_line":"        except KeyError:"},{"line_number":71,"context_line":"            raise KeyError(\"\u0027%s\u0027 API is not defined in the master data file\""},{"line_number":72,"context_line":"                           % api)"},{"line_number":73,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_2102d7b5","line":71,"range":{"start_line":71,"start_character":59,"end_line":71,"end_character":70},"in_reply_to":"5f201791_ae0c343b","updated":"2017-06-29 22:05:26.000000000","message":"updated to make it consistent","commit_id":"ed11fbd7d25d734c25eae5f3e6f1e85120030a1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class RbacAuthority(RbacPermissions):"},{"line_number":53,"context_line":"    def __init__(self, filepath\u003dNone, component\u003dNone):"},{"line_number":54,"context_line":"        if filepath is not None and component is not None:"},{"line_number":55,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_5e35a9d9","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":19},"updated":"2017-06-30 00:03:20.000000000","message":"I think this is meant to be called RBACYamlParser","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class RbacAuthority(RbacPermissions):"},{"line_number":53,"context_line":"    def __init__(self, filepath\u003dNone, component\u003dNone):"},{"line_number":54,"context_line":"        if filepath is not None and component is not None:"},{"line_number":55,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_e782934f","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":19},"in_reply_to":"3f1d235d_5e35a9d9","updated":"2017-06-30 20:33:27.000000000","message":"updated the name, but named to RbacYamlParser to get the name consistent with other classes","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"51e5e4037c8119618c89fc402cb915a969c75ad6","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RoleParser(object):"},{"line_number":27,"context_line":"    _inner \u003d None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    class Inner(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_70e477e0","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":16},"updated":"2017-07-05 22:58:48.000000000","message":"RequirementsParser is a better name for this.","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"22e8d76204c8f6b0a33f8580408da8f4df1bf1ea","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class RoleParser(object):"},{"line_number":27,"context_line":"    _inner \u003d None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    class Inner(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_9fdb7b4d","line":26,"range":{"start_line":26,"start_character":6,"end_line":26,"end_character":16},"in_reply_to":"3f1d235d_70e477e0","updated":"2017-07-06 22:31:14.000000000","message":"I agree","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"51e5e4037c8119618c89fc402cb915a969c75ad6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class RbacYamlParser(RbacAuthority):"},{"line_number":53,"context_line":"    def __init__(self, filepath\u003dNone, component\u003dNone):"},{"line_number":54,"context_line":"        if filepath is not None and component is not None:"},{"line_number":55,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_50373b4e","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":20},"updated":"2017-07-05 22:58:48.000000000","message":"I think calling this just RequirementsAuthority is a better name even if it breaks with convention. And the filename could be changed to requirements_authority. We could internally change RbacPolicyParser to PolicyAuthority in a separate commit along with the file names since Patrole isn\u0027t imported anywhere. That way, the names are clearer -- and that way we can stop putting \"Rbac\" into everything.","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"22e8d76204c8f6b0a33f8580408da8f4df1bf1ea","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class RbacYamlParser(RbacAuthority):"},{"line_number":53,"context_line":"    def __init__(self, filepath\u003dNone, component\u003dNone):"},{"line_number":54,"context_line":"        if filepath is not None and component is not None:"},{"line_number":55,"context_line":"            self.roles_dict \u003d RoleParser(filepath).parse(component)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_df64534c","line":52,"range":{"start_line":52,"start_character":6,"end_line":52,"end_character":20},"in_reply_to":"3f1d235d_50373b4e","updated":"2017-07-06 22:31:14.000000000","message":"ok updated","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"}],"patrole_tempest_plugin/requirements_authority.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c2b08ef23dfc987ce45352558669e630c3daa461","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                \"formatted.\")"},{"line_number":66,"context_line":"        try:"},{"line_number":67,"context_line":"            _api \u003d self.roles_dict[rule_name]"},{"line_number":68,"context_line":"            if role in _api:"},{"line_number":69,"context_line":"                return True"},{"line_number":70,"context_line":"            else:"},{"line_number":71,"context_line":"                return False"},{"line_number":72,"context_line":"        except KeyError:"},{"line_number":73,"context_line":"            raise KeyError(\"\u0027%s\u0027 API is not defined in the requirements YAML \""},{"line_number":74,"context_line":"                           \"file\" % rule_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_30d25129","line":71,"range":{"start_line":68,"start_character":12,"end_line":71,"end_character":28},"updated":"2017-07-06 23:09:40.000000000","message":"return role in _api","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"1d74a613c3335d5035f8648915dcdf605a749a8c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                \"formatted.\")"},{"line_number":66,"context_line":"        try:"},{"line_number":67,"context_line":"            _api \u003d self.roles_dict[rule_name]"},{"line_number":68,"context_line":"            if role in _api:"},{"line_number":69,"context_line":"                return True"},{"line_number":70,"context_line":"            else:"},{"line_number":71,"context_line":"                return False"},{"line_number":72,"context_line":"        except KeyError:"},{"line_number":73,"context_line":"            raise KeyError(\"\u0027%s\u0027 API is not defined in the requirements YAML \""},{"line_number":74,"context_line":"                           \"file\" % rule_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_5d1dcf71","line":71,"range":{"start_line":68,"start_character":12,"end_line":71,"end_character":28},"in_reply_to":"3f1d235d_30d25129","updated":"2017-07-07 14:13:22.000000000","message":"fixed in next PS","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"}],"patrole_tempest_plugin/tests/unit/test_rbac_yaml_parser.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"temp_roles_yaml \u003d \"Test:\\n\"\\"},{"line_number":23,"context_line":"    \"  test:create:\\n\"\\"},{"line_number":24,"context_line":"    \"    - role:test_member\\n\"\\"},{"line_number":25,"context_line":"    \"    - role:_member_\\n\"\\"},{"line_number":26,"context_line":"    \"  test:create2:\\n\"\\"},{"line_number":27,"context_line":"    \"    - role:test_member\\n\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_7e0f452e","line":24,"range":{"start_line":24,"start_character":11,"end_line":24,"end_character":27},"updated":"2017-06-30 00:03:20.000000000","message":"I don\u0027t believe we prefix roles internally with \"role:\".","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"temp_roles_yaml \u003d \"Test:\\n\"\\"},{"line_number":23,"context_line":"    \"  test:create:\\n\"\\"},{"line_number":24,"context_line":"    \"    - role:test_member\\n\"\\"},{"line_number":25,"context_line":"    \"    - role:_member_\\n\"\\"},{"line_number":26,"context_line":"    \"  test:create2:\\n\"\\"},{"line_number":27,"context_line":"    \"    - role:test_member\\n\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_8563d7dc","line":24,"range":{"start_line":24,"start_character":11,"end_line":24,"end_character":27},"in_reply_to":"3f1d235d_7e0f452e","updated":"2017-06-30 20:33:27.000000000","message":"updated","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        super(RBACYamlParserTest, self).setUp()"},{"line_number":33,"context_line":"        self.rbac_auth \u003d yaml_parser.RbacAuthority()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_RBAC_yaml_parser_init(self):"},{"line_number":36,"context_line":"        FILENAME \u003d os.path.join(os.path.dirname(__file__),"},{"line_number":37,"context_line":"                                \u0027rbac_roles.yaml\u0027)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_1b31830c","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":22},"updated":"2017-06-30 00:03:20.000000000","message":"nit: This is more of an aesthetic thing, but I don\u0027t think it\u0027s necessary to add \"RBAC_yaml\" to every test function. I know that test_rbac_utils does that, but it\u0027s silly how we include the word \"rbac\" in everything.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        super(RBACYamlParserTest, self).setUp()"},{"line_number":33,"context_line":"        self.rbac_auth \u003d yaml_parser.RbacAuthority()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_RBAC_yaml_parser_init(self):"},{"line_number":36,"context_line":"        FILENAME \u003d os.path.join(os.path.dirname(__file__),"},{"line_number":37,"context_line":"                                \u0027rbac_roles.yaml\u0027)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_a547f31d","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":22},"in_reply_to":"3f1d235d_1b31830c","updated":"2017-06-30 20:33:27.000000000","message":"Agreed, updated in next PS","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.rbac_auth \u003d yaml_parser.RbacAuthority()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_RBAC_yaml_parser_init(self):"},{"line_number":36,"context_line":"        FILENAME \u003d os.path.join(os.path.dirname(__file__),"},{"line_number":37,"context_line":"                                \u0027rbac_roles.yaml\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        temp_roles_file \u003d open(FILENAME, \u0027w\u0027)"},{"line_number":40,"context_line":"        temp_roles_file.write(temp_roles_yaml)"},{"line_number":41,"context_line":"        temp_roles_file.close()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        rbac_auth \u003d yaml_parser.RbacAuthority(FILENAME, \u0027Test\u0027)"},{"line_number":44,"context_line":"        self.assertEqual({\u0027test:create\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_9e97c191","line":41,"range":{"start_line":36,"start_character":8,"end_line":41,"end_character":31},"updated":"2017-06-30 00:03:20.000000000","message":"Replace the highlighted lines with:\n\nmock_yaml \u003d mock.patch.object(\u0027patrole_tempest_plugin.rbac_yaml_parser.RoleParser\u0027, \u0027yaml\u0027).start()\nmock_yaml.safe_load_all.return_value \u003d \u003cdictionary representation of temp_roles_yaml\u003e\n\nThat way you don\u0027t have to create a temp file (which you forgot to clean up in tearDown).","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.rbac_auth \u003d yaml_parser.RbacAuthority()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_RBAC_yaml_parser_init(self):"},{"line_number":36,"context_line":"        FILENAME \u003d os.path.join(os.path.dirname(__file__),"},{"line_number":37,"context_line":"                                \u0027rbac_roles.yaml\u0027)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        temp_roles_file \u003d open(FILENAME, \u0027w\u0027)"},{"line_number":40,"context_line":"        temp_roles_file.write(temp_roles_yaml)"},{"line_number":41,"context_line":"        temp_roles_file.close()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        rbac_auth \u003d yaml_parser.RbacAuthority(FILENAME, \u0027Test\u0027)"},{"line_number":44,"context_line":"        self.assertEqual({\u0027test:create\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_854f57bc","line":41,"range":{"start_line":36,"start_character":8,"end_line":41,"end_character":31},"in_reply_to":"3f1d235d_9e97c191","updated":"2017-06-30 20:33:27.000000000","message":"added the yaml to the existing resources folder instead. if not acceptable, then i can change that.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        temp_roles_file.write(temp_roles_yaml)"},{"line_number":41,"context_line":"        temp_roles_file.close()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        rbac_auth \u003d yaml_parser.RbacAuthority(FILENAME, \u0027Test\u0027)"},{"line_number":44,"context_line":"        self.assertEqual({\u0027test:create\u0027:"},{"line_number":45,"context_line":"                          [\u0027role:test_member\u0027, \u0027role:_member_\u0027],"},{"line_number":46,"context_line":"                          \u0027test:create2\u0027: [\u0027role:test_member\u0027]},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_3e8e6d78","line":43,"range":{"start_line":43,"start_character":46,"end_line":43,"end_character":54},"updated":"2017-06-30 00:03:20.000000000","message":"mock.sentinel.filename","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        temp_roles_file.write(temp_roles_yaml)"},{"line_number":41,"context_line":"        temp_roles_file.close()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        rbac_auth \u003d yaml_parser.RbacAuthority(FILENAME, \u0027Test\u0027)"},{"line_number":44,"context_line":"        self.assertEqual({\u0027test:create\u0027:"},{"line_number":45,"context_line":"                          [\u0027role:test_member\u0027, \u0027role:_member_\u0027],"},{"line_number":46,"context_line":"                          \u0027test:create2\u0027: [\u0027role:test_member\u0027]},"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_25d88351","line":43,"range":{"start_line":43,"start_character":46,"end_line":43,"end_character":54},"in_reply_to":"3f1d235d_3e8e6d78","updated":"2017-06-30 20:33:27.000000000","message":"using yaml file from resources folder","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        temp_roles_file.close()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        rbac_auth \u003d yaml_parser.RbacAuthority(FILENAME, \u0027Test\u0027)"},{"line_number":44,"context_line":"        self.assertEqual({\u0027test:create\u0027:"},{"line_number":45,"context_line":"                          [\u0027role:test_member\u0027, \u0027role:_member_\u0027],"},{"line_number":46,"context_line":"                          \u0027test:create2\u0027: [\u0027role:test_member\u0027]},"},{"line_number":47,"context_line":"                         rbac_auth.roles_dict)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def test_RBAC_yaml_parser_allowed_empty_roles(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_5e912999","line":46,"range":{"start_line":44,"start_character":25,"end_line":46,"end_character":63},"updated":"2017-06-30 00:03:20.000000000","message":"This dictionary can be stored in a local var and used as \u003cdictionary representation of temp_roles_yaml\u003e above.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        temp_roles_file.close()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        rbac_auth \u003d yaml_parser.RbacAuthority(FILENAME, \u0027Test\u0027)"},{"line_number":44,"context_line":"        self.assertEqual({\u0027test:create\u0027:"},{"line_number":45,"context_line":"                          [\u0027role:test_member\u0027, \u0027role:_member_\u0027],"},{"line_number":46,"context_line":"                          \u0027test:create2\u0027: [\u0027role:test_member\u0027]},"},{"line_number":47,"context_line":"                         rbac_auth.roles_dict)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def test_RBAC_yaml_parser_allowed_empty_roles(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_654c3bc7","line":46,"range":{"start_line":44,"start_character":25,"end_line":46,"end_character":63},"in_reply_to":"3f1d235d_5e912999","updated":"2017-06-30 20:33:27.000000000","message":"agreed","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                          [\u0027role:test_member\u0027, \u0027role:_member_\u0027],"},{"line_number":46,"context_line":"                          \u0027test:create2\u0027: [\u0027role:test_member\u0027]},"},{"line_number":47,"context_line":"                         rbac_auth.roles_dict)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def test_RBAC_yaml_parser_allowed_empty_roles(self):"},{"line_number":50,"context_line":"        self.rbac_auth.roles_dict \u003d None"},{"line_number":51,"context_line":"        self.assertRaises(exceptions.InvalidConfiguration,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_feed9525","line":48,"updated":"2017-06-30 00:03:20.000000000","message":"Include:\n\nmock_yaml.safe_load_all.assert_called_once_with(mock.sentinel.filename)","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                          [\u0027role:test_member\u0027, \u0027role:_member_\u0027],"},{"line_number":46,"context_line":"                          \u0027test:create2\u0027: [\u0027role:test_member\u0027]},"},{"line_number":47,"context_line":"                         rbac_auth.roles_dict)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def test_RBAC_yaml_parser_allowed_empty_roles(self):"},{"line_number":50,"context_line":"        self.rbac_auth.roles_dict \u003d None"},{"line_number":51,"context_line":"        self.assertRaises(exceptions.InvalidConfiguration,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_62030a75","line":48,"in_reply_to":"3f1d235d_feed9525","updated":"2017-06-30 20:33:27.000000000","message":"no longer needed as i am reading in the yaml file.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"01f12f93ea363d9fb92fe6f3133602f5a7e3d3e1","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from patrole_tempest_plugin import rbac_yaml_parser as yaml_parser"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"current_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":23,"context_line":"yaml_test_file \u003d os.path.join(current_directory,"},{"line_number":24,"context_line":"                              \u0027resources\u0027,"},{"line_number":25,"context_line":"                              \u0027rbac_roles.yaml\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_d02bc4e8","line":22,"updated":"2017-06-30 21:56:59.000000000","message":"These variables don\u0027t need to be global; we can make them variables in RbacYamlParserTest instead.","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"22e8d76204c8f6b0a33f8580408da8f4df1bf1ea","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from patrole_tempest_plugin import rbac_yaml_parser as yaml_parser"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"current_directory \u003d os.path.dirname(os.path.realpath(__file__))"},{"line_number":23,"context_line":"yaml_test_file \u003d os.path.join(current_directory,"},{"line_number":24,"context_line":"                              \u0027resources\u0027,"},{"line_number":25,"context_line":"                              \u0027rbac_roles.yaml\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_b79c49c0","line":22,"in_reply_to":"3f1d235d_d02bc4e8","updated":"2017-07-06 22:31:14.000000000","message":"fixed in next PS","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"01f12f93ea363d9fb92fe6f3133602f5a7e3d3e1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"yaml_test_file \u003d os.path.join(current_directory,"},{"line_number":24,"context_line":"                              \u0027resources\u0027,"},{"line_number":25,"context_line":"                              \u0027rbac_roles.yaml\u0027)"},{"line_number":26,"context_line":"parsed_result \u003d {\u0027test:create\u0027: [\u0027test_member\u0027, \u0027_member_\u0027],"},{"line_number":27,"context_line":"                 \u0027test:create2\u0027: [\u0027test_member\u0027]}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_30f55884","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":13},"updated":"2017-06-30 21:56:59.000000000","message":"expected_result is a clearer name for this","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"22e8d76204c8f6b0a33f8580408da8f4df1bf1ea","unresolved":false,"context_lines":[{"line_number":23,"context_line":"yaml_test_file \u003d os.path.join(current_directory,"},{"line_number":24,"context_line":"                              \u0027resources\u0027,"},{"line_number":25,"context_line":"                              \u0027rbac_roles.yaml\u0027)"},{"line_number":26,"context_line":"parsed_result \u003d {\u0027test:create\u0027: [\u0027test_member\u0027, \u0027_member_\u0027],"},{"line_number":27,"context_line":"                 \u0027test:create2\u0027: [\u0027test_member\u0027]}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_f78e4177","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":13},"in_reply_to":"3f1d235d_30f55884","updated":"2017-07-06 22:31:14.000000000","message":"I agree","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"01f12f93ea363d9fb92fe6f3133602f5a7e3d3e1","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.assertRaises(KeyError, self.rbac_auth.allowed,"},{"line_number":55,"context_line":"                          \"api\", \"support_member\")"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_parser_role_parser_create(self):"},{"line_number":58,"context_line":"        yaml_parser.RoleParser(yaml_test_file)"},{"line_number":59,"context_line":"        self.assertEqual([{\u0027Test\u0027: parsed_result}],"},{"line_number":60,"context_line":"                         yaml_parser.RoleParser.Inner._rbac_map)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_parser_role_parser_parse(self):"},{"line_number":63,"context_line":"        yaml_parser.RoleParser.Inner._rbac_map \u003d [{\u0027Test\u0027: parsed_result}]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.assertEqual({\u0027test:create2\u0027: [\u0027test_member\u0027],"},{"line_number":66,"context_line":"                          \u0027test:create\u0027: [\u0027test_member\u0027,"},{"line_number":67,"context_line":"                                          \u0027_member_\u0027]},"},{"line_number":68,"context_line":"                         yaml_parser.RoleParser.parse(\"Test\"))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_parser_role_parser_parse_fail(self):"},{"line_number":71,"context_line":"        yaml_parser.RoleParser.Inner._rbac_map \u003d [{\u0027Test\u0027: parsed_result}]"},{"line_number":72,"context_line":"        self.assertIsNone(yaml_parser.RoleParser.parse(\"FAILURE\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_90b8ac76","line":72,"range":{"start_line":57,"start_character":4,"end_line":72,"end_character":66},"updated":"2017-06-30 21:56:59.000000000","message":"These tests would be more robust if they used self.rbac_auth.allowed() instead.\n\nThe reason is L72 in particular. This unit test doesn\u0027t actually test the critical event: That an exception should be thrown by self.rbac_auth.allowed. Returning None is done by RoleParser, but RbacYamlParser should definitely throw the invalid configuration exception at this point.\n\nSo, while I think unit test coverage for RoleParser is good, the testing should be mostly focused on the high-level interface... and then drilling down into the lower-level details with mocking as necessary.","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"22e8d76204c8f6b0a33f8580408da8f4df1bf1ea","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.assertRaises(KeyError, self.rbac_auth.allowed,"},{"line_number":55,"context_line":"                          \"api\", \"support_member\")"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_parser_role_parser_create(self):"},{"line_number":58,"context_line":"        yaml_parser.RoleParser(yaml_test_file)"},{"line_number":59,"context_line":"        self.assertEqual([{\u0027Test\u0027: parsed_result}],"},{"line_number":60,"context_line":"                         yaml_parser.RoleParser.Inner._rbac_map)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_parser_role_parser_parse(self):"},{"line_number":63,"context_line":"        yaml_parser.RoleParser.Inner._rbac_map \u003d [{\u0027Test\u0027: parsed_result}]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.assertEqual({\u0027test:create2\u0027: [\u0027test_member\u0027],"},{"line_number":66,"context_line":"                          \u0027test:create\u0027: [\u0027test_member\u0027,"},{"line_number":67,"context_line":"                                          \u0027_member_\u0027]},"},{"line_number":68,"context_line":"                         yaml_parser.RoleParser.parse(\"Test\"))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_parser_role_parser_parse_fail(self):"},{"line_number":71,"context_line":"        yaml_parser.RoleParser.Inner._rbac_map \u003d [{\u0027Test\u0027: parsed_result}]"},{"line_number":72,"context_line":"        self.assertIsNone(yaml_parser.RoleParser.parse(\"FAILURE\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f1d235d_0d1f4208","line":72,"range":{"start_line":57,"start_character":4,"end_line":72,"end_character":66},"in_reply_to":"3f1d235d_90b8ac76","updated":"2017-07-06 22:31:14.000000000","message":"not sure if I am doing this correctly. Please see next PS that uses the allowed method.","commit_id":"1c84bef0cd7498d7f999b53a464413aa5af061d4"}],"patrole_tempest_plugin/tests/unit/test_requirements_authority.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c2b08ef23dfc987ce45352558669e630c3daa461","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from patrole_tempest_plugin import requirements_authority as req_auth"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class RBACYamlParserTest(base.TestCase):"},{"line_number":24,"context_line":"    def setUp(self):"},{"line_number":25,"context_line":"        super(RBACYamlParserTest, self).setUp()"},{"line_number":26,"context_line":"        self.rbac_auth \u003d req_auth.RequirementsAuthority()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_d0e9dde2","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":24},"updated":"2017-07-06 23:09:40.000000000","message":"RequirementsAuthorityTest","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"1d74a613c3335d5035f8648915dcdf605a749a8c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from patrole_tempest_plugin import requirements_authority as req_auth"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class RBACYamlParserTest(base.TestCase):"},{"line_number":24,"context_line":"    def setUp(self):"},{"line_number":25,"context_line":"        super(RBACYamlParserTest, self).setUp()"},{"line_number":26,"context_line":"        self.rbac_auth \u003d req_auth.RequirementsAuthority()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_48074f1a","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":24},"in_reply_to":"3f1d235d_d0e9dde2","updated":"2017-07-07 14:13:22.000000000","message":"fixed in next PS","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c2b08ef23dfc987ce45352558669e630c3daa461","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":64,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        self.assertEqual({\u0027test:create2\u0027: [\u0027test_member\u0027],"},{"line_number":67,"context_line":"                          \u0027test:create\u0027: [\u0027test_member\u0027,"},{"line_number":68,"context_line":"                                          \u0027_member_\u0027]},"},{"line_number":69,"context_line":"                         self.rbac_auth.roles_dict)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"test:create2\", \"test_member\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_30e931e5","line":68,"range":{"start_line":66,"start_character":25,"end_line":68,"end_character":54},"updated":"2017-07-06 23:09:40.000000000","message":"nit: can use self.expected_result here directly","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"1d74a613c3335d5035f8648915dcdf605a749a8c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":64,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        self.assertEqual({\u0027test:create2\u0027: [\u0027test_member\u0027],"},{"line_number":67,"context_line":"                          \u0027test:create\u0027: [\u0027test_member\u0027,"},{"line_number":68,"context_line":"                                          \u0027_member_\u0027]},"},{"line_number":69,"context_line":"                         self.rbac_auth.roles_dict)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"test:create2\", \"test_member\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_c88fdf73","line":68,"range":{"start_line":66,"start_character":25,"end_line":68,"end_character":54},"in_reply_to":"3f1d235d_30e931e5","updated":"2017-07-07 14:13:22.000000000","message":"fixed in next PS","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c2b08ef23dfc987ce45352558669e630c3daa461","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":76,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self.assertEqual({\u0027test:create2\u0027: [\u0027test_member\u0027],"},{"line_number":79,"context_line":"                          \u0027test:create\u0027: [\u0027test_member\u0027,"},{"line_number":80,"context_line":"                                          \u0027_member_\u0027]},"},{"line_number":81,"context_line":"                         self.rbac_auth.roles_dict)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"test:create2\", \"_member_\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_10e4f50b","line":80,"range":{"start_line":78,"start_character":25,"end_line":80,"end_character":55},"updated":"2017-07-06 23:09:40.000000000","message":"nit: can use self.expected_result here directly","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"1d74a613c3335d5035f8648915dcdf605a749a8c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":76,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        self.assertEqual({\u0027test:create2\u0027: [\u0027test_member\u0027],"},{"line_number":79,"context_line":"                          \u0027test:create\u0027: [\u0027test_member\u0027,"},{"line_number":80,"context_line":"                                          \u0027_member_\u0027]},"},{"line_number":81,"context_line":"                         self.rbac_auth.roles_dict)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"test:create2\", \"_member_\"))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f1d235d_88e7a747","line":80,"range":{"start_line":78,"start_character":25,"end_line":80,"end_character":55},"in_reply_to":"3f1d235d_10e4f50b","updated":"2017-07-07 14:13:22.000000000","message":"fixed in next PS","commit_id":"8e893fd09da3ab6e644e1087e43333d822ad5ffa"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.expected_result \u003d {\u0027test:create\u0027: [\u0027test_member\u0027, \u0027_member_\u0027],"},{"line_number":32,"context_line":"                                \u0027test:create2\u0027: [\u0027test_member\u0027]}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_parser_init(self):"},{"line_number":35,"context_line":"        rbac_auth \u003d req_auth.RequirementsAuthority(self.yaml_test_file, \u0027Test\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(self.expected_result, rbac_auth.roles_dict)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_832c284b","line":34,"range":{"start_line":34,"start_character":13,"end_line":34,"end_character":19},"updated":"2017-07-07 14:38:04.000000000","message":"requirements_auth","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.expected_result \u003d {\u0027test:create\u0027: [\u0027test_member\u0027, \u0027_member_\u0027],"},{"line_number":32,"context_line":"                                \u0027test:create2\u0027: [\u0027test_member\u0027]}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_parser_init(self):"},{"line_number":35,"context_line":"        rbac_auth \u003d req_auth.RequirementsAuthority(self.yaml_test_file, \u0027Test\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(self.expected_result, rbac_auth.roles_dict)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_2e5f7b73","line":34,"range":{"start_line":34,"start_character":13,"end_line":34,"end_character":19},"in_reply_to":"3f1d235d_832c284b","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        rbac_auth \u003d req_auth.RequirementsAuthority(self.yaml_test_file, \u0027Test\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(self.expected_result, rbac_auth.roles_dict)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def test_parser_allowed_empty_roles(self):"},{"line_number":39,"context_line":"        self.rbac_auth.roles_dict \u003d None"},{"line_number":40,"context_line":"        self.assertRaises(exceptions.InvalidConfiguration,"},{"line_number":41,"context_line":"                          self.rbac_auth.allowed, \"\", \"\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_c300e0ae","line":38,"range":{"start_line":38,"start_character":13,"end_line":38,"end_character":18},"updated":"2017-07-07 14:38:04.000000000","message":"auth","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        rbac_auth \u003d req_auth.RequirementsAuthority(self.yaml_test_file, \u0027Test\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(self.expected_result, rbac_auth.roles_dict)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def test_parser_allowed_empty_roles(self):"},{"line_number":39,"context_line":"        self.rbac_auth.roles_dict \u003d None"},{"line_number":40,"context_line":"        self.assertRaises(exceptions.InvalidConfiguration,"},{"line_number":41,"context_line":"                          self.rbac_auth.allowed, \"\", \"\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_8e60cf37","line":38,"range":{"start_line":38,"start_character":13,"end_line":38,"end_character":18},"in_reply_to":"3f1d235d_c300e0ae","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.assertRaises(exceptions.InvalidConfiguration,"},{"line_number":41,"context_line":"                          self.rbac_auth.allowed, \"\", \"\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_parser_allowed_role_in_api(self):"},{"line_number":44,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":45,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"api\", \"_member_\"))"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_830308bf","line":43,"range":{"start_line":43,"start_character":13,"end_line":43,"end_character":19},"updated":"2017-07-07 14:38:04.000000000","message":"auth","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.assertRaises(exceptions.InvalidConfiguration,"},{"line_number":41,"context_line":"                          self.rbac_auth.allowed, \"\", \"\")"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_parser_allowed_role_in_api(self):"},{"line_number":44,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":45,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"api\", \"_member_\"))"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_6e657345","line":43,"range":{"start_line":43,"start_character":13,"end_line":43,"end_character":19},"in_reply_to":"3f1d235d_830308bf","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":45,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"api\", \"_member_\"))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_parser_allowed_role_not_in_api(self):"},{"line_number":48,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":49,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"api\", \"support_member\"))"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_c36b4083","line":47,"range":{"start_line":47,"start_character":13,"end_line":47,"end_character":19},"updated":"2017-07-07 14:38:04.000000000","message":"auth","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":45,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"api\", \"_member_\"))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_parser_allowed_role_not_in_api(self):"},{"line_number":48,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":49,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"api\", \"support_member\"))"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_ee674351","line":47,"range":{"start_line":47,"start_character":13,"end_line":47,"end_character":19},"in_reply_to":"3f1d235d_c36b4083","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":49,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"api\", \"support_member\"))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_parser_get_allowed_no_api(self):"},{"line_number":52,"context_line":"        self.rbac_auth.roles_dict \u003d {}"},{"line_number":53,"context_line":"        self.assertRaises(KeyError, self.rbac_auth.allowed,"},{"line_number":54,"context_line":"                          \"api\", \"support_member\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_03c49891","line":51,"range":{"start_line":51,"start_character":32,"end_line":51,"end_character":38},"updated":"2017-07-07 14:38:04.000000000","message":"except_keyerror","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.rbac_auth.roles_dict \u003d {\u0027api\u0027: [\u0027_member_\u0027]}"},{"line_number":49,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"api\", \"support_member\"))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def test_parser_get_allowed_no_api(self):"},{"line_number":52,"context_line":"        self.rbac_auth.roles_dict \u003d {}"},{"line_number":53,"context_line":"        self.assertRaises(KeyError, self.rbac_auth.allowed,"},{"line_number":54,"context_line":"                          \"api\", \"support_member\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_0e6b9f1f","line":51,"range":{"start_line":51,"start_character":32,"end_line":51,"end_character":38},"in_reply_to":"3f1d235d_03c49891","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertRaises(KeyError, self.rbac_auth.allowed,"},{"line_number":54,"context_line":"                          \"api\", \"support_member\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def test_parser_role_parser_create(self):"},{"line_number":57,"context_line":"        req_auth.RequirementsParser(self.yaml_test_file)"},{"line_number":58,"context_line":"        self.assertEqual([{\u0027Test\u0027: self.expected_result}],"},{"line_number":59,"context_line":"                         req_auth.RequirementsParser.Inner._rbac_map)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_a3ba8407","line":56,"range":{"start_line":56,"start_character":13,"end_line":56,"end_character":38},"updated":"2017-07-07 14:38:04.000000000","message":"parser_init","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertRaises(KeyError, self.rbac_auth.allowed,"},{"line_number":54,"context_line":"                          \"api\", \"support_member\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def test_parser_role_parser_create(self):"},{"line_number":57,"context_line":"        req_auth.RequirementsParser(self.yaml_test_file)"},{"line_number":58,"context_line":"        self.assertEqual([{\u0027Test\u0027: self.expected_result}],"},{"line_number":59,"context_line":"                         req_auth.RequirementsParser.Inner._rbac_map)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_2e865bdd","line":56,"range":{"start_line":56,"start_character":13,"end_line":56,"end_character":38},"in_reply_to":"3f1d235d_a3ba8407","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.assertEqual([{\u0027Test\u0027: self.expected_result}],"},{"line_number":59,"context_line":"                         req_auth.RequirementsParser.Inner._rbac_map)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_parser_role_parser_parse_role_in_api(self):"},{"line_number":62,"context_line":"        req_auth.RequirementsParser.Inner._rbac_map \u003d \\"},{"line_number":63,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":64,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_03493831","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":49},"updated":"2017-07-07 14:38:04.000000000","message":"test_parser_role_in_api","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.assertEqual([{\u0027Test\u0027: self.expected_result}],"},{"line_number":59,"context_line":"                         req_auth.RequirementsParser.Inner._rbac_map)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_parser_role_parser_parse_role_in_api(self):"},{"line_number":62,"context_line":"        req_auth.RequirementsParser.Inner._rbac_map \u003d \\"},{"line_number":63,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":64,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_8e77af09","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":49},"in_reply_to":"3f1d235d_03493831","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.assertEqual(self.expected_result, self.rbac_auth.roles_dict)"},{"line_number":67,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"test:create2\", \"test_member\"))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_parser_role_parser_parse_role_not_in_api(self):"},{"line_number":70,"context_line":"        req_auth.RequirementsParser.Inner._rbac_map \u003d \\"},{"line_number":71,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":72,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_e3451c17","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":53},"updated":"2017-07-07 14:38:04.000000000","message":"test_parser_role_not_in_api","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.assertEqual(self.expected_result, self.rbac_auth.roles_dict)"},{"line_number":67,"context_line":"        self.assertTrue(self.rbac_auth.allowed(\"test:create2\", \"test_member\"))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_parser_role_parser_parse_role_not_in_api(self):"},{"line_number":70,"context_line":"        req_auth.RequirementsParser.Inner._rbac_map \u003d \\"},{"line_number":71,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":72,"context_line":"        self.rbac_auth.roles_dict \u003d req_auth.RequirementsParser.parse(\"Test\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_ce1fe7b5","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":53},"in_reply_to":"3f1d235d_e3451c17","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.assertEqual(self.expected_result, self.rbac_auth.roles_dict)"},{"line_number":75,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"test:create2\", \"_member_\"))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_parser_role_parser_parse_fail(self):"},{"line_number":78,"context_line":"        req_auth.RequirementsParser.Inner._rbac_map \u003d \\"},{"line_number":79,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":80,"context_line":"        self.rbac_auth.roles_dict \u003d \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_a34f2433","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":42},"updated":"2017-07-07 14:38:04.000000000","message":"test_parser_except_invalid_configuration","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.assertEqual(self.expected_result, self.rbac_auth.roles_dict)"},{"line_number":75,"context_line":"        self.assertFalse(self.rbac_auth.allowed(\"test:create2\", \"_member_\"))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_parser_role_parser_parse_fail(self):"},{"line_number":78,"context_line":"        req_auth.RequirementsParser.Inner._rbac_map \u003d \\"},{"line_number":79,"context_line":"            [{\u0027Test\u0027: self.expected_result}]"},{"line_number":80,"context_line":"        self.rbac_auth.roles_dict \u003d \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f1d235d_ee22a301","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":42},"in_reply_to":"3f1d235d_a34f2433","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"}],"releasenotes/notes/support_requirements_yaml-a90e0188a19421ba.yaml":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c374a4360f9e00025f455e54406d82fa8ab550ca","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support of running Patrole against a custom requirements YAML that"},{"line_number":5,"context_line":"    defines RBAC requirements. The YAML file lists all the APIs and the roles"},{"line_number":6,"context_line":"    that should have access to the APIs. The purpose of running Patrole against"},{"line_number":7,"context_line":"    a requirements YAML is to verify that the RBAC policy is in accordance to"},{"line_number":8,"context_line":"    deployment specific requirements. Running Patrole against a requirements"},{"line_number":9,"context_line":"    YAML is completely optional and can be enabled through the rbac section of"},{"line_number":10,"context_line":"    the tempest.conf. The requirements YAML must be located on the same host"},{"line_number":11,"context_line":"    that Patrole runs on. The yaml file should be written following this"},{"line_number":12,"context_line":"    format::"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    \"\"\""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3f1d235d_db454b72","line":11,"range":{"start_line":4,"start_character":4,"end_line":11,"end_character":25},"updated":"2017-06-30 00:03:20.000000000","message":"I think that this is all we need to include in the release notes. We can include documentation for this feature in a follow-up patch.","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"9516fdda6904a87b6b0695a4cf6d348a5dcb7e2b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support of running Patrole against a custom requirements YAML that"},{"line_number":5,"context_line":"    defines RBAC requirements. The YAML file lists all the APIs and the roles"},{"line_number":6,"context_line":"    that should have access to the APIs. The purpose of running Patrole against"},{"line_number":7,"context_line":"    a requirements YAML is to verify that the RBAC policy is in accordance to"},{"line_number":8,"context_line":"    deployment specific requirements. Running Patrole against a requirements"},{"line_number":9,"context_line":"    YAML is completely optional and can be enabled through the rbac section of"},{"line_number":10,"context_line":"    the tempest.conf. The requirements YAML must be located on the same host"},{"line_number":11,"context_line":"    that Patrole runs on. The yaml file should be written following this"},{"line_number":12,"context_line":"    format::"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    \"\"\""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3f1d235d_c2953ee6","line":11,"range":{"start_line":4,"start_character":4,"end_line":11,"end_character":25},"in_reply_to":"3f1d235d_db454b72","updated":"2017-06-30 20:33:27.000000000","message":"ok, where would this documentation go?","commit_id":"c86aa767ba12aed34b7a22ca7af17e3b2ffe923e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"65244452f9c4ab38515ce46e8d4af9fc2c71ef22","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    that should have access to the APIs. The purpose of running Patrole against"},{"line_number":7,"context_line":"    a requirements YAML is to verify that the RBAC policy is in accordance to"},{"line_number":8,"context_line":"    deployment specific requirements. Running Patrole against a requirements"},{"line_number":9,"context_line":"    YAML is completely optional and can be enabled through the rbac section of"},{"line_number":10,"context_line":"    the tempest.conf. The requirements YAML must be located on the same host"},{"line_number":11,"context_line":"    that Patrole runs on."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3f1d235d_23e0b4fa","line":10,"range":{"start_line":9,"start_character":51,"end_line":10,"end_character":20},"updated":"2017-07-07 14:38:04.000000000","message":"by setting the ``[rbac] test_custom_requirements`` option to True in Tempest\u0027s configuration file.","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"152ef6ae86ce9117c79a4288ba64a62564b03a55","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    that should have access to the APIs. The purpose of running Patrole against"},{"line_number":7,"context_line":"    a requirements YAML is to verify that the RBAC policy is in accordance to"},{"line_number":8,"context_line":"    deployment specific requirements. Running Patrole against a requirements"},{"line_number":9,"context_line":"    YAML is completely optional and can be enabled through the rbac section of"},{"line_number":10,"context_line":"    the tempest.conf. The requirements YAML must be located on the same host"},{"line_number":11,"context_line":"    that Patrole runs on."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3f1d235d_0e871fb9","line":10,"range":{"start_line":9,"start_character":51,"end_line":10,"end_character":20},"in_reply_to":"3f1d235d_23e0b4fa","updated":"2017-07-07 15:15:56.000000000","message":"fixed","commit_id":"148d4f6c16335e8aced3a0050f741e6d026dd2fd"}]}
