)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d48ab4a6c38230335b0cff3833f37005df722c07","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds a 5 second delay per ipmi address to ipmitool"},{"line_number":10,"context_line":"commands. So that we do not flood the ipmi controler of a node."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"bug #1320513"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Id3849aadf3908133a92157b3e96dd752610533e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_dfa0fff6","line":12,"updated":"2014-05-30 16:02:25.000000000","message":"Closes-Bug?","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f52e87b67e7916665d25c8e2976ac64f095d5f7c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds a 5 second delay per ipmi address to ipmitool"},{"line_number":10,"context_line":"commands. So that we do not flood the ipmi controler of a node."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"bug #1320513"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Id3849aadf3908133a92157b3e96dd752610533e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_02acd09f","line":12,"in_reply_to":"1ae5cdf2_dfa0fff6","updated":"2014-05-30 16:24:41.000000000","message":"Done","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":7882,"name":"Yuiko Takada Mori","email":"yuiko-mori@nec.com","username":"YuikoTakada"},"change_message_id":"6e531aa7b982ff93b6d842a310d88e8d7fd5c275","unresolved":false,"context_lines":[{"line_number":10,"context_line":"the previous patch, to ensure that any given BMC is never \"poked\" more"},{"line_number":11,"context_line":"frequently than this interval, regardless of the calling method."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug #1320513"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Id3849aadf3908133a92157b3e96dd752610533e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"1ae5cdf2_c41f746f","line":13,"updated":"2014-06-16 04:03:40.000000000","message":"Need a \":\" as below.\nCloses-Bug: #1320513","commit_id":"3a4a2b1d7e8ed0badba2a939254b92fe333a1b69"}],"ironic/drivers/modules/ipmitool.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"2e02fff6e846aa4f1992b4b9b447fbc62bc345a8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    # space ipmi commands by at least 5 seconds"},{"line_number":145,"context_line":"    # TODO(NobodyCam): Come up with a better way for this"},{"line_number":146,"context_line":"    while int(time.time()) - LAST_CMD_EPOCH \u003c\u003d 5:"},{"line_number":147,"context_line":"        time.sleep(1)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    # \u0027ipmitool\u0027 command will prompt password if there is no \u0027-f\u0027 option,"},{"line_number":150,"context_line":"    # we set it to \u0027\\0\u0027 to write a password file to support empty password"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ae8d1ca_e4ba3cbf","line":147,"updated":"2014-05-29 19:30:47.000000000","message":"This sleeps across /all/ ipmi nodes. What we need is a last command time per-ipmi-controller, not globally. Also - EPOCH refers to the start of a time coordinate system, its really weirding me out seeing it used for \u0027last time\u0027:)","commit_id":"05d9c88ebd9c51d3299464c7f53f3356d75da210"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"2e02fff6e846aa4f1992b4b9b447fbc62bc345a8","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        args.append(pw_file)"},{"line_number":154,"context_line":"        args.extend(command.split(\" \"))"},{"line_number":155,"context_line":"        LAST_CMD_EPOCH \u003d int(time.time())"},{"line_number":156,"context_line":"        out, err \u003d utils.execute(*args, attempts\u003d3, delay_on_retry\u003dTrue)"},{"line_number":157,"context_line":"        LOG.debug(\"ipmitool stdout: \u0027%(out)s\u0027, stderr: \u0027%(err)s\u0027\","},{"line_number":158,"context_line":"                  {\u0027out\u0027: out, \u0027err\u0027: err})"},{"line_number":159,"context_line":"        return out, err"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ae8d1ca_24ec24c7","line":156,"updated":"2014-05-29 19:30:47.000000000","message":"This isn\u0027t long enough - we need to stop using attempts\u003d3, and instead sleep for 5 seconds on failure ourselves. delay_on_retry does a random backoff that can be as little as 20ms.","commit_id":"05d9c88ebd9c51d3299464c7f53f3356d75da210"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"d1c6cc6a2864cf913be274000a63473c9504d8e9","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        args.extend(command.split(\" \"))"},{"line_number":150,"context_line":"        attempt \u003d 1"},{"line_number":151,"context_line":"        while attempt \u003c\u003d 3:"},{"line_number":152,"context_line":"            # space ipmi commands set to controllers by at least 5 seconds"},{"line_number":153,"context_line":"            # TODO(NobodyCam): Come up with a better way for this that works"},{"line_number":154,"context_line":"            # across conductors."},{"line_number":155,"context_line":"            last_cmd_to_address \u003d LAST_CMD_TIME.get(driver_info[\u0027address\u0027], 0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_deb8212d","line":152,"updated":"2014-05-29 21:12:04.000000000","message":"s/set/sent/","commit_id":"7c2d794db18e226f93d4c828b8af7a45f9c55170"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c8b6f3d218b774e0bcdc1e2f26153262a9439e6a","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            # TODO(NobodyCam): Come up with a better way for this that works"},{"line_number":154,"context_line":"            # across conductors."},{"line_number":155,"context_line":"            last_cmd_to_address \u003d LAST_CMD_TIME.get(driver_info[\u0027address\u0027], 0)"},{"line_number":156,"context_line":"            while int(time.time()) - last_cmd_to_address \u003c\u003d 5:"},{"line_number":157,"context_line":"                time.sleep(1)"},{"line_number":158,"context_line":"            try:"},{"line_number":159,"context_line":"                out, err \u003d utils.execute(*args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_8188fee8","line":156,"updated":"2014-05-29 22:02:14.000000000","message":"this while loop is an entry-condition and should be done before \"while attempt \u003c\u003d 3\". As it is written now, you\u0027ll end up waiting 10 seconds between retries if there is an exception -- 5 seconds at L165 and then another 5 seconds here.\n\nI think what you want to do is this:\n\n  attempt \u003d 0\n  while CONF.min_ipmi_poll_interval \u003e time.time() - LAST_TIME.get(driver_info[\u0027address\u0027], 0):\n    time.sleep(1)\n  while attempt \u003c 3:\n    attempt \u003d attempt + 1\n    try:\n      out, err \u003d utils.execute(*args)\n    except (Some, List, Of, Exceptions):\n      if attempt \u003d\u003d 3:\n        raise\n    else:\n      break\n    finally:\n      LAST_TIME[driver_info[\u0027address\u0027]] \u003d time.time()\n    time.sleep(CONF.min_ipmi_poll_interval)","commit_id":"7c2d794db18e226f93d4c828b8af7a45f9c55170"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c8b6f3d218b774e0bcdc1e2f26153262a9439e6a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            else:"},{"line_number":167,"context_line":"                break"},{"line_number":168,"context_line":"            finally:"},{"line_number":169,"context_line":"                LAST_CMD_TIME[driver_info[\u0027address\u0027]] \u003d int(time.time())"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        LOG.debug(\"ipmitool stdout: \u0027%(out)s\u0027, stderr: \u0027%(err)s\u0027\","},{"line_number":172,"context_line":"                  {\u0027out\u0027: out, \u0027err\u0027: err})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_610cd295","line":169,"updated":"2014-05-29 22:02:14.000000000","message":"Why truncate the sub-second portion of the time?","commit_id":"7c2d794db18e226f93d4c828b8af7a45f9c55170"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"3c485fdd6550c9751805c2be89fc0fe550b76a17","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":162,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"},{"line_number":163,"context_line":"            time.sleep(1)"},{"line_number":164,"context_line":"        while attempt \u003c 3:"},{"line_number":165,"context_line":"            attempt \u003d attempt + 1"},{"line_number":166,"context_line":"            try:"},{"line_number":167,"context_line":"                out, err \u003d utils.execute(*args)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_8c79fcfe","line":164,"updated":"2014-05-30 14:04:08.000000000","message":"attempt \u003c 3 condition will be always true here.","commit_id":"e7b7d9b7dcf06dffbb0ef65ae5e82c4b6c9dd483"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"3c485fdd6550c9751805c2be89fc0fe550b76a17","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            attempt \u003d attempt + 1"},{"line_number":166,"context_line":"            try:"},{"line_number":167,"context_line":"                out, err \u003d utils.execute(*args)"},{"line_number":168,"context_line":"            except Exception:"},{"line_number":169,"context_line":"                if attempt \u003d\u003d 3:"},{"line_number":170,"context_line":"                    # after three attempts actually raise the error"},{"line_number":171,"context_line":"                    raise"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_cce784e3","line":168,"updated":"2014-05-30 14:04:08.000000000","message":"Please do not use generic exception here if possible.","commit_id":"e7b7d9b7dcf06dffbb0ef65ae5e82c4b6c9dd483"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d48ab4a6c38230335b0cff3833f37005df722c07","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        args.extend(command.split(\" \"))"},{"line_number":158,"context_line":"        # space ipmi commands sent to controllers by cmd_send_delay seconds."},{"line_number":159,"context_line":"        # TODO(NobodyCam): Come up with a better way for this that works"},{"line_number":160,"context_line":"        # across conductors."},{"line_number":161,"context_line":"        attempt \u003d 0"},{"line_number":162,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":163,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_bf2c134c","line":160,"updated":"2014-05-30 16:02:25.000000000","message":"+1 using the db would be a better solution","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f52e87b67e7916665d25c8e2976ac64f095d5f7c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        args.extend(command.split(\" \"))"},{"line_number":158,"context_line":"        # space ipmi commands sent to controllers by cmd_send_delay seconds."},{"line_number":159,"context_line":"        # TODO(NobodyCam): Come up with a better way for this that works"},{"line_number":160,"context_line":"        # across conductors."},{"line_number":161,"context_line":"        attempt \u003d 0"},{"line_number":162,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":163,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_62acb4ee","line":160,"in_reply_to":"1ae5cdf2_bf2c134c","updated":"2014-05-30 16:24:41.000000000","message":"thats why I put the TODO in... :)","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d48ab4a6c38230335b0cff3833f37005df722c07","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        attempt \u003d 0"},{"line_number":162,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":163,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"},{"line_number":164,"context_line":"            time.sleep(1)"},{"line_number":165,"context_line":"        while attempt \u003c 3:"},{"line_number":166,"context_line":"            attempt \u003d attempt + 1"},{"line_number":167,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_bfd33337","line":164,"updated":"2014-05-30 16:02:25.000000000","message":"you could find the different of the time and calculate how much time you need to sleep instead of checking every 1 second","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f52e87b67e7916665d25c8e2976ac64f095d5f7c","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        attempt \u003d 0"},{"line_number":162,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":163,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"},{"line_number":164,"context_line":"            time.sleep(1)"},{"line_number":165,"context_line":"        while attempt \u003c 3:"},{"line_number":166,"context_line":"            attempt \u003d attempt + 1"},{"line_number":167,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_e2a0c4f6","line":164,"in_reply_to":"1ae5cdf2_bfd33337","updated":"2014-05-30 16:24:41.000000000","message":"Done","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d48ab4a6c38230335b0cff3833f37005df722c07","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":163,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"},{"line_number":164,"context_line":"            time.sleep(1)"},{"line_number":165,"context_line":"        while attempt \u003c 3:"},{"line_number":166,"context_line":"            attempt \u003d attempt + 1"},{"line_number":167,"context_line":"            try:"},{"line_number":168,"context_line":"                out, err \u003d utils.execute(*args)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_5f3cef2f","line":165,"updated":"2014-05-30 16:02:25.000000000","message":"We should make the number of attemps configurable as well (or at least mention it somewhere)","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f52e87b67e7916665d25c8e2976ac64f095d5f7c","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        while CONF.ipmitool.cmd_send_delay \u003e time.time() - LAST_CMD_TIME.get("},{"line_number":163,"context_line":"                                                    driver_info[\u0027address\u0027], 0):"},{"line_number":164,"context_line":"            time.sleep(1)"},{"line_number":165,"context_line":"        while attempt \u003c 3:"},{"line_number":166,"context_line":"            attempt \u003d attempt + 1"},{"line_number":167,"context_line":"            try:"},{"line_number":168,"context_line":"                out, err \u003d utils.execute(*args)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_02b5b0ed","line":165,"in_reply_to":"1ae5cdf2_5f3cef2f","updated":"2014-05-30 16:24:41.000000000","message":"Done","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d48ab4a6c38230335b0cff3833f37005df722c07","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            except processutils.ProcessExecutionError:"},{"line_number":170,"context_line":"                if attempt \u003d\u003d 3:"},{"line_number":171,"context_line":"                    # after three attempts actually raise the error"},{"line_number":172,"context_line":"                    raise"},{"line_number":173,"context_line":"            else:"},{"line_number":174,"context_line":"                break"},{"line_number":175,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_bfa173ab","line":172,"updated":"2014-05-30 16:02:25.000000000","message":"log","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f52e87b67e7916665d25c8e2976ac64f095d5f7c","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            except processutils.ProcessExecutionError:"},{"line_number":170,"context_line":"                if attempt \u003d\u003d 3:"},{"line_number":171,"context_line":"                    # after three attempts actually raise the error"},{"line_number":172,"context_line":"                    raise"},{"line_number":173,"context_line":"            else:"},{"line_number":174,"context_line":"                break"},{"line_number":175,"context_line":"            finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ae5cdf2_62cbd472","line":172,"in_reply_to":"1ae5cdf2_bfa173ab","updated":"2014-05-30 16:24:41.000000000","message":"Done","commit_id":"10be0c8e74c0780176b3f0fba0bfac7d05146e19"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"344ea0da8744ed33022a5f5ea6c1e1f9c123e7a3","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            time.sleep(time_till_next_poll)"},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            out, err \u003d utils.execute(*args)"},{"line_number":184,"context_line":"            LOG.debug(\"ipmitool stdout: \u0027%(out)s\u0027, stderr: \u0027%(err)s\u0027\","},{"line_number":185,"context_line":"                      {\u0027out\u0027: out, \u0027err\u0027: err})"},{"line_number":186,"context_line":"        finally:"},{"line_number":187,"context_line":"            LAST_CMD_TIME[driver_info[\u0027address\u0027]] \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_df060920","line":184,"updated":"2014-06-02 12:23:57.000000000","message":"I think this debug logging can be removed because we have the same in utils.execute() https://github.com/openstack/ironic/blob/master/ironic/common/utils.py#L65","commit_id":"4f0307d63ab541a45f2f105b11a1f2efbea901d9"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"c9359521a2a475c965ecbd72f773e6706018a72e","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            time.sleep(time_till_next_poll)"},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            out, err \u003d utils.execute(*args)"},{"line_number":184,"context_line":"            LOG.debug(\"ipmitool stdout: \u0027%(out)s\u0027, stderr: \u0027%(err)s\u0027\","},{"line_number":185,"context_line":"                      {\u0027out\u0027: out, \u0027err\u0027: err})"},{"line_number":186,"context_line":"        finally:"},{"line_number":187,"context_line":"            LAST_CMD_TIME[driver_info[\u0027address\u0027]] \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ae5cdf2_7a42593f","line":184,"in_reply_to":"1ae5cdf2_df060920","updated":"2014-06-02 16:57:03.000000000","message":"good catch Yuriy.","commit_id":"4f0307d63ab541a45f2f105b11a1f2efbea901d9"},{"author":{"_account_id":10373,"name":"Nicholas Randon","email":"nicholas.randon@hp.com","username":"randonn"},"change_message_id":"65e49975edb0b07af43ba2f8f70edb876c071834","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    # calculate number of retries"},{"line_number":161,"context_line":"    num_tries \u003d int(CONF.ipmi.retry_timeout / CONF.ipmi.min_command_interval)"},{"line_number":162,"context_line":"    args.append(\u0027-R\u0027)"},{"line_number":163,"context_line":"    args.append(num_tries)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    args.append(\u0027-N\u0027)"},{"line_number":166,"context_line":"    args.append(CONF.ipmi.min_command_interval)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_d16b34ef","line":163,"updated":"2014-06-03 13:09:14.000000000","message":"think this need to be wrapped with an str","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":10373,"name":"Nicholas Randon","email":"nicholas.randon@hp.com","username":"randonn"},"change_message_id":"cbcd675b3b2c1abc04116e9b33f6594c4b4e9ddd","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    # calculate number of retries"},{"line_number":161,"context_line":"    num_tries \u003d int(CONF.ipmi.retry_timeout / CONF.ipmi.min_command_interval)"},{"line_number":162,"context_line":"    args.append(\u0027-R\u0027)"},{"line_number":163,"context_line":"    args.append(num_tries)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    args.append(\u0027-N\u0027)"},{"line_number":166,"context_line":"    args.append(CONF.ipmi.min_command_interval)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_8046b44d","line":163,"in_reply_to":"1ae5cdf2_34944642","updated":"2014-06-03 14:57:28.000000000","message":"so there anther issue see comment 3","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"3209769366b04f265616a021dc40f8c937ba36b8","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    # calculate number of retries"},{"line_number":161,"context_line":"    num_tries \u003d int(CONF.ipmi.retry_timeout / CONF.ipmi.min_command_interval)"},{"line_number":162,"context_line":"    args.append(\u0027-R\u0027)"},{"line_number":163,"context_line":"    args.append(num_tries)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    args.append(\u0027-N\u0027)"},{"line_number":166,"context_line":"    args.append(CONF.ipmi.min_command_interval)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_34944642","line":163,"in_reply_to":"1ae5cdf2_d16b34ef","updated":"2014-06-03 13:26:06.000000000","message":"Nicholas, Oslo processutils does this https://github.com/openstack/oslo-incubator/blob/master/openstack/common/processutils.py#L153","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":10373,"name":"Nicholas Randon","email":"nicholas.randon@hp.com","username":"randonn"},"change_message_id":"65e49975edb0b07af43ba2f8f70edb876c071834","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    args.append(num_tries)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    args.append(\u0027-N\u0027)"},{"line_number":166,"context_line":"    args.append(CONF.ipmi.min_command_interval)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    # \u0027ipmitool\u0027 command will prompt password if there is no \u0027-f\u0027 option,"},{"line_number":169,"context_line":"    # we set it to \u0027\\0\u0027 to write a password file to support empty password"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_f17030de","line":166,"updated":"2014-06-03 13:09:14.000000000","message":"think this need to be wrapped with an str","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"b1c87523941e565e6bd752c29b55f7ca356967de","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # NOTE(deva): ensure that no communications are sent to a BMC more"},{"line_number":175,"context_line":"        #             often than once every min_command_interval seconds."},{"line_number":176,"context_line":"        # TODO(NobodyCam): Come up with a better way for this that works"},{"line_number":177,"context_line":"        #                  across conductors."},{"line_number":178,"context_line":"        time_till_next_poll \u003d CONF.ipmi.min_command_interval - ("},{"line_number":179,"context_line":"                time.time() - LAST_CMD_TIME.get(driver_info[\u0027address\u0027], 0))"},{"line_number":180,"context_line":"        if time_till_next_poll \u003e 0:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_f591e147","line":177,"updated":"2014-06-04 04:30:13.000000000","message":"IPMI access is bound to conductor by the hash ring; thus I don\u0027t believe this TODO is needed.","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f8601ec37173a2c39ad409600b202ccf140bdd3b","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # NOTE(deva): ensure that no communications are sent to a BMC more"},{"line_number":175,"context_line":"        #             often than once every min_command_interval seconds."},{"line_number":176,"context_line":"        # TODO(NobodyCam): Come up with a better way for this that works"},{"line_number":177,"context_line":"        #                  across conductors."},{"line_number":178,"context_line":"        time_till_next_poll \u003d CONF.ipmi.min_command_interval - ("},{"line_number":179,"context_line":"                time.time() - LAST_CMD_TIME.get(driver_info[\u0027address\u0027], 0))"},{"line_number":180,"context_line":"        if time_till_next_poll \u003e 0:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_2ac66c68","line":177,"in_reply_to":"1ae5cdf2_f591e147","updated":"2014-06-04 17:29:06.000000000","message":"Done","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":10373,"name":"Nicholas Randon","email":"nicholas.randon@hp.com","username":"randonn"},"change_message_id":"65e49975edb0b07af43ba2f8f70edb876c071834","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        if time_till_next_poll \u003e 0:"},{"line_number":181,"context_line":"            time.sleep(time_till_next_poll)"},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            out, err \u003d utils.execute(*args)"},{"line_number":184,"context_line":"        finally:"},{"line_number":185,"context_line":"            LAST_CMD_TIME[driver_info[\u0027address\u0027]] \u003d time.time()"},{"line_number":186,"context_line":"        return out, err"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_315d3848","line":183,"updated":"2014-06-03 13:09:14.000000000","message":"need string arguments. seeing this:\n\nOUTPUT\u003dBMC inaccessible for node 92e11067-7753-4895-9198-b9b3e1aa1692: sequence item 10: expected string or Unicode, int found (HTTP 400)","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":5805,"name":"Chris Krelle","email":"nobodycam@gmail.com","username":"nobodycam"},"change_message_id":"f8601ec37173a2c39ad409600b202ccf140bdd3b","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        if time_till_next_poll \u003e 0:"},{"line_number":181,"context_line":"            time.sleep(time_till_next_poll)"},{"line_number":182,"context_line":"        try:"},{"line_number":183,"context_line":"            out, err \u003d utils.execute(*args)"},{"line_number":184,"context_line":"        finally:"},{"line_number":185,"context_line":"            LAST_CMD_TIME[driver_info[\u0027address\u0027]] \u003d time.time()"},{"line_number":186,"context_line":"        return out, err"}],"source_content_type":"text/x-python","patch_set":11,"id":"1ae5cdf2_caaee897","line":183,"in_reply_to":"1ae5cdf2_315d3848","updated":"2014-06-04 17:29:06.000000000","message":"this will be addressed in https://review.openstack.org/#/c/96902","commit_id":"172ee68a909d4b09d09aa665a04d4f85ff2237f3"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"7e1e6789349a36bbe0d0892c634950e5e932e321","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        args.extend(command.split(\" \"))"},{"line_number":207,"context_line":"        out, err \u003d utils.execute(*args)"},{"line_number":208,"context_line":"        LOG.debug(\"ipmitool stdout: \u0027%(out)s\u0027, stderr: \u0027%(err)s\u0027\","},{"line_number":209,"context_line":"                  {\u0027out\u0027: out, \u0027err\u0027: err})"},{"line_number":210,"context_line":"        return out, err"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_290f5189","side":"PARENT","line":209,"updated":"2014-06-04 23:17:35.000000000","message":"Do we want to keep this debug log around?","commit_id":"5aad192aa0bdbfce22badb23b723d3b36d0e2a3b"}]}
