)]}'
{"ironic/drivers/fake.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.vendor \u003d self.power"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class FakeSeaMicroDriver(base.BaseDriver):"},{"line_number":75,"context_line":"    \"\"\" Fake SeaMicro driver.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self):"},{"line_number":78,"context_line":"        self.power \u003d seamicro.Power()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fuqg%3D","line":75,"updated":"2014-02-11 07:47:55.000000000","message":"The space is not required here I think, suggest:\n\n    \"\"\"Fake SeaMicro driver.\"\"\"","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.vendor \u003d self.power"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class FakeSeaMicroDriver(base.BaseDriver):"},{"line_number":75,"context_line":"    \"\"\" Fake SeaMicro driver.\"\"\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self):"},{"line_number":78,"context_line":"        self.power \u003d seamicro.Power()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FtAg%3D","line":75,"in_reply_to":"AAAAUX%2F%2Fuqg%3D","updated":"2014-02-11 15:17:52.000000000","message":"Done","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"242f2cc653670bca2873c9b97be8dfbc297f0729","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __init__(self):"},{"line_number":82,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        a \u003d fake.FakeVendorA()"},{"line_number":86,"context_line":"        b \u003d fake.FakeVendorB()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B46Y%3D","line":83,"updated":"2014-02-18 12:08:49.000000000","message":"fake.FakeDeploy() IMO should be here for fake driver.","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"650975d95959654d5c3f3e79b1a174ca04a61fc8","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __init__(self):"},{"line_number":82,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        a \u003d fake.FakeVendorA()"},{"line_number":86,"context_line":"        b \u003d fake.FakeVendorB()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bw4U%3D","line":83,"in_reply_to":"AAAAUX%2F%2B46Y%3D","updated":"2014-02-19 12:11:00.000000000","message":"Done","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"242f2cc653670bca2873c9b97be8dfbc297f0729","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        a \u003d fake.FakeVendorA()"},{"line_number":86,"context_line":"        b \u003d fake.FakeVendorB()"},{"line_number":87,"context_line":"        self.vendor \u003d fake.MultipleVendorInterface(a, b)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B400%3D","line":85,"updated":"2014-02-18 12:08:49.000000000","message":"Lines 85-87 IMO should not be part of FakeSeaMicroDriver.","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"650975d95959654d5c3f3e79b1a174ca04a61fc8","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.power \u003d seamicro.Power()"},{"line_number":83,"context_line":"        self.deploy \u003d pxe.PXEDeploy()"},{"line_number":84,"context_line":"        self.rescue \u003d self.deploy"},{"line_number":85,"context_line":"        a \u003d fake.FakeVendorA()"},{"line_number":86,"context_line":"        b \u003d fake.FakeVendorB()"},{"line_number":87,"context_line":"        self.vendor \u003d fake.MultipleVendorInterface(a, b)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2Bw30%3D","line":85,"in_reply_to":"AAAAUX%2F%2B400%3D","updated":"2014-02-19 12:11:00.000000000","message":"Can you explain why it should not be part of the FakeSeaMicroDriver? Since this was done specifically to multiplex 2 vendor passthrus.","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"}],"ironic/drivers/modules/seamicro.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"242f2cc653670bca2873c9b97be8dfbc297f0729","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Provides basic power control of servers in SeaMicro chassis via"},{"line_number":18,"context_line":"python-seamicroclient."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Provides vendor passthru methods for SeaMicro specific functionality."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B44I%3D","line":20,"updated":"2014-02-18 12:08:49.000000000","message":"I don\u0027t see vendor passthru functionality in this module.","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"650975d95959654d5c3f3e79b1a174ca04a61fc8","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Provides basic power control of servers in SeaMicro chassis via"},{"line_number":18,"context_line":"python-seamicroclient."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Provides vendor passthru methods for SeaMicro specific functionality."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BwxM%3D","line":20,"in_reply_to":"AAAAUX%2F%2B44I%3D","updated":"2014-02-19 12:11:00.000000000","message":"Removed, since the vendor passthru feature is in another review.","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"6ab656da99cb8792e44355e8c1ce5b1924748154","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    username \u003d info.get(\u0027username\u0027, None)"},{"line_number":76,"context_line":"    password \u003d info.get(\u0027password\u0027, None)"},{"line_number":77,"context_line":"    server_id \u003d info.get(\u0027server_id\u0027, None)"},{"line_number":78,"context_line":"    api_version \u003d info.get(\u0027api_version\u0027, \"2\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    if not api_endpoint:"},{"line_number":81,"context_line":"        raise exception.InvalidParameterValue(_("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BkxU%3D","line":78,"updated":"2014-02-20 12:41:59.000000000","message":"I think we should use unique prefix (\u0027seamicro_\u0027 ?) for options names as is in another drivers.","commit_id":"5c38d0a83041538381061f870603f10de9ef54b8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"cd9df3756031bcbc586959a899fb6b9d5c2dc17f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVn%2F%2F2JQ%3D","line":1,"updated":"2014-03-03 21:35:13.000000000","message":"Please remove the vim config line, there was a bigger discussion about it on openstack[1], and some patches already landed in ironic and ironic client to remove these lines:\n\n\n[1] http://openstack.10931.n7.nabble.com/Remove-vim-modelines-td21780.html\n[2] https://review.openstack.org/#/c/73160/\n[3] https://review.openstack.org/#/c/73166","commit_id":"ba207b4aa086da32df891b8627515acc93830da8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"cd9df3756031bcbc586959a899fb6b9d5c2dc17f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    api_endpoint \u003d info.get(\u0027seamicro_api_endpoint\u0027, None)"},{"line_number":75,"context_line":"    username \u003d info.get(\u0027seamicro_username\u0027, None)"},{"line_number":76,"context_line":"    password \u003d info.get(\u0027seamicro_password\u0027, None)"},{"line_number":77,"context_line":"    server_id \u003d info.get(\u0027seamicro_server_id\u0027, None)"},{"line_number":78,"context_line":"    api_version \u003d info.get(\u0027seamicro_api_version\u0027, \"2\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    if not api_endpoint:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVn%2F%2F2Os%3D","line":77,"updated":"2014-03-03 21:35:13.000000000","message":"syntax nit: by default get() returns None so don\u0027t need to pass it explicitly, other parts of ironic was fixed by another patch[1]\n\n[1] https://review.openstack.org/#/c/72632/","commit_id":"ba207b4aa086da32df891b8627515acc93830da8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"cd9df3756031bcbc586959a899fb6b9d5c2dc17f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            return states.POWER_ON"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    except seamicro_client_exception.NotFound:"},{"line_number":127,"context_line":"        raise exception.NodeNotFound(node\u003dseamicro_info[\u0027uuid\u0027])"},{"line_number":128,"context_line":"    except seamicro_client_exception.ClientException as ex:"},{"line_number":129,"context_line":"        LOG.error(_(\"SeaMicro client exception %(msg)s for node %(uuid)s\"),"},{"line_number":130,"context_line":"                  {\u0027msg\u0027: ex.message, \u0027uuid\u0027: seamicro_info[\u0027uuid\u0027]})"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVn%2F%2F1ck%3D","line":127,"updated":"2014-03-03 21:35:13.000000000","message":"Nit: It looks a bit obscure to use seamicro_info[\u0027uuid\u0027] for the node\u0027s uuid because the node object or the task object (which contains a node object) is being passed as paramter for pretty much all the functions/methods.\n\nSo just for clarity I would use node.uuid here.\n\n - same comment applies for the whole file -","commit_id":"ba207b4aa086da32df891b8627515acc93830da8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"cd9df3756031bcbc586959a899fb6b9d5c2dc17f","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        :param task: A instance of `ironic.manager.task_manager.TaskManager`."},{"line_number":282,"context_line":"        :param node: A single node."},{"line_number":283,"context_line":"        :param pstate: Either POWER_ON or POWER_OFF from :class:"},{"line_number":284,"context_line":"            `ironic.common.states`."},{"line_number":285,"context_line":"        \"\"\""},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        if pstate \u003d\u003d states.POWER_ON:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAVn%2F%2F1ic%3D","line":284,"updated":"2014-03-03 21:35:13.000000000","message":"Almost all methods docstring in this file but validate() doesn\u0027t document the exceptions it raises\n\n - same comment applies for the whole file -","commit_id":"ba207b4aa086da32df891b8627515acc93830da8"}],"ironic/drivers/modules/seamicro/driver.py":[{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"a07b61e3555e39ddacae51251ecd8b10af0d4b75","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2F4PM%3D","line":1,"updated":"2014-02-10 08:36:54.000000000","message":"Being an only file, is there a reason to be inside a folder? It\u0027s the only driver with that approach.","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    ]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"},{"line_number":42,"context_line":"CONF.register_opts(opts)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gTQ%3D","line":42,"updated":"2014-02-06 13:32:35.000000000","message":"Even though we have only one option now, I think we will add more options in future, so it is better that we create a separate section/section for seamicro options:\n\n    opt_group \u003d cfg.OptGroup(name\u003d\u0027seamicro\u0027,\n                         title\u003d\u0027Options for the seamicro power driver\u0027)\n    CONF.register_group(opt_group)\n    CONF.register_opts(opts, opt_group)","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"a07b61e3555e39ddacae51251ecd8b10af0d4b75","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    ]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"},{"line_number":42,"context_line":"CONF.register_opts(opts)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2F4O4%3D","line":42,"in_reply_to":"AAAAUH%2F9gTQ%3D","updated":"2014-02-10 08:36:54.000000000","message":"+1","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"abfa8a4b451ba4efc149dfb98f30af7efb3a99bb","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    except seamicro_client_exception.ClientException as ex:"},{"line_number":126,"context_line":"        msg \u003d \"\"\"SeaMicro client exception %s for node"},{"line_number":127,"context_line":"         %s\"\"\" % (ex.message, seamicro_info[\u0027uuid\u0027])"},{"line_number":128,"context_line":"        LOG.error(_(msg))"},{"line_number":129,"context_line":"        raise exception.ServiceUnavailable()"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9y94%3D","line":128,"updated":"2014-02-03 21:21:30.000000000","message":"For python logging, don\u0027t interpolate here. Instead do\n\nLOG.error(_(\"SeaMicro client exception %s for node %s\"), \n\t    ex.message, seamicro_info[\u0027uuid\u0027])","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"abfa8a4b451ba4efc149dfb98f30af7efb3a99bb","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            server.power_on()"},{"line_number":158,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":159,"context_line":"            LOG.warning(_(\"Power-on failed for node %s.\")"},{"line_number":160,"context_line":"                        % seamicro_info[\u0027uuid\u0027])"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_power_on,"},{"line_number":163,"context_line":"                                                 state, retries)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9y5M%3D","line":160,"updated":"2014-02-03 21:21:30.000000000","message":"Same here about logging.","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"abfa8a4b451ba4efc149dfb98f30af7efb3a99bb","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            server.power_off()"},{"line_number":194,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":195,"context_line":"            LOG.warning(_(\"Power-off failed for node %s.\")"},{"line_number":196,"context_line":"                        % seamicro_info[\u0027uuid\u0027])"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_power_off,"},{"line_number":199,"context_line":"                                                 state, retries)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9y5I%3D","line":196,"updated":"2014-02-03 21:21:30.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    return state[0]"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"def _reboot(node, timeout\u003d30):"},{"line_number":205,"context_line":"    \"\"\" Reboot this node"},{"line_number":206,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":207,"context_line":"    :param timeout: Time in seconds to wait till reboot is compelete"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gPM%3D","line":204,"updated":"2014-02-06 13:32:35.000000000","message":"How do you think this timeout should be defined as an option for our seamicro power driver?","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":1726,"name":"Ghe Rivero","email":"ghe.rivero@gmail.com","username":"ghe.rivero"},"change_message_id":"a07b61e3555e39ddacae51251ecd8b10af0d4b75","unresolved":false,"context_lines":[{"line_number":213,"context_line":"    seamicro_info \u003d _parse_driver_info(node)"},{"line_number":214,"context_line":"    server \u003d _get_server(seamicro_info)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _wait_for_reboot(state, retries):"},{"line_number":217,"context_line":"        \"\"\"Called at an interval until the node is rebooted successfully.\"\"\""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        state[0] \u003d _get_power_status(node)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2F4Cs%3D","line":216,"updated":"2014-02-10 08:36:54.000000000","message":"The three _wait_for_ are very similar.  Could be combined.","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"abfa8a4b451ba4efc149dfb98f30af7efb3a99bb","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            server.reset()"},{"line_number":230,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":231,"context_line":"            LOG.warning(_(\"Reboot failed for node %s.\")"},{"line_number":232,"context_line":"                        % seamicro_info[\u0027uuid\u0027])"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_reboot,"},{"line_number":235,"context_line":"                                                 state, retries)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9y5E%3D","line":232,"updated":"2014-02-03 21:21:30.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    cfg.IntOpt(\u0027action_timeout\u0027,"},{"line_number":40,"context_line":"               default\u003d10,"},{"line_number":41,"context_line":"               help\u003d\u0027Seconds to wait for power action to be completed\u0027)"},{"line_number":42,"context_line":"]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"CONF \u003d cfg.CONF"},{"line_number":45,"context_line":"opt_group \u003d cfg.OptGroup(name\u003d\u0027seamicro\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fuso%3D","line":42,"updated":"2014-02-11 07:47:55.000000000","message":"We add new these options, however we missed to run script [1] to sync the ironic.conf.sample file and check the new one auto-generated by the script in.\n\n\n[1] ./tools/config/generate_sample.sh","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    cfg.IntOpt(\u0027action_timeout\u0027,"},{"line_number":40,"context_line":"               default\u003d10,"},{"line_number":41,"context_line":"               help\u003d\u0027Seconds to wait for power action to be completed\u0027)"},{"line_number":42,"context_line":"]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"CONF \u003d cfg.CONF"},{"line_number":45,"context_line":"opt_group \u003d cfg.OptGroup(name\u003d\u0027seamicro\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fs8c%3D","line":42,"in_reply_to":"AAAAUX%2F%2Fuso%3D","updated":"2014-02-11 15:17:52.000000000","message":"Done","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    :param username: SeaMicro API username"},{"line_number":57,"context_line":"    :param password: SeaMicro API password"},{"line_number":58,"context_line":"    :param auth_url: SeaMicro API endpoint"},{"line_number":59,"context_line":"    :param api_version: SeaMicro API version"},{"line_number":60,"context_line":"    :returns: SeaMicro API client"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fuog%3D","line":59,"updated":"2014-02-11 07:47:55.000000000","message":"Not sure where these param are from args or kwargs? Suggest to doc them clearly:\n\n        :param args: ...\n        :param kwargs:  A dict of keyword arguments to be passed to the method, \n                        which should contain: ‘username’, ‘password’, ‘auth_url’, ‘api_version’ parameters.","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    :param username: SeaMicro API username"},{"line_number":57,"context_line":"    :param password: SeaMicro API password"},{"line_number":58,"context_line":"    :param auth_url: SeaMicro API endpoint"},{"line_number":59,"context_line":"    :param api_version: SeaMicro API version"},{"line_number":60,"context_line":"    :returns: SeaMicro API client"},{"line_number":61,"context_line":"    \"\"\""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fs7M%3D","line":59,"in_reply_to":"AAAAUX%2F%2Fuog%3D","updated":"2014-02-11 15:17:52.000000000","message":"Done","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":69,"context_line":"def _parse_driver_info(node):"},{"line_number":70,"context_line":"    \"\"\" Parses and creates seamicro driver info"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":73,"context_line":"    :returns: SeaMicro driver info"},{"line_number":74,"context_line":"    \"\"\""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FuoU%3D","line":72,"updated":"2014-02-11 07:47:55.000000000","message":"How about this docstring?\n\n    :param node: An Ironic node object.","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":69,"context_line":"def _parse_driver_info(node):"},{"line_number":70,"context_line":"    \"\"\" Parses and creates seamicro driver info"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":73,"context_line":"    :returns: SeaMicro driver info"},{"line_number":74,"context_line":"    \"\"\""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fs4A%3D","line":72,"in_reply_to":"AAAAUX%2F%2FuoU%3D","updated":"2014-02-11 15:17:52.000000000","message":"Done","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":97,"context_line":"           \"api_endpoint\": api_endpoint,"},{"line_number":98,"context_line":"           \"server_id\": server_id,"},{"line_number":99,"context_line":"           \"api_version\": api_version,"},{"line_number":100,"context_line":"           \"uuid\": node.get(\u0027uuid\u0027)}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    return res"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FunE%3D","line":100,"updated":"2014-02-11 07:47:55.000000000","message":"It is better that we keep consistency to use single quotes for these identifier, like the lines L77-L81 we have.","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":97,"context_line":"           \"api_endpoint\": api_endpoint,"},{"line_number":98,"context_line":"           \"server_id\": server_id,"},{"line_number":99,"context_line":"           \"api_version\": api_version,"},{"line_number":100,"context_line":"           \"uuid\": node.get(\u0027uuid\u0027)}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    return res"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fs2s%3D","line":100,"in_reply_to":"AAAAUX%2F%2FunE%3D","updated":"2014-02-11 15:17:52.000000000","message":"Done","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def _get_power_status(node):"},{"line_number":113,"context_line":"    \"\"\" Get current power state of this node"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":116,"context_line":"    :returns: Power state of the given node"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fumw%3D","line":113,"updated":"2014-02-11 07:47:55.000000000","message":"The space after quotes is not required:\n\n     \"\"\"Get current power state of this node","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"b975587923eb4c20aad4e09293764e1425b4d80e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    seamicro_info \u003d _parse_driver_info(node)"},{"line_number":120,"context_line":"    try:"},{"line_number":121,"context_line":"        server \u003d _get_server(seamicro_info)"},{"line_number":122,"context_line":"        if not hasattr(server, \u0027active\u0027) or server.active is None:"},{"line_number":123,"context_line":"            return states.ERROR"},{"line_number":124,"context_line":"        if not server.active:"},{"line_number":125,"context_line":"            return states.POWER_OFF"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F0eg%3D","line":122,"updated":"2014-02-10 16:27:55.000000000","message":"if not getattr(server, \u0027active\u0027, None) ?","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    seamicro_info \u003d _parse_driver_info(node)"},{"line_number":120,"context_line":"    try:"},{"line_number":121,"context_line":"        server \u003d _get_server(seamicro_info)"},{"line_number":122,"context_line":"        if not hasattr(server, \u0027active\u0027) or server.active is None:"},{"line_number":123,"context_line":"            return states.ERROR"},{"line_number":124,"context_line":"        if not server.active:"},{"line_number":125,"context_line":"            return states.POWER_OFF"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FsZo%3D","line":122,"in_reply_to":"AAAAUX%2F%2F0eg%3D","updated":"2014-02-11 15:17:52.000000000","message":"we need to check for True, False and None, 3 conditions. \"if not getattr(server, \u0027active\u0027, None)\" will return states.ERROR even though server.active\u003dFalse","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"b975587923eb4c20aad4e09293764e1425b4d80e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        elif server.active:"},{"line_number":127,"context_line":"            return states.POWER_ON"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    except seamicro_client_exception.NotFound as ex:"},{"line_number":130,"context_line":"        raise exception.NodeNotFound(node\u003dseamicro_info[\u0027uuid\u0027])"},{"line_number":131,"context_line":"    except seamicro_client_exception.ClientException as ex:"},{"line_number":132,"context_line":"        LOG.error(_(\"SeaMicro client exception %s for node %s\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F0eM%3D","line":129,"updated":"2014-02-10 16:27:55.000000000","message":"\u0027ex\u0027 not used here","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"b975587923eb4c20aad4e09293764e1425b4d80e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        raise exception.NodeNotFound(node\u003dseamicro_info[\u0027uuid\u0027])"},{"line_number":131,"context_line":"    except seamicro_client_exception.ClientException as ex:"},{"line_number":132,"context_line":"        LOG.error(_(\"SeaMicro client exception %s for node %s\"),"},{"line_number":133,"context_line":"                  ex.message, seamicro_info[\u0027uuid\u0027])"},{"line_number":134,"context_line":"        raise exception.ServiceUnavailable()"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F0cQ%3D","line":133,"updated":"2014-02-10 16:27:55.000000000","message":"If seamicro client exception has obvious \u0027message\u0027 attribute?","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"b975587923eb4c20aad4e09293764e1425b4d80e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    except seamicro_client_exception.ClientException as ex:"},{"line_number":132,"context_line":"        LOG.error(_(\"SeaMicro client exception %s for node %s\"),"},{"line_number":133,"context_line":"                  ex.message, seamicro_info[\u0027uuid\u0027])"},{"line_number":134,"context_line":"        raise exception.ServiceUnavailable()"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _power_on(node, timeout\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2F0dk%3D","line":134,"updated":"2014-02-10 16:27:55.000000000","message":"IMO specified exception message needed here.","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"9947ea472dcd2576a051f2e420298b2aec9fe699","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    except seamicro_client_exception.ClientException as ex:"},{"line_number":132,"context_line":"        LOG.error(_(\"SeaMicro client exception %s for node %s\"),"},{"line_number":133,"context_line":"                  ex.message, seamicro_info[\u0027uuid\u0027])"},{"line_number":134,"context_line":"        raise exception.ServiceUnavailable()"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _power_on(node, timeout\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fsx4%3D","line":134,"in_reply_to":"AAAAUX%2F%2F0dk%3D","updated":"2014-02-11 15:17:52.000000000","message":"Done","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"def _power_on(node, timeout\u003dNone):"},{"line_number":138,"context_line":"    \"\"\" Power ON this node"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":141,"context_line":"    :param timeout: Time in seconds to wait till power on is complete"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fumg%3D","line":138,"updated":"2014-02-11 07:47:55.000000000","message":"ditto","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"def _power_on(node, timeout\u003dNone):"},{"line_number":138,"context_line":"    \"\"\" Power ON this node"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":141,"context_line":"    :param timeout: Time in seconds to wait till power on is complete"},{"line_number":142,"context_line":"    :returns: Power state of the given node"},{"line_number":143,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FumU%3D","line":140,"updated":"2014-02-11 07:47:55.000000000","message":"ditto","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            retries[0] +\u003d 1"},{"line_number":163,"context_line":"            server.power_on()"},{"line_number":164,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":165,"context_line":"            LOG.warning(_(\"Power-on failed for node %s.\"),"},{"line_number":166,"context_line":"                        seamicro_info[\u0027uuid\u0027])"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_power_on,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fuk0%3D","line":165,"updated":"2014-02-11 07:47:55.000000000","message":"If we use \u0027,\u0027 to join them, we will get the list with \u0027,\u0027 here:\n     \"Power-on failed for node %s.\", \u003cuuid_value\u003e\nSo should be:\n\n    LOG.warning(_(\"Power-on failed for node %s.\") % \n                              seamicro_info[\u0027uuid\u0027]","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"48fcb846618dfa8559e626ffe99dfabfc74cd016","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            retries[0] +\u003d 1"},{"line_number":163,"context_line":"            server.power_on()"},{"line_number":164,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":165,"context_line":"            LOG.warning(_(\"Power-on failed for node %s.\"),"},{"line_number":166,"context_line":"                        seamicro_info[\u0027uuid\u0027])"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_power_on,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fq4A%3D","line":165,"in_reply_to":"AAAAUX%2F%2Fuk0%3D","updated":"2014-02-11 16:14:21.000000000","message":"I looked at the logs Devstack and I tried to change this LOG:\n   LOG.debug(_(\"Running periodic task %(full_task_name)s\"),\n                      {\"full_task_name\": full_task_name}) \nto:\n   LOG.debug(_(\"Running periodic task %s\"), full_task_name) \n\nand I got the same log_message without \u0027,\u0027 :\n   Running periodic task ConductorManager._conductor_service_record_keepalive run_periodic_tasks /opt/stack/ironic/ironic/openstack/common/periodic_task.py:177","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":174,"context_line":"def _power_off(node, timeout\u003dNone):"},{"line_number":175,"context_line":"    \"\"\" Power OFF this node"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":178,"context_line":"    :param timeout: Time in seconds to wait till power off is compelete"},{"line_number":179,"context_line":"    :returns: Power state of the given node"},{"line_number":180,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fuks%3D","line":177,"updated":"2014-02-11 07:47:55.000000000","message":"ditto","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            retries[0] +\u003d 1"},{"line_number":200,"context_line":"            server.power_off()"},{"line_number":201,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":202,"context_line":"            LOG.warning(_(\"Power-off failed for node %s.\"),"},{"line_number":203,"context_line":"                        seamicro_info[\u0027uuid\u0027])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_power_off,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fuko%3D","line":202,"updated":"2014-02-11 07:47:55.000000000","message":"ditto","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def _reboot(node, timeout\u003dNone):"},{"line_number":212,"context_line":"    \"\"\" Reboot this node"},{"line_number":213,"context_line":"    :param node: Ironic node one of :class:`ironic.db.models.Node`"},{"line_number":214,"context_line":"    :param timeout: Time in seconds to wait till reboot is compelete"},{"line_number":215,"context_line":"    :returns: Power state of the given node"},{"line_number":216,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fukk%3D","line":213,"updated":"2014-02-11 07:47:55.000000000","message":"ditto","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            retries[0] +\u003d 1"},{"line_number":237,"context_line":"            server.reset()"},{"line_number":238,"context_line":"        except seamicro_client_exception.ClientException:"},{"line_number":239,"context_line":"            LOG.warning(_(\"Reboot failed for node %s.\"),"},{"line_number":240,"context_line":"                        seamicro_info[\u0027uuid\u0027])"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    timer \u003d loopingcall.FixedIntervalLoopingCall(_wait_for_reboot,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fukg%3D","line":239,"updated":"2014-02-11 07:47:55.000000000","message":"ditto","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        \"\"\"Cycles the power to a node."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        :param task: a TaskManager instance."},{"line_number":306,"context_line":"        :param node: the node info."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"         \"\"\""},{"line_number":309,"context_line":"        state \u003d _reboot(node)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fugs%3D","line":306,"updated":"2014-02-11 07:47:55.000000000","message":"I think this should be node object type, not node info, how do you think?","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        :param task: a TaskManager instance."},{"line_number":306,"context_line":"        :param node: the node info."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"         \"\"\""},{"line_number":309,"context_line":"        state \u003d _reboot(node)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        if state !\u003d states.POWER_ON:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2FujY%3D","line":308,"updated":"2014-02-11 07:47:55.000000000","message":"We should have 8 space here, remove one is required.","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"}],"ironic/drivers/pxe.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic.drivers.modules import ipmitool"},{"line_number":24,"context_line":"from ironic.drivers.modules import pxe"},{"line_number":25,"context_line":"from ironic.drivers.modules import ssh"},{"line_number":26,"context_line":"from ironic.drivers.modules.seamicro import driver as seamicro"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class PXEAndIPMIToolDriver(base.BaseDriver):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fufg%3D","line":26,"updated":"2014-02-11 07:47:55.000000000","message":"Dont think this new seamicro folder is required,  how do you thinnk can we keep the existing structure, just move and rename the new driver ironic/drivers/modules/seamicro/driver.py to ironic/drivers/modules/seamicro.py.\n\nThen we just import it like others:\n\n    from ironic.drivers.modules import seamicro","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"}],"ironic/tests/drivers/seamicro/test_driver.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"abfa8a4b451ba4efc149dfb98f30af7efb3a99bb","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                           driver_info\u003dINFO_DICT)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        self.Server \u003d Fake_Server"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def test__get_power_status_on(self):"},{"line_number":105,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"},{"line_number":106,"context_line":"            _get_server.return_value \u003d self.Server(active\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9y3Y%3D","line":103,"updated":"2014-02-03 21:21:30.000000000","message":"It would be better to use decorators for mock\n\n@mock.patch.object(seamicro, \"_get_server\")\ndef test__validate_fail(self, mock_get_server):\n      ...\n      mock_get_server.return_value \u003d self.Server(active\u003dTrue)\n      ...\n\nand be used decorators for other tests","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            _get_server.return_value \u003d self.Server(active\u003dFalse)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"            pstate \u003d seamicro._get_power_status(self.node)"},{"line_number":115,"context_line":"            self.assertEqual(pstate, states.POWER_OFF)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test__get_power_status_error(self):"},{"line_number":118,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gNA%3D","line":115,"updated":"2014-02-06 13:32:35.000000000","message":"The assertEqual method should put the expected parameter first. This will make it easier to read the error when it fails. ditto for all other assertEqual, too.\n\n    self.assertEqual(states.POWER_OFF, pstate)","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"},{"line_number":119,"context_line":"            _get_server.return_value \u003d self.Server(active\u003dNone)"},{"line_number":120,"context_line":"            pstate \u003d seamicro._get_power_status(self.node)"},{"line_number":121,"context_line":"            self.assertEqual(pstate, states.ERROR)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test__power_on_good(self):"},{"line_number":124,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gM8%3D","line":121,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"},{"line_number":125,"context_line":"            _get_server.return_value \u003d self.Server(active\u003dFalse)"},{"line_number":126,"context_line":"            pstate \u003d seamicro._power_on(self.node, timeout\u003d2)"},{"line_number":127,"context_line":"            self.assertEqual(pstate, states.POWER_ON)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def test__power_on_fail(self):"},{"line_number":130,"context_line":"        def fake_power_on():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gM4%3D","line":127,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            server.power_on \u003d fake_power_on"},{"line_number":136,"context_line":"            _get_server.return_value \u003d server"},{"line_number":137,"context_line":"            pstate \u003d seamicro._power_on(self.node, timeout\u003d2)"},{"line_number":138,"context_line":"            self.assertEqual(pstate, states.ERROR)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def test__power_off_good(self):"},{"line_number":141,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gMo%3D","line":138,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"},{"line_number":142,"context_line":"            _get_server.return_value \u003d self.Server(active\u003dTrue)"},{"line_number":143,"context_line":"            pstate \u003d seamicro._power_off(self.node, timeout\u003d2)"},{"line_number":144,"context_line":"            self.assertEqual(pstate, states.POWER_OFF)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test__power_off_fail(self):"},{"line_number":147,"context_line":"        def fake_power_off():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gMw%3D","line":144,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            server.power_off \u003d fake_power_off"},{"line_number":152,"context_line":"            _get_server.return_value \u003d server"},{"line_number":153,"context_line":"            pstate \u003d seamicro._power_off(self.node, timeout\u003d2)"},{"line_number":154,"context_line":"            self.assertEqual(pstate, states.ERROR)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test__reboot_good(self):"},{"line_number":157,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gMk%3D","line":154,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        with mock.patch.object(seamicro, \"_get_server\") as _get_server:"},{"line_number":158,"context_line":"            _get_server.return_value \u003d self.Server(active\u003dTrue)"},{"line_number":159,"context_line":"            pstate \u003d seamicro._reboot(self.node, timeout\u003d2)"},{"line_number":160,"context_line":"            self.assertEqual(pstate, states.POWER_ON)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def test__reboot_fail(self):"},{"line_number":163,"context_line":"        def fake_reboot():"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gMg%3D","line":160,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            server.reset \u003d fake_reboot"},{"line_number":168,"context_line":"            _get_server.return_value \u003d server"},{"line_number":169,"context_line":"            pstate \u003d seamicro._reboot(self.node, timeout\u003d2)"},{"line_number":170,"context_line":"            self.assertEqual(pstate, states.ERROR)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class SeaMicroPowerDriverTestCase(db_base.DbTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F9gMc%3D","line":170,"updated":"2014-02-06 13:32:35.000000000","message":"ditto","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"9e98ac3c2323eb28ec641a0f28a139c387c42a8b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUX%2F%2Fue4%3D","line":1,"updated":"2014-02-11 07:47:55.000000000","message":"How do you think can we rename/move this file to ironic/tests/drivers/test_seamicro.py, and dont create ironic/tests/drivers/seamicro subfolder?","commit_id":"76d725a67230873cba7b6701bc4b0187246a7f2f"}],"ironic/tests/drivers/test_seamicro.py":[{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"de1ae7ccf9babf67a0ccd80425170cc0424e9401","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                          node)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class SeaMicroPrivateMethodsTestCase(base.TestCase):"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(SeaMicroPrivateMethodsTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2FBtw%3D","line":94,"updated":"2014-02-17 15:18:50.000000000","message":"By the way if you use one mock for all the methods, you can use only one decorator class. It looks much cleaner:\n\n    @mock.patch.object(seamicro, \"_get_server\")\n    class SeaMicroPrivateMethodsTestCase(base.TestCase):\n        ...\n        def test__get_power_status_on(self, mock_get_server):\n            mock_get_server.return_value \u003d self.Server(active\u003dTrue)\n            pstate \u003d seamicro._get_power_status(self.node)\n            self.assertEqual(states.POWER_ON, pstate)\n        ...","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":8412,"name":"Mike Durnosvistov","email":"glacierr.dev@gmail.com","username":"mdurnosvistov"},"change_message_id":"10b4d9de8edbb1a3650e73fdf80957c124e9c44d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                          node)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class SeaMicroPrivateMethodsTestCase(base.TestCase):"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(SeaMicroPrivateMethodsTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B5sc%3D","line":94,"in_reply_to":"AAAAUX%2F%2B63k%3D","updated":"2014-02-18 10:01:57.000000000","message":"Thanks for explain :)","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"5e5724ef2f0f6c394e07798f89a7295b3e75519e","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                          node)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class SeaMicroPrivateMethodsTestCase(base.TestCase):"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(SeaMicroPrivateMethodsTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2B63k%3D","line":94,"in_reply_to":"AAAAUX%2F%2FBtw%3D","updated":"2014-02-18 07:40:11.000000000","message":"Cannot use a class decorator since in the dependent review, there are some methods which dont require a class level decorator for this mocked method \"_get_server\"\n(https://review.openstack.org/#/c/70720/5/ironic/tests/drivers/test_seamicro.py)","commit_id":"cbc2e1d1012cff972f7f87125e6e3c845a8072d3"}],"requirements.txt":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4895c02657db39b33e050560017fd59f962caad9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"WSME\u003e\u003d0.5b6"},{"line_number":26,"context_line":"Jinja2"},{"line_number":27,"context_line":"pyghmi"},{"line_number":28,"context_line":"python-seamicroclient"}],"source_content_type":"text/plain","patch_set":1,"id":"AAAAUH%2F9gZQ%3D","line":28,"updated":"2014-02-06 13:32:35.000000000","message":"Can not find this 3rd lib in our global requirement definition [1],  we need add it first, then we can use python-seamicroclient in our ironic project without any gate-ironic-requirements breaking issue.\n\n[1] https://github.com/openstack/requirements/blob/master/global-requirements.txt\n\nAnother concern here, should we have special version number condition to make sue the compatibility?","commit_id":"66b1de4e378e76ef7e8a897c1aa63b5104ba2afc"}]}
