)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bf20fe1cf92bc0af18f600bd4a092eb8385f3785","unresolved":false,"context_lines":[{"line_number":22,"context_line":"v1.1, but does not actually change the behavior of the client."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Without this fix, the client fails to connect to any server version"},{"line_number":25,"context_line":"betweenr commit 41595327cf18 (when v1.1 was introduced) and commit"},{"line_number":26,"context_line":"6ecee36865 (when v1.6 was introduced)."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: Iab6a0814f0db6dd6e7bfc00da28baf8403a6b1db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9aa53dc9_96a015a1","line":25,"updated":"2015-04-07 21:51:39.000000000","message":"s/betweenr/between/","commit_id":"fead1ff673bdded284877a62f0dae388ecfafe23"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"1ed6cb776777deeb49361c02803fc1817ca00d1f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"v1.1, but does not actually change the behavior of the client."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Without this fix, the client fails to connect to any server version"},{"line_number":25,"context_line":"betweenr commit 41595327cf18 (when v1.1 was introduced) and commit"},{"line_number":26,"context_line":"6ecee36865 (when v1.6 was introduced)."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: Iab6a0814f0db6dd6e7bfc00da28baf8403a6b1db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9aa53dc9_b2f67cf7","line":25,"updated":"2015-04-08 05:56:41.000000000","message":"typo s/betweenr/between/","commit_id":"06dd47b266c4829fd6e4faa2ecf924b2cdf67a08"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"a4530bea4e32fba5a6b55bc656f626861d8fc0ba","unresolved":false,"context_lines":[{"line_number":12,"context_line":"API version with the server."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If there is no mutually supported version, or if the user specified a"},{"line_number":15,"context_line":"version in which the requested feature is unavailble, the client should"},{"line_number":16,"context_line":"raise an error."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"This patch is a partial implementation of the client side of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9aa53dc9_24a9e5df","line":15,"updated":"2015-04-08 21:01:32.000000000","message":"s/unavailble/unavailable/","commit_id":"fb53190b70aae588894fe872ca69eff6641b7497"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"a4530bea4e32fba5a6b55bc656f626861d8fc0ba","unresolved":false,"context_lines":[{"line_number":31,"context_line":"To work around this, when the client receives a 406 response that does"},{"line_number":32,"context_line":"not contain any version header, the client performs an extra GET request"},{"line_number":33,"context_line":"to the root /v1/ URL to retrieve the supported versions. This allows the"},{"line_number":34,"context_line":"client to work with API services that might be running unlreleased"},{"line_number":35,"context_line":"mid-kilo code as well as both stable/juno and the latest kilo code."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Change-Id: Iab6a0814f0db6dd6e7bfc00da28baf8403a6b1db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9aa53dc9_446f49c5","line":34,"updated":"2015-04-08 21:01:32.000000000","message":"s/unlreleased/unreleased/","commit_id":"fb53190b70aae588894fe872ca69eff6641b7497"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"client to work with API services that might be running unreleased"},{"line_number":35,"context_line":"mid-kilo code as well as both stable/juno and the latest kilo code."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Co-Authored-By: Dmitry Tantsur \u003cdtantsur@redhat.com\u003e"},{"line_number":38,"context_line":"Change-Id: Iab6a0814f0db6dd6e7bfc00da28baf8403a6b1db"},{"line_number":39,"context_line":"Blueprint: api-microversions"},{"line_number":40,"context_line":"Partial-bug: #1441170"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9aa53dc9_be238c57","line":37,"updated":"2015-04-10 01:59:50.000000000","message":"John, you might want to add your name here too.","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"0a820f17e38fe02206ce74e98d05a20814723291","unresolved":false,"context_lines":[{"line_number":10,"context_line":"older versions of the server. If the user did not request a specific"},{"line_number":11,"context_line":"version, the client should negotiate (fall back to) a mutually supported"},{"line_number":12,"context_line":"API version with the server."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If there is no mutually supported version, or if the user specified a"},{"line_number":15,"context_line":"version in which the requested feature is unavailable, the client should"},{"line_number":16,"context_line":"raise an error."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7aaa499b_4477c202","line":13,"updated":"2015-04-10 17:03:51.000000000","message":"Note, food for thought:\n\nIronic doesn\u0027t return 406 only when the version is lower. Sometimes it\u0027s the other way around, a request coming from a lower version will return 406 when it\u0027s needed a higher version.\n\nFor e.g setting a node name in Ironic, if the request comes from version 1.1 which is not supported api will return 406.\n\nstack@ubuntu-virtual-machine:~/devstack$ ironic --ironic-api-version 1.1 node-update 1b9b716a-0a2e-4c67-a5d2-b1771b1d828a add name\u003dtest\nRequest not acceptable. (HTTP 406)\n\nSo in case the user has a old version we should \"fall forward\". (I passed --ironic-api-version in the cli there to simulate an old version)\n\nI consider that a bug, I think it should return 400 (Bad request) because the name field wasn\u0027t supported on old versions. That\u0027s what I was trying to point out in the logical name patches.","commit_id":"631ab603d46d0f64ddb8f37572c2a303c0c4d54a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"46f1cfb2f2f9103894f575383656722e56a98ebf","unresolved":false,"context_lines":[{"line_number":10,"context_line":"older versions of the server. If the user did not request a specific"},{"line_number":11,"context_line":"version, the client should negotiate (fall back to) a mutually supported"},{"line_number":12,"context_line":"API version with the server."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"If there is no mutually supported version, or if the user specified a"},{"line_number":15,"context_line":"version in which the requested feature is unavailable, the client should"},{"line_number":16,"context_line":"raise an error."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7aaa499b_900efa32","line":13,"in_reply_to":"7aaa499b_4477c202","updated":"2015-04-13 15:27:23.000000000","message":"Lucas and Deva discussed this on IRC [1] and decided that it wasn\u0027t a bug that ironic was returning 400 in this case; it should be returning 406. So no follow up is needed here.\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2015-04-13.log, starting around 2015-04-13T15:09:07.","commit_id":"631ab603d46d0f64ddb8f37572c2a303c0c4d54a"}],"ironicclient/common/http.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bf20fe1cf92bc0af18f600bd4a092eb8385f3785","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":172,"context_line":"                            \"Requested version %s is not supported by the server.\""},{"line_number":173,"context_line":"                            % self.os_ironic_api_version)"},{"line_number":174,"context_line":"                    raise exc.UnsupportedVersion(\"message\")"},{"line_number":175,"context_line":"                self.os_ironic_api_version \u003d 1.1"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"            if resp.status \u003d\u003d 406:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa53dc9_f612c108","line":174,"updated":"2015-04-07 21:51:39.000000000","message":"Won\u0027t get here","commit_id":"fead1ff673bdded284877a62f0dae388ecfafe23"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bf20fe1cf92bc0af18f600bd4a092eb8385f3785","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                    LOG.warn(\"User requested version %s, but server supports \""},{"line_number":184,"context_line":"                             \"versions between %s and %s.\" % ("},{"line_number":185,"context_line":"                                 self.os_ironic_api_version,"},{"line_number":186,"context_line":"                                 resp.getheader(\u0027X-OpenStack-Ironic-API-Mimimum-Version\u0027),  # noqa"},{"line_number":187,"context_line":"                                 resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027))) # noqa"},{"line_number":188,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":189,"context_line":"                            \"Requested version %s is not supported by the server.\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa53dc9_d6a45da7","line":186,"updated":"2015-04-07 21:51:39.000000000","message":"s/Mimimum-Version/Minimum-Version/","commit_id":"fead1ff673bdded284877a62f0dae388ecfafe23"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"bf20fe1cf92bc0af18f600bd4a092eb8385f3785","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":189,"context_line":"                            \"Requested version %s is not supported by the server.\""},{"line_number":190,"context_line":"                            % self.os_ironic_api_version)"},{"line_number":191,"context_line":"                # let\u0027s negotiate, and default to 1.1 for now"},{"line_number":192,"context_line":"                self.os_ironic_api_version \u003d resp.getheader("},{"line_number":193,"context_line":"                    \u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, \u00271.1\u0027)"},{"line_number":194,"context_line":"                kwargs[\u0027headers\u0027][\u0027X-OpenStack-Ironic-API-Version\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa53dc9_56904d43","line":191,"updated":"2015-04-07 21:51:39.000000000","message":"Should it check the Minimum version supported by the server?  What if that is greater than 1.1?","commit_id":"fead1ff673bdded284877a62f0dae388ecfafe23"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"1ed6cb776777deeb49361c02803fc1817ca00d1f","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                        \"server.\" % self.os_ironic_api_version)"},{"line_number":191,"context_line":"                # let\u0027s negotiate, and default to 1.1 for now"},{"line_number":192,"context_line":"                self.os_ironic_api_version \u003d resp.getheader("},{"line_number":193,"context_line":"                    \u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, \u00271.1\u0027)"},{"line_number":194,"context_line":"                kwargs[\u0027headers\u0027][\u0027X-OpenStack-Ironic-API-Version\u0027] \u003d ("},{"line_number":195,"context_line":"                        self.os_ironic_api_version)"},{"line_number":196,"context_line":"                conn.request(method, conn_url, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_3dc91d79","line":193,"updated":"2015-04-08 05:56:41.000000000","message":"I know this is the default position for now, but should we try for the following?\n\nmax_server_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027) \nnegotiated_ver \u003d min(ironicclient.v1.client.DEFAULT_VER, max_server_ver)\nif negotiated_ver \u003c resp.getheader(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027):\n    negoatiated_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027)\nself.os_ironic_api_version \u003d negotiated_ver\n\nThat way we get the highest supported version that both the client and server supports.  Thoughts?","commit_id":"06dd47b266c4829fd6e4faa2ecf924b2cdf67a08"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"7fc10d40e256ee7e93bee465bd3b2eb95a2f6fba","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                        \"server.\" % self.os_ironic_api_version)"},{"line_number":191,"context_line":"                # let\u0027s negotiate, and default to 1.1 for now"},{"line_number":192,"context_line":"                self.os_ironic_api_version \u003d resp.getheader("},{"line_number":193,"context_line":"                    \u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, \u00271.1\u0027)"},{"line_number":194,"context_line":"                kwargs[\u0027headers\u0027][\u0027X-OpenStack-Ironic-API-Version\u0027] \u003d ("},{"line_number":195,"context_line":"                        self.os_ironic_api_version)"},{"line_number":196,"context_line":"                conn.request(method, conn_url, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_b232e50e","line":193,"updated":"2015-04-08 15:10:13.000000000","message":"Works for me","commit_id":"06dd47b266c4829fd6e4faa2ecf924b2cdf67a08"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"1ed6cb776777deeb49361c02803fc1817ca00d1f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                self.os_ironic_api_version \u003d resp.getheader("},{"line_number":193,"context_line":"                    \u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, \u00271.1\u0027)"},{"line_number":194,"context_line":"                kwargs[\u0027headers\u0027][\u0027X-OpenStack-Ironic-API-Version\u0027] \u003d ("},{"line_number":195,"context_line":"                        self.os_ironic_api_version)"},{"line_number":196,"context_line":"                conn.request(method, conn_url, **kwargs)"},{"line_number":197,"context_line":"                resp \u003d conn.getresponse()"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aa53dc9_d241000d","line":195,"updated":"2015-04-08 05:56:41.000000000","message":"pep8 failure here, over indention","commit_id":"06dd47b266c4829fd6e4faa2ecf924b2cdf67a08"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"167ecf9e700cc00a55b394320c95178b7dec295b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def _negotiate_supported_version(self, resp):"},{"line_number":143,"context_line":"        # TODO(deva): This should actually change the client behavior in a"},{"line_number":144,"context_line":"        #             meaningful way (eg, change output columns)."},{"line_number":145,"context_line":"        min_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Mimimum-Version\u0027, None)  # noqa"},{"line_number":146,"context_line":"        max_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, None)  # noqa"},{"line_number":147,"context_line":"        negotiated_ver \u003d min(self.os_ironic_api_version, max_ver)"},{"line_number":148,"context_line":"        if negotiated_ver \u003c min_ver:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_ebff58a8","line":145,"updated":"2015-04-08 15:52:23.000000000","message":"Minimum is misspelled\n\ns/Mimimum/Minimum/","commit_id":"f20b992021f898a58ef035cc164bc64a12a6614e"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"356934213e295d79b88dfd7dbc08f238e43a28dd","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def _negotiate_supported_version(self, resp):"},{"line_number":143,"context_line":"        # TODO(deva): This should actually change the client behavior in a"},{"line_number":144,"context_line":"        #             meaningful way (eg, change output columns)."},{"line_number":145,"context_line":"        min_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Mimimum-Version\u0027, None)  # noqa"},{"line_number":146,"context_line":"        max_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, None)  # noqa"},{"line_number":147,"context_line":"        negotiated_ver \u003d min(self.os_ironic_api_version, max_ver)"},{"line_number":148,"context_line":"        if negotiated_ver \u003c min_ver:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_4e9d2d58","line":145,"updated":"2015-04-08 17:48:36.000000000","message":"doh!","commit_id":"f20b992021f898a58ef035cc164bc64a12a6614e"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"202273d5f448bbcc0ea43c9289efb6e684f707f5","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                    LOG.warn(\"Server does not support microversions\")"},{"line_number":187,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":188,"context_line":"                        \"Requested version %s is not supported by the \""},{"line_number":189,"context_line":"                        \"server.\" % self.os_ironic_api_version)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if resp.status \u003d\u003d 406:"},{"line_number":192,"context_line":"                # server handles microversions, but doesn\u0027t support"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_39ceb1b4","line":189,"updated":"2015-04-08 18:07:07.000000000","message":"So I tested this, and think it\u0027s less of a problem than you\u0027re suggesting.\n\nEg, if I pass a new option (like --config-drive) and talk to an older version of the server whch doesn\u0027t support it, that server raises the appropriate error. Ditto if I try to set a node name, while connected to a stable/juno server: the server returns a 400 error, not a 406.","commit_id":"f20b992021f898a58ef035cc164bc64a12a6614e"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"356934213e295d79b88dfd7dbc08f238e43a28dd","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                    LOG.warn(\"Server does not support microversions\")"},{"line_number":187,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":188,"context_line":"                        \"Requested version %s is not supported by the \""},{"line_number":189,"context_line":"                        \"server.\" % self.os_ironic_api_version)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if resp.status \u003d\u003d 406:"},{"line_number":192,"context_line":"                # server handles microversions, but doesn\u0027t support"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_2ea549a1","line":189,"updated":"2015-04-08 17:48:36.000000000","message":"indeed... just not sure how to do that yet ... i\u0027ll see what i can rewrite to make it so","commit_id":"f20b992021f898a58ef035cc164bc64a12a6614e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"109ced2df79f00fc0f34b85d89df1474c8cbaa2a","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                    LOG.warn(\"Server does not support microversions\")"},{"line_number":187,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":188,"context_line":"                        \"Requested version %s is not supported by the \""},{"line_number":189,"context_line":"                        \"server.\" % self.os_ironic_api_version)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if resp.status \u003d\u003d 406:"},{"line_number":192,"context_line":"                # server handles microversions, but doesn\u0027t support"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa53dc9_262217ba","line":189,"updated":"2015-04-08 16:17:50.000000000","message":"let\u0027s do this check before we try to fulfil the request, otherwise we might end up with reporting failure while the server actually did something.","commit_id":"f20b992021f898a58ef035cc164bc64a12a6614e"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"83ded73161362f0a8d25d4685e9b01ba695dee3e","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            min_ver \u003d new_resp.getheader(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027, None)  # noqa"},{"line_number":156,"context_line":"            max_ver \u003d new_resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027, None)  # noqa"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        # TODO(deva): cache the negotiated version for this server"},{"line_number":159,"context_line":"        negotiated_ver \u003d min(self.os_ironic_api_version, max_ver)"},{"line_number":160,"context_line":"        if negotiated_ver \u003c min_ver:"},{"line_number":161,"context_line":"            negotiated_ver \u003d min_ver"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_73968df1","line":158,"updated":"2015-04-09 00:24:07.000000000","message":"I\u0027ll push up a subsequent patch for caching the negotiated version (was already working on it)","commit_id":"c75ffcfc4e1a37466a1a8425a8b951b0a8bc76aa"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"ff15cc7858fe2fe6592e1c4653f3e3b6b0593b48","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":207,"context_line":"                        \"Requested API version %s is not supported by the \""},{"line_number":208,"context_line":"                        \"server or the requested operation is not supported \""},{"line_number":209,"context_line":"                        \"by any mutually compatible version.\""},{"line_number":210,"context_line":"                        % self.os_ironic_api_version)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        except socket.gaierror as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_84f0a468","line":209,"updated":"2015-04-09 07:55:15.000000000","message":"While I totally agree, that\u0027s not easy to know.\n\nFor example, what if I issue the following request:\n  ironic node-set-provision-state NNNN manage\n\nIt\u0027s going to error if sent to a server that doesn\u0027t support MANAGED state. But that server doesn\u0027t know what version will support this. We could add those smarts to the client, sure. But what if I then try this:\n  ironic --ironic-api-version 1.2 node-set-provision-state NNNN manage\n\nNow any server is going to error -- even ones that do support MANAGED state -- because that feature is guarded by version 1.3. So again, we could add this awareness to the client.\n\nThese are all possible and good things. But we need /something/ now to fix the fact that the current client simply fails to talk to any server prior to v1.6 ....","commit_id":"c75ffcfc4e1a37466a1a8425a8b951b0a8bc76aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1a6972b88bdc4e52f548b521e235f7758fba3428","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                    raise exc.UnsupportedVersion("},{"line_number":207,"context_line":"                        \"Requested API version %s is not supported by the \""},{"line_number":208,"context_line":"                        \"server or the requested operation is not supported \""},{"line_number":209,"context_line":"                        \"by any mutually compatible version.\""},{"line_number":210,"context_line":"                        % self.os_ironic_api_version)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        except socket.gaierror as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_a9714146","line":209,"updated":"2015-04-09 07:33:54.000000000","message":"it would be really nice to state actually supported versions","commit_id":"c75ffcfc4e1a37466a1a8425a8b951b0a8bc76aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"1a6972b88bdc4e52f548b521e235f7758fba3428","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        endpoint_filter.setdefault(\u0027service_type\u0027, self.service_type)"},{"line_number":356,"context_line":"        endpoint_filter.setdefault(\u0027region_name\u0027, self.region_name)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        resp \u003d self.session.request(url, method,"},{"line_number":359,"context_line":"                                    raise_exc\u003dFalse, **kwargs)"},{"line_number":360,"context_line":"        if 400 \u003c\u003d resp.status_code \u003c 600:"},{"line_number":361,"context_line":"            error_json \u003d _extract_error_json(resp.content)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_a9014108","line":358,"updated":"2015-04-09 07:33:54.000000000","message":"this place should be updated too. otherwise I still get:\n\n $ env/bin/ironic --ironic-api-version 1.7 node-list\n Not Acceptable (HTTP 406)","commit_id":"c75ffcfc4e1a37466a1a8425a8b951b0a8bc76aa"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"b39fde3c09909ba6abb1cfff2052deee51b9bd48","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                                str(self.os_ironic_api_version).split(\u0027.\u0027)[0])"},{"line_number":69,"context_line":"            else:"},{"line_number":70,"context_line":"                base_version \u003d API_VERSION"},{"line_number":71,"context_line":"            resp \u003d self._make_simple_request(conn, \u0027GET\u0027, base_version)"},{"line_number":72,"context_line":"            min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # TODO(deva): cache the negotiated version for this server"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_c0431812","line":71,"updated":"2015-04-09 20:33:13.000000000","message":"Can this return no version?  Thus returning None, None\n\nIf so under Python 34 the next line will fail.","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"2bbd7ec072aa0708aec0824cc1e22b2e858ff817","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                                str(self.os_ironic_api_version).split(\u0027.\u0027)[0])"},{"line_number":69,"context_line":"            else:"},{"line_number":70,"context_line":"                base_version \u003d API_VERSION"},{"line_number":71,"context_line":"            resp \u003d self._make_simple_request(conn, \u0027GET\u0027, base_version)"},{"line_number":72,"context_line":"            min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        # TODO(deva): cache the negotiated version for this server"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_f74edf6d","line":71,"in_reply_to":"9aa53dc9_c0431812","updated":"2015-04-09 21:33:50.000000000","message":"I think we\u0027re good here. It looks like this commit introduced the version header in a GET /v1 request (maybe someone should verify, I just skimmed it), AND the http 406 status. SInce this method only gets called if we got a 406, the GET request will have the headers.\n\nI34bf7fa1b21580337c18206798dd8e9dfe11ba09","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a7bdca32a94a0c3bcbe75d27c4e1d9a7a3f8cb81","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        LOG.debug(\u0027Negotiated API version is %s\u0027, negotiated_ver)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if (not self.implicit_api_version and self.os_ironic_api_version and"},{"line_number":81,"context_line":"                negotiated_ver !\u003d self.os_ironic_api_version):"},{"line_number":82,"context_line":"            # NOTE: error because the user requested a version that"},{"line_number":83,"context_line":"            # this server doesn\u0027t support"},{"line_number":84,"context_line":"            raise exc.UnsupportedVersion("}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_007b408d","line":81,"updated":"2015-04-09 20:57:50.000000000","message":"It seems that if a user explicitly specified a version, we don\u0027t want to reissue the request using another version. But we would like to get the server\u0027s min/max versions, so that we could inform the user of the acceptable range.\n\nIn which case -- it might make sense to do this check after getting min/max. I don\u0027t see what the negotiated_ver has to do with this check.  Eg, let\u0027s say a 406 occurred and os_ironic_api_version was 1.6 and self.implcit_api_version was False (cuz the user specified that version). When we get here, the min/max from the server is 1.1/1.8. negotiated_ver will be 1.6, this if won\u0027t be true, and the negotiated_ver will be returned. Is that what we want?\n\nOk, I just tested it. This doesn\u0027t work. It will probably work w/o the \"negotiated_ver !\u003d self.os_ironic_api_version\" part.\n\nI tried \u0027ironic --debug --ironic-api-version 1.4 node-create -d fake_ipmitool -n node-name\u0027 and it loops forever issuing\n\ncurl -i -X POST -H \u0027X-OpenStack-Ironic-API-Version: 1.4\u0027 -H \u0027User-Agent: python-ironicclient\u0027 -H \u0027Content-Type: application/json\u0027 -H \u0027Accept: application/json\u0027 -H \u0027X-Auth-Token: fake-token\u0027 -d \u0027{\"driver\": \"fake_ipmitool\", \"name\": \"node-name\"}\u0027 http://localhost:6385/v1/nodes","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"92b9886721e546b6cd98584c85e30be4e687184b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        LOG.debug(\u0027Negotiated API version is %s\u0027, negotiated_ver)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        if (not self.implicit_api_version and self.os_ironic_api_version and"},{"line_number":81,"context_line":"                negotiated_ver !\u003d self.os_ironic_api_version):"},{"line_number":82,"context_line":"            # NOTE: error because the user requested a version that"},{"line_number":83,"context_line":"            # this server doesn\u0027t support"},{"line_number":84,"context_line":"            raise exc.UnsupportedVersion("}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_f406ddcc","line":81,"in_reply_to":"9aa53dc9_007b408d","updated":"2015-04-09 21:08:00.000000000","message":"I deleted line 81 from the if, and now it works. Although I wonder if we can improve on the error message.\n\nironic --debug --ironic-api-version 1.4 node-create -d fake_ipmitool -n node-name\nDEBUG (http:161) curl -i -X POST -H \u0027X-OpenStack-Ironic-API-Version: 1.4\u0027 -H \u0027X-Auth-Token: fake-token\u0027 -H \u0027Content-Type: application/json\u0027 -H \u0027Accept: application/json\u0027 -H \u0027User-Agent: python-ironicclient\u0027 -d \u0027{\"driver\": \"fake_ipmitool\", \"name\": \"node-name\"}\u0027 http://localhost:6385/v1/nodes\nDEBUG (http:78) Negotiated API version is 1.4\nRequested API version 1.4 is not supported by the server or the requested operation is not supported by any mutually compatible version. Supported version range is 1.1 to 1.6","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"46938972ec8ab541c8ecf237bca7d6e30a1c46d9","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        base_url \u003d _args[2]"},{"line_number":177,"context_line":"        return \u0027%s/%s\u0027 % (base_url, url.lstrip(\u0027/\u0027))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _parse_version_headers(self, resp):"},{"line_number":180,"context_line":"        min_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027,"},{"line_number":181,"context_line":"                                 None)"},{"line_number":182,"context_line":"        max_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_1eb84a29","line":179,"updated":"2015-04-09 16:01:14.000000000","message":"Should this get moved into the VersionNegotiationMixin class?\n\nSeems like these two functions are duplicated.","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"92b9886721e546b6cd98584c85e30be4e687184b","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        base_url \u003d _args[2]"},{"line_number":177,"context_line":"        return \u0027%s/%s\u0027 % (base_url, url.lstrip(\u0027/\u0027))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _parse_version_headers(self, resp):"},{"line_number":180,"context_line":"        min_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027,"},{"line_number":181,"context_line":"                                 None)"},{"line_number":182,"context_line":"        max_ver \u003d resp.getheader(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_54f8e9c2","line":179,"in_reply_to":"9aa53dc9_1eb84a29","updated":"2015-04-09 21:08:00.000000000","message":"They\u0027re actually a bit different in how the get the headers.","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a7bdca32a94a0c3bcbe75d27c4e1d9a7a3f8cb81","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            # http://specs.openstack.org/openstack/ironic-specs/specs/kilo/api-microversions.html#use-case-3b-new-client-communicating-with-a-old-ironic-user-specified  # noqa"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            if resp.status \u003d\u003d 406:"},{"line_number":218,"context_line":"                negotiated_ver \u003d self.negotiate_version(conn, resp)"},{"line_number":219,"context_line":"                # server handles microversions, but doesn\u0027t support"},{"line_number":220,"context_line":"                # the requested version, so try a negotiated version"},{"line_number":221,"context_line":"                self.os_ironic_api_version \u003d negotiated_ver"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_e50f4e37","line":218,"updated":"2015-04-09 20:57:50.000000000","message":"It seems to me that if the user explicitly specified a version and 406 is returned, we don\u0027t need to get any negotiated version, unless we want the min/max versions to spit out in an error message.\n\n self.implicit_api_version \u003d\u003d False and self.os_ironic_api_version","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a7bdca32a94a0c3bcbe75d27c4e1d9a7a3f8cb81","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                # server handles microversions, but doesn\u0027t support"},{"line_number":220,"context_line":"                # the requested version, so try a negotiated version"},{"line_number":221,"context_line":"                self.os_ironic_api_version \u003d negotiated_ver"},{"line_number":222,"context_line":"                self.implicit_api_version \u003d False"},{"line_number":223,"context_line":"                kwargs[\u0027headers\u0027][\u0027X-OpenStack-Ironic-API-Version\u0027] \u003d ("},{"line_number":224,"context_line":"                    self.os_ironic_api_version)"},{"line_number":225,"context_line":"                return self._http_request(url, method, **kwargs)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa53dc9_a54146ab","line":222,"updated":"2015-04-09 20:57:50.000000000","message":"It isn\u0027t clear to me what .implicit_api_version is meant to capture. I thought it was set to False if the user had explicitly mentioned the api version in the request. But this is setting it to False cuz if it gets a 406 again, we don\u0027t want it to loop forever?","commit_id":"e8b48f21bb495d0ca580be400ed42dd9fc28313b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                base_version \u003d (\"v%s\" %"},{"line_number":68,"context_line":"                                str(self.os_ironic_api_version).split(\u0027.\u0027)[0])"},{"line_number":69,"context_line":"            else:"},{"line_number":70,"context_line":"                base_version \u003d API_VERSION"},{"line_number":71,"context_line":"            resp \u003d self._make_simple_request(conn, \u0027GET\u0027, base_version)"},{"line_number":72,"context_line":"            min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":73,"context_line":"        # If the user requested an explicit version then error now as trying"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_e36981fa","line":70,"updated":"2015-04-10 01:59:50.000000000","message":"I forgot to mention this before. It probably doesn\u0027t matter, but API_VERSION is \u0027/v1\u0027, whereas above, the base_version is set to \u0027vx\u0027, not \u0027/vx\u0027.","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2ed5945750b6409ce4991e4c4678bab06aef0a57","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                base_version \u003d (\"v%s\" %"},{"line_number":68,"context_line":"                                str(self.os_ironic_api_version).split(\u0027.\u0027)[0])"},{"line_number":69,"context_line":"            else:"},{"line_number":70,"context_line":"                base_version \u003d API_VERSION"},{"line_number":71,"context_line":"            resp \u003d self._make_simple_request(conn, \u0027GET\u0027, base_version)"},{"line_number":72,"context_line":"            min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":73,"context_line":"        # If the user requested an explicit version then error now as trying"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_d65ce21a","line":70,"in_reply_to":"9aa53dc9_e36981fa","updated":"2015-04-10 16:32:14.000000000","message":"Changed base_version to be \"/vx\"","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            resp \u003d self._make_simple_request(conn, \u0027GET\u0027, base_version)"},{"line_number":72,"context_line":"            min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":73,"context_line":"        # If the user requested an explicit version then error now as trying"},{"line_number":74,"context_line":"        # again won\u0027t change anything.  The server could support the version"},{"line_number":75,"context_line":"        # requested but the requested operation may not be supported by the"},{"line_number":76,"context_line":"        # requested version."},{"line_number":77,"context_line":"        if not self.implicit_api_version and self.os_ironic_api_version:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_a337f94b","line":74,"updated":"2015-04-10 01:59:50.000000000","message":"I think the point is that if the user had explicitly specified a version, then the client should use that version and return whatever response it got. It shouldn\u0027t retry using a different version (and yeah, it makes no sense to retry using the same version!) This is mentioned in the commit (lines 10-11) and probably in the spec.\n\nFor me, the only reason that this logic is in this method, is so that the message we return to the user will include the server\u0027s min/max range.\n\nSo I don\u0027t think it is true that \u0027trying again won\u0027t change anything.\u0027. That is true only if the negotiated version is the same as the user\u0027s specified version. If the negotiated version is different from the user\u0027s specified version, it is possible that reissuing the request with the negotiated version will result in success.\n\nIf it \u0027muddies\u0027 the water to have this logic here, we could take it out and put it in a separate method. This method could return (min, max, negotiated), and another call could be made to handle this.","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"8ebcd2e02a07587e4fd70f8eb50b274ca280a7e4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            resp \u003d self._make_simple_request(conn, \u0027GET\u0027, base_version)"},{"line_number":72,"context_line":"            min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":73,"context_line":"        # If the user requested an explicit version then error now as trying"},{"line_number":74,"context_line":"        # again won\u0027t change anything.  The server could support the version"},{"line_number":75,"context_line":"        # requested but the requested operation may not be supported by the"},{"line_number":76,"context_line":"        # requested version."},{"line_number":77,"context_line":"        if not self.implicit_api_version and self.os_ironic_api_version:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_6091e246","line":74,"in_reply_to":"9aa53dc9_a337f94b","updated":"2015-04-10 04:28:58.000000000","message":"But if the user has specified a version we won\u0027t retry using the negotiated version as we always use the user\u0027s specified version.","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":83,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":84,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":85,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # TODO(deva): cache the negotiated version for this server"},{"line_number":88,"context_line":"        negotiated_ver \u003d min(self.os_ironic_api_version, max_ver)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_434cadc7","line":85,"updated":"2015-04-10 01:59:50.000000000","message":"Hmm. This makes me wonder if instead of self.implicit_api_version, we should have something like self.how_api_version to indicate how the api version was set, with values like \u0027user\u0027, \u0027negotiated\u0027, \u0027default\u0027.\n\nI think that will make it easier to understand, and we could tailor the message better.","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2ed5945750b6409ce4991e4c4678bab06aef0a57","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":83,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":84,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":85,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # TODO(deva): cache the negotiated version for this server"},{"line_number":88,"context_line":"        negotiated_ver \u003d min(self.os_ironic_api_version, max_ver)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aaa499b_01dd2c14","line":85,"in_reply_to":"9aa53dc9_434cadc7","updated":"2015-04-10 16:32:14.000000000","message":"Done","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        if negotiated_ver \u003c min_ver:"},{"line_number":90,"context_line":"            negotiated_ver \u003d min_ver"},{"line_number":91,"context_line":"        LOG.debug(\u0027Negotiated API version is %s\u0027, negotiated_ver)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return negotiated_ver"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _parse_version_headers(self, accessor_func):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_1e6718b8","line":92,"updated":"2015-04-10 01:59:50.000000000","message":"This shouldn\u0027t happen so maybe we don\u0027t need to code for it, but I was wondering what if negotiated_ver \u003d\u003d self.os_ironic_api_version \u003d\u003d DEFAULT_VER. That would mean that max_ver \u003d\u003d self.os_ironic_api_version and that shouldn\u0027t 406. Hmm, unless in the future, we \u0027deprecate\u0027 a feature?\n\nAnyway, IF that happened, it wouldn\u0027t make sense to retry. But we could deal with that when/if it happens I guess. Or just put some code in here now to raise an exception?","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    def _make_simple_request(self, conn, method, url):"},{"line_number":376,"context_line":"        # NOTE: conn is self.session for this class"},{"line_number":377,"context_line":"        return VersionNegotiationMixin._make_simple_request("},{"line_number":378,"context_line":"            self, conn, method, url)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def _http_request(self, url, method, **kwargs):"},{"line_number":381,"context_line":"        kwargs.setdefault(\u0027user_agent\u0027, USER_AGENT)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_c30f9d37","line":378,"updated":"2015-04-10 01:59:50.000000000","message":"Are you sure this is right? It looks like it will do conn.getresponse()","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"8ebcd2e02a07587e4fd70f8eb50b274ca280a7e4","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    def _make_simple_request(self, conn, method, url):"},{"line_number":376,"context_line":"        # NOTE: conn is self.session for this class"},{"line_number":377,"context_line":"        return VersionNegotiationMixin._make_simple_request("},{"line_number":378,"context_line":"            self, conn, method, url)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def _http_request(self, url, method, **kwargs):"},{"line_number":381,"context_line":"        kwargs.setdefault(\u0027user_agent\u0027, USER_AGENT)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_a09daa67","line":378,"in_reply_to":"9aa53dc9_c30f9d37","updated":"2015-04-10 04:28:58.000000000","message":"It is wrong.  Good catch.  I will work on a fix tomorrow.  I think I will make this function like it was in the previous patchset.","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a2e11d573d39624d96f3142f2232bb09e3f2be2b","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        param conn: A connection object"},{"line_number":74,"context_line":"        param resp: The response object from http request"},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        assert self.api_version_select_state in API_VERSION_SELECTED_STATES"},{"line_number":77,"context_line":"        min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":78,"context_line":"        # NOTE: servers before commit 32fb6e99 did not return version headers"},{"line_number":79,"context_line":"        # on error, so we need to perform a GET to determine"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_13de776d","line":76,"updated":"2015-04-13 15:07:03.000000000","message":"I\u0027m not fond of putting assert\u0027s in the code. What is the user going to do if this happens?","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        param conn: A connection object"},{"line_number":74,"context_line":"        param resp: The response object from http request"},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        assert self.api_version_select_state in API_VERSION_SELECTED_STATES"},{"line_number":77,"context_line":"        min_ver, max_ver \u003d self._parse_version_headers(resp)"},{"line_number":78,"context_line":"        # NOTE: servers before commit 32fb6e99 did not return version headers"},{"line_number":79,"context_line":"        # on error, so we need to perform a GET to determine"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_131b1474","line":76,"in_reply_to":"7aaa499b_13de776d","updated":"2015-04-13 16:33:05.000000000","message":"Changed to raising a RuntimeError with more details.","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a2e11d573d39624d96f3142f2232bb09e3f2be2b","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":99,"context_line":"                \"requested version, or the requested operation is not \""},{"line_number":100,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":101,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":102,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":103,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_93ba87e0","line":101,"updated":"2015-04-13 15:07:03.000000000","message":"Now that we can distinguish between user expliciting specifying a version vs the client\u0027s guessed version, I think we could separate this into two different messages that is specific to those two cases.","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":99,"context_line":"                \"requested version, or the requested operation is not \""},{"line_number":100,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":101,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":102,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":103,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_59f77dd3","line":101,"in_reply_to":"7aaa499b_93ba87e0","updated":"2015-04-13 16:33:05.000000000","message":"Done","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cfb6e7a2131099f94d59917668833ea75ca3549e","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        return negotiated_ver"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _parse_version_headers(self, accessor_func):"},{"line_number":118,"context_line":"        min_ver \u003d accessor_func(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027,"},{"line_number":119,"context_line":"                                None)"},{"line_number":120,"context_line":"        max_ver \u003d accessor_func(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_58dd3e41","line":117,"updated":"2015-04-13 14:34:47.000000000","message":"this function should be named differently, as it accepts a different set of argument than it\u0027s overloaded versions","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        return negotiated_ver"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _parse_version_headers(self, accessor_func):"},{"line_number":118,"context_line":"        min_ver \u003d accessor_func(\u0027X-OpenStack-Ironic-API-Minimum-Version\u0027,"},{"line_number":119,"context_line":"                                None)"},{"line_number":120,"context_line":"        max_ver \u003d accessor_func(\u0027X-OpenStack-Ironic-API-Maximum-Version\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_533d1c2a","line":117,"in_reply_to":"7aaa499b_58dd3e41","updated":"2015-04-13 16:33:05.000000000","message":"Done","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cfb6e7a2131099f94d59917668833ea75ca3549e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        return min_ver, max_ver"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _make_simple_request(self, conn, method, url):"},{"line_number":125,"context_line":"        raise NotImplementedError"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class HTTPClient(VersionNegotiationMixin):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_385dd2e9","line":125,"updated":"2015-04-13 14:34:47.000000000","message":"nit: raising classes is deprecated\n\n raise NotImplementedError()","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        return min_ver, max_ver"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _make_simple_request(self, conn, method, url):"},{"line_number":125,"context_line":"        raise NotImplementedError"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class HTTPClient(VersionNegotiationMixin):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_131e74ba","line":125,"in_reply_to":"7aaa499b_385dd2e9","updated":"2015-04-13 16:33:05.000000000","message":"Done","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f414a6d7fa270a9bc94cd715067bed3c96180d8c","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        return \u0027%s/%s\u0027 % (base_url, url.lstrip(\u0027/\u0027))"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _parse_version_headers(self, resp):"},{"line_number":215,"context_line":"        return VersionNegotiationMixin._parse_version_headers("},{"line_number":216,"context_line":"            self, resp.getheader)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def _make_simple_request(self, conn, method, url):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_33405356","line":215,"updated":"2015-04-13 15:06:45.000000000","message":"this should be called as self._parse_version_headers(func)","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        return \u0027%s/%s\u0027 % (base_url, url.lstrip(\u0027/\u0027))"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _parse_version_headers(self, resp):"},{"line_number":215,"context_line":"        return VersionNegotiationMixin._parse_version_headers("},{"line_number":216,"context_line":"            self, resp.getheader)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def _make_simple_request(self, conn, method, url):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_d9794d95","line":215,"in_reply_to":"7aaa499b_33405356","updated":"2015-04-13 16:33:05.000000000","message":"Done","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"f414a6d7fa270a9bc94cd715067bed3c96180d8c","unresolved":false,"context_lines":[{"line_number":387,"context_line":"    \"\"\"HTTP client based on Keystone client session.\"\"\""},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def _parse_version_headers(self, resp):"},{"line_number":390,"context_line":"        return VersionNegotiationMixin._parse_version_headers("},{"line_number":391,"context_line":"            self, resp.headers.get)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def _make_simple_request(self, conn, method, url):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_33173353","line":390,"updated":"2015-04-13 15:06:45.000000000","message":"ditto","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":387,"context_line":"    \"\"\"HTTP client based on Keystone client session.\"\"\""},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def _parse_version_headers(self, resp):"},{"line_number":390,"context_line":"        return VersionNegotiationMixin._parse_version_headers("},{"line_number":391,"context_line":"            self, resp.headers.get)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def _make_simple_request(self, conn, method, url):"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_59665dee","line":390,"in_reply_to":"7aaa499b_33173353","updated":"2015-04-13 16:33:05.000000000","message":"Done","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be6671ce08a5390cc5334c79b3c97cdf9f67f435","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        if self.api_version_select_state not in API_VERSION_SELECTED_STATES:"},{"line_number":77,"context_line":"            raise RuntimeError("},{"line_number":78,"context_line":"                \u0027Error: self.api_version_select_state should be one of the\u0027"},{"line_number":79,"context_line":"                \u0027values in: \"%(valid)s\" but had the value: \"%(value)s\"\u0027 %"},{"line_number":80,"context_line":"                {\u0027valid\u0027: \u0027, \u0027.join(API_VERSION_SELECTED_STATES),"},{"line_number":81,"context_line":"                 \u0027value\u0027: self.api_version_select_state})"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_64784cc5","line":78,"updated":"2015-04-13 17:02:58.000000000","message":"need a blank space after \u0027of the\u0027","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"25eb6037072845241e1f19e87d1f0634bd97001d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        if self.api_version_select_state not in API_VERSION_SELECTED_STATES:"},{"line_number":77,"context_line":"            raise RuntimeError("},{"line_number":78,"context_line":"                \u0027Error: self.api_version_select_state should be one of the\u0027"},{"line_number":79,"context_line":"                \u0027values in: \"%(valid)s\" but had the value: \"%(value)s\"\u0027 %"},{"line_number":80,"context_line":"                {\u0027valid\u0027: \u0027, \u0027.join(API_VERSION_SELECTED_STATES),"},{"line_number":81,"context_line":"                 \u0027value\u0027: self.api_version_select_state})"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_2407e41d","line":78,"in_reply_to":"7aaa499b_64784cc5","updated":"2015-04-13 17:32:35.000000000","message":"Done","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be6671ce08a5390cc5334c79b3c97cdf9f67f435","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                \"Requested API version %(req)s is not supported by the \""},{"line_number":102,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":103,"context_line":"                \"requested version, or the requested operation is not \""},{"line_number":104,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":105,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":106,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":107,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_24824495","line":104,"updated":"2015-04-13 17:02:58.000000000","message":"I\u0027m not sure we should mention this part \u0027or the requested operation is not supported by any mutually compatible version\u0027.","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"25eb6037072845241e1f19e87d1f0634bd97001d","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                \"Requested API version %(req)s is not supported by the \""},{"line_number":102,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":103,"context_line":"                \"requested version, or the requested operation is not \""},{"line_number":104,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":105,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":106,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":107,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_5f0d1d3d","line":104,"in_reply_to":"7aaa499b_24824495","updated":"2015-04-13 17:32:35.000000000","message":"Done","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be6671ce08a5390cc5334c79b3c97cdf9f67f435","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        if self.api_version_select_state \u003d\u003d \u0027negotiated\u0027:"},{"line_number":109,"context_line":"            raise exc.UnsupportedVersion("},{"line_number":110,"context_line":"                \"Negotiated API version %(req)s is not supported by the \""},{"line_number":111,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":112,"context_line":"                \"negotiated version, or the requested operation is not \""},{"line_number":113,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":114,"context_line":"                \"version range is %(min)s to %(max)s\""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_047f48ab","line":111,"updated":"2015-04-13 17:02:58.000000000","message":"It is negotiated so it must be supported by the server.","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"25eb6037072845241e1f19e87d1f0634bd97001d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        if self.api_version_select_state \u003d\u003d \u0027negotiated\u0027:"},{"line_number":109,"context_line":"            raise exc.UnsupportedVersion("},{"line_number":110,"context_line":"                \"Negotiated API version %(req)s is not supported by the \""},{"line_number":111,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":112,"context_line":"                \"negotiated version, or the requested operation is not \""},{"line_number":113,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":114,"context_line":"                \"version range is %(min)s to %(max)s\""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_1f07951d","line":111,"in_reply_to":"7aaa499b_047f48ab","updated":"2015-04-13 17:32:35.000000000","message":"Done","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"be6671ce08a5390cc5334c79b3c97cdf9f67f435","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":112,"context_line":"                \"negotiated version, or the requested operation is not \""},{"line_number":113,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":114,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":115,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":116,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_e44a1c83","line":114,"updated":"2015-04-13 17:02:58.000000000","message":"How about something like \u0027The requested operation is not supported by the negotiated API version %(req)s. Supported version range is ...\u0027.\n\nMaybe we need to replace \u0027negotiated\u0027, will the user understand this?","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"25eb6037072845241e1f19e87d1f0634bd97001d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                \"server, the requested operation is not supported by the \""},{"line_number":112,"context_line":"                \"negotiated version, or the requested operation is not \""},{"line_number":113,"context_line":"                \"supported by any mutually compatible version. Supported \""},{"line_number":114,"context_line":"                \"version range is %(min)s to %(max)s\""},{"line_number":115,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":116,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver})"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7aaa499b_eaff85ff","line":114,"in_reply_to":"7aaa499b_e44a1c83","updated":"2015-04-13 17:32:35.000000000","message":"Done","commit_id":"600d5d4ec17366502fa4be15f02092505a20198d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7a7abc9f8bebb93c6f28eb0902c4dc30c8be174","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            raise exc.UnsupportedVersion(textwrap.fill("},{"line_number":102,"context_line":"                \"Requested API version %(req)s is not supported by the \""},{"line_number":103,"context_line":"                \"server or the requested operation is not supported by the \""},{"line_number":104,"context_line":"                \"requested version.  Supported version range is %(min)s to \""},{"line_number":105,"context_line":"                \"%(max)s\""},{"line_number":106,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":107,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver}))"}],"source_content_type":"text/x-python","patch_set":22,"id":"7aaa499b_851472f5","line":104,"updated":"2015-04-13 17:57:35.000000000","message":"nit: I think there are two spaces before \u0027Supported\u0027.","commit_id":"8b453ff88a04da994bfd97e49d9fb3822c275eed"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"8dff505a02095e6f55663acfefc7c714c0fdd450","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            raise exc.UnsupportedVersion(textwrap.fill("},{"line_number":102,"context_line":"                \"Requested API version %(req)s is not supported by the \""},{"line_number":103,"context_line":"                \"server or the requested operation is not supported by the \""},{"line_number":104,"context_line":"                \"requested version.  Supported version range is %(min)s to \""},{"line_number":105,"context_line":"                \"%(max)s\""},{"line_number":106,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":107,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver}))"}],"source_content_type":"text/x-python","patch_set":22,"id":"7aaa499b_c5e27ad5","line":104,"in_reply_to":"7aaa499b_851472f5","updated":"2015-04-13 18:00:32.000000000","message":"I am used to two spaces after a period :)","commit_id":"8b453ff88a04da994bfd97e49d9fb3822c275eed"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e7a7abc9f8bebb93c6f28eb0902c4dc30c8be174","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            raise exc.UnsupportedVersion(textwrap.fill("},{"line_number":110,"context_line":"                \"No API version was specified and the requested operation was \""},{"line_number":111,"context_line":"                \"not supported by the client\u0027s negotiated API version \""},{"line_number":112,"context_line":"                \"%(req)s.  Supported version range is: %(min)s to %(max)s\""},{"line_number":113,"context_line":"                % {\u0027req\u0027: self.os_ironic_api_version,"},{"line_number":114,"context_line":"                   \u0027min\u0027: min_ver, \u0027max\u0027: max_ver}))"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7aaa499b_6521664d","line":112,"updated":"2015-04-13 17:57:35.000000000","message":"ditto","commit_id":"8b453ff88a04da994bfd97e49d9fb3822c275eed"}],"ironicclient/tests/unit/test_http.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"91a76ac685aa5cf19aad2e9bf89cc58f5d8a63f0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        response \u003d {}"},{"line_number":64,"context_line":"        expected \u003d (None, None)"},{"line_number":65,"context_line":"        result \u003d self.test_object._parse_version_headers(response.get)"},{"line_number":66,"context_line":"        self.assertEqual(expected, result)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def test__make_simple_request_with_accessor(self):"},{"line_number":69,"context_line":"        # test using the accessor_func"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_fe759497","line":66,"updated":"2015-04-10 01:59:50.000000000","message":"I don\u0027t know if it is worth testing for one missing header.\n\nThe code assumes that if one is missing, both are missing. Or maybe it doesn\u0027t, maybe it is fine if min_ver is missing...","commit_id":"cf73dbfe5ee70135f3ec48bb04eb3d4751efd16f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cfb6e7a2131099f94d59917668833ea75ca3549e","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.assertRaises("},{"line_number":73,"context_line":"            AssertionError,"},{"line_number":74,"context_line":"            self.test_object.negotiate_version,"},{"line_number":75,"context_line":"            None, None)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @mock.patch.object(http.VersionNegotiationMixin, \u0027_parse_version_headers\u0027,"},{"line_number":78,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_1896964c","line":75,"updated":"2015-04-13 14:34:47.000000000","message":"nit: IMO \u0027assert\u0027 statements do not require tests","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"f992bf37e7d5f8491a0ce71d1c2e0d1f7e4f455e","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.assertRaises("},{"line_number":73,"context_line":"            AssertionError,"},{"line_number":74,"context_line":"            self.test_object.negotiate_version,"},{"line_number":75,"context_line":"            None, None)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @mock.patch.object(http.VersionNegotiationMixin, \u0027_parse_version_headers\u0027,"},{"line_number":78,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7aaa499b_59709d72","line":75,"in_reply_to":"7aaa499b_1896964c","updated":"2015-04-13 16:33:05.000000000","message":"Done","commit_id":"de7a4bee682ed56701938ae48013059408e563ad"}]}
