)]}'
{"ironic/drivers/modules/drac/bios.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4e85f800ee7f8670e3dccbeb9501eae418c09f9e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                      \u0027%(node_uuid)s. Reason: %(error)s.\u0027),"},{"line_number":95,"context_line":"                  {\u0027node_uuid\u0027: node.uuid,"},{"line_number":96,"context_line":"                   \u0027error\u0027: exc})"},{"line_number":97,"context_line":"        raise exception.DracOperationError(error\u003dstr(exc))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def set_config(task, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a629dbe_823c8ee3","line":97,"updated":"2016-11-09 12:51:13.000000000","message":"I\u0027m not sure I understand how is this different from the current situation, error gets converted to the string during the substitution to _msg_fmt here - https://github.com/openstack/ironic/blob/5603a215b726ca465eed2867d830821bb24b1a72/ironic/common/exception.py#L499 as error is specified as a string value there.","commit_id":"ed55c31fd540565d72ff7ce188cc6edb2be738b8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"58e1e0af5f82c2d4826fc5e8a2930b2c47719052","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                      \u0027%(node_uuid)s. Reason: %(error)s.\u0027),"},{"line_number":95,"context_line":"                  {\u0027node_uuid\u0027: node.uuid,"},{"line_number":96,"context_line":"                   \u0027error\u0027: exc})"},{"line_number":97,"context_line":"        raise exception.DracOperationError(error\u003dstr(exc))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def set_config(task, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a629dbe_9b5f62e4","line":97,"in_reply_to":"9a629dbe_099b3073","updated":"2016-11-10 12:52:29.000000000","message":"OK, I think I get the problem now, and what you\u0027re doing indeed fixes it. Please use six.text_type instead of str, as if the drac exception will ever contain unicode, this will break on PY2.","commit_id":"ed55c31fd540565d72ff7ce188cc6edb2be738b8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"dc8cad2186571ece6d41049229c1c5091ec1f293","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                      \u0027%(node_uuid)s. Reason: %(error)s.\u0027),"},{"line_number":95,"context_line":"                  {\u0027node_uuid\u0027: node.uuid,"},{"line_number":96,"context_line":"                   \u0027error\u0027: exc})"},{"line_number":97,"context_line":"        raise exception.DracOperationError(error\u003dstr(exc))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def set_config(task, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a629dbe_099b3073","line":97,"in_reply_to":"9a629dbe_49a288fe","updated":"2016-11-09 19:25:14.000000000","message":"And by the way, there is no actual circular reference here, it\u0027s just json serializer gets the same object after trying to convert the exception to primitive, as there is no way provided to it to do serialization, and considers it a circular reference - https://github.com/python/cpython/blob/master/Lib/json/encoder.py#L432-L438 (or at least I think that\u0027s what\u0027s going on)","commit_id":"ed55c31fd540565d72ff7ce188cc6edb2be738b8"},{"author":{"_account_id":23847,"name":"Richard G. Pioso","email":"richard.pioso@gmail.com","username":"richard.pioso"},"change_message_id":"fcc23736fbd16b919b870ee101f30a54009ac689","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                      \u0027%(node_uuid)s. Reason: %(error)s.\u0027),"},{"line_number":95,"context_line":"                  {\u0027node_uuid\u0027: node.uuid,"},{"line_number":96,"context_line":"                   \u0027error\u0027: exc})"},{"line_number":97,"context_line":"        raise exception.DracOperationError(error\u003dstr(exc))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def set_config(task, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a629dbe_9c2861e4","line":97,"in_reply_to":"9a629dbe_823c8ee3","updated":"2016-11-09 18:03:22.000000000","message":"_msg_fmt and its use are not involved in the circular reference. It turns out that class IronicException __init__()\u0027s assignment of its \u0027kwargs\u0027 argument to the instance variable \u0027self.kwargs\u0027 is -- https://github.com/openstack/ironic/blob/master/ironic/common/exception.py#L50.\n\nIf the \u0027error\u0027 kwarg contains a reference to the exception, a circular reference is created. If instead its value is a string, the code works as expected.","commit_id":"ed55c31fd540565d72ff7ce188cc6edb2be738b8"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5850aa5f527186de51fb9d61abe5515a9e4f532a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                      \u0027%(node_uuid)s. Reason: %(error)s.\u0027),"},{"line_number":95,"context_line":"                  {\u0027node_uuid\u0027: node.uuid,"},{"line_number":96,"context_line":"                   \u0027error\u0027: exc})"},{"line_number":97,"context_line":"        raise exception.DracOperationError(error\u003dstr(exc))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def set_config(task, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a629dbe_49a288fe","line":97,"in_reply_to":"9a629dbe_9c2861e4","updated":"2016-11-09 19:17:34.000000000","message":"Ah, I see, so oslo_messaging can not serialize the exception. I think if you add drac operation error here in the list of expected exceptions, that would be a proper fix - https://github.com/openstack/ironic/blob/8b6894483b4d86189c48fbe414272761dbe5c933/ironic/conductor/manager.py#L189.\n\nOTOH, I\u0027m not sure that we should add all possible vendor exceptions there, maybe you subclass drac operation error from one of those? Or create a new generic error, like VendorException, and then add it to decorator and use as a base class for exceptions raised from vendor passthru.","commit_id":"ed55c31fd540565d72ff7ce188cc6edb2be738b8"}],"releasenotes/notes/drac-fix-set_bios_config-vendor-passthru-timeout-e1717259f064ed79.yaml":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7393d89f7404948299bd9ffbe89ce6e30b0dc644","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Fixes an issue which caused the DRAC driver (``pxe_drac``)"},{"line_number":4,"context_line":"    ``set_bios_config()`` vendor passthru method to fail due to a timeout while"},{"line_number":5,"context_line":"    waiting for a reply to a message. Specifying an unknown BIOS attribute or"},{"line_number":6,"context_line":"    setting an attribute to an invalid value encountered it. The intended"},{"line_number":7,"context_line":"    exception now occurs. For more information, see"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"9a629dbe_d6b37198","line":4,"updated":"2016-11-10 13:14:32.000000000","message":"This issue hits all drac vendor passthru methods, as they are all synchronous.","commit_id":"ed55c31fd540565d72ff7ce188cc6edb2be738b8"}]}
