)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"fd94cc7af1b7210b5a7e3f35eaf9da1605659e0b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"test environments, this patch implements a console driver"},{"line_number":11,"context_line":"ShellinaboxConsole to add ability of console access for"},{"line_number":12,"context_line":"SSH driver using \u0027virsh console\u0027."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I2764e0cb4b5b489762e00cd266212b902acc0746"},{"line_number":15,"context_line":"Closes-Bug: #1526305"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"1a7b0d38_3190a8ec","line":13,"updated":"2015-12-22 15:34:18.000000000","message":"It would be useful (for me to remember this later) if we also mentioned that since this is only for virsh, for non-virsh ssh drivers, a \u0027GET /v1/drivers/properties\u0027 will return False for the console interface (as opposed to None) with a \u0027not supported ...\u0027 reason.","commit_id":"2e4aa87f43995e9fd70b6abf9e16a083109c6098"}],"ironic/drivers/modules/ssh.py":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"fe607e61500a74713e510815148065b6179ebc01","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        \u0027port\u0027: port,"},{"line_number":394,"context_line":"        \u0027virt_type\u0027: virt_type,"},{"line_number":395,"context_line":"        \u0027uuid\u0027: node.uuid,"},{"line_number":396,"context_line":"        \u0027terminal_port\u0027: terminal_port"},{"line_number":397,"context_line":"    }"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    cmd_set \u003d _get_command_sets(virt_type)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa80f949_223b259e","line":396,"updated":"2015-11-05 06:00:14.000000000","message":"nit: add trailing comma","commit_id":"fc3ecfd5f2f8b45bcb12cad9ccd3d5eba09a340b"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"fe607e61500a74713e510815148065b6179ebc01","unresolved":false,"context_lines":[{"line_number":875,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def get_console(self, task):"},{"line_number":878,"context_line":"        \"\"\"Get the type and connection information about the console."},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"        :raises: MissingParameterValue if required ssh parameters are"},{"line_number":881,"context_line":"                 missing"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa80f949_a247151c","line":878,"updated":"2015-11-05 06:00:14.000000000","message":"nit: missing below line:\n\n:param task: a task from TaskManager","commit_id":"fc3ecfd5f2f8b45bcb12cad9ccd3d5eba09a340b"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"f9ff320c2e6988f32ea582259f0573eefa562d03","unresolved":false,"context_lines":[{"line_number":90,"context_line":"COMMON_PROPERTIES.update(OTHER_PROPERTIES)"},{"line_number":91,"context_line":"CONSOLE_PROPERTIES \u003d {"},{"line_number":92,"context_line":"    \u0027ssh_terminal_port\u0027: _(\"node\u0027s UDP port to connect to. \""},{"line_number":93,"context_line":"                           \"Only required for console access.\")"},{"line_number":94,"context_line":"}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"# NOTE(dguerri) Generic boot device map. Virtualisation types that don\u0027t define"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_87e5ffdc","line":93,"updated":"2015-11-11 10:00:56.000000000","message":"nit: Adding a statement of valid port range will be helpful.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"9400a3c12131da97d090ecb97c3d0e84a360a33e","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    virt_type \u003d info.get(\u0027ssh_virt_type\u0027)"},{"line_number":380,"context_line":"    terminal_port \u003d info.get(\u0027ssh_terminal_port\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    if terminal_port:"},{"line_number":383,"context_line":"        try:"},{"line_number":384,"context_line":"            terminal_port \u003d int(terminal_port)"},{"line_number":385,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_696c77d0","line":382,"updated":"2015-11-11 05:54:21.000000000","message":"I think this should depends on your another patch","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"f9ff320c2e6988f32ea582259f0573eefa562d03","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    virt_type \u003d info.get(\u0027ssh_virt_type\u0027)"},{"line_number":380,"context_line":"    terminal_port \u003d info.get(\u0027ssh_terminal_port\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    if terminal_port:"},{"line_number":383,"context_line":"        try:"},{"line_number":384,"context_line":"            terminal_port \u003d int(terminal_port)"},{"line_number":385,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_a75da37a","line":382,"in_reply_to":"da85f559_64b25e08","updated":"2015-11-11 10:00:56.000000000","message":"Agree, also need new tests.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"31acd3eebb49f2e911ae44bfcfe1308e41a02926","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    virt_type \u003d info.get(\u0027ssh_virt_type\u0027)"},{"line_number":380,"context_line":"    terminal_port \u003d info.get(\u0027ssh_terminal_port\u0027)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    if terminal_port:"},{"line_number":383,"context_line":"        try:"},{"line_number":384,"context_line":"            terminal_port \u003d int(terminal_port)"},{"line_number":385,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_64b25e08","line":382,"in_reply_to":"da85f559_696c77d0","updated":"2015-11-11 06:43:50.000000000","message":"yeah, will add port validation based on that.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14943,"name":"Caio Oliveira","email":"caiobo@lsd.ufcg.edu.br","username":"caiobo"},"change_message_id":"c9a91c210d5b29ee5f035d21d559032041f8192c","unresolved":false,"context_lines":[{"line_number":811,"context_line":"    \"\"\"A ConsoleInterface that uses ssh and shellinabox.\"\"\""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"    def get_properties(self):"},{"line_number":814,"context_line":"        d \u003d COMMON_PROPERTIES.copy()"},{"line_number":815,"context_line":"        d.update(CONSOLE_PROPERTIES)"},{"line_number":816,"context_line":"        return d"},{"line_number":817,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_35a33802","line":814,"updated":"2015-11-10 19:39:36.000000000","message":"Although \"d\" is a local variable, I think that it would be better to specify the type of it or just change for a longer name. It would be easier to read and understand the code.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"31acd3eebb49f2e911ae44bfcfe1308e41a02926","unresolved":false,"context_lines":[{"line_number":811,"context_line":"    \"\"\"A ConsoleInterface that uses ssh and shellinabox.\"\"\""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"    def get_properties(self):"},{"line_number":814,"context_line":"        d \u003d COMMON_PROPERTIES.copy()"},{"line_number":815,"context_line":"        d.update(CONSOLE_PROPERTIES)"},{"line_number":816,"context_line":"        return d"},{"line_number":817,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_049b5273","line":814,"in_reply_to":"da85f559_35a33802","updated":"2015-11-11 06:43:50.000000000","message":"ok, will name it to a more descriptive one in the next patch set.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14943,"name":"Caio Oliveira","email":"caiobo@lsd.ufcg.edu.br","username":"caiobo"},"change_message_id":"c9a91c210d5b29ee5f035d21d559032041f8192c","unresolved":false,"context_lines":[{"line_number":823,"context_line":"                 missing"},{"line_number":824,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":825,"context_line":"        \"\"\""},{"line_number":826,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":829,"context_line":"            raise exception.InvalidParameterValue(_("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_3597b83b","line":826,"updated":"2015-11-10 19:39:36.000000000","message":"Looking after this we can see that this variable is a dict, but it would not be better if you call it \"driver_info_dict\"? Then the first time we see it we know what type it is (and it\u0027s easier for debugging).","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"31acd3eebb49f2e911ae44bfcfe1308e41a02926","unresolved":false,"context_lines":[{"line_number":823,"context_line":"                 missing"},{"line_number":824,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":825,"context_line":"        \"\"\""},{"line_number":826,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":829,"context_line":"            raise exception.InvalidParameterValue(_("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_e4c2ce33","line":826,"in_reply_to":"da85f559_3597b83b","updated":"2015-11-11 06:43:50.000000000","message":"Caio, we use driver_info all through ironic, I think it\u0027s ok, no need to specify \u0027dict\u0027 in the variable name.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14943,"name":"Caio Oliveira","email":"caiobo@lsd.ufcg.edu.br","username":"caiobo"},"change_message_id":"38a19f1647b1cfc78564e466543b8a91db285020","unresolved":false,"context_lines":[{"line_number":823,"context_line":"                 missing"},{"line_number":824,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":825,"context_line":"        \"\"\""},{"line_number":826,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":829,"context_line":"            raise exception.InvalidParameterValue(_("}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_b1a2bc97","line":826,"in_reply_to":"da85f559_e4c2ce33","updated":"2015-11-11 12:22:12.000000000","message":"I see... that\u0027s right. Ok then.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"9400a3c12131da97d090ecb97c3d0e84a360a33e","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":872,"context_line":"        \"\"\""},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":875,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def get_console(self, task):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_697a3779","line":874,"updated":"2015-11-11 05:54:21.000000000","message":"if you only need uuid, what about:\n  node_uuid \u003d task.node.uuid","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"31acd3eebb49f2e911ae44bfcfe1308e41a02926","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":872,"context_line":"        \"\"\""},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":875,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def get_console(self, task):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_a414c69f","line":874,"in_reply_to":"da85f559_697a3779","updated":"2015-11-11 06:43:50.000000000","message":"Tan, I think we use _parse_driver_info here is not just for the uuid, which will also do some parameters validation before killing the shellinabox process.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e4bbbc119e0c1a781eb24cbe8e32ea9046263b07","unresolved":false,"context_lines":[{"line_number":824,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":825,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":826,"context_line":"                \"\u0027ssh_virt_type\u0027 parameter in node\u0027s \""},{"line_number":827,"context_line":"                \"driver_info is not virsh\"))"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":830,"context_line":"            raise exception.MissingParameterValue(_("}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_e5c812ab","line":827,"updated":"2015-11-20 15:34:31.000000000","message":"s/virsh/ \u0027virsh\u0027","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e11fcae30b50b056dac72208626f528c7273d98a","unresolved":false,"context_lines":[{"line_number":824,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":825,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":826,"context_line":"                \"\u0027ssh_virt_type\u0027 parameter in node\u0027s \""},{"line_number":827,"context_line":"                \"driver_info is not virsh\"))"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":830,"context_line":"            raise exception.MissingParameterValue(_("}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_9925c6af","line":827,"in_reply_to":"ba8a016a_e5c812ab","updated":"2015-11-30 07:02:09.000000000","message":"how about - \"ShellinaboxConsole supports \u0027virsh\u0027 value for \u0027ssh_virt_type\u0027 type only?\"","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e11fcae30b50b056dac72208626f528c7273d98a","unresolved":false,"context_lines":[{"line_number":829,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":830,"context_line":"            raise exception.MissingParameterValue(_("},{"line_number":831,"context_line":"                \"Missing \u0027ssh_terminal_port\u0027 parameter in node\u0027s \""},{"line_number":832,"context_line":"                \"driver_info\"))"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"    def start_console(self, task):"},{"line_number":835,"context_line":"        \"\"\"Start a remote console for the node."}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_591f5e5b","line":832,"updated":"2015-11-30 07:02:09.000000000","message":"s/\"driver_info\"/\"\u0027driver_info\u0027\"","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e4bbbc119e0c1a781eb24cbe8e32ea9046263b07","unresolved":false,"context_lines":[{"line_number":840,"context_line":"        :raises: ConsoleError if the directory for the PID file cannot be"},{"line_number":841,"context_line":"                 created"},{"line_number":842,"context_line":"        :raises: ConsoleSubprocessFailed when invoking the subprocess failed"},{"line_number":843,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":844,"context_line":"        \"\"\""},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_85d7c6ec","line":843,"updated":"2015-11-20 15:34:31.000000000","message":"s/parameter /parameters","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e4bbbc119e0c1a781eb24cbe8e32ea9046263b07","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":844,"context_line":"        \"\"\""},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":847,"context_line":"        driver_info[\u0027macs\u0027] \u003d driver_utils.get_node_mac_addresses(task)"},{"line_number":848,"context_line":"        ssh_obj \u003d _get_connection(task.node)"},{"line_number":849,"context_line":"        node_name \u003d _get_hosts_name_for_node(ssh_obj, driver_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_45931e50","line":846,"updated":"2015-11-20 15:34:31.000000000","message":"Tan Lin\u0027s coment applicable here as well.","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"f13d98141cd11a2439bdb4c7716e883393a01899","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":844,"context_line":"        \"\"\""},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":847,"context_line":"        driver_info[\u0027macs\u0027] \u003d driver_utils.get_node_mac_addresses(task)"},{"line_number":848,"context_line":"        ssh_obj \u003d _get_connection(task.node)"},{"line_number":849,"context_line":"        node_name \u003d _get_hosts_name_for_node(ssh_obj, driver_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_b4620fac","line":846,"in_reply_to":"ba8a016a_45931e50","updated":"2015-11-23 03:21:31.000000000","message":"Hi Shivanand, I agree with Lin that we can directly use task.node.uuid in stop_console(), but it seems not applicable here as we need it at L849 to get node_name and at L857 to get terminal_port.","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e4bbbc119e0c1a781eb24cbe8e32ea9046263b07","unresolved":false,"context_lines":[{"line_number":864,"context_line":"        :raises: MissingParameterValue if required ssh parameters are"},{"line_number":865,"context_line":"                 missing"},{"line_number":866,"context_line":"        :raises: ConsoleError if unable to stop the console"},{"line_number":867,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":868,"context_line":"        \"\"\""},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_c5f4ee88","line":867,"updated":"2015-11-20 15:34:31.000000000","message":"s/parameter /parameters","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"fd0e686bf48e8a9d3aeb3f1318291c49469214db","unresolved":false,"context_lines":[{"line_number":867,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":868,"context_line":"        \"\"\""},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":871,"context_line":"        console_utils.stop_shellinabox_console(driver_info[\u0027uuid\u0027])"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    def get_console(self, task):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da85f559_baac9a8c","line":870,"updated":"2015-11-12 10:37:56.000000000","message":"refer to my previous question, conductor will validate() the driver info  before stop_console(), \nso there is no need to call _parse_driver_info() if you only want to get node.uuid","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"e4bbbc119e0c1a781eb24cbe8e32ea9046263b07","unresolved":false,"context_lines":[{"line_number":879,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":880,"context_line":"        \"\"\""},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":883,"context_line":"        url \u003d console_utils.get_shellinabox_console_url("},{"line_number":884,"context_line":"            driver_info[\u0027terminal_port\u0027])"},{"line_number":885,"context_line":"        return {\u0027type\u0027: \u0027shellinabox\u0027, \u0027url\u0027: url}"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_c5738ee6","line":882,"updated":"2015-11-20 15:34:31.000000000","message":"Here to validate() would be called by conductor before invoking get_console()\nhttps://github.com/openstack/ironic/blob/master/ironic/conductor/manager.py#L1631","commit_id":"f9a2143ccaa224869df8355fb0eea4cf1bdc9d01"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"65833cacb78b4892d520423304f13d0c5705aa37","unresolved":false,"context_lines":[{"line_number":815,"context_line":"        :param task: a task from TaskManager."},{"line_number":816,"context_line":"        :raises: MissingParameterValue if required ssh parameters are"},{"line_number":817,"context_line":"                 missing"},{"line_number":818,"context_line":"        :raises: InvalidParameterValue if required parameter are invalid."},{"line_number":819,"context_line":"        \"\"\""},{"line_number":820,"context_line":"        driver_info \u003d _parse_driver_info(task.node)"},{"line_number":821,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_41efb51d","line":818,"updated":"2015-11-30 07:05:37.000000000","message":"s/parameter/parameters","commit_id":"a26d368fdf772813af27f755e0a7d645dba4b995"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"65833cacb78b4892d520423304f13d0c5705aa37","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":823,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":824,"context_line":"                \"\u0027ssh_virt_type\u0027 parameter in node\u0027s \""},{"line_number":825,"context_line":"                \"driver_info is not \u0027virsh\u0027\"))"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":828,"context_line":"            raise exception.MissingParameterValue(_("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_a16b01b6","line":825,"updated":"2015-11-30 07:05:37.000000000","message":"how about - \"ShellinaboxConsole supports \u0027virsh\u0027 value for \u0027ssh_virt_type\u0027 type only?\"","commit_id":"a26d368fdf772813af27f755e0a7d645dba4b995"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"65833cacb78b4892d520423304f13d0c5705aa37","unresolved":false,"context_lines":[{"line_number":827,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":828,"context_line":"            raise exception.MissingParameterValue(_("},{"line_number":829,"context_line":"                \"Missing \u0027ssh_terminal_port\u0027 parameter in node\u0027s \""},{"line_number":830,"context_line":"                \"driver_info\"))"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    def start_console(self, task):"},{"line_number":833,"context_line":"        \"\"\"Start a remote console for the node."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_61b8b92a","line":830,"updated":"2015-11-30 07:05:37.000000000","message":"s/\"driver_info\"/\"\u0027driver_info\u0027\"","commit_id":"a26d368fdf772813af27f755e0a7d645dba4b995"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"886617002835f2933f363a1a2570f3641dba27e1","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":823,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":824,"context_line":"                \"Only support \u0027virsh\u0027 for \u0027ssh_virt_type\u0027 parameter in \""},{"line_number":825,"context_line":"                \"node\u0027s \u0027driver_info\u0027\"))"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":828,"context_line":"            raise exception.MissingParameterValue(_("}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_12aef82d","line":825,"updated":"2015-12-03 14:37:13.000000000","message":"I suggest \"Console is only supported for \u0027virsh\u0027 SSH driver type\"","commit_id":"ed8b68eea979495a2133e7d43e8958e952ebe7f4"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"d708d9f5f94ab73544f7176413d813a0b1bc7b87","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        \u0027port\u0027: port,"},{"line_number":388,"context_line":"        \u0027virt_type\u0027: virt_type,"},{"line_number":389,"context_line":"        \u0027uuid\u0027: node.uuid,"},{"line_number":390,"context_line":"        \u0027terminal_port\u0027: terminal_port"},{"line_number":391,"context_line":"    }"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    cmd_set \u003d _get_command_sets(virt_type)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_f1957732","line":390,"updated":"2015-12-08 15:09:50.000000000","message":"Should it also be added like e.g. password?\n\n if terminal_port:\n     res[\u0027terminal_port\u0027] \u003d terminal_port\n\nAs this is kind of optional parameter for drivers that use SSHManagement and SSHPower.\n\nAlso unittest should be added for this (or some of existing ones changed).","commit_id":"02ab96033c5f7fe536e05cd3c55fd684f22943bf"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"9b7cb4f925b492f5225a07bf4445b8cb03b7d52c","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        \u0027port\u0027: port,"},{"line_number":388,"context_line":"        \u0027virt_type\u0027: virt_type,"},{"line_number":389,"context_line":"        \u0027uuid\u0027: node.uuid,"},{"line_number":390,"context_line":"        \u0027terminal_port\u0027: terminal_port"},{"line_number":391,"context_line":"    }"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    cmd_set \u003d _get_command_sets(virt_type)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_06f543eb","line":390,"in_reply_to":"7a740942_f1957732","updated":"2015-12-09 04:54:39.000000000","message":"it\u0027s not same with password, we need to use res[\u0027terminal_port\u0027] to validate whether it\u0027s specified or not at L826.\n\npassword could not be added as we also have key_contents and key_filename, either one in res is ok.","commit_id":"02ab96033c5f7fe536e05cd3c55fd684f22943bf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":90,"context_line":"COMMON_PROPERTIES.update(OTHER_PROPERTIES)"},{"line_number":91,"context_line":"CONSOLE_PROPERTIES \u003d {"},{"line_number":92,"context_line":"    \u0027ssh_terminal_port\u0027: _(\"node\u0027s UDP port to connect to. \""},{"line_number":93,"context_line":"                           \"Only required for console access.\")"},{"line_number":94,"context_line":"}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"# NOTE(dguerri) Generic boot device map. Virtualisation types that don\u0027t define"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_8cc3a337","line":93,"updated":"2015-12-22 00:26:04.000000000","message":"I think we should mention that this is only applicable for virsh.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":90,"context_line":"COMMON_PROPERTIES.update(OTHER_PROPERTIES)"},{"line_number":91,"context_line":"CONSOLE_PROPERTIES \u003d {"},{"line_number":92,"context_line":"    \u0027ssh_terminal_port\u0027: _(\"node\u0027s UDP port to connect to. \""},{"line_number":93,"context_line":"                           \"Only required for console access.\")"},{"line_number":94,"context_line":"}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"# NOTE(dguerri) Generic boot device map. Virtualisation types that don\u0027t define"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_42057f0e","line":93,"in_reply_to":"3a7e1126_8cc3a337","updated":"2015-12-22 03:13:00.000000000","message":"Done","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":821,"context_line":""},{"line_number":822,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":823,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":824,"context_line":"                \"Console is only supported for \u0027virsh\u0027 SSH driver type\"))"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":827,"context_line":"            raise exception.MissingParameterValue(_("}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_ec0a6725","line":824,"updated":"2015-12-22 00:26:04.000000000","message":"if you try doing a validate, eg \u0027ironic node-validate \u003cnode\u003e\u0027, you\u0027ll see for the \u0027console\u0027 interface that it will show Result\u003dFalse, and Reason\u003dthis string here.\n\nI am wondering whether it is a better user experience for it to show Result\u003dNone with \u0027not supported for non-virsh types\u0027.\n\nWell, to do that means making some changes in conductor/manager.py.\n\nI\u0027m not sure who uses the validate API and whether it makes a difference that we return False (as opposed to None) in this case.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":821,"context_line":""},{"line_number":822,"context_line":"        if driver_info[\u0027virt_type\u0027] !\u003d \u0027virsh\u0027:"},{"line_number":823,"context_line":"            raise exception.InvalidParameterValue(_("},{"line_number":824,"context_line":"                \"Console is only supported for \u0027virsh\u0027 SSH driver type\"))"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"        if not driver_info[\u0027terminal_port\u0027]:"},{"line_number":827,"context_line":"            raise exception.MissingParameterValue(_("}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_b51edb09","line":824,"in_reply_to":"3a7e1126_ec0a6725","updated":"2015-12-22 03:13:00.000000000","message":"thanks Ruby, I can change to use \u0027not supported for non-virsh types\u0027 first, but about Result\u003dNone, I don\u0027t know whether it will affect someone who uses the validate api as well, maybe we can make a change in another patch.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"}],"ironic/tests/unit/drivers/modules/test_ssh.py":[{"author":{"_account_id":14943,"name":"Caio Oliveira","email":"caiobo@lsd.ufcg.edu.br","username":"caiobo"},"change_message_id":"c9a91c210d5b29ee5f035d21d559032041f8192c","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"    def test_console_validate(self):"},{"line_number":1087,"context_line":"        with task_manager.acquire("},{"line_number":1088,"context_line":"                self.context, self.node.uuid, shared\u003dTrue) as task:"},{"line_number":1089,"context_line":"            task.node.driver_info[\u0027ssh_virt_type\u0027] \u003d \u0027virsh\u0027"},{"line_number":1090,"context_line":"            task.node.driver_info[\u0027ssh_terminal_port\u0027] \u003d 123"},{"line_number":1091,"context_line":"            task.driver.console.validate(task)"},{"line_number":1092,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_553efcda","line":1089,"updated":"2015-11-10 19:39:36.000000000","message":"Same comment of \"ssh.py\" module","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"f9ff320c2e6988f32ea582259f0573eefa562d03","unresolved":false,"context_lines":[{"line_number":1115,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"},{"line_number":1116,"context_line":"    @mock.patch.object(console_utils, \u0027start_shellinabox_console\u0027,"},{"line_number":1117,"context_line":"                       autospec\u003dTrue)"},{"line_number":1118,"context_line":"    def test_start_console(self, mock_exec,"},{"line_number":1119,"context_line":"                           get_hosts_name_mock, mock_get_conn):"},{"line_number":1120,"context_line":"        info \u003d ssh._parse_driver_info(self.node)"},{"line_number":1121,"context_line":"        mock_exec.return_value \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_67b01b8b","line":1118,"updated":"2015-11-11 10:00:56.000000000","message":"Miss \u0027InvalidParameterValue\u0027 and \u0027MissingParameterValue\u0027 related tests.\n\nRegarding a new property is added, if here is not the correct place to add these new tests, maybe adding them to the place where \u0027_parse_driver_info\u0027 tests exist is fine.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"73142b241c6376b588a156cd29fac5e91b496301","unresolved":false,"context_lines":[{"line_number":1115,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"},{"line_number":1116,"context_line":"    @mock.patch.object(console_utils, \u0027start_shellinabox_console\u0027,"},{"line_number":1117,"context_line":"                       autospec\u003dTrue)"},{"line_number":1118,"context_line":"    def test_start_console(self, mock_exec,"},{"line_number":1119,"context_line":"                           get_hosts_name_mock, mock_get_conn):"},{"line_number":1120,"context_line":"        info \u003d ssh._parse_driver_info(self.node)"},{"line_number":1121,"context_line":"        mock_exec.return_value \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_ddd75849","line":1118,"in_reply_to":"da85f559_67b01b8b","updated":"2015-11-11 10:21:35.000000000","message":"Hi Kan, please see tests at L1094-L1105.","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"600385a836571ccde3668f3bab049955af8f557a","unresolved":false,"context_lines":[{"line_number":1115,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"},{"line_number":1116,"context_line":"    @mock.patch.object(console_utils, \u0027start_shellinabox_console\u0027,"},{"line_number":1117,"context_line":"                       autospec\u003dTrue)"},{"line_number":1118,"context_line":"    def test_start_console(self, mock_exec,"},{"line_number":1119,"context_line":"                           get_hosts_name_mock, mock_get_conn):"},{"line_number":1120,"context_line":"        info \u003d ssh._parse_driver_info(self.node)"},{"line_number":1121,"context_line":"        mock_exec.return_value \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_51d24729","line":1118,"in_reply_to":"da85f559_ddd75849","updated":"2015-11-12 02:43:33.000000000","message":"Thanks for your reply, Zhenguo. I have seen the tests at L1094-L1105, the content LGTM.\n\nJust a personal opinion here, as the \u0027InvalidParameterValue\u0027 and \u0027MissingParameterValue\u0027 tests are related to the \u0027_parse_driver_info\u0027 function, and there are some existed tests about \u0027missing_user\u0027, \u0027ssh_port_wrong_type\u0027 etc related to this function, maybe moving the tests at L1094-L1105 to the \u0027_parse_driver_info\u0027 related tests place is more suitable.\nhttps://github.com/openstack/ironic/blob/master/ironic/tests/unit/drivers/modules/test_ssh.py#L114","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14943,"name":"Caio Oliveira","email":"caiobo@lsd.ufcg.edu.br","username":"caiobo"},"change_message_id":"c9a91c210d5b29ee5f035d21d559032041f8192c","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"                       autospec\u003dTrue)"},{"line_number":1118,"context_line":"    def test_start_console(self, mock_exec,"},{"line_number":1119,"context_line":"                           get_hosts_name_mock, mock_get_conn):"},{"line_number":1120,"context_line":"        info \u003d ssh._parse_driver_info(self.node)"},{"line_number":1121,"context_line":"        mock_exec.return_value \u003d None"},{"line_number":1122,"context_line":"        get_hosts_name_mock.return_value \u003d \"NodeName\""},{"line_number":1123,"context_line":"        mock_get_conn.return_value \u003d self.sshclient"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_55159c46","line":1120,"updated":"2015-11-10 19:39:36.000000000","message":"Same comment of \"ssh.py\" module","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"f9ff320c2e6988f32ea582259f0573eefa562d03","unresolved":false,"context_lines":[{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"    @mock.patch.object(console_utils, \u0027stop_shellinabox_console\u0027,"},{"line_number":1169,"context_line":"                       autospec\u003dTrue)"},{"line_number":1170,"context_line":"    def test_stop_console(self, mock_exec):"},{"line_number":1171,"context_line":"        info \u003d ssh._parse_driver_info(self.node)"},{"line_number":1172,"context_line":"        mock_exec.return_value \u003d None"},{"line_number":1173,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_8742df66","line":1170,"updated":"2015-11-11 10:00:56.000000000","message":"ditto","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":14810,"name":"Kan","email":"sofaopenstack@gmail.com","username":"Kan"},"change_message_id":"f9ff320c2e6988f32ea582259f0573eefa562d03","unresolved":false,"context_lines":[{"line_number":1193,"context_line":""},{"line_number":1194,"context_line":"    @mock.patch.object(console_utils, \u0027get_shellinabox_console_url\u0027,"},{"line_number":1195,"context_line":"                       autospec\u003dTrue)"},{"line_number":1196,"context_line":"    def test_get_console(self, mock_exec):"},{"line_number":1197,"context_line":"        info \u003d ssh._parse_driver_info(self.node)"},{"line_number":1198,"context_line":"        url \u003d \u0027http://localhost:4201\u0027"},{"line_number":1199,"context_line":"        mock_exec.return_value \u003d url"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_e7388bf1","line":1196,"updated":"2015-11-11 10:00:56.000000000","message":"ditto","commit_id":"54edae832988cfd61984063b4033d71af7d13c25"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"dbc4d3837dac80c17ff709b0e6728354dca40c2f","unresolved":false,"context_lines":[{"line_number":1129,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027],"},{"line_number":1130,"context_line":"                                          info[\u0027terminal_port\u0027],"},{"line_number":1131,"context_line":"                                          mock.ANY)"},{"line_number":1132,"context_line":"        self.assertTrue(mock_exec.called)"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    @mock.patch.object(ssh, \u0027_get_connection\u0027, autospec\u003dTrue)"},{"line_number":1135,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_6507d2ca","line":1132,"updated":"2015-11-26 10:22:48.000000000","message":"this is duplicate. mock_exec.assert_called_once_with is enough.","commit_id":"73dbfe39246e8efa9d6eb424e3d5e064bc35315f"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"9720d524a4555cf3bba67f69909332079d0c3fb5","unresolved":false,"context_lines":[{"line_number":1129,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027],"},{"line_number":1130,"context_line":"                                          info[\u0027terminal_port\u0027],"},{"line_number":1131,"context_line":"                                          mock.ANY)"},{"line_number":1132,"context_line":"        self.assertTrue(mock_exec.called)"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    @mock.patch.object(ssh, \u0027_get_connection\u0027, autospec\u003dTrue)"},{"line_number":1135,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_34756c63","line":1132,"in_reply_to":"9a8ffd7b_6507d2ca","updated":"2015-11-26 14:13:28.000000000","message":"right, thanks Tan, will update soon.","commit_id":"73dbfe39246e8efa9d6eb424e3d5e064bc35315f"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"dbc4d3837dac80c17ff709b0e6728354dca40c2f","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"            self.driver.console.stop_console(task)"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027])"},{"line_number":1179,"context_line":"        self.assertTrue(mock_exec.called)"},{"line_number":1180,"context_line":""},{"line_number":1181,"context_line":"    @mock.patch.object(console_utils, \u0027stop_shellinabox_console\u0027,"},{"line_number":1182,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_c5c31e56","line":1179,"updated":"2015-11-26 10:22:48.000000000","message":"ditto","commit_id":"73dbfe39246e8efa9d6eb424e3d5e064bc35315f"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"dbc4d3837dac80c17ff709b0e6728354dca40c2f","unresolved":false,"context_lines":[{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"        self.assertEqual(expected, console_info)"},{"line_number":1207,"context_line":"        mock_exec.assert_called_once_with(info[\u0027terminal_port\u0027])"},{"line_number":1208,"context_line":"        self.assertTrue(mock_exec.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_c59a3e6e","line":1208,"updated":"2015-11-26 10:22:48.000000000","message":"ditto","commit_id":"73dbfe39246e8efa9d6eb424e3d5e064bc35315f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"d708d9f5f94ab73544f7176413d813a0b1bc7b87","unresolved":false,"context_lines":[{"line_number":1139,"context_line":"        get_hosts_name_mock.return_value \u003d \"NodeName\""},{"line_number":1140,"context_line":"        mock_get_conn.return_value \u003d self.sshclient"},{"line_number":1141,"context_line":"        mock_exec.side_effect \u003d iter("},{"line_number":1142,"context_line":"            [exception.ConsoleSubprocessFailed(error\u003d\u0027error\u0027)])"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1145,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_6c39acd6","line":1142,"updated":"2015-12-08 15:09:50.000000000","message":"There is no need to use iter for side_effect now, iiuc it was fixed in 1.1.3, and global requirements have mock \u003e\u003d 1.2, ditto for other places.","commit_id":"02ab96033c5f7fe536e05cd3c55fd684f22943bf"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"76cbf95a90c734f65a27a5fc7b734a78ed4fe4a1","unresolved":false,"context_lines":[{"line_number":1139,"context_line":"        get_hosts_name_mock.return_value \u003d \"NodeName\""},{"line_number":1140,"context_line":"        mock_get_conn.return_value \u003d self.sshclient"},{"line_number":1141,"context_line":"        mock_exec.side_effect \u003d iter("},{"line_number":1142,"context_line":"            [exception.ConsoleSubprocessFailed(error\u003d\u0027error\u0027)])"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1145,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_a5569bcb","line":1142,"in_reply_to":"7a740942_6c39acd6","updated":"2015-12-09 09:20:05.000000000","message":"Done","commit_id":"02ab96033c5f7fe536e05cd3c55fd684f22943bf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"        with task_manager.acquire("},{"line_number":1109,"context_line":"                self.context, self.node.uuid, shared\u003dTrue) as task:"},{"line_number":1110,"context_line":"            task.node.driver_info[\u0027ssh_terminal_port\u0027] \u003d \u0027\u0027"},{"line_number":1111,"context_line":"            self.assertRaises(exception.InvalidParameterValue,"},{"line_number":1112,"context_line":"                              task.driver.console.validate, task)"},{"line_number":1113,"context_line":""},{"line_number":1114,"context_line":"    @mock.patch.object(ssh, \u0027_get_connection\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_678e902f","line":1111,"updated":"2015-12-22 00:26:04.000000000","message":"A problem with this test and the one above, is that they both expect the same InvalidParameterValue, so how do you know it is the right exception? I have started using self.assertRaisesRegex() to distinguish them. (Guess it is a nit, I don\u0027t really care that much.)","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"        with task_manager.acquire("},{"line_number":1109,"context_line":"                self.context, self.node.uuid, shared\u003dTrue) as task:"},{"line_number":1110,"context_line":"            task.node.driver_info[\u0027ssh_terminal_port\u0027] \u003d \u0027\u0027"},{"line_number":1111,"context_line":"            self.assertRaises(exception.InvalidParameterValue,"},{"line_number":1112,"context_line":"                              task.driver.console.validate, task)"},{"line_number":1113,"context_line":""},{"line_number":1114,"context_line":"    @mock.patch.object(ssh, \u0027_get_connection\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_755cf318","line":1111,"in_reply_to":"3a7e1126_678e902f","updated":"2015-12-22 03:13:00.000000000","message":"thanks Ruby, will try to use assertRaisesRegex() to distinguish them.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"        mock_get_conn.return_value \u003d self.sshclient"},{"line_number":1124,"context_line":""},{"line_number":1125,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1126,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1127,"context_line":"            self.driver.console.start_console(task)"},{"line_number":1128,"context_line":""},{"line_number":1129,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_8775bc32","line":1126,"updated":"2015-12-22 00:26:04.000000000","message":"please use self.node.uuid","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"        mock_get_conn.return_value \u003d self.sshclient"},{"line_number":1124,"context_line":""},{"line_number":1125,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1126,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1127,"context_line":"            self.driver.console.start_console(task)"},{"line_number":1128,"context_line":""},{"line_number":1129,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_027e9769","line":1126,"in_reply_to":"3a7e1126_8775bc32","updated":"2015-12-22 03:13:00.000000000","message":"Done","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"            error\u003d\u0027error\u0027)"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1145,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1146,"context_line":"            self.assertRaises(exception.ConsoleSubprocessFailed,"},{"line_number":1147,"context_line":"                              self.driver.console.start_console,"},{"line_number":1148,"context_line":"                              task)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_c7a664ad","line":1145,"updated":"2015-12-22 00:26:04.000000000","message":"ditto","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1142,"context_line":"            error\u003d\u0027error\u0027)"},{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1145,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1146,"context_line":"            self.assertRaises(exception.ConsoleSubprocessFailed,"},{"line_number":1147,"context_line":"                              self.driver.console.start_console,"},{"line_number":1148,"context_line":"                              task)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_824fe732","line":1145,"in_reply_to":"3a7e1126_c7a664ad","updated":"2015-12-22 03:13:00.000000000","message":"Done","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1145,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1146,"context_line":"            self.assertRaises(exception.ConsoleSubprocessFailed,"},{"line_number":1147,"context_line":"                              self.driver.console.start_console,"},{"line_number":1148,"context_line":"                              task)"},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"    @mock.patch.object(ssh, \u0027_get_connection\u0027, autospec\u003dTrue)"},{"line_number":1151,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_27e968b7","line":1148,"updated":"2015-12-22 00:26:04.000000000","message":"And mock_exec.assert_called_once_with() right?","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1145,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1146,"context_line":"            self.assertRaises(exception.ConsoleSubprocessFailed,"},{"line_number":1147,"context_line":"                              self.driver.console.start_console,"},{"line_number":1148,"context_line":"                              task)"},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"    @mock.patch.object(ssh, \u0027_get_connection\u0027, autospec\u003dTrue)"},{"line_number":1151,"context_line":"    @mock.patch.object(ssh, \u0027_get_hosts_name_for_node\u0027, autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_025a17f2","line":1148,"in_reply_to":"3a7e1126_27e968b7","updated":"2015-12-22 03:13:00.000000000","message":"yes, sorry for miss that.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"        mock_exec.return_value \u003d None"},{"line_number":1172,"context_line":""},{"line_number":1173,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1174,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1175,"context_line":"            self.driver.console.stop_console(task)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_a7d558e5","line":1174,"updated":"2015-12-22 00:26:04.000000000","message":"ditto","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"        mock_exec.return_value \u003d None"},{"line_number":1172,"context_line":""},{"line_number":1173,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1174,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1175,"context_line":"            self.driver.console.stop_console(task)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_82b84712","line":1174,"in_reply_to":"3a7e1126_a7d558e5","updated":"2015-12-22 03:13:00.000000000","message":"Done","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1175,"context_line":"            self.driver.console.stop_console(task)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027])"},{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"    @mock.patch.object(console_utils, \u0027stop_shellinabox_console\u0027,"},{"line_number":1180,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_c7fbc477","line":1177,"updated":"2015-12-22 00:26:04.000000000","message":"is info[\u0027uuid\u0027] the same as self.node.uuid? (just wondering if you need info at all.)","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1175,"context_line":"            self.driver.console.stop_console(task)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"        mock_exec.assert_called_once_with(info[\u0027uuid\u0027])"},{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"    @mock.patch.object(console_utils, \u0027stop_shellinabox_console\u0027,"},{"line_number":1180,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_2292b34c","line":1177,"in_reply_to":"3a7e1126_c7fbc477","updated":"2015-12-22 03:13:00.000000000","message":"yeah, there\u0027s no need to parse the driver info, I forgot to change this while updating the driver codes, thanks Ruby.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1198,"context_line":"        expected \u003d {\u0027type\u0027: \u0027shellinabox\u0027, \u0027url\u0027: url}"},{"line_number":1199,"context_line":""},{"line_number":1200,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1201,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1202,"context_line":"            console_info \u003d self.driver.console.get_console(task)"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        self.assertEqual(expected, console_info)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_6718d0d3","line":1201,"updated":"2015-12-22 00:26:04.000000000","message":"ditto","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1198,"context_line":"        expected \u003d {\u0027type\u0027: \u0027shellinabox\u0027, \u0027url\u0027: url}"},{"line_number":1199,"context_line":""},{"line_number":1200,"context_line":"        with task_manager.acquire(self.context,"},{"line_number":1201,"context_line":"                                  self.node[\u0027uuid\u0027]) as task:"},{"line_number":1202,"context_line":"            console_info \u003d self.driver.console.get_console(task)"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        self.assertEqual(expected, console_info)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_c2496f32","line":1201,"in_reply_to":"3a7e1126_6718d0d3","updated":"2015-12-22 03:13:00.000000000","message":"Done","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"            console_info \u003d self.driver.console.get_console(task)"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        self.assertEqual(expected, console_info)"},{"line_number":1205,"context_line":"        mock_exec.assert_called_once_with(info[\u0027terminal_port\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_0759cc8d","line":1205,"updated":"2015-12-22 00:26:04.000000000","message":"is info[\u0027terminal_port\u0027] None? I don\u0027t see where it was set.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":1202,"context_line":"            console_info \u003d self.driver.console.get_console(task)"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        self.assertEqual(expected, console_info)"},{"line_number":1205,"context_line":"        mock_exec.assert_called_once_with(info[\u0027terminal_port\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_82a4c74a","line":1205,"in_reply_to":"3a7e1126_0759cc8d","updated":"2015-12-22 03:13:00.000000000","message":"yes, it\u0027s None here, will set it after parse_driver_info.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"fd94cc7af1b7210b5a7e3f35eaf9da1605659e0b","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"        with task_manager.acquire("},{"line_number":1101,"context_line":"                self.context, self.node.uuid, shared\u003dTrue) as task:"},{"line_number":1102,"context_line":"            self.assertRaisesRegex(exception.InvalidParameterValue,"},{"line_number":1103,"context_line":"                                   \u0027not supported for non-virsh types\u0027,"},{"line_number":1104,"context_line":"                                   task.driver.console.validate, task)"},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"    def test_console_validate_invalid_port(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a7b0d38_51969495","line":1103,"updated":"2015-12-22 15:34:18.000000000","message":"since it is a regex, you don\u0027t need to put the entire string. I usually just pick a few key words, eg \u0027not supported\u0027.","commit_id":"2e4aa87f43995e9fd70b6abf9e16a083109c6098"}],"releasenotes/notes/ssh-console-58721af6830f8892.yaml":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2338aa27c0ddd681f6d0ac806fd3aabab2c7a6df","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds ShellinaboxConsole support for virsh SSH driver."},{"line_number":4,"context_line":"    For more information, see"},{"line_number":5,"context_line":"    http://specs.openstack.org/openstack/ironic-specs/specs/approved/ssh-console-support.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3a7e1126_0953376c","line":5,"updated":"2015-12-21 14:48:01.000000000","message":"Not sure if it should be added here.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5095c6d5c5992fbc7d4bd590508cfeb1acfc1943","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds ShellinaboxConsole support for virsh SSH driver."},{"line_number":4,"context_line":"    For more information, see"},{"line_number":5,"context_line":"    http://specs.openstack.org/openstack/ironic-specs/specs/approved/ssh-console-support.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3a7e1126_edf7c1d0","line":5,"in_reply_to":"3a7e1126_0953376c","updated":"2015-12-22 00:26:04.000000000","message":"Yeah, I don\u0027t think we should put links to our specs here.\n\nHow about http://docs.openstack.org/developer/ironic/deploy/install-guide.html#configure-node-web-console. Would you please take a look at that and see if it applies to this, and/or whether it needs changes? One thing I see there is \u0027ironic node-update \u003cnode-uuid\u003e add driver_info/\u003cterminal_port\u003e\u003d\u003ccustomized_port\u003e\u0027... You should probably add something about \u0027ssh_terminal_port\u0027 there.","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"7d22251b517e6e99c8158fd4116c3dd8c6c92512","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds ShellinaboxConsole support for virsh SSH driver."},{"line_number":4,"context_line":"    For more information, see"},{"line_number":5,"context_line":"    http://specs.openstack.org/openstack/ironic-specs/specs/approved/ssh-console-support.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3a7e1126_5580d78a","line":5,"in_reply_to":"3a7e1126_edf7c1d0","updated":"2015-12-22 03:13:00.000000000","message":"thanks, as ssh driver mostly uses in test environment with devstack,I plan to enable console in devstack scripts and configure the terminal_port by default for handy tests instead of chaning the install guide, make sense?","commit_id":"7a9a41bcbe6d855c9076234bdfca916c620135af"}]}
