)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d6fed670ee5429abd6f53ac7174dbb77431fed43","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Allow project domain_id to be nullable at the manager level"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Since the domain_id column is part of a uniqueness constraint and"},{"line_number":10,"context_line":"it might now contain a nullable value, we actually store a special"},{"line_number":11,"context_line":"value (as opposed to None) in the sql attribute so as to still use"},{"line_number":12,"context_line":"the sql uniqueness constraint to ensure we do not have race"},{"line_number":13,"context_line":"conditions in multi-process keystone configurations. So as to"},{"line_number":14,"context_line":"continue to support a FK on the project.domain_id column, we create"},{"line_number":15,"context_line":"a hidden domain (\"the root of all domains\"). In preparation for the"},{"line_number":16,"context_line":"move to projects acting as domains, we also create a matching project"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"dae33548_45bb83e5","line":13,"range":{"start_line":10,"start_character":39,"end_line":13,"end_character":51},"updated":"2016-02-16 23:19:49.000000000","message":"nice!","commit_id":"24b5dd021d33b7c18a5ab147939128a4a378925e"}],"keystone/common/sql/migrate_repo/versions/088_project_domain_id_defaults_to_null_string.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4028e38dff185897ef0ebfe85d23d1d5b0cad411","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_048c0234","line":14,"updated":"2016-01-21 16:08:50.000000000","message":"(nit) should be a newline here","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"53ed7debd3996d5312a34315f4e4df760a81cabd","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_385ec344","line":14,"in_reply_to":"9a68dd71_048c0234","updated":"2016-01-22 17:42:22.000000000","message":"Done","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"5c644484e074203055f128746d5053b5c3866dcc","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":17,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003cnull\u003e\u003e\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_18d5d61a","line":17,"range":{"start_line":17,"start_character":17,"end_line":17,"end_character":20},"updated":"2016-01-24 18:32:36.000000000","message":"Can we import this from keystone.resource? Otherwise there are two places where this constant is present.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8235a298c5dfcf69c8cd495d678ce66180e6b585","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":17,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003cnull\u003e\u003e\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_d8e41ee1","line":17,"range":{"start_line":17,"start_character":17,"end_line":17,"end_character":20},"in_reply_to":"9a68dd71_18d5d61a","updated":"2016-01-24 18:51:21.000000000","message":"We could, but in general we don\u0027t like to do that - otherwise some future change on NULL_DOMAIN_ID would change a specific \"set in time\u0027 migration script.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"}],"keystone/common/sql/migrate_repo/versions/089_add_root_of_all_domains.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # This special project is filtered out by the driver, so is never"},{"line_number":30,"context_line":"        # visible to the manager or API."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        project_ref \u003d {"},{"line_number":33,"context_line":"            \u0027id\u0027: NULL_DOMAIN_ID,"},{"line_number":34,"context_line":"            \u0027name\u0027: NULL_DOMAIN_ID,"},{"line_number":35,"context_line":"            \u0027enabled\u0027: False,"},{"line_number":36,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":37,"context_line":"            \u0027domain_id\u0027: NULL_DOMAIN_ID,"},{"line_number":38,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":39,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":40,"context_line":"            \u0027extra\u0027: \u0027{}\u0027"},{"line_number":41,"context_line":"        }"},{"line_number":42,"context_line":"        return project_ref"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _generate_root_domain():"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_6d969f40","line":41,"range":{"start_line":32,"start_character":0,"end_line":41,"end_character":9},"updated":"2016-02-12 14:32:12.000000000","message":"So this is the unique domain that has domain_id filed pointed to itself","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fcb407f8d6ad12ae7e976044c61bf9d0acdf89d0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # This special project is filtered out by the driver, so is never"},{"line_number":30,"context_line":"        # visible to the manager or API."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        project_ref \u003d {"},{"line_number":33,"context_line":"            \u0027id\u0027: NULL_DOMAIN_ID,"},{"line_number":34,"context_line":"            \u0027name\u0027: NULL_DOMAIN_ID,"},{"line_number":35,"context_line":"            \u0027enabled\u0027: False,"},{"line_number":36,"context_line":"            \u0027description\u0027: \u0027\u0027,"},{"line_number":37,"context_line":"            \u0027domain_id\u0027: NULL_DOMAIN_ID,"},{"line_number":38,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":39,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":40,"context_line":"            \u0027extra\u0027: \u0027{}\u0027"},{"line_number":41,"context_line":"        }"},{"line_number":42,"context_line":"        return project_ref"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _generate_root_domain():"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_005b25f7","line":41,"range":{"start_line":32,"start_character":0,"end_line":41,"end_character":9},"in_reply_to":"3a57f1b5_6d969f40","updated":"2016-02-12 17:00:03.000000000","message":"yes","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _generate_root_domain():"},{"line_number":45,"context_line":"        # Generate a similar root for the domain table, this is an interim"},{"line_number":46,"context_line":"        # an interim step so as to allow continuation of current project"},{"line_number":47,"context_line":"        # domain_id FK."},{"line_number":48,"context_line":"        #"},{"line_number":49,"context_line":"        # This special domain is filtered out by the driver, so is never"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_0de5abda","line":46,"range":{"start_line":46,"start_character":10,"end_line":46,"end_character":20},"updated":"2016-02-12 14:32:12.000000000","message":"doubled \u0027an interim\u0027","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fcb407f8d6ad12ae7e976044c61bf9d0acdf89d0","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _generate_root_domain():"},{"line_number":45,"context_line":"        # Generate a similar root for the domain table, this is an interim"},{"line_number":46,"context_line":"        # an interim step so as to allow continuation of current project"},{"line_number":47,"context_line":"        # domain_id FK."},{"line_number":48,"context_line":"        #"},{"line_number":49,"context_line":"        # This special domain is filtered out by the driver, so is never"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_c0718d77","line":46,"range":{"start_line":46,"start_character":10,"end_line":46,"end_character":20},"in_reply_to":"3a57f1b5_0de5abda","updated":"2016-02-12 17:00:03.000000000","message":"Done","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def upgrade(migrate_engine):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _generate_root_domain_project():"},{"line_number":24,"context_line":"        # Generate a project that will act as a root for all domains, in order"},{"line_number":25,"context_line":"        # for use to be able to use a FK constraint on domain_id. Projects"},{"line_number":26,"context_line":"        # acting as a domain will not reference this as their parent_id, just"},{"line_number":27,"context_line":"        # as domain_id."},{"line_number":28,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_407f36aa","line":25,"range":{"start_line":24,"start_character":68,"end_line":25,"end_character":64},"updated":"2016-02-15 21:30:06.000000000","message":"I didn\u0027t quite get this comment ? project.domain_id has a FK to domain.id\n\nThis way, this comment is valid for _generate_root_domain below, not to this","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def upgrade(migrate_engine):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _generate_root_domain_project():"},{"line_number":24,"context_line":"        # Generate a project that will act as a root for all domains, in order"},{"line_number":25,"context_line":"        # for use to be able to use a FK constraint on domain_id. Projects"},{"line_number":26,"context_line":"        # acting as a domain will not reference this as their parent_id, just"},{"line_number":27,"context_line":"        # as domain_id."},{"line_number":28,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_6394ff36","line":25,"range":{"start_line":24,"start_character":68,"end_line":25,"end_character":64},"in_reply_to":"dae33548_407f36aa","updated":"2016-02-15 22:41:57.000000000","message":"I *think* it is still valid, since projects acting as a domain, will point there project.domain_id at this row.","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1cf35cce8b2459cdfd7ea5b7b0b4948ca91a9ea1","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def upgrade(migrate_engine):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _generate_root_domain_project():"},{"line_number":24,"context_line":"        # Generate a project that will act as a root for all domains, in order"},{"line_number":25,"context_line":"        # for use to be able to use a FK constraint on domain_id. Projects"},{"line_number":26,"context_line":"        # acting as a domain will not reference this as their parent_id, just"},{"line_number":27,"context_line":"        # as domain_id."},{"line_number":28,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_c6021d09","line":25,"range":{"start_line":24,"start_character":68,"end_line":25,"end_character":64},"in_reply_to":"dae33548_6394ff36","updated":"2016-02-16 12:56:35.000000000","message":"So the domain_id FK to domain.id will be changed to project.id (and check it\u0027s is_domain somehow) in the future?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3660605f98366d78b84b4db005efbdd8c1b71d88","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def upgrade(migrate_engine):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def _generate_root_domain_project():"},{"line_number":24,"context_line":"        # Generate a project that will act as a root for all domains, in order"},{"line_number":25,"context_line":"        # for use to be able to use a FK constraint on domain_id. Projects"},{"line_number":26,"context_line":"        # acting as a domain will not reference this as their parent_id, just"},{"line_number":27,"context_line":"        # as domain_id."},{"line_number":28,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_09453616","line":25,"range":{"start_line":24,"start_character":68,"end_line":25,"end_character":64},"in_reply_to":"dae33548_c6021d09","updated":"2016-02-16 13:17:42.000000000","message":"exactly - it\u0027s in: https://review.openstack.org/#/c/231289/","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"e9424f6e69451081d8c4dcf2343b726babe09e4b","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @driver_hints.truncated"},{"line_number":64,"context_line":"    def list_projects(self, hints):"},{"line_number":65,"context_line":"        # If there is a filter on domain_id and the value is None, then to"},{"line_number":66,"context_line":"        # ensure that the sql filtering works correctly, we need to patch"},{"line_number":67,"context_line":"        # the value to be NULL_DOMAIN_ID. This is safe to do here since we"},{"line_number":68,"context_line":"        # know we are able to satisfy any filter of this type in the call to"},{"line_number":69,"context_line":"        # filter_limit_query() below, which will remove the filter from the"},{"line_number":70,"context_line":"        # hints (hence ensuring our substitution is not exposed to the caller)."},{"line_number":71,"context_line":"        for f in hints.filters:"},{"line_number":72,"context_line":"            if (f[\u0027name\u0027] \u003d\u003d \u0027domain_id\u0027 and f[\u0027value\u0027] is None):"},{"line_number":73,"context_line":"                f[\u0027value\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_0608e0d8","line":70,"range":{"start_line":65,"start_character":8,"end_line":70,"end_character":79},"updated":"2016-01-07 04:59:31.000000000","message":"\"\"\"If there is a filter on domain_id and the value is None, then to ensure that the sql filtering works correctly, we need to patch the value to be NULL_DOMAIN_ID. This is safe to do here since we know we are able to satisfy any filter of this type in the call to filter_limit_query() below, which will remove the filter from the hints (hence ensuring our substitution is not exposed to the caller).\n\"\"\"","commit_id":"c2cf10da853ccfb9ab877a9992d2beee3c862289"},{"author":{"_account_id":19779,"name":"Chason Chan","display_name":"chenxing","email":"chason.chan@foxmail.com","username":"chenxing"},"change_message_id":"e9424f6e69451081d8c4dcf2343b726babe09e4b","unresolved":false,"context_lines":[{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"class Project(sql.ModelBase, sql.DictBase):"},{"line_number":285,"context_line":"    # NOTE(henry-nash): From the manager and above perspective, the domain_id"},{"line_number":286,"context_line":"    # is nullable.  However, to ensure uniqueness in multi-process"},{"line_number":287,"context_line":"    # configurations, it is better to still use the sql uniqueness constraint."},{"line_number":288,"context_line":"    # Since the support for a nullable component of a uniqueness constraint"},{"line_number":289,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":290,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":293,"context_line":"        d \u003d super(Project, self).to_dict("}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_e6102c02","line":290,"range":{"start_line":285,"start_character":4,"end_line":290,"end_character":60},"updated":"2016-01-07 04:59:31.000000000","message":"ditto","commit_id":"c2cf10da853ccfb9ab877a9992d2beee3c862289"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4028e38dff185897ef0ebfe85d23d1d5b0cad411","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Resource(keystone_resource.ResourceDriverV9):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_e4bc4e6e","line":26,"updated":"2016-01-21 16:08:50.000000000","message":"Would it be possible to make this a string that is impossible for a user to use? Something like \"\u003c\u003cnull\u003e\u003e\" would make it so that nobody would accidentally create a domain with our magic ID.","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4d6882496fa15c0e5c1a401e1e921821ca823ddd","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Resource(keystone_resource.ResourceDriverV9):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_b55d1e7b","line":26,"in_reply_to":"9a68dd71_07ede424","updated":"2016-01-21 16:54:36.000000000","message":"So of course this is an ID (not a name) - and we don\u0027t let callers  make up their own IDs. However, this seems a sensible idea, I like it.\n\nWe can chose something that is in the reserved characters of: https://review.openstack.org/#/c/257376/","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"983a9c19a5a074a0c9cb9c0ca67c9927fe125f4f","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Resource(keystone_resource.ResourceDriverV9):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_d079c0fd","line":26,"in_reply_to":"9a68dd71_b0cd2cb9","updated":"2016-01-21 17:07:05.000000000","message":"yep, agreed - will add.","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"676541d4647bea9069399b1358321245c3eda945","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Resource(keystone_resource.ResourceDriverV9):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_b0cd2cb9","line":26,"in_reply_to":"9a68dd71_b55d1e7b","updated":"2016-01-21 16:59:49.000000000","message":"The ID is an id_string (http://git.openstack.org/cgit/openstack/keystone/tree/keystone/common/validation/parameter_types.py#n37) so most characters including the \u003c\u003e in my suggestion will work","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34d5779cddc86370d7e71f38a13a44bec38e7d9a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":"NULL_DOMAIN_ID \u003d \u0027null\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class Resource(keystone_resource.ResourceDriverV9):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_07ede424","line":26,"in_reply_to":"9a68dd71_e4bc4e6e","updated":"2016-01-21 16:14:35.000000000","message":"++ I think that\u0027s a good idea. Are there specific characters we can include that we don\u0027t allow in names? I don\u0027t think there are but thought I\u0027d ask anyway.","commit_id":"ed0757649c5e935ac59b681cef3bf966052d47d2"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"5c644484e074203055f128746d5053b5c3866dcc","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                old_project_dict[k] \u003d update_tenant[k]"},{"line_number":173,"context_line":"            if old_project_dict[\u0027domain_id\u0027] is None:"},{"line_number":174,"context_line":"                old_project_dict[\u0027domain_id\u0027] \u003d ("},{"line_number":175,"context_line":"                    keystone_resource.NULL_DOMAIN_ID)"},{"line_number":176,"context_line":"            new_project \u003d Project.from_dict(old_project_dict)"},{"line_number":177,"context_line":"            for attr in Project.attributes:"},{"line_number":178,"context_line":"                if attr !\u003d \u0027id\u0027:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_38c1ba54","line":175,"range":{"start_line":175,"start_character":20,"end_line":175,"end_character":37},"updated":"2016-01-24 18:32:36.000000000","message":"Can we use _encode_domain_id here?","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8235a298c5dfcf69c8cd495d678ce66180e6b585","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                old_project_dict[k] \u003d update_tenant[k]"},{"line_number":173,"context_line":"            if old_project_dict[\u0027domain_id\u0027] is None:"},{"line_number":174,"context_line":"                old_project_dict[\u0027domain_id\u0027] \u003d ("},{"line_number":175,"context_line":"                    keystone_resource.NULL_DOMAIN_ID)"},{"line_number":176,"context_line":"            new_project \u003d Project.from_dict(old_project_dict)"},{"line_number":177,"context_line":"            for attr in Project.attributes:"},{"line_number":178,"context_line":"                if attr !\u003d \u0027id\u0027:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_b8f7ea89","line":175,"range":{"start_line":175,"start_character":20,"end_line":175,"end_character":37},"in_reply_to":"9a68dd71_38c1ba54","updated":"2016-01-24 18:51:21.000000000","message":"I think you could, yes...good idea.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"5c644484e074203055f128746d5053b5c3866dcc","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":270,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":273,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":274,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":275,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d keystone_resource.NULL_DOMAIN_ID:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_786732b7","line":272,"range":{"start_line":272,"start_character":8,"end_line":272,"end_character":15},"updated":"2016-01-24 18:32:36.000000000","message":"Since we are doing the decoding in core.py, do we need a different to_dict() here? We can very well pass a dict containing NULL domain to the core and it will deal it.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8235a298c5dfcf69c8cd495d678ce66180e6b585","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":270,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":273,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":274,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":275,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d keystone_resource.NULL_DOMAIN_ID:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_b8d04af7","line":272,"range":{"start_line":272,"start_character":8,"end_line":272,"end_character":15},"in_reply_to":"9a68dd71_786732b7","updated":"2016-01-24 18:51:21.000000000","message":"we are not decoding in core for V9 drivers and later - only for V8 legacy drivers - so we should be doing it here.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                return [x.id for x in query.all()"},{"line_number":100,"context_line":"                        if not self._is_hidden_ref(x)]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":103,"context_line":"        with sql.transaction() as session:"},{"line_number":104,"context_line":"            self._get_domain(session, domain_id)"},{"line_number":105,"context_line":"            query \u003d session.query(Project)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_feda334a","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":31},"updated":"2016-02-12 14:32:12.000000000","message":"This needs to address the hidden_ref too","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3c96a139bd2f9200871a02a01be93705b22856a6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                return [x.id for x in query.all()"},{"line_number":100,"context_line":"                        if not self._is_hidden_ref(x)]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":103,"context_line":"        with sql.transaction() as session:"},{"line_number":104,"context_line":"            self._get_domain(session, domain_id)"},{"line_number":105,"context_line":"            query \u003d session.query(Project)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_4ada9e4d","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":31},"in_reply_to":"3a57f1b5_fe0f9336","updated":"2016-02-12 16:13:41.000000000","message":"Yes this is OK, because it uses _get_domain","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3c96a139bd2f9200871a02a01be93705b22856a6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                return [x.id for x in query.all()"},{"line_number":100,"context_line":"                        if not self._is_hidden_ref(x)]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":103,"context_line":"        with sql.transaction() as session:"},{"line_number":104,"context_line":"            self._get_domain(session, domain_id)"},{"line_number":105,"context_line":"            query \u003d session.query(Project)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_6a18ba1e","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":31},"in_reply_to":"3a57f1b5_fe0f9336","updated":"2016-02-12 16:13:41.000000000","message":"Yes this is OK, because it uses _get_domain","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"aa92659a80be73ea35c15a66a08694a46cb4d09c","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                return [x.id for x in query.all()"},{"line_number":100,"context_line":"                        if not self._is_hidden_ref(x)]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":103,"context_line":"        with sql.transaction() as session:"},{"line_number":104,"context_line":"            self._get_domain(session, domain_id)"},{"line_number":105,"context_line":"            query \u003d session.query(Project)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_fe0f9336","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":31},"in_reply_to":"3a57f1b5_feda334a","updated":"2016-02-12 14:35:44.000000000","message":"I think this is OK...and we test for the in test_backend_sql.py","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            session.delete(project_ref)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":197,"context_line":"    def delete_projects_from_ids(self, project_ids):"},{"line_number":198,"context_line":"        if not project_ids:"},{"line_number":199,"context_line":"            return"},{"line_number":200,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_3ef0cb66","line":197,"range":{"start_line":197,"start_character":8,"end_line":197,"end_character":32},"updated":"2016-02-12 14:32:12.000000000","message":"This neeeds to address the hiden_ref","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"aa92659a80be73ea35c15a66a08694a46cb4d09c","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            session.delete(project_ref)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":197,"context_line":"    def delete_projects_from_ids(self, project_ids):"},{"line_number":198,"context_line":"        if not project_ids:"},{"line_number":199,"context_line":"            return"},{"line_number":200,"context_line":"        with sql.transaction() as session:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_9e01bf08","line":197,"range":{"start_line":197,"start_character":8,"end_line":197,"end_character":32},"in_reply_to":"3a57f1b5_3ef0cb66","updated":"2016-02-12 14:35:44.000000000","message":"Ah...this is a new methods since I wrote this patch!!! will address","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        update_project \u003d self._encode_domain_id(project)"},{"line_number":177,"context_line":"        with sql.transaction() as session:"},{"line_number":178,"context_line":"            project_ref \u003d self._get_project(session, project_id)"},{"line_number":179,"context_line":"            old_project_dict \u003d project_ref.to_dict()"},{"line_number":180,"context_line":"            for k in update_project:"},{"line_number":181,"context_line":"                old_project_dict[k] \u003d update_project[k]"},{"line_number":182,"context_line":"            old_project_dict \u003d self._encode_domain_id(old_project_dict)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_17fa95bd","line":179,"range":{"start_line":179,"start_character":43,"end_line":179,"end_character":50},"updated":"2016-02-15 21:30:06.000000000","message":"Might be worth it to add a commment saying the hidden attribute was decoded in the to_dict call","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        update_project \u003d self._encode_domain_id(project)"},{"line_number":177,"context_line":"        with sql.transaction() as session:"},{"line_number":178,"context_line":"            project_ref \u003d self._get_project(session, project_id)"},{"line_number":179,"context_line":"            old_project_dict \u003d project_ref.to_dict()"},{"line_number":180,"context_line":"            for k in update_project:"},{"line_number":181,"context_line":"                old_project_dict[k] \u003d update_project[k]"},{"line_number":182,"context_line":"            old_project_dict \u003d self._encode_domain_id(old_project_dict)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_8304a37e","line":179,"range":{"start_line":179,"start_character":43,"end_line":179,"end_character":50},"in_reply_to":"dae33548_17fa95bd","updated":"2016-02-15 22:41:57.000000000","message":"Done","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            old_project_dict \u003d project_ref.to_dict()"},{"line_number":180,"context_line":"            for k in update_project:"},{"line_number":181,"context_line":"                old_project_dict[k] \u003d update_project[k]"},{"line_number":182,"context_line":"            old_project_dict \u003d self._encode_domain_id(old_project_dict)"},{"line_number":183,"context_line":"            new_project \u003d Project.from_dict(old_project_dict)"},{"line_number":184,"context_line":"            for attr in Project.attributes:"},{"line_number":185,"context_line":"                if attr !\u003d \u0027id\u0027:"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_57041dbf","line":182,"range":{"start_line":182,"start_character":36,"end_line":182,"end_character":53},"updated":"2016-02-15 21:30:06.000000000","message":"hence being encoded here","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":297,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":300,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":301,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":302,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d keystone_resource.NULL_DOMAIN_ID:"},{"line_number":303,"context_line":"            d[\u0027domain_id\u0027] \u003d None"},{"line_number":304,"context_line":"        return d"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    __tablename__ \u003d \u0027project\u0027"},{"line_number":307,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027, \u0027enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_37c23934","line":304,"range":{"start_line":299,"start_character":0,"end_line":304,"end_character":16},"updated":"2016-02-15 21:30:06.000000000","message":"Why do we need this here, since we already have the _encode_domain_id and _decode_domain_id at manager level?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":297,"context_line":"    # to represent null, as defined in NULL_DOMAIN_ID above."},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":300,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":301,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":302,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d keystone_resource.NULL_DOMAIN_ID:"},{"line_number":303,"context_line":"            d[\u0027domain_id\u0027] \u003d None"},{"line_number":304,"context_line":"        return d"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    __tablename__ \u003d \u0027project\u0027"},{"line_number":307,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027description\u0027, \u0027enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_03cb7354","line":304,"range":{"start_line":299,"start_character":0,"end_line":304,"end_character":16},"in_reply_to":"dae33548_37c23934","updated":"2016-02-15 22:41:57.000000000","message":"it\u0027s just a matter of getting to the code - it\u0027s part of the resource manager, that we can\u0027t easily get at from here.","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"}],"keystone/resource/core.py":[{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"5c644484e074203055f128746d5053b5c3866dcc","unresolved":false,"context_lines":[{"line_number":681,"context_line":"    def _encode_domain_id(self, ref):"},{"line_number":682,"context_line":"        if \u0027domain_id\u0027 in ref and ref[\u0027domain_id\u0027] is None:"},{"line_number":683,"context_line":"            new_ref \u003d ref.copy()"},{"line_number":684,"context_line":"            new_ref[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"},{"line_number":685,"context_line":"            return new_ref"},{"line_number":686,"context_line":"        else:"},{"line_number":687,"context_line":"            return ref"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_78c3b257","line":684,"range":{"start_line":684,"start_character":21,"end_line":684,"end_character":30},"updated":"2016-01-24 18:32:36.000000000","message":"Even if dict.copy() is shallow copying why are we doing this?","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8235a298c5dfcf69c8cd495d678ce66180e6b585","unresolved":false,"context_lines":[{"line_number":681,"context_line":"    def _encode_domain_id(self, ref):"},{"line_number":682,"context_line":"        if \u0027domain_id\u0027 in ref and ref[\u0027domain_id\u0027] is None:"},{"line_number":683,"context_line":"            new_ref \u003d ref.copy()"},{"line_number":684,"context_line":"            new_ref[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"},{"line_number":685,"context_line":"            return new_ref"},{"line_number":686,"context_line":"        else:"},{"line_number":687,"context_line":"            return ref"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_78edf2b5","line":684,"range":{"start_line":684,"start_character":21,"end_line":684,"end_character":30},"in_reply_to":"9a68dd71_78c3b257","updated":"2016-01-24 18:51:21.000000000","message":"since otherwise we might be changing a dict passed in by the caller...and they should never know we have made a substitution....","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"    def create_domain(self, domain_id, domain):"},{"line_number":1066,"context_line":"        return self.driver.create_domain(domain_id, domain)"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def list_domains(self, hints):"},{"line_number":1069,"context_line":"        return self.driver.list_domains(hints)"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def list_domains_from_ids(self, domain_ids):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_fe32335d","line":1068,"range":{"start_line":1068,"start_character":8,"end_line":1068,"end_character":20},"updated":"2016-02-12 14:32:12.000000000","message":"This neeeds to address the hiden_ref","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fcb407f8d6ad12ae7e976044c61bf9d0acdf89d0","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"    def create_domain(self, domain_id, domain):"},{"line_number":1066,"context_line":"        return self.driver.create_domain(domain_id, domain)"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def list_domains(self, hints):"},{"line_number":1069,"context_line":"        return self.driver.list_domains(hints)"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def list_domains_from_ids(self, domain_ids):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_c0cd0d86","line":1068,"range":{"start_line":1068,"start_character":8,"end_line":1068,"end_character":20},"in_reply_to":"3a57f1b5_fe32335d","updated":"2016-02-12 17:00:03.000000000","message":"I think these are all OK, since a V8 driver will not have the hidden rows.","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"    def list_domains(self, hints):"},{"line_number":1069,"context_line":"        return self.driver.list_domains(hints)"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def list_domains_from_ids(self, domain_ids):"},{"line_number":1072,"context_line":"        return self.driver.list_domains_from_ids(domain_ids)"},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"    def get_domain(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_5ec10753","line":1071,"range":{"start_line":1071,"start_character":8,"end_line":1071,"end_character":29},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"    def list_domains_from_ids(self, domain_ids):"},{"line_number":1072,"context_line":"        return self.driver.list_domains_from_ids(domain_ids)"},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"    def get_domain(self, domain_id):"},{"line_number":1075,"context_line":"        return self.driver.get_domain(domain_id)"},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":"    def get_domain_by_name(self, domain_name):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_1eb70ff6","line":1074,"range":{"start_line":1074,"start_character":8,"end_line":1074,"end_character":18},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"    def get_domain(self, domain_id):"},{"line_number":1075,"context_line":"        return self.driver.get_domain(domain_id)"},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":1078,"context_line":"        return self.driver.get_domain_by_name(domain_name)"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def update_domain(self, domain_id, domain):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_feb1d301","line":1077,"range":{"start_line":1077,"start_character":8,"end_line":1077,"end_character":26},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":1078,"context_line":"        return self.driver.get_domain_by_name(domain_name)"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def update_domain(self, domain_id, domain):"},{"line_number":1081,"context_line":"        return self.driver.update_domain(domain_id, domain)"},{"line_number":1082,"context_line":""},{"line_number":1083,"context_line":"    def delete_domain(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_decdf785","line":1080,"range":{"start_line":1080,"start_character":8,"end_line":1080,"end_character":21},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1080,"context_line":"    def update_domain(self, domain_id, domain):"},{"line_number":1081,"context_line":"        return self.driver.update_domain(domain_id, domain)"},{"line_number":1082,"context_line":""},{"line_number":1083,"context_line":"    def delete_domain(self, domain_id):"},{"line_number":1084,"context_line":"        self.driver.delete_domain(domain_id)"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"    def create_project(self, project_id, project):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_9e71bf46","line":1083,"range":{"start_line":1083,"start_character":8,"end_line":1083,"end_character":21},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1106,"context_line":"        return [self._decode_domain_id(p)"},{"line_number":1107,"context_line":"                for p in self.driver.list_projects_from_ids(project_ids)]"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":"    def list_project_ids_from_domain_ids(self, domain_ids):"},{"line_number":1110,"context_line":"        return self.driver.list_project_ids_from_domain_ids(domain_ids)"},{"line_number":1111,"context_line":""},{"line_number":1112,"context_line":"    def list_projects_in_domain(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_7eaba375","line":1109,"range":{"start_line":1109,"start_character":8,"end_line":1109,"end_character":40},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"        return self._decode_domain_id("},{"line_number":1124,"context_line":"            self.driver.update_project(project_id, update_project))"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    def delete_project(self, project_id):"},{"line_number":1127,"context_line":"        self.driver.delete_project(project_id)"},{"line_number":1128,"context_line":""},{"line_number":1129,"context_line":"    def delete_projects_from_ids(self, project_ids):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_9ebf7fa9","line":1126,"range":{"start_line":1126,"start_character":8,"end_line":1126,"end_character":22},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"    def delete_project(self, project_id):"},{"line_number":1127,"context_line":"        self.driver.delete_project(project_id)"},{"line_number":1128,"context_line":""},{"line_number":1129,"context_line":"    def delete_projects_from_ids(self, project_ids):"},{"line_number":1130,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"    def list_project_parents(self, project_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_fee473e0","line":1129,"range":{"start_line":1129,"start_character":8,"end_line":1129,"end_character":32},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78a3a7d97a2494ef690180d4dd08aad5659a8d7d","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1133,"context_line":"        return self.driver.list_project_parents(project_id)"},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"    def list_projects_in_subtree(self, project_id):"},{"line_number":1136,"context_line":"        return self.driver.list_projects_in_subtree(project_id)"},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"    def is_leaf_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a57f1b5_7ed96321","line":1135,"range":{"start_line":1135,"start_character":8,"end_line":1135,"end_character":32},"updated":"2016-02-12 14:32:12.000000000","message":"ditto","commit_id":"b75aeeaf3365ab12e0b4d6ed7bb9e807c6755d3a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        :raises keystone.exception.DomainNotFound: In case the domain is not"},{"line_number":129,"context_line":"            found."},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        if parent_ref:"},{"line_number":134,"context_line":"            is_domain_parent \u003d parent_ref.get(\u0027is_domain\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_6ac174e4","line":131,"range":{"start_line":131,"start_character":0,"end_line":131,"end_character":58},"updated":"2016-02-15 21:30:06.000000000","message":"This ensures that a regular project CANNOT have a None domain_id! Might be worth it do add a note here ?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        :raises keystone.exception.DomainNotFound: In case the domain is not"},{"line_number":129,"context_line":"            found."},{"line_number":130,"context_line":"        \"\"\""},{"line_number":131,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        if parent_ref:"},{"line_number":134,"context_line":"            is_domain_parent \u003d parent_ref.get(\u0027is_domain\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_e3ce4f59","line":131,"range":{"start_line":131,"start_character":0,"end_line":131,"end_character":58},"in_reply_to":"dae33548_6ac174e4","updated":"2016-02-15 22:41:57.000000000","message":"Done","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":720,"context_line":"# class to the V8 class. Do not modify any of the method signatures in the Base"},{"line_number":721,"context_line":"# class - changes should only be made in the V8 and subsequent classes."},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"# Some drivers support a null domain_id by storing a special value."},{"line_number":724,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_5777fd39","line":723,"range":{"start_line":723,"start_character":0,"end_line":723,"end_character":67},"updated":"2016-02-15 21:30:06.000000000","message":"What about specifying we\u0027re talking about drivers starting from v9?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":720,"context_line":"# class to the V8 class. Do not modify any of the method signatures in the Base"},{"line_number":721,"context_line":"# class - changes should only be made in the V8 and subsequent classes."},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"# Some drivers support a null domain_id by storing a special value."},{"line_number":724,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":725,"context_line":""},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_23d95722","line":723,"range":{"start_line":723,"start_character":0,"end_line":723,"end_character":67},"in_reply_to":"dae33548_5777fd39","updated":"2016-02-15 22:41:57.000000000","message":"Done","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"    def delete_projects_from_ids(self, project_ids):"},{"line_number":1162,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1165,"context_line":"        return self.driver.list_project_parents(project_id)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":"    def list_projects_in_subtree(self, project_id):"},{"line_number":1168,"context_line":"        return self.driver.list_projects_in_subtree(project_id)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_6a3174a2","line":1165,"range":{"start_line":1164,"start_character":0,"end_line":1165,"end_character":59},"updated":"2016-02-15 21:30:06.000000000","message":"I think this need to be decoded, and a project with \"null\" domain_id maybe the parent of others.","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"    def delete_projects_from_ids(self, project_ids):"},{"line_number":1162,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"    def list_project_parents(self, project_id):"},{"line_number":1165,"context_line":"        return self.driver.list_project_parents(project_id)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":"    def list_projects_in_subtree(self, project_id):"},{"line_number":1168,"context_line":"        return self.driver.list_projects_in_subtree(project_id)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_638d1f31","line":1165,"range":{"start_line":1164,"start_character":0,"end_line":1165,"end_character":59},"in_reply_to":"dae33548_6a3174a2","updated":"2016-02-15 22:41:57.000000000","message":"I think you are right...","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"}],"keystone/tests/unit/backend/legacy_drivers/resource/V8/sql.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1525a4f321a81a43834fd899b6bb0cd76b8dae64","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def test_delete_large_project_cascade(self):"},{"line_number":42,"context_line":"        self.skipTest(\u0027Operation not supported in v8 and earlier drivers\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_hidden_project_domain_root_is_really_hidden(self):"},{"line_number":45,"context_line":"        self.skipTest(\u0027Operation not supported in v8 and earlier drivers\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_13a3a950","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":56},"updated":"2016-02-16 12:55:55.000000000","message":"Why is this skipped and test_hidden_domain_root_is_really_hidden is not ?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"64158ab1893bc9cfe44a46f776d109009645f9ac","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def test_delete_large_project_cascade(self):"},{"line_number":42,"context_line":"        self.skipTest(\u0027Operation not supported in v8 and earlier drivers\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_hidden_project_domain_root_is_really_hidden(self):"},{"line_number":45,"context_line":"        self.skipTest(\u0027Operation not supported in v8 and earlier drivers\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_466e0d97","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":56},"in_reply_to":"dae33548_13a3a950","updated":"2016-02-16 13:02:27.000000000","message":"So it was skipped since it contains new methods not supported by V8.","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":2595,"context_line":""},{"line_number":2596,"context_line":"        # Check that a corresponding domain was created"},{"line_number":2597,"context_line":"        self.resource_api.get_domain(project[\u0027id\u0027])"},{"line_number":2598,"context_line":""},{"line_number":2599,"context_line":"        # Try to delete is_domain project that is enabled"},{"line_number":2600,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":2601,"context_line":"                          self.resource_api.delete_project,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_6a94d436","line":2598,"updated":"2016-02-15 21:30:06.000000000","message":"unrelated change ?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":2595,"context_line":""},{"line_number":2596,"context_line":"        # Check that a corresponding domain was created"},{"line_number":2597,"context_line":"        self.resource_api.get_domain(project[\u0027id\u0027])"},{"line_number":2598,"context_line":""},{"line_number":2599,"context_line":"        # Try to delete is_domain project that is enabled"},{"line_number":2600,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":2601,"context_line":"                          self.resource_api.delete_project,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_c3e7cbe2","line":2598,"in_reply_to":"dae33548_6a94d436","updated":"2016-02-15 22:41:57.000000000","message":"no...see commit comment....this test was incorrectly written","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"06449cc5435983335e28530b2827d137487d9147","unresolved":false,"context_lines":[{"line_number":2615,"context_line":"        self.assertRaises(exception.DomainNotFound,"},{"line_number":2616,"context_line":"                          self.resource_api.get_domain,"},{"line_number":2617,"context_line":"                          project[\u0027id\u0027])"},{"line_number":2618,"context_line":""},{"line_number":2619,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2620,"context_line":"    def test_create_subproject_acting_as_domain_fails(self):"},{"line_number":2621,"context_line":"        root_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_ca99a070","line":2618,"updated":"2016-02-15 21:30:06.000000000","message":"ditto","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"db708f39a0a4b6e2dde0eefdd32cda59f401d112","unresolved":false,"context_lines":[{"line_number":2615,"context_line":"        self.assertRaises(exception.DomainNotFound,"},{"line_number":2616,"context_line":"                          self.resource_api.get_domain,"},{"line_number":2617,"context_line":"                          project[\u0027id\u0027])"},{"line_number":2618,"context_line":""},{"line_number":2619,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2620,"context_line":"    def test_create_subproject_acting_as_domain_fails(self):"},{"line_number":2621,"context_line":"        root_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_03d25300","line":2618,"in_reply_to":"dae33548_ca99a070","updated":"2016-02-15 22:41:57.000000000","message":"ditto :-)","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"5c644484e074203055f128746d5053b5c3866dcc","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"        # Can we filter for it?"},{"line_number":440,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":441,"context_line":"        hints.add_filter(\u0027domain_id\u0027, None)"},{"line_number":442,"context_line":"        refs \u003d self.resource_api.list_projects(hints)"},{"line_number":443,"context_line":"        self.assertThat(refs, matchers.HasLength(1))"},{"line_number":444,"context_line":"        self.assertDictEqual(project, refs[0])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_58534ee2","line":441,"range":{"start_line":441,"start_character":14,"end_line":441,"end_character":24},"updated":"2016-01-24 18:32:36.000000000","message":"Would it be a good idea to add some project into a domain other than NULL and do a list projects afterwards? Similarly add one more project to NULL domain and assert for length \u003d\u003d2.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8235a298c5dfcf69c8cd495d678ce66180e6b585","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"        # Can we filter for it?"},{"line_number":440,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":441,"context_line":"        hints.add_filter(\u0027domain_id\u0027, None)"},{"line_number":442,"context_line":"        refs \u003d self.resource_api.list_projects(hints)"},{"line_number":443,"context_line":"        self.assertThat(refs, matchers.HasLength(1))"},{"line_number":444,"context_line":"        self.assertDictEqual(project, refs[0])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_b83e0a26","line":441,"range":{"start_line":441,"start_character":14,"end_line":441,"end_character":24},"in_reply_to":"9a68dd71_58534ee2","updated":"2016-01-24 18:51:21.000000000","message":"I think it would, yes.  good idea.","commit_id":"54eb36e6d641d26b4c7e64ae25052ec456a6a2cf"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1525a4f321a81a43834fd899b6bb0cd76b8dae64","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                              driver.list_projects_in_domain,"},{"line_number":498,"context_line":"                              ref_id)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"            projects \u003d driver.list_projects_in_subtree(ref_id)"},{"line_number":501,"context_line":"            self.assertThat(projects, matchers.HasLength(0))"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":504,"context_line":"                              driver.list_project_parents,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_7c5647d3","line":501,"range":{"start_line":500,"start_character":12,"end_line":501,"end_character":60},"updated":"2016-02-16 12:55:55.000000000","message":"What about adding a subtree to the projs before checking this ?","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"64158ab1893bc9cfe44a46f776d109009645f9ac","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                              driver.list_projects_in_domain,"},{"line_number":498,"context_line":"                              ref_id)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"            projects \u003d driver.list_projects_in_subtree(ref_id)"},{"line_number":501,"context_line":"            self.assertThat(projects, matchers.HasLength(0))"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":504,"context_line":"                              driver.list_project_parents,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_e6d3e136","line":501,"range":{"start_line":500,"start_character":12,"end_line":501,"end_character":60},"in_reply_to":"dae33548_7c5647d3","updated":"2016-02-16 13:02:27.000000000","message":"yep, seems a good idea.","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4f5e8fba7aa8e1b4977bc04ff489628f31a28fd1","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                              driver.list_projects_in_domain,"},{"line_number":498,"context_line":"                              ref_id)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"            projects \u003d driver.list_projects_in_subtree(ref_id)"},{"line_number":501,"context_line":"            self.assertThat(projects, matchers.HasLength(0))"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":504,"context_line":"                              driver.list_project_parents,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_a9352adb","line":501,"range":{"start_line":500,"start_character":12,"end_line":501,"end_character":60},"in_reply_to":"dae33548_e6d3e136","updated":"2016-02-16 13:15:45.000000000","message":"actually, not sure that is required, since we are not pointing the parent_id at  the hidden row, just the domain_id FK","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1525a4f321a81a43834fd899b6bb0cd76b8dae64","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            projects \u003d driver.list_projects_in_subtree(ref_id)"},{"line_number":501,"context_line":"            self.assertThat(projects, matchers.HasLength(0))"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":504,"context_line":"                              driver.list_project_parents,"},{"line_number":505,"context_line":"                              ref_id)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"            # A non-existing project just returns True from the driver"},{"line_number":508,"context_line":"            self.assertTrue(driver.is_leaf_project(ref_id))"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_5369b124","line":505,"range":{"start_line":503,"start_character":12,"end_line":505,"end_character":37},"updated":"2016-02-16 12:55:55.000000000","message":"same here","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"64158ab1893bc9cfe44a46f776d109009645f9ac","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            projects \u003d driver.list_projects_in_subtree(ref_id)"},{"line_number":501,"context_line":"            self.assertThat(projects, matchers.HasLength(0))"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":504,"context_line":"                              driver.list_project_parents,"},{"line_number":505,"context_line":"                              ref_id)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"            # A non-existing project just returns True from the driver"},{"line_number":508,"context_line":"            self.assertTrue(driver.is_leaf_project(ref_id))"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_c6d69d26","line":505,"range":{"start_line":503,"start_character":12,"end_line":505,"end_character":37},"in_reply_to":"dae33548_5369b124","updated":"2016-02-16 13:02:27.000000000","message":"ageed","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4f5e8fba7aa8e1b4977bc04ff489628f31a28fd1","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            projects \u003d driver.list_projects_in_subtree(ref_id)"},{"line_number":501,"context_line":"            self.assertThat(projects, matchers.HasLength(0))"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":504,"context_line":"                              driver.list_project_parents,"},{"line_number":505,"context_line":"                              ref_id)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"            # A non-existing project just returns True from the driver"},{"line_number":508,"context_line":"            self.assertTrue(driver.is_leaf_project(ref_id))"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_e94d7273","line":505,"range":{"start_line":503,"start_character":12,"end_line":505,"end_character":37},"in_reply_to":"dae33548_c6d69d26","updated":"2016-02-16 13:15:45.000000000","message":"as above","commit_id":"45f9653ad7ef3b65fa28fc6708decda9fd4a956e"}]}
