)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add CRUD support for domain specific roles"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch expands the definition of a role to include an"},{"line_number":10,"context_line":"optional domain_id, which is included in the unqiqueness"},{"line_number":11,"context_line":"contraint along with the role name."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The V8 role driver wrapper is updated to ensure that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"5a5ae5dd_967923ff","line":10,"updated":"2016-02-03 22:13:47.000000000","message":"uniqueness","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add CRUD support for domain specific roles"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch expands the definition of a role to include an"},{"line_number":10,"context_line":"optional domain_id, which is included in the unqiqueness"},{"line_number":11,"context_line":"contraint along with the role name."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The V8 role driver wrapper is updated to ensure that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"5a5ae5dd_40642b21","line":10,"in_reply_to":"5a5ae5dd_967923ff","updated":"2016-02-04 14:22:41.000000000","message":"Done","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def list_roles_wrapper(self, context):"},{"line_number":314,"context_line":"        # If there is no domain_id filter defined, then we only want to return"},{"line_number":315,"context_line":"        # global roles, so we set the domain_id filter to None."},{"line_number":316,"context_line":"        params \u003d context[\u0027query_string\u0027]"},{"line_number":317,"context_line":"        if \u0027domain_id\u0027 not in params:"},{"line_number":318,"context_line":"            context[\u0027query_string\u0027][\u0027domain_id\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_994dd474","line":315,"updated":"2016-02-03 22:13:47.000000000","message":"If domain_id is set, are we returning only domain specific roles, or domain specific plus global?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"88cd38d55983376ca1aab71727e6a773d801087a","unresolved":false,"context_lines":[{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def list_roles_wrapper(self, context):"},{"line_number":314,"context_line":"        # If there is no domain_id filter defined, then we only want to return"},{"line_number":315,"context_line":"        # global roles, so we set the domain_id filter to None."},{"line_number":316,"context_line":"        params \u003d context[\u0027query_string\u0027]"},{"line_number":317,"context_line":"        if \u0027domain_id\u0027 not in params:"},{"line_number":318,"context_line":"            context[\u0027query_string\u0027][\u0027domain_id\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_ea78962d","line":315,"in_reply_to":"5a5ae5dd_994dd474","updated":"2016-02-04 06:58:36.000000000","message":"domain specific only","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        params \u003d context[\u0027query_string\u0027]"},{"line_number":317,"context_line":"        if \u0027domain_id\u0027 not in params:"},{"line_number":318,"context_line":"            context[\u0027query_string\u0027][\u0027domain_id\u0027] \u003d None"},{"line_number":319,"context_line":"        return self.list_roles(context)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    @controller.protected()"},{"line_number":322,"context_line":"    def get_role(self, context, role_id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_a303cdb7","line":319,"updated":"2016-02-10 14:11:11.000000000","message":"We shouldn\u0027t need this logic here. If domain_id filter is not in the driver_hints, the driver must know it doesn\u0027t need to filter on it. I don\u0027t see the point of this code","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        params \u003d context[\u0027query_string\u0027]"},{"line_number":317,"context_line":"        if \u0027domain_id\u0027 not in params:"},{"line_number":318,"context_line":"            context[\u0027query_string\u0027][\u0027domain_id\u0027] \u003d None"},{"line_number":319,"context_line":"        return self.list_roles(context)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    @controller.protected()"},{"line_number":322,"context_line":"    def get_role(self, context, role_id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_f0bbb70c","line":319,"in_reply_to":"3a57f1b5_a303cdb7","updated":"2016-02-10 17:13:23.000000000","message":"Ah, but the point is that is DOES need to filter on it - since, we say in the API that if we default to list only global roles if not domain_id filter is given. And global roles means role.domain_id\u003d\u003dNone","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"}],"keystone/assignment/core.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":1680,"context_line":"            self.driver.create_role(role_id, new_role))"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"    def list_roles(self, hints):"},{"line_number":1683,"context_line":"        return self._append_null_domain_id(self.driver.list_roles(hints))"},{"line_number":1684,"context_line":""},{"line_number":1685,"context_line":"    def list_roles_from_ids(self, role_ids):"},{"line_number":1686,"context_line":"        return self._append_null_domain_id("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_964a8382","line":1683,"updated":"2016-02-03 22:13:47.000000000","message":"this seems quite chatty.  Do we really need to makethe call to default a single field on every function?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":1680,"context_line":"            self.driver.create_role(role_id, new_role))"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"    def list_roles(self, hints):"},{"line_number":1683,"context_line":"        return self._append_null_domain_id(self.driver.list_roles(hints))"},{"line_number":1684,"context_line":""},{"line_number":1685,"context_line":"    def list_roles_from_ids(self, role_ids):"},{"line_number":1686,"context_line":"        return self._append_null_domain_id("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_eac65648","line":1683,"in_reply_to":"5a5ae5dd_964a8382","updated":"2016-02-04 14:22:41.000000000","message":"Agreed it is chatty, but seem clean this way - and this is only for people using the legacy driver interface (for which, in general, we say there could be performance ramifications)","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"}],"keystone/assignment/role_backends/ldap.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e61388cfdce356bde8e9c3d2912208e4b39211e5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Role(assignment.RoleDriverV9):"},{"line_number":32,"context_line":"    @versionutils.deprecated("},{"line_number":33,"context_line":"        versionutils.deprecated.MITAKA,"},{"line_number":34,"context_line":"        what\u003d\u0027ldap role\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a7b0d38_27ca254f","line":31,"range":{"start_line":31,"start_character":32,"end_line":31,"end_character":34},"updated":"2015-12-28 00:06:43.000000000","message":"This is actually fixed in another patch, need to mplied-roles to be re-based on that in order to remove this....","commit_id":"aa3002c22582c9cb0fecccb8e0e33d2ea9871759"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"11b98c1b6bfd1af425763b9a6b8ad0d191ba51e2","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Role(assignment.RoleDriverV9):"},{"line_number":32,"context_line":"    @versionutils.deprecated("},{"line_number":33,"context_line":"        versionutils.deprecated.MITAKA,"},{"line_number":34,"context_line":"        what\u003d\u0027ldap role\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_a71935d9","line":31,"range":{"start_line":31,"start_character":32,"end_line":31,"end_character":34},"updated":"2015-12-28 00:21:52.000000000","message":"this is fixed in a separate patch...which implied roles needs to be rebased upon...","commit_id":"9c58bc0d63caa635ab83792350c867ccb0cdab4b"}],"keystone/assignment/role_backends/sql.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        new_role \u003d _ensure_domain_id_not_none(role)"},{"line_number":36,"context_line":"        with sql.transaction() as session:"},{"line_number":37,"context_line":"            ref \u003d RoleTable.from_dict(new_role)"},{"line_number":38,"context_line":"            session.add(ref)"},{"line_number":39,"context_line":"            return ref.to_dict()"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_160d333e","line":37,"updated":"2016-02-03 22:13:47.000000000","message":"shouldn\u0027t from_dict handle the default?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        new_role \u003d _ensure_domain_id_not_none(role)"},{"line_number":36,"context_line":"        with sql.transaction() as session:"},{"line_number":37,"context_line":"            ref \u003d RoleTable.from_dict(new_role)"},{"line_number":38,"context_line":"            session.add(ref)"},{"line_number":39,"context_line":"            return ref.to_dict()"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_4f3bf3d1","line":37,"in_reply_to":"5a5ae5dd_160d333e","updated":"2016-02-04 14:22:41.000000000","message":"Damn good idea! Done.","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":100,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":101,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":102,"context_line":"            return ref.to_dict()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def delete_role(self, role_id):"},{"line_number":105,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_59099c2b","line":102,"updated":"2016-02-03 22:13:47.000000000","message":"can\u0027t to_dict do the defaulting?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                if attr !\u003d \u0027id\u0027:"},{"line_number":100,"context_line":"                    setattr(ref, attr, getattr(new_role, attr))"},{"line_number":101,"context_line":"            ref.extra \u003d new_role.extra"},{"line_number":102,"context_line":"            return ref.to_dict()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def delete_role(self, role_id):"},{"line_number":105,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_8030e302","line":102,"in_reply_to":"5a5ae5dd_59099c2b","updated":"2016-02-04 14:22:41.000000000","message":"It does....","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    # configurations, it is better to still use the sql uniqueness constraint."},{"line_number":193,"context_line":"    # Since the support for a nullable component of a uniqueness constraint"},{"line_number":194,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":195,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":198,"context_line":"        d \u003d super(RoleTable, self).to_dict("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_f91ac86d","line":195,"updated":"2016-02-03 22:13:47.000000000","message":"++","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"},{"line_number":168,"context_line":"    # NOTE(henry-nash): From the manager and above perspective, the domain_id"},{"line_number":169,"context_line":"    # is nullable.  However, to ensure uniqueness in multi-process"},{"line_number":170,"context_line":"    # configurations, it is better to still use the sql uniqueness constraint."},{"line_number":171,"context_line":"    # Since the support for a nullable component of a uniqueness constraint"},{"line_number":172,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":173,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":176,"context_line":"        d \u003d super(RoleTable, self).to_dict("}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_632b95ec","line":173,"range":{"start_line":168,"start_character":4,"end_line":173,"end_character":60},"updated":"2016-02-10 14:11:11.000000000","message":"Would it be better to have this comment with the NULL_DOMAIN_ID definition ?","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"},{"line_number":168,"context_line":"    # NOTE(henry-nash): From the manager and above perspective, the domain_id"},{"line_number":169,"context_line":"    # is nullable.  However, to ensure uniqueness in multi-process"},{"line_number":170,"context_line":"    # configurations, it is better to still use the sql uniqueness constraint."},{"line_number":171,"context_line":"    # Since the support for a nullable component of a uniqueness constraint"},{"line_number":172,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":173,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":176,"context_line":"        d \u003d super(RoleTable, self).to_dict("}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_f00097ac","line":173,"range":{"start_line":168,"start_character":4,"end_line":173,"end_character":60},"in_reply_to":"3a57f1b5_632b95ec","updated":"2016-02-10 17:13:23.000000000","message":"when I first wrote this I did not realise we had to intercept the filters (so there was no use of NULL_DOMAIN_ID outside of this class)....but since we do, I think you are right. I\u0027ll move it.","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse,"},{"line_number":196,"context_line":"                           server_default\u003dNULL_DOMAIN_ID)"},{"line_number":197,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":198,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027, \u0027domain_id\u0027, ), {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_83cc9136","line":198,"range":{"start_line":198,"start_character":62,"end_line":198,"end_character":64},"updated":"2016-02-10 14:11:11.000000000","message":"(nit) no need for the trailing comma","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse,"},{"line_number":196,"context_line":"                           server_default\u003dNULL_DOMAIN_ID)"},{"line_number":197,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":198,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027name\u0027, \u0027domain_id\u0027, ), {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_10cbf354","line":198,"range":{"start_line":198,"start_character":62,"end_line":198,"end_character":64},"in_reply_to":"3a57f1b5_83cc9136","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"38444d1ad10fef1ea4418b51f19217449e49d729","unresolved":false,"context_lines":[{"line_number":21,"context_line":"# multi-process configurations, it is better to still use a sql uniqueness"},{"line_number":22,"context_line":"# constraint. Since the support for a nullable component of a uniqueness"},{"line_number":23,"context_line":"# constraint across different sql databases is mixed, we instead store a"},{"line_number":24,"context_line":"# special value to represent null, as defined in NULL_DOMAIN_ID beloe."},{"line_number":25,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003cnull\u003e\u003e\u0027"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3a57f1b5_4a02fa0c","line":24,"range":{"start_line":24,"start_character":64,"end_line":24,"end_character":69},"updated":"2016-02-11 07:44:36.000000000","message":"below*","commit_id":"407eabde417e85bb35bc7cbf1995857f4b20aeca"}],"keystone/assignment/routers.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        routers.append("},{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources,"},{"line_number":75,"context_line":"                          overrides\u003d{\u0027list\u0027: \u0027list_roles_wrapper\u0027}))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":78,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_d94b4c58","line":75,"updated":"2016-02-03 22:13:47.000000000","message":"what does this do?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        routers.append("},{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources,"},{"line_number":75,"context_line":"                          overrides\u003d{\u0027list\u0027: \u0027list_roles_wrapper\u0027}))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":78,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_8adc8213","line":75,"in_reply_to":"5a5ae5dd_d94b4c58","updated":"2016-02-04 14:22:41.000000000","message":"It allows you to use the standard v3 router setup and override one of the standard methods","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        routers.append("},{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources,"},{"line_number":75,"context_line":"                          overrides\u003d{\u0027list\u0027: \u0027list_roles_wrapper\u0027}))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":78,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_43ed398a","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":68},"updated":"2016-02-10 14:11:11.000000000","message":"We don\u0027t need this, see my comment on the controller","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        routers.append("},{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources,"},{"line_number":75,"context_line":"                          overrides\u003d{\u0027list\u0027: \u0027list_roles_wrapper\u0027}))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":78,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_30f62f90","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":68},"in_reply_to":"3a57f1b5_43ed398a","updated":"2016-02-10 17:13:23.000000000","message":"I think we do...see my reply (on the controller) :-)","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"}],"keystone/common/router.py":[{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"c80392084e436ac88e7e471c532b19f029a0c0c2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    def __init__(self, controller, collection_key, key,"},{"line_number":21,"context_line":"                 resource_descriptions\u003dNone,"},{"line_number":22,"context_line":"                 is_entity_implemented\u003dTrue,"},{"line_number":23,"context_line":"                 overrides\u003dNone):"},{"line_number":24,"context_line":"        self.controller \u003d controller"},{"line_number":25,"context_line":"        self.key \u003d key"},{"line_number":26,"context_line":"        self.collection_key \u003d collection_key"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_2a641bb7","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":17},"updated":"2016-01-11 12:04:12.000000000","message":"Why not explicitly add four routes in role router? Things would be simple that way.","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"72ffd8d5c4f8c5a610d9b88343c5b0ea76431068","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    def __init__(self, controller, collection_key, key,"},{"line_number":21,"context_line":"                 resource_descriptions\u003dNone,"},{"line_number":22,"context_line":"                 is_entity_implemented\u003dTrue,"},{"line_number":23,"context_line":"                 overrides\u003dNone):"},{"line_number":24,"context_line":"        self.controller \u003d controller"},{"line_number":25,"context_line":"        self.key \u003d key"},{"line_number":26,"context_line":"        self.collection_key \u003d collection_key"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_2c737b4f","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":17},"in_reply_to":"fa69d971_2a641bb7","updated":"2016-01-11 22:32:47.000000000","message":"Well, given that we already create all the routes this way, it seemed more obvious change to override just one entry point to do it this way.  And, we get some re-use benefit since I know at least one other place where we could have used this override ability rather than create the routes by hand.","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        mapper.connect("},{"line_number":45,"context_line":"            collection_path,"},{"line_number":46,"context_line":"            controller\u003dself.controller,"},{"line_number":47,"context_line":"            action\u003d_assign_action(\u0027create\u0027, self.key, self.overrides),"},{"line_number":48,"context_line":"            conditions\u003ddict(method\u003d[\u0027POST\u0027]))"},{"line_number":49,"context_line":"        mapper.connect("},{"line_number":50,"context_line":"            collection_path,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_59a51c02","line":47,"updated":"2016-02-03 22:13:47.000000000","message":"I assume this is for adding the domain_id as a query param where it was not there before?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        mapper.connect("},{"line_number":45,"context_line":"            collection_path,"},{"line_number":46,"context_line":"            controller\u003dself.controller,"},{"line_number":47,"context_line":"            action\u003d_assign_action(\u0027create\u0027, self.key, self.overrides),"},{"line_number":48,"context_line":"            conditions\u003ddict(method\u003d[\u0027POST\u0027]))"},{"line_number":49,"context_line":"        mapper.connect("},{"line_number":50,"context_line":"            collection_path,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_ea509660","line":47,"in_reply_to":"5a5ae5dd_59a51c02","updated":"2016-02-04 14:22:41.000000000","message":"well, this is adding the standard ability to override one of the methods....which we use to override the list method to add the domain_id query param. We need to do it this way so that we end up calling the same list_roles method that is checked in the policy file AFTER adding in the domain_id filter default setting","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    def __init__(self, controller, collection_key, key,"},{"line_number":21,"context_line":"                 resource_descriptions\u003dNone,"},{"line_number":22,"context_line":"                 is_entity_implemented\u003dTrue,"},{"line_number":23,"context_line":"                 overrides\u003dNone):"},{"line_number":24,"context_line":"        self.controller \u003d controller"},{"line_number":25,"context_line":"        self.key \u003d key"},{"line_number":26,"context_line":"        self.collection_key \u003d collection_key"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_e302253e","line":23,"range":{"start_line":23,"start_character":31,"end_line":23,"end_character":33},"updated":"2016-02-10 14:11:11.000000000","message":"We don\u0027t need these changes, see my comment on the controller","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    def __init__(self, controller, collection_key, key,"},{"line_number":21,"context_line":"                 resource_descriptions\u003dNone,"},{"line_number":22,"context_line":"                 is_entity_implemented\u003dTrue,"},{"line_number":23,"context_line":"                 overrides\u003dNone):"},{"line_number":24,"context_line":"        self.controller \u003d controller"},{"line_number":25,"context_line":"        self.key \u003d key"},{"line_number":26,"context_line":"        self.collection_key \u003d collection_key"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_f0ef37ae","line":23,"range":{"start_line":23,"start_character":31,"end_line":23,"end_character":33},"in_reply_to":"3a57f1b5_e302253e","updated":"2016-02-10 17:13:23.000000000","message":"I think we do...see my reply (on the controller) :-)","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"}],"keystone/common/sql/migrate_repo/versions/088_domain_specific_roles.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    role_table \u003d sql.Table(_ROLE_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":28,"context_line":"    domain_id \u003d sql.Column(_DOMAIN_ID_COLUMN_NAME, sql.String(64),"},{"line_number":29,"context_line":"                           nullable\u003dTrue, server_default\u003d_NULL_DOMAIN_ID)"},{"line_number":30,"context_line":"    role_table.create_column(domain_id)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    migrate.UniqueConstraint(role_table.c.name,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_7981f849","line":29,"updated":"2016-02-03 22:13:47.000000000","message":"Do we want to leave this as nullable, or migrate, default, and make it non-nullable?","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    role_table \u003d sql.Table(_ROLE_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":28,"context_line":"    domain_id \u003d sql.Column(_DOMAIN_ID_COLUMN_NAME, sql.String(64),"},{"line_number":29,"context_line":"                           nullable\u003dTrue, server_default\u003d_NULL_DOMAIN_ID)"},{"line_number":30,"context_line":"    role_table.create_column(domain_id)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    migrate.UniqueConstraint(role_table.c.name,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_8fa56b05","line":29,"in_reply_to":"5a5ae5dd_7981f849","updated":"2016-02-04 14:22:41.000000000","message":"good catch, it should not be nullable","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"}],"keystone/tests/unit/backend/role/test_sql.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                          role4[\u0027id\u0027],"},{"line_number":77,"context_line":"                          role4)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def test_domain_specifc_separation(self):"},{"line_number":80,"context_line":"        domain1 \u003d unit.new_domain_ref()"},{"line_number":81,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain1[\u0027id\u0027])"},{"line_number":82,"context_line":"        role_ref1 \u003d self.role_api.create_role(role1[\u0027id\u0027], role1)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_59cafca2","line":79,"updated":"2016-02-03 22:13:47.000000000","message":"specific","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                          role4[\u0027id\u0027],"},{"line_number":77,"context_line":"                          role4)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def test_domain_specifc_separation(self):"},{"line_number":80,"context_line":"        domain1 \u003d unit.new_domain_ref()"},{"line_number":81,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain1[\u0027id\u0027])"},{"line_number":82,"context_line":"        role_ref1 \u003d self.role_api.create_role(role1[\u0027id\u0027], role1)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_942a562b","line":79,"in_reply_to":"5a5ae5dd_59cafca2","updated":"2016-02-04 14:22:41.000000000","message":"Done","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain1[\u0027id\u0027])"},{"line_number":82,"context_line":"        role_ref1 \u003d self.role_api.create_role(role1[\u0027id\u0027], role1)"},{"line_number":83,"context_line":"        self.assertDictEqual(role1, role_ref1)"},{"line_number":84,"context_line":"        # Check we can have the same named role in a different domain"},{"line_number":85,"context_line":"        domain2 \u003d unit.new_domain_ref()"},{"line_number":86,"context_line":"        role2 \u003d unit.new_role_ref(name\u003drole1[\u0027name\u0027], domain_id\u003ddomain2[\u0027id\u0027])"},{"line_number":87,"context_line":"        role_ref2 \u003d self.role_api.create_role(role2[\u0027id\u0027], role2)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_795d78e8","line":84,"updated":"2016-02-03 22:13:47.000000000","message":"Would not mind seeing these checks pulled out as assert functions.","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        role3 \u003d unit.new_role_ref(name\u003drole1[\u0027name\u0027])"},{"line_number":91,"context_line":"        role_ref3 \u003d self.role_api.create_role(role3[\u0027id\u0027], role3)"},{"line_number":92,"context_line":"        self.assertDictEqual(role3, role_ref3)"},{"line_number":93,"context_line":"        # Check that updating one doesn\u0027t change the others"},{"line_number":94,"context_line":"        role1[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":95,"context_line":"        self.role_api.update_role(role1[\u0027id\u0027], role1)"},{"line_number":96,"context_line":"        role_ref1 \u003d self.role_api.get_role(role1[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_d96cac9e","line":93,"updated":"2016-02-03 22:13:47.000000000","message":"make this a separate test.","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        role3 \u003d unit.new_role_ref(name\u003drole1[\u0027name\u0027])"},{"line_number":91,"context_line":"        role_ref3 \u003d self.role_api.create_role(role3[\u0027id\u0027], role3)"},{"line_number":92,"context_line":"        self.assertDictEqual(role3, role_ref3)"},{"line_number":93,"context_line":"        # Check that updating one doesn\u0027t change the others"},{"line_number":94,"context_line":"        role1[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":95,"context_line":"        self.role_api.update_role(role1[\u0027id\u0027], role1)"},{"line_number":96,"context_line":"        role_ref1 \u003d self.role_api.get_role(role1[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_34d0421f","line":93,"in_reply_to":"5a5ae5dd_d96cac9e","updated":"2016-02-04 14:22:41.000000000","message":"So i did try splitting it up, but due to the all the status required, it turned out more complex than it is now....","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                          self.role_api.get_role,"},{"line_number":41,"context_line":"                          role[\u0027id\u0027])"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_create_duplicate_role_domain_specifc_name_fails(self):"},{"line_number":44,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":45,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":46,"context_line":"        self.role_api.create_role(role1[\u0027id\u0027], role1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_a3066d1e","line":43,"range":{"start_line":43,"start_character":42,"end_line":43,"end_character":49},"updated":"2016-02-10 14:11:11.000000000","message":"(nit) specific","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                          self.role_api.get_role,"},{"line_number":41,"context_line":"                          role[\u0027id\u0027])"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def test_create_duplicate_role_domain_specifc_name_fails(self):"},{"line_number":44,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":45,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":46,"context_line":"        self.role_api.create_role(role1[\u0027id\u0027], role1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_3024ef0b","line":43,"range":{"start_line":43,"start_character":42,"end_line":43,"end_character":49},"in_reply_to":"3a57f1b5_a3066d1e","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":45,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":46,"context_line":"        self.role_api.create_role(role1[\u0027id\u0027], role1)"},{"line_number":47,"context_line":"        role2 \u003d unit.new_role_ref(id\u003drole1[\u0027id\u0027], name\u003drole1[\u0027name\u0027],"},{"line_number":48,"context_line":"                                  domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":49,"context_line":"        self.assertRaises(exception.Conflict,"},{"line_number":50,"context_line":"                          self.role_api.create_role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_fe371ae1","line":47,"range":{"start_line":47,"start_character":37,"end_line":47,"end_character":42},"updated":"2016-02-10 14:11:11.000000000","message":"It would be better to test with a different ID to make sure the conflict exception is from the name+domain_id and not from the ID","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":45,"context_line":"        role1 \u003d unit.new_role_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":46,"context_line":"        self.role_api.create_role(role1[\u0027id\u0027], role1)"},{"line_number":47,"context_line":"        role2 \u003d unit.new_role_ref(id\u003drole1[\u0027id\u0027], name\u003drole1[\u0027name\u0027],"},{"line_number":48,"context_line":"                                  domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":49,"context_line":"        self.assertRaises(exception.Conflict,"},{"line_number":50,"context_line":"                          self.role_api.create_role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_90604337","line":47,"range":{"start_line":47,"start_character":37,"end_line":47,"end_character":42},"in_reply_to":"3a57f1b5_fe371ae1","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.role_api.create_role(role1[\u0027id\u0027], role1)"},{"line_number":58,"context_line":"        # Try and update it to be domain specific"},{"line_number":59,"context_line":"        domainA \u003d unit.new_domain_ref()"},{"line_number":60,"context_line":"        role2 \u003d unit.new_role_ref(id\u003drole1[\u0027id\u0027], name\u003drole1[\u0027name\u0027],"},{"line_number":61,"context_line":"                                  domain_id\u003ddomainA[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":63,"context_line":"                          self.role_api.update_role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_5e82ee53","line":60,"range":{"start_line":60,"start_character":16,"end_line":60,"end_character":33},"updated":"2016-02-10 14:11:11.000000000","message":"why don\u0027t we just update the role1 ref we have already ?","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.role_api.create_role(role1[\u0027id\u0027], role1)"},{"line_number":58,"context_line":"        # Try and update it to be domain specific"},{"line_number":59,"context_line":"        domainA \u003d unit.new_domain_ref()"},{"line_number":60,"context_line":"        role2 \u003d unit.new_role_ref(id\u003drole1[\u0027id\u0027], name\u003drole1[\u0027name\u0027],"},{"line_number":61,"context_line":"                                  domain_id\u003ddomainA[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":63,"context_line":"                          self.role_api.update_role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_b0f3ff72","line":60,"range":{"start_line":60,"start_character":16,"end_line":60,"end_character":33},"in_reply_to":"3a57f1b5_5e82ee53","updated":"2016-02-10 17:13:23.000000000","message":"It\u0027s fair cop, guv.  Fixed.","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # Create a domain specific role from scratch"},{"line_number":68,"context_line":"        role3 \u003d unit.new_role_ref(domain_id\u003ddomainA[\u0027id\u0027])"},{"line_number":69,"context_line":"        self.role_api.create_role(role3[\u0027id\u0027], role3)"},{"line_number":70,"context_line":"        # Try and \"move\" it to another domain"},{"line_number":71,"context_line":"        domainB \u003d unit.new_domain_ref()"},{"line_number":72,"context_line":"        role4 \u003d unit.new_role_ref(id\u003drole3[\u0027id\u0027], name\u003drole3[\u0027name\u0027],"},{"line_number":73,"context_line":"                                  domain_id\u003ddomainB[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_7ea00af5","line":70,"range":{"start_line":70,"start_character":14,"end_line":70,"end_character":17},"updated":"2016-02-10 14:11:11.000000000","message":"(nit) s/and/to ?","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # Create a domain specific role from scratch"},{"line_number":68,"context_line":"        role3 \u003d unit.new_role_ref(domain_id\u003ddomainA[\u0027id\u0027])"},{"line_number":69,"context_line":"        self.role_api.create_role(role3[\u0027id\u0027], role3)"},{"line_number":70,"context_line":"        # Try and \"move\" it to another domain"},{"line_number":71,"context_line":"        domainB \u003d unit.new_domain_ref()"},{"line_number":72,"context_line":"        role4 \u003d unit.new_role_ref(id\u003drole3[\u0027id\u0027], name\u003drole3[\u0027name\u0027],"},{"line_number":73,"context_line":"                                  domain_id\u003ddomainB[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_50440b73","line":70,"range":{"start_line":70,"start_character":14,"end_line":70,"end_character":17},"in_reply_to":"3a57f1b5_7ea00af5","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.role_api.create_role(role3[\u0027id\u0027], role3)"},{"line_number":70,"context_line":"        # Try and \"move\" it to another domain"},{"line_number":71,"context_line":"        domainB \u003d unit.new_domain_ref()"},{"line_number":72,"context_line":"        role4 \u003d unit.new_role_ref(id\u003drole3[\u0027id\u0027], name\u003drole3[\u0027name\u0027],"},{"line_number":73,"context_line":"                                  domain_id\u003ddomainB[\u0027id\u0027])"},{"line_number":74,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":75,"context_line":"                          self.role_api.update_role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_1e7c7671","line":72,"range":{"start_line":72,"start_character":16,"end_line":72,"end_character":33},"updated":"2016-02-10 14:11:11.000000000","message":"same comment as line 60","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.role_api.create_role(role3[\u0027id\u0027], role3)"},{"line_number":70,"context_line":"        # Try and \"move\" it to another domain"},{"line_number":71,"context_line":"        domainB \u003d unit.new_domain_ref()"},{"line_number":72,"context_line":"        role4 \u003d unit.new_role_ref(id\u003drole3[\u0027id\u0027], name\u003drole3[\u0027name\u0027],"},{"line_number":73,"context_line":"                                  domain_id\u003ddomainB[\u0027id\u0027])"},{"line_number":74,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":75,"context_line":"                          self.role_api.update_role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_b04f7f91","line":72,"range":{"start_line":72,"start_character":16,"end_line":72,"end_character":33},"in_reply_to":"3a57f1b5_1e7c7671","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"631a5429f4eec2d5ed2c1b027224004260c042a9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":73,"context_line":"                          self.role_api.update_role,"},{"line_number":74,"context_line":"                          role2[\u0027id\u0027],"},{"line_number":75,"context_line":"                          role2)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_domain_specific_separation(self):"},{"line_number":78,"context_line":"        domain1 \u003d unit.new_domain_ref()"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a57f1b5_d5b466f3","line":75,"updated":"2016-02-10 18:39:01.000000000","message":"Hmm, what about another case where a domain role is made global ? (and fail)","commit_id":"407eabde417e85bb35bc7cbf1995857f4b20aeca"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":835,"context_line":"        \"\"\""},{"line_number":836,"context_line":"        self.upgrade(87)"},{"line_number":837,"context_line":"        session \u003d self.Session()"},{"line_number":838,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":839,"context_line":"        # Add a role before we upgrade, so we can check that its new domain_id"},{"line_number":840,"context_line":"        # attribute is handled correctly"},{"line_number":841,"context_line":"        role_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_1ae31fa5","line":838,"range":{"start_line":838,"start_character":38,"end_line":838,"end_character":44},"updated":"2016-02-10 14:11:11.000000000","message":"(nit) single quotas for consistency","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":835,"context_line":"        \"\"\""},{"line_number":836,"context_line":"        self.upgrade(87)"},{"line_number":837,"context_line":"        session \u003d self.Session()"},{"line_number":838,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":839,"context_line":"        # Add a role before we upgrade, so we can check that its new domain_id"},{"line_number":840,"context_line":"        # attribute is handled correctly"},{"line_number":841,"context_line":"        role_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_70402757","line":838,"range":{"start_line":838,"start_character":38,"end_line":838,"end_character":44},"in_reply_to":"3a57f1b5_1ae31fa5","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        self.assertIn(\u0027domain_id\u0027, constraint_columns[0])"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        # Now check our role has its domain_id attribute set correctly"},{"line_number":860,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":861,"context_line":"        cols \u003d [role_table.c.domain_id]"},{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_ba952be5","line":860,"range":{"start_line":860,"start_character":38,"end_line":860,"end_character":44},"updated":"2016-02-10 14:11:11.000000000","message":"ditto, single quotes for consistency","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        self.assertIn(\u0027domain_id\u0027, constraint_columns[0])"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        # Now check our role has its domain_id attribute set correctly"},{"line_number":860,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":861,"context_line":"        cols \u003d [role_table.c.domain_id]"},{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_0b42e83e","line":860,"range":{"start_line":860,"start_character":38,"end_line":860,"end_character":44},"in_reply_to":"3a57f1b5_ba952be5","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":859,"context_line":"        # Now check our role has its domain_id attribute set correctly"},{"line_number":860,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":861,"context_line":"        cols \u003d [role_table.c.domain_id]"},{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"},{"line_number":864,"context_line":"        role_entry \u003d session.execute(s).fetchone()"},{"line_number":865,"context_line":"        self.assertEqual(\u0027\u003c\u003cnull\u003e\u003e\u0027, role_entry[0])"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_babc4b6d","line":862,"range":{"start_line":862,"start_character":8,"end_line":862,"end_character":9},"updated":"2016-02-10 14:11:11.000000000","message":"filter ?","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":859,"context_line":"        # Now check our role has its domain_id attribute set correctly"},{"line_number":860,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":861,"context_line":"        cols \u003d [role_table.c.domain_id]"},{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"},{"line_number":864,"context_line":"        role_entry \u003d session.execute(s).fetchone()"},{"line_number":865,"context_line":"        self.assertEqual(\u0027\u003c\u003cnull\u003e\u003e\u0027, role_entry[0])"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_4ba54002","line":862,"range":{"start_line":862,"start_character":8,"end_line":862,"end_character":9},"in_reply_to":"3a57f1b5_babc4b6d","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":861,"context_line":"        cols \u003d [role_table.c.domain_id]"},{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"},{"line_number":864,"context_line":"        role_entry \u003d session.execute(s).fetchone()"},{"line_number":865,"context_line":"        self.assertEqual(\u0027\u003c\u003cnull\u003e\u003e\u0027, role_entry[0])"},{"line_number":866,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_3ab13b90","line":863,"range":{"start_line":863,"start_character":8,"end_line":863,"end_character":9},"updated":"2016-02-10 14:11:11.000000000","message":"statement ?","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        role_table \u003d sqlalchemy.Table(\"role\", self.metadata, autoload\u003dTrue)"},{"line_number":861,"context_line":"        cols \u003d [role_table.c.domain_id]"},{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"},{"line_number":864,"context_line":"        role_entry \u003d session.execute(s).fetchone()"},{"line_number":865,"context_line":"        self.assertEqual(\u0027\u003c\u003cnull\u003e\u003e\u0027, role_entry[0])"},{"line_number":866,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_2bad64e9","line":863,"range":{"start_line":863,"start_character":8,"end_line":863,"end_character":9},"in_reply_to":"3a57f1b5_3ab13b90","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3795d3a884a4168b14820b96cef47261e397df29","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"},{"line_number":864,"context_line":"        role_entry \u003d session.execute(s).fetchone()"},{"line_number":865,"context_line":"        self.assertEqual(\u0027\u003c\u003cnull\u003e\u003e\u0027, role_entry[0])"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":868,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_ba4a0b82","line":865,"range":{"start_line":865,"start_character":25,"end_line":865,"end_character":35},"updated":"2016-02-10 14:11:11.000000000","message":"maybe put in a constant ?","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55848e6c5894f50d545d414a7e894b1cb55e59a7","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        f \u003d role_table.c.id \u003d\u003d role_id"},{"line_number":863,"context_line":"        s \u003d sqlalchemy.select(cols).where(f)"},{"line_number":864,"context_line":"        role_entry \u003d session.execute(s).fetchone()"},{"line_number":865,"context_line":"        self.assertEqual(\u0027\u003c\u003cnull\u003e\u003e\u0027, role_entry[0])"},{"line_number":866,"context_line":""},{"line_number":867,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":868,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a57f1b5_cb1a9017","line":865,"range":{"start_line":865,"start_character":25,"end_line":865,"end_character":35},"in_reply_to":"3a57f1b5_ba4a0b82","updated":"2016-02-10 17:13:23.000000000","message":"Done","commit_id":"b0e5079819d1958cc6cbff6ba1a6fba504771de0"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"c80392084e436ac88e7e471c532b19f029a0c0c2","unresolved":false,"context_lines":[{"line_number":2303,"context_line":"            link\u003dlink, project_id\u003dproject[\u0027id\u0027],"},{"line_number":2304,"context_line":"            user_id\u003duser[\u0027id\u0027], role_id\u003drole_list[2][\u0027id\u0027],"},{"line_number":2305,"context_line":"            prior_link\u003dprior_link)"},{"line_number":2306,"context_line":"        self.assertRoleAssignmentInListResponse(r, entity)"},{"line_number":2307,"context_line":""},{"line_number":2308,"context_line":""},{"line_number":2309,"context_line":"class DomainSpecificRoleTests(test_v3.RestfulTestCase, unit.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_cac69f9b","line":2306,"range":{"start_line":2306,"start_character":13,"end_line":2306,"end_character":47},"updated":"2016-01-11 12:04:12.000000000","message":"Since the combination of role name and domain id is unique, tests should be written to check that functionality while creating and updating roles in a domain.","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"373c1b7c6f4d10854da89805e85bb885bb5dfbbf","unresolved":false,"context_lines":[{"line_number":2303,"context_line":"            link\u003dlink, project_id\u003dproject[\u0027id\u0027],"},{"line_number":2304,"context_line":"            user_id\u003duser[\u0027id\u0027], role_id\u003drole_list[2][\u0027id\u0027],"},{"line_number":2305,"context_line":"            prior_link\u003dprior_link)"},{"line_number":2306,"context_line":"        self.assertRoleAssignmentInListResponse(r, entity)"},{"line_number":2307,"context_line":""},{"line_number":2308,"context_line":""},{"line_number":2309,"context_line":"class DomainSpecificRoleTests(test_v3.RestfulTestCase, unit.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_ed0a7889","line":2306,"range":{"start_line":2306,"start_character":13,"end_line":2306,"end_character":47},"in_reply_to":"da6ed579_0cad5788","updated":"2016-01-14 22:57:25.000000000","message":"actually this is already tested in the backend/role/test_sql.py that is part of this patch","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"72ffd8d5c4f8c5a610d9b88343c5b0ea76431068","unresolved":false,"context_lines":[{"line_number":2303,"context_line":"            link\u003dlink, project_id\u003dproject[\u0027id\u0027],"},{"line_number":2304,"context_line":"            user_id\u003duser[\u0027id\u0027], role_id\u003drole_list[2][\u0027id\u0027],"},{"line_number":2305,"context_line":"            prior_link\u003dprior_link)"},{"line_number":2306,"context_line":"        self.assertRoleAssignmentInListResponse(r, entity)"},{"line_number":2307,"context_line":""},{"line_number":2308,"context_line":""},{"line_number":2309,"context_line":"class DomainSpecificRoleTests(test_v3.RestfulTestCase, unit.TestCase):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_0cad5788","line":2306,"range":{"start_line":2306,"start_character":13,"end_line":2306,"end_character":47},"in_reply_to":"fa69d971_cac69f9b","updated":"2016-01-11 22:32:47.000000000","message":"I think that\u0027s a fair point, I\u0027ll add some.","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"c80392084e436ac88e7e471c532b19f029a0c0c2","unresolved":false,"context_lines":[{"line_number":2325,"context_line":"        # them first, so we can ensure we can check subsequent list responses"},{"line_number":2326,"context_line":"        # are correct"},{"line_number":2327,"context_line":"        r \u003d self.get(\u0027/roles\u0027)"},{"line_number":2328,"context_line":"        existing_global_roles \u003d len(r.result[\u0027roles\u0027])"},{"line_number":2329,"context_line":""},{"line_number":2330,"context_line":"        global_role1 \u003d self._create_role()"},{"line_number":2331,"context_line":"        global_role2 \u003d self._create_role()"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_7f5f3741","line":2328,"range":{"start_line":2328,"start_character":8,"end_line":2328,"end_character":29},"updated":"2016-01-11 12:04:12.000000000","message":"Just a small nit: this line could be written after creating global_role2 so that while doing the check for the correct number of number of roles returned you don\u0027t to have to manually add two.","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"72ffd8d5c4f8c5a610d9b88343c5b0ea76431068","unresolved":false,"context_lines":[{"line_number":2325,"context_line":"        # them first, so we can ensure we can check subsequent list responses"},{"line_number":2326,"context_line":"        # are correct"},{"line_number":2327,"context_line":"        r \u003d self.get(\u0027/roles\u0027)"},{"line_number":2328,"context_line":"        existing_global_roles \u003d len(r.result[\u0027roles\u0027])"},{"line_number":2329,"context_line":""},{"line_number":2330,"context_line":"        global_role1 \u003d self._create_role()"},{"line_number":2331,"context_line":"        global_role2 \u003d self._create_role()"}],"source_content_type":"text/x-python","patch_set":8,"id":"da6ed579_2caa9b71","line":2328,"range":{"start_line":2328,"start_character":8,"end_line":2328,"end_character":29},"in_reply_to":"fa69d971_7f5f3741","updated":"2016-01-11 22:32:47.000000000","message":"will fix.","commit_id":"1120a9b95bb53c53d13923235d8d83003d14bc76"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f81495cb3624bb7b193fc824347baa9a7dd37a3e","unresolved":false,"context_lines":[{"line_number":2588,"context_line":"            body\u003d{\u0027role\u0027: ref})"},{"line_number":2589,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":2590,"context_line":""},{"line_number":2591,"context_line":"    def test_CRUD_domain_specific_roles(self):"},{"line_number":2592,"context_line":"        domainA \u003d unit.new_domain_ref()"},{"line_number":2593,"context_line":"        self.resource_api.create_domain(domainA[\u0027id\u0027], domainA)"},{"line_number":2594,"context_line":"        domainB \u003d unit.new_domain_ref()"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_99d39438","line":2591,"updated":"2016-02-03 22:13:47.000000000","message":"This is pretty long.  Split up, so if anything fails, we know which step it was.","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9216b6cbbb6108396f53bcf87c176405e7b7afce","unresolved":false,"context_lines":[{"line_number":2588,"context_line":"            body\u003d{\u0027role\u0027: ref})"},{"line_number":2589,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":2590,"context_line":""},{"line_number":2591,"context_line":"    def test_CRUD_domain_specific_roles(self):"},{"line_number":2592,"context_line":"        domainA \u003d unit.new_domain_ref()"},{"line_number":2593,"context_line":"        self.resource_api.create_domain(domainA[\u0027id\u0027], domainA)"},{"line_number":2594,"context_line":"        domainB \u003d unit.new_domain_ref()"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_578620ba","line":2591,"in_reply_to":"5a5ae5dd_99d39438","updated":"2016-02-04 14:22:41.000000000","message":"Done","commit_id":"9479a327c32b8dc6439540f7e270a3c12ce27bde"}]}
