)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":7,"context_line":"WIP - Added versions to keystone headers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds the version of some endpoints into the header"},{"line_number":10,"context_line":"of keystone api requests"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I89148194b7f51be429cb77580872dc4b5d779b5e"},{"line_number":13,"context_line":"Partial-Bug: #1689644"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7f231b9d_9fe831b3","line":10,"updated":"2017-06-16 18:01:46.000000000","message":"We should list out which endpoints we\u0027re applying the fix to. In addition to that, we can list which endpoints we have left to fix and if those are coming in a subsequent patch set.\n\nWhat\u0027s left to do to close this one out?","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of keystone api requests"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I89148194b7f51be429cb77580872dc4b5d779b5e"},{"line_number":13,"context_line":"Partial-Bug: #1689644"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"7f231b9d_ff084592","line":13,"updated":"2017-06-16 18:01:46.000000000","message":"Based on the wording of this commit message, I assume this will be closed when we cover all endpoints?","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc03c1097f7308a93b0f3c83f41dd96df5134513","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Added versions to keystone headers"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds the version of some endpoints into the header"},{"line_number":10,"context_line":"of keystone api requests"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I89148194b7f51be429cb77580872dc4b5d779b5e"},{"line_number":13,"context_line":"Partial-Bug: #1689644"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"9f436f4f_10697024","line":10,"updated":"2017-08-08 16:11:21.000000000","message":"This should be explicit in describing what endpoints are added and which one are coming later. It makes it easier to track and follow up if there are other patches that need to be proposed.","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"}],"keystone/common/api_version_request.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    REST API Version History:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * 2.0 Depricated"},{"line_number":21,"context_line":"    * 3.0 Current: v3.8"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_7ffc356f","line":20,"updated":"2017-06-16 18:01:46.000000000","message":"Deprecated*","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# Placeholders for microversions"},{"line_number":26,"context_line":"_MIN_API_VERSION \u003d \"3.0\""},{"line_number":27,"context_line":"_MAX_API_VERSION \u003d \"3.8\""},{"line_number":28,"context_line":"_DEPRICATED_API_VERSION2 \u003d \"2.0\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def min_api_version():"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_bf33ed61","line":28,"updated":"2017-06-16 18:01:46.000000000","message":"_DEPRECATED_API_VERSION*\n\nI don\u0027t think the \u00272\u0027 in the variable name is necessary here. We get that information as a result of the assignment.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return (version, status, updated)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def depricated_api_version2():"},{"line_number":46,"context_line":"    version \u003d _DEPRICATED_API_VERSION2"},{"line_number":47,"context_line":"    status \u003d \u0027deprecated\u0027"},{"line_number":48,"context_line":"    updated \u003d \u00272016-08-04T00:00:00Z\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_df30e958","line":45,"updated":"2017-06-16 18:01:46.000000000","message":"deprecated*","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":45,"context_line":"def depricated_api_version2():"},{"line_number":46,"context_line":"    version \u003d _DEPRICATED_API_VERSION2"},{"line_number":47,"context_line":"    status \u003d \u0027deprecated\u0027"},{"line_number":48,"context_line":"    updated \u003d \u00272016-08-04T00:00:00Z\u0027"},{"line_number":49,"context_line":"    return (version, status, updated)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_1f49c1b5","line":48,"updated":"2017-06-16 18:01:46.000000000","message":"These could be attributes, which would make reading the code using this a little easier.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b4c6e95883dae1de5571e5a5ed8e060fca1a860b","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    REST API Version History:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * 2.0 Depricated"},{"line_number":21,"context_line":"    * 3.0 Current: v3.8"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_2994078b","line":20,"range":{"start_line":20,"start_character":10,"end_line":20,"end_character":20},"updated":"2017-06-20 23:35:11.000000000","message":"Some of Lance\u0027s comment from the previous patch hasn\u0027t been addressed.\ns/Depricated/Deprecated","commit_id":"44d128005b757af831c0675156052a7788fcd462"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b4c6e95883dae1de5571e5a5ed8e060fca1a860b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# Placeholders for microversions"},{"line_number":26,"context_line":"_MIN_API_VERSION \u003d \"3.0\""},{"line_number":27,"context_line":"_MAX_API_VERSION \u003d \"3.8\""},{"line_number":28,"context_line":"_DEPRICATED_API_VERSION2 \u003d \"2.0\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def min_api_version():"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_e98def7b","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":24},"updated":"2017-06-20 23:35:11.000000000","message":"_DEPRECATED_API_VERSION","commit_id":"44d128005b757af831c0675156052a7788fcd462"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b4c6e95883dae1de5571e5a5ed8e060fca1a860b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return {\"version\": version, \"status\": status, \"updated\": updated}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def depricated_api_version2():"},{"line_number":46,"context_line":"    version \u003d _DEPRICATED_API_VERSION2"},{"line_number":47,"context_line":"    status \u003d \u0027deprecated\u0027"},{"line_number":48,"context_line":"    updated \u003d \u00272016-08-04T00:00:00Z\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_c9e8f317","line":45,"range":{"start_line":45,"start_character":4,"end_line":45,"end_character":14},"updated":"2017-06-20 23:35:11.000000000","message":"deprecated","commit_id":"44d128005b757af831c0675156052a7788fcd462"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efa2a041c216e6850db78e82460c69d39e60643e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return {\"version\": version, \"status\": status, \"updated\": updated}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def deprecated_api_version():"},{"line_number":46,"context_line":"    version \u003d _DEPRECATED_API_VERSION"},{"line_number":47,"context_line":"    status \u003d \u0027deprecated\u0027"},{"line_number":48,"context_line":"    updated \u003d \u00272016-08-04T00:00:00Z\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f201791_e1919f53","line":45,"updated":"2017-06-28 18:59:41.000000000","message":"We could restructure this as a class and have the methods here be more like attributes.","commit_id":"23723c83254ab2238fde7ae7afc83919fc10e1c5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a150b2cb18caeb7e424b94cd15490ec37bd3dce3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"REST_API_VERSION_HISTORY \u003d \"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    REST API Version History:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_3b367d05","line":16,"updated":"2017-07-31 17:06:08.000000000","message":"This doesn\u0027t appear to be used anywhere.","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"fb407beeae88422a4b44b65eb3f1590a7bf09989","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"REST_API_VERSION_HISTORY \u003d \"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    REST API Version History:"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_5c7212e5","line":16,"in_reply_to":"df3967d1_3b367d05","updated":"2017-08-02 14:41:51.000000000","message":"Done","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3a5fe44e82c6a02a04b97c1907734167d6b3e859","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class VersionFactory(object):"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    _min_api_version \u003d \u00273.0\u0027"},{"line_number":20,"context_line":"    _max_api_version \u003d \u00273.8\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_3df044fe","line":17,"updated":"2017-08-03 14:06:17.000000000","message":"I would rather not call this a Factory - that\u0027s not what it is https://www.tutorialspoint.com/design_pattern/factory_pattern.htm","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e8dabf1f5f08bffb8ba4d4f1e46f5f91ecfcd407","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"class VersionFactory(object):"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    _min_api_version \u003d \u00273.0\u0027"},{"line_number":20,"context_line":"    _max_api_version \u003d \u00273.8\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_5c054010","line":17,"in_reply_to":"df3967d1_3df044fe","updated":"2017-08-03 18:34:11.000000000","message":"++. Don\u0027t really see much benefit in it being a class at all in fact, since nothing inside of it is instance specific. The properties below are also unnecessary and unpythonic.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e8dabf1f5f08bffb8ba4d4f1e46f5f91ecfcd407","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    _min_api_version \u003d \u00273.0\u0027"},{"line_number":20,"context_line":"    _max_api_version \u003d \u00273.8\u0027"},{"line_number":21,"context_line":"    _deprecated_api_version \u003d \u00272.0\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    @property"},{"line_number":24,"context_line":"    def deprecated_api_version(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_1c7218ae","line":21,"updated":"2017-08-03 18:34:11.000000000","message":"We could theoretically have more than one deprecated version. This limits us in that regard. I would argue that this should be a list of dictionaries. Where dictionaries have keys for \u0027version\u0027 and \u0027last_updated\u0027.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e8dabf1f5f08bffb8ba4d4f1e46f5f91ecfcd407","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def last_updated(self, version):"},{"line_number":43,"context_line":"        if version \u003d\u003d self.deprecated_api_version:"},{"line_number":44,"context_line":"            last_updated \u003d \u00272016-08-04T00:00:00Z\u0027"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            last_updated \u003d \u00272017-02-22T00:00:00Z\u0027"},{"line_number":47,"context_line":"        return last_updated"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_7c8b641e","line":46,"range":{"start_line":44,"start_character":12,"end_line":46,"end_character":49},"updated":"2017-08-03 18:34:11.000000000","message":"I feel strongly about not dividing the version information into multiple files and methods which is what we\u0027re doing here. Put all of these in a dictionary with the version as the key. So you have VERSIONS \u003d { \u0027v3\u0027: { \u0027status\u0027: \u0027stable\u0027, \u0027last_updated\u0027: date }, \u0027v2\u0027: {...} }. Have a list for DEPRECATED_VERSIONS \u003d [\u0027v2.0\u0027] where v2.0 is the key in the VERSIONS dictionary.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ffe2b54dec45dbe033c43c6d7e3da3ab4b03ad1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"MIN_API_VERSION \u003d \u00273.0\u0027"},{"line_number":17,"context_line":"MAX_API_VERSION \u003d \u00273.8\u0027"},{"line_number":18,"context_line":"DEPRECATED_VERSIONS \u003d [\u00272.0\u0027]"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f436f4f_8eef8e86","line":16,"updated":"2017-08-08 10:09:17.000000000","message":"This doesn\u0027t seem to be used anywhere, and is also incorrect - we still support 2.0","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"7786478f3fbafa48c241ed3d9aae274c89eefbe1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"MIN_API_VERSION \u003d \u00273.0\u0027"},{"line_number":17,"context_line":"MAX_API_VERSION \u003d \u00273.8\u0027"},{"line_number":18,"context_line":"DEPRECATED_VERSIONS \u003d [\u00272.0\u0027]"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f436f4f_ed75f299","line":16,"in_reply_to":"9f436f4f_8eef8e86","updated":"2017-08-08 18:24:09.000000000","message":"it\u0027s also incorrect in the sense that we don\u0027t really support 3.0 anymore... it\u0027s 2.0 or 3.8, period.","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"7786478f3fbafa48c241ed3d9aae274c89eefbe1","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \u0027v2.0\u0027: {"},{"line_number":22,"context_line":"        \u0027version\u0027: \u00272.0\u0027,"},{"line_number":23,"context_line":"        \u0027status\u0027: \u0027deprecated\u0027,"},{"line_number":24,"context_line":"        \u0027last_updated\u0027: \u00272016-08-04T00:00:00Z\u0027"},{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027v3\u0027: {"},{"line_number":27,"context_line":"        \u0027version\u0027: \u00273.8\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f436f4f_0db5d631","line":24,"updated":"2017-08-08 18:24:09.000000000","message":"where does this date come from? And is it accurate?","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"7786478f3fbafa48c241ed3d9aae274c89eefbe1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \u0027v3\u0027: {"},{"line_number":27,"context_line":"        \u0027version\u0027: \u00273.8\u0027,"},{"line_number":28,"context_line":"        \u0027status\u0027: \u0027stable\u0027,"},{"line_number":29,"context_line":"        \u0027last_updated\u0027: \u00272017-02-22T00:00:00Z\u0027"},{"line_number":30,"context_line":"    }"},{"line_number":31,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f436f4f_ed83b255","line":29,"updated":"2017-08-08 18:24:09.000000000","message":"ditto","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ffe2b54dec45dbe033c43c6d7e3da3ab4b03ad1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"9f436f4f_ee097a31","line":32,"updated":"2017-08-08 10:09:17.000000000","message":"What is the value of adding this new module instead of building it into keystone/version/controllers.py and keystone/version/__init__.py?","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"}],"keystone/common/wsgi.py":[{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"6fb81efb200061a905e08f7c9f160faa2198d333","unresolved":false,"context_lines":[{"line_number":722,"context_line":""},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"def render_response(body\u003dNone, status\u003dNone, headers\u003dNone,"},{"line_number":725,"context_line":"                    method\u003dNone, version\u003dNone):"},{"line_number":726,"context_line":"    \"\"\"Form a WSGI response.\"\"\""},{"line_number":727,"context_line":"    if headers is None:"},{"line_number":728,"context_line":"        headers \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff0f0b1f_0b094230","line":725,"range":{"start_line":725,"start_character":31,"end_line":725,"end_character":45},"updated":"2017-05-25 23:52:35.000000000","message":"We should just grab the (micro)version from [0].\n\n[0] https://github.com/openstack/keystone/blob/master/keystone/version/controllers.py#L103","commit_id":"1852ca69cee2f9ad4a9b461448470e7d6376908e"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"6fb81efb200061a905e08f7c9f160faa2198d333","unresolved":false,"context_lines":[{"line_number":731,"context_line":"    headers.append((\u0027Vary\u0027, \u0027X-Auth-Token\u0027))"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"    if version:"},{"line_number":734,"context_line":"        headers.append((\u0027API_VERSION_REQUEST_HEADER\u0027, version))"},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"    if body is None:"},{"line_number":737,"context_line":"        body \u003d b\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff0f0b1f_2611db54","line":734,"range":{"start_line":734,"start_character":25,"end_line":734,"end_character":52},"updated":"2017-05-25 23:52:35.000000000","message":"This header should conform to [1], i.e,\n\n   OpenStack-API-Version: [SERVICE_TYPE] version_number\n\n[1] https://specs.openstack.org/openstack/api-wg/guidelines/microversion_specification.html","commit_id":"1852ca69cee2f9ad4a9b461448470e7d6376908e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"5310fb41858c65bfd8ea1312504312546f586bc8","unresolved":false,"context_lines":[{"line_number":423,"context_line":"    @middleware_exceptions"},{"line_number":424,"context_line":"    def __call__(self, request):"},{"line_number":425,"context_line":"        response \u003d self.process_request(request)"},{"line_number":426,"context_line":"        global OPENSTACK_API_VERSION"},{"line_number":427,"context_line":"        OPENSTACK_API_VERSION \u003d request.headers.get(\u0027OpenStack-Api-Version\u0027)"},{"line_number":428,"context_line":"        if response:"},{"line_number":429,"context_line":"            return response"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f231b9d_e9735ab0","line":426,"range":{"start_line":426,"start_character":8,"end_line":426,"end_character":14},"updated":"2017-06-13 20:55:37.000000000","message":"This shouldn\u0027t really be global, should probably rework this.","commit_id":"048fe942d36f2419d1ecc581527e372b6db0d820"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"cba39c696cfd17e2f5510011abfd97de6ecb3a09","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        if \u0027REQUEST_URI\u0027 in req.context_dict[\u0027environment\u0027]:"},{"line_number":233,"context_line":"            version \u003d set_api_version_request("},{"line_number":234,"context_line":"                self,"},{"line_number":235,"context_line":"                req.context_dict[\u0027environment\u0027][\u0027REQUEST_URI\u0027])"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        try:"},{"line_number":238,"context_line":"            result \u003d method(req, **params)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_0bb97f13","line":235,"updated":"2017-06-16 20:30:31.000000000","message":"Just a thought: Instead of getting the version from the path used, couldn\u0027t we get the version from the controller instead? Have the controller tell render_response what version it is.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"f141ebe451fc691d37862a03e62cca7d4c7f07ca","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        if \u0027REQUEST_URI\u0027 in req.context_dict[\u0027environment\u0027]:"},{"line_number":233,"context_line":"            version \u003d set_api_version_request("},{"line_number":234,"context_line":"                self,"},{"line_number":235,"context_line":"                req.context_dict[\u0027environment\u0027][\u0027REQUEST_URI\u0027])"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        try:"},{"line_number":238,"context_line":"            result \u003d method(req, **params)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_ec7f5212","line":235,"in_reply_to":"7f231b9d_0bb97f13","updated":"2017-06-19 17:42:38.000000000","message":"I agree with this Kristi. I also think its better convention to fetch from the controller.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":424,"context_line":"    def __call__(self, request):"},{"line_number":425,"context_line":"        response \u003d self.process_request(request)"},{"line_number":426,"context_line":"        global OPENSTACK_API_VERSION"},{"line_number":427,"context_line":"        OPENSTACK_API_VERSION \u003d request.headers.get(\u0027OpenStack-Api-Version\u0027)"},{"line_number":428,"context_line":"        if response:"},{"line_number":429,"context_line":"            return response"},{"line_number":430,"context_line":"        response \u003d request.get_response(self.application)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_7f2af5da","line":427,"updated":"2017-06-16 18:01:46.000000000","message":"nit: OpenStack-API-Version?\n\nIt is suppose to be OpenStack-Api-Version or OpenStack-API-Version? Not sure it matters, but just for the sake of consistency.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"efa2a041c216e6850db78e82460c69d39e60643e","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        params \u003d self._normalize_dict(params)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        version \u003d set_api_version_request(self)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        try:"},{"line_number":234,"context_line":"            result \u003d method(req, **params)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f201791_a143a73e","line":231,"updated":"2017-06-28 18:59:41.000000000","message":"Instead of calling a module level method and passing self, what if we kept the logic inside __call__ and determined the version here instead?","commit_id":"23723c83254ab2238fde7ae7afc83919fc10e1c5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dd9ea3870e18171f7360b6e71d0d34481fa8ad70","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        url \u003d wsgiref.util.application_uri(req.environ)"},{"line_number":232,"context_line":"        version \u003d None"},{"line_number":233,"context_line":"        vf \u003d api_version_request.VersionFactory()"},{"line_number":234,"context_line":"        controller \u003d importutils.import_class(\u0027keystone.common.controller\u0027)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        if isinstance(self, controller.V3Controller):"},{"line_number":237,"context_line":"            version \u003d vf.max_api_version"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_21352c47","line":234,"updated":"2017-07-31 17:58:26.000000000","message":"Is this working around a circular dependency issue? keystone.common.controller should be importing keystone.common.wsgi. Maybe that means the version stuff should be determined in keystone.common.controller and not keystone.common.wsgi:Application.","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"50fc4df9f6c92e5c8d376263ee41ccde84a855b4","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        url \u003d wsgiref.util.application_uri(req.environ)"},{"line_number":232,"context_line":"        version \u003d None"},{"line_number":233,"context_line":"        vf \u003d api_version_request.VersionFactory()"},{"line_number":234,"context_line":"        controller \u003d importutils.import_class(\u0027keystone.common.controller\u0027)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        if isinstance(self, controller.V3Controller):"},{"line_number":237,"context_line":"            version \u003d vf.max_api_version"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_e1da84e7","line":234,"in_reply_to":"df3967d1_21352c47","updated":"2017-07-31 18:26:28.000000000","message":"Yes from what I can tell it is for a circular dependency since controller imports wsgi. I just reused the code that I saw in _get_response_code().","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a150b2cb18caeb7e424b94cd15490ec37bd3dce3","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            version \u003d vf.max_api_version"},{"line_number":238,"context_line":"        elif isinstance(self, controller.V2Controller):"},{"line_number":239,"context_line":"            version \u003d vf.deprecated_api_version"},{"line_number":240,"context_line":"        elif url:"},{"line_number":241,"context_line":"            if \"v3\" in url:"},{"line_number":242,"context_line":"                version \u003d vf.max_api_version"},{"line_number":243,"context_line":"            elif \"v2.0\" in url:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_5b63811b","line":240,"updated":"2017-07-31 17:06:08.000000000","message":"We always have a URL in the request don\u0027t we? Can\u0027t we always assume the last case to work instead of inspecting the class and comparing it to the V2 and V3 controllers?","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cd9cc3947850dd30419c9034e863eb953b249188","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            version \u003d vf.max_api_version"},{"line_number":238,"context_line":"        elif isinstance(self, controller.V2Controller):"},{"line_number":239,"context_line":"            version \u003d vf.deprecated_api_version"},{"line_number":240,"context_line":"        elif url:"},{"line_number":241,"context_line":"            if \"v3\" in url:"},{"line_number":242,"context_line":"                version \u003d vf.max_api_version"},{"line_number":243,"context_line":"            elif \"v2.0\" in url:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_5e600fa6","line":240,"in_reply_to":"df3967d1_5b63811b","updated":"2017-07-31 17:07:29.000000000","message":"Actually - having a URL isn\u0027t the problem, it\u0027s possible that the url might not contain a version (kind of like what devstack does). So basing this on the controller might be for the best?\n\nI\u0027m playing with this locally to see what it looks like.","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"50fc4df9f6c92e5c8d376263ee41ccde84a855b4","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            version \u003d vf.max_api_version"},{"line_number":238,"context_line":"        elif isinstance(self, controller.V2Controller):"},{"line_number":239,"context_line":"            version \u003d vf.deprecated_api_version"},{"line_number":240,"context_line":"        elif url:"},{"line_number":241,"context_line":"            if \"v3\" in url:"},{"line_number":242,"context_line":"                version \u003d vf.max_api_version"},{"line_number":243,"context_line":"            elif \"v2.0\" in url:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_01a46856","line":240,"in_reply_to":"df3967d1_5e600fa6","updated":"2017-07-31 18:26:28.000000000","message":"Right we were doing this in case the url doesn\u0027t contain a version","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3a5fe44e82c6a02a04b97c1907734167d6b3e859","unresolved":false,"context_lines":[{"line_number":50,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"# Environment variable user to pass version requests"},{"line_number":53,"context_line":"OPENSTACK_API_VERSION \u003d \u0027OpenStack-API-Version\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# Environment variable used to pass the request context"},{"line_number":56,"context_line":"CONTEXT_ENV \u003d \u0027openstack.context\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_ddc7f895","line":53,"updated":"2017-08-03 14:06:17.000000000","message":"Let\u0027s call this API_VERSION_REQUEST_HEADER the way nova does. It\u0027s not a version itself, it\u0027s a string representing a header name.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e8dabf1f5f08bffb8ba4d4f1e46f5f91ecfcd407","unresolved":false,"context_lines":[{"line_number":50,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"# Environment variable user to pass version requests"},{"line_number":53,"context_line":"OPENSTACK_API_VERSION \u003d \u0027OpenStack-API-Version\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"# Environment variable used to pass the request context"},{"line_number":56,"context_line":"CONTEXT_ENV \u003d \u0027openstack.context\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_a953cc38","line":53,"in_reply_to":"df3967d1_ddc7f895","updated":"2017-08-03 18:34:11.000000000","message":"++","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc03c1097f7308a93b0f3c83f41dd96df5134513","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        version \u003d None"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        if \u0027v3\u0027 in url:"},{"line_number":235,"context_line":"            version \u003d api_version_request.VERSIONS[\u0027v3\u0027][\u0027version\u0027]"},{"line_number":236,"context_line":"        elif \u0027v2.0\u0027 in url:"},{"line_number":237,"context_line":"            version \u003d api_version_request.VERSIONS[\u0027v2.0\u0027][\u0027version\u0027]"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f436f4f_507138e0","line":235,"updated":"2017-08-08 16:11:21.000000000","message":"This doesn\u0027t feel very pythonic. The Application class is extended by the controller classes. It would make sense that the controllers (keystone.common.controller.V2Controller, keystone.common.controller.V3Controller) understand the versions they support and the Application (or controller class) simply sets the version based on properties defined in the controller. Or the version information can be pushed into the controller. The controller layers are still responsible for web-like functionality before passing control to the managers, so doing this there might not be a bad option if that makes more sense.\n\nYou can also ensure anything that inherits from or uses the common.controllers has the needed functionality.","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ffe2b54dec45dbe033c43c6d7e3da3ab4b03ad1","unresolved":false,"context_lines":[{"line_number":790,"context_line":""},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"def render_exception(error, context\u003dNone, request\u003dNone,"},{"line_number":793,"context_line":"                     user_locale\u003dNone, ex_version\u003dNone):"},{"line_number":794,"context_line":"    \"\"\"Form a WSGI response based on the current error.\"\"\""},{"line_number":795,"context_line":"    error_message \u003d error.args[0]"},{"line_number":796,"context_line":"    message \u003d oslo_i18n.translate(error_message, desired_locale\u003duser_locale)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f436f4f_113bbfd1","line":793,"range":{"start_line":793,"start_character":39,"end_line":793,"end_character":49},"updated":"2017-08-08 10:09:17.000000000","message":"Why not just call this \u0027version\u0027 for consistency?","commit_id":"0bf941bc293e77c3f08f8f228e18ffeaf6785264"}],"keystone/tests/unit/test_versions.py":[{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e8dabf1f5f08bffb8ba4d4f1e46f5f91ecfcd407","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        self.assertEqual(http_client.OK, resp.status_int)"},{"line_number":1064,"context_line":"        self.assertIn(\u0027X-Auth-Token\u0027, resp.headers.get(\u0027Vary\u0027))"},{"line_number":1065,"context_line":"        self.assertIn(\u0027OpenStack-API-Version\u0027, resp.headers.get(\u0027Vary\u0027))"},{"line_number":1066,"context_line":"        self.assertEqual(\u0027identity \u0027 + vf.deprecated_api_version,"},{"line_number":1067,"context_line":"                         resp.headers.get(\u0027OpenStack-API-Version\u0027))"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    def test_v3_version_headers(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_fcaf54e0","line":1066,"range":{"start_line":1066,"start_character":39,"end_line":1066,"end_character":64},"updated":"2017-08-03 18:34:11.000000000","message":"Why use the factory and method at all? This is always going to be 2.0. Assuming 3 becomes deprecated in the future, this test is going to fail and have to be updated.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"14c014d98e10e4bfd991224010f5c876f9f4fe0b","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        self.assertEqual(http_client.OK, resp.status_int)"},{"line_number":1064,"context_line":"        self.assertIn(\u0027X-Auth-Token\u0027, resp.headers.get(\u0027Vary\u0027))"},{"line_number":1065,"context_line":"        self.assertIn(\u0027OpenStack-API-Version\u0027, resp.headers.get(\u0027Vary\u0027))"},{"line_number":1066,"context_line":"        self.assertEqual(\u0027identity \u0027 + vf.deprecated_api_version,"},{"line_number":1067,"context_line":"                         resp.headers.get(\u0027OpenStack-API-Version\u0027))"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    def test_v3_version_headers(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_ff0e2639","line":1066,"range":{"start_line":1066,"start_character":39,"end_line":1066,"end_character":64},"in_reply_to":"df3967d1_fcaf54e0","updated":"2017-08-03 19:50:20.000000000","message":"Good point really I should have used vf to define the URL as well as the point of the test is really not to test v2 or v3 headers vs sending the headers for the deprecated or max and getting the right versions back.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"}],"keystone/tests/unit/test_wsgi.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dd9ea3870e18171f7360b6e71d0d34481fa8ad70","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        self.assertEqual(\u0027Some-Value\u0027, resp.headers.get(\u0027Custom-Header\u0027))"},{"line_number":161,"context_line":"        self.assertEqual(\u0027X-Auth-Token\u0027, resp.headers.get(\u0027Vary\u0027))"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def test_render_response_max_version_headers(self):"},{"line_number":164,"context_line":"        vf \u003d api_version_request.VersionFactory()"},{"line_number":165,"context_line":"        version \u003d vf.max_api_version"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_41527015","line":163,"updated":"2017-07-31 17:58:26.000000000","message":"We have a dedicated module to testing versions in keystone/tests/unit/test_versions.py","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"}],"keystone/version/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        versions \u003d {}"},{"line_number":120,"context_line":"        if \u0027v2.0\u0027 in _VERSIONS:"},{"line_number":121,"context_line":"            versions[\u0027v2.0\u0027] \u003d {"},{"line_number":122,"context_line":"                \u0027id\u0027: \u0027v\u0027 + api_version_request.depricated_api_version2()[0],"},{"line_number":123,"context_line":"                \u0027status\u0027: api_version_request.depricated_api_version2()[1],"},{"line_number":124,"context_line":"                \u0027updated\u0027: api_version_request.depricated_api_version2()[2],"},{"line_number":125,"context_line":"                \u0027links\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_ffc96525","line":122,"updated":"2017-06-16 18:01:46.000000000","message":"Instead of using indexes, it would make the code easier to read if these were attributes.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"cba39c696cfd17e2f5510011abfd97de6ecb3a09","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        versions \u003d {}"},{"line_number":120,"context_line":"        if \u0027v2.0\u0027 in _VERSIONS:"},{"line_number":121,"context_line":"            versions[\u0027v2.0\u0027] \u003d {"},{"line_number":122,"context_line":"                \u0027id\u0027: \u0027v\u0027 + api_version_request.depricated_api_version2()[0],"},{"line_number":123,"context_line":"                \u0027status\u0027: api_version_request.depricated_api_version2()[1],"},{"line_number":124,"context_line":"                \u0027updated\u0027: api_version_request.depricated_api_version2()[2],"},{"line_number":125,"context_line":"                \u0027links\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_6bdfd368","line":122,"in_reply_to":"7f231b9d_ffc96525","updated":"2017-06-16 20:30:31.000000000","message":"++","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"15a77a2c53b4633d8bc7bd31e9ad8aa00d57f1ba","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if \u0027v3\u0027 in _VERSIONS:"},{"line_number":144,"context_line":"            versions[\u0027v3\u0027] \u003d {"},{"line_number":145,"context_line":"                \u0027id\u0027: \u0027v\u0027 + api_version_request.max_api_version()[0],"},{"line_number":146,"context_line":"                \u0027status\u0027: api_version_request.max_api_version()[1],"},{"line_number":147,"context_line":"                \u0027updated\u0027: api_version_request.max_api_version()[2],"},{"line_number":148,"context_line":"                \u0027links\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"7f231b9d_5f017937","line":145,"updated":"2017-06-16 18:01:46.000000000","message":"Same comment here.","commit_id":"c864bcc1ce405147604eccc6332e31044c3e80cf"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b4c6e95883dae1de5571e5a5ed8e060fca1a860b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if \u0027v2.0\u0027 in _VERSIONS:"},{"line_number":121,"context_line":"            versions[\u0027v2.0\u0027] \u003d {"},{"line_number":122,"context_line":"                \u0027id\u0027: \u0027v\u0027 + api_version_request."},{"line_number":123,"context_line":"                depricated_api_version2()[\u0027version\u0027],"},{"line_number":124,"context_line":"                \u0027status\u0027: api_version_request."},{"line_number":125,"context_line":"                depricated_api_version2()[\u0027status\u0027],"},{"line_number":126,"context_line":"                \u0027updated\u0027: api_version_request."}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_29d9a782","line":123,"range":{"start_line":123,"start_character":16,"end_line":123,"end_character":39},"updated":"2017-06-20 23:35:11.000000000","message":"deprecated","commit_id":"44d128005b757af831c0675156052a7788fcd462"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b4c6e95883dae1de5571e5a5ed8e060fca1a860b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                \u0027id\u0027: \u0027v\u0027 + api_version_request."},{"line_number":123,"context_line":"                depricated_api_version2()[\u0027version\u0027],"},{"line_number":124,"context_line":"                \u0027status\u0027: api_version_request."},{"line_number":125,"context_line":"                depricated_api_version2()[\u0027status\u0027],"},{"line_number":126,"context_line":"                \u0027updated\u0027: api_version_request."},{"line_number":127,"context_line":"                depricated_api_version2()[\u0027updated\u0027],"},{"line_number":128,"context_line":"                \u0027links\u0027: ["}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_e9e28f2f","line":125,"range":{"start_line":125,"start_character":16,"end_line":125,"end_character":39},"updated":"2017-06-20 23:35:11.000000000","message":"ditto","commit_id":"44d128005b757af831c0675156052a7788fcd462"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b4c6e95883dae1de5571e5a5ed8e060fca1a860b","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                \u0027status\u0027: api_version_request."},{"line_number":125,"context_line":"                depricated_api_version2()[\u0027status\u0027],"},{"line_number":126,"context_line":"                \u0027updated\u0027: api_version_request."},{"line_number":127,"context_line":"                depricated_api_version2()[\u0027updated\u0027],"},{"line_number":128,"context_line":"                \u0027links\u0027: ["},{"line_number":129,"context_line":"                    {"},{"line_number":130,"context_line":"                        \u0027rel\u0027: \u0027self\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_69d0bf51","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":39},"updated":"2017-06-20 23:35:11.000000000","message":"ditto","commit_id":"44d128005b757af831c0675156052a7788fcd462"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a150b2cb18caeb7e424b94cd15490ec37bd3dce3","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        \u0027rel\u0027: \u0027describedby\u0027,"},{"line_number":132,"context_line":"                        \u0027type\u0027: \u0027text/html\u0027,"},{"line_number":133,"context_line":"                        \u0027href\u0027: \u0027https://docs.openstack.org/\u0027"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                    }"},{"line_number":136,"context_line":"                ],"},{"line_number":137,"context_line":"                \u0027media-types\u0027: ["}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_9b80c98d","line":134,"updated":"2017-07-31 17:06:08.000000000","message":"Unrelated whitespace change.","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"fb407beeae88422a4b44b65eb3f1590a7bf09989","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                        \u0027rel\u0027: \u0027describedby\u0027,"},{"line_number":132,"context_line":"                        \u0027type\u0027: \u0027text/html\u0027,"},{"line_number":133,"context_line":"                        \u0027href\u0027: \u0027https://docs.openstack.org/\u0027"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"                    }"},{"line_number":136,"context_line":"                ],"},{"line_number":137,"context_line":"                \u0027media-types\u0027: ["}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_3c818e90","line":134,"in_reply_to":"df3967d1_9b80c98d","updated":"2017-08-02 14:41:51.000000000","message":"Done","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a150b2cb18caeb7e424b94cd15490ec37bd3dce3","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            return wsgi.render_response(body\u003d{"},{"line_number":189,"context_line":"                \u0027version\u0027: versions[\u0027v2.0\u0027]},"},{"line_number":190,"context_line":"                # get the version and strip the \u0027v\u0027 in front"},{"line_number":191,"context_line":"                version\u003dversions[\u0027v2.0\u0027][\u0027id\u0027][1:]"},{"line_number":192,"context_line":"            )"},{"line_number":193,"context_line":"        else:"},{"line_number":194,"context_line":"            raise exception.VersionNotFound(version\u003d\u0027v2.0\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_9b59e95b","line":191,"updated":"2017-07-31 17:06:08.000000000","message":"Hmm - I feel the complexity of this statement should encourage us to make the VersionFactory smarter.","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":23674,"name":"Rohan Arora","email":"ra271w@att.com","username":"rarora"},"change_message_id":"a45a2e1fc36368b51ad1f98c7e937146ca33f184","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            return wsgi.render_response(body\u003d{"},{"line_number":189,"context_line":"                \u0027version\u0027: versions[\u0027v2.0\u0027]},"},{"line_number":190,"context_line":"                # get the version and strip the \u0027v\u0027 in front"},{"line_number":191,"context_line":"                version\u003dversions[\u0027v2.0\u0027][\u0027id\u0027][1:]"},{"line_number":192,"context_line":"            )"},{"line_number":193,"context_line":"        else:"},{"line_number":194,"context_line":"            raise exception.VersionNotFound(version\u003d\u0027v2.0\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_43700fdd","line":191,"in_reply_to":"df3967d1_9b59e95b","updated":"2017-08-01 18:42:18.000000000","message":"This actually just has to do with the formatting from get_versions_list(). I was using the versions dict it returns since we already have it but I could create a version factory and get the version like that as well if you think that\u0027s better.","commit_id":"5c56dd7f05accb7862ff0ea0e1f41f9d3420f409"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e8dabf1f5f08bffb8ba4d4f1e46f5f91ecfcd407","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    def _get_versions_list(self, context):"},{"line_number":118,"context_line":"        \"\"\"The list of versions is dependent on the context.\"\"\""},{"line_number":119,"context_line":"        versions \u003d {}"},{"line_number":120,"context_line":"        vf \u003d api_version_request.VersionFactory()"},{"line_number":121,"context_line":"        if \u0027v2.0\u0027 in _VERSIONS:"},{"line_number":122,"context_line":"            versions[\u0027v2.0\u0027] \u003d {"},{"line_number":123,"context_line":"                \u0027id\u0027: \u0027v\u0027 + vf.deprecated_api_version,"},{"line_number":124,"context_line":"                \u0027status\u0027: vf.stability(vf.deprecated_api_version),"},{"line_number":125,"context_line":"                \u0027updated\u0027: vf.last_updated(vf.deprecated_api_version),"},{"line_number":126,"context_line":"                \u0027links\u0027: ["},{"line_number":127,"context_line":"                    {"},{"line_number":128,"context_line":"                        \u0027rel\u0027: \u0027self\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"df3967d1_bca9cc7c","line":125,"range":{"start_line":120,"start_character":8,"end_line":125,"end_character":70},"updated":"2017-08-03 18:34:11.000000000","message":"comments in api_version_request apply. Please access stuff from there via v2.0 as a key rather than deprecated_version.","commit_id":"e4342171921be823d9aa7d01819d3a1ff447fedd"}]}
