)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"5a4cf6a5e665f599121f6af9bb21411e0a55cd20","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds interactive serial console support for ipminative"},{"line_number":10,"context_line":"driver using shellinaboxd and pyghmi. A new class called"},{"line_number":11,"context_line":"NativeIPMIShellinaboxConsole implements the ConsoleInterface."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9117c695af40044491fb7f213aa15e841e803d1c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"baada198_1acfd9b1","line":12,"updated":"2014-07-09 05:36:31.000000000","message":"I think we\u0027ll need to add in shellinabox and pyghmi to requirements.txt as a result of this patch.","commit_id":"ba9be5bb8597fafe21399274117da6546176a779"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"c71d7280a209595c909cfaac0da85d2410a5a639","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds interactive serial console support for ipminative"},{"line_number":10,"context_line":"driver using shellinaboxd and pyghmi. A new class called"},{"line_number":11,"context_line":"NativeIPMIShellinaboxConsole implements the ConsoleInterface."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9117c695af40044491fb7f213aa15e841e803d1c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1abeadc6_6afc763f","line":12,"in_reply_to":"baada198_1acfd9b1","updated":"2014-08-18 19:37:10.000000000","message":"pyghmi was in the requirements.txt but was removed for Juno since ipminative will not be default driver. The decision is to document the need of installing shellinabox and pyghmi for using pxe_ipminative driver.","commit_id":"ba9be5bb8597fafe21399274117da6546176a779"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds interactive serial console support for ipminative"},{"line_number":10,"context_line":"driver using shellinaboxd and pyghmi. A new class called"},{"line_number":11,"context_line":"NativeIPMIShellinaboxConsole implements the ConsoleInterface."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9117c695af40044491fb7f213aa15e841e803d1c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1abeadc6_9ea28a97","line":12,"updated":"2014-08-21 01:50:43.000000000","message":"I think this needs a bug associated with it. (I hope not a spec.)","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds interactive serial console support for ipminative"},{"line_number":10,"context_line":"driver using shellinaboxd and pyghmi. A new class called"},{"line_number":11,"context_line":"NativeIPMIShellinaboxConsole implements the ConsoleInterface."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9117c695af40044491fb7f213aa15e841e803d1c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1abeadc6_5a81c8c1","line":12,"in_reply_to":"1abeadc6_9ea28a97","updated":"2014-08-26 19:16:45.000000000","message":"Done. Created bug#1359758.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"}],"ironic/drivers/modules/console_utils.py":[{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"e19bfaa540181e59cdee71315dae97220fa934e7","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    except exception.NoConsolePid:"},{"line_number":135,"context_line":"        pass"},{"line_number":136,"context_line":"    except (processutils.ProcessExecutionError,"},{"line_number":137,"context_line":"            processutils.UnknownArgumentError):"},{"line_number":138,"context_line":"        LOG.warning(_(\"Failed to kill the old console process %(pid)s \""},{"line_number":139,"context_line":"                \"before starting a new shellinabox console \""},{"line_number":140,"context_line":"                \"for node %(node)s.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_443660b5","line":137,"updated":"2014-06-26 19:56:37.000000000","message":"Yuri, I just added a new patch that raised the errors. Please see https://review.openstack.org/#/c/102318/. This patch will depend on that one. Thanks.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"99ba4e9d8f330bad0b33c9d7bffc5fa86c746e2e","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    except exception.NoConsolePid:"},{"line_number":135,"context_line":"        pass"},{"line_number":136,"context_line":"    except (processutils.ProcessExecutionError,"},{"line_number":137,"context_line":"            processutils.UnknownArgumentError):"},{"line_number":138,"context_line":"        LOG.warning(_(\"Failed to kill the old console process %(pid)s \""},{"line_number":139,"context_line":"                \"before starting a new shellinabox console \""},{"line_number":140,"context_line":"                \"for node %(node)s.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_b5493d90","line":137,"updated":"2014-06-18 09:08:38.000000000","message":"processutils.UnknownArgumentError can be raised if bug present in our code, next warning message misinforms. Maybe better do not catch this exception here.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"c5aeb3377b842702e4ff50967556ecb89ed553c1","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    except exception.NoConsolePid:"},{"line_number":135,"context_line":"        pass"},{"line_number":136,"context_line":"    except (processutils.ProcessExecutionError,"},{"line_number":137,"context_line":"            processutils.UnknownArgumentError):"},{"line_number":138,"context_line":"        LOG.warning(_(\"Failed to kill the old console process %(pid)s \""},{"line_number":139,"context_line":"                \"before starting a new shellinabox console \""},{"line_number":140,"context_line":"                \"for node %(node)s.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_81965aee","line":137,"in_reply_to":"1ae5cdf2_b5493d90","updated":"2014-06-20 18:54:44.000000000","message":"Yuriy, we intended to continue here even if the last console process fail to get killed. That\u0027s why only the warning message is given so that the user can manually kill it. We have tested this part in the ipmitool console support.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"}],"ironic/drivers/modules/ipminative.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"99ba4e9d8f330bad0b33c9d7bffc5fa86c746e2e","unresolved":false,"context_lines":[{"line_number":346,"context_line":"class NativeIPMIShellinaboxConsole(base.ConsoleInterface):"},{"line_number":347,"context_line":"    \"\"\"A ConsoleInterface that uses pyghmi and shellinabox.\"\"\""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def _console_pwfile_path(self, uuid):"},{"line_number":350,"context_line":"        \"\"\"Return the file path for storing the ipmi password.\"\"\""},{"line_number":351,"context_line":"        file_name \u003d \"%(uuid)s.pw\" % {\u0027uuid\u0027: uuid}"},{"line_number":352,"context_line":"        return os.path.join(tempfile.gettempdir(), file_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_c8df100b","line":349,"updated":"2014-06-18 09:08:38.000000000","message":"I think this method should be factor out to console_utils for avoid code duplication with ipmitool.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"c5aeb3377b842702e4ff50967556ecb89ed553c1","unresolved":false,"context_lines":[{"line_number":346,"context_line":"class NativeIPMIShellinaboxConsole(base.ConsoleInterface):"},{"line_number":347,"context_line":"    \"\"\"A ConsoleInterface that uses pyghmi and shellinabox.\"\"\""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def _console_pwfile_path(self, uuid):"},{"line_number":350,"context_line":"        \"\"\"Return the file path for storing the ipmi password.\"\"\""},{"line_number":351,"context_line":"        file_name \u003d \"%(uuid)s.pw\" % {\u0027uuid\u0027: uuid}"},{"line_number":352,"context_line":"        return os.path.join(tempfile.gettempdir(), file_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_bcda9948","line":349,"in_reply_to":"1ae5cdf2_c8df100b","updated":"2014-06-20 18:54:44.000000000","message":"This is the file that stores the ipmi password. It is specific to pyghmi implementation of the console. So it should be kept in here.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"5a8ccc48c53c78fb51972205fdfd48e23c792b81","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":361,"context_line":"        if not driver_info[\u0027port\u0027]:"},{"line_number":362,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":363,"context_line":"                \"IPMI terminal port is not supplied.\"))"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    def start_console(self, task):"},{"line_number":366,"context_line":"        \"\"\"Start a remote console for the node.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_41b8b6c7","line":363,"updated":"2014-06-23 06:40:55.000000000","message":"Confusing here, I understand here \u0027port\u0027 is ipmi port, not is the \u0027terminal\u0027 port, the terminal port should be driver_info[\u0027ipmi_terminal_port\u0027], right?","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"e19bfaa540181e59cdee71315dae97220fa934e7","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":361,"context_line":"        if not driver_info[\u0027port\u0027]:"},{"line_number":362,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":363,"context_line":"                \"IPMI terminal port is not supplied.\"))"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    def start_console(self, task):"},{"line_number":366,"context_line":"        \"\"\"Start a remote console for the node.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_f685f4ae","line":363,"in_reply_to":"1ae5cdf2_41b8b6c7","updated":"2014-06-26 19:56:37.000000000","message":"Haomeng, Thanks for the catch. This is the actually the terminal port for shellinabox url for the console. For example: http://10.1.0.1:4201.  4021 is set in the driver_info in the nodes table for the node, driver\u003d\u0027pxe_ipminative\u0027,  driver_info \u003d {\"ipmi_terminal_port\": \"4201\", \"ipmi_address\": \"10.1.0.1\", \"ipmi_username\": \"USERID\", \"ipmi_password\": \"PASSWORD\"} . The ipmitool driver has the same setting for the terminal port. I agree that it is confusing. I have created a different patch to fix it. \nhttps://review.openstack.org/#/c/102345/.  But the reviewers have concerns on backward compatibility.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"941ce18e416e14d043436aa07daf443a86575aee","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def validate(self, task):"},{"line_number":359,"context_line":"        \"\"\"Validate the Node console info."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        :param node: a single Node to validate."},{"line_number":362,"context_line":"        :raises: InvalidParameterValue"},{"line_number":363,"context_line":"        \"\"\""},{"line_number":364,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_1749728b","line":361,"updated":"2014-07-09 05:15:57.000000000","message":"\"validate\" function has no param \"node\", but \"task\"","commit_id":"ba9be5bb8597fafe21399274117da6546176a779"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"c71d7280a209595c909cfaac0da85d2410a5a639","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def validate(self, task):"},{"line_number":359,"context_line":"        \"\"\"Validate the Node console info."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        :param node: a single Node to validate."},{"line_number":362,"context_line":"        :raises: InvalidParameterValue"},{"line_number":363,"context_line":"        \"\"\""},{"line_number":364,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_0aa5c252","line":361,"in_reply_to":"baada198_1749728b","updated":"2014-08-18 19:37:10.000000000","message":"Done. Thanks for the catch.","commit_id":"ba9be5bb8597fafe21399274117da6546176a779"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"208a1904f06485fb13f42cfa88c1808dc0f1dd2a","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        d.update(CONSOLE_PROPERTIES)"},{"line_number":431,"context_line":"        return d"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def _console_pwfile_path(self, uuid):"},{"line_number":434,"context_line":"        \"\"\"Return the file path for storing the ipmi password.\"\"\""},{"line_number":435,"context_line":"        file_name \u003d \"%(uuid)s.pw\" % {\u0027uuid\u0027: uuid}"},{"line_number":436,"context_line":"        return os.path.join(tempfile.gettempdir(), file_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1abeadc6_afa04944","line":433,"updated":"2014-08-19 08:42:56.000000000","message":"I think this function should not be a class member.","commit_id":"0cc29efbdd35018ca5abc8046e0a4547a7393619"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"77fcec8fb75940e130114114b518dc906dcc888a","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        d.update(CONSOLE_PROPERTIES)"},{"line_number":431,"context_line":"        return d"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def _console_pwfile_path(self, uuid):"},{"line_number":434,"context_line":"        \"\"\"Return the file path for storing the ipmi password.\"\"\""},{"line_number":435,"context_line":"        file_name \u003d \"%(uuid)s.pw\" % {\u0027uuid\u0027: uuid}"},{"line_number":436,"context_line":"        return os.path.join(tempfile.gettempdir(), file_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1abeadc6_499135f0","line":433,"in_reply_to":"1abeadc6_afa04944","updated":"2014-08-20 14:20:20.000000000","message":"Done. But I have reservation on it. This function is for console use  only and should be kept in this class. However, I saw  the same code in ipmitool has been changed, so I\u0027ll make the the same change here. i.e, moving this function out of the class.","commit_id":"0cc29efbdd35018ca5abc8046e0a4547a7393619"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"208a1904f06485fb13f42cfa88c1808dc0f1dd2a","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":445,"context_line":"        if not driver_info[\u0027port\u0027]:"},{"line_number":446,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":447,"context_line":"                \"IPMI terminal port is not supplied.\"))"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def start_console(self, task):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1abeadc6_8f62adab","line":446,"updated":"2014-08-19 08:42:56.000000000","message":"Should be MissingParameterValue?","commit_id":"0cc29efbdd35018ca5abc8046e0a4547a7393619"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"77fcec8fb75940e130114114b518dc906dcc888a","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":445,"context_line":"        if not driver_info[\u0027port\u0027]:"},{"line_number":446,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":447,"context_line":"                \"IPMI terminal port is not supplied.\"))"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"    def start_console(self, task):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1abeadc6_c9246562","line":446,"in_reply_to":"1abeadc6_8f62adab","updated":"2014-08-20 14:20:20.000000000","message":"Done. Thanks.","commit_id":"0cc29efbdd35018ca5abc8046e0a4547a7393619"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def _parse_driver_info(node):"},{"line_number":80,"context_line":"    \"\"\"Gets the bmc access info for the given node."},{"line_number":81,"context_line":"    :raises: MissingParameterValue when required ipmi credentials"},{"line_number":82,"context_line":"              are missing."},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    info \u003d node.driver_info or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_5410d3a7","line":82,"updated":"2014-08-21 01:50:43.000000000","message":"Also raises InvalidParameterValue\n\nCheck the docstrings for the rest of the methods in this file. If they call _parse_driver_info and they have a docstring with MissingParameterValue, you should probably add \":raises: InvalidParameterValue ...\" too.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"def _parse_driver_info(node):"},{"line_number":80,"context_line":"    \"\"\"Gets the bmc access info for the given node."},{"line_number":81,"context_line":"    :raises: MissingParameterValue when required ipmi credentials"},{"line_number":82,"context_line":"              are missing."},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    info \u003d node.driver_info or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_1a3c14bf","line":82,"in_reply_to":"1abeadc6_5410d3a7","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    # terminal port must be an integer"},{"line_number":103,"context_line":"    if bmc_info[\u0027port\u0027] is not None:"},{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            bmc_info[\u0027port\u0027] \u003d int(bmc_info[\u0027port\u0027])"},{"line_number":106,"context_line":"        except ValueError:"},{"line_number":107,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":108,"context_line":"                \"IPMI terminal port is not an integer.\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_34fd176f","line":105,"updated":"2014-08-21 01:50:43.000000000","message":"It seems to me that using a local port\u003dinfo.get(\u0027ipmi_terminal_port\u0027) and doing all this with port, might be more efficient than accessing \u0027port\u0027 in the dictionary 3 times. But that\u0027s just a guess on my part.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    # terminal port must be an integer"},{"line_number":103,"context_line":"    if bmc_info[\u0027port\u0027] is not None:"},{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            bmc_info[\u0027port\u0027] \u003d int(bmc_info[\u0027port\u0027])"},{"line_number":106,"context_line":"        except ValueError:"},{"line_number":107,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":108,"context_line":"                \"IPMI terminal port is not an integer.\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_faae78e6","line":105,"in_reply_to":"1abeadc6_34fd176f","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"def _console_pwfile_path(uuid):"},{"line_number":114,"context_line":"    \"\"\"Return the file path for storing the ipmi password.\"\"\""},{"line_number":115,"context_line":"    file_name \u003d \"%(uuid)s.pw\" % {\u0027uuid\u0027: uuid}"},{"line_number":116,"context_line":"    return os.path.join(tempfile.gettempdir(), file_name)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"def _power_on(driver_info):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_1433bb63","line":116,"updated":"2014-08-21 01:50:43.000000000","message":"Do you think this might be worth putting in console_utils, since ipmitool has the same method?","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":113,"context_line":"def _console_pwfile_path(uuid):"},{"line_number":114,"context_line":"    \"\"\"Return the file path for storing the ipmi password.\"\"\""},{"line_number":115,"context_line":"    file_name \u003d \"%(uuid)s.pw\" % {\u0027uuid\u0027: uuid}"},{"line_number":116,"context_line":"    return os.path.join(tempfile.gettempdir(), file_name)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"def _power_on(driver_info):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_1a9ed454","line":116,"in_reply_to":"1abeadc6_1433bb63","updated":"2014-08-26 19:16:45.000000000","message":"Thanks for the suggestion. I thought about it when designing console_utils. console_utils is a place to store console related functions. The IPMI password file is used by the console, it is more related to ipmi, the caller. So it\u0027s better to leave it here.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":446,"context_line":"        if not driver_info[\u0027port\u0027]:"},{"line_number":447,"context_line":"            raise exception.MissingParameterValue(_("},{"line_number":448,"context_line":"                \"IPMI terminal port not supplied to NativeIPMI driver.\"))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def start_console(self, task):"},{"line_number":451,"context_line":"        \"\"\"Start a remote console for the node.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_94018b3a","line":448,"updated":"2014-08-21 01:50:43.000000000","message":"This is the first time I see \u0027NativeIPMI driver\u0027 in a user string. To be consistent, should we use \u0027IPMI\u0027 instead?","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":446,"context_line":"        if not driver_info[\u0027port\u0027]:"},{"line_number":447,"context_line":"            raise exception.MissingParameterValue(_("},{"line_number":448,"context_line":"                \"IPMI terminal port not supplied to NativeIPMI driver.\"))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def start_console(self, task):"},{"line_number":451,"context_line":"        \"\"\"Start a remote console for the node.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_5abf6caa","line":448,"in_reply_to":"1abeadc6_94018b3a","updated":"2014-08-26 19:16:45.000000000","message":"Done.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                \"IPMI terminal port not supplied to NativeIPMI driver.\"))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def start_console(self, task):"},{"line_number":451,"context_line":"        \"\"\"Start a remote console for the node.\"\"\""},{"line_number":452,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        path \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_9488abc6","line":451,"updated":"2014-08-21 01:50:43.000000000","message":"Please add more to the docstring: the param, and exceptions that are raised.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                \"IPMI terminal port not supplied to NativeIPMI driver.\"))"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"    def start_console(self, task):"},{"line_number":451,"context_line":"        \"\"\"Start a remote console for the node.\"\"\""},{"line_number":452,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        path \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_7a1268b5","line":451,"in_reply_to":"1abeadc6_9488abc6","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                         \u0027bmc\u0027: driver_info[\u0027address\u0027],"},{"line_number":464,"context_line":"                         \u0027user\u0027: driver_info[\u0027username\u0027],"},{"line_number":465,"context_line":"                         \u0027passwd_file\u0027: pw_file}"},{"line_number":466,"context_line":"        console_utils.start_shellinabox_console(driver_info[\u0027uuid\u0027],"},{"line_number":467,"context_line":"                                                driver_info[\u0027port\u0027],"},{"line_number":468,"context_line":"                                                console_cmd)"},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_f44c7fa0","line":466,"updated":"2014-08-21 01:50:43.000000000","message":"This can raise an exception. If it does, do you want to clean up and get rid of \u0027path\u0027?","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                         \u0027bmc\u0027: driver_info[\u0027address\u0027],"},{"line_number":464,"context_line":"                         \u0027user\u0027: driver_info[\u0027username\u0027],"},{"line_number":465,"context_line":"                         \u0027passwd_file\u0027: pw_file}"},{"line_number":466,"context_line":"        console_utils.start_shellinabox_console(driver_info[\u0027uuid\u0027],"},{"line_number":467,"context_line":"                                                driver_info[\u0027port\u0027],"},{"line_number":468,"context_line":"                                                console_cmd)"},{"line_number":469,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_7d74229c","line":466,"in_reply_to":"1abeadc6_f44c7fa0","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                                                console_cmd)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def stop_console(self, task):"},{"line_number":471,"context_line":"        \"\"\"Stop the remote console session for the node.\"\"\""},{"line_number":472,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":473,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":474,"context_line":"        passwod_file \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_3443576d","line":471,"updated":"2014-08-21 01:50:43.000000000","message":"please add more to the docstring: the param, and exceptions that are raised.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                                                console_cmd)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def stop_console(self, task):"},{"line_number":471,"context_line":"        \"\"\"Stop the remote console session for the node.\"\"\""},{"line_number":472,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":473,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":474,"context_line":"        passwod_file \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_69fe24b0","line":471,"in_reply_to":"1abeadc6_3443576d","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    def stop_console(self, task):"},{"line_number":471,"context_line":"        \"\"\"Stop the remote console session for the node.\"\"\""},{"line_number":472,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":473,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":474,"context_line":"        passwod_file \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"},{"line_number":475,"context_line":"        utils.unlink_without_raise(passwod_file)"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_17073d1a","line":473,"updated":"2014-08-21 01:50:43.000000000","message":"This could raise a ConsoleError exception. I think you still want to clean up in that case.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    def stop_console(self, task):"},{"line_number":471,"context_line":"        \"\"\"Stop the remote console session for the node.\"\"\""},{"line_number":472,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":473,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":474,"context_line":"        passwod_file \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"},{"line_number":475,"context_line":"        utils.unlink_without_raise(passwod_file)"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_291b4c1d","line":473,"in_reply_to":"1abeadc6_17073d1a","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c39a8c0484bc5cb69540d26c18f71065c4fb9a0a","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        \"\"\"Stop the remote console session for the node.\"\"\""},{"line_number":472,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":473,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":474,"context_line":"        passwod_file \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"},{"line_number":475,"context_line":"        utils.unlink_without_raise(passwod_file)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def get_console(self, task):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_b42da7aa","line":474,"updated":"2014-08-21 01:50:43.000000000","message":"typo \u0027passwod_filie\u0027 -\u003e \u0027password_file\u0027.","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"5c30d095e51f59563b18288bf73fdf544b682c7f","unresolved":false,"context_lines":[{"line_number":471,"context_line":"        \"\"\"Stop the remote console session for the node.\"\"\""},{"line_number":472,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":473,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":474,"context_line":"        passwod_file \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"},{"line_number":475,"context_line":"        utils.unlink_without_raise(passwod_file)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def get_console(self, task):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_491a4818","line":474,"in_reply_to":"1abeadc6_b42da7aa","updated":"2014-08-26 19:16:45.000000000","message":"Done","commit_id":"4efa280f2709e7901c04fa05edfccd412f2a909d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5a75a64ce711b0bdbb718474d0504d0b975d779","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        \"\"\"Validate the Node console info."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":447,"context_line":"        :raises: MissingParameterValue"},{"line_number":448,"context_line":"        \"\"\""},{"line_number":449,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":450,"context_line":"        if not driver_info[\u0027port\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_b0604ad0","line":447,"updated":"2014-09-03 09:45:09.000000000","message":"also can raise InvalidParameterValue","commit_id":"67cc2693bd5c42a9ab2d8165e865d943e2a48f4e"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"2bc6e1539279100c5feb2603b376f5c402939295","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        \"\"\"Validate the Node console info."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":447,"context_line":"        :raises: MissingParameterValue"},{"line_number":448,"context_line":"        \"\"\""},{"line_number":449,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":450,"context_line":"        if not driver_info[\u0027port\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_f2f6448e","line":447,"in_reply_to":"fa98f980_b0604ad0","updated":"2014-09-03 18:37:02.000000000","message":"Done","commit_id":"67cc2693bd5c42a9ab2d8165e865d943e2a48f4e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5a75a64ce711b0bdbb718474d0504d0b975d779","unresolved":false,"context_lines":[{"line_number":477,"context_line":"                                                    console_cmd)"},{"line_number":478,"context_line":"        except exception.ConsoleError:"},{"line_number":479,"context_line":"            utils.unlink_without_raise(pw_file)"},{"line_number":480,"context_line":"            raise"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def stop_console(self, task):"},{"line_number":483,"context_line":"        \"\"\"Stop the remote console session for the node."}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_53164856","line":480,"updated":"2014-09-03 09:45:09.000000000","message":"You should use save_and_reraise_exception() from oslo.utils here.","commit_id":"67cc2693bd5c42a9ab2d8165e865d943e2a48f4e"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"2bc6e1539279100c5feb2603b376f5c402939295","unresolved":false,"context_lines":[{"line_number":477,"context_line":"                                                    console_cmd)"},{"line_number":478,"context_line":"        except exception.ConsoleError:"},{"line_number":479,"context_line":"            utils.unlink_without_raise(pw_file)"},{"line_number":480,"context_line":"            raise"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def stop_console(self, task):"},{"line_number":483,"context_line":"        \"\"\"Stop the remote console session for the node."}],"source_content_type":"text/x-python","patch_set":7,"id":"fa98f980_ed24a50e","line":480,"in_reply_to":"fa98f980_53164856","updated":"2014-09-03 18:37:02.000000000","message":"Done","commit_id":"67cc2693bd5c42a9ab2d8165e865d943e2a48f4e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0b08dde5503bf8f21124e1229e423c1a2c95d1e9","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    bmc_info[\u0027port\u0027] \u003d info.get(\u0027ipmi_terminal_port\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    # terminal port must be an integer"},{"line_number":107,"context_line":"    port \u003d bmc_info.get(\u0027port\u0027)"},{"line_number":108,"context_line":"    if port is not None:"},{"line_number":109,"context_line":"        try:"},{"line_number":110,"context_line":"            port \u003d int(port)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_f0d535e5","line":107,"updated":"2014-09-04 20:04:21.000000000","message":"nit: you could have done port \u003d info.get() instead of the above two lines, and then just assigned bmc_info[\u0027port\u0027] \u003d port afterwards.","commit_id":"bf0091e4079a32d1bb4ceed48e8fdc6768c22b9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0b08dde5503bf8f21124e1229e423c1a2c95d1e9","unresolved":false,"context_lines":[{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":503,"context_line":"        :raises: ConsoleError if unable to start the console process."},{"line_number":504,"context_line":"        \"\"\""},{"line_number":505,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        path \u003d _console_pwfile_path(driver_info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_0667df26","line":504,"updated":"2014-09-04 20:04:21.000000000","message":"this could also raise MissingParameterValue, InvalidParameterValue","commit_id":"bf0091e4079a32d1bb4ceed48e8fdc6768c22b9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0b08dde5503bf8f21124e1229e423c1a2c95d1e9","unresolved":false,"context_lines":[{"line_number":520,"context_line":"            console_utils.start_shellinabox_console(driver_info[\u0027uuid\u0027],"},{"line_number":521,"context_line":"                                                    driver_info[\u0027port\u0027],"},{"line_number":522,"context_line":"                                                    console_cmd)"},{"line_number":523,"context_line":"        except exception.ConsoleError:"},{"line_number":524,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":525,"context_line":"                utils.unlink_without_raise(path)"},{"line_number":526,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_06351ff7","line":523,"updated":"2014-09-04 20:04:21.000000000","message":"console_utils.start_shellinabox_console() could also raise exception.ConsoleSubprocessFailed.","commit_id":"bf0091e4079a32d1bb4ceed48e8fdc6768c22b9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"1aa9d4308c7bcced4c03f1c0babea5db5e29fef0","unresolved":false,"context_lines":[{"line_number":520,"context_line":"            console_utils.start_shellinabox_console(driver_info[\u0027uuid\u0027],"},{"line_number":521,"context_line":"                                                    driver_info[\u0027port\u0027],"},{"line_number":522,"context_line":"                                                    console_cmd)"},{"line_number":523,"context_line":"        except exception.ConsoleError:"},{"line_number":524,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":525,"context_line":"                utils.unlink_without_raise(path)"},{"line_number":526,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_c88ec52d","line":523,"in_reply_to":"fa98f980_06351ff7","updated":"2014-09-04 20:11:17.000000000","message":"linggao pointed out that ConsoleSubprocess is a subclass of ConsoleError, so this is ok.","commit_id":"bf0091e4079a32d1bb4ceed48e8fdc6768c22b9d"}],"ironic/tests/drivers/test_ipminative.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"5a8ccc48c53c78fb51972205fdfd48e23c792b81","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        self.assertEqual(expected, console_info)"},{"line_number":332,"context_line":"        mock_exec.assert_called_once_with(self.info[\u0027port\u0027])"},{"line_number":333,"context_line":"        self.assertTrue(mock_exec.called)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_81855ed1","line":333,"updated":"2014-06-23 06:40:55.000000000","message":"How about can we have more ut code to cover the stop/get console fail cases?","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"e19bfaa540181e59cdee71315dae97220fa934e7","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        self.assertEqual(expected, console_info)"},{"line_number":332,"context_line":"        mock_exec.assert_called_once_with(self.info[\u0027port\u0027])"},{"line_number":333,"context_line":"        self.assertTrue(mock_exec.called)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_67c4d00e","line":333,"in_reply_to":"1ae5cdf2_81855ed1","updated":"2014-06-26 19:56:37.000000000","message":"The most logic is in console_utils. So I have added some new testcases in there. https://review.openstack.org/#/c/102318/. This patch depends on it.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0b08dde5503bf8f21124e1229e423c1a2c95d1e9","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        mock_exec.return_value \u003d None"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":422,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":423,"context_line":"            self.driver.console.start_console(task)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        mock_exec.assert_called_once_with(self.info[\u0027uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_08cd2db7","line":422,"updated":"2014-09-04 20:04:21.000000000","message":"we\u0027re supposed to use self.node.uuid instead of self.node[\u0027uuid\u0027]","commit_id":"bf0091e4079a32d1bb4ceed48e8fdc6768c22b9d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0b08dde5503bf8f21124e1229e423c1a2c95d1e9","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        mock_stop.assert_called_once_with(self.node.uuid)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"    @mock.patch.object(console_utils, \u0027get_shellinabox_console_url\u0027,"},{"line_number":468,"context_line":"                       utospec\u003dTrue)"},{"line_number":469,"context_line":"    def test_get_console(self, mock_exec):"},{"line_number":470,"context_line":"        url \u003d \u0027http://localhost:4201\u0027"},{"line_number":471,"context_line":"        mock_exec.return_value \u003d url"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa98f980_686159d2","line":468,"updated":"2014-09-04 20:04:21.000000000","message":"utospec -\u003e autospec ?","commit_id":"bf0091e4079a32d1bb4ceed48e8fdc6768c22b9d"}],"requirements.txt":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"5a8ccc48c53c78fb51972205fdfd48e23c792b81","unresolved":false,"context_lines":[{"line_number":27,"context_line":"jsonpatch\u003e\u003d1.1"},{"line_number":28,"context_line":"WSME\u003e\u003d0.6"},{"line_number":29,"context_line":"Jinja2"},{"line_number":30,"context_line":"pyghmi\u003e\u003d0.6.11"},{"line_number":31,"context_line":"oslo.messaging\u003e\u003d1.3.0"}],"source_content_type":"text/plain","patch_set":2,"id":"1ae5cdf2_4162763e","line":30,"updated":"2014-06-23 06:40:55.000000000","message":"It is better we dont touch the code which is not covered by the commit message, and it is latest one already:\n\nhttps://github.com/openstack/ironic/blob/master/requirements.txt#L30","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"},{"author":{"_account_id":7589,"name":"linggao","email":"linggao@us.ibm.com","username":"linggao"},"change_message_id":"e19bfaa540181e59cdee71315dae97220fa934e7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"jsonpatch\u003e\u003d1.1"},{"line_number":28,"context_line":"WSME\u003e\u003d0.6"},{"line_number":29,"context_line":"Jinja2"},{"line_number":30,"context_line":"pyghmi\u003e\u003d0.6.11"},{"line_number":31,"context_line":"oslo.messaging\u003e\u003d1.3.0"}],"source_content_type":"text/plain","patch_set":2,"id":"1ae5cdf2_d646387b","line":30,"in_reply_to":"1ae5cdf2_4162763e","updated":"2014-06-26 19:56:37.000000000","message":"The lasted master head has it removed. So this will not be a problem any more.","commit_id":"e907e5987221121bb2d9f25b366c02a233688e90"}]}
