)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":18,"context_line":"Co-Authored-By: Samuel de Medeiros Queiroz \u003csamuel@lsd.ufcg.edu.br\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Adam Young \u003cayoung@redhat.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib22a0f3007cb7ef6b4df6f48da5f4d018e905f55"},{"line_number":23,"context_line":"Partially-Implements: bp reseller"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":55,"id":"bae84128_831ed56d","line":20,"updated":"2016-02-24 03:33:59.000000000","message":"I think we need a few more :-)","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":18,"context_line":"Co-Authored-By: Samuel de Medeiros Queiroz \u003csamuel@lsd.ufcg.edu.br\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Adam Young \u003cayoung@redhat.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib22a0f3007cb7ef6b4df6f48da5f4d018e905f55"},{"line_number":23,"context_line":"Partially-Implements: bp reseller"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":55,"id":"bae84128_140af289","line":20,"in_reply_to":"bae84128_831ed56d","updated":"2016-02-24 08:49:06.000000000","message":"Christmas pass-the-parcel!","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":17,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":18,"context_line":"Co-Authored-By: Samuel de Medeiros Queiroz \u003csamuel@lsd.ufcg.edu.br\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Adam Young \u003cayoung@redhat.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"9aed3d3a_1640d7a4","line":18,"range":{"start_line":18,"start_character":44,"end_line":18,"end_character":66},"updated":"2016-02-26 17:30:41.000000000","message":"samueldmq@gmail.com","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":17,"context_line":"Co-Authored-By: Rodrigo Duarte \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":18,"context_line":"Co-Authored-By: Samuel de Medeiros Queiroz \u003csamuel@lsd.ufcg.edu.br\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Adam Young \u003cayoung@redhat.com\u003e"},{"line_number":20,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"9aed3d3a_0578898e","line":18,"range":{"start_line":18,"start_character":44,"end_line":18,"end_character":66},"in_reply_to":"9aed3d3a_1640d7a4","updated":"2016-02-26 18:18:42.000000000","message":"Done","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib22a0f3007cb7ef6b4df6f48da5f4d018e905f55"},{"line_number":23,"context_line":"Partially-Implements: bp reseller"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"9aed3d3a_6cc194e4","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":20},"updated":"2016-02-26 17:30:41.000000000","message":"Let\u0027s use \"Implements\" for tracking purposes in launchpad; we may create another bp for the other phases if needed","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Co-Authored-By: Henry Nash \u003chenryn@linux.vnet.ibm.com\u003e"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: Ib22a0f3007cb7ef6b4df6f48da5f4d018e905f55"},{"line_number":23,"context_line":"Partially-Implements: bp reseller"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"9aed3d3a_2575cd97","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":20},"in_reply_to":"9aed3d3a_6cc194e4","updated":"2016-02-26 18:18:42.000000000","message":"Done","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"}],"keystone/common/sql/migrate_repo/versions/092_migrate_domains_to_projects.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e4cb03662191fc1c3b1c2bca79c2f62824c13c8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":55,"id":"bae84128_29ca431b","updated":"2016-02-24 07:59:47.000000000","message":"this will need to be renamed to 093","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":55,"id":"bae84128_f7e14d2b","in_reply_to":"bae84128_29ca431b","updated":"2016-02-24 08:49:06.000000000","message":"Done","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import json"},{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_7e2c0699","line":14,"updated":"2016-02-24 03:33:59.000000000","message":"(nit) needs a newline","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import json"},{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_6f1f2b5b","line":14,"in_reply_to":"bae84128_7e2c0699","updated":"2016-02-24 08:49:06.000000000","message":"is that true?","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e4cb03662191fc1c3b1c2bca79c2f62824c13c8b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import json"},{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_a905b346","line":14,"in_reply_to":"bae84128_7e2c0699","updated":"2016-02-24 07:59:47.000000000","message":"new line between json and sqlalchemy, since one is standard lib and the other is 3rd party lib.\n\nalso, if you are using json, may as well use oslo.serialization:\n\n  from oslo_serialization import json_utils","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import json"},{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_97c9e1ae","line":14,"in_reply_to":"bae84128_a905b346","updated":"2016-02-24 08:49:06.000000000","message":"ah, got it","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":19,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":20,"context_line":"_PARENT_ID_COLUMN_NAME \u003d \u0027parent_id\u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_7e05260f","line":17,"updated":"2016-02-24 03:33:59.000000000","message":"(nit) needs a newline","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":19,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":20,"context_line":"_PARENT_ID_COLUMN_NAME \u003d \u0027parent_id\u0027"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_4f2227a4","line":17,"in_reply_to":"bae84128_7e05260f","updated":"2016-02-24 08:49:06.000000000","message":"Done","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e4cb03662191fc1c3b1c2bca79c2f62824c13c8b","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def upgrade(migrate_engine):"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _get_project_from_domain(domain):"},{"line_number":50,"context_line":"        # Creates a project ref with is_domain\u003dTrue from the provided"},{"line_number":51,"context_line":"        # domain."},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_ef921bf5","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":32},"updated":"2016-02-24 07:59:47.000000000","message":"nit: you\u0027re not \"getting\" anything...\n\n  _domain_to_project(domain):","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def upgrade(migrate_engine):"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _get_project_from_domain(domain):"},{"line_number":50,"context_line":"        # Creates a project ref with is_domain\u003dTrue from the provided"},{"line_number":51,"context_line":"        # domain."},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_d7c7e993","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":32},"in_reply_to":"bae84128_ef921bf5","updated":"2016-02-24 08:49:06.000000000","message":"Done","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        description \u003d None"},{"line_number":55,"context_line":"        extra \u003d domain.extra"},{"line_number":56,"context_line":"        if extra is not None:"},{"line_number":57,"context_line":"            description \u003d json.loads(extra).get(\u0027description\u0027, \u0027None\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        project_ref \u003d {"},{"line_number":60,"context_line":"            \u0027id\u0027: domain.id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_7e536617","line":57,"updated":"2016-02-24 03:33:59.000000000","message":"Why a string None?","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e4cb03662191fc1c3b1c2bca79c2f62824c13c8b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        description \u003d None"},{"line_number":55,"context_line":"        extra \u003d domain.extra"},{"line_number":56,"context_line":"        if extra is not None:"},{"line_number":57,"context_line":"            description \u003d json.loads(extra).get(\u0027description\u0027, \u0027None\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        project_ref \u003d {"},{"line_number":60,"context_line":"            \u0027id\u0027: domain.id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_2fb9a3cc","line":57,"range":{"start_line":57,"start_character":12,"end_line":57,"end_character":70},"updated":"2016-02-24 07:59:47.000000000","message":"what if there was additional metadata in the extra field, IIRC, this could be anything, like `key\u003dvalue`\n\n(venv) stevemar@ubuntu:/opt/stack/python-openstackclient$ curl -s \\\n\u003e   -H \"X-Auth-Token: c2ed16b83b90405c92788f492f9c6104\" \\\n\u003e   -H \"Content-Type: application/json\" \\\n\u003e   -d \u0027{ \"domain\": { \"name\": \"newdomain\", \"key\": \"value\"}}\u0027 \\\n\u003e   http://localhost:5000/v3/domains | python -mjson.tool\n{\n    \"domain\": {\n        \"enabled\": true,\n        \"id\": \"853668d91bc546c0b26073aaafcd5c8b\",\n        \"key\": \"value\",\n        \"links\": {\n            \"self\": \"http://localhost:5000/v3/domains/853668d91bc546c0b26073aaafcd5c8b\"\n        },\n        \"name\": \"newdomain\"\n    }\n}\n\nand in sql....\n\nmysql\u003e select * from domain;\n+----------------------------------+--------------------------+---------+-----------------------------------------------------------------------------------------+\n| id                               | name                     | enabled | extra                                                                                   |\n+----------------------------------+--------------------------+---------+-----------------------------------------------------------------------------------------+\n| 853668d91bc546c0b26073aaafcd5c8b | newdomain                |       1 | {\"key\": \"value\"}                                                                        |","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        description \u003d None"},{"line_number":55,"context_line":"        extra \u003d domain.extra"},{"line_number":56,"context_line":"        if extra is not None:"},{"line_number":57,"context_line":"            description \u003d json.loads(extra).get(\u0027description\u0027, \u0027None\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        project_ref \u003d {"},{"line_number":60,"context_line":"            \u0027id\u0027: domain.id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_77289d33","line":57,"range":{"start_line":57,"start_character":12,"end_line":57,"end_character":70},"in_reply_to":"bae84128_2fb9a3cc","updated":"2016-02-24 08:49:06.000000000","message":"Agreed, will re-write - and beef up the tests for the upgrade","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        description \u003d None"},{"line_number":55,"context_line":"        extra \u003d domain.extra"},{"line_number":56,"context_line":"        if extra is not None:"},{"line_number":57,"context_line":"            description \u003d json.loads(extra).get(\u0027description\u0027, \u0027None\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        project_ref \u003d {"},{"line_number":60,"context_line":"            \u0027id\u0027: domain.id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_af3db3c5","line":57,"in_reply_to":"bae84128_7e536617","updated":"2016-02-24 08:49:06.000000000","message":"Done","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e4cb03662191fc1c3b1c2bca79c2f62824c13c8b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027domain_id\u0027: NULL_DOMAIN_ID,"},{"line_number":65,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":66,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":67,"context_line":"            \u0027extra\u0027: \u0027{}\u0027"},{"line_number":68,"context_line":"        }"},{"line_number":69,"context_line":"        return project_ref"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_2fe083cc","line":67,"range":{"start_line":67,"start_character":21,"end_line":67,"end_character":25},"updated":"2016-02-24 07:59:47.000000000","message":"this might need to be the result of extra - description","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027domain_id\u0027: NULL_DOMAIN_ID,"},{"line_number":65,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":66,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":67,"context_line":"            \u0027extra\u0027: \u0027{}\u0027"},{"line_number":68,"context_line":"        }"},{"line_number":69,"context_line":"        return project_ref"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_b7e5050a","line":67,"range":{"start_line":67,"start_character":21,"end_line":67,"end_character":25},"in_reply_to":"bae84128_2fe083cc","updated":"2016-02-24 08:49:06.000000000","message":"Agreed","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"}],"keystone/common/sql/migrate_repo/versions/093_migrate_domains_to_projects.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b179aab6574c7bef005e5e6b4dccd15057f5fb29","unresolved":false,"context_lines":[{"line_number":21,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":22,"context_line":"_PARENT_ID_COLUMN_NAME \u003d \u0027parent_id\u0027"},{"line_number":23,"context_line":"_DOMAIN_ID_COLUMN_NAME \u003d \u0027domain_id\u0027"},{"line_number":24,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def list_existing_project_constraints(project_table, domain_table):"}],"source_content_type":"text/x-python","patch_set":56,"id":"bae84128_1a34ad48","line":24,"updated":"2016-02-24 19:23:01.000000000","message":"This needs a comment what it\u0027s for.","commit_id":"4584ea638f341c153c35f8f31b7a0108cc1c92aa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":21,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":22,"context_line":"_PARENT_ID_COLUMN_NAME \u003d \u0027parent_id\u0027"},{"line_number":23,"context_line":"_DOMAIN_ID_COLUMN_NAME \u003d \u0027domain_id\u0027"},{"line_number":24,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def list_existing_project_constraints(project_table, domain_table):"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_80ee8bb2","line":24,"updated":"2016-02-24 21:43:49.000000000","message":"This needs a comment what it\u0027s doing here.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":21,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":22,"context_line":"_PARENT_ID_COLUMN_NAME \u003d \u0027parent_id\u0027"},{"line_number":23,"context_line":"_DOMAIN_ID_COLUMN_NAME \u003d \u0027domain_id\u0027"},{"line_number":24,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def list_existing_project_constraints(project_table, domain_table):"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_56671025","line":24,"in_reply_to":"bae84128_80ee8bb2","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def upgrade(migrate_engine):"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _project_from_domain(domain):"},{"line_number":52,"context_line":"        # Creates a project ref with is_domain\u003dTrue from the provided"},{"line_number":53,"context_line":"        # domain."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        description \u003d None"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_bb6140d6","line":52,"range":{"start_line":52,"start_character":28,"end_line":52,"end_character":31},"updated":"2016-02-24 21:43:49.000000000","message":"what does \"ref\" mean? reference? A project is referenced by its ID. \"dict\" would make sense.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":49,"context_line":"def upgrade(migrate_engine):"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _project_from_domain(domain):"},{"line_number":52,"context_line":"        # Creates a project ref with is_domain\u003dTrue from the provided"},{"line_number":53,"context_line":"        # domain."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        description \u003d None"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_e3ff85a8","line":52,"range":{"start_line":52,"start_character":28,"end_line":52,"end_character":31},"in_reply_to":"bae84128_bb6140d6","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # first class attribute in projects"},{"line_number":60,"context_line":"            extra \u003d json.loads(domain.extra)"},{"line_number":61,"context_line":"            if \u0027description\u0027 in extra:"},{"line_number":62,"context_line":"                description \u003d extra.pop(\u0027description\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        project_ref \u003d {"},{"line_number":65,"context_line":"            \u0027id\u0027: domain.id,"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_db3a4498","line":62,"updated":"2016-02-24 21:43:49.000000000","message":"this could just be\n\n description \u003d extra.pop(\u0027description\u0027, None)","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            # first class attribute in projects"},{"line_number":60,"context_line":"            extra \u003d json.loads(domain.extra)"},{"line_number":61,"context_line":"            if \u0027description\u0027 in extra:"},{"line_number":62,"context_line":"                description \u003d extra.pop(\u0027description\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        project_ref \u003d {"},{"line_number":65,"context_line":"            \u0027id\u0027: domain.id,"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_e3edc5f0","line":62,"in_reply_to":"bae84128_db3a4498","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            if \u0027description\u0027 in extra:"},{"line_number":62,"context_line":"                description \u003d extra.pop(\u0027description\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        project_ref \u003d {"},{"line_number":65,"context_line":"            \u0027id\u0027: domain.id,"},{"line_number":66,"context_line":"            \u0027name\u0027: domain.name,"},{"line_number":67,"context_line":"            \u0027enabled\u0027: domain.enabled,"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_9b471c4b","line":64,"range":{"start_line":64,"start_character":15,"end_line":64,"end_character":19},"updated":"2016-02-24 21:43:49.000000000","message":"why _ref?","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            if \u0027description\u0027 in extra:"},{"line_number":62,"context_line":"                description \u003d extra.pop(\u0027description\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        project_ref \u003d {"},{"line_number":65,"context_line":"            \u0027id\u0027: domain.id,"},{"line_number":66,"context_line":"            \u0027name\u0027: domain.name,"},{"line_number":67,"context_line":"            \u0027enabled\u0027: domain.enabled,"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_03c4293e","line":64,"range":{"start_line":64,"start_character":15,"end_line":64,"end_character":19},"in_reply_to":"bae84128_9b471c4b","updated":"2016-02-25 14:42:21.000000000","message":"Just turned this into a return statement!","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \u0027name\u0027: domain.name,"},{"line_number":67,"context_line":"            \u0027enabled\u0027: domain.enabled,"},{"line_number":68,"context_line":"            \u0027description\u0027: description,"},{"line_number":69,"context_line":"            \u0027domain_id\u0027: NULL_DOMAIN_ID,"},{"line_number":70,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":71,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":72,"context_line":"            \u0027extra\u0027: json.dumps(extra)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_bb6b0085","line":69,"updated":"2016-02-24 21:43:49.000000000","message":"what\u0027s up with this? Could use a comment.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \u0027name\u0027: domain.name,"},{"line_number":67,"context_line":"            \u0027enabled\u0027: domain.enabled,"},{"line_number":68,"context_line":"            \u0027description\u0027: description,"},{"line_number":69,"context_line":"            \u0027domain_id\u0027: NULL_DOMAIN_ID,"},{"line_number":70,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":71,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":72,"context_line":"            \u0027extra\u0027: json.dumps(extra)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_c3c9a15c","line":69,"in_reply_to":"bae84128_bb6b0085","updated":"2016-02-25 14:42:21.000000000","message":"Have now explained this with a comment where NULL_DOMAIN_ID is defined.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    # in the end of this method. We also remove the domain_id constraint,"},{"line_number":87,"context_line":"    # while be recreated a FK to the project_id at the end."},{"line_number":88,"context_line":"    migration_helpers.remove_constraints("},{"line_number":89,"context_line":"        list_existing_project_constraints(project_table, domain_table))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    domains \u003d list(domain_table.select().execute())"},{"line_number":92,"context_line":"    for domain in domains:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_1b24acad","line":89,"updated":"2016-02-24 21:43:49.000000000","message":"if this wasn\u0027t a separate function the previous comment would be easier to understand.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    # in the end of this method. We also remove the domain_id constraint,"},{"line_number":87,"context_line":"    # while be recreated a FK to the project_id at the end."},{"line_number":88,"context_line":"    migration_helpers.remove_constraints("},{"line_number":89,"context_line":"        list_existing_project_constraints(project_table, domain_table))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    domains \u003d list(domain_table.select().execute())"},{"line_number":92,"context_line":"    for domain in domains:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_c6c36f89","line":89,"in_reply_to":"bae84128_1b24acad","updated":"2016-02-25 14:42:21.000000000","message":"Agreed, was just following convention, may come back in and improve this.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    domains \u003d list(domain_table.select().execute())"},{"line_number":92,"context_line":"    for domain in domains:"},{"line_number":93,"context_line":"        if domain.id !\u003d NULL_DOMAIN_ID:"},{"line_number":94,"context_line":"            # Create a project that acts as a domain based on the domain entry"},{"line_number":95,"context_line":"            is_domain_project \u003d _project_from_domain(domain)"},{"line_number":96,"context_line":"            new_entry \u003d project_table.insert().values(**is_domain_project)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_9bed5cf2","line":93,"updated":"2016-02-24 21:43:49.000000000","message":"How would this happen? Needs a comment.\n\nIf you want to skip domains where the id is !\u003d NULL_DOMAIN_ID then put that in the where clause of the select above.\n\nAlso, could avoid some indenting by\n\n  if domain.id \u003d\u003d NULL_DOMAIN_ID:\n    continue\n\nThis comment also applies to code in the next loop.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    domains \u003d list(domain_table.select().execute())"},{"line_number":92,"context_line":"    for domain in domains:"},{"line_number":93,"context_line":"        if domain.id !\u003d NULL_DOMAIN_ID:"},{"line_number":94,"context_line":"            # Create a project that acts as a domain based on the domain entry"},{"line_number":95,"context_line":"            is_domain_project \u003d _project_from_domain(domain)"},{"line_number":96,"context_line":"            new_entry \u003d project_table.insert().values(**is_domain_project)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_a6646be5","line":93,"in_reply_to":"bae84128_9bed5cf2","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    projects \u003d list(project_table.select().execute())"},{"line_number":101,"context_line":"    for project in projects:"},{"line_number":102,"context_line":"        if (project.parent_id is None and not project.is_domain and"},{"line_number":103,"context_line":"                project.id !\u003d NULL_DOMAIN_ID):"},{"line_number":104,"context_line":"            # Update the project parent_id to be its domain_id"},{"line_number":105,"context_line":"            values \u003d {\u0027parent_id\u0027: project.domain_id}"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_bbe4a0ac","line":102,"updated":"2016-02-24 21:43:49.000000000","message":"put these criteria into the were clause of the select statement.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    projects \u003d list(project_table.select().execute())"},{"line_number":101,"context_line":"    for project in projects:"},{"line_number":102,"context_line":"        if (project.parent_id is None and not project.is_domain and"},{"line_number":103,"context_line":"                project.id !\u003d NULL_DOMAIN_ID):"},{"line_number":104,"context_line":"            # Update the project parent_id to be its domain_id"},{"line_number":105,"context_line":"            values \u003d {\u0027parent_id\u0027: project.domain_id}"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_e6e31332","line":102,"in_reply_to":"bae84128_bbe4a0ac","updated":"2016-02-25 14:42:21.000000000","message":"I\u0027ll come back in a performance improve this ahead of Mitaka release.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    projects \u003d list(project_table.select().execute())"},{"line_number":101,"context_line":"    for project in projects:"},{"line_number":102,"context_line":"        if (project.parent_id is None and not project.is_domain and"},{"line_number":103,"context_line":"                project.id !\u003d NULL_DOMAIN_ID):"},{"line_number":104,"context_line":"            # Update the project parent_id to be its domain_id"},{"line_number":105,"context_line":"            values \u003d {\u0027parent_id\u0027: project.domain_id}"},{"line_number":106,"context_line":"            update \u003d project_table.update().where("}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_db2ec4f9","line":103,"updated":"2016-02-24 21:43:49.000000000","message":"project.id \u003d\u003d NULL_DOMAIN_ID? How could this happen? Needs a comment.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    projects \u003d list(project_table.select().execute())"},{"line_number":101,"context_line":"    for project in projects:"},{"line_number":102,"context_line":"        if (project.parent_id is None and not project.is_domain and"},{"line_number":103,"context_line":"                project.id !\u003d NULL_DOMAIN_ID):"},{"line_number":104,"context_line":"            # Update the project parent_id to be its domain_id"},{"line_number":105,"context_line":"            values \u003d {\u0027parent_id\u0027: project.domain_id}"},{"line_number":106,"context_line":"            update \u003d project_table.update().where("}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_c6952f89","line":103,"in_reply_to":"bae84128_db2ec4f9","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bf7bb02ba4d9a5f7580a526e3a86903dba7bb5c1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"# NULL_DOMAIN_ID, which all projects acting as a domain reference in their"},{"line_number":29,"context_line":"# domain_id attribute. This special row, as well as NULL_DOMAIN_ID, are never"},{"line_number":30,"context_line":"# exposed outside of sql driver layer."},{"line_number":31,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def list_existing_project_constraints(project_table, domain_table):"}],"source_content_type":"text/x-python","patch_set":59,"id":"9aed3d3a_c8e1ded2","line":31,"updated":"2016-02-26 02:48:29.000000000","message":"When does the domain get create with this id?","commit_id":"a2eeb2ab5854288a03cf56b2b70ccac75393e167"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b0d8537837a720ffe2a98a32f5881596b350398c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"# NULL_DOMAIN_ID, which all projects acting as a domain reference in their"},{"line_number":29,"context_line":"# domain_id attribute. This special row, as well as NULL_DOMAIN_ID, are never"},{"line_number":30,"context_line":"# exposed outside of sql driver layer."},{"line_number":31,"context_line":"NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def list_existing_project_constraints(project_table, domain_table):"}],"source_content_type":"text/x-python","patch_set":59,"id":"9aed3d3a_a4ad8733","line":31,"in_reply_to":"9aed3d3a_c8e1ded2","updated":"2016-02-26 08:22:52.000000000","message":"It was in a previous patch, see: https://review.openstack.org/#/c/264533/","commit_id":"a2eeb2ab5854288a03cf56b2b70ccac75393e167"}],"keystone/resource/backends/ldap.py":[{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"4503384e62a7e7924431b67ac2c88540845197f1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                if ref[\u0027id\u0027] \u003d\u003d CONF.identity.default_domain_id:"},{"line_number":65,"context_line":"                    ref \u003d dict(ref, parent_id\u003dNone)"},{"line_number":66,"context_line":"                else:"},{"line_number":67,"context_line":"                    ref \u003d dict(ref, parent_id\u003ddefault_domain.get(\u0027id\u0027))"},{"line_number":68,"context_line":"            return ref"},{"line_number":69,"context_line":"        elif isinstance(ref, list):"},{"line_number":70,"context_line":"            return [self._set_default_parent_project(x) for x in ref]"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a740942_2a0e21e5","line":67,"updated":"2015-12-08 16:33:53.000000000","message":"shouldn\u0027t this be in the format default_domain[\u0027id\u0027]?","commit_id":"6d4277b84e0fd4ffb55c952cbe7b74fcc99326f8"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"70ce2be114559a070bc4d2f43336fe923bf0de32","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                if ref[\u0027id\u0027] \u003d\u003d CONF.identity.default_domain_id:"},{"line_number":65,"context_line":"                    ref \u003d dict(ref, parent_id\u003dNone)"},{"line_number":66,"context_line":"                else:"},{"line_number":67,"context_line":"                    ref \u003d dict(ref, parent_id\u003ddefault_domain.get(\u0027id\u0027))"},{"line_number":68,"context_line":"            return ref"},{"line_number":69,"context_line":"        elif isinstance(ref, list):"},{"line_number":70,"context_line":"            return [self._set_default_parent_project(x) for x in ref]"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a740942_4b548fc9","line":67,"in_reply_to":"7a740942_2a0e21e5","updated":"2015-12-09 17:14:12.000000000","message":"Done","commit_id":"6d4277b84e0fd4ffb55c952cbe7b74fcc99326f8"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bf7bb02ba4d9a5f7580a526e3a86903dba7bb5c1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            new_ref \u003d ref.copy()"},{"line_number":34,"context_line":"            new_ref[\u0027domain_id\u0027] \u003d keystone_resource.NULL_DOMAIN_ID"},{"line_number":35,"context_line":"            return new_ref"},{"line_number":36,"context_line":"        else:"},{"line_number":37,"context_line":"            return ref"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _is_hidden_ref(self, ref):"}],"source_content_type":"text/x-python","patch_set":59,"id":"9aed3d3a_0803c674","line":36,"updated":"2016-02-26 02:48:29.000000000","message":"Why would there not be a domain_id?","commit_id":"a2eeb2ab5854288a03cf56b2b70ccac75393e167"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b0d8537837a720ffe2a98a32f5881596b350398c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            new_ref \u003d ref.copy()"},{"line_number":34,"context_line":"            new_ref[\u0027domain_id\u0027] \u003d keystone_resource.NULL_DOMAIN_ID"},{"line_number":35,"context_line":"            return new_ref"},{"line_number":36,"context_line":"        else:"},{"line_number":37,"context_line":"            return ref"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _is_hidden_ref(self, ref):"}],"source_content_type":"text/x-python","patch_set":59,"id":"9aed3d3a_848323cc","line":36,"in_reply_to":"9aed3d3a_0803c674","updated":"2016-02-26 08:22:52.000000000","message":"you are correct, we can assume the attribute is present (but it might be None)","commit_id":"a2eeb2ab5854288a03cf56b2b70ccac75393e167"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9b648c7da60188c9f443d6b113de7e0643faa613","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def default_assignment_driver(self):"},{"line_number":29,"context_line":"        return \u0027sql\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _encode_domain_id(self, ref):"},{"line_number":32,"context_line":"        if \u0027domain_id\u0027 in ref and ref[\u0027domain_id\u0027] is None:"},{"line_number":33,"context_line":"            new_ref \u003d ref.copy()"},{"line_number":34,"context_line":"            new_ref[\u0027domain_id\u0027] \u003d keystone_resource.NULL_DOMAIN_ID"},{"line_number":35,"context_line":"            return new_ref"},{"line_number":36,"context_line":"        else:"},{"line_number":37,"context_line":"            return ref"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _is_hidden_ref(self, ref):"},{"line_number":40,"context_line":"        return ref.id \u003d\u003d keystone_resource.NULL_DOMAIN_ID"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_27c3d539","line":38,"range":{"start_line":31,"start_character":0,"end_line":38,"end_character":0},"updated":"2016-02-29 09:54:24.000000000","message":"Why is this being added here now?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"856092319437316d2af97e1301c6ed3762e88a0d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def default_assignment_driver(self):"},{"line_number":29,"context_line":"        return \u0027sql\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _encode_domain_id(self, ref):"},{"line_number":32,"context_line":"        if \u0027domain_id\u0027 in ref and ref[\u0027domain_id\u0027] is None:"},{"line_number":33,"context_line":"            new_ref \u003d ref.copy()"},{"line_number":34,"context_line":"            new_ref[\u0027domain_id\u0027] \u003d keystone_resource.NULL_DOMAIN_ID"},{"line_number":35,"context_line":"            return new_ref"},{"line_number":36,"context_line":"        else:"},{"line_number":37,"context_line":"            return ref"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _is_hidden_ref(self, ref):"},{"line_number":40,"context_line":"        return ref.id \u003d\u003d keystone_resource.NULL_DOMAIN_ID"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_628aeb1c","line":38,"range":{"start_line":31,"start_character":0,"end_line":38,"end_character":0},"in_reply_to":"9aed3d3a_27c3d539","updated":"2016-02-29 10:00:40.000000000","message":"it was always called here, but defined at the manager level.  It is no longer used at the manager level.","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"}],"keystone/resource/controllers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # If the parent_id has not been provided, try to set it using the"},{"line_number":235,"context_line":"        # domain_id: for projects acting as a domain, both can be None."},{"line_number":236,"context_line":"        # However, for regular projects, the domain_id will be normalized."},{"line_number":237,"context_line":"        if not ref.get(\u0027parent_id\u0027):"},{"line_number":238,"context_line":"            ref[\u0027parent_id\u0027] \u003d ref.get(\u0027domain_id\u0027)"},{"line_number":239,"context_line":"        if not ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_bee96eb9","line":236,"updated":"2016-02-24 03:33:59.000000000","message":"I thought domain_id was not nullable and that\u0027s why you needed the null domain id","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # If the parent_id has not been provided, try to set it using the"},{"line_number":235,"context_line":"        # domain_id: for projects acting as a domain, both can be None."},{"line_number":236,"context_line":"        # However, for regular projects, the domain_id will be normalized."},{"line_number":237,"context_line":"        if not ref.get(\u0027parent_id\u0027):"},{"line_number":238,"context_line":"            ref[\u0027parent_id\u0027] \u003d ref.get(\u0027domain_id\u0027)"},{"line_number":239,"context_line":"        if not ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_6f6d6bcb","line":236,"in_reply_to":"bae84128_bee96eb9","updated":"2016-02-24 08:49:06.000000000","message":"At the API level (and manager level) the domain_id will be None (for projects acting as a domain). It\u0027s only at the driver level we substitute a special value to allow the integrity constraints to keep working.","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # If the parent_id has not been provided, try to set it using the"},{"line_number":235,"context_line":"        # domain_id: for projects acting as a domain, both can be None."},{"line_number":236,"context_line":"        # However, for regular projects, the domain_id will be normalized."},{"line_number":237,"context_line":"        if not ref.get(\u0027parent_id\u0027):"},{"line_number":238,"context_line":"            ref[\u0027parent_id\u0027] \u003d ref.get(\u0027domain_id\u0027)"},{"line_number":239,"context_line":"        if not ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_163f61d7","line":236,"updated":"2016-02-24 21:43:49.000000000","message":"comments should say why rather than what. The code already shows what\u0027s being done. What readers don\u0027t understand is why this is being done.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # If the parent_id has not been provided, try to set it using the"},{"line_number":235,"context_line":"        # domain_id: for projects acting as a domain, both can be None."},{"line_number":236,"context_line":"        # However, for regular projects, the domain_id will be normalized."},{"line_number":237,"context_line":"        if not ref.get(\u0027parent_id\u0027):"},{"line_number":238,"context_line":"            ref[\u0027parent_id\u0027] \u003d ref.get(\u0027domain_id\u0027)"},{"line_number":239,"context_line":"        if not ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_c64a4f27","line":236,"in_reply_to":"bae84128_163f61d7","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"}],"keystone/resource/core.py":[{"author":{"_account_id":15742,"name":"Paulo Ewerton Gomes Fragoso","email":"pauloewerton@lsd.ufcg.edu.br","username":"pauloewerton"},"change_message_id":"4503384e62a7e7924431b67ac2c88540845197f1","unresolved":false,"context_lines":[{"line_number":980,"context_line":""},{"line_number":981,"context_line":"    @abc.abstractmethod"},{"line_number":982,"context_line":"    def list_projects_acting_as_domain(self, hints):"},{"line_number":983,"context_line":"        \"\"\"List all projacts acting as domains."},{"line_number":984,"context_line":""},{"line_number":985,"context_line":"        :param hints: filter hints which the driver should"},{"line_number":986,"context_line":"                      implement if at all possible."}],"source_content_type":"text/x-python","patch_set":19,"id":"7a740942_2a9e2107","line":983,"updated":"2015-12-08 16:33:53.000000000","message":"projects*","commit_id":"6d4277b84e0fd4ffb55c952cbe7b74fcc99326f8"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"70ce2be114559a070bc4d2f43336fe923bf0de32","unresolved":false,"context_lines":[{"line_number":980,"context_line":""},{"line_number":981,"context_line":"    @abc.abstractmethod"},{"line_number":982,"context_line":"    def list_projects_acting_as_domain(self, hints):"},{"line_number":983,"context_line":"        \"\"\"List all projacts acting as domains."},{"line_number":984,"context_line":""},{"line_number":985,"context_line":"        :param hints: filter hints which the driver should"},{"line_number":986,"context_line":"                      implement if at all possible."}],"source_content_type":"text/x-python","patch_set":19,"id":"7a740942_6bff0bab","line":983,"in_reply_to":"7a740942_2a9e2107","updated":"2015-12-09 17:14:12.000000000","message":"Done","commit_id":"6d4277b84e0fd4ffb55c952cbe7b74fcc99326f8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5dd2ad047891688ed38fece1afec1d4baa50817c","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _update_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":325,"context_line":"        try:"},{"line_number":326,"context_line":"            original_tenant \u003d self.driver.get_project(tenant_id)"},{"line_number":327,"context_line":"        except exception.ProjectNotFound:"},{"line_number":328,"context_line":"            original_tenant \u003d self.driver.get_project(tenant_id,"},{"line_number":329,"context_line":"                                                      is_domain\u003dTrue)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":332,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_e3300e0a","line":329,"range":{"start_line":326,"start_character":0,"end_line":329,"end_character":69},"updated":"2016-01-12 01:44:14.000000000","message":"Not sure i understand this....and can\u0027t see that get_project takes an is_domain parameter anyway...","commit_id":"aaf2a9267ceb69ac283fb8d391026bcff5f6ed81"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5dd2ad047891688ed38fece1afec1d4baa50817c","unresolved":false,"context_lines":[{"line_number":665,"context_line":"        is_domain_project \u003d self._create_project("},{"line_number":666,"context_line":"            domain_id, project_from_domain, initiator)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        return is_domain_project"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"    @manager.response_truncated"},{"line_number":671,"context_line":"    def list_domains(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_83ffd233","line":668,"range":{"start_line":668,"start_character":15,"end_line":668,"end_character":32},"updated":"2016-01-12 01:44:14.000000000","message":"don\u0027t we need to call _get_domain_from_project() ?","commit_id":"aaf2a9267ceb69ac283fb8d391026bcff5f6ed81"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b3be99177b2945d0a60c9335f270485c1363a899","unresolved":false,"context_lines":[{"line_number":1406,"context_line":"        return self.driver.is_leaf_project(project_id)"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def list_projects_acting_as_domain(self, hints):"},{"line_number":1409,"context_line":"        # We can\u0027t assume a driver implements hints, so we need to get all the"},{"line_number":1410,"context_line":"        # projects and filter out those that are domains manually."},{"line_number":1411,"context_line":"        refs \u003d self.driver.list_projects(hints)"},{"line_number":1412,"context_line":"        return [self._decode_domain_id(p)"},{"line_number":1413,"context_line":"                for p in refs if p[\u0027domain_id\u0027] \u003d\u003d NULL_DOMAIN_ID]"}],"source_content_type":"text/x-python","patch_set":54,"id":"dae33548_5c16474c","line":1410,"range":{"start_line":1409,"start_character":8,"end_line":1410,"end_character":66},"updated":"2016-02-18 18:00:09.000000000","message":"Why can\u0027t we assume that a driver implements hints? Afaik all the drivers we had supported filtering.","commit_id":"9ad70145a1dde8670d6c28c74e5d4865c0290f39"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"25c7d2e523a2006bb9d1d9fa4e3d5b63247da8c4","unresolved":false,"context_lines":[{"line_number":1406,"context_line":"        return self.driver.is_leaf_project(project_id)"},{"line_number":1407,"context_line":""},{"line_number":1408,"context_line":"    def list_projects_acting_as_domain(self, hints):"},{"line_number":1409,"context_line":"        # We can\u0027t assume a driver implements hints, so we need to get all the"},{"line_number":1410,"context_line":"        # projects and filter out those that are domains manually."},{"line_number":1411,"context_line":"        refs \u003d self.driver.list_projects(hints)"},{"line_number":1412,"context_line":"        return [self._decode_domain_id(p)"},{"line_number":1413,"context_line":"                for p in refs if p[\u0027domain_id\u0027] \u003d\u003d NULL_DOMAIN_ID]"}],"source_content_type":"text/x-python","patch_set":54,"id":"bae84128_a38907cd","line":1410,"range":{"start_line":1409,"start_character":8,"end_line":1410,"end_character":66},"in_reply_to":"dae33548_5c16474c","updated":"2016-02-20 07:08:08.000000000","message":"So first off, our driver guidelines say that supporting hints is optional, and second, the point of this wrapper is to support legacy drivers (and for sure there have been drivers in the past that did not support hints)","commit_id":"9ad70145a1dde8670d6c28c74e5d4865c0290f39"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone.common import driver_hints"},{"line_number":27,"context_line":"from keystone.common import manager"},{"line_number":28,"context_line":"from keystone.common import utils"},{"line_number":29,"context_line":"from keystone import exception"},{"line_number":30,"context_line":"from keystone.i18n import _, _LE, _LW"},{"line_number":31,"context_line":"from keystone import notifications"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_b43d0ddf","line":29,"updated":"2016-02-24 03:33:59.000000000","message":"Are the changes in this module backward compatible for people that have their own drivers?","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0eeb9d84bcaf8f2ffe4d4f0202653952ba0ae6c2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone.common import driver_hints"},{"line_number":27,"context_line":"from keystone.common import manager"},{"line_number":28,"context_line":"from keystone.common import utils"},{"line_number":29,"context_line":"from keystone import exception"},{"line_number":30,"context_line":"from keystone.i18n import _, _LE, _LW"},{"line_number":31,"context_line":"from keystone import notifications"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_d5bfcfcd","line":29,"in_reply_to":"bae84128_8f942f8b","updated":"2016-02-24 13:59:55.000000000","message":"I\u0027m more worried about the actual calls themselves. For example, calling api.create_domain() previously called the custom driver\u0027s create_domain() method. Will the adapter\u0027s create_project look for the is_domain boolean and call create_domain on the driver?","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone.common import driver_hints"},{"line_number":27,"context_line":"from keystone.common import manager"},{"line_number":28,"context_line":"from keystone.common import utils"},{"line_number":29,"context_line":"from keystone import exception"},{"line_number":30,"context_line":"from keystone.i18n import _, _LE, _LW"},{"line_number":31,"context_line":"from keystone import notifications"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_8f942f8b","line":29,"in_reply_to":"bae84128_b43d0ddf","updated":"2016-02-24 08:49:06.000000000","message":"so in terms of the format and use of the data fields, then yes - i.e. the legacy driver wrapper will ensure that they do not see null domain_id\u0027s for instance. What I didn\u0027t do was reverse the whole process in the wrapper and ensure domains are still stored in the domain table.","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            \u0027parent_id\u0027: None}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def calc_default_domain():"},{"line_number":52,"context_line":"    default_project \u003d calc_default_domain_project()"},{"line_number":53,"context_line":"    default_project.pop(\u0027domain_id\u0027)"},{"line_number":54,"context_line":"    default_project.pop(\u0027is_domain\u0027)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_566449e4","line":51,"updated":"2016-02-24 21:43:49.000000000","message":"This needs a docstring. It\u0027s not obvious why it\u0027s here.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            \u0027parent_id\u0027: None}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def calc_default_domain():"},{"line_number":52,"context_line":"    default_project \u003d calc_default_domain_project()"},{"line_number":53,"context_line":"    default_project.pop(\u0027domain_id\u0027)"},{"line_number":54,"context_line":"    default_project.pop(\u0027is_domain\u0027)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_35c1912f","line":51,"in_reply_to":"bae84128_566449e4","updated":"2016-02-25 14:42:21.000000000","message":"This isn\u0027t new, it was here before, albeit modified - have added one. The method above is new, and I added a doc string to that too.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        Called when is_domain is false, and the project must contain a valid"},{"line_number":137,"context_line":"        domain_id and may have a parent. If the parent is a regular project,"},{"line_number":138,"context_line":"        this project must be in the same domain as its parent."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :raises keystone.exception.ValidationError: If one of the constraints"},{"line_number":141,"context_line":"            was not satisfied."}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_36b3850c","line":138,"updated":"2016-02-24 21:43:49.000000000","message":"This docstring needs to be update with the new behavior.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"        Called when is_domain is false, and the project must contain a valid"},{"line_number":137,"context_line":"        domain_id and may have a parent. If the parent is a regular project,"},{"line_number":138,"context_line":"        this project must be in the same domain as its parent."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :raises keystone.exception.ValidationError: If one of the constraints"},{"line_number":141,"context_line":"            was not satisfied."}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_aba3844e","line":138,"in_reply_to":"bae84128_36b3850c","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        # Ensure domain_id is valid, and by inference will not be None."},{"line_number":146,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":147,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":148,"context_line":"        parent_is_domain \u003d parent_ref.get(\u0027is_domain\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if parent_is_domain:"},{"line_number":151,"context_line":"            if parent_ref[\u0027id\u0027] !\u003d domain[\u0027id\u0027]:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_16e121ff","line":148,"updated":"2016-02-24 21:43:49.000000000","message":"this needs to either be parent_ref[\u0027is_domain\u0027] or parent_ref.get(\u0027is_domain\u0027, False) since parent_is_domain should be a bool and not None.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        # Ensure domain_id is valid, and by inference will not be None."},{"line_number":146,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":147,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":148,"context_line":"        parent_is_domain \u003d parent_ref.get(\u0027is_domain\u0027)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if parent_is_domain:"},{"line_number":151,"context_line":"            if parent_ref[\u0027id\u0027] !\u003d domain[\u0027id\u0027]:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_8b620015","line":148,"in_reply_to":"bae84128_16e121ff","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2429a3a169c33f4468e4b99b68ea7aa55338fa3b","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if parent_is_domain:"},{"line_number":151,"context_line":"            if parent_ref[\u0027id\u0027] !\u003d domain[\u0027id\u0027]:"},{"line_number":152,"context_line":"                raise exception.ValidationError("},{"line_number":153,"context_line":"                    message\u003d_(\u0027Cannot create project, since its parent \u0027"},{"line_number":154,"context_line":"                              \u0027(%(domain_id)s) is acting as a domain, \u0027"},{"line_number":155,"context_line":"                              \u0027but project\\\u0027s specified parent_id \u0027"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_1dd024c9","line":152,"updated":"2016-02-24 20:28:01.000000000","message":"coverage report shows this isn\u0027t tested.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if parent_is_domain:"},{"line_number":151,"context_line":"            if parent_ref[\u0027id\u0027] !\u003d domain[\u0027id\u0027]:"},{"line_number":152,"context_line":"                raise exception.ValidationError("},{"line_number":153,"context_line":"                    message\u003d_(\u0027Cannot create project, since its parent \u0027"},{"line_number":154,"context_line":"                              \u0027(%(domain_id)s) is acting as a domain, \u0027"},{"line_number":155,"context_line":"                              \u0027but project\\\u0027s specified parent_id \u0027"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_0ee71e13","line":152,"in_reply_to":"bae84128_1dd024c9","updated":"2016-02-25 14:42:21.000000000","message":"Test added.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    % {\u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":159,"context_line":"                       \u0027parent_id\u0027: parent_ref[\u0027id\u0027]})"},{"line_number":160,"context_line":"        else:"},{"line_number":161,"context_line":"            parent_domain_id \u003d parent_ref.get(\u0027domain_id\u0027)"},{"line_number":162,"context_line":"            if parent_domain_id !\u003d domain[\u0027id\u0027]:"},{"line_number":163,"context_line":"                raise exception.ValidationError("},{"line_number":164,"context_line":"                    message\u003d_(\u0027Cannot create project, since it specifies \u0027"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_b69e7561","line":161,"updated":"2016-02-24 21:43:49.000000000","message":"Can parent_ref not have a domain_id? If so then this can be None and the exception message is going to look strange. If not, change it to []","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    % {\u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":159,"context_line":"                       \u0027parent_id\u0027: parent_ref[\u0027id\u0027]})"},{"line_number":160,"context_line":"        else:"},{"line_number":161,"context_line":"            parent_domain_id \u003d parent_ref.get(\u0027domain_id\u0027)"},{"line_number":162,"context_line":"            if parent_domain_id !\u003d domain[\u0027id\u0027]:"},{"line_number":163,"context_line":"                raise exception.ValidationError("},{"line_number":164,"context_line":"                    message\u003d_(\u0027Cannot create project, since it specifies \u0027"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_187c841f","line":161,"in_reply_to":"bae84128_b69e7561","updated":"2016-02-25 14:42:21.000000000","message":"If the parent is not a domain, then it will have a domain_id","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                       \u0027parent_domain_id\u0027: parent_domain_id})"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _enforce_project_constraints(self, project_ref):"},{"line_number":172,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"},{"line_number":175,"context_line":"            self._assert_is_domain_project_constraints(project_ref)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_36e6e5e8","line":172,"updated":"2016-02-24 21:43:49.000000000","message":"is it possible for project_ref to not have a parent_id field? If not, use [] instead of .get()","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                       \u0027parent_domain_id\u0027: parent_domain_id})"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _enforce_project_constraints(self, project_ref):"},{"line_number":172,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"},{"line_number":175,"context_line":"            self._assert_is_domain_project_constraints(project_ref)"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_18a3e49f","line":172,"in_reply_to":"bae84128_36e6e5e8","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":180,"context_line":"        if parent_id:"},{"line_number":181,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":182,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":183,"context_line":"            parents_list.append(parent_ref)"},{"line_number":184,"context_line":"            for ref in parents_list:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_161001a8","line":181,"updated":"2016-02-24 21:43:49.000000000","message":"this is only used at line 191 so suggest move it down there, otherwise might get an exception rather than the one at line 186.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":180,"context_line":"        if parent_id:"},{"line_number":181,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":182,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":183,"context_line":"            parents_list.append(parent_ref)"},{"line_number":184,"context_line":"            for ref in parents_list:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_58060c21","line":181,"in_reply_to":"bae84128_161001a8","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            raise AssertionError(_(\u0027Domain cannot be named %s\u0027)"},{"line_number":289,"context_line":"                                 % domain[\u0027name\u0027])"},{"line_number":290,"context_line":"        if (domain_id.lower() \u003d\u003d federated_domain):"},{"line_number":291,"context_line":"            raise AssertionError(_(\u0027Domain cannot have ID %s\u0027) % domain_id)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def assert_project_enabled(self, project_id, project\u003dNone):"},{"line_number":294,"context_line":"        \"\"\"Assert the project is enabled and its associated domain is enabled."}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_3611c55e","line":291,"updated":"2016-02-24 21:43:49.000000000","message":"revert this change it\u0027s unrelated, and there\u0027s enough changes in this review already.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            raise AssertionError(_(\u0027Domain cannot be named %s\u0027)"},{"line_number":289,"context_line":"                                 % domain[\u0027name\u0027])"},{"line_number":290,"context_line":"        if (domain_id.lower() \u003d\u003d federated_domain):"},{"line_number":291,"context_line":"            raise AssertionError(_(\u0027Domain cannot have ID %s\u0027) % domain_id)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def assert_project_enabled(self, project_id, project\u003dNone):"},{"line_number":294,"context_line":"        \"\"\"Assert the project is enabled and its associated domain is enabled."}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_cb08882b","line":291,"in_reply_to":"bae84128_3611c55e","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \"\"\""},{"line_number":298,"context_line":"        if project is None:"},{"line_number":299,"context_line":"            project \u003d self.get_project(project_id)"},{"line_number":300,"context_line":"        # The domain_id of projects acting as domains is None"},{"line_number":301,"context_line":"        if project[\u0027domain_id\u0027]:"},{"line_number":302,"context_line":"            self.assert_domain_enabled(domain_id\u003dproject[\u0027domain_id\u0027])"},{"line_number":303,"context_line":"        if not project.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_3108af28","line":300,"updated":"2016-02-24 21:43:49.000000000","message":"this comment doesn\u0027t explain anything. Why do I need to know this?","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        \"\"\""},{"line_number":298,"context_line":"        if project is None:"},{"line_number":299,"context_line":"            project \u003d self.get_project(project_id)"},{"line_number":300,"context_line":"        # The domain_id of projects acting as domains is None"},{"line_number":301,"context_line":"        if project[\u0027domain_id\u0027]:"},{"line_number":302,"context_line":"            self.assert_domain_enabled(domain_id\u003dproject[\u0027domain_id\u0027])"},{"line_number":303,"context_line":"        if not project.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_6ba5fcb3","line":300,"in_reply_to":"bae84128_3108af28","updated":"2016-02-25 14:42:21.000000000","message":"modifed","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        project_ref \u003d self.get_project(project_id)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Make the domain checks"},{"line_number":472,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"},{"line_number":473,"context_line":"            domain \u003d self._get_domain_from_project(project_ref)"},{"line_number":474,"context_line":"            self.assert_domain_not_federated(project_id, domain)"},{"line_number":475,"context_line":"            if \u0027enabled\u0027 in domain:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_319eef07","line":472,"updated":"2016-02-24 21:43:49.000000000","message":"use .get(\u0027is_domain\u0027) or [\u0027is_domain\u0027] consistently (see line 479).","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        project_ref \u003d self.get_project(project_id)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Make the domain checks"},{"line_number":472,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"},{"line_number":473,"context_line":"            domain \u003d self._get_domain_from_project(project_ref)"},{"line_number":474,"context_line":"            self.assert_domain_not_federated(project_id, domain)"},{"line_number":475,"context_line":"            if \u0027enabled\u0027 in domain:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_8bb5e0d1","line":472,"in_reply_to":"bae84128_319eef07","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cf476a8b7bed0841cb02c8f87ef77480b22a4b6","unresolved":false,"context_lines":[{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        ret \u003d self._update_project(project_id, project, initiator, cascade)"},{"line_number":479,"context_line":"        if ret[\u0027is_domain\u0027]:"},{"line_number":480,"context_line":"            self.get_domain.invalidate(self, project_id)"},{"line_number":481,"context_line":"            self.get_domain_by_name.invalidate(self, ret[\u0027name\u0027])"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_71f877c5","line":480,"updated":"2016-02-24 21:43:49.000000000","message":"we shouldn\u0027t have separate project and domain caches.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        ret \u003d self._update_project(project_id, project, initiator, cascade)"},{"line_number":479,"context_line":"        if ret[\u0027is_domain\u0027]:"},{"line_number":480,"context_line":"            self.get_domain.invalidate(self, project_id)"},{"line_number":481,"context_line":"            self.get_domain_by_name.invalidate(self, ret[\u0027name\u0027])"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_2b7494fb","line":480,"in_reply_to":"bae84128_71f877c5","updated":"2016-02-25 14:42:21.000000000","message":"So that\u0027s a good question...of course the entities returned (for a project acting as a domain) are different depending on whether you call update_domain or update_project (for API backward compatibility) - so to have a single cache we would need to have that \"under\" the code that massages the resulting entity. I\u0027d be happy to look at this as a follow up.","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":19985,"name":"Ryosuke Mizuno","email":"r-mizuno@rs.jp.nec.com","username":"r-mizuno"},"change_message_id":"f3754ef608805a457afd389ed1d1fd6b34212dbb","unresolved":false,"context_lines":[{"line_number":741,"context_line":"        \"\"\"Creates a domain ref from a project ref."},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        Based on the provided project ref, creates a domain ref, so that the"},{"line_number":744,"context_line":"        result can be returned in response to a domain APi call."},{"line_number":745,"context_line":"        \"\"\""},{"line_number":746,"context_line":"        if not project_ref.get(\u0027is_domain\u0027):"},{"line_number":747,"context_line":"            LOG.error(_LE(\u0027Asked to convert a non-domain project into a \u0027"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_27ba2a6f","line":744,"range":{"start_line":744,"start_character":55,"end_line":744,"end_character":58},"updated":"2016-02-25 01:16:07.000000000","message":"nit: API","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":741,"context_line":"        \"\"\"Creates a domain ref from a project ref."},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        Based on the provided project ref, creates a domain ref, so that the"},{"line_number":744,"context_line":"        result can be returned in response to a domain APi call."},{"line_number":745,"context_line":"        \"\"\""},{"line_number":746,"context_line":"        if not project_ref.get(\u0027is_domain\u0027):"},{"line_number":747,"context_line":"            LOG.error(_LE(\u0027Asked to convert a non-domain project into a \u0027"}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_6bcb3c1f","line":744,"range":{"start_line":744,"start_character":55,"end_line":744,"end_character":58},"in_reply_to":"bae84128_27ba2a6f","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":19985,"name":"Ryosuke Mizuno","email":"r-mizuno@rs.jp.nec.com","username":"r-mizuno"},"change_message_id":"f3754ef608805a457afd389ed1d1fd6b34212dbb","unresolved":false,"context_lines":[{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @abc.abstractmethod"},{"line_number":1263,"context_line":"    def list_projects_acting_as_domain(self, hints):"},{"line_number":1264,"context_line":"        \"\"\"List all projacts acting as domains."},{"line_number":1265,"context_line":""},{"line_number":1266,"context_line":"        :param hints: filter hints which the driver should"},{"line_number":1267,"context_line":"                      implement if at all possible."}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_a71c7ac2","line":1264,"range":{"start_line":1264,"start_character":20,"end_line":1264,"end_character":28},"updated":"2016-02-25 01:16:07.000000000","message":"nit: projects","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a7113f1d44d5ab78f30536d29d868e0b5d1095c2","unresolved":false,"context_lines":[{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    @abc.abstractmethod"},{"line_number":1263,"context_line":"    def list_projects_acting_as_domain(self, hints):"},{"line_number":1264,"context_line":"        \"\"\"List all projacts acting as domains."},{"line_number":1265,"context_line":""},{"line_number":1266,"context_line":"        :param hints: filter hints which the driver should"},{"line_number":1267,"context_line":"                      implement if at all possible."}],"source_content_type":"text/x-python","patch_set":57,"id":"bae84128_abd544ba","line":1264,"range":{"start_line":1264,"start_character":20,"end_line":1264,"end_character":28},"in_reply_to":"bae84128_a71c7ac2","updated":"2016-02-25 14:42:21.000000000","message":"Done","commit_id":"5ab5d11360d6412142313ddbadb612b127913c90"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"bf7bb02ba4d9a5f7580a526e3a86903dba7bb5c1","unresolved":false,"context_lines":[{"line_number":775,"context_line":"                utils.is_not_url_safe(domain[\u0027name\u0027])):"},{"line_number":776,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":777,"context_line":"        project_from_domain \u003d self._get_project_from_domain(domain)"},{"line_number":778,"context_line":"        is_domain_project \u003d self._create_project("},{"line_number":779,"context_line":"            domain_id, project_from_domain, initiator)"},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        return self._get_domain_from_project(is_domain_project)"}],"source_content_type":"text/x-python","patch_set":59,"id":"9aed3d3a_4ebb0473","line":778,"updated":"2016-02-26 02:48:29.000000000","message":"This is not backward compatible with third party driver expectations","commit_id":"a2eeb2ab5854288a03cf56b2b70ccac75393e167"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b0d8537837a720ffe2a98a32f5881596b350398c","unresolved":false,"context_lines":[{"line_number":775,"context_line":"                utils.is_not_url_safe(domain[\u0027name\u0027])):"},{"line_number":776,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":777,"context_line":"        project_from_domain \u003d self._get_project_from_domain(domain)"},{"line_number":778,"context_line":"        is_domain_project \u003d self._create_project("},{"line_number":779,"context_line":"            domain_id, project_from_domain, initiator)"},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        return self._get_domain_from_project(is_domain_project)"}],"source_content_type":"text/x-python","patch_set":59,"id":"9aed3d3a_c426cb15","line":778,"in_reply_to":"9aed3d3a_4ebb0473","updated":"2016-02-26 08:22:52.000000000","message":"...but if you look in the V8wrapper, we map this BACK onto the driver domain call....so I think we are providing backward compatibility","commit_id":"a2eeb2ab5854288a03cf56b2b70ccac75393e167"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # increase the depth of any existing project hierarchy by one. To avoid"},{"line_number":101,"context_line":"        # pushing any existing hierarchies over the limit, we add one to the"},{"line_number":102,"context_line":"        # maximum depth allowed, as specified in the configuration file."},{"line_number":103,"context_line":"        max_depth \u003d CONF.max_project_tree_depth + 1"},{"line_number":104,"context_line":"        if self._get_hierarchy_depth(parents_list) \u003e max_depth:"},{"line_number":105,"context_line":"            raise exception.ForbiddenNotSecurity("},{"line_number":106,"context_line":"                _(\u0027Max hierarchy depth reached for %s branch.\u0027) % project_id)"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_057d3b1c","line":103,"range":{"start_line":103,"start_character":47,"end_line":103,"end_character":51},"updated":"2016-02-26 17:30:41.000000000","message":"Agreed, but we need to update the config option to say this too!","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # increase the depth of any existing project hierarchy by one. To avoid"},{"line_number":101,"context_line":"        # pushing any existing hierarchies over the limit, we add one to the"},{"line_number":102,"context_line":"        # maximum depth allowed, as specified in the configuration file."},{"line_number":103,"context_line":"        max_depth \u003d CONF.max_project_tree_depth + 1"},{"line_number":104,"context_line":"        if self._get_hierarchy_depth(parents_list) \u003e max_depth:"},{"line_number":105,"context_line":"            raise exception.ForbiddenNotSecurity("},{"line_number":106,"context_line":"                _(\u0027Max hierarchy depth reached for %s branch.\u0027) % project_id)"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_65107502","line":103,"range":{"start_line":103,"start_character":47,"end_line":103,"end_character":51},"in_reply_to":"9aed3d3a_057d3b1c","updated":"2016-02-26 18:18:42.000000000","message":"Done","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        Called when is_domain is false. The project must contain a valid"},{"line_number":136,"context_line":"        domain_id and parent_id. The goal of this method is to check"},{"line_number":137,"context_line":"        that the domain_id specified is consistent with the domain of any"},{"line_number":138,"context_line":"        parent."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :raises keystone.exception.ValidationError: If one of the constraints"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_8005b9c3","line":137,"range":{"start_line":137,"start_character":70,"end_line":137,"end_character":73},"updated":"2016-02-26 17:30:41.000000000","message":"\"its\" (we only check on the immediate parent)","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        Called when is_domain is false. The project must contain a valid"},{"line_number":136,"context_line":"        domain_id and parent_id. The goal of this method is to check"},{"line_number":137,"context_line":"        that the domain_id specified is consistent with the domain of any"},{"line_number":138,"context_line":"        parent."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        :raises keystone.exception.ValidationError: If one of the constraints"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_e50485c1","line":137,"range":{"start_line":137,"start_character":70,"end_line":137,"end_character":73},"in_reply_to":"9aed3d3a_8005b9c3","updated":"2016-02-26 18:18:42.000000000","message":"Done","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self._assert_regular_project_constraints(project_ref)"},{"line_number":176,"context_line":"            # The whole hierarchy (upwards) must be enabled"},{"line_number":177,"context_line":"            parent_id \u003d project_ref[\u0027parent_id\u0027]"},{"line_number":178,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":179,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":180,"context_line":"            parents_list.append(parent_ref)"},{"line_number":181,"context_line":"            for ref in parents_list:"},{"line_number":182,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":183,"context_line":"                    raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_60651544","line":180,"range":{"start_line":177,"start_character":12,"end_line":180,"end_character":43},"updated":"2016-02-26 17:30:41.000000000","message":"Why not get parent list from the current project instead of its parent and adding parent after:\n\n    parents_list \u003d self.list_project_parents(project_ref[\u0027id\u0027])\n\nTHis should replace all these lines","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3bb5143d8ca2a3155280377b190d84ce0405c4e3","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self._assert_regular_project_constraints(project_ref)"},{"line_number":176,"context_line":"            # The whole hierarchy (upwards) must be enabled"},{"line_number":177,"context_line":"            parent_id \u003d project_ref[\u0027parent_id\u0027]"},{"line_number":178,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":179,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":180,"context_line":"            parents_list.append(parent_ref)"},{"line_number":181,"context_line":"            for ref in parents_list:"},{"line_number":182,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":183,"context_line":"                    raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_c3ba14e1","line":180,"range":{"start_line":177,"start_character":12,"end_line":180,"end_character":43},"in_reply_to":"9aed3d3a_0c7d516e","updated":"2016-02-26 20:32:46.000000000","message":"ah, sorry, get your point!","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self._assert_regular_project_constraints(project_ref)"},{"line_number":176,"context_line":"            # The whole hierarchy (upwards) must be enabled"},{"line_number":177,"context_line":"            parent_id \u003d project_ref[\u0027parent_id\u0027]"},{"line_number":178,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":179,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":180,"context_line":"            parents_list.append(parent_ref)"},{"line_number":181,"context_line":"            for ref in parents_list:"},{"line_number":182,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":183,"context_line":"                    raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_e90c5f3d","line":180,"range":{"start_line":177,"start_character":12,"end_line":180,"end_character":43},"in_reply_to":"9aed3d3a_60651544","updated":"2016-02-26 18:18:42.000000000","message":"...although list_project_parents(project_id) does not put the starting project in the list....","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2231aa0464843c660f5ce718dc9a86f7f7bb1db5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self._assert_regular_project_constraints(project_ref)"},{"line_number":176,"context_line":"            # The whole hierarchy (upwards) must be enabled"},{"line_number":177,"context_line":"            parent_id \u003d project_ref[\u0027parent_id\u0027]"},{"line_number":178,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":179,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":180,"context_line":"            parents_list.append(parent_ref)"},{"line_number":181,"context_line":"            for ref in parents_list:"},{"line_number":182,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":183,"context_line":"                    raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_9e34dffb","line":180,"range":{"start_line":177,"start_character":12,"end_line":180,"end_character":43},"in_reply_to":"9aed3d3a_c3ba14e1","updated":"2016-02-26 21:06:16.000000000","message":"...arrrhhh! So there is a reason you can\u0027t do what you suggest...and that is this is called on create_project, so the project_ref does not yet exist in the DB, so you have to be careful not to call anything that will do a get_project() on it!!!","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"cf3496c047f04752f9ef9fd9082946d4d79b6643","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self._assert_regular_project_constraints(project_ref)"},{"line_number":176,"context_line":"            # The whole hierarchy (upwards) must be enabled"},{"line_number":177,"context_line":"            parent_id \u003d project_ref[\u0027parent_id\u0027]"},{"line_number":178,"context_line":"            parents_list \u003d self.list_project_parents(parent_id)"},{"line_number":179,"context_line":"            parent_ref \u003d self.get_project(parent_id)"},{"line_number":180,"context_line":"            parents_list.append(parent_ref)"},{"line_number":181,"context_line":"            for ref in parents_list:"},{"line_number":182,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":183,"context_line":"                    raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_0c7d516e","line":180,"range":{"start_line":177,"start_character":12,"end_line":180,"end_character":43},"in_reply_to":"9aed3d3a_e90c5f3d","updated":"2016-02-26 18:51:23.000000000","message":"list_project_parents(project_ref[\u0027id\u0027]) would include parent_ref, which is what we\u0027re adding at L180. We don\u0027t add the project_ref passed as argument to the list","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":740,"context_line":"                      {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":741,"context_line":"                       \u0027id\u0027: project_ref[\u0027id\u0027],"},{"line_number":742,"context_line":"                       \u0027project_name\u0027: project_ref[\u0027name\u0027]})"},{"line_number":743,"context_line":"            raise exception.UnexpectedError("},{"line_number":744,"context_line":"                _(\u0027An unexpected error occurred when retrieving domain \u0027"},{"line_number":745,"context_line":"                  \u0027information\u0027))"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_d4e1359c","line":743,"range":{"start_line":743,"start_character":18,"end_line":743,"end_character":43},"updated":"2016-02-26 17:30:41.000000000","message":"I\u0027d argue this should be exception.DomainNotFound\n\nThe way it is, if I ask get_domain(simple_project_id) it will throw unexpected, when it sould be domainNotFound\n\nAnd actually it may have different meanings depending on the caller; e.g if the caller is create_domain, we don\u0027t want neither a DomainNotFound or a UnexpectedError","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3bb5143d8ca2a3155280377b190d84ce0405c4e3","unresolved":false,"context_lines":[{"line_number":740,"context_line":"                      {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":741,"context_line":"                       \u0027id\u0027: project_ref[\u0027id\u0027],"},{"line_number":742,"context_line":"                       \u0027project_name\u0027: project_ref[\u0027name\u0027]})"},{"line_number":743,"context_line":"            raise exception.UnexpectedError("},{"line_number":744,"context_line":"                _(\u0027An unexpected error occurred when retrieving domain \u0027"},{"line_number":745,"context_line":"                  \u0027information\u0027))"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_e38638da","line":743,"range":{"start_line":743,"start_character":18,"end_line":743,"end_character":43},"in_reply_to":"9aed3d3a_0c45516f","updated":"2016-02-26 20:32:46.000000000","message":"OK, it\u0027s a fair cop, guv! I agree - either we add checks to the variou domain specific calls for when someone passes them a valid non-domain project id....or we make this DomainNotFound. The later seems easier!","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"cf3496c047f04752f9ef9fd9082946d4d79b6643","unresolved":false,"context_lines":[{"line_number":740,"context_line":"                      {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":741,"context_line":"                       \u0027id\u0027: project_ref[\u0027id\u0027],"},{"line_number":742,"context_line":"                       \u0027project_name\u0027: project_ref[\u0027name\u0027]})"},{"line_number":743,"context_line":"            raise exception.UnexpectedError("},{"line_number":744,"context_line":"                _(\u0027An unexpected error occurred when retrieving domain \u0027"},{"line_number":745,"context_line":"                  \u0027information\u0027))"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_0c45516f","line":743,"range":{"start_line":743,"start_character":18,"end_line":743,"end_character":43},"in_reply_to":"9aed3d3a_6a3cc2e2","updated":"2016-02-26 18:51:23.000000000","message":"See https://review.openstack.org/#/c/285495 as an example, I don\u0027t think that call should show unexpected, I guess we need to test all the cases for retriving projects/domains","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":740,"context_line":"                      {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":741,"context_line":"                       \u0027id\u0027: project_ref[\u0027id\u0027],"},{"line_number":742,"context_line":"                       \u0027project_name\u0027: project_ref[\u0027name\u0027]})"},{"line_number":743,"context_line":"            raise exception.UnexpectedError("},{"line_number":744,"context_line":"                _(\u0027An unexpected error occurred when retrieving domain \u0027"},{"line_number":745,"context_line":"                  \u0027information\u0027))"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_6a3cc2e2","line":743,"range":{"start_line":743,"start_character":18,"end_line":743,"end_character":43},"in_reply_to":"9aed3d3a_d4e1359c","updated":"2016-02-26 18:18:42.000000000","message":"It\u0027s Unexpected, since if we hit this it is a coding error on our part - since we should have caught this way before here.....this is here to make sure we haven\u0027t goofed.","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":148,"context_line":"        parent_is_domain \u003d parent_ref[\u0027is_domain\u0027]"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if parent_is_domain:"},{"line_number":151,"context_line":"            if parent_ref[\u0027id\u0027] !\u003d domain[\u0027id\u0027]:"},{"line_number":152,"context_line":"                raise exception.ValidationError("},{"line_number":153,"context_line":"                    message\u003d_(\u0027Cannot create project, since its parent \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_767bc4f5","line":150,"range":{"start_line":150,"start_character":11,"end_line":150,"end_character":27},"updated":"2016-02-29 13:46:15.000000000","message":"(nit) just \"parent_ref[\u0027is_domain\u0027]\" would be clearer to me","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":148,"context_line":"        parent_is_domain \u003d parent_ref[\u0027is_domain\u0027]"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        if parent_is_domain:"},{"line_number":151,"context_line":"            if parent_ref[\u0027id\u0027] !\u003d domain[\u0027id\u0027]:"},{"line_number":152,"context_line":"                raise exception.ValidationError("},{"line_number":153,"context_line":"                    message\u003d_(\u0027Cannot create project, since its parent \u0027"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_34dc8a72","line":150,"range":{"start_line":150,"start_character":11,"end_line":150,"end_character":27},"in_reply_to":"9aed3d3a_767bc4f5","updated":"2016-02-29 17:09:31.000000000","message":"Done","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                    % {\u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":169,"context_line":"                       \u0027parent_domain_id\u0027: parent_domain_id})"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def _enforce_project_constraints(self, project_ref):"},{"line_number":172,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"},{"line_number":173,"context_line":"            self._assert_is_domain_project_constraints(project_ref)"},{"line_number":174,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_96ebe877","line":171,"range":{"start_line":171,"start_character":8,"end_line":171,"end_character":36},"updated":"2016-02-29 13:46:15.000000000","message":"(nit) althought unrelated to this patch: \"enfoce what constraints?\" let\u0027s consider adding docstrings to these methods","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                raise exception.ValidationError("},{"line_number":367,"context_line":"                    message\u003d_(\u0027Update of domain_id of projects acting as \u0027"},{"line_number":368,"context_line":"                              \u0027domains is not allowed.\u0027))"},{"line_number":369,"context_line":"            parent_project \u003d ("},{"line_number":370,"context_line":"                self.driver.get_project(original_project[\u0027parent_id\u0027]))"},{"line_number":371,"context_line":"            is_root_project \u003d parent_project[\u0027is_domain\u0027]"},{"line_number":372,"context_line":"            if not is_root_project:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_aa3960a6","line":369,"updated":"2016-02-29 13:46:15.000000000","message":"(nit) might want to add a comment saying it\u0027s for update of a project between domains","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            if not is_root_project:"},{"line_number":373,"context_line":"                raise exception.ValidationError("},{"line_number":374,"context_line":"                    message\u003d_(\u0027Update of domain_id is only allowed for \u0027"},{"line_number":375,"context_line":"                              \u0027root projects.\u0027))"},{"line_number":376,"context_line":"            subtree_list \u003d self.list_projects_in_subtree(project_id)"},{"line_number":377,"context_line":"            if subtree_list:"},{"line_number":378,"context_line":"                raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_ca5b04f5","line":375,"updated":"2016-02-29 13:46:15.000000000","message":"\"for domain projects\" would be a more meaningful message","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            if not is_root_project:"},{"line_number":373,"context_line":"                raise exception.ValidationError("},{"line_number":374,"context_line":"                    message\u003d_(\u0027Update of domain_id is only allowed for \u0027"},{"line_number":375,"context_line":"                              \u0027root projects.\u0027))"},{"line_number":376,"context_line":"            subtree_list \u003d self.list_projects_in_subtree(project_id)"},{"line_number":377,"context_line":"            if subtree_list:"},{"line_number":378,"context_line":"                raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_34f80ac3","line":375,"in_reply_to":"9aed3d3a_ca5b04f5","updated":"2016-02-29 17:09:31.000000000","message":"that\u0027s not quite true either...it\u0027s top level projects (i.e. who\u0027s parents are the domain)","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            # If the domain is being disabled, issue the disable notification"},{"line_number":425,"context_line":"            # as well"},{"line_number":426,"context_line":"            if original_project_enabled and not project_enabled:"},{"line_number":427,"context_line":"                self._disable_domain(project_id)"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        self.get_project.invalidate(self, project_id)"},{"line_number":430,"context_line":"        self.get_project_by_name.invalidate(self, original_project[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_ca294439","line":427,"range":{"start_line":427,"start_character":21,"end_line":427,"end_character":36},"updated":"2016-02-29 13:46:15.000000000","message":"(nit) this method\u0027s name could be more suggestive .. it isn\u0027t effectivelly disabling any domain","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":783,"context_line":"        pass"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"    def update_domain(self, domain_id, domain, initiator\u003dNone):"},{"line_number":786,"context_line":"        self.assert_domain_not_federated(domain_id, domain)"},{"line_number":787,"context_line":"        # Use the driver directly to get the project that acts as a domain and"},{"line_number":788,"context_line":"        # prevent using old cached value."},{"line_number":789,"context_line":"        original_domain \u003d self.driver.get_project(domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_4ae1b499","line":786,"range":{"start_line":786,"start_character":8,"end_line":786,"end_character":59},"updated":"2016-02-29 13:46:15.000000000","message":"This code has been added to update_project method, thus can be removed from here","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":783,"context_line":"        pass"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"    def update_domain(self, domain_id, domain, initiator\u003dNone):"},{"line_number":786,"context_line":"        self.assert_domain_not_federated(domain_id, domain)"},{"line_number":787,"context_line":"        # Use the driver directly to get the project that acts as a domain and"},{"line_number":788,"context_line":"        # prevent using old cached value."},{"line_number":789,"context_line":"        original_domain \u003d self.driver.get_project(domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_05eaf2ab","line":786,"range":{"start_line":786,"start_character":8,"end_line":786,"end_character":59},"in_reply_to":"9aed3d3a_4ae1b499","updated":"2016-02-29 17:09:31.000000000","message":"Done","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":787,"context_line":"        # Use the driver directly to get the project that acts as a domain and"},{"line_number":788,"context_line":"        # prevent using old cached value."},{"line_number":789,"context_line":"        original_domain \u003d self.driver.get_project(domain_id)"},{"line_number":790,"context_line":"        if (CONF.resource.domain_name_url_safe !\u003d \u0027off\u0027 and"},{"line_number":791,"context_line":"            \u0027name\u0027 in domain and domain[\u0027name\u0027] !\u003d original_domain[\u0027name\u0027] and"},{"line_number":792,"context_line":"                utils.is_not_url_safe(domain[\u0027name\u0027])):"},{"line_number":793,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":794,"context_line":"        if \u0027enabled\u0027 in domain:"},{"line_number":795,"context_line":"            domain[\u0027enabled\u0027] \u003d clean.domain_enabled(domain[\u0027enabled\u0027])"},{"line_number":796,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_8ac3bcec","line":793,"range":{"start_line":790,"start_character":8,"end_line":793,"end_character":78},"updated":"2016-02-29 13:46:15.000000000","message":"We need to put this logic in update_proejct too. The calls to domains at the manager level should not implement additional logic, just call project calls instead","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":787,"context_line":"        # Use the driver directly to get the project that acts as a domain and"},{"line_number":788,"context_line":"        # prevent using old cached value."},{"line_number":789,"context_line":"        original_domain \u003d self.driver.get_project(domain_id)"},{"line_number":790,"context_line":"        if (CONF.resource.domain_name_url_safe !\u003d \u0027off\u0027 and"},{"line_number":791,"context_line":"            \u0027name\u0027 in domain and domain[\u0027name\u0027] !\u003d original_domain[\u0027name\u0027] and"},{"line_number":792,"context_line":"                utils.is_not_url_safe(domain[\u0027name\u0027])):"},{"line_number":793,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":794,"context_line":"        if \u0027enabled\u0027 in domain:"},{"line_number":795,"context_line":"            domain[\u0027enabled\u0027] \u003d clean.domain_enabled(domain[\u0027enabled\u0027])"},{"line_number":796,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_8e53c7e1","line":793,"range":{"start_line":790,"start_character":8,"end_line":793,"end_character":78},"in_reply_to":"9aed3d3a_8ac3bcec","updated":"2016-02-29 15:32:32.000000000","message":"The logic is in _update_project.","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":791,"context_line":"            \u0027name\u0027 in domain and domain[\u0027name\u0027] !\u003d original_domain[\u0027name\u0027] and"},{"line_number":792,"context_line":"                utils.is_not_url_safe(domain[\u0027name\u0027])):"},{"line_number":793,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":794,"context_line":"        if \u0027enabled\u0027 in domain:"},{"line_number":795,"context_line":"            domain[\u0027enabled\u0027] \u003d clean.domain_enabled(domain[\u0027enabled\u0027])"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        # Update the project that acts as a domain"},{"line_number":798,"context_line":"        project \u003d _get_project_from_domain(domain)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_6afbd847","line":795,"range":{"start_line":794,"start_character":8,"end_line":795,"end_character":71},"updated":"2016-02-29 13:46:15.000000000","message":"Same as above, this code is present in update_project method ... can be removed frm here","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":791,"context_line":"            \u0027name\u0027 in domain and domain[\u0027name\u0027] !\u003d original_domain[\u0027name\u0027] and"},{"line_number":792,"context_line":"                utils.is_not_url_safe(domain[\u0027name\u0027])):"},{"line_number":793,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":794,"context_line":"        if \u0027enabled\u0027 in domain:"},{"line_number":795,"context_line":"            domain[\u0027enabled\u0027] \u003d clean.domain_enabled(domain[\u0027enabled\u0027])"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        # Update the project that acts as a domain"},{"line_number":798,"context_line":"        project \u003d _get_project_from_domain(domain)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_45d07af6","line":795,"range":{"start_line":794,"start_character":8,"end_line":795,"end_character":71},"in_reply_to":"9aed3d3a_6afbd847","updated":"2016-02-29 17:09:31.000000000","message":"Done","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8e31044bbd7dc2a5987cbdaa23d0a9a3a5c88f1d","unresolved":false,"context_lines":[{"line_number":793,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":794,"context_line":"        if \u0027enabled\u0027 in domain:"},{"line_number":795,"context_line":"            domain[\u0027enabled\u0027] \u003d clean.domain_enabled(domain[\u0027enabled\u0027])"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        # Update the project that acts as a domain"},{"line_number":798,"context_line":"        project \u003d _get_project_from_domain(domain)"},{"line_number":799,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_74b45234","line":796,"updated":"2016-02-29 15:34:30.000000000","message":"I think the reason the above checks were added here was to make sure the correct errors here raised and/or attributes checked....I\u0027ll take a closer look","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":793,"context_line":"            self._raise_reserved_character_exception(\u0027Domain\u0027, domain[\u0027name\u0027])"},{"line_number":794,"context_line":"        if \u0027enabled\u0027 in domain:"},{"line_number":795,"context_line":"            domain[\u0027enabled\u0027] \u003d clean.domain_enabled(domain[\u0027enabled\u0027])"},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        # Update the project that acts as a domain"},{"line_number":798,"context_line":"        project \u003d _get_project_from_domain(domain)"},{"line_number":799,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_0501526a","line":796,"in_reply_to":"9aed3d3a_74b45234","updated":"2016-02-29 17:09:31.000000000","message":"I have moved all this to _update_project","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":896,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"    def list_projects_acting_as_domain(self, hints\u003dNone):"},{"line_number":899,"context_line":"        return self.driver.list_projects_acting_as_domain("},{"line_number":900,"context_line":"            hints or driver_hints.Hints())"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"    @MEMOIZE"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_ad017a07","line":899,"range":{"start_line":899,"start_character":27,"end_line":899,"end_character":57},"updated":"2016-02-29 13:46:15.000000000","message":"This didn\u0027t need to be a new method in the drivers ... why not just add the is_domain hint here and call list_projects directly ? (it\u0027s what the driver does)","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":896,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"    def list_projects_acting_as_domain(self, hints\u003dNone):"},{"line_number":899,"context_line":"        return self.driver.list_projects_acting_as_domain("},{"line_number":900,"context_line":"            hints or driver_hints.Hints())"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"    @MEMOIZE"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_a5a86621","line":899,"range":{"start_line":899,"start_character":27,"end_line":899,"end_character":57},"in_reply_to":"9aed3d3a_ad017a07","updated":"2016-02-29 17:09:31.000000000","message":"I\u0027m still old school...drivers don\u0027t technically have to support hints","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":1309,"context_line":"        else:"},{"line_number":1310,"context_line":"            return self.driver.get_project_by_name(project_name, domain_id)"},{"line_number":1311,"context_line":""},{"line_number":1312,"context_line":"    def create_domain(self, domain_id, domain):"},{"line_number":1313,"context_line":"        return self.driver.create_domain(domain_id, domain)"},{"line_number":1314,"context_line":""},{"line_number":1315,"context_line":"    def list_domains(self, hints):"},{"line_number":1316,"context_line":"        return self.driver.list_domains(hints)"},{"line_number":1317,"context_line":""},{"line_number":1318,"context_line":"    def list_domains_from_ids(self, domain_ids):"},{"line_number":1319,"context_line":"        return self.driver.list_domains_from_ids(domain_ids)"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"    def get_domain(self, domain_id):"},{"line_number":1322,"context_line":"        return self.driver.get_domain(domain_id)"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":1325,"context_line":"        return self.driver.get_domain_by_name(domain_name)"},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"    def update_domain(self, domain_id, domain):"},{"line_number":1328,"context_line":"        return self.driver.update_domain(domain_id, domain)"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"    def delete_domain(self, domain_id):"},{"line_number":1331,"context_line":"        self.driver.delete_domain(domain_id)"},{"line_number":1332,"context_line":""},{"line_number":1333,"context_line":"    def create_project(self, project_id, project):"},{"line_number":1334,"context_line":"        if project[\u0027is_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_e30a7378","line":1331,"range":{"start_line":1312,"start_character":0,"end_line":1331,"end_character":44},"updated":"2016-02-29 13:46:15.000000000","message":"new driver doesnt\u0027 call domains anymore, so we don\u0027t need to care about these right?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":1309,"context_line":"        else:"},{"line_number":1310,"context_line":"            return self.driver.get_project_by_name(project_name, domain_id)"},{"line_number":1311,"context_line":""},{"line_number":1312,"context_line":"    def create_domain(self, domain_id, domain):"},{"line_number":1313,"context_line":"        return self.driver.create_domain(domain_id, domain)"},{"line_number":1314,"context_line":""},{"line_number":1315,"context_line":"    def list_domains(self, hints):"},{"line_number":1316,"context_line":"        return self.driver.list_domains(hints)"},{"line_number":1317,"context_line":""},{"line_number":1318,"context_line":"    def list_domains_from_ids(self, domain_ids):"},{"line_number":1319,"context_line":"        return self.driver.list_domains_from_ids(domain_ids)"},{"line_number":1320,"context_line":""},{"line_number":1321,"context_line":"    def get_domain(self, domain_id):"},{"line_number":1322,"context_line":"        return self.driver.get_domain(domain_id)"},{"line_number":1323,"context_line":""},{"line_number":1324,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":1325,"context_line":"        return self.driver.get_domain_by_name(domain_name)"},{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"    def update_domain(self, domain_id, domain):"},{"line_number":1328,"context_line":"        return self.driver.update_domain(domain_id, domain)"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"    def delete_domain(self, domain_id):"},{"line_number":1331,"context_line":"        self.driver.delete_domain(domain_id)"},{"line_number":1332,"context_line":""},{"line_number":1333,"context_line":"    def create_project(self, project_id, project):"},{"line_number":1334,"context_line":"        if project[\u0027is_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_237a9bbd","line":1331,"range":{"start_line":1312,"start_character":0,"end_line":1331,"end_character":44},"in_reply_to":"9aed3d3a_e30a7378","updated":"2016-02-29 15:32:32.000000000","message":"Correct, but was leaving cleanup for another patch","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":1389,"context_line":"    def list_project_ids_from_domain_ids(self, domain_ids):"},{"line_number":1390,"context_line":"        return self.driver.list_project_ids_from_domain_ids(domain_ids)"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":1393,"context_line":"            return self.driver.list_projects_in_domain(domain_id)"},{"line_number":1394,"context_line":""},{"line_number":1395,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_037cb71d","line":1392,"range":{"start_line":1392,"start_character":8,"end_line":1392,"end_character":31},"updated":"2016-02-29 13:46:15.000000000","message":"list_projects_in_domain(None) would give me top level projects in a legacy driver, while in the new driver it will give me is_domain projects right ?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":1389,"context_line":"    def list_project_ids_from_domain_ids(self, domain_ids):"},{"line_number":1390,"context_line":"        return self.driver.list_project_ids_from_domain_ids(domain_ids)"},{"line_number":1391,"context_line":""},{"line_number":1392,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":1393,"context_line":"            return self.driver.list_projects_in_domain(domain_id)"},{"line_number":1394,"context_line":""},{"line_number":1395,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_0e6cd7ce","line":1392,"range":{"start_line":1392,"start_character":8,"end_line":1392,"end_character":31},"in_reply_to":"9aed3d3a_037cb71d","updated":"2016-02-29 15:32:32.000000000","message":"Well, this is an internal-only method and not exposed via the API, so it should never be called with domain_id\u003dNone","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9c0003a998c4ccf821fb12a0bed1fcaba2fb8f","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"            project \u003d parent_project"},{"line_number":1453,"context_line":"        return parents"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"    def list_projects_in_subtree(self, project_id):"},{"line_number":1456,"context_line":"        return self.driver.list_projects_in_subtree(project_id)"},{"line_number":1457,"context_line":""},{"line_number":1458,"context_line":"    def is_leaf_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_e380b3f9","line":1455,"range":{"start_line":1455,"start_character":8,"end_line":1455,"end_character":32},"updated":"2016-02-29 13:46:15.000000000","message":"list_projects_in_subtree(None) would give me all the tree starting at the top level projects in a legacy driver, while in the new driver it starts at the is_domain projects right ?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":1452,"context_line":"            project \u003d parent_project"},{"line_number":1453,"context_line":"        return parents"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"    def list_projects_in_subtree(self, project_id):"},{"line_number":1456,"context_line":"        return self.driver.list_projects_in_subtree(project_id)"},{"line_number":1457,"context_line":""},{"line_number":1458,"context_line":"    def is_leaf_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_030cb73f","line":1455,"range":{"start_line":1455,"start_character":8,"end_line":1455,"end_character":32},"in_reply_to":"9aed3d3a_e380b3f9","updated":"2016-02-29 15:32:32.000000000","message":"I don\u0027t think so, the manager call for list_projects_in_subtree checks that project_id !\u003d None","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"239ec4268afa100ff6354a7bee8f48399e5dfe4f","unresolved":false,"context_lines":[{"line_number":473,"context_line":""},{"line_number":474,"context_line":"            self.driver.update_project(child[\u0027id\u0027], child)"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def update_project(self, project_id, project, initiator\u003dNone,"},{"line_number":477,"context_line":"                       cascade\u003dFalse):"},{"line_number":478,"context_line":"        ret \u003d self._update_project(project_id, project, initiator, cascade)"},{"line_number":479,"context_line":"        if ret[\u0027is_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_aa894e28","line":476,"updated":"2016-02-29 21:31:34.000000000","message":"scary that projects or domains can be mutable at all.","commit_id":"753509c7b6088d9a190c19892e6f5c8def1fb6d2"}],"keystone/resource/schema.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_project_properties \u003d {"},{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(htruta): domain_id must be passed as null in the controller"},{"line_number":20,"context_line":"    # layer if it is a project acting as a domain."},{"line_number":21,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":22,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":23,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_0f143a42","line":20,"range":{"start_line":19,"start_character":30,"end_line":20,"end_character":30},"updated":"2016-02-26 17:30:41.000000000","message":"replacing by \"is nullable for projects\" may make sense as well","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_project_properties \u003d {"},{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(htruta): domain_id must be passed as null in the controller"},{"line_number":20,"context_line":"    # layer if it is a project acting as a domain."},{"line_number":21,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":22,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":23,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_255f8de6","line":20,"range":{"start_line":19,"start_character":30,"end_line":20,"end_character":30},"in_reply_to":"9aed3d3a_0f143a42","updated":"2016-02-26 18:18:42.000000000","message":"Done","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"}],"keystone/revoke/model.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"b3be99177b2945d0a60c9335f270485c1363a899","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    project \u003d token_data.get(\u0027project\u0027, token_data.get(\u0027tenant\u0027))"},{"line_number":335,"context_line":"    if project is not None:"},{"line_number":336,"context_line":"        token_values[\u0027project_id\u0027] \u003d project[\u0027id\u0027]"},{"line_number":337,"context_line":"        # The domain_id of projects acting as domains is None"},{"line_number":338,"context_line":"        token_values[\u0027assignment_domain_id\u0027] \u003d ("},{"line_number":339,"context_line":"            project[\u0027domain\u0027][\u0027id\u0027] if project[\u0027domain\u0027] else None)"},{"line_number":340,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":54,"id":"dae33548_3ca1c394","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":61},"updated":"2016-02-18 18:00:09.000000000","message":"I wonder whether it should be project[\u0027id\u0027] if the project acts as domain","commit_id":"9ad70145a1dde8670d6c28c74e5d4865c0290f39"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f097d61ec14b91f95fdce519a842b41da30b0967","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    project \u003d token_data.get(\u0027project\u0027, token_data.get(\u0027tenant\u0027))"},{"line_number":335,"context_line":"    if project is not None:"},{"line_number":336,"context_line":"        token_values[\u0027project_id\u0027] \u003d project[\u0027id\u0027]"},{"line_number":337,"context_line":"        # The domain_id of projects acting as domains is None"},{"line_number":338,"context_line":"        token_values[\u0027assignment_domain_id\u0027] \u003d ("},{"line_number":339,"context_line":"            project[\u0027domain\u0027][\u0027id\u0027] if project[\u0027domain\u0027] else None)"},{"line_number":340,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":54,"id":"bae84128_ff3966d8","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":61},"in_reply_to":"dae33548_3ca1c394","updated":"2016-02-23 08:52:50.000000000","message":"I *think* what we have is correct, since we do expose (via the API) the fact that the domain_id attribute of a project acting as a domain is None.","commit_id":"9ad70145a1dde8670d6c28c74e5d4865c0290f39"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    project \u003d token_data.get(\u0027project\u0027, token_data.get(\u0027tenant\u0027))"},{"line_number":335,"context_line":"    if project is not None:"},{"line_number":336,"context_line":"        token_values[\u0027project_id\u0027] \u003d project[\u0027id\u0027]"},{"line_number":337,"context_line":"        # The domain_id of projects acting as domains is None"},{"line_number":338,"context_line":"        token_values[\u0027assignment_domain_id\u0027] \u003d ("},{"line_number":339,"context_line":"            project[\u0027domain\u0027][\u0027id\u0027] if project[\u0027domain\u0027] else None)"},{"line_number":340,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_6c0a34d4","line":337,"range":{"start_line":337,"start_character":27,"end_line":337,"end_character":35},"updated":"2016-02-26 17:30:41.000000000","message":"I\u0027d say \"top level projects\", thus this comment will still be valid once we have submdomains","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    project \u003d token_data.get(\u0027project\u0027, token_data.get(\u0027tenant\u0027))"},{"line_number":335,"context_line":"    if project is not None:"},{"line_number":336,"context_line":"        token_values[\u0027project_id\u0027] \u003d project[\u0027id\u0027]"},{"line_number":337,"context_line":"        # The domain_id of projects acting as domains is None"},{"line_number":338,"context_line":"        token_values[\u0027assignment_domain_id\u0027] \u003d ("},{"line_number":339,"context_line":"            project[\u0027domain\u0027][\u0027id\u0027] if project[\u0027domain\u0027] else None)"},{"line_number":340,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_853db9bd","line":337,"range":{"start_line":337,"start_character":27,"end_line":337,"end_character":35},"in_reply_to":"9aed3d3a_6c0a34d4","updated":"2016-02-26 18:18:42.000000000","message":"Although I agree, for now i\u0027d rather leave it as is, since we often talk about \"top level projects\" before this patch as meaning a regular project with no parents.","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d4fe1293cfbd31bcd3c0ec813e527e6d3112eefa","unresolved":false,"context_lines":[{"line_number":3532,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":3533,"context_line":"    def test_domain_name_case_sensitivity(self):"},{"line_number":3534,"context_line":"        # create a ref with a lowercase name"},{"line_number":3535,"context_line":"        domain_name \u003d \u0027test_domain\u0027"},{"line_number":3536,"context_line":"        ref \u003d unit.new_domain_ref(name\u003ddomain_name)"},{"line_number":3537,"context_line":""},{"line_number":3538,"context_line":"        lower_case_domain \u003d self.resource_api.create_domain(ref[\u0027id\u0027], ref)"},{"line_number":3539,"context_line":""},{"line_number":3540,"context_line":"        # assign a new ID to the ref with the same name, but in uppercase"},{"line_number":3541,"context_line":"        ref[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":3542,"context_line":"        ref[\u0027name\u0027] \u003d domain_name.upper()"},{"line_number":3543,"context_line":"        upper_case_domain \u003d self.resource_api.create_domain(ref[\u0027id\u0027], ref)"},{"line_number":3544,"context_line":""},{"line_number":3545,"context_line":"        # We can get each domain by name"},{"line_number":3546,"context_line":"        lower_case_domain_ref \u003d self.resource_api.get_domain_by_name("},{"line_number":3547,"context_line":"            domain_name)"},{"line_number":3548,"context_line":"        self.assertDictEqual(lower_case_domain, lower_case_domain_ref)"},{"line_number":3549,"context_line":""},{"line_number":3550,"context_line":"        upper_case_domain_ref \u003d self.resource_api.get_domain_by_name("},{"line_number":3551,"context_line":"            domain_name.upper())"},{"line_number":3552,"context_line":"        self.assertDictEqual(upper_case_domain, upper_case_domain_ref)"},{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"    def test_attribute_update(self):"},{"line_number":3555,"context_line":"        project \u003d unit.new_project_ref(domain_id\u003dDEFAULT_DOMAIN_ID)"}],"source_content_type":"text/x-python","patch_set":46,"id":"7a5de9d1_d17f53a9","line":3552,"range":{"start_line":3535,"start_character":8,"end_line":3552,"end_character":70},"updated":"2016-02-03 14:32:07.000000000","message":"I\u0027m not quite sure why we are changing this here? I would agree that your proposed changes improve the test - but are they specific to this patch?","commit_id":"c38caa4ee76f12f3805129a1192c7f61ef850432"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"46df7880c71ef11c00c98068be040c454aed0707","unresolved":false,"context_lines":[{"line_number":3532,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":3533,"context_line":"    def test_domain_name_case_sensitivity(self):"},{"line_number":3534,"context_line":"        # create a ref with a lowercase name"},{"line_number":3535,"context_line":"        domain_name \u003d \u0027test_domain\u0027"},{"line_number":3536,"context_line":"        ref \u003d unit.new_domain_ref(name\u003ddomain_name)"},{"line_number":3537,"context_line":""},{"line_number":3538,"context_line":"        lower_case_domain \u003d self.resource_api.create_domain(ref[\u0027id\u0027], ref)"},{"line_number":3539,"context_line":""},{"line_number":3540,"context_line":"        # assign a new ID to the ref with the same name, but in uppercase"},{"line_number":3541,"context_line":"        ref[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":3542,"context_line":"        ref[\u0027name\u0027] \u003d domain_name.upper()"},{"line_number":3543,"context_line":"        upper_case_domain \u003d self.resource_api.create_domain(ref[\u0027id\u0027], ref)"},{"line_number":3544,"context_line":""},{"line_number":3545,"context_line":"        # We can get each domain by name"},{"line_number":3546,"context_line":"        lower_case_domain_ref \u003d self.resource_api.get_domain_by_name("},{"line_number":3547,"context_line":"            domain_name)"},{"line_number":3548,"context_line":"        self.assertDictEqual(lower_case_domain, lower_case_domain_ref)"},{"line_number":3549,"context_line":""},{"line_number":3550,"context_line":"        upper_case_domain_ref \u003d self.resource_api.get_domain_by_name("},{"line_number":3551,"context_line":"            domain_name.upper())"},{"line_number":3552,"context_line":"        self.assertDictEqual(upper_case_domain, upper_case_domain_ref)"},{"line_number":3553,"context_line":""},{"line_number":3554,"context_line":"    def test_attribute_update(self):"},{"line_number":3555,"context_line":"        project \u003d unit.new_project_ref(domain_id\u003dDEFAULT_DOMAIN_ID)"}],"source_content_type":"text/x-python","patch_set":46,"id":"5a5ae5dd_23b2184d","line":3552,"range":{"start_line":3535,"start_character":8,"end_line":3552,"end_character":70},"in_reply_to":"7a5de9d1_d17f53a9","updated":"2016-02-05 09:55:23.000000000","message":"OK, ignore that comment!","commit_id":"c38caa4ee76f12f3805129a1192c7f61ef850432"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3323f659d75dd08aa5e83799ce632063a42b08e6","unresolved":false,"context_lines":[{"line_number":4763,"context_line":"        common_id \u003d uuid.uuid4().hex"},{"line_number":4764,"context_line":"        # Create a domain"},{"line_number":4765,"context_line":"        domain \u003d unit.new_domain_ref(id\u003dcommon_id)"},{"line_number":4766,"context_line":"        domain \u003d self.resource_api.driver.create_domain(common_id, domain)"},{"line_number":4767,"context_line":"        self.assertEqual(common_id, domain[\u0027id\u0027])"},{"line_number":4768,"context_line":"        # Create a project"},{"line_number":4769,"context_line":"        project \u003d unit.new_project_ref(id\u003dcommon_id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_d40b717b","line":4766,"updated":"2016-02-24 03:33:59.000000000","message":"What about these? I know the driver methods will be removed later, but I think the tests should be updated in the patch to test the changed behavior.","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"55f7acd74a17d88dc599894588fcf1e0e55ac4d3","unresolved":false,"context_lines":[{"line_number":4763,"context_line":"        common_id \u003d uuid.uuid4().hex"},{"line_number":4764,"context_line":"        # Create a domain"},{"line_number":4765,"context_line":"        domain \u003d unit.new_domain_ref(id\u003dcommon_id)"},{"line_number":4766,"context_line":"        domain \u003d self.resource_api.driver.create_domain(common_id, domain)"},{"line_number":4767,"context_line":"        self.assertEqual(common_id, domain[\u0027id\u0027])"},{"line_number":4768,"context_line":"        # Create a project"},{"line_number":4769,"context_line":"        project \u003d unit.new_project_ref(id\u003dcommon_id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_8fdb8f7b","line":4766,"in_reply_to":"bae84128_d40b717b","updated":"2016-02-24 08:49:06.000000000","message":"good catch, these sneaked in since the patch was last updated.....","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"355dc95b1a6a6e1e56bd3fdd7cc7c0bfb76cc1b7","unresolved":false,"context_lines":[{"line_number":4696,"context_line":"            include_names\u003dFalse)"},{"line_number":4697,"context_line":"        assert_does_not_contain_names(role_assign_without_names)"},{"line_number":4698,"context_line":""},{"line_number":4699,"context_line":"    def test_delete_project_assignments_same_id_as_domain(self):"},{"line_number":4700,"context_line":"        \"\"\"Test deleting project assignments with same project and domain ID."},{"line_number":4701,"context_line":""},{"line_number":4702,"context_line":"        Only project assignments must be deleted (i.e USER_PROJECT or"}],"source_content_type":"text/x-python","patch_set":56,"id":"bae84128_791ec70c","side":"PARENT","line":4699,"range":{"start_line":4699,"start_character":4,"end_line":4699,"end_character":64},"updated":"2016-02-24 11:55:51.000000000","message":"this is removed since it is now impossible to have a project with the same id as a domain....since it would be a project acting as a domain!","commit_id":"e943768088581dd1310fbcdffce30aa8fdc23fee"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":922,"context_line":"    def test_update_domain_id_project_is_domain_fails(self):"},{"line_number":923,"context_line":"        other_domain \u003d unit.new_domain_ref()"},{"line_number":924,"context_line":"        self.resource_api.create_domain(other_domain[\u0027id\u0027], other_domain)"},{"line_number":925,"context_line":"        project \u003d unit.new_project_ref(is_domain\u003dTrue,"},{"line_number":926,"context_line":"                                       domain_id\u003dself.domain_default[\u0027id\u0027])"},{"line_number":927,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":928,"context_line":"        project[\u0027domain_id\u0027] \u003d other_domain[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_831f276b","side":"PARENT","line":925,"range":{"start_line":925,"start_character":8,"end_line":925,"end_character":37},"updated":"2016-02-29 14:13:32.000000000","message":"was this wrong before ? did it mean a subdomain?","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":922,"context_line":"    def test_update_domain_id_project_is_domain_fails(self):"},{"line_number":923,"context_line":"        other_domain \u003d unit.new_domain_ref()"},{"line_number":924,"context_line":"        self.resource_api.create_domain(other_domain[\u0027id\u0027], other_domain)"},{"line_number":925,"context_line":"        project \u003d unit.new_project_ref(is_domain\u003dTrue,"},{"line_number":926,"context_line":"                                       domain_id\u003dself.domain_default[\u0027id\u0027])"},{"line_number":927,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":928,"context_line":"        project[\u0027domain_id\u0027] \u003d other_domain[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_0eb21706","side":"PARENT","line":925,"range":{"start_line":925,"start_character":8,"end_line":925,"end_character":37},"in_reply_to":"9aed3d3a_831f276b","updated":"2016-02-29 15:32:32.000000000","message":"well, is_domain wasn\u0027t interpreted before, so yes we now interpret this new_project as being as sub_domain, which we don\u0027t support.","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"        projects \u003d [project]"},{"line_number":2657,"context_line":"        for i in range(1, hierarchy_size):"},{"line_number":2658,"context_line":"            new_project \u003d unit.new_project_ref(parent_id\u003dproject_id,"},{"line_number":2659,"context_line":"                                               is_domain\u003dis_domain,"},{"line_number":2660,"context_line":"                                               domain_id\u003ddomain_id)"},{"line_number":2661,"context_line":""},{"line_number":2662,"context_line":"            self.resource_api.create_project(new_project[\u0027id\u0027], new_project)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_5e3332f6","side":"PARENT","line":2659,"range":{"start_line":2659,"start_character":47,"end_line":2659,"end_character":67},"updated":"2016-02-29 14:13:32.000000000","message":"unrelated?","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":2667,"context_line":""},{"line_number":2668,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2669,"context_line":"    def test_create_domain_with_project_api(self):"},{"line_number":2670,"context_line":"        project \u003d unit.new_project_ref("},{"line_number":2671,"context_line":"            domain_id\u003dCONF.identity.default_domain_id, is_domain\u003dTrue)"},{"line_number":2672,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2673,"context_line":"        self.assertTrue(ref[\u0027is_domain\u0027])"},{"line_number":2674,"context_line":"        self.assertEqual(CONF.identity.default_domain_id, ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_fe404636","side":"PARENT","line":2671,"range":{"start_line":2670,"start_character":39,"end_line":2671,"end_character":70},"updated":"2016-02-29 14:13:32.000000000","message":"was this wrong before ? i.e a was this a subdomain?","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":2667,"context_line":""},{"line_number":2668,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2669,"context_line":"    def test_create_domain_with_project_api(self):"},{"line_number":2670,"context_line":"        project \u003d unit.new_project_ref("},{"line_number":2671,"context_line":"            domain_id\u003dCONF.identity.default_domain_id, is_domain\u003dTrue)"},{"line_number":2672,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2673,"context_line":"        self.assertTrue(ref[\u0027is_domain\u0027])"},{"line_number":2674,"context_line":"        self.assertEqual(CONF.identity.default_domain_id, ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_4ea53fa0","side":"PARENT","line":2671,"range":{"start_line":2670,"start_character":39,"end_line":2671,"end_character":70},"in_reply_to":"9aed3d3a_fe404636","updated":"2016-02-29 15:32:32.000000000","message":"yes, as the earlier example","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":4740,"context_line":"            include_names\u003dFalse)"},{"line_number":4741,"context_line":"        assert_does_not_contain_names(role_assign_without_names)"},{"line_number":4742,"context_line":""},{"line_number":4743,"context_line":"    def test_delete_project_assignments_same_id_as_domain(self):"},{"line_number":4744,"context_line":"        \"\"\"Test deleting project assignments with same project and domain ID."},{"line_number":4745,"context_line":""},{"line_number":4746,"context_line":"        Only project assignments must be deleted (i.e USER_PROJECT or"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_3e510ed9","side":"PARENT","line":4743,"range":{"start_line":4743,"start_character":8,"end_line":4743,"end_character":57},"updated":"2016-02-29 14:13:32.000000000","message":"This shouldn\u0027t be possible to have domain ID \u003d\u003d project ID right ? Otherwise this whole implementation is now crashed (migration won\u0027t work)","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":4740,"context_line":"            include_names\u003dFalse)"},{"line_number":4741,"context_line":"        assert_does_not_contain_names(role_assign_without_names)"},{"line_number":4742,"context_line":""},{"line_number":4743,"context_line":"    def test_delete_project_assignments_same_id_as_domain(self):"},{"line_number":4744,"context_line":"        \"\"\"Test deleting project assignments with same project and domain ID."},{"line_number":4745,"context_line":""},{"line_number":4746,"context_line":"        Only project assignments must be deleted (i.e USER_PROJECT or"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_eeea5373","side":"PARENT","line":4743,"range":{"start_line":4743,"start_character":8,"end_line":4743,"end_character":57},"in_reply_to":"9aed3d3a_3e510ed9","updated":"2016-02-29 15:32:32.000000000","message":"correct","commit_id":"432f5f23486342d26d42643ff1d6c974f411cace"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":2142,"context_line":"        }"},{"line_number":2143,"context_line":"        self.execute_assignment_plan(test_plan)"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2146,"context_line":"    def test_list_role_assignment_using_sourced_groups_with_domains(self):"},{"line_number":2147,"context_line":"        \"\"\"Test listing domain assignments when restricted by source groups.\"\"\""},{"line_number":2148,"context_line":"        test_plan \u003d {"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_035e7743","line":2145,"range":{"start_line":2145,"start_character":4,"end_line":2145,"end_character":45},"updated":"2016-02-29 14:13:32.000000000","message":"why does this need this annotation now?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":2142,"context_line":"        }"},{"line_number":2143,"context_line":"        self.execute_assignment_plan(test_plan)"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2146,"context_line":"    def test_list_role_assignment_using_sourced_groups_with_domains(self):"},{"line_number":2147,"context_line":"        \"\"\"Test listing domain assignments when restricted by source groups.\"\"\""},{"line_number":2148,"context_line":"        test_plan \u003d {"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_0015c047","line":2145,"range":{"start_line":2145,"start_character":4,"end_line":2145,"end_character":45},"in_reply_to":"9aed3d3a_035e7743","updated":"2016-02-29 17:09:31.000000000","message":"I wasn\u0027t catching ValidationError in the assert in test_backed_ldap...fixed that now, so this can be removed","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":2652,"context_line":""},{"line_number":2653,"context_line":"        projects \u003d self.resource_api.list_projects_acting_as_domain()"},{"line_number":2654,"context_line":"        expected_number_projects \u003d initial_number_domains + 5"},{"line_number":2655,"context_line":"        self.assertEqual(expected_number_projects, len(projects))"},{"line_number":2656,"context_line":""},{"line_number":2657,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2658,"context_line":"    def test_list_projects_for_alternate_domain(self):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_fe120656","line":2655,"updated":"2016-02-29 14:13:32.000000000","message":"maybe check on the returned projects ?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":2652,"context_line":""},{"line_number":2653,"context_line":"        projects \u003d self.resource_api.list_projects_acting_as_domain()"},{"line_number":2654,"context_line":"        expected_number_projects \u003d initial_number_domains + 5"},{"line_number":2655,"context_line":"        self.assertEqual(expected_number_projects, len(projects))"},{"line_number":2656,"context_line":""},{"line_number":2657,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2658,"context_line":"    def test_list_projects_for_alternate_domain(self):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_d46f19fa","line":2655,"in_reply_to":"9aed3d3a_fe120656","updated":"2016-02-29 17:09:31.000000000","message":"Done","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":2993,"context_line":"        self.resource_api.create_project(project4[\u0027id\u0027], project4)"},{"line_number":2994,"context_line":""},{"line_number":2995,"context_line":"        parents1 \u003d self.resource_api.list_project_parents(project3[\u0027id\u0027])"},{"line_number":2996,"context_line":"        self.assertEqual(3, len(parents1))"},{"line_number":2997,"context_line":"        self.assertIn(project1, parents1)"},{"line_number":2998,"context_line":"        self.assertIn(project2, parents1)"},{"line_number":2999,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_1e99aac4","line":2996,"range":{"start_line":2996,"start_character":8,"end_line":2996,"end_character":42},"updated":"2016-02-29 14:13:32.000000000","message":"(nit) A small comment here ( as below in L3004 ) would be useful","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"}],"keystone/tests/unit/test_backend_ldap.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"    def test_configurable_allowed_project_actions(self):"},{"line_number":1032,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1033,"context_line":"        project \u003d unit.new_project_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":1034,"context_line":"        project \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":1035,"context_line":"        project_ref \u003d self.resource_api.get_project(project[\u0027id\u0027])"},{"line_number":1036,"context_line":"        self.assertEqual(project[\u0027id\u0027], project_ref[\u0027id\u0027])"},{"line_number":1037,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_9e077ac9","line":1034,"updated":"2016-02-29 14:13:32.000000000","message":"unrelated?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"    def test_configurable_allowed_project_actions(self):"},{"line_number":1032,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1033,"context_line":"        project \u003d unit.new_project_ref(domain_id\u003ddomain[\u0027id\u0027])"},{"line_number":1034,"context_line":"        project \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":1035,"context_line":"        project_ref \u003d self.resource_api.get_project(project[\u0027id\u0027])"},{"line_number":1036,"context_line":"        self.assertEqual(project[\u0027id\u0027], project_ref[\u0027id\u0027])"},{"line_number":1037,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_ce32ef0f","line":1034,"in_reply_to":"9aed3d3a_9e077ac9","updated":"2016-02-29 15:32:32.000000000","message":"no, this is required, since we are going to update project, and otherwise the parent_id won\u0027t be set in it.","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":1591,"context_line":"                          self.resource_api.update_project,"},{"line_number":1592,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"    def _assert_delete_is_domain_project_not_allowed(self):"},{"line_number":1595,"context_line":"        self.assertRaises(exception.Forbidden,"},{"line_number":1596,"context_line":"                          self.resource_api.delete_domain,"},{"line_number":1597,"context_line":"                          CONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_3e162ef1","line":1594,"range":{"start_line":1594,"start_character":8,"end_line":1594,"end_character":52},"updated":"2016-02-29 14:13:32.000000000","message":"where is this used? I couldn\u0027t find any occurrence of it here or in test_backend","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"204d337b0aec095f7f94edd8f527405408d795d6","unresolved":false,"context_lines":[{"line_number":1591,"context_line":"                          self.resource_api.update_project,"},{"line_number":1592,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"    def _assert_delete_is_domain_project_not_allowed(self):"},{"line_number":1595,"context_line":"        self.assertRaises(exception.Forbidden,"},{"line_number":1596,"context_line":"                          self.resource_api.delete_domain,"},{"line_number":1597,"context_line":"                          CONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_20dba450","line":1594,"range":{"start_line":1594,"start_character":8,"end_line":1594,"end_character":52},"in_reply_to":"9aed3d3a_2e0b9b2b","updated":"2016-02-29 17:09:31.000000000","message":"removed","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":1591,"context_line":"                          self.resource_api.update_project,"},{"line_number":1592,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"    def _assert_delete_is_domain_project_not_allowed(self):"},{"line_number":1595,"context_line":"        self.assertRaises(exception.Forbidden,"},{"line_number":1596,"context_line":"                          self.resource_api.delete_domain,"},{"line_number":1597,"context_line":"                          CONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_2e0b9b2b","line":1594,"range":{"start_line":1594,"start_character":8,"end_line":1594,"end_character":52},"in_reply_to":"9aed3d3a_3e162ef1","updated":"2016-02-29 15:32:32.000000000","message":"you may be right!","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":3104,"context_line":"        base \u003d super(BaseLDAPIdentity, self)"},{"line_number":3105,"context_line":"        base.test_list_role_assignments_filtered_by_role()"},{"line_number":3106,"context_line":""},{"line_number":3107,"context_line":"    def test_delete_domain_with_project_api(self):"},{"line_number":3108,"context_line":"        # With this restricted multi LDAP class, tests that use multiple"},{"line_number":3109,"context_line":"        # domains and identity, are still not supported"},{"line_number":3110,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_fea20698","line":3107,"range":{"start_line":3107,"start_character":8,"end_line":3107,"end_character":43},"updated":"2016-02-29 14:13:32.000000000","message":"Why is this skipped here ? The original at test_backend is already annotated with @unit.skip_if_no_multiple_domains_support","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                           driver.list_project_ids_from_domain_ids([ref_id])]"},{"line_number":530,"context_line":"            self.assertNotIn(ref_id, project_ids)"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":533,"context_line":"                              driver.list_projects_in_domain,"},{"line_number":534,"context_line":"                              ref_id)"},{"line_number":535,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_1ecd2a66","line":532,"range":{"start_line":532,"start_character":40,"end_line":532,"end_character":55},"updated":"2016-02-29 14:13:32.000000000","message":"This should still be DomainNotFound; the method\u0027s name is list_projects_in_*domain*","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                           driver.list_project_ids_from_domain_ids([ref_id])]"},{"line_number":530,"context_line":"            self.assertNotIn(ref_id, project_ids)"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"            self.assertRaises(exception.ProjectNotFound,"},{"line_number":533,"context_line":"                              driver.list_projects_in_domain,"},{"line_number":534,"context_line":"                              ref_id)"},{"line_number":535,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_d1b730d6","line":532,"range":{"start_line":532,"start_character":40,"end_line":532,"end_character":55},"in_reply_to":"9aed3d3a_1ecd2a66","updated":"2016-02-29 15:32:32.000000000","message":"Agreed.","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":562,"context_line":"            driver.delete_projects_from_ids([ref_id])"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        _exercise_project_api(uuid.uuid4().hex)"},{"line_number":565,"context_line":"        _exercise_project_api(resource.NULL_DOMAIN_ID)"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def test_hidden_domain_root_is_really_hidden(self):"},{"line_number":568,"context_line":"        \"\"\"Ensure we cannot access the hidden root of all domains."}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_9e62da3c","line":565,"updated":"2016-02-29 14:13:32.000000000","message":"could we have a similar test to _exercise_project_api(None) ?\nSince None is valid a manager level?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"646c7f31b9671fa22ad2b022f811df9771a6a322","unresolved":false,"context_lines":[{"line_number":562,"context_line":"            driver.delete_projects_from_ids([ref_id])"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        _exercise_project_api(uuid.uuid4().hex)"},{"line_number":565,"context_line":"        _exercise_project_api(resource.NULL_DOMAIN_ID)"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def test_hidden_domain_root_is_really_hidden(self):"},{"line_number":568,"context_line":"        \"\"\"Ensure we cannot access the hidden root of all domains."}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_916ac87f","line":565,"in_reply_to":"9aed3d3a_9e62da3c","updated":"2016-02-29 15:32:32.000000000","message":"project_id of None is not valid at the manager level.","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b6b5997864bbc1041f0d5c92ab024c0cd0feee8","unresolved":false,"context_lines":[{"line_number":846,"context_line":"        self.insert_dict(session, \u0027project\u0027, acme_son)"},{"line_number":847,"context_line":"        self.insert_dict(session, \u0027project\u0027, beta_son)"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def test_domain_as_project_upgrade(self):"},{"line_number":850,"context_line":"        NULL_DOMAIN_ID \u003d \u0027\u003c\u003ckeystone.domain.root\u003e\u003e\u0027"},{"line_number":851,"context_line":"        self.upgrade(91)"},{"line_number":852,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_f7994d7a","line":849,"range":{"start_line":849,"start_character":8,"end_line":849,"end_character":45},"updated":"2016-02-24 08:50:38.000000000","message":"I am adding adding tests/checks in here for the upgrade of the \"extra\" attribute","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b6b5997864bbc1041f0d5c92ab024c0cd0feee8","unresolved":false,"context_lines":[{"line_number":868,"context_line":"            else:"},{"line_number":869,"context_line":"                self.assertIsNotNone(project.domain_id)"},{"line_number":870,"context_line":"                self.assertIsNotNone(project.parent_id)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        # There are 4 domains, the default domain, plus 2 we created, plus the"},{"line_number":873,"context_line":"        # root domain row."},{"line_number":874,"context_line":"        self.assertEqual(4, domains.count())"}],"source_content_type":"text/x-python","patch_set":55,"id":"bae84128_b77a2522","line":871,"updated":"2016-02-24 08:50:38.000000000","message":"should also check name. enabled etc.","commit_id":"ab923d6861a54e4442d42d09ba28cf14f11ea4ee"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":874,"context_line":"        def _check_projects(projects):"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"            def _assert_domain_matches_project(project):"},{"line_number":877,"context_line":"                for domain in self.domains:"},{"line_number":878,"context_line":"                    if project.id \u003d\u003d domain[\u0027id\u0027]:"},{"line_number":879,"context_line":"                        self.assertEqual(domain[\u0027name\u0027], project.name)"},{"line_number":880,"context_line":"                        self.assertEqual(domain[\u0027enabled\u0027], project.enabled)"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_59e6ac44","line":877,"range":{"start_line":877,"start_character":16,"end_line":877,"end_character":43},"updated":"2016-02-29 14:13:32.000000000","message":"we shoudl fail somehow if no domain matches the provided project","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"}],"keystone/token/providers/common.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a1128cd1a8ff5771ae67d43c982a9d5dbe491825","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        filtered_project \u003d {"},{"line_number":245,"context_line":"            \u0027id\u0027: project_ref[\u0027id\u0027],"},{"line_number":246,"context_line":"            \u0027name\u0027: project_ref[\u0027name\u0027]}"},{"line_number":247,"context_line":"        filtered_project[\u0027domain\u0027] \u003d self._get_filtered_domain("},{"line_number":248,"context_line":"            project_ref[\u0027domain_id\u0027]) if project_ref[\u0027domain_id\u0027] else None"},{"line_number":249,"context_line":"        return filtered_project"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def _populate_scope(self, token_data, domain_id, project_id):"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_39750cf9","line":248,"range":{"start_line":247,"start_character":8,"end_line":248,"end_character":75},"updated":"2016-02-26 17:30:41.000000000","message":"I find the following more readable:\n\n    if project_ref[\u0027domain_id\u0027] is not None:\n        filtered_project[\u0027domain\u0027] \u003d self._get_filtered_domain(...)\n    else:\n        # Top level domain projects do not have a domain_id\n        filtered_project[\u0027domain\u0027] \u003d None","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e3533872f2c00ef5dd06c146a8a0ec250ded811d","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        filtered_project \u003d {"},{"line_number":245,"context_line":"            \u0027id\u0027: project_ref[\u0027id\u0027],"},{"line_number":246,"context_line":"            \u0027name\u0027: project_ref[\u0027name\u0027]}"},{"line_number":247,"context_line":"        filtered_project[\u0027domain\u0027] \u003d self._get_filtered_domain("},{"line_number":248,"context_line":"            project_ref[\u0027domain_id\u0027]) if project_ref[\u0027domain_id\u0027] else None"},{"line_number":249,"context_line":"        return filtered_project"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def _populate_scope(self, token_data, domain_id, project_id):"}],"source_content_type":"text/x-python","patch_set":60,"id":"9aed3d3a_e55645d1","line":248,"range":{"start_line":247,"start_character":8,"end_line":248,"end_character":75},"in_reply_to":"9aed3d3a_39750cf9","updated":"2016-02-26 18:18:42.000000000","message":"Done","commit_id":"4b6934cac12728449f835ce9ba1a454fe4d64d44"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ece4205fc2634cafd90ae3592c7d99c28cbe5cc","unresolved":false,"context_lines":[{"line_number":249,"context_line":"                self._get_filtered_domain(project_ref[\u0027domain_id\u0027]))"},{"line_number":250,"context_line":"        else:"},{"line_number":251,"context_line":"            # Projects acting as a domain do not have a domain_id attribute"},{"line_number":252,"context_line":"            filtered_project[\u0027domain\u0027] \u003d None"},{"line_number":253,"context_line":"        return filtered_project"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def _populate_scope(self, token_data, domain_id, project_id):"}],"source_content_type":"text/x-python","patch_set":61,"id":"9aed3d3a_1e7a4abd","line":252,"range":{"start_line":252,"start_character":12,"end_line":252,"end_character":45},"updated":"2016-02-29 14:13:32.000000000","message":"Perhaps we need tests for tokens on is_domain projects ?","commit_id":"b8b5889df79f20d41b0fecfaa3f48f0a550791fd"}]}
