)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds implementation of rescue and unrescue for ironic virt"},{"line_number":10,"context_line":"driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"From python-ironicclient 2.2.0, the client supports passing a list of"},{"line_number":13,"context_line":"API versions to the os_ironic_api_version parameter. With this feature,"},{"line_number":14,"context_line":"the prior API version is requested, if the ironic doesn\u0027t support the"},{"line_number":15,"context_line":"required API version. This makes it unnecessary to upgrade ironic prior"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5f7c97a3_9340e5a4","line":12,"updated":"2018-07-12 19:57:54.000000000","message":"And we already require 2.3.0 so OK:\n\nhttps://github.com/openstack/nova/blob/master/lower-constraints.txt#L130","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds implementation of rescue and unrescue for ironic virt"},{"line_number":10,"context_line":"driver."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"From python-ironicclient 2.2.0, the client supports passing a list of"},{"line_number":13,"context_line":"API versions to the os_ironic_api_version parameter. With this feature,"},{"line_number":14,"context_line":"the prior API version is requested, if the ironic doesn\u0027t support the"},{"line_number":15,"context_line":"required API version. This makes it unnecessary to upgrade ironic prior"},{"line_number":16,"context_line":"to nova if the latest feature is not used."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Implements: blueprint ironic-rescue-mode"},{"line_number":19,"context_line":"Related-Bug: 1739440"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"5f7c97a3_f32fd9f2","line":16,"range":{"start_line":12,"start_character":0,"end_line":16,"end_character":42},"updated":"2018-07-12 19:57:54.000000000","message":"Looks like we can split this out into it\u0027s own change that comes before the one that adds rescue support. We could still send 1.37 in that patch, and then in this patch we change to send [1.38, 1.37].","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"}],"nova/exception.py":[{"author":{"_account_id":9610,"name":"Tao Li","email":"litao3721@126.com","username":"Litao"},"change_message_id":"deea724a973543d5f9167370145ccb5e7bedcb76","unresolved":false,"context_lines":[{"line_number":2175,"context_line":"    msg_fmt \u003d _(\"Networking client is experiencing an unauthorized exception.\")"},{"line_number":2176,"context_line":""},{"line_number":2177,"context_line":""},{"line_number":2178,"context_line":"class InstanceRescueFailure(NovaException):"},{"line_number":2179,"context_line":"    msg_fmt \u003d _(\"Failed to move to Rescue mode\")"},{"line_number":2180,"context_line":""},{"line_number":2181,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_ccebf576","line":2178,"range":{"start_line":2178,"start_character":6,"end_line":2178,"end_character":27},"updated":"2017-01-05 07:33:09.000000000","message":"The exception should include the message from ironic","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":22931,"name":"Taku Izumi","email":"izumi.taku@jp.fujitsu.com","username":"izumi777"},"change_message_id":"4f1e209ca457fe152ef775b6bf010ede99890dac","unresolved":false,"context_lines":[{"line_number":2175,"context_line":"    msg_fmt \u003d _(\"Networking client is experiencing an unauthorized exception.\")"},{"line_number":2176,"context_line":""},{"line_number":2177,"context_line":""},{"line_number":2178,"context_line":"class InstanceRescueFailure(NovaException):"},{"line_number":2179,"context_line":"    msg_fmt \u003d _(\"Failed to move to Rescue mode\")"},{"line_number":2180,"context_line":""},{"line_number":2181,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_64dd99df","line":2178,"range":{"start_line":2178,"start_character":6,"end_line":2178,"end_character":27},"in_reply_to":"ba5201f7_ccebf576","updated":"2017-01-06 02:50:10.000000000","message":"Good point, thanks.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"2bfc06c1bb7b3466fbb493c82fab7addb2d70c8e","unresolved":false,"context_lines":[{"line_number":2151,"context_line":""},{"line_number":2152,"context_line":""},{"line_number":2153,"context_line":"class InstanceRescueFailure(NovaException):"},{"line_number":2154,"context_line":"    msg_fmt \u003d _(\"Instance failed to move to rescue mode: %(reason)s\")"},{"line_number":2155,"context_line":""},{"line_number":2156,"context_line":""},{"line_number":2157,"context_line":"class InstanceUnRescueFailure(NovaException):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f287b81_d336bc03","line":2154,"updated":"2017-09-08 03:13:07.000000000","message":"To keep consistence with other message, change msg_fmt with \"Failed to move instance to rescue mode: %(reason)s\" would be better.","commit_id":"8ae7e5c094d13496f307a46c3004e2c6492538bb"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"2bfc06c1bb7b3466fbb493c82fab7addb2d70c8e","unresolved":false,"context_lines":[{"line_number":2155,"context_line":""},{"line_number":2156,"context_line":""},{"line_number":2157,"context_line":"class InstanceUnRescueFailure(NovaException):"},{"line_number":2158,"context_line":"    msg_fmt \u003d _(\"Instance failed to unrescue: %(reason)s\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f287b81_933cb4e1","line":2158,"updated":"2017-09-08 03:13:07.000000000","message":"Some comment with above one","commit_id":"8ae7e5c094d13496f307a46c3004e2c6492538bb"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"061518b515d17710bca66481773cbe9738d13065","unresolved":false,"context_lines":[{"line_number":1758,"context_line":"        self.driver.unrescue(instance, None)"},{"line_number":1759,"context_line":"        mock_sps.assert_called_once_with(node.uuid, \u0027unrescue\u0027)"},{"line_number":1760,"context_line":""},{"line_number":1761,"context_line":""},{"line_number":1762,"context_line":"@mock.patch.object(instance_metadata, \u0027InstanceMetadata\u0027)"},{"line_number":1763,"context_line":"@mock.patch.object(configdrive, \u0027ConfigDriveBuilder\u0027)"},{"line_number":1764,"context_line":"class IronicDriverGenerateConfigDriveTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_0cafbde2","line":1761,"updated":"2017-01-05 07:11:18.000000000","message":"The test cases for exceptions (InstanceRescueFailure, InstanceUnRescueFailure) should be added.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":22931,"name":"Taku Izumi","email":"izumi.taku@jp.fujitsu.com","username":"izumi777"},"change_message_id":"4f1e209ca457fe152ef775b6bf010ede99890dac","unresolved":false,"context_lines":[{"line_number":1758,"context_line":"        self.driver.unrescue(instance, None)"},{"line_number":1759,"context_line":"        mock_sps.assert_called_once_with(node.uuid, \u0027unrescue\u0027)"},{"line_number":1760,"context_line":""},{"line_number":1761,"context_line":""},{"line_number":1762,"context_line":"@mock.patch.object(instance_metadata, \u0027InstanceMetadata\u0027)"},{"line_number":1763,"context_line":"@mock.patch.object(configdrive, \u0027ConfigDriveBuilder\u0027)"},{"line_number":1764,"context_line":"class IronicDriverGenerateConfigDriveTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_c44485b8","line":1761,"in_reply_to":"ba5201f7_0cafbde2","updated":"2017-01-06 02:50:10.000000000","message":"Thanks. I\u0027ll add test case.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0ea959d97ebd0d3a759f430dc1838d12279825f7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# The API version required by the Ironic driver"},{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":25,"id":"df7087c5_d9e361d8","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":28},"updated":"2018-03-14 12:07:50.000000000","message":"We need to stop doing this, it complicates upgrades. ironicclient now supports providing a list of versions, that can be used to detect whether a feature is available or not. Julia is looking into improving this aspect, please sync with her.","commit_id":"0fac7a429d52f37811041f8ee24e89da79d4e610"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8d9477f10c29932f4abc5d914500434533be772b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# The API version required by the Ironic driver"},{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":25,"id":"df7087c5_cd539716","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":28},"in_reply_to":"df7087c5_d9e361d8","updated":"2018-03-14 14:43:11.000000000","message":"++ We absolutely need to stop doing this. What is acceptable to the nova community is functionally a major rewrite of our client interaction, which I\u0027ve been spending some long days on. They might let this land with a list of versions instead, but the discussion we had with nova cores at the PTG was that essentially they would much rather call level declaration of each microversion.\n\nThe API SIG discussions, at least over the past six months were to stop using project client libraries for service to service communication as they further complicate the entire process to support new versions","commit_id":"0fac7a429d52f37811041f8ee24e89da79d4e610"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"92f1604b91b1c587e3dbad6efcdb605ba9ea8e0e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"IRONIC_GROUP \u003d nova.conf.ironic.ironic_group"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# The API version required by the Ironic driver"},{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_fa4f688f","line":35,"updated":"2018-03-28 18:01:58.000000000","message":"What if we added a PRIOR_IRONIC_API_VERSION \u003d (1, 37), and sent both versions to ironic?  That would allow for semi-graceful transition across versions, and NotAcceptable would just percolate up from there.","commit_id":"eab8462787b2b545f5f07c1bef16f08090e4fdf0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"92f1604b91b1c587e3dbad6efcdb605ba9ea8e0e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        kwargs \u003d {}"},{"line_number":86,"context_line":"        kwargs[\u0027max_retries\u0027] \u003d max_retries"},{"line_number":87,"context_line":"        kwargs[\u0027retry_interval\u0027] \u003d retry_interval"},{"line_number":88,"context_line":"        kwargs[\u0027os_ironic_api_version\u0027] \u003d \u0027%d.%d\u0027 % IRONIC_API_VERSION"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"},{"line_number":91,"context_line":"        # service catalog. Use `endpoint_override` if you want to override it."}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_da1aa47b","line":88,"updated":"2018-03-28 18:01:58.000000000","message":"The above suggestion would involve setting os_ironic_api_version to a list of the two versions that are available. We added support to handle that last cycle, and while not as graceful as call level microversion handling, it at least will allow for a semi-graceful driver in the event of an \"out of order\" upgrade.","commit_id":"eab8462787b2b545f5f07c1bef16f08090e4fdf0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# The API version required by the Ironic driver"},{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":"PRIOR_IRONIC_API_VERSION \u003d (1, 37)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_731c29c2","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":24},"updated":"2018-07-12 19:57:54.000000000","message":"Will this just always be IRONIC_API_VERSION - 1? Or do we envision this to change in the future and have gaps, like maybe the next ironic API version we need is 1.40 so we would have:\n\nIRONIC_API_VERSION \u003d (1, 40)\nPRIOR_IRONIC_API_VERSION \u003d (1, 38)\n\nIf so, please leave a comment explaining that.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d6c8abc5306604311f624641fcbf4950bbaf32fe","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# The API version required by the Ironic driver"},{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":"PRIOR_IRONIC_API_VERSION \u003d (1, 37)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_c9f1ca98","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":24},"in_reply_to":"5f7c97a3_66eea5b6","updated":"2018-07-12 22:53:29.000000000","message":"I\u0027m putting in a huge comment in a new patch that will break this apart, that we can use as guidance for when/how versions should be incremented","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"63c0612df95708785aa9962ea96a87902fef449c","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# The API version required by the Ironic driver"},{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":"PRIOR_IRONIC_API_VERSION \u003d (1, 37)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_66eea5b6","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":24},"in_reply_to":"5f7c97a3_731c29c2","updated":"2018-07-12 20:17:07.000000000","message":"It should ideally be last validated/known needed version in that we know we were using 1.37 previously with the pin, we now what to use 1.38 if available, which allows the divide to be bridged.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        kwargs \u003d {}"},{"line_number":87,"context_line":"        kwargs[\u0027max_retries\u0027] \u003d max_retries"},{"line_number":88,"context_line":"        kwargs[\u0027retry_interval\u0027] \u003d retry_interval"},{"line_number":89,"context_line":"        kwargs[\u0027os_ironic_api_version\u0027] \u003d ["},{"line_number":90,"context_line":"            \u0027%d.%d\u0027 % IRONIC_API_VERSION, \u0027%d.%d\u0027 % PRIOR_IRONIC_API_VERSION]"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        # NOTE(clenimar/efried): by default, the endpoint is taken from the"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_9319c5d2","line":89,"range":{"start_line":89,"start_character":16,"end_line":89,"end_character":37},"updated":"2018-07-12 19:57:54.000000000","message":"Ack from the 2.2.0 release notes:\n\nhttps://docs.openstack.org/releasenotes/python-ironicclient/queens.html#relnotes-2-2-0-stable-queens\n\n\"The os_ironic_api_version parameter now accepts a list of REST API micro-versions to attempt to negotiate with the remote server. The highest available microversion in the list will be negotiated for the remaining lifetime of the client session.\"","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        return self._multi_getattr(client, method)(*args, **kwargs)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @property"},{"line_number":163,"context_line":"    def current_api_version(self):"},{"line_number":164,"context_line":"        return self._get_client().current_api_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_7371890d","line":163,"updated":"2018-07-12 19:57:54.000000000","message":"A docstring on this would be nice. This is the max version of the client, or the server?","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fa245425b1ba9d268005cbbfd9928802890a817f","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        return self._multi_getattr(client, method)(*args, **kwargs)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @property"},{"line_number":163,"context_line":"    def current_api_version(self):"},{"line_number":164,"context_line":"        return self._get_client().current_api_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_44e92117","line":163,"in_reply_to":"5f7c97a3_2690adf3","updated":"2018-07-12 21:22:49.000000000","message":"As in, we\u0027re hitting the API to get the version before it\u0027s up and we get None back? The only thing using this right now is the rescue code, and the ironic API should be running by then so I don\u0027t get why this would be None at that point.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d6c8abc5306604311f624641fcbf4950bbaf32fe","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        return self._multi_getattr(client, method)(*args, **kwargs)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @property"},{"line_number":163,"context_line":"    def current_api_version(self):"},{"line_number":164,"context_line":"        return self._get_client().current_api_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_7a65d6ae","line":163,"in_reply_to":"5f7c97a3_44e92117","updated":"2018-07-12 22:53:29.000000000","message":"No, this doesn\u0027t trigger at all, none is a signal that the client being worked with has never interacted with the API. We only negotiate upon first action, unless explicitly triggered. Splitting this out as it makes sense with what is minimally necessary to not return the errors (i hope).","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"63c0612df95708785aa9962ea96a87902fef449c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        return self._multi_getattr(client, method)(*args, **kwargs)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    @property"},{"line_number":163,"context_line":"    def current_api_version(self):"},{"line_number":164,"context_line":"        return self._get_client().current_api_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_2690adf3","line":163,"in_reply_to":"5f7c97a3_7371890d","updated":"2018-07-12 20:17:07.000000000","message":"presently neogitated.. which is why the errors you found appear in the logs. :\\","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8456ff1b922954eff27793399a26a8bfdddec57f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 38)"},{"line_number":36,"context_line":"# NOTE(TheJulia): This version should ALWAYS be the _last_ release"},{"line_number":37,"context_line":"# supported version of the API version used by nova. If a feature"},{"line_number":38,"context_line":"# needs 1.38 to be negotiated to operate properly, then the version"},{"line_number":39,"context_line":"# above should be updated, and this version should only be changed"},{"line_number":40,"context_line":"# once a cycle to the API version desired for features merging in"},{"line_number":41,"context_line":"# that cycle."}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_05c22c36","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":13},"updated":"2018-07-13 21:18:32.000000000","message":"\u003e1.38\n\nor \"a higher version\" so this doesn\u0027t go out of date every time.","commit_id":"a07b68ea9200863850d2dbd58e670bf06aafa9b9"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":9610,"name":"Tao Li","email":"litao3721@126.com","username":"Litao"},"change_message_id":"deea724a973543d5f9167370145ccb5e7bedcb76","unresolved":false,"context_lines":[{"line_number":1418,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":1419,"context_line":"                                   rescuepassword\u003drescue_password)"},{"line_number":1420,"context_line":"        except Exception:"},{"line_number":1421,"context_line":"            raise exception.InstanceRescueFailure()"},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":1424,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_4cc0e52a","line":1421,"range":{"start_line":1421,"start_character":12,"end_line":1421,"end_character":17},"updated":"2017-01-05 07:33:09.000000000","message":"I think it is best to raise message from ironic to locate problems quickly.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":22931,"name":"Taku Izumi","email":"izumi.taku@jp.fujitsu.com","username":"izumi777"},"change_message_id":"4f1e209ca457fe152ef775b6bf010ede99890dac","unresolved":false,"context_lines":[{"line_number":1418,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":1419,"context_line":"                                   rescuepassword\u003drescue_password)"},{"line_number":1420,"context_line":"        except Exception:"},{"line_number":1421,"context_line":"            raise exception.InstanceRescueFailure()"},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":1424,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_c4e00599","line":1421,"range":{"start_line":1421,"start_character":12,"end_line":1421,"end_character":17},"in_reply_to":"ba5201f7_4cc0e52a","updated":"2017-01-06 02:50:10.000000000","message":"Good point, thanks.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":9610,"name":"Tao Li","email":"litao3721@126.com","username":"Litao"},"change_message_id":"deea724a973543d5f9167370145ccb5e7bedcb76","unresolved":false,"context_lines":[{"line_number":1443,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":1444,"context_line":"                                   node_uuid, ironic_states.UNRESCUE)"},{"line_number":1445,"context_line":"        except Exception:"},{"line_number":1446,"context_line":"            raise exception.InstanceUnRescueFailure()"},{"line_number":1447,"context_line":""},{"line_number":1448,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_unrescue)"},{"line_number":1449,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_ecd35902","line":1446,"range":{"start_line":1446,"start_character":18,"end_line":1446,"end_character":27},"updated":"2017-01-05 07:33:09.000000000","message":"The same to resuce method comments above","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5b7de694ce568e0378b6fddb4c8062f56fa5a676","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    ironic_states.POWER_OFF: power_state.SHUTDOWN,"},{"line_number":71,"context_line":"}"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"_UNPROVISION_STATES \u003d (ironic_states.ACTIVE, ironic_states.DEPLOYFAIL,"},{"line_number":74,"context_line":"                       ironic_states.ERROR, ironic_states.DEPLOYWAIT,"},{"line_number":75,"context_line":"                       ironic_states.DEPLOYING)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_0f274e66","line":73,"updated":"2017-04-11 16:16:35.000000000","message":"need to add rescue state(s) here, otherwise instance gets deleted and instance_info removed but node stays in rescue","commit_id":"2f3db72ddcbd475003f9b20505a3377414070a3b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"79b2bf62e2dd788e50dcb1134c891beda2aa7821","unresolved":false,"context_lines":[{"line_number":1814,"context_line":""},{"line_number":1815,"context_line":"            if node.provision_state in (ironic_states.RESCUEFAIL):"},{"line_number":1816,"context_line":"                raise exception.InstanceRescueFailure("},{"line_number":1817,"context_line":"                          reason\u003d\u0027ironic state is rescue failed\u0027)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"        try:"},{"line_number":1820,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","}],"source_content_type":"text/x-python","patch_set":10,"id":"5f4e5783_40d80b7e","line":1817,"range":{"start_line":1817,"start_character":33,"end_line":1817,"end_character":64},"updated":"2017-10-12 01:08:46.000000000","message":"_(\u0027ironic state is rescue failed\u0027)","commit_id":"7bdf38e3e35a23a4b2d516b9a7f7d3fccc086014"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"79b2bf62e2dd788e50dcb1134c891beda2aa7821","unresolved":false,"context_lines":[{"line_number":1845,"context_line":""},{"line_number":1846,"context_line":"            if node.provision_state in (ironic_states.UNRESCUEFAIL):"},{"line_number":1847,"context_line":"                raise exception.InstanceUnRescueFailure("},{"line_number":1848,"context_line":"                          reason\u003d\u0027ironic state is unrescue failed\u0027)"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"        try:"},{"line_number":1851,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","}],"source_content_type":"text/x-python","patch_set":10,"id":"5f4e5783_60c6679d","line":1848,"range":{"start_line":1848,"start_character":33,"end_line":1848,"end_character":66},"updated":"2017-10-12 01:08:46.000000000","message":"_(\u0027ironic state is unrescue failed\u0027)","commit_id":"7bdf38e3e35a23a4b2d516b9a7f7d3fccc086014"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"86bc2f8d2a5d489587a0de1f86da94da7659a764","unresolved":false,"context_lines":[{"line_number":1965,"context_line":"            except exception.InstanceNotFound as e:"},{"line_number":1966,"context_line":"                raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":1967,"context_line":""},{"line_number":1968,"context_line":"            if node.provision_state in (ironic_states.RESCUE):"},{"line_number":1969,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"            if node.provision_state in (ironic_states.RESCUEFAIL):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5f93b717_2b7bdc27","line":1968,"range":{"start_line":1968,"start_character":36,"end_line":1968,"end_character":38},"updated":"2018-02-02 10:31:28.000000000","message":"Please use \"\u003d\u003d\" instead of \"in\".","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4f70b89bec063e27d155776a7e992f750776f4d3","unresolved":false,"context_lines":[{"line_number":1965,"context_line":"            except exception.InstanceNotFound as e:"},{"line_number":1966,"context_line":"                raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":1967,"context_line":""},{"line_number":1968,"context_line":"            if node.provision_state in (ironic_states.RESCUE):"},{"line_number":1969,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"            if node.provision_state in (ironic_states.RESCUEFAIL):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa0c359_ab34b5df","line":1968,"range":{"start_line":1968,"start_character":36,"end_line":1968,"end_character":38},"in_reply_to":"5f93b717_2b7bdc27","updated":"2018-02-05 01:20:07.000000000","message":"Nice catch! Thanks.","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"86bc2f8d2a5d489587a0de1f86da94da7659a764","unresolved":false,"context_lines":[{"line_number":1968,"context_line":"            if node.provision_state in (ironic_states.RESCUE):"},{"line_number":1969,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"            if node.provision_state in (ironic_states.RESCUEFAIL):"},{"line_number":1972,"context_line":"                raise exception.InstanceRescueFailure("},{"line_number":1973,"context_line":"                          reason\u003dnode.last_error)"},{"line_number":1974,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5f93b717_4b97483b","line":1971,"range":{"start_line":1971,"start_character":36,"end_line":1971,"end_character":38},"updated":"2018-02-02 10:31:28.000000000","message":"ditto","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4f70b89bec063e27d155776a7e992f750776f4d3","unresolved":false,"context_lines":[{"line_number":1968,"context_line":"            if node.provision_state in (ironic_states.RESCUE):"},{"line_number":1969,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"            if node.provision_state in (ironic_states.RESCUEFAIL):"},{"line_number":1972,"context_line":"                raise exception.InstanceRescueFailure("},{"line_number":1973,"context_line":"                          reason\u003dnode.last_error)"},{"line_number":1974,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa0c359_cb3101ef","line":1971,"range":{"start_line":1971,"start_character":36,"end_line":1971,"end_character":38},"in_reply_to":"5f93b717_4b97483b","updated":"2018-02-05 01:20:07.000000000","message":"Done","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"86bc2f8d2a5d489587a0de1f86da94da7659a764","unresolved":false,"context_lines":[{"line_number":2000,"context_line":"                raise exception.InstanceUnRescueFailure("},{"line_number":2001,"context_line":"                          reason\u003dsix.text_type(e))"},{"line_number":2002,"context_line":""},{"line_number":2003,"context_line":"            if node.provision_state in (ironic_states.ACTIVE):"},{"line_number":2004,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":2005,"context_line":""},{"line_number":2006,"context_line":"            if node.provision_state in (ironic_states.UNRESCUEFAIL):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5f93b717_6b9a4462","line":2003,"range":{"start_line":2003,"start_character":36,"end_line":2003,"end_character":38},"updated":"2018-02-02 10:31:28.000000000","message":"ditto","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4f70b89bec063e27d155776a7e992f750776f4d3","unresolved":false,"context_lines":[{"line_number":2000,"context_line":"                raise exception.InstanceUnRescueFailure("},{"line_number":2001,"context_line":"                          reason\u003dsix.text_type(e))"},{"line_number":2002,"context_line":""},{"line_number":2003,"context_line":"            if node.provision_state in (ironic_states.ACTIVE):"},{"line_number":2004,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":2005,"context_line":""},{"line_number":2006,"context_line":"            if node.provision_state in (ironic_states.UNRESCUEFAIL):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa0c359_4b5bb12d","line":2003,"range":{"start_line":2003,"start_character":36,"end_line":2003,"end_character":38},"in_reply_to":"5f93b717_6b9a4462","updated":"2018-02-05 01:20:07.000000000","message":"Done","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"86bc2f8d2a5d489587a0de1f86da94da7659a764","unresolved":false,"context_lines":[{"line_number":2003,"context_line":"            if node.provision_state in (ironic_states.ACTIVE):"},{"line_number":2004,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":2005,"context_line":""},{"line_number":2006,"context_line":"            if node.provision_state in (ironic_states.UNRESCUEFAIL):"},{"line_number":2007,"context_line":"                raise exception.InstanceUnRescueFailure("},{"line_number":2008,"context_line":"                          reason\u003dnode.last_error)"},{"line_number":2009,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"5f93b717_2ba0bc8f","line":2006,"range":{"start_line":2006,"start_character":36,"end_line":2006,"end_character":38},"updated":"2018-02-02 10:31:28.000000000","message":"ditto","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4f70b89bec063e27d155776a7e992f750776f4d3","unresolved":false,"context_lines":[{"line_number":2003,"context_line":"            if node.provision_state in (ironic_states.ACTIVE):"},{"line_number":2004,"context_line":"                raise loopingcall.LoopingCallDone()"},{"line_number":2005,"context_line":""},{"line_number":2006,"context_line":"            if node.provision_state in (ironic_states.UNRESCUEFAIL):"},{"line_number":2007,"context_line":"                raise exception.InstanceUnRescueFailure("},{"line_number":2008,"context_line":"                          reason\u003dnode.last_error)"},{"line_number":2009,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa0c359_eb3f1db3","line":2006,"range":{"start_line":2006,"start_character":36,"end_line":2006,"end_character":38},"in_reply_to":"5f93b717_2ba0bc8f","updated":"2018-02-05 01:20:07.000000000","message":"Done","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87e6de567cd89245c373a61b5b6f1a1aa4f19a66","unresolved":false,"context_lines":[{"line_number":1938,"context_line":"        :param rescue_password: new root password to set for rescue."},{"line_number":1939,"context_line":"        :raise InstanceRescueFailure if rescue fails."},{"line_number":1940,"context_line":"        \"\"\""},{"line_number":1941,"context_line":"        LOG.debug(\u0027Rescue called for instance\u0027, instance\u003dinstance)"},{"line_number":1942,"context_line":""},{"line_number":1943,"context_line":"        node_uuid \u003d instance.node"},{"line_number":1944,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_10ea8b73","line":1941,"updated":"2018-07-12 18:48:37.000000000","message":"From the CI run I at least see us get here:\n\nhttp://logs.openstack.org/04/528704/33/check/ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3/ec5520f/logs/screen-n-cpu.txt.gz#_Jul_12_18_20_45_541534\n\nIn the ironic conductor logs, looks like the node rescue starts here:\n\nhttp://logs.openstack.org/04/528704/33/check/ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3/ec5520f/logs/screen-ir-cond.txt.gz#_Jul_12_18_20_45_622146","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":1960,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":1961,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":1962,"context_line":"                                   rescue_password\u003drescue_password)"},{"line_number":1963,"context_line":"        except Exception as e:"},{"line_number":1964,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":1965,"context_line":""},{"line_number":1966,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":1967,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_934785a4","line":1964,"range":{"start_line":1963,"start_character":8,"end_line":1964,"end_character":74},"updated":"2018-07-12 19:57:54.000000000","message":"So this could be IronicAPIVersionNotAvailable right? In that case, should we handle that and log something for the operator, like rescue is not available because ironic API is too old?\n\nThinking about what the operator could do in this case, they could disable the feature in the compute API via the os_compute_api:os-rescue policy until ironic is upgraded...","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"63c0612df95708785aa9962ea96a87902fef449c","unresolved":false,"context_lines":[{"line_number":1960,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":1961,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":1962,"context_line":"                                   rescue_password\u003drescue_password)"},{"line_number":1963,"context_line":"        except Exception as e:"},{"line_number":1964,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":1965,"context_line":""},{"line_number":1966,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":1967,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_664305b2","line":1964,"range":{"start_line":1963,"start_character":8,"end_line":1964,"end_character":74},"in_reply_to":"5f7c97a3_934785a4","updated":"2018-07-12 20:17:07.000000000","message":"Thats a good point, or they could also complete their ironic upgrade... so +1 to adding explicit logging.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"dae231db361ba75bddf54810fa885477f890857f","unresolved":false,"context_lines":[{"line_number":1960,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":1961,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":1962,"context_line":"                                   rescue_password\u003drescue_password)"},{"line_number":1963,"context_line":"        except Exception as e:"},{"line_number":1964,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":1965,"context_line":""},{"line_number":1966,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":1967,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_3add1e13","line":1964,"range":{"start_line":1963,"start_character":8,"end_line":1964,"end_character":74},"in_reply_to":"5f7c97a3_934785a4","updated":"2018-07-12 23:05:06.000000000","message":"The more I\u0027m thinking about it, it would likely be a good follow-up. I\u0027m not going to change that right now in the rebase for now, since we need to make sure the split of the two items works as expected.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":1998,"context_line":"            self._can_send_version(min_version\u003d\u00271.38\u0027)"},{"line_number":1999,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":2000,"context_line":"                                   node_uuid, ironic_states.UNRESCUE)"},{"line_number":2001,"context_line":"        except Exception as e:"},{"line_number":2002,"context_line":"            raise exception.InstanceUnRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":2003,"context_line":""},{"line_number":2004,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_unrescue)"},{"line_number":2005,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_93dc65e2","line":2002,"range":{"start_line":2001,"start_character":8,"end_line":2002,"end_character":76},"updated":"2018-07-12 19:57:54.000000000","message":"same as above","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":2009,"context_line":"    def _can_send_version(self, min_version\u003dNone, max_version\u003dNone):"},{"line_number":2010,"context_line":"        current_api_version \u003d self.ironicclient.current_api_version"},{"line_number":2011,"context_line":"        if (min_version and"},{"line_number":2012,"context_line":"                version.StrictVersion(current_api_version) \u003c"},{"line_number":2013,"context_line":"                version.StrictVersion(min_version)):"},{"line_number":2014,"context_line":"            raise exception.IronicAPIVersionNotAvailable(version\u003dmin_version)"},{"line_number":2015,"context_line":"        if (max_version and"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_938a25ba","line":2012,"range":{"start_line":2012,"start_character":24,"end_line":2012,"end_character":37},"updated":"2018-07-12 19:57:54.000000000","message":"I saw this in a CI run:\n\nhttp://logs.openstack.org/04/528704/33/check/ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3/ec5520f/logs/screen-n-cpu.txt.gz#_Jul_12_18_10_59_143344\n\nShould we be using distutils? We have other version parsing classes we can use (versionutils in oslo, or the APIVersionRequest in nova).","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d6c8abc5306604311f624641fcbf4950bbaf32fe","unresolved":false,"context_lines":[{"line_number":2009,"context_line":"    def _can_send_version(self, min_version\u003dNone, max_version\u003dNone):"},{"line_number":2010,"context_line":"        current_api_version \u003d self.ironicclient.current_api_version"},{"line_number":2011,"context_line":"        if (min_version and"},{"line_number":2012,"context_line":"                version.StrictVersion(current_api_version) \u003c"},{"line_number":2013,"context_line":"                version.StrictVersion(min_version)):"},{"line_number":2014,"context_line":"            raise exception.IronicAPIVersionNotAvailable(version\u003dmin_version)"},{"line_number":2015,"context_line":"        if (max_version and"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_bf80409e","line":2012,"range":{"start_line":2012,"start_character":24,"end_line":2012,"end_character":37},"in_reply_to":"5f7c97a3_06ea5173","updated":"2018-07-12 22:53:29.000000000","message":"Regarding if we should be using distutils, it has the appropriate logic under the hood to convert semver versions and be able to compare them. I\u0027m not sure oslo ersionutils really gives us what will work for the comparisons.... At least, I\u0027m typing that looking at a glance. Same with the nova internal api version request handling... although it looks much more substantial.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"63c0612df95708785aa9962ea96a87902fef449c","unresolved":false,"context_lines":[{"line_number":2009,"context_line":"    def _can_send_version(self, min_version\u003dNone, max_version\u003dNone):"},{"line_number":2010,"context_line":"        current_api_version \u003d self.ironicclient.current_api_version"},{"line_number":2011,"context_line":"        if (min_version and"},{"line_number":2012,"context_line":"                version.StrictVersion(current_api_version) \u003c"},{"line_number":2013,"context_line":"                version.StrictVersion(min_version)):"},{"line_number":2014,"context_line":"            raise exception.IronicAPIVersionNotAvailable(version\u003dmin_version)"},{"line_number":2015,"context_line":"        if (max_version and"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_06ea5173","line":2012,"range":{"start_line":2012,"start_character":24,"end_line":2012,"end_character":37},"in_reply_to":"5f7c97a3_861981d2","updated":"2018-07-12 20:17:07.000000000","message":"So I think what is happening is there is not any other api connection being established which and it is relying upon the property being set to run the call... which doesn\u0027t entirely make sense in my head at the moment.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e0eaded49494aef482c0aaaceb6cab3c17f4288","unresolved":false,"context_lines":[{"line_number":2009,"context_line":"    def _can_send_version(self, min_version\u003dNone, max_version\u003dNone):"},{"line_number":2010,"context_line":"        current_api_version \u003d self.ironicclient.current_api_version"},{"line_number":2011,"context_line":"        if (min_version and"},{"line_number":2012,"context_line":"                version.StrictVersion(current_api_version) \u003c"},{"line_number":2013,"context_line":"                version.StrictVersion(min_version)):"},{"line_number":2014,"context_line":"            raise exception.IronicAPIVersionNotAvailable(version\u003dmin_version)"},{"line_number":2015,"context_line":"        if (max_version and"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f7c97a3_861981d2","line":2012,"range":{"start_line":2012,"start_character":24,"end_line":2012,"end_character":37},"in_reply_to":"5f7c97a3_938a25ba","updated":"2018-07-12 20:11:11.000000000","message":"We must be passing in StrictVersion(None) at some point:\n\nosboxes@osboxes:~/git/nova$ python\nPython 2.7.12 (default, Dec  4 2017, 14:50:18) \n[GCC 5.4.0 20160609] on linux2\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e from distutils import version\n\u003e\u003e\u003e version.StrictVersion(None)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/lib/python2.7/distutils/version.py\", line 43, in __repr__\n    return \"%s (\u0027%s\u0027)\" % (self.__class__.__name__, str(self))\n  File \"/usr/lib/python2.7/distutils/version.py\", line 125, in __str__\n    if self.version[2] \u003d\u003d 0:\nAttributeError: StrictVersion instance has no attribute \u0027version\u0027\n\u003e\u003e\u003e","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"034d064d8f78d5ab3eebb6925429822911db0f3b","unresolved":false,"context_lines":[{"line_number":2018,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":2019,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":2020,"context_line":"                                   rescue_password\u003drescue_password)"},{"line_number":2021,"context_line":"        except Exception as e:"},{"line_number":2022,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":2023,"context_line":""},{"line_number":2024,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":2025,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_953be5c7","line":2022,"range":{"start_line":2021,"start_character":8,"end_line":2022,"end_character":74},"updated":"2018-07-12 23:31:07.000000000","message":"nit: we should explicitly handle an unsupported version error and log something useful for the operator in that case. Could be done in a follow up.","commit_id":"6763971a0f6b691f17c78ca241715cf1c9d8fae3"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"96800f18b47ebf0a4f62de8b0d8581b6651c20cf","unresolved":false,"context_lines":[{"line_number":2018,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":2019,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":2020,"context_line":"                                   rescue_password\u003drescue_password)"},{"line_number":2021,"context_line":"        except Exception as e:"},{"line_number":2022,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":2023,"context_line":""},{"line_number":2024,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":2025,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_461e00bd","line":2022,"range":{"start_line":2021,"start_character":8,"end_line":2022,"end_character":74},"in_reply_to":"5f7c97a3_603c4492","updated":"2018-07-13 04:41:51.000000000","message":"I posted another patch for logging: https://review.openstack.org/#/c/582447/","commit_id":"6763971a0f6b691f17c78ca241715cf1c9d8fae3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e1d0409370dbe988dfa738fcbc6f72c11003bcc1","unresolved":false,"context_lines":[{"line_number":2018,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","},{"line_number":2019,"context_line":"                                   node_uuid, ironic_states.RESCUE,"},{"line_number":2020,"context_line":"                                   rescue_password\u003drescue_password)"},{"line_number":2021,"context_line":"        except Exception as e:"},{"line_number":2022,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":2023,"context_line":""},{"line_number":2024,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":2025,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"}],"source_content_type":"text/x-python","patch_set":32,"id":"5f7c97a3_603c4492","line":2022,"range":{"start_line":2021,"start_character":8,"end_line":2022,"end_character":74},"in_reply_to":"5f7c97a3_953be5c7","updated":"2018-07-13 01:56:09.000000000","message":"Agreed, if the Fujitsu folks don\u0027t propose it overnight, I\u0027ll try to get to it tomorrow.","commit_id":"6763971a0f6b691f17c78ca241715cf1c9d8fae3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8456ff1b922954eff27793399a26a8bfdddec57f","unresolved":false,"context_lines":[{"line_number":2021,"context_line":"        except Exception as e:"},{"line_number":2022,"context_line":"            raise exception.InstanceRescueFailure(reason\u003dsix.text_type(e))"},{"line_number":2023,"context_line":""},{"line_number":2024,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_rescue)"},{"line_number":2025,"context_line":"        timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()"},{"line_number":2026,"context_line":"        LOG.info(\u0027Successfully rescued Ironic node %(node)s\u0027,"},{"line_number":2027,"context_line":"                 {\u0027node\u0027: node_uuid}, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f7c97a3_a5d578e8","line":2024,"updated":"2018-07-13 21:18:32.000000000","message":"Note to self: no need to start this before L2018 because it\u0027s just checking the final state.\n\nLikewise below.","commit_id":"a07b68ea9200863850d2dbd58e670bf06aafa9b9"}],"nova/virt/ironic/ironic_states.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"061518b515d17710bca66481773cbe9738d13065","unresolved":false,"context_lines":[{"line_number":136,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":140,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_8c2d6d97","line":139,"range":{"start_line":139,"start_character":13,"end_line":139,"end_character":25},"updated":"2017-01-05 07:11:18.000000000","message":"\u0027rescue failed\u0027 is better.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":22931,"name":"Taku Izumi","email":"izumi.taku@jp.fujitsu.com","username":"izumi777"},"change_message_id":"4f1e209ca457fe152ef775b6bf010ede99890dac","unresolved":false,"context_lines":[{"line_number":136,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":140,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_445df577","line":139,"range":{"start_line":139,"start_character":13,"end_line":139,"end_character":25},"in_reply_to":"ba5201f7_8c2d6d97","updated":"2017-01-06 02:50:10.000000000","message":"We have to adjust Ironic part patch.\nWe can\u0027t change this here.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"061518b515d17710bca66481773cbe9738d13065","unresolved":false,"context_lines":[{"line_number":144,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":148,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_cc23f5a5","line":147,"range":{"start_line":147,"start_character":15,"end_line":147,"end_character":29},"updated":"2017-01-05 07:11:18.000000000","message":"\u0027unrescue failed\u0027 is better.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":22931,"name":"Taku Izumi","email":"izumi.taku@jp.fujitsu.com","username":"izumi777"},"change_message_id":"4f1e209ca457fe152ef775b6bf010ede99890dac","unresolved":false,"context_lines":[{"line_number":144,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":148,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5201f7_e4c8a924","line":147,"range":{"start_line":147,"start_character":15,"end_line":147,"end_character":29},"in_reply_to":"ba5201f7_cc23f5a5","updated":"2017-01-06 02:50:10.000000000","message":"same above.","commit_id":"4bedd378840413ce809d4bd8574f9b8a2e06d941"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e25275f75f324265a65c63e5427fa508771a3982","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":148,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"##############"},{"line_number":152,"context_line":"# Power states"}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_afa06291","line":149,"updated":"2017-04-11 16:20:28.000000000","message":"need to add RESCUEWAIT here as well as to _UNPROVISION_STATES in driver code","commit_id":"2f3db72ddcbd475003f9b20505a3377414070a3b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"e29d888be1cf28f853e55630783683b7125745d3","unresolved":false,"context_lines":[{"line_number":136,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"RESCUEFAIL \u003d \u0027rescuefail\u0027"},{"line_number":140,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9ff52f3f_419de957","line":139,"range":{"start_line":139,"start_character":14,"end_line":139,"end_character":24},"updated":"2017-04-13 08:32:52.000000000","message":"IMO, \u0027rescue failed\u0027 is better because of consistency with line 79, 110, 131.","commit_id":"8ae7e5c094d13496f307a46c3004e2c6492538bb"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"e29d888be1cf28f853e55630783683b7125745d3","unresolved":false,"context_lines":[{"line_number":144,"context_line":"\"\"\" Node is unrescuing. \"\"\""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":148,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ff52f3f_21a2e59b","line":147,"range":{"start_line":147,"start_character":16,"end_line":147,"end_character":28},"updated":"2017-04-13 08:32:52.000000000","message":"ditto","commit_id":"8ae7e5c094d13496f307a46c3004e2c6492538bb"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"e29d888be1cf28f853e55630783683b7125745d3","unresolved":false,"context_lines":[{"line_number":147,"context_line":"UNRESCUEFAIL \u003d \u0027unrescuefail\u0027"},{"line_number":148,"context_line":"\"\"\" Node rescue failed. \"\"\""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"RESCUEWAIT \u003d \u0027rescuewait\u0027"},{"line_number":151,"context_line":"\"\"\" Node is waiting for rescue callback. \"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9ff52f3f_61b10de2","line":150,"range":{"start_line":150,"start_character":14,"end_line":150,"end_character":24},"updated":"2017-04-13 08:32:52.000000000","message":"\u0027rescue wait\u0027","commit_id":"8ae7e5c094d13496f307a46c3004e2c6492538bb"},{"author":{"_account_id":18320,"name":"Dao Cong Tien","email":"tiendc@vn.fujitsu.com","username":"TienDC"},"change_message_id":"86bc2f8d2a5d489587a0de1f86da94da7659a764","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"RESCUE \u003d \u0027rescue\u0027"},{"line_number":136,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"RESCUEFAIL \u003d \u0027rescue failed\u0027"},{"line_number":139,"context_line":"\"\"\" Node rescue failed. \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"5f93b717_cbf11897","line":136,"updated":"2018-02-02 10:31:28.000000000","message":"nit: give more details like for UNRESCUE that this is used as both state and verb.","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"4f70b89bec063e27d155776a7e992f750776f4d3","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"RESCUE \u003d \u0027rescue\u0027"},{"line_number":136,"context_line":"\"\"\" Node is in rescue mode. \"\"\""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"RESCUEFAIL \u003d \u0027rescue failed\u0027"},{"line_number":139,"context_line":"\"\"\" Node rescue failed. \"\"\""}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa0c359_8b7a1986","line":136,"in_reply_to":"5f93b717_cbf11897","updated":"2018-02-05 01:20:07.000000000","message":"Done","commit_id":"d0a62ad318cf593a7f3319f5bb1c20cbd907cf62"}],"releasenotes/notes/bp-ironic-rescue-mode-c305f37e20fba203.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0ea959d97ebd0d3a759f430dc1838d12279825f7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Supports instance resuce and unresuce with ironic virt driver. This feature"},{"line_number":5,"context_line":"    requires an ironic service supporting API version 1.38 or later, which is"},{"line_number":6,"context_line":"    present in ironic releases \u003e\u003d 10.0. It also requires"},{"line_number":7,"context_line":"    python-ironicclient \u003e\u003d 2.3.0(TBD)."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"df7087c5_f9d745ed","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":38},"updated":"2018-03-14 12:07:50.000000000","message":"it was released, but we need a global-requirements bump","commit_id":"0fac7a429d52f37811041f8ee24e89da79d4e610"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Supports instance rescue and unrescue with ironic virt driver. This feature"},{"line_number":5,"context_line":"    requires an ironic service supporting API version 1.38 or later, which is"},{"line_number":6,"context_line":"    present in ironic releases \u003e\u003d 10.1. It also requires python-ironicclient \u003e\u003d"},{"line_number":7,"context_line":"    2.3.0."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"fixes:"},{"line_number":10,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_a61cbd14","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":9},"updated":"2018-07-12 19:57:54.000000000","message":"yup:\n\nhttps://docs.openstack.org/releasenotes/python-ironicclient/unreleased.html#relnotes-2-3-0","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6d07829dc3260a43539e75ee9478d4f93d52daf2","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    present in ironic releases \u003e\u003d 10.1. It also requires python-ironicclient \u003e\u003d"},{"line_number":7,"context_line":"    2.3.0."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"fixes:"},{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    Allows to work with a prior version of ironic. If ironic doesn\u0027t support"},{"line_number":12,"context_line":"    the latest required API version, nova uses the prior supported API version."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_468fe921","line":9,"updated":"2018-07-12 19:59:17.000000000","message":"Actually, do we even need to mention this in the release notes? It\u0027s just an added benefit to the operator that the rescue feature release note doesn\u0027t need to say something about requiring that ironic is upgraded first. I mean, the feature release note *does* say that 1.38 is required, but that\u0027s for the capability for rescue, not just across the board needing to upgrade ironic before nova for everything, including non-rescue operations.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"dae231db361ba75bddf54810fa885477f890857f","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    present in ironic releases \u003e\u003d 10.1. It also requires python-ironicclient \u003e\u003d"},{"line_number":7,"context_line":"    2.3.0."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"fixes:"},{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    Allows to work with a prior version of ironic. If ironic doesn\u0027t support"},{"line_number":12,"context_line":"    the latest required API version, nova uses the prior supported API version."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_dafaea75","line":9,"in_reply_to":"5f7c97a3_468fe921","updated":"2018-07-12 23:05:06.000000000","message":"We could likely split it out into the other patch. I didn\u0027t think about it for that. I\u0027m going to truncate the rest of this, we already state the other requirements above under features.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"fixes:"},{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    Allows to work with a prior version of ironic. If ironic doesn\u0027t support"},{"line_number":12,"context_line":"    the latest required API version, nova uses the prior supported API version."},{"line_number":13,"context_line":"    See `bug 1739440 \u003chttps://bugs.launchpad.net/nova/+bug/1739440\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_c619b923","line":11,"range":{"start_line":11,"start_character":4,"end_line":11,"end_character":50},"updated":"2018-07-12 19:57:54.000000000","message":"What does? This reads like a commit message, but release notes are gathered in aggregate so this sentence won\u0027t have any context when reading release notes together.\n\nAgain, seems like we should split this out?","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"805c5ab2c2311f5a29552037fac3abdd6645959c","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    Allows to work with a prior version of ironic. If ironic doesn\u0027t support"},{"line_number":12,"context_line":"    the latest required API version, nova uses the prior supported API version."},{"line_number":13,"context_line":"    See `bug 1739440 \u003chttps://bugs.launchpad.net/nova/+bug/1739440\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5f7c97a3_8613c101","line":13,"updated":"2018-07-12 19:57:54.000000000","message":"Requires python-ironicclient \u003e\u003d 2.2.0 right? Probably should mention that.","commit_id":"17b3ae0162ada51346f83f6de53c466fa9506a8d"}]}
