)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"941b9f8dfa0296e3ef709e21c550aa97362d0817","unresolved":false,"context_lines":[{"line_number":22,"context_line":"  impacts.  A future improvement would pass the filters into the"},{"line_number":23,"context_line":"  driver layer to keep the internal assignment processing to a minimum."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"- The LDAP backend is not current supported"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Implements bp get-role-assignments"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPn%2F%2FjVE%3D","line":25,"updated":"2013-06-27 22:18:20.000000000","message":"(nit) change \"current\" to \"currently\"","commit_id":"09abc7b49c6abd940c63223dc0f086cdf213a57d"}],"etc/policy.json":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"941b9f8dfa0296e3ef709e21c550aa97362d0817","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \"identity:create_grant\": [[\"rule:admin_required\"]],"},{"line_number":67,"context_line":"    \"identity:revoke_grant\": [[\"rule:admin_required\"]],"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    \"identity:list_role_assignments\": [[\"rule:admin_required\"]],"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    \"identity:get_policy\": [[\"rule:admin_required\"]],"},{"line_number":72,"context_line":"    \"identity:list_policies\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":2,"id":"AAAAPn%2F%2Fjag%3D","line":69,"updated":"2013-06-27 22:18:20.000000000","message":"suggest group with other role actions, to after line 62.","commit_id":"09abc7b49c6abd940c63223dc0f086cdf213a57d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f2b22f352a5a647c4049ae69e9735bdd1055a43","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \"identity:create_grant\": [[\"rule:admin_required\"]],"},{"line_number":67,"context_line":"    \"identity:revoke_grant\": [[\"rule:admin_required\"]],"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    \"identity:list_role_assignments\": [[\"rule:admin_required\"]],"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    \"identity:get_policy\": [[\"rule:admin_required\"]],"},{"line_number":72,"context_line":"    \"identity:list_policies\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":2,"id":"AAAAPn%2F%2FhM4%3D","line":69,"in_reply_to":"AAAAPn%2F%2Fjag%3D","updated":"2013-06-28 16:54:14.000000000","message":"So not sure it belongs with the roles....there is an argument that it goes with the grants (since this like a much more generalized version of list_grants).  Hence I originally had this call with that group (i.e. line 68)...but then moved it to its own section on the basis that as we make role_assignment a first class entity in the future, we will want it in its own section (it will have list, create, update, delete)  - the grant section will get depreciated.  However, I\u0027d be OK with us having this on line 68 if people felt that was more appropriate for now.","commit_id":"09abc7b49c6abd940c63223dc0f086cdf213a57d"}],"keystone/common/controller.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"af8886ada21f07f013859c2475bd0a964aff61b1","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        if attr in context[\u0027query_string\u0027]:"},{"line_number":282,"context_line":"            value \u003d context[\u0027query_string\u0027][attr]"},{"line_number":283,"context_line":"            return [r for r in refs if _attr_match("},{"line_number":284,"context_line":"                flatten(r).get(attr), value)]"},{"line_number":285,"context_line":"        return refs"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FWMA%3D","line":284,"updated":"2013-07-03 18:01:21.000000000","message":"why is it OK to now start using the flatten directory structure here when it wasn\u0027t used previously? Why doesn\u0027t that break something somewhere???","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6632d2c0725802288ba545e6e813482a7610a59a","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        if attr in context[\u0027query_string\u0027]:"},{"line_number":282,"context_line":"            value \u003d context[\u0027query_string\u0027][attr]"},{"line_number":283,"context_line":"            return [r for r in refs if _attr_match("},{"line_number":284,"context_line":"                flatten(r).get(attr), value)]"},{"line_number":285,"context_line":"        return refs"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVuU%3D","line":284,"in_reply_to":"AAAAPn%2F%2FWMA%3D","updated":"2013-07-03 18:13:23.000000000","message":"because nobody was ever trying to look into an object before...","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d9c046268aae5076537427461e77fa67da6447c6","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        if attr in context[\u0027query_string\u0027]:"},{"line_number":282,"context_line":"            value \u003d context[\u0027query_string\u0027][attr]"},{"line_number":283,"context_line":"            return [r for r in refs if _attr_match("},{"line_number":284,"context_line":"                flatten(r).get(attr), value)]"},{"line_number":285,"context_line":"        return refs"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _require_matching_id(self, value, ref):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVvU%3D","line":284,"in_reply_to":"AAAAPn%2F%2FWMA%3D","updated":"2013-07-03 18:08:58.000000000","message":"that\u0027s why we have unit tests (I hope) :-)","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"}],"keystone/identity/backends/kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        \"metadata-{target}-{actor}\", with the value being a role list"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        i.e. \"metadata-MyProjectID-MyUserID\" [role1, role2]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        ...so we enumerate the list and extract the targets, actors"},{"line_number":193,"context_line":"        and roles."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcpQ%3D","line":190,"updated":"2013-07-01 20:55:11.000000000","message":"While I appreciate a useful comment, lines 186-190 aren\u0027t specific to this function so maybe belong at the class level.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        \"metadata-{target}-{actor}\", with the value being a role list"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        i.e. \"metadata-MyProjectID-MyUserID\" [role1, role2]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        ...so we enumerate the list and extract the targets, actors"},{"line_number":193,"context_line":"        and roles."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZvA%3D","line":190,"in_reply_to":"AAAAPn%2F%2FcpQ%3D","updated":"2013-07-02 20:54:49.000000000","message":"Trouble is, all we have is the overall kvs identity driver class....of which role assignment is a subset - so didn\u0027t feel it quiet appropriate there...","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            except exception.NotFound:"},{"line_number":212,"context_line":"                template[\u0027group_id\u0027] \u003d meta_id2"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            entry \u003d self.db.get(\u0027metadata-%s-%s\u0027 % (meta_id1, meta_id2))"},{"line_number":215,"context_line":"            for r in entry.get(\u0027roles\u0027, []):"},{"line_number":216,"context_line":"                role_assignment \u003d template.copy()"},{"line_number":217,"context_line":"                role_assignment[\u0027role_id\u0027] \u003d r"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcjk%3D","line":214,"updated":"2013-07-01 20:55:11.000000000","message":"suggest change self.db.get(\u0027metadata-%s-%s\u0027 % (meta_id1, meta_id2)) to self.db.get(key), since I think this is just rebuilding the original key.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            except exception.NotFound:"},{"line_number":212,"context_line":"                template[\u0027group_id\u0027] \u003d meta_id2"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            entry \u003d self.db.get(\u0027metadata-%s-%s\u0027 % (meta_id1, meta_id2))"},{"line_number":215,"context_line":"            for r in entry.get(\u0027roles\u0027, []):"},{"line_number":216,"context_line":"                role_assignment \u003d template.copy()"},{"line_number":217,"context_line":"                role_assignment[\u0027role_id\u0027] \u003d r"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZu0%3D","line":214,"in_reply_to":"AAAAPn%2F%2Fcjk%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"af8886ada21f07f013859c2475bd0a964aff61b1","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def list_role_assignments(self):"},{"line_number":184,"context_line":"        \"\"\"List the role assignments."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        The kvs backend stores role assignments as key-values:"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        \"metadata-{target}-{actor}\", with the value being a role list"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FWLg%3D","line":185,"updated":"2013-07-03 18:01:21.000000000","message":"Very helpful comment.  Thanks for adding it!","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"af8886ada21f07f013859c2475bd0a964aff61b1","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                self._get_user(meta_id2)"},{"line_number":210,"context_line":"                template[\u0027user_id\u0027] \u003d meta_id2"},{"line_number":211,"context_line":"            except exception.NotFound:"},{"line_number":212,"context_line":"                template[\u0027group_id\u0027] \u003d meta_id2"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            entry \u003d self.db.get(key)"},{"line_number":215,"context_line":"            for r in entry.get(\u0027roles\u0027, []):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FWJk%3D","line":212,"updated":"2013-07-03 18:01:21.000000000","message":"Just curiously, if the user is not found why can you safely assume that meta_id2 must be a group_id???","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6632d2c0725802288ba545e6e813482a7610a59a","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                self._get_user(meta_id2)"},{"line_number":210,"context_line":"                template[\u0027user_id\u0027] \u003d meta_id2"},{"line_number":211,"context_line":"            except exception.NotFound:"},{"line_number":212,"context_line":"                template[\u0027group_id\u0027] \u003d meta_id2"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            entry \u003d self.db.get(key)"},{"line_number":215,"context_line":"            for r in entry.get(\u0027roles\u0027, []):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVuM%3D","line":212,"in_reply_to":"AAAAPn%2F%2FWJk%3D","updated":"2013-07-03 18:13:23.000000000","message":"since we check on creation that you must have either user or group (and not both)","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        TODO (henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FciI%3D","line":361,"updated":"2013-07-01 20:55:11.000000000","message":"suggest use TODO(henry-nash): , per HACKING.rst, https://github.com/openstack/keystone/blame/master/HACKING.rst#L17","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        TODO (henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZuA%3D","line":361,"in_reply_to":"AAAAPn%2F%2FciI%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"484945ddd79503972318bc46252edce60e8a58cd","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        # assignment as a first class entity, we should create the single"},{"line_number":365,"context_line":"        # assignment table, simplifying the logic of this (and many other)"},{"line_number":366,"context_line":"        # functions."},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        session \u003d self.get_session()"},{"line_number":369,"context_line":"        assignment_list \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYek%3D","line":366,"updated":"2013-07-02 23:58:38.000000000","message":"amen!","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                                 domain_id, group_id)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV7g%3D","line":359,"updated":"2013-07-03 18:40:26.000000000","message":"(nit) suggest remove comment that adds nothing","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                                 domain_id, group_id)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVcA%3D","line":359,"in_reply_to":"AAAAPn%2F%2FV7g%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        # assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV7Y%3D","line":361,"updated":"2013-07-03 18:40:26.000000000","message":"(nit) add a : to match the format for TODO strings, TODO(henry-nash):","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"af8886ada21f07f013859c2475bd0a964aff61b1","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        # assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FWIc%3D","line":361,"updated":"2013-07-03 18:01:21.000000000","message":"wow, didn\u0027t realize these weren\u0027t all in a single table yet.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        # assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVb8%3D","line":361,"in_reply_to":"AAAAPn%2F%2FV7Y%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6632d2c0725802288ba545e6e813482a7610a59a","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        # assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVuI%3D","line":361,"in_reply_to":"AAAAPn%2F%2FVu4%3D","updated":"2013-07-03 18:13:23.000000000","message":"IceHouse here we come....","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d9c046268aae5076537427461e77fa67da6447c6","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_role_assignments(self):"},{"line_number":359,"context_line":"        \"\"\"List the role assignments.\"\"\""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        # TODO(henry-nash) The current implementation is really simulating"},{"line_number":362,"context_line":"        # us having a common role assignment table, rather than having the"},{"line_number":363,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":364,"context_line":"        # assignment as a first class entity, we should create the single"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVu4%3D","line":361,"in_reply_to":"AAAAPn%2F%2FWIc%3D","updated":"2013-07-03 18:08:58.000000000","message":"yeah, not sure why we stash role assignments in metadata to begin with. +1000 to consolidate them into a single table. Role assignment should really be a first class citizen.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"dcaa3336ecb0e74eb7015189e205989c21ff64c6","unresolved":false,"context_lines":[{"line_number":362,"context_line":"        # four different grant tables we have today.  When we move to role"},{"line_number":363,"context_line":"        # assignment as a first class entity, we should create the single"},{"line_number":364,"context_line":"        # assignment table, simplifying the logic of this (and many other)"},{"line_number":365,"context_line":"        # functions."},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        session \u003d self.get_session()"},{"line_number":368,"context_line":"        assignment_list \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAP3%2F%2F9dA%3D","line":365,"updated":"2013-07-08 15:04:14.000000000","message":"+5","commit_id":"fa10d4945ca9658eff02b1d8e917fde50d6576ce"}],"keystone/identity/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":797,"context_line":"            self._delete_tokens_for_group(group_id)"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"class RoleAssignmentV3(controller.V3Controller):"},{"line_number":801,"context_line":"    \"\"\"Role assignment entity class."},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    TODO (henry-nash) The current implementation does not provide a full"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fch4%3D","line":800,"updated":"2013-07-01 20:55:11.000000000","message":"If there isn\u0027t a V2 of this, suggest remove the V3.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":797,"context_line":"            self._delete_tokens_for_group(group_id)"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":""},{"line_number":800,"context_line":"class RoleAssignmentV3(controller.V3Controller):"},{"line_number":801,"context_line":"    \"\"\"Role assignment entity class."},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    TODO (henry-nash) The current implementation does not provide a full"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZtY%3D","line":800,"in_reply_to":"AAAAPn%2F%2Fch4%3D","updated":"2013-07-02 20:54:49.000000000","message":"We could do...although I was following the convention we used for DomainsV3 and GroupV3, which also did not have V2 counterparts.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6b1228aac9dc37554969533b7a5e402c353805f","unresolved":false,"context_lines":[{"line_number":800,"context_line":"class RoleAssignmentV3(controller.V3Controller):"},{"line_number":801,"context_line":"    \"\"\"Role assignment entity class."},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    TODO (henry-nash) The current implementation does not provide a full"},{"line_number":804,"context_line":"    first class entity for role-assignment. There is no role_assignment_id"},{"line_number":805,"context_line":"    and only the list_role_assignment call is supported. Further, since it"},{"line_number":806,"context_line":"    is not a first class entity, the links for the individual entities"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcxk%3D","line":803,"updated":"2013-07-01 18:38:02.000000000","message":"(NIT): Might was to follow the standard here, such as: \n\n# TODO(henry-nash): something...\n\nAlso, does this matter if the TODO is in the docstrings?","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":800,"context_line":"class RoleAssignmentV3(controller.V3Controller):"},{"line_number":801,"context_line":"    \"\"\"Role assignment entity class."},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    TODO (henry-nash) The current implementation does not provide a full"},{"line_number":804,"context_line":"    first class entity for role-assignment. There is no role_assignment_id"},{"line_number":805,"context_line":"    and only the list_role_assignment call is supported. Further, since it"},{"line_number":806,"context_line":"    is not a first class entity, the links for the individual entities"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZss%3D","line":803,"in_reply_to":"AAAAPn%2F%2Fcxk%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6b1228aac9dc37554969533b7a5e402c353805f","unresolved":false,"context_lines":[{"line_number":812,"context_line":""},{"line_number":813,"context_line":"    @classmethod"},{"line_number":814,"context_line":"    def wrap_member(cls, context, ref):"},{"line_number":815,"context_line":"        # Since we are not yet a true collection, we override the wrapper"},{"line_number":816,"context_line":"        # as have already included the links in the entities"},{"line_number":817,"context_line":"        pass"},{"line_number":818,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcxc%3D","line":815,"updated":"2013-07-01 18:38:02.000000000","message":"Add NOTE?","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":812,"context_line":""},{"line_number":813,"context_line":"    @classmethod"},{"line_number":814,"context_line":"    def wrap_member(cls, context, ref):"},{"line_number":815,"context_line":"        # Since we are not yet a true collection, we override the wrapper"},{"line_number":816,"context_line":"        # as have already included the links in the entities"},{"line_number":817,"context_line":"        pass"},{"line_number":818,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZso%3D","line":815,"in_reply_to":"AAAAPn%2F%2Fcxc%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":865,"context_line":"                    ref[\u0027group\u0027][\u0027id\u0027])"},{"line_number":866,"context_line":"            except exception.GroupNotFound:"},{"line_number":867,"context_line":"                members \u003d []"},{"line_number":868,"context_line":"                # Log a warning, but then continue with the next listing"},{"line_number":869,"context_line":"                if \u0027domain\u0027 in ref:"},{"line_number":870,"context_line":"                    target \u003d \u0027Domain: %s\u0027 % ref[\u0027domain\u0027].get(\u0027domain_id\u0027)"},{"line_number":871,"context_line":"                elif \u0027project\u0027 in ref:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FceU%3D","line":868,"updated":"2013-07-01 20:55:11.000000000","message":"since this function doesn\u0027t \u0027continue\u0027, suggest remove \", but then continue with the next listing\"","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":865,"context_line":"                    ref[\u0027group\u0027][\u0027id\u0027])"},{"line_number":866,"context_line":"            except exception.GroupNotFound:"},{"line_number":867,"context_line":"                members \u003d []"},{"line_number":868,"context_line":"                # Log a warning, but then continue with the next listing"},{"line_number":869,"context_line":"                if \u0027domain\u0027 in ref:"},{"line_number":870,"context_line":"                    target \u003d \u0027Domain: %s\u0027 % ref[\u0027domain\u0027].get(\u0027domain_id\u0027)"},{"line_number":871,"context_line":"                elif \u0027project\u0027 in ref:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZrE%3D","line":868,"in_reply_to":"AAAAPn%2F%2FceU%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":873,"context_line":"                LOG.warning("},{"line_number":874,"context_line":"                    _(\u0027Group %(group)s not found for role-assignment - \u0027"},{"line_number":875,"context_line":"                      \u0027%(target)s with Role: %(role)s\u0027) % {"},{"line_number":876,"context_line":"                          \u0027group\u0027: ref[\u0027group_id\u0027], \u0027target\u0027: target,"},{"line_number":877,"context_line":"                          \u0027role\u0027: ref.get(\u0027role_id\u0027)})"},{"line_number":878,"context_line":"            return members"},{"line_number":879,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcfQ%3D","line":876,"updated":"2013-07-01 20:55:11.000000000","message":"target could potentially be not defined here, which would fail. Suggest always set target to something.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":873,"context_line":"                LOG.warning("},{"line_number":874,"context_line":"                    _(\u0027Group %(group)s not found for role-assignment - \u0027"},{"line_number":875,"context_line":"                      \u0027%(target)s with Role: %(role)s\u0027) % {"},{"line_number":876,"context_line":"                          \u0027group\u0027: ref[\u0027group_id\u0027], \u0027target\u0027: target,"},{"line_number":877,"context_line":"                          \u0027role\u0027: ref.get(\u0027role_id\u0027)})"},{"line_number":878,"context_line":"            return members"},{"line_number":879,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZrA%3D","line":876,"in_reply_to":"AAAAPn%2F%2FcfQ%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            user_entry \u003d copy.deepcopy(template)"},{"line_number":889,"context_line":"            user_entry[\u0027user\u0027] \u003d {\u0027id\u0027: m[\u0027id\u0027]}"},{"line_number":890,"context_line":"            scope \u003d user_entry.get(\u0027scope\u0027)"},{"line_number":891,"context_line":"            if \u0027domain\u0027 in scope:"},{"line_number":892,"context_line":"                target_link \u003d ("},{"line_number":893,"context_line":"                    \u0027/domains/%s\u0027 % scope[\u0027domain\u0027][\u0027id\u0027])"},{"line_number":894,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FceA%3D","line":891,"updated":"2013-07-01 20:55:11.000000000","message":"\u0027scope\u0027 could be None here, in which case this would fail.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            user_entry \u003d copy.deepcopy(template)"},{"line_number":889,"context_line":"            user_entry[\u0027user\u0027] \u003d {\u0027id\u0027: m[\u0027id\u0027]}"},{"line_number":890,"context_line":"            scope \u003d user_entry.get(\u0027scope\u0027)"},{"line_number":891,"context_line":"            if \u0027domain\u0027 in scope:"},{"line_number":892,"context_line":"                target_link \u003d ("},{"line_number":893,"context_line":"                    \u0027/domains/%s\u0027 % scope[\u0027domain\u0027][\u0027id\u0027])"},{"line_number":894,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZoc%3D","line":891,"in_reply_to":"AAAAPn%2F%2FceA%3D","updated":"2013-07-02 20:54:49.000000000","message":"Well, only with a corrupt DB...there must always be a domain or a project (we check this on creation of role assignment) - are you concerned about just having defensive code that doesn\u0027t break (I am just wary of placing integrity checks in too many places reducing code readability)","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":896,"context_line":"                    \u0027/projects/%s\u0027 % scope[\u0027project\u0027][\u0027id\u0027])"},{"line_number":897,"context_line":"            user_entry[\u0027links\u0027][\u0027assignment\u0027] \u003d ("},{"line_number":898,"context_line":"                self.base_url(target_link + \u0027/users/%s\u0027 % m[\u0027id\u0027] +"},{"line_number":899,"context_line":"                              \u0027/roles/%s\u0027 % user_entry[\u0027role\u0027][\u0027id\u0027]))"},{"line_number":900,"context_line":"            user_entry[\u0027links\u0027][\u0027membership\u0027] \u003d ("},{"line_number":901,"context_line":"                self.base_url(\u0027/groups/%s\u0027 % group_id +"},{"line_number":902,"context_line":"                              \u0027/users/%s\u0027 % m[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcds%3D","line":899,"updated":"2013-07-01 20:55:11.000000000","message":"suggest have a single format for string, like\n\n \u0027%s/users/%s/roles/%s\u0027 % (target_link, m[\u0027id\u0027], user_entry[\u0027role\u0027][\u0027id\u0027])","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":896,"context_line":"                    \u0027/projects/%s\u0027 % scope[\u0027project\u0027][\u0027id\u0027])"},{"line_number":897,"context_line":"            user_entry[\u0027links\u0027][\u0027assignment\u0027] \u003d ("},{"line_number":898,"context_line":"                self.base_url(target_link + \u0027/users/%s\u0027 % m[\u0027id\u0027] +"},{"line_number":899,"context_line":"                              \u0027/roles/%s\u0027 % user_entry[\u0027role\u0027][\u0027id\u0027]))"},{"line_number":900,"context_line":"            user_entry[\u0027links\u0027][\u0027membership\u0027] \u003d ("},{"line_number":901,"context_line":"                self.base_url(\u0027/groups/%s\u0027 % group_id +"},{"line_number":902,"context_line":"                              \u0027/users/%s\u0027 % m[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZPQ%3D","line":899,"in_reply_to":"AAAAPn%2F%2Fcds%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":899,"context_line":"                              \u0027/roles/%s\u0027 % user_entry[\u0027role\u0027][\u0027id\u0027]))"},{"line_number":900,"context_line":"            user_entry[\u0027links\u0027][\u0027membership\u0027] \u003d ("},{"line_number":901,"context_line":"                self.base_url(\u0027/groups/%s\u0027 % group_id +"},{"line_number":902,"context_line":"                              \u0027/users/%s\u0027 % m[\u0027id\u0027]))"},{"line_number":903,"context_line":"            return user_entry"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        # Scan the list of entities for and group assignments, expanding"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcdo%3D","line":902,"updated":"2013-07-01 20:55:11.000000000","message":"similar comment here.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":899,"context_line":"                              \u0027/roles/%s\u0027 % user_entry[\u0027role\u0027][\u0027id\u0027]))"},{"line_number":900,"context_line":"            user_entry[\u0027links\u0027][\u0027membership\u0027] \u003d ("},{"line_number":901,"context_line":"                self.base_url(\u0027/groups/%s\u0027 % group_id +"},{"line_number":902,"context_line":"                              \u0027/users/%s\u0027 % m[\u0027id\u0027]))"},{"line_number":903,"context_line":"            return user_entry"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        # Scan the list of entities for and group assignments, expanding"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZPU%3D","line":902,"in_reply_to":"AAAAPn%2F%2Fcdo%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":902,"context_line":"                              \u0027/users/%s\u0027 % m[\u0027id\u0027]))"},{"line_number":903,"context_line":"            return user_entry"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        # Scan the list of entities for and group assignments, expanding"},{"line_number":906,"context_line":"        # them into equivalent user entities.  Rather than modify the"},{"line_number":907,"context_line":"        # list we are enumerating, we build a list of entities to add"},{"line_number":908,"context_line":"        # or remove at the end."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcdg%3D","line":905,"updated":"2013-07-01 20:55:11.000000000","message":"change \"for and group\" to \"for group\"","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":902,"context_line":"                              \u0027/users/%s\u0027 % m[\u0027id\u0027]))"},{"line_number":903,"context_line":"            return user_entry"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        # Scan the list of entities for and group assignments, expanding"},{"line_number":906,"context_line":"        # them into equivalent user entities.  Rather than modify the"},{"line_number":907,"context_line":"        # list we are enumerating, we build a list of entities to add"},{"line_number":908,"context_line":"        # or remove at the end."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZPI%3D","line":905,"in_reply_to":"AAAAPn%2F%2Fcdg%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        for x in refs_to_add:"},{"line_number":932,"context_line":"            refs.append(x)"},{"line_number":933,"context_line":"        for x in refs_to_remove:"},{"line_number":934,"context_line":"            refs.remove(x)"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"    @controller.filterprotected(\u0027group.id\u0027, \u0027role.id\u0027,"},{"line_number":937,"context_line":"                                \u0027scope.domain.id\u0027, \u0027scope.project.id\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcdI%3D","line":934,"updated":"2013-07-01 20:55:11.000000000","message":"suggest remove before add, since it\u0027ll be smaller.\n\nAlso, might be easier to build a new list rather than change the existing one... this looks like it\u0027s about O(n^3)","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        for x in refs_to_add:"},{"line_number":932,"context_line":"            refs.append(x)"},{"line_number":933,"context_line":"        for x in refs_to_remove:"},{"line_number":934,"context_line":"            refs.remove(x)"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"    @controller.filterprotected(\u0027group.id\u0027, \u0027role.id\u0027,"},{"line_number":937,"context_line":"                                \u0027scope.domain.id\u0027, \u0027scope.project.id\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZMY%3D","line":934,"in_reply_to":"AAAAPn%2F%2FcdI%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6b1228aac9dc37554969533b7a5e402c353805f","unresolved":false,"context_lines":[{"line_number":939,"context_line":"    def list_role_assignments(self, context, filters):"},{"line_number":940,"context_line":"        \"\"\"List role assignments."},{"line_number":941,"context_line":""},{"line_number":942,"context_line":"        TODO (henry-nash) This implementation uses the standard filtering"},{"line_number":943,"context_line":"        in the V3.wrap_collection. Given the large number of individual"},{"line_number":944,"context_line":"        assignments, this is pretty inefficient.  An alternative would be"},{"line_number":945,"context_line":"        to pass the filters into the driver call, so that the list size is"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcw0%3D","line":942,"updated":"2013-07-01 18:38:02.000000000","message":"Same comment as above applies here","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":939,"context_line":"    def list_role_assignments(self, context, filters):"},{"line_number":940,"context_line":"        \"\"\"List role assignments."},{"line_number":941,"context_line":""},{"line_number":942,"context_line":"        TODO (henry-nash) This implementation uses the standard filtering"},{"line_number":943,"context_line":"        in the V3.wrap_collection. Given the large number of individual"},{"line_number":944,"context_line":"        assignments, this is pretty inefficient.  An alternative would be"},{"line_number":945,"context_line":"        to pass the filters into the driver call, so that the list size is"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZOw%3D","line":942,"in_reply_to":"AAAAPn%2F%2Fcw0%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"484945ddd79503972318bc46252edce60e8a58cd","unresolved":false,"context_lines":[{"line_number":950,"context_line":"        \"\"\""},{"line_number":951,"context_line":""},{"line_number":952,"context_line":"        if (isinstance(filter_value, basestring) and"},{"line_number":953,"context_line":"                filter_value \u003d\u003d \u00270\u0027):"},{"line_number":954,"context_line":"            val \u003d False"},{"line_number":955,"context_line":"        else:"},{"line_number":956,"context_line":"            val \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYYs%3D","line":953,"updated":"2013-07-02 23:58:38.000000000","message":"is that a common HTTP practice for evaluating boolean query parameters? I would think \u0027False\u0027 and \u0027false\u0027 are also valid.\n\nMaybe a good function to have in openstack.common if we don\u0027t have one already, for consistency.","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e51a1dec250ad7492a9053ca030d1ce5b6a8f34","unresolved":false,"context_lines":[{"line_number":950,"context_line":"        \"\"\""},{"line_number":951,"context_line":""},{"line_number":952,"context_line":"        if (isinstance(filter_value, basestring) and"},{"line_number":953,"context_line":"                filter_value \u003d\u003d \u00270\u0027):"},{"line_number":954,"context_line":"            val \u003d False"},{"line_number":955,"context_line":"        else:"},{"line_number":956,"context_line":"            val \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYIk%3D","line":953,"in_reply_to":"AAAAPn%2F%2FYYs%3D","updated":"2013-07-03 01:10:57.000000000","message":"So Dolphm and I had this discussion when I implemented policy checking on filter parameters for Grizzly, and the issues was if you accept anything other than zero, then you get into discussions on whether you should support (for example) False, false, no etc.  So the decision was made to stick to \u00270\u0027 only. \n\nAs to having this in common - nice idea, perhaps, if it\u0027s OK, I could come back and do that re-factor once we have this in there.","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"484945ddd79503972318bc46252edce60e8a58cd","unresolved":false,"context_lines":[{"line_number":968,"context_line":"        # to pass the filters into the driver call, so that the list size is"},{"line_number":969,"context_line":"        # kept a minimum."},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        refs \u003d self.identity_api.list_role_assignments()"},{"line_number":972,"context_line":"        formatted_refs \u003d [self._format_entity(x) for x in refs]"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"        if (\u0027effective\u0027 in context[\u0027query_string\u0027] and"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYYI%3D","line":971,"updated":"2013-07-02 23:58:38.000000000","message":"you are overriding wrap_member() anyway, why not move _format_entity() there?","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e51a1dec250ad7492a9053ca030d1ce5b6a8f34","unresolved":false,"context_lines":[{"line_number":968,"context_line":"        # to pass the filters into the driver call, so that the list size is"},{"line_number":969,"context_line":"        # kept a minimum."},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        refs \u003d self.identity_api.list_role_assignments()"},{"line_number":972,"context_line":"        formatted_refs \u003d [self._format_entity(x) for x in refs]"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"        if (\u0027effective\u0027 in context[\u0027query_string\u0027] and"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYHs%3D","line":971,"in_reply_to":"AAAAPn%2F%2FYYI%3D","updated":"2013-07-03 01:10:57.000000000","message":"So, wrap_member \"formats\" one entry in the collection.  Since, in the case of expanding group entries-\u003euser entries, by the time you get to wrap_member you would have lost what group it was, so you don\u0027t have the information to create the \u0027membership\u0027 link","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":799,"context_line":""},{"line_number":800,"context_line":"class RoleAssignmentV3(controller.V3Controller):"},{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    \"\"\"Role assignment entity class.\"\"\""},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    # TODO(henry-nash) The current implementation does not provide a full"},{"line_number":805,"context_line":"    # first class entity for role-assignment. There is no role_assignment_id"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV50%3D","line":802,"updated":"2013-07-03 18:40:26.000000000","message":"Not sure what this docstring means... it\u0027s a controller not an entity. Suggest remove this line.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":799,"context_line":""},{"line_number":800,"context_line":"class RoleAssignmentV3(controller.V3Controller):"},{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    \"\"\"Role assignment entity class.\"\"\""},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    # TODO(henry-nash) The current implementation does not provide a full"},{"line_number":805,"context_line":"    # first class entity for role-assignment. There is no role_assignment_id"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVbs%3D","line":802,"in_reply_to":"AAAAPn%2F%2FV50%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    \"\"\"Role assignment entity class.\"\"\""},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    # TODO(henry-nash) The current implementation does not provide a full"},{"line_number":805,"context_line":"    # first class entity for role-assignment. There is no role_assignment_id"},{"line_number":806,"context_line":"    # and only the list_role_assignment call is supported. Further, since it"},{"line_number":807,"context_line":"    # is not a first class entity, the links for the individual entities"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV5w%3D","line":804,"updated":"2013-07-03 18:40:26.000000000","message":"(nit) add a : here, TODO(henry-nash):","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":801,"context_line":""},{"line_number":802,"context_line":"    \"\"\"Role assignment entity class.\"\"\""},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    # TODO(henry-nash) The current implementation does not provide a full"},{"line_number":805,"context_line":"    # first class entity for role-assignment. There is no role_assignment_id"},{"line_number":806,"context_line":"    # and only the list_role_assignment call is supported. Further, since it"},{"line_number":807,"context_line":"    # is not a first class entity, the links for the individual entities"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVbo%3D","line":804,"in_reply_to":"AAAAPn%2F%2FV5w%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":960,"context_line":"                                \u0027scope.domain.id\u0027, \u0027scope.project.id\u0027,"},{"line_number":961,"context_line":"                                \u0027user.id\u0027)"},{"line_number":962,"context_line":"    def list_role_assignments(self, context, filters):"},{"line_number":963,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        # TODO(henry-nash) This implementation uses the standard filtering"},{"line_number":966,"context_line":"        # in the V3.wrap_collection. Given the large number of individual"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV2M%3D","line":963,"updated":"2013-07-03 18:40:26.000000000","message":"(nit) remove this docstring since it adds nothing, it\u0027s just the name of the function.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":960,"context_line":"                                \u0027scope.domain.id\u0027, \u0027scope.project.id\u0027,"},{"line_number":961,"context_line":"                                \u0027user.id\u0027)"},{"line_number":962,"context_line":"    def list_role_assignments(self, context, filters):"},{"line_number":963,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        # TODO(henry-nash) This implementation uses the standard filtering"},{"line_number":966,"context_line":"        # in the V3.wrap_collection. Given the large number of individual"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVbY%3D","line":963,"in_reply_to":"AAAAPn%2F%2FV2M%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":962,"context_line":"    def list_role_assignments(self, context, filters):"},{"line_number":963,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        # TODO(henry-nash) This implementation uses the standard filtering"},{"line_number":966,"context_line":"        # in the V3.wrap_collection. Given the large number of individual"},{"line_number":967,"context_line":"        # assignments, this is pretty inefficient.  An alternative would be"},{"line_number":968,"context_line":"        # to pass the filters into the driver call, so that the list size is"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV2E%3D","line":965,"updated":"2013-07-03 18:40:26.000000000","message":"(nit) add :,  TODO(henry-nash):","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":962,"context_line":"    def list_role_assignments(self, context, filters):"},{"line_number":963,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        # TODO(henry-nash) This implementation uses the standard filtering"},{"line_number":966,"context_line":"        # in the V3.wrap_collection. Given the large number of individual"},{"line_number":967,"context_line":"        # assignments, this is pretty inefficient.  An alternative would be"},{"line_number":968,"context_line":"        # to pass the filters into the driver call, so that the list size is"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVbU%3D","line":965,"in_reply_to":"AAAAPn%2F%2FV2E%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"            formatted_refs \u003d self._expand_indirect_assignments(formatted_refs)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        return RoleAssignmentV3.wrap_collection(context, formatted_refs,"},{"line_number":981,"context_line":"                                                filters)"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV0k%3D","line":980,"updated":"2013-07-03 18:40:26.000000000","message":"should be able to use self.wrap_collection rather than RoleAssignmentV3","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":977,"context_line":""},{"line_number":978,"context_line":"            formatted_refs \u003d self._expand_indirect_assignments(formatted_refs)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        return RoleAssignmentV3.wrap_collection(context, formatted_refs,"},{"line_number":981,"context_line":"                                                filters)"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVbQ%3D","line":980,"in_reply_to":"AAAAPn%2F%2FV0k%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"}],"keystone/identity/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"484945ddd79503972318bc46252edce60e8a58cd","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        \"\"\""},{"line_number":505,"context_line":"        raise exception.NotImplemented()"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def list_role_assignments(self):"},{"line_number":508,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYc4%3D","line":507,"updated":"2013-07-02 23:58:38.000000000","message":"May need to move this to assignments backend. Not sure if you want to make yours depended on ayoung\u0027s patch\n\nhttps://review.openstack.org/#/c/33745/","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e51a1dec250ad7492a9053ca030d1ce5b6a8f34","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        \"\"\""},{"line_number":505,"context_line":"        raise exception.NotImplemented()"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def list_role_assignments(self):"},{"line_number":508,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYHY%3D","line":507,"in_reply_to":"AAAAPn%2F%2FYc4%3D","updated":"2013-07-03 01:10:57.000000000","message":"We will end up having to do a bit of re-factoring, yes","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        raise exception.NotImplemented()"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def list_role_assignments(self):"},{"line_number":508,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        raise exception.NotImplemented()"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FV0U%3D","line":508,"updated":"2013-07-03 18:40:26.000000000","message":"remove this docstring since it\u0027s just the function name.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":505,"context_line":"        raise exception.NotImplemented()"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def list_role_assignments(self):"},{"line_number":508,"context_line":"        \"\"\"List role assignments.\"\"\""},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        raise exception.NotImplemented()"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVag%3D","line":508,"in_reply_to":"AAAAPn%2F%2FV0U%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"}],"tests/test_backend.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        Test Plan:"},{"line_number":489,"context_line":"        - Create a domain, with a user, group \u0026 project"},{"line_number":490,"context_line":"        - Find how many role assignments already exit (from default"},{"line_number":491,"context_line":"          fixtures)"},{"line_number":492,"context_line":"        - Create a grant of each type (user/group on project/domain)"},{"line_number":493,"context_line":"        - Check the number of assignments has gone up by 4 and that"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcbg%3D","line":490,"updated":"2013-07-01 20:55:11.000000000","message":"change \"exit\" to \"exist\"","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        Test Plan:"},{"line_number":489,"context_line":"        - Create a domain, with a user, group \u0026 project"},{"line_number":490,"context_line":"        - Find how many role assignments already exit (from default"},{"line_number":491,"context_line":"          fixtures)"},{"line_number":492,"context_line":"        - Create a grant of each type (user/group on project/domain)"},{"line_number":493,"context_line":"        - Check the number of assignments has gone up by 4 and that"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZMU%3D","line":490,"in_reply_to":"AAAAPn%2F%2Fcbg%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"484945ddd79503972318bc46252edce60e8a58cd","unresolved":false,"context_lines":[{"line_number":482,"context_line":"                          self.identity_api.get_project,"},{"line_number":483,"context_line":"                          \u0027fake2\u0027)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def test_list_role_assignments_unfiltered(self):"},{"line_number":486,"context_line":"        \"\"\"Test for unfiltered listing role assignments."},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        Test Plan:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYR8%3D","line":485,"updated":"2013-07-02 23:58:38.000000000","message":"probably don\u0027t need this test as the tests in test_v3_identity are more comprehensive","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e51a1dec250ad7492a9053ca030d1ce5b6a8f34","unresolved":false,"context_lines":[{"line_number":482,"context_line":"                          self.identity_api.get_project,"},{"line_number":483,"context_line":"                          \u0027fake2\u0027)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def test_list_role_assignments_unfiltered(self):"},{"line_number":486,"context_line":"        \"\"\"Test for unfiltered listing role assignments."},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        Test Plan:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYHI%3D","line":485,"in_reply_to":"AAAAPn%2F%2FYR8%3D","updated":"2013-07-03 01:10:57.000000000","message":"Just thought it was worth testing the drivers separately - will become more so if we push filtering down into the driver level in the future.","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"}],"tests/test_backend_ldap.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"af8886ada21f07f013859c2475bd0a964aff61b1","unresolved":false,"context_lines":[{"line_number":458,"context_line":"    def test_get_and_remove_correct_role_grant_from_a_mix(self):"},{"line_number":459,"context_line":"        raise nose.exc.SkipTest(\u0027Blocked by bug 1101287\u0027)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def test_list_role_assignments_unfiltered(self):"},{"line_number":462,"context_line":"        raise nose.exc.SkipTest(\u0027Blocked by bug 1195019\u0027)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def test_project_crud(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVwg%3D","line":461,"updated":"2013-07-03 18:01:21.000000000","message":"do you need to add code so that if the LDAP driver is invoked it returns a not implemented / unavailable or whatever?","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6632d2c0725802288ba545e6e813482a7610a59a","unresolved":false,"context_lines":[{"line_number":458,"context_line":"    def test_get_and_remove_correct_role_grant_from_a_mix(self):"},{"line_number":459,"context_line":"        raise nose.exc.SkipTest(\u0027Blocked by bug 1101287\u0027)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def test_list_role_assignments_unfiltered(self):"},{"line_number":462,"context_line":"        raise nose.exc.SkipTest(\u0027Blocked by bug 1195019\u0027)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def test_project_crud(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVt4%3D","line":461,"in_reply_to":"AAAAPn%2F%2FVwg%3D","updated":"2013-07-03 18:13:23.000000000","message":"That happens in the Driver class, since the ldap specific driver won\u0027t have provided an implementation for it","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"}],"tests/test_v3.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                                              expected_length\u003dNone):"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        entities \u003d resp.result.get(\u0027role_assignments\u0027)"},{"line_number":722,"context_line":"        self.assertIsNotNone(entities)"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"        if expected_length is not None:"},{"line_number":725,"context_line":"            self.assertEqual(len(entities), expected_length)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcaU%3D","line":722,"updated":"2013-07-01 20:55:11.000000000","message":"seems unnecessary since will already fail if it\u0027s None, suggest remove this line.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":719,"context_line":"                                              expected_length\u003dNone):"},{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        entities \u003d resp.result.get(\u0027role_assignments\u0027)"},{"line_number":722,"context_line":"        self.assertIsNotNone(entities)"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"        if expected_length is not None:"},{"line_number":725,"context_line":"            self.assertEqual(len(entities), expected_length)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZMI%3D","line":722,"in_reply_to":"AAAAPn%2F%2FcaU%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":743,"context_line":"        self.assertIsNotNone(entity.get(\u0027user\u0027) or"},{"line_number":744,"context_line":"                             entity.get(\u0027group\u0027))"},{"line_number":745,"context_line":"        self.assertIsNone(entity.get(\u0027user\u0027) and"},{"line_number":746,"context_line":"                          entity.get(\u0027group\u0027))"},{"line_number":747,"context_line":"        self.assertIsNotNone(entity[\u0027scope\u0027].get(\u0027project\u0027) or"},{"line_number":748,"context_line":"                             entity[\u0027scope\u0027].get(\u0027domain\u0027))"},{"line_number":749,"context_line":"        self.assertIsNone(entity[\u0027scope\u0027].get(\u0027project\u0027) and"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcZc%3D","line":746,"updated":"2013-07-01 20:55:11.000000000","message":"what is this testing? Could use a comment since I can\u0027t figure it out by looking at it.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":743,"context_line":"        self.assertIsNotNone(entity.get(\u0027user\u0027) or"},{"line_number":744,"context_line":"                             entity.get(\u0027group\u0027))"},{"line_number":745,"context_line":"        self.assertIsNone(entity.get(\u0027user\u0027) and"},{"line_number":746,"context_line":"                          entity.get(\u0027group\u0027))"},{"line_number":747,"context_line":"        self.assertIsNotNone(entity[\u0027scope\u0027].get(\u0027project\u0027) or"},{"line_number":748,"context_line":"                             entity[\u0027scope\u0027].get(\u0027domain\u0027))"},{"line_number":749,"context_line":"        self.assertIsNone(entity[\u0027scope\u0027].get(\u0027project\u0027) and"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZLM%3D","line":746,"in_reply_to":"AAAAPn%2F%2FcZc%3D","updated":"2013-07-02 20:54:49.000000000","message":"Its an xor test...comment added!","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":747,"context_line":"        self.assertIsNotNone(entity[\u0027scope\u0027].get(\u0027project\u0027) or"},{"line_number":748,"context_line":"                             entity[\u0027scope\u0027].get(\u0027domain\u0027))"},{"line_number":749,"context_line":"        self.assertIsNone(entity[\u0027scope\u0027].get(\u0027project\u0027) and"},{"line_number":750,"context_line":"                          entity[\u0027scope\u0027].get(\u0027domain\u0027))"},{"line_number":751,"context_line":"        if entity[\u0027scope\u0027].get(\u0027project\u0027):"},{"line_number":752,"context_line":"            self.assertIsNotNone(entity[\u0027scope\u0027][\u0027project\u0027].get(\u0027id\u0027))"},{"line_number":753,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcZY%3D","line":750,"updated":"2013-07-01 20:55:11.000000000","message":"what is this testing? Could use a comment since I can\u0027t figure it out by looking at it.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":747,"context_line":"        self.assertIsNotNone(entity[\u0027scope\u0027].get(\u0027project\u0027) or"},{"line_number":748,"context_line":"                             entity[\u0027scope\u0027].get(\u0027domain\u0027))"},{"line_number":749,"context_line":"        self.assertIsNone(entity[\u0027scope\u0027].get(\u0027project\u0027) and"},{"line_number":750,"context_line":"                          entity[\u0027scope\u0027].get(\u0027domain\u0027))"},{"line_number":751,"context_line":"        if entity[\u0027scope\u0027].get(\u0027project\u0027):"},{"line_number":752,"context_line":"            self.assertIsNotNone(entity[\u0027scope\u0027][\u0027project\u0027].get(\u0027id\u0027))"},{"line_number":753,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZLI%3D","line":750,"in_reply_to":"AAAAPn%2F%2FcZY%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        if url:"},{"line_number":772,"context_line":"            self.assertIn(url, entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":773,"context_line":""},{"line_number":774,"context_line":"        return entity"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def assertRoleAssignmentInListResponse(self, resp, ref, url\u003dNone,"},{"line_number":777,"context_line":"                                           expected\u003d1):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcY8%3D","line":774,"updated":"2013-07-01 20:55:11.000000000","message":"Is this used? If not, remove it.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        if url:"},{"line_number":772,"context_line":"            self.assertIn(url, entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":773,"context_line":""},{"line_number":774,"context_line":"        return entity"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def assertRoleAssignmentInListResponse(self, resp, ref, url\u003dNone,"},{"line_number":777,"context_line":"                                           expected\u003d1):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZLE%3D","line":774,"in_reply_to":"AAAAPn%2F%2FcY8%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def assertRoleAssignmentInListResponse(self, resp, ref, url\u003dNone,"},{"line_number":777,"context_line":"                                           expected\u003d1):"},{"line_number":778,"context_line":"        self.found_count \u003d 0"},{"line_number":779,"context_line":"        for entity in resp.result.get(\u0027role_assignments\u0027):"},{"line_number":780,"context_line":"            try:"},{"line_number":781,"context_line":"                self.assertValidRoleAssignment(entity, ref, url)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcYk%3D","line":778,"updated":"2013-07-01 20:55:11.000000000","message":"why is this a member variable?","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def assertRoleAssignmentInListResponse(self, resp, ref, url\u003dNone,"},{"line_number":777,"context_line":"                                           expected\u003d1):"},{"line_number":778,"context_line":"        self.found_count \u003d 0"},{"line_number":779,"context_line":"        for entity in resp.result.get(\u0027role_assignments\u0027):"},{"line_number":780,"context_line":"            try:"},{"line_number":781,"context_line":"                self.assertValidRoleAssignment(entity, ref, url)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZK8%3D","line":778,"in_reply_to":"AAAAPn%2F%2FcYk%3D","updated":"2013-07-02 20:54:49.000000000","message":"shouldn\u0027t be...fixed","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":780,"context_line":"            try:"},{"line_number":781,"context_line":"                self.assertValidRoleAssignment(entity, ref, url)"},{"line_number":782,"context_line":"            except Exception:"},{"line_number":783,"context_line":"                pass"},{"line_number":784,"context_line":"            else:"},{"line_number":785,"context_line":"                self.found_count +\u003d 1"},{"line_number":786,"context_line":"        self.assertEqual(self.found_count, expected)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcYc%3D","line":783,"updated":"2013-07-01 20:55:11.000000000","message":"Add a comment why it\u0027s OK to ignore this.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":780,"context_line":"            try:"},{"line_number":781,"context_line":"                self.assertValidRoleAssignment(entity, ref, url)"},{"line_number":782,"context_line":"            except Exception:"},{"line_number":783,"context_line":"                pass"},{"line_number":784,"context_line":"            else:"},{"line_number":785,"context_line":"                self.found_count +\u003d 1"},{"line_number":786,"context_line":"        self.assertEqual(self.found_count, expected)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZKs%3D","line":783,"in_reply_to":"AAAAPn%2F%2FcYc%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        if url:"},{"line_number":776,"context_line":"            self.assertIn(url, entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def assertRoleAssignmentInListResponse(self, resp, ref, url\u003dNone,"},{"line_number":779,"context_line":"                                           expected\u003d1):"},{"line_number":780,"context_line":"        found_count \u003d 0"},{"line_number":781,"context_line":"        for entity in resp.result.get(\u0027role_assignments\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVzE%3D","line":778,"updated":"2013-07-03 18:40:26.000000000","message":"suggest change name of url parameter to assignment_url or link_url... something more descriptive.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        if url:"},{"line_number":776,"context_line":"            self.assertIn(url, entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def assertRoleAssignmentInListResponse(self, resp, ref, url\u003dNone,"},{"line_number":779,"context_line":"                                           expected\u003d1):"},{"line_number":780,"context_line":"        found_count \u003d 0"},{"line_number":781,"context_line":"        for entity in resp.result.get(\u0027role_assignments\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVZ4%3D","line":778,"in_reply_to":"AAAAPn%2F%2FVzE%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":780,"context_line":"        found_count \u003d 0"},{"line_number":781,"context_line":"        for entity in resp.result.get(\u0027role_assignments\u0027):"},{"line_number":782,"context_line":"            try:"},{"line_number":783,"context_line":"                self.assertValidRoleAssignment(entity, ref, url)"},{"line_number":784,"context_line":"            except Exception:"},{"line_number":785,"context_line":"                # It doesn\u0027t match, so let\u0027s go onto the next one"},{"line_number":786,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVyw%3D","line":783,"updated":"2013-07-03 18:40:26.000000000","message":"use named arguments for named parameters, e.g.\n\n self.assertValidRoleAssignment(entity, ref\u003dref, url\u003durl)","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":780,"context_line":"        found_count \u003d 0"},{"line_number":781,"context_line":"        for entity in resp.result.get(\u0027role_assignments\u0027):"},{"line_number":782,"context_line":"            try:"},{"line_number":783,"context_line":"                self.assertValidRoleAssignment(entity, ref, url)"},{"line_number":784,"context_line":"            except Exception:"},{"line_number":785,"context_line":"                # It doesn\u0027t match, so let\u0027s go onto the next one"},{"line_number":786,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVaU%3D","line":783,"in_reply_to":"AAAAPn%2F%2FVyw%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":789,"context_line":"        self.assertEqual(found_count, expected)"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    def assertRoleAssignmentNotInListResponse(self, resp, ref, url\u003dNone):"},{"line_number":792,"context_line":"        self.assertRoleAssignmentInListResponse(resp, ref, url, 0)"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    # policy validation"},{"line_number":795,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVyg%3D","line":792,"updated":"2013-07-03 18:40:26.000000000","message":"use named arguments for named parameters, e.g.\n\n self.assertRoleAssignmentInListResponse(resp, ref\u003dref, url\u003durl, expected\u003d0)","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":789,"context_line":"        self.assertEqual(found_count, expected)"},{"line_number":790,"context_line":""},{"line_number":791,"context_line":"    def assertRoleAssignmentNotInListResponse(self, resp, ref, url\u003dNone):"},{"line_number":792,"context_line":"        self.assertRoleAssignmentInListResponse(resp, ref, url, 0)"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    # policy validation"},{"line_number":795,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVZ8%3D","line":792,"in_reply_to":"AAAAPn%2F%2FVyg%3D","updated":"2013-07-03 20:31:03.000000000","message":"Done","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"}],"tests/test_v3_identity.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":670,"context_line":"                      \u0027scope\u0027: {\u0027project\u0027: {\u0027id\u0027: project_id}}}"},{"line_number":671,"context_line":"        return (url, entity)"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"    def test_crud_role_assignments(self):"},{"line_number":674,"context_line":"        \"\"\"Call ``GET /role_assignments``."},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        The sample data set up already has a user, group, project"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcX4%3D","line":673,"updated":"2013-07-01 20:55:11.000000000","message":"suggest not call this crud since role assignments only supports read.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":670,"context_line":"                      \u0027scope\u0027: {\u0027project\u0027: {\u0027id\u0027: project_id}}}"},{"line_number":671,"context_line":"        return (url, entity)"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"    def test_crud_role_assignments(self):"},{"line_number":674,"context_line":"        \"\"\"Call ``GET /role_assignments``."},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        The sample data set up already has a user, group, project"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZKY%3D","line":673,"in_reply_to":"AAAAPn%2F%2FcX4%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0b8e74154da5f60f2054ce0201bd12e9c2ad56c2","unresolved":false,"context_lines":[{"line_number":673,"context_line":"    def test_crud_role_assignments(self):"},{"line_number":674,"context_line":"        \"\"\"Call ``GET /role_assignments``."},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        The sample data set up already has a user, group, project"},{"line_number":677,"context_line":"        that is part of self.domain. We use these plus a new user"},{"line_number":678,"context_line":"        we create as our data set, making sure we ignore any"},{"line_number":679,"context_line":"        role assignments that are already in existence."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcXc%3D","line":676,"updated":"2013-07-01 20:55:11.000000000","message":"add \"and\" before project.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":673,"context_line":"    def test_crud_role_assignments(self):"},{"line_number":674,"context_line":"        \"\"\"Call ``GET /role_assignments``."},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        The sample data set up already has a user, group, project"},{"line_number":677,"context_line":"        that is part of self.domain. We use these plus a new user"},{"line_number":678,"context_line":"        we create as our data set, making sure we ignore any"},{"line_number":679,"context_line":"        role assignments that are already in existence."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZKU%3D","line":676,"in_reply_to":"AAAAPn%2F%2FcXc%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6b1228aac9dc37554969533b7a5e402c353805f","unresolved":false,"context_lines":[{"line_number":696,"context_line":""},{"line_number":697,"context_line":"        \"\"\""},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        # A temporary user for some the tests that is different that the"},{"line_number":700,"context_line":"        # one in the default fixtures"},{"line_number":701,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":702,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fcvo%3D","line":699,"updated":"2013-07-01 18:38:02.000000000","message":"This comment is kind of hard to follow. Might need some rewording.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":696,"context_line":""},{"line_number":697,"context_line":"        \"\"\""},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        # A temporary user for some the tests that is different that the"},{"line_number":700,"context_line":"        # one in the default fixtures"},{"line_number":701,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":702,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZJ8%3D","line":699,"in_reply_to":"AAAAPn%2F%2Fcvo%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6b1228aac9dc37554969533b7a5e402c353805f","unresolved":false,"context_lines":[{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        \"\"\""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"        # A temporary user for some the tests that is different that the"},{"line_number":846,"context_line":"        # one in the default fixtures"},{"line_number":847,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":848,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcvI%3D","line":845,"updated":"2013-07-01 18:38:02.000000000","message":"Same comment as above.","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        \"\"\""},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"        # A temporary user for some the tests that is different that the"},{"line_number":846,"context_line":"        # one in the default fixtures"},{"line_number":847,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":848,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZJ4%3D","line":845,"in_reply_to":"AAAAPn%2F%2FcvI%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6b1228aac9dc37554969533b7a5e402c353805f","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        # one in the default fixtures"},{"line_number":847,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":848,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":849,"context_line":"        self.user1[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":850,"context_line":"        self.identity_api.create_user(self.user1[\u0027id\u0027], self.user1)"},{"line_number":851,"context_line":"        self.user2 \u003d self.new_user_ref("},{"line_number":852,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcvE%3D","line":849,"updated":"2013-07-01 18:38:02.000000000","message":"A lot of this seem common between the other tests, is there a way this could be pulled out to a setUp() method?","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        # one in the default fixtures"},{"line_number":847,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":848,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":849,"context_line":"        self.user1[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":850,"context_line":"        self.identity_api.create_user(self.user1[\u0027id\u0027], self.user1)"},{"line_number":851,"context_line":"        self.user2 \u003d self.new_user_ref("},{"line_number":852,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZJU%3D","line":849,"in_reply_to":"AAAAPn%2F%2FcvE%3D","updated":"2013-07-02 20:54:49.000000000","message":"We could possibly, but try to typically keep to minimum that amount of prep work each test does...i.e. only create what you need.  Creating a standard setup would likely either create too little (to be common) or to much...so decided against doing that","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be2b6adff3b2798e7e3c66c54f56fd8bdf6c73ed","unresolved":false,"context_lines":[{"line_number":963,"context_line":"        self.assertRoleAssignmentInListResponse(r, ud1_entity, url\u003dud1_url)"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        # ...and for the grand-daddy of them all, simulate the request"},{"line_number":966,"context_line":"        # that would generate the list or effective roles in a project"},{"line_number":967,"context_line":"        # scoped token."},{"line_number":968,"context_line":""},{"line_number":969,"context_line":"        collection_url \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FcnA%3D","line":966,"updated":"2013-07-01 19:19:44.000000000","message":"typo...\"list of effective...\"","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ac06bff99dfee44dbfaa3d6506080ddfb540da2f","unresolved":false,"context_lines":[{"line_number":963,"context_line":"        self.assertRoleAssignmentInListResponse(r, ud1_entity, url\u003dud1_url)"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        # ...and for the grand-daddy of them all, simulate the request"},{"line_number":966,"context_line":"        # that would generate the list or effective roles in a project"},{"line_number":967,"context_line":"        # scoped token."},{"line_number":968,"context_line":""},{"line_number":969,"context_line":"        collection_url \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FZJQ%3D","line":966,"in_reply_to":"AAAAPn%2F%2FcnA%3D","updated":"2013-07-02 20:54:49.000000000","message":"Done","commit_id":"0c10f9df4e5221e14325c7a406afc7917db396dc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"484945ddd79503972318bc46252edce60e8a58cd","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"            project_id\u003dself.project1[\u0027id\u0027], user_id\u003dself.user1[\u0027id\u0027],"},{"line_number":1065,"context_line":"            role_id\u003dself.role1[\u0027id\u0027])"},{"line_number":1066,"context_line":"        self.assertRoleAssignmentInListResponse(r, up_entity, url\u003dup_url)"},{"line_number":1067,"context_line":"        self.assertRoleAssignmentInListResponse(r, up1_entity, url\u003dup1_url)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYP4%3D","line":1067,"updated":"2013-07-02 23:58:38.000000000","message":"XML test cases? See test_v3_auth.py, just need to subclass IdentityTestCase and change the content-type to xml","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e51a1dec250ad7492a9053ca030d1ce5b6a8f34","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"            project_id\u003dself.project1[\u0027id\u0027], user_id\u003dself.user1[\u0027id\u0027],"},{"line_number":1065,"context_line":"            role_id\u003dself.role1[\u0027id\u0027])"},{"line_number":1066,"context_line":"        self.assertRoleAssignmentInListResponse(r, up_entity, url\u003dup_url)"},{"line_number":1067,"context_line":"        self.assertRoleAssignmentInListResponse(r, up1_entity, url\u003dup1_url)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYF4%3D","line":1067,"in_reply_to":"AAAAPn%2F%2FYP4%3D","updated":"2013-07-03 01:10:57.000000000","message":"Excellent idea! Unfortunately I just tried that and a bunch of other tests broke - so I have raised a separate bug to implement xml tests for Identity","commit_id":"876cd2ea5bcf7889d5c58d287eb09ed6cea577e7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        self.assertValidRoleListResponse(r, expected_length\u003d0)"},{"line_number":629,"context_line":"        self.assertIn(collection_url, r.result[\u0027links\u0027][\u0027self\u0027])"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"    def _build_role_assignment_url_and_entity("},{"line_number":632,"context_line":"            self, role_id, user_id\u003dNone, group_id\u003dNone, domain_id\u003dNone,"},{"line_number":633,"context_line":"            project_id\u003dNone):"},{"line_number":634,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVyI%3D","line":631,"updated":"2013-07-03 18:40:26.000000000","message":"seems like this code should be in the server since the server does the same thing.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        self.assertValidRoleListResponse(r, expected_length\u003d0)"},{"line_number":629,"context_line":"        self.assertIn(collection_url, r.result[\u0027links\u0027][\u0027self\u0027])"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"    def _build_role_assignment_url_and_entity("},{"line_number":632,"context_line":"            self, role_id, user_id\u003dNone, group_id\u003dNone, domain_id\u003dNone,"},{"line_number":633,"context_line":"            project_id\u003dNone):"},{"line_number":634,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVYE%3D","line":631,"in_reply_to":"AAAAPn%2F%2FVyI%3D","updated":"2013-07-03 20:31:03.000000000","message":"somewhat, I agree, but then always good to have your test code not rely too much on utilities in the thing you are testing :-)","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        # Since the default fixtures already assign some roles to the"},{"line_number":700,"context_line":"        # user it creates, we also need a new user that will not have any"},{"line_number":701,"context_line":"        # existing assignments"},{"line_number":702,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":703,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":704,"context_line":"        self.user1[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":705,"context_line":"        self.identity_api.create_user(self.user1[\u0027id\u0027], self.user1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVww%3D","line":702,"updated":"2013-07-03 18:40:26.000000000","message":"does user1 need to be a member? if not, don\u0027t make it a member.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        # Since the default fixtures already assign some roles to the"},{"line_number":700,"context_line":"        # user it creates, we also need a new user that will not have any"},{"line_number":701,"context_line":"        # existing assignments"},{"line_number":702,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":703,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":704,"context_line":"        self.user1[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":705,"context_line":"        self.identity_api.create_user(self.user1[\u0027id\u0027], self.user1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVZU%3D","line":702,"in_reply_to":"AAAAPn%2F%2FVww%3D","updated":"2013-07-03 20:31:03.000000000","message":"A user has to be owned by some domain....","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6a1ac05974d0681bb8ce75af70c0d9722ac561c0","unresolved":false,"context_lines":[{"line_number":906,"context_line":"        r \u003d self.get(collection_url)"},{"line_number":907,"context_line":"        self.assertValidRoleAssignmentListResponse(r)"},{"line_number":908,"context_line":"        self.assertEqual(len(r.result.get(\u0027role_assignments\u0027)),"},{"line_number":909,"context_line":"                         existing_assignments + 2)"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":"    def test_filtered_role_assignments(self):"},{"line_number":912,"context_line":"        \"\"\"Call ``GET /role_assignments?filters``."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVpQ%3D","line":909,"updated":"2013-07-03 18:40:26.000000000","message":"there\u0027s lots of duplicate code here that could be consolidated.","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0fd73cedb18e7c089ed3b993b5ac1f7f080c7b4","unresolved":false,"context_lines":[{"line_number":906,"context_line":"        r \u003d self.get(collection_url)"},{"line_number":907,"context_line":"        self.assertValidRoleAssignmentListResponse(r)"},{"line_number":908,"context_line":"        self.assertEqual(len(r.result.get(\u0027role_assignments\u0027)),"},{"line_number":909,"context_line":"                         existing_assignments + 2)"},{"line_number":910,"context_line":""},{"line_number":911,"context_line":"    def test_filtered_role_assignments(self):"},{"line_number":912,"context_line":"        \"\"\"Call ``GET /role_assignments?filters``."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVYc%3D","line":909,"in_reply_to":"AAAAPn%2F%2FVpQ%3D","updated":"2013-07-03 20:31:03.000000000","message":"we could do that...I have tended to minimze being too clever in the test code so that you can see exactly what is happening, as opposed to too much \"depth\" in terms of consolidated functions.  If you feel strongly about it, I\u0027ll look at re-working it, otherwise maybe OK for now?","commit_id":"49d18829b2638bccf6c804bf225e11e1b728e66d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e256db9edaca332657e9ec8d7aaa59e9eaec3a6","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        # Since the default fixtures already assign some roles to the"},{"line_number":700,"context_line":"        # user it creates, we also need a new user that will not have any"},{"line_number":701,"context_line":"        # existing assignments"},{"line_number":702,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":703,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":704,"context_line":"        self.user1[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":705,"context_line":"        self.identity_api.create_user(self.user1[\u0027id\u0027], self.user1)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FVTA%3D","line":702,"updated":"2013-07-03 20:42:07.000000000","message":"if user1 doesn\u0027t have to be a member variable, change this so that user1 isn\u0027t a member variable. i.e., remove self. if it\u0027s not needed.","commit_id":"fa10d4945ca9658eff02b1d8e917fde50d6576ce"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2601f191dd9087615357cad12a142c45e3b236d","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        # Since the default fixtures already assign some roles to the"},{"line_number":700,"context_line":"        # user it creates, we also need a new user that will not have any"},{"line_number":701,"context_line":"        # existing assignments"},{"line_number":702,"context_line":"        self.user1 \u003d self.new_user_ref("},{"line_number":703,"context_line":"            domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":704,"context_line":"        self.user1[\u0027password\u0027] \u003d uuid.uuid4().hex"},{"line_number":705,"context_line":"        self.identity_api.create_user(self.user1[\u0027id\u0027], self.user1)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FVRU%3D","line":702,"in_reply_to":"AAAAPn%2F%2FVTA%3D","updated":"2013-07-03 20:52:15.000000000","message":"ahh, right...probably better to do that as a general re-factor of the whole v3 identity test...since that seems to be the style of most tests (i.e. to use member variables where, in fact, the don\u0027t need to be).","commit_id":"fa10d4945ca9658eff02b1d8e917fde50d6576ce"}]}
