)]}'
{"ironic/conductor/utils.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"d315807ac8b925b5a6d81048bd63c34a99157a2e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            task.power.driver._set_boot_device(task, node, device, persistent)"},{"line_number":39,"context_line":"        except Exception as e:"},{"line_number":40,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":41,"context_line":"                node[\u0027last_error\u0027] \u003d \\"},{"line_number":42,"context_line":"                    _(\"Failed to change boot device to \u0027%(device)s\u0027. \""},{"line_number":43,"context_line":"                      \"Error: %(error)s\") % {"},{"line_number":44,"context_line":"                        \u0027device\u0027: device, \u0027error\u0027: e}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9jq0%3D","line":41,"updated":"2014-02-06 03:00:39.000000000","message":"We are getting away from \u0027\\\u0027 and using \u0027(......)\u0027, so can you remove  \u0027\\\u0027 here?","commit_id":"0d3d4e28cb634085bae4e52b1a17adc3701b9621"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4cfd7287606adb3e1750edb31f9d84928c4e8c48","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            task.power.driver._set_boot_device(task, node, device, persistent)"},{"line_number":39,"context_line":"        except Exception as e:"},{"line_number":40,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":41,"context_line":"                node[\u0027last_error\u0027] \u003d \\"},{"line_number":42,"context_line":"                    _(\"Failed to change boot device to \u0027%(device)s\u0027. \""},{"line_number":43,"context_line":"                      \"Error: %(error)s\") % {"},{"line_number":44,"context_line":"                        \u0027device\u0027: device, \u0027error\u0027: e}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9jqc%3D","line":41,"in_reply_to":"AAAAUH%2F9jq0%3D","updated":"2014-02-06 03:01:36.000000000","message":"https://review.openstack.org/#/c/66793/","commit_id":"0d3d4e28cb634085bae4e52b1a17adc3701b9621"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e4622426ec5217aac047ae65232195073d445000","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    # Some power drivers like SSH don\u0027t support setting a boot device"},{"line_number":36,"context_line":"    if hasattr(task.driver.power, \u0027_set_boot_device\u0027):"},{"line_number":37,"context_line":"        try:"},{"line_number":38,"context_line":"            task.power.driver._set_boot_device(task, node, device, persistent)"},{"line_number":39,"context_line":"        except Exception as e:"},{"line_number":40,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":41,"context_line":"                node[\u0027last_error\u0027] \u003d _(\"Failed to change boot device to \""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9iAw%3D","line":38,"updated":"2014-02-06 09:06:21.000000000","message":"Maybe will be better add set_boot_device to public methods of power interface and use stub if driver don\u0027t support this.","commit_id":"24193b87846b1a29e239a8e1e4309e305d91fd56"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"8bdafd115a184f657037712966eb0fba40cd7721","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    # Some power drivers like SSH don\u0027t support setting a boot device"},{"line_number":36,"context_line":"    if hasattr(task.driver.power, \u0027_set_boot_device\u0027):"},{"line_number":37,"context_line":"        try:"},{"line_number":38,"context_line":"            task.power.driver._set_boot_device(task, node, device, persistent)"},{"line_number":39,"context_line":"        except Exception as e:"},{"line_number":40,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":41,"context_line":"                node[\u0027last_error\u0027] \u003d _(\"Failed to change boot device to \""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9iUg%3D","line":38,"updated":"2014-02-06 09:06:38.000000000","message":"We should not be directly calling a private method.\n\nAlso, just for reference, the property names are reversed. It is\n\n  task.driver.power.method","commit_id":"24193b87846b1a29e239a8e1e4309e305d91fd56"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"80e11c4f03055ba4add55781efb71634d2e699c2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    # Some power drivers like SSH don\u0027t support setting a boot device"},{"line_number":36,"context_line":"    if hasattr(task.driver.power, \u0027_set_boot_device\u0027):"},{"line_number":37,"context_line":"        try:"},{"line_number":38,"context_line":"            task.power.driver._set_boot_device(task, node, device, persistent)"},{"line_number":39,"context_line":"        except Exception as e:"},{"line_number":40,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":41,"context_line":"                node[\u0027last_error\u0027] \u003d _(\"Failed to change boot device to \""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9hxM%3D","line":38,"in_reply_to":"AAAAUH%2F9iUg%3D","updated":"2014-02-06 10:06:11.000000000","message":"Agree, we should not call private methods from outside the class scope","commit_id":"24193b87846b1a29e239a8e1e4309e305d91fd56"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"9d22991b6c235029b6d13db92da63672e2177bec","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    # Some power drivers like SSH don\u0027t support setting a boot device"},{"line_number":37,"context_line":"    try:"},{"line_number":38,"context_line":"        task.driver.vendor.vendor_passthru(task, node,"},{"line_number":39,"context_line":"                                           device\u003ddevice,"},{"line_number":40,"context_line":"                                           persistent\u003dpersistent,"},{"line_number":41,"context_line":"                                           method\u003d\u0027set_boot_device\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2B4Lk%3D","line":38,"updated":"2014-02-18 13:24:24.000000000","message":"And what about validate info?","commit_id":"114df3b523ddfbd418548e212b9c9ae6d0bb30dc"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"9d22991b6c235029b6d13db92da63672e2177bec","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                                           device\u003ddevice,"},{"line_number":40,"context_line":"                                           persistent\u003dpersistent,"},{"line_number":41,"context_line":"                                           method\u003d\u0027set_boot_device\u0027)"},{"line_number":42,"context_line":"    except exception.InvalidParameterValue:"},{"line_number":43,"context_line":"        pass"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUX%2F%2B4Pc%3D","line":42,"updated":"2014-02-18 13:24:24.000000000","message":"IMO this not needed\n1) I see that in current PXE driver code all methods except \u0027pass_deploy_info\u0027 silently ignored 2) we can pass wrong \u0027device\u0027 parameter for example and error will be ignored","commit_id":"114df3b523ddfbd418548e212b9c9ae6d0bb30dc"}],"ironic/drivers/modules/ipminative.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"e11ec3ec4f9dd6e7bc188b5ce29ec7fc9b83e792","unresolved":false,"context_lines":[{"line_number":42,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"VENDOR_PASSTHRU_METHODS \u003d [\u0027set_boot_device\u0027]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _parse_driver_info(node):"},{"line_number":48,"context_line":"    \"\"\"Gets the bmc access info for the given node."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bjg4%3D","line":45,"updated":"2014-02-20 15:23:48.000000000","message":"Where will we use this property?","commit_id":"4933b64f90e34b0a2629e3feab1e612797e90b22"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"5703e5f4c8ef879ec34fc0bf116bbfd518586590","unresolved":false,"context_lines":[{"line_number":42,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"VENDOR_PASSTHRU_METHODS \u003d [\u0027set_boot_device\u0027]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _parse_driver_info(node):"},{"line_number":48,"context_line":"    \"\"\"Gets the bmc access info for the given node."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bi%2FQ%3D","line":45,"in_reply_to":"AAAAUX%2F%2Bjg4%3D","updated":"2014-02-20 15:49:59.000000000","message":"This property will be used by utils.MultipleVendorInterface so we can route the methods to the appropiate driver","commit_id":"4933b64f90e34b0a2629e3feab1e612797e90b22"}],"ironic/drivers/modules/pxe.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e4622426ec5217aac047ae65232195073d445000","unresolved":false,"context_lines":[{"line_number":682,"context_line":""},{"line_number":683,"context_line":"    def vendor_passthru(self, task, node, **kwargs):"},{"line_number":684,"context_line":"        method \u003d kwargs[\u0027method\u0027]"},{"line_number":685,"context_line":"        if method \u003d\u003d \u0027set_boot_device\u0027:"},{"line_number":686,"context_line":"            return node.driver.vendor._set_boot_device("},{"line_number":687,"context_line":"                        task, node,"},{"line_number":688,"context_line":"                        kwargs.get(\u0027device\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9iBM%3D","line":685,"updated":"2014-02-06 09:06:21.000000000","message":"Why this code here?","commit_id":"24193b87846b1a29e239a8e1e4309e305d91fd56"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"e11ec3ec4f9dd6e7bc188b5ce29ec7fc9b83e792","unresolved":false,"context_lines":[{"line_number":741,"context_line":"                        kwargs.get(\u0027device\u0027),"},{"line_number":742,"context_line":"                        kwargs.get(\u0027persistent\u0027))"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"        elif method \u003d\u003d \u0027pass_deploy_info\u0027:"},{"line_number":745,"context_line":"            ctx \u003d task.context"},{"line_number":746,"context_line":"            with task_manager.acquire(ctx, node[\u0027uuid\u0027]) as inner_task:"},{"line_number":747,"context_line":"                self._continue_deploy(inner_task, node, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2Bjd4%3D","side":"PARENT","line":744,"updated":"2014-02-20 15:23:48.000000000","message":"As per ironic/conductor/utils.py, set_boot_device will be called through vendor_passtrhu, so why we removing it from here? Or it will be the new routing stuff and we will actually call ipmi ?","commit_id":"2fef4d5558ae6b3c420943209a7e77555cd9731f"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"5703e5f4c8ef879ec34fc0bf116bbfd518586590","unresolved":false,"context_lines":[{"line_number":741,"context_line":"                        kwargs.get(\u0027device\u0027),"},{"line_number":742,"context_line":"                        kwargs.get(\u0027persistent\u0027))"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"        elif method \u003d\u003d \u0027pass_deploy_info\u0027:"},{"line_number":745,"context_line":"            ctx \u003d task.context"},{"line_number":746,"context_line":"            with task_manager.acquire(ctx, node[\u0027uuid\u0027]) as inner_task:"},{"line_number":747,"context_line":"                self._continue_deploy(inner_task, node, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BjCI%3D","side":"PARENT","line":744,"in_reply_to":"AAAAUX%2F%2Bjd4%3D","updated":"2014-02-20 15:49:59.000000000","message":"Before this review, we have \n\nself.vendor \u003d pxe.VendorPassthru()\n\nbut pxe does not provides the set_boot_device, so the call in line #739\n\nreturn node.driver.vendor._set_boot_device\n\nwill always fail. That\u0027s the intention of this multiplexed driver between pxe and ipmi*. The multiplex will be the one routing to the valid driver and validate it.","commit_id":"2fef4d5558ae6b3c420943209a7e77555cd9731f"}],"ironic/drivers/pxe.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"e11ec3ec4f9dd6e7bc188b5ce29ec7fc9b83e792","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.power \u003d ipminative.NativeIPMIPower()"},{"line_number":77,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":78,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":79,"context_line":"        self.vendor \u003d utils.MultipleVendorInterface(pxe, ipminative)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BjRQ%3D","line":79,"updated":"2014-02-20 15:23:48.000000000","message":"Sorry, maybe I missed this already, but did we already agree that we will use multiplexed vendor interfaces even in our default drivers? I thought it\u0027s something extraordinary.. This makes code harder to understand, so maybe, at least for standard drivers, to solve this in some other way?","commit_id":"4933b64f90e34b0a2629e3feab1e612797e90b22"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"5703e5f4c8ef879ec34fc0bf116bbfd518586590","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.power \u003d ipminative.NativeIPMIPower()"},{"line_number":77,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":78,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":79,"context_line":"        self.vendor \u003d utils.MultipleVendorInterface(pxe, ipminative)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BjFI%3D","line":79,"in_reply_to":"AAAAUX%2F%2BjRQ%3D","updated":"2014-02-20 15:49:59.000000000","message":"PXE driver provides pass_deploy_info and ipmi* provide set_boot_device. The way to merge both is via multiplexed.","commit_id":"4933b64f90e34b0a2629e3feab1e612797e90b22"}],"ironic/tests/conductor/test_conductor_utils.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"e11ec3ec4f9dd6e7bc188b5ce29ec7fc9b83e792","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from ironic.tests.db import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class NodeSetBootDevice(base.DbTestCase):"},{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        super(NodeSetBootDevice, self).setUp()"},{"line_number":32,"context_line":"        self.context \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BjSQ%3D","line":29,"updated":"2014-02-20 15:23:48.000000000","message":"pls rename to NodeSetBootDeviceTestCase","commit_id":"4933b64f90e34b0a2629e3feab1e612797e90b22"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"5703e5f4c8ef879ec34fc0bf116bbfd518586590","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from ironic.tests.db import utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class NodeSetBootDevice(base.DbTestCase):"},{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        super(NodeSetBootDevice, self).setUp()"},{"line_number":32,"context_line":"        self.context \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2BjB4%3D","line":29,"in_reply_to":"AAAAUX%2F%2BjSQ%3D","updated":"2014-02-20 15:49:59.000000000","message":"Done","commit_id":"4933b64f90e34b0a2629e3feab1e612797e90b22"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"a55f53cdcdc0cc812e8f704bf8ebeb53955b7bf0","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class NodeSetBootDeviceTestCase(base.DbTestCase):"},{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        super(NodeSetBootDevice, self).setUp()"},{"line_number":32,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":33,"context_line":"        self.dbapi \u003d dbapi.get_instance()"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bh9I%3D","line":31,"updated":"2014-02-20 17:18:36.000000000","message":"should this be: NodeSetBootDeviceTestCase???","commit_id":"5e61f6af3e270354f062da426513e986d582d082"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b7cfeb03b1fa764241016b267cabbe5cd6f6e4f2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":33,"context_line":"        self.dbapi \u003d dbapi.get_instance()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        def test_node_set_boot_device_non_valid(self):"},{"line_number":36,"context_line":"            self.driver \u003d mgr_utils.get_mocked_node_manager(driver\u003d\u0027fake\u0027)"},{"line_number":37,"context_line":"            ndict \u003d utils.get_test_node(uuid\u003dcmn_utils.generate_uuid(),"},{"line_number":38,"context_line":"                                        driver\u003d\u0027fake\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bh3Y%3D","line":35,"updated":"2014-02-20 17:27:40.000000000","message":"This test seems to not be correctly indented","commit_id":"5e61f6af3e270354f062da426513e986d582d082"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"57ff5ac435ee1c69474cca63558c7dda855c564c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                          conductor_utils.node_set_boot_device,"},{"line_number":43,"context_line":"                          task,"},{"line_number":44,"context_line":"                          task.node,"},{"line_number":45,"context_line":"                          device\u003d\u0027fake\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_node_set_boot_device_valid(self):"},{"line_number":48,"context_line":"        self.driver \u003d mgr_utils.get_mocked_node_manager(driver\u003d\u0027fake_ipmitool\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FycM%3D","line":45,"updated":"2014-02-24 19:32:29.000000000","message":"same comment as for other patch - pls change to \u0027non-existent-device\u0027","commit_id":"aefaaa0e6e76951be6b4edd7ca8f404d4ebda54d"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"8825096f7a912b4a3a9ab13cfbf42260f07e63e0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                          conductor_utils.node_set_boot_device,"},{"line_number":43,"context_line":"                          task,"},{"line_number":44,"context_line":"                          task.node,"},{"line_number":45,"context_line":"                          device\u003d\u0027fake\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_node_set_boot_device_valid(self):"},{"line_number":48,"context_line":"        self.driver \u003d mgr_utils.get_mocked_node_manager(driver\u003d\u0027fake_ipmitool\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2F3nQ%3D","line":45,"in_reply_to":"AAAAU3%2F%2FycM%3D","updated":"2014-03-03 18:07:16.000000000","message":"Done","commit_id":"aefaaa0e6e76951be6b4edd7ca8f404d4ebda54d"}],"ironic/tests/drivers/test_pxe.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"8bdafd115a184f657037712966eb0fba40cd7721","unresolved":false,"context_lines":[{"line_number":560,"context_line":"                        state \u003d task.driver.deploy.deploy(task, self.node)"},{"line_number":561,"context_line":"                        self.assertEqual(state, states.DEPLOYING)"},{"line_number":562,"context_line":"                        update_neutron_mock.assert_called_once_with(task,"},{"line_number":563,"context_line":"                                                                    self.node)"},{"line_number":564,"context_line":"                        node_set_boot_mock.assert_calletd_once_with(task,"},{"line_number":565,"context_line":"                                                                    self.node,"},{"line_number":566,"context_line":"                                                                    \u0027pxe\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9iCU%3D","line":563,"updated":"2014-02-06 09:06:38.000000000","message":"typo \"calletd\" is causing this test to pass even though the mocked method is never actually called. See my comment in utils.py","commit_id":"24193b87846b1a29e239a8e1e4309e305d91fd56"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"80e11c4f03055ba4add55781efb71634d2e699c2","unresolved":false,"context_lines":[{"line_number":564,"context_line":"                        node_set_boot_mock.assert_calletd_once_with(task,"},{"line_number":565,"context_line":"                                                                    self.node,"},{"line_number":566,"context_line":"                                                                    \u0027pxe\u0027,"},{"line_number":567,"context_line":"                                                                    True)"},{"line_number":568,"context_line":"                        node_power_mock.assert_called_once_with(task,"},{"line_number":569,"context_line":"                                                                self.node,"},{"line_number":570,"context_line":"                                                                states.REBOOT)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9hrc%3D","line":567,"updated":"2014-02-06 10:06:11.000000000","message":"It\u0027s a very odd behavior, by fixing the typo the test will fail with: http://paste.openstack.org/show/62771/\n\nwondering why this typo is not causing it to raise an AttributeError","commit_id":"24193b87846b1a29e239a8e1e4309e305d91fd56"}]}
