)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6ea8cc8128109109925625046f319456320d2bca","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Henry Gessau \u003cHenryG@gessau.net\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-06 13:42:48 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Accept project_id for API calls"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change address necessary changes to accept"},{"line_number":10,"context_line":"project_id for API calls."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a89bdaa_31906543","line":7,"updated":"2016-09-06 18:24:45.000000000","message":"why the WIP?","commit_id":"ee8ba854bf42e12f61ad18b815e51191e8914ff6"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"bd3fde6975ee5239152b13d1664353bea5d2ad16","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Henry Gessau \u003cHenryG@gessau.net\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-06 13:42:48 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Accept project_id for API calls"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change address necessary changes to accept"},{"line_number":10,"context_line":"project_id for API calls."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a89bdaa_111d21bd","line":7,"in_reply_to":"9a89bdaa_31906543","updated":"2016-09-06 18:29:45.000000000","message":"As we talked during Mid-Cycle and decided in spec, this should be introduced as extension and enabled by default. Currently I\u0027m working on it.","commit_id":"ee8ba854bf42e12f61ad18b815e51191e8914ff6"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e7ebfb0507faac6fc8cfcc66558873ec8f9b6204","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Henry Gessau \u003cHenryG@gessau.net\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-09 17:48:02 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Accept project_id for API calls"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change address necessary changes to accept"},{"line_number":10,"context_line":"project_id for API calls."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9a89bdaa_465ba4f6","line":7,"updated":"2016-09-09 22:33:07.000000000","message":"What does it take to get rid of the WIP?","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2d47fdb9ea5e013c9c0ab7b32c8a3ebeb46e2b70","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Henry Gessau \u003cHenryG@gessau.net\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-09 17:48:02 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Accept project_id for API calls"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change address necessary changes to accept"},{"line_number":10,"context_line":"project_id for API calls."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9a89bdaa_cfaa6019","line":7,"in_reply_to":"9a89bdaa_465ba4f6","updated":"2016-09-10 15:59:23.000000000","message":"Adding the extension. Done.","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"71bb8e72cbf4936c7d3e141b6a24220c55cc5602","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partially-Implements: blueprint keystone-v3"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Co-Authored-By: Henry Gessau \u003cHenryG@gessau.net\u003e"},{"line_number":15,"context_line":"Change-Id: I8775aa8a477191ef21e7c3c6da31d098befefc3c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9a89bdaa_c667b4b5","line":14,"updated":"2016-09-09 22:33:51.000000000","message":"do we need a final release not? Do we have already filed a DocImpact/APIImpact in the context of this effort?","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2d47fdb9ea5e013c9c0ab7b32c8a3ebeb46e2b70","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partially-Implements: blueprint keystone-v3"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Co-Authored-By: Henry Gessau \u003cHenryG@gessau.net\u003e"},{"line_number":15,"context_line":"Change-Id: I8775aa8a477191ef21e7c3c6da31d098befefc3c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9a89bdaa_efa56447","line":14,"in_reply_to":"9a89bdaa_c667b4b5","updated":"2016-09-10 15:59:23.000000000","message":"Done","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"}],"neutron/api/v2/attributes.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0557b85a2dccaad78b164c26d58c0ad9bc404644","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                raise exc_cls(msg)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def _populate_project_info(dict_obj):"},{"line_number":441,"context_line":"    if \u0027tenant_id\u0027 in dict_obj and \u0027project_id\u0027 not in dict_obj:"},{"line_number":442,"context_line":"        dict_obj[u\u0027project_id\u0027] \u003d dict_obj[\u0027tenant_id\u0027]"},{"line_number":443,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_70191588","line":440,"range":{"start_line":440,"start_character":4,"end_line":440,"end_character":26},"updated":"2016-09-06 14:58:22.000000000","message":"As per discussion on IRC, this looks like we need to make it public and use in SG duplicate rule check.","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0557b85a2dccaad78b164c26d58c0ad9bc404644","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                raise exc_cls(msg)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def _populate_project_info(dict_obj):"},{"line_number":441,"context_line":"    if \u0027tenant_id\u0027 in dict_obj and \u0027project_id\u0027 not in dict_obj:"},{"line_number":442,"context_line":"        dict_obj[u\u0027project_id\u0027] \u003d dict_obj[\u0027tenant_id\u0027]"},{"line_number":443,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_ab6fb0c3","line":440,"range":{"start_line":440,"start_character":27,"end_line":440,"end_character":35},"updated":"2016-09-06 14:58:22.000000000","message":"I think we should name this argument \u0027attrs\u0027 or something without \u0027obj\u0027 in the name.","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"053e4671e69459f675b04e7ce868fb45ecabaa63","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                raise exc_cls(msg)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def _populate_project_info(dict_obj):"},{"line_number":441,"context_line":"    if \u0027tenant_id\u0027 in dict_obj and \u0027project_id\u0027 not in dict_obj:"},{"line_number":442,"context_line":"        dict_obj[u\u0027project_id\u0027] \u003d dict_obj[\u0027tenant_id\u0027]"},{"line_number":443,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_b497088f","line":440,"range":{"start_line":440,"start_character":4,"end_line":440,"end_character":26},"in_reply_to":"9a89bdaa_70191588","updated":"2016-09-06 17:03:34.000000000","message":"Perhaps this should be called from neutron.db.common_db_mixin.CommonDbMixin._get_collection() on each of the items.","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"70245d9fdbbeb54542da229f4db964b39dd6e1d0","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                raise exc_cls(msg)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def _populate_project_info(dict_obj):"},{"line_number":441,"context_line":"    if \u0027tenant_id\u0027 in dict_obj and \u0027project_id\u0027 not in dict_obj:"},{"line_number":442,"context_line":"        dict_obj[u\u0027project_id\u0027] \u003d dict_obj[\u0027tenant_id\u0027]"},{"line_number":443,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_5fcb351e","line":440,"range":{"start_line":440,"start_character":4,"end_line":440,"end_character":26},"in_reply_to":"9a89bdaa_b497088f","updated":"2016-09-06 17:32:59.000000000","message":"It should also be called from neutron.db.common_db_mixin.CommonDbMixin._fields() on the returned dict.","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0557b85a2dccaad78b164c26d58c0ad9bc404644","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def _populate_project_info(dict_obj):"},{"line_number":441,"context_line":"    if \u0027tenant_id\u0027 in dict_obj and \u0027project_id\u0027 not in dict_obj:"},{"line_number":442,"context_line":"        dict_obj[u\u0027project_id\u0027] \u003d dict_obj[\u0027tenant_id\u0027]"},{"line_number":443,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"},{"line_number":444,"context_line":"        #        \u0027Update to project_id in your RESOURCE_ATTRIBUTE_MAP.\u0027)"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_76186385","line":442,"range":{"start_line":442,"start_character":17,"end_line":442,"end_character":18},"updated":"2016-09-06 14:58:22.000000000","message":"No need to use unicode for dict keys.","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0557b85a2dccaad78b164c26d58c0ad9bc404644","unresolved":false,"context_lines":[{"line_number":453,"context_line":"            res_dict[\u0027project_id\u0027] !\u003d context.project_id and"},{"line_number":454,"context_line":"            not context.is_admin):"},{"line_number":455,"context_line":"        msg \u003d _(\"Specifying \u0027project_id\u0027 other than authenticated \""},{"line_number":456,"context_line":"                \"tenant in request requires admin privileges\")"},{"line_number":457,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_1994a889","line":456,"range":{"start_line":456,"start_character":17,"end_line":456,"end_character":23},"updated":"2016-09-06 14:58:22.000000000","message":"project","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0557b85a2dccaad78b164c26d58c0ad9bc404644","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            # NOTE(dasm): backward compatibility"},{"line_number":469,"context_line":"            res_dict[\u0027tenant_id\u0027] \u003d context.project_id"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        elif \u0027tenant_id\u0027 in attr_info:"},{"line_number":472,"context_line":"            msg \u003d _(\"Running without keystone AuthN requires \""},{"line_number":473,"context_line":"                    \"that tenant_id is specified\")"},{"line_number":474,"context_line":"            raise webob.exc.HTTPBadRequest(msg)"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"def verify_attributes(res_dict, attr_info):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_f9b0e48d","line":474,"range":{"start_line":471,"start_character":0,"end_line":474,"end_character":47},"updated":"2016-09-06 14:58:22.000000000","message":"I must admit I don\u0027t understand this part.","commit_id":"59cb1b410e97f717718b3edfefdd33dbfd05b9e6"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"480cf8b2dba079bd8e8b8a20cb5dae944f7e2ddd","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    :return: the updated attributes dictionary"},{"line_number":448,"context_line":"    :rtype: dict"},{"line_number":449,"context_line":"    \"\"\""},{"line_number":450,"context_line":"    if \u0027tenant_id\u0027 in attributes and \u0027project_id\u0027 not in attributes:"},{"line_number":451,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":452,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"},{"line_number":453,"context_line":"        #        \u0027Update to project_id in your RESOURCE_ATTRIBUTE_MAP.\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_e63678b3","line":450,"updated":"2016-09-09 22:31:17.000000000","message":"wouldn\u0027t this be executed all the time because of the if at line 450? Seems slightly confusing. What about:\n\n  tenant_id \u003d attributes.get(\u0027tenant_id\u0027)\n  project_id \u003d attributes.get(\u0027project_id\u0027)\n\n  if tenant_id and not project_id:\n       attributes[\u0027project_id\u0027] \u003d tenant_id\n  elif project_id and not tenant_id:\n       attributes[\u0027tenant_id\u0027] \u003d prorject_id\n  else:\n     OMG!!","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2d47fdb9ea5e013c9c0ab7b32c8a3ebeb46e2b70","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    :return: the updated attributes dictionary"},{"line_number":448,"context_line":"    :rtype: dict"},{"line_number":449,"context_line":"    \"\"\""},{"line_number":450,"context_line":"    if \u0027tenant_id\u0027 in attributes and \u0027project_id\u0027 not in attributes:"},{"line_number":451,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":452,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"},{"line_number":453,"context_line":"        #        \u0027Update to project_id in your RESOURCE_ATTRIBUTE_MAP.\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_0f18c883","line":450,"in_reply_to":"9a89bdaa_e63678b3","updated":"2016-09-10 15:59:23.000000000","message":"The attributes.get() does not work because attributes can have \u0027project_id\u0027 or \u0027tenant_id\u0027 items with a value of None.\n\nNote also that the \u0027OMG!!\u0027 is a normal case. I updated the docstring to explain.","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"cffc13d53065e4aff52fe6894a5611c479c2826c","unresolved":false,"context_lines":[{"line_number":450,"context_line":"    if \u0027tenant_id\u0027 in attributes and \u0027project_id\u0027 not in attributes:"},{"line_number":451,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":452,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"},{"line_number":453,"context_line":"        #        \u0027Update to project_id in your RESOURCE_ATTRIBUTE_MAP.\u0027)"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    # NOTE(dasm): Backward compatibility for tenant/project migration"},{"line_number":456,"context_line":"    if \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_e62bd831","line":453,"updated":"2016-09-09 22:37:02.000000000","message":"what about these?","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2d47fdb9ea5e013c9c0ab7b32c8a3ebeb46e2b70","unresolved":false,"context_lines":[{"line_number":450,"context_line":"    if \u0027tenant_id\u0027 in attributes and \u0027project_id\u0027 not in attributes:"},{"line_number":451,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":452,"context_line":"        #debtcollector.deprecate(\u0027tenant_id is deprecated. \u0027,"},{"line_number":453,"context_line":"        #        \u0027Update to project_id in your RESOURCE_ATTRIBUTE_MAP.\u0027)"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    # NOTE(dasm): Backward compatibility for tenant/project migration"},{"line_number":456,"context_line":"    if \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_6a2302a8","line":453,"in_reply_to":"9a89bdaa_e62bd831","updated":"2016-09-10 15:59:23.000000000","message":"This generates too many warnings right now. I think it is better to do a follow-up patch which cleans up tenant_id usage and enables the warning.","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"285f8b3646f6aa98e268136dbdb4079764cace0d","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        # TODO(HenryG): emit a deprecation warning here"},{"line_number":457,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    if \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"},{"line_number":460,"context_line":"        # Backward compatibility for code still using tenant_id"},{"line_number":461,"context_line":"        attributes[\u0027tenant_id\u0027] \u003d attributes[\u0027project_id\u0027]"},{"line_number":462,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_69f22f9c","line":459,"updated":"2016-09-10 19:33:41.000000000","message":"In case when first \"if\" clause will be executed then this one also always will be executed. Maybe \"else if\" would be better here?","commit_id":"7daa3357c2c5aa0895f84cbf2a61b5b540513101"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"a8bee9c3ee96f1928afbb626c457cdb2bcf8281b","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        # TODO(HenryG): emit a deprecation warning here"},{"line_number":457,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    if \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"},{"line_number":460,"context_line":"        # Backward compatibility for code still using tenant_id"},{"line_number":461,"context_line":"        attributes[\u0027tenant_id\u0027] \u003d attributes[\u0027project_id\u0027]"},{"line_number":462,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_0ff603f9","line":459,"in_reply_to":"9a89bdaa_69f22f9c","updated":"2016-09-10 23:20:24.000000000","message":"Done","commit_id":"7daa3357c2c5aa0895f84cbf2a61b5b540513101"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"589795fcf3c3664b6add3848be2926c6458b0d4a","unresolved":false,"context_lines":[{"line_number":457,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":458,"context_line":"    elif \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"},{"line_number":459,"context_line":"        # Backward compatibility for code still using tenant_id"},{"line_number":460,"context_line":"        attributes[\u0027tenant_id\u0027] \u003d attributes[\u0027project_id\u0027]"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    return attributes"},{"line_number":463,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_b5180177","line":460,"updated":"2016-09-11 15:12:56.000000000","message":"Now we allow to specify both project_id and tenant_id in API request.\nPotentially project_id and tenant_id have different values. I think we should check it. We can raise 400 response when project_id and tenant_id do not match. Thought?","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c14fffdeb86dd185e6e37be2c063946d6daa2fb9","unresolved":false,"context_lines":[{"line_number":457,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":458,"context_line":"    elif \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"},{"line_number":459,"context_line":"        # Backward compatibility for code still using tenant_id"},{"line_number":460,"context_line":"        attributes[\u0027tenant_id\u0027] \u003d attributes[\u0027project_id\u0027]"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    return attributes"},{"line_number":463,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_d503c574","line":460,"in_reply_to":"9a89bdaa_b5180177","updated":"2016-09-11 19:19:46.000000000","message":"I did think about that and couldn\u0027t find any code path that would populate them differently. However, I suppose the user could specify both with different values. I will add the check.","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"589795fcf3c3664b6add3848be2926c6458b0d4a","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            res_dict[\u0027project_id\u0027] !\u003d context.project_id and"},{"line_number":468,"context_line":"            not context.is_admin):"},{"line_number":469,"context_line":"        msg \u003d _(\"Specifying \u0027project_id\u0027 other than authenticated \""},{"line_number":470,"context_line":"                \"project in request requires admin privileges\")"},{"line_number":471,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_d52585ae","line":470,"updated":"2016-09-11 15:12:56.000000000","message":"We still allow to specify tenant_id. If a user specify tenant_id, the user will get an error message about project_id. It is better to mention \u0027tenant_id\u0027 too. How about the following?\n\n  Specifying \u0027project_id\u0027 or \u0027tenant_id\u0027 other than ....","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c14fffdeb86dd185e6e37be2c063946d6daa2fb9","unresolved":false,"context_lines":[{"line_number":467,"context_line":"            res_dict[\u0027project_id\u0027] !\u003d context.project_id and"},{"line_number":468,"context_line":"            not context.is_admin):"},{"line_number":469,"context_line":"        msg \u003d _(\"Specifying \u0027project_id\u0027 other than authenticated \""},{"line_number":470,"context_line":"                \"project in request requires admin privileges\")"},{"line_number":471,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_75683922","line":470,"in_reply_to":"9a89bdaa_d52585ae","updated":"2016-09-11 19:19:46.000000000","message":"Done","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"85f0dfce1fcea2da6c07a67b633010f41b842a27","unresolved":false,"context_lines":[{"line_number":453,"context_line":"    :rtype: dict"},{"line_number":454,"context_line":"    \"\"\""},{"line_number":455,"context_line":"    if \u0027tenant_id\u0027 in attributes and \u0027project_id\u0027 not in attributes:"},{"line_number":456,"context_line":"        # TODO(HenryG): emit a deprecation warning here"},{"line_number":457,"context_line":"        attributes[\u0027project_id\u0027] \u003d attributes[\u0027tenant_id\u0027]"},{"line_number":458,"context_line":"    elif \u0027project_id\u0027 in attributes and \u0027tenant_id\u0027 not in attributes:"},{"line_number":459,"context_line":"        # Backward compatibility for code still using tenant_id"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a89bdaa_602af991","line":456,"updated":"2016-09-12 23:41:33.000000000","message":"well i don\u0027t think we actually can emit a warning until we agree that we can break our core API","commit_id":"dd5976b7ab62ef2c75a3ca76d7ab53dcbc988f51"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"24a0f3c20745664db2a9a1417c280c7597e5ff75","unresolved":false,"context_lines":[{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    if attributes.get(\u0027project_id\u0027) !\u003d attributes.get(\u0027tenant_id\u0027):"},{"line_number":463,"context_line":"        msg \u003d _(\"\u0027project_id\u0027 and \u0027tenant_id\u0027 do not match\")"},{"line_number":464,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    return attributes"},{"line_number":467,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a89bdaa_272d70a8","line":464,"updated":"2016-09-12 20:08:59.000000000","message":"I don\u0027t see this codepath being tested. It\u0027s a corner case, but worth the coverage nonetheless.","commit_id":"dd5976b7ab62ef2c75a3ca76d7ab53dcbc988f51"}],"neutron/api/v2/base.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"457ad1c3c9fb2b2d859948c9d7c81849c43b5e36","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._native_bulk \u003d self._is_native_bulk_supported()"},{"line_number":91,"context_line":"        self._native_pagination \u003d self._is_native_pagination_supported()"},{"line_number":92,"context_line":"        self._native_sorting \u003d self._is_native_sorting_supported()"},{"line_number":93,"context_line":"        policy_attrs \u003d {name for (name, info) in self._attr_info.items()"},{"line_number":94,"context_line":"                        if info.get(\u0027required_by_policy\u0027)}"},{"line_number":95,"context_line":"        if \u0027tenant_id\u0027 in policy_attrs:"},{"line_number":96,"context_line":"            policy_attrs.add(\u0027project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_dd5771c8","line":93,"updated":"2016-09-11 04:17:30.000000000","message":"nit - maybe we can get a method to update this value","commit_id":"e1c3c961d4e48b3931a601e69c870394e1614733"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c422b6c6304d021f7cc90938ba23bb2d1c2ce22a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self._native_bulk \u003d self._is_native_bulk_supported()"},{"line_number":91,"context_line":"        self._native_pagination \u003d self._is_native_pagination_supported()"},{"line_number":92,"context_line":"        self._native_sorting \u003d self._is_native_sorting_supported()"},{"line_number":93,"context_line":"        policy_attrs \u003d {name for (name, info) in self._attr_info.items()"},{"line_number":94,"context_line":"                        if info.get(\u0027required_by_policy\u0027)}"},{"line_number":95,"context_line":"        if \u0027tenant_id\u0027 in policy_attrs:"},{"line_number":96,"context_line":"            policy_attrs.add(\u0027project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_be2e2340","line":93,"in_reply_to":"9a89bdaa_dd5771c8","updated":"2016-09-11 11:22:21.000000000","message":"Done","commit_id":"e1c3c961d4e48b3931a601e69c870394e1614733"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f180582f6daf910644f998e9dcceb93e58fd2f9e","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        :returns: a view of the object which includes only attributes"},{"line_number":188,"context_line":"        visible according to API resource declaration and authZ policies."},{"line_number":189,"context_line":"        \"\"\""},{"line_number":190,"context_line":"        fields_to_strip \u003d ((fields_to_strip or []) +"},{"line_number":191,"context_line":"                           self._exclude_attributes_by_policy(context, data))"},{"line_number":192,"context_line":"        return self._filter_attributes(context, data, fields_to_strip)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def _filter_attributes(self, context, data, fields_to_strip\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a89bdaa_877f3365","line":191,"range":{"start_line":190,"start_character":8,"end_line":191,"end_character":77},"updated":"2016-09-12 13:17:42.000000000","message":"I added logging message and confirmed that \u0027data\u0027 contains \u0027project_id\u0027 and \u0027project_id\u0027 is included in fields_to_strip here. _exclude_attributes_by_policy looks self._attr_info and it does not honor project_id. I think this is the reason that project_id is not return in *-list/show response.\n\nThe very straight-forward way is to populate project_id to self._attr_info if tenant_id is included. It means this way populates both tenant_id and project_id and self._attr_info is referred in various places. We need to check it carefully. Another option is to handle project_id and tenant_id specially in _exclude_attributes_by_policy().\n\nI\u0027ll continue to investigate the code.","commit_id":"b2d28564ed3455e44759f00e9ee9ca55c00ee00c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"24a0f3c20745664db2a9a1417c280c7597e5ff75","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        if \u0027tenant_id\u0027 in policy_attrs:"},{"line_number":90,"context_line":"            policy_attrs.add(\u0027project_id\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        # Could use list(), but sorted() makes testing easier."},{"line_number":93,"context_line":"        return sorted(policy_attrs)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def __init__(self, plugin, collection, resource, attr_info,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a89bdaa_0a3951d7","line":92,"updated":"2016-09-12 20:08:59.000000000","message":"writing testable code is one thing, writing code to make testing easier it\u0027s another :)","commit_id":"dd5976b7ab62ef2c75a3ca76d7ab53dcbc988f51"}],"neutron/extensions/project_id.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"457ad1c3c9fb2b2d859948c9d7c81849c43b5e36","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from neutron.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_ALIAS \u003d \u0027project_id\u0027"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_3d6dbd99","line":15,"updated":"2016-09-11 04:17:30.000000000","message":"nit you do not need the new line here","commit_id":"e1c3c961d4e48b3931a601e69c870394e1614733"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c422b6c6304d021f7cc90938ba23bb2d1c2ce22a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from neutron.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_ALIAS \u003d \u0027project_id\u0027"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_9e5ddfee","line":15,"in_reply_to":"9a89bdaa_3d6dbd99","updated":"2016-09-11 11:22:21.000000000","message":"Hmm, I kind of like having two lines between each of the main sections (imports, constants, functions, classes).","commit_id":"e1c3c961d4e48b3931a601e69c870394e1614733"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"589795fcf3c3664b6add3848be2926c6458b0d4a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_ALIAS \u003d \u0027project_id\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Project_id(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_1520cd9a","line":17,"range":{"start_line":17,"start_character":10,"end_line":17,"end_character":20},"updated":"2016-09-11 15:12:56.000000000","message":"Though we don\u0027t have a specific guideline on extension aliases, most extensions use hyphens as delimiter. I prefer to \u0027project-id\u0027.","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c14fffdeb86dd185e6e37be2c063946d6daa2fb9","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from neutron.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_ALIAS \u003d \u0027project_id\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Project_id(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_355dd179","line":17,"range":{"start_line":17,"start_character":10,"end_line":17,"end_character":20},"in_reply_to":"9a89bdaa_1520cd9a","updated":"2016-09-11 19:19:46.000000000","message":"Done","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"589795fcf3c3664b6add3848be2926c6458b0d4a","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Project_id(extensions.ExtensionDescriptor):"},{"line_number":21,"context_line":"    \"\"\"Fake extension that indicates that project_id is enabled."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    This fake extension indicates that the Keystone V3 \u0027project_id\u0027 field"},{"line_number":24,"context_line":"    is supported in the API."}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_553a55ce","line":21,"range":{"start_line":21,"start_character":7,"end_line":21,"end_character":11},"updated":"2016-09-11 15:12:56.000000000","message":"\"Fake\" is unnecessary.","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c14fffdeb86dd185e6e37be2c063946d6daa2fb9","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Project_id(extensions.ExtensionDescriptor):"},{"line_number":21,"context_line":"    \"\"\"Fake extension that indicates that project_id is enabled."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    This fake extension indicates that the Keystone V3 \u0027project_id\u0027 field"},{"line_number":24,"context_line":"    is supported in the API."}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_55541553","line":21,"range":{"start_line":21,"start_character":7,"end_line":21,"end_character":11},"in_reply_to":"9a89bdaa_553a55ce","updated":"2016-09-11 19:19:46.000000000","message":"Done","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"589795fcf3c3664b6add3848be2926c6458b0d4a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class Project_id(extensions.ExtensionDescriptor):"},{"line_number":21,"context_line":"    \"\"\"Fake extension that indicates that project_id is enabled."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    This fake extension indicates that the Keystone V3 \u0027project_id\u0027 field"},{"line_number":24,"context_line":"    is supported in the API."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_753599d9","line":23,"range":{"start_line":23,"start_character":9,"end_line":23,"end_character":13},"updated":"2016-09-11 15:12:56.000000000","message":"ditto","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c14fffdeb86dd185e6e37be2c063946d6daa2fb9","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class Project_id(extensions.ExtensionDescriptor):"},{"line_number":21,"context_line":"    \"\"\"Fake extension that indicates that project_id is enabled."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    This fake extension indicates that the Keystone V3 \u0027project_id\u0027 field"},{"line_number":24,"context_line":"    is supported in the API."},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_754f59be","line":23,"range":{"start_line":23,"start_character":9,"end_line":23,"end_character":13},"in_reply_to":"9a89bdaa_753599d9","updated":"2016-09-11 19:19:46.000000000","message":"Done","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"}],"neutron/tests/tempest/api/test_networks.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"285f8b3646f6aa98e268136dbdb4079764cace0d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        new_net \u003d body[\u0027network\u0027]"},{"line_number":85,"context_line":"        self.assertEqual(name, new_net[\u0027name\u0027])"},{"line_number":86,"context_line":"        body \u003d self.client.list_networks(id\u003dnew_net[\u0027id\u0027])[\u0027networks\u0027][0]"},{"line_number":87,"context_line":"        self.assertEqual(name, body[\u0027name\u0027])"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @test.idempotent_id(\u00276ae6d24f-9194-4869-9c85-c313cb20e080\u0027)"},{"line_number":90,"context_line":"    def test_list_networks_fields(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_093e03da","line":87,"updated":"2016-09-10 19:33:41.000000000","message":"maybe it\u0027s worth to add test which will get network info from API and check if both: tenant_id and project_id are in returned data. What do You think?","commit_id":"7daa3357c2c5aa0895f84cbf2a61b5b540513101"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"a8bee9c3ee96f1928afbb626c457cdb2bcf8281b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        new_net \u003d body[\u0027network\u0027]"},{"line_number":85,"context_line":"        self.assertEqual(name, new_net[\u0027name\u0027])"},{"line_number":86,"context_line":"        body \u003d self.client.list_networks(id\u003dnew_net[\u0027id\u0027])[\u0027networks\u0027][0]"},{"line_number":87,"context_line":"        self.assertEqual(name, body[\u0027name\u0027])"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @test.idempotent_id(\u00276ae6d24f-9194-4869-9c85-c313cb20e080\u0027)"},{"line_number":90,"context_line":"    def test_list_networks_fields(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_2fdd8770","line":87,"in_reply_to":"9a89bdaa_093e03da","updated":"2016-09-10 23:20:24.000000000","message":"The qos test kind of does that:\nhttps://review.openstack.org/#/c/357977/11/neutron/tests/tempest/api/test_qos.py@557","commit_id":"7daa3357c2c5aa0895f84cbf2a61b5b540513101"}],"neutron/tests/tempest/api/test_qos.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f668aee78d101de3b86b2834f0b2757a654793dd","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        return False"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    @test.idempotent_id(\u0027b9dcf582-d3b3-11e5-950a-54ee756c66df\u0027)"},{"line_number":552,"context_line":"    def test_policy_sharing_with_wildcard(self):"},{"line_number":553,"context_line":"        qos_pol \u003d self.create_qos_policy("},{"line_number":554,"context_line":"            name\u003ddata_utils.rand_name(\u0027test-policy\u0027),"},{"line_number":555,"context_line":"            description\u003d\u0027test-shared-policy\u0027, shared\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_86076c1c","line":552,"updated":"2016-09-09 23:02:52.000000000","message":"I am tempted to say that this test should be adjusted according to the same strategy used in the other tests and that is adding project_id to lne 562.","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2d47fdb9ea5e013c9c0ab7b32c8a3ebeb46e2b70","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        return False"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    @test.idempotent_id(\u0027b9dcf582-d3b3-11e5-950a-54ee756c66df\u0027)"},{"line_number":552,"context_line":"    def test_policy_sharing_with_wildcard(self):"},{"line_number":553,"context_line":"        qos_pol \u003d self.create_qos_policy("},{"line_number":554,"context_line":"            name\u003ddata_utils.rand_name(\u0027test-policy\u0027),"},{"line_number":555,"context_line":"            description\u003d\u0027test-shared-policy\u0027, shared\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_ea2f1286","line":552,"in_reply_to":"9a89bdaa_86076c1c","updated":"2016-09-10 15:59:23.000000000","message":"Done","commit_id":"0b26a196c3d58b5e53a755ff82992059f439dead"}],"releasenotes/notes/project_id-d5ea7a42be428230.yaml":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b334a492db2999e1da0e6b8e1ea32654e932ac83","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - A new API extensions, \u0027project_id\u0027, has been added to allow API users"},{"line_number":4,"context_line":"    to detect if the Keystone V3 \u0027project_id\u0027 field is supported."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9a89bdaa_7d6745b7","line":3,"range":{"start_line":3,"start_character":14,"end_line":3,"end_character":24},"updated":"2016-09-11 04:18:00.000000000","message":"extension","commit_id":"e1c3c961d4e48b3931a601e69c870394e1614733"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c422b6c6304d021f7cc90938ba23bb2d1c2ce22a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - A new API extensions, \u0027project_id\u0027, has been added to allow API users"},{"line_number":4,"context_line":"    to detect if the Keystone V3 \u0027project_id\u0027 field is supported."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9a89bdaa_1edd4f70","line":3,"range":{"start_line":3,"start_character":14,"end_line":3,"end_character":24},"in_reply_to":"9a89bdaa_7d6745b7","updated":"2016-09-11 11:22:21.000000000","message":"Done","commit_id":"e1c3c961d4e48b3931a601e69c870394e1614733"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"589795fcf3c3664b6add3848be2926c6458b0d4a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - A new API extension, \u0027project_id\u0027, has been added to allow API users"},{"line_number":4,"context_line":"    to detect if the Keystone V3 \u0027project_id\u0027 field is supported."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9a89bdaa_b52f2187","line":4,"updated":"2016-09-11 15:12:56.000000000","message":"I think we first need to describe more important thing: \u0027project_id\u0027 is supported in the API. Then, we should describe how to detect the feature is supported (through the extension list). In addition, \u0027tenant_id\u0027 field is still supported and both \u0027project_id\u0027 and \u0027tenant_id\u0027 work equally.","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"c14fffdeb86dd185e6e37be2c063946d6daa2fb9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - A new API extension, \u0027project_id\u0027, has been added to allow API users"},{"line_number":4,"context_line":"    to detect if the Keystone V3 \u0027project_id\u0027 field is supported."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9a89bdaa_f5be0963","line":4,"in_reply_to":"9a89bdaa_b52f2187","updated":"2016-09-11 19:19:46.000000000","message":"Done","commit_id":"81df537fa69c79f55427e8da476bccad3614ea11"}]}
