)]}'
{"ironic_python_agent/extensions/base.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c7364e33dac42a6697558e1385f68f9537cad5d7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                                                command_params)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        if type(result_or_error) in (str, unicode):"},{"line_number":83,"context_line":"            if success:"},{"line_number":84,"context_line":"                result_key \u003d \u0027result\u0027"},{"line_number":85,"context_line":"            else:"},{"line_number":86,"context_line":"                result_key \u003d \u0027error\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_ef671ee8","line":83,"updated":"2015-02-18 20:52:55.000000000","message":"Nit: You could write this as \n\nresult_key \u003d \u0027result\u0027 if success else \u0027error\u0027\n\nand save some space. Not necessary to change this, but something to keep in mind when you find yourself in the same situation again.","commit_id":"4b457bf4bd9f4a9c34bc0dd6642cab22a49d2cf5"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"25930d6c0f5cb96b2f983fb8f2875cb3f3305bba","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                                                command_params)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        if type(result_or_error) in (str, unicode):"},{"line_number":83,"context_line":"            if success:"},{"line_number":84,"context_line":"                result_key \u003d \u0027result\u0027"},{"line_number":85,"context_line":"            else:"},{"line_number":86,"context_line":"                result_key \u003d \u0027error\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_0f3c722e","line":83,"in_reply_to":"da86d52c_ef671ee8","updated":"2015-02-18 21:14:01.000000000","message":"Done","commit_id":"4b457bf4bd9f4a9c34bc0dd6642cab22a49d2cf5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9b056bd84ca930bb02cb57d507644376f0d7524e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        super(SyncCommandResult, self).__init__(command_name,"},{"line_number":80,"context_line":"                                                command_params)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        if type(result_or_error) in (str, unicode):"},{"line_number":83,"context_line":"            result_key \u003d \u0027result\u0027 if success else \u0027error\u0027"},{"line_number":84,"context_line":"            result_or_error \u003d {result_key: result_or_error}"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_3eb8afe4","line":82,"updated":"2015-02-24 18:44:35.000000000","message":"Should use six.text_types here because py3, as well as instanceof() rather than type()","commit_id":"f1dec5c2e2972cf571af9845b201bbb22bbc8cea"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"9b056bd84ca930bb02cb57d507644376f0d7524e","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        try:"},{"line_number":148,"context_line":"            result \u003d self.execute_method(**self.command_params)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"            if type(result) in (str, unicode):"},{"line_number":151,"context_line":"                result \u003d {\u0027result\u0027: \u0027{}: {}\u0027.format(self.command_name, result)}"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            with self.command_state_lock:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_5ed0031f","line":150,"updated":"2015-02-24 18:44:35.000000000","message":"Ditto","commit_id":"f1dec5c2e2972cf571af9845b201bbb22bbc8cea"}],"ironic_python_agent/extensions/decom.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import time"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ironic_python_agent.extensions import base"},{"line_number":18,"context_line":"from ironic_python_agent import hardware"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_38fb70c2","line":15,"updated":"2015-02-04 03:52:53.000000000","message":"Use \u0027from time import time\u0027 if you just need the \u0027time\u0027 function. This will remove the need for the wrapper function on line 21.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"5ededdf9b3906f43118c8b75936890459bb5d3bd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import time"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ironic_python_agent.extensions import base"},{"line_number":18,"context_line":"from ironic_python_agent import hardware"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_bb9d9abe","line":15,"in_reply_to":"da86d52c_38fb70c2","updated":"2015-02-04 04:16:13.000000000","message":"Or:\n from time import time as _time\n from time import time as t_time\n\nI guess I\u0027m not a fan of over-writing the library name, but not sure what is considered good form as I\u0027m new here.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"05aa97855650cd88d700cca6c8bc8a2c5c367987","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import time"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ironic_python_agent.extensions import base"},{"line_number":18,"context_line":"from ironic_python_agent import hardware"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_cc28d288","line":15,"in_reply_to":"da86d52c_bb9d9abe","updated":"2015-02-04 07:31:09.000000000","message":"Agreed that you can use \"from time import time\", but the wrapper is for mocking time, which is problematic otherwise. You\u0027ll see this pattern throughout the Ironic code base, unfortunately.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"94eb5aa8f1f4f0a1f1099e2c650446e83cb77373","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import time"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ironic_python_agent.extensions import base"},{"line_number":18,"context_line":"from ironic_python_agent import hardware"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_58380def","line":15,"in_reply_to":"da86d52c_cc28d288","updated":"2015-02-04 16:01:46.000000000","message":"If he uses a decorator instead, then the mocking problem becomes moot, doesn\u0027t it?","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from ironic_python_agent import hardware"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def _time():"},{"line_number":22,"context_line":"    \"\"\"Wraps time.time() for simpler testing.\"\"\""},{"line_number":23,"context_line":"    return time.time()"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_d83334a9","line":21,"updated":"2015-02-04 03:52:53.000000000","message":"See comment on line 15.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class DecomExtension(base.BaseAgentExtension):"},{"line_number":27,"context_line":"    @base.async_command(\u0027erase_hardware\u0027)"},{"line_number":28,"context_line":"    def erase_hardware(self):"},{"line_number":29,"context_line":"        start_time \u003d _time()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        hardware.dispatch_to_managers(\u0027erase_devices\u0027)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_b82e8041","line":29,"updated":"2015-02-04 03:52:53.000000000","message":"See comment for line 33.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        hardware.dispatch_to_managers(\u0027erase_devices\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        total_time \u003d _time() - start_time"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        msg \u003d (\u0027erase_hardware: completed command in {0} seconds\u0027"},{"line_number":36,"context_line":"               ).format(total_time)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_780168ae","line":33,"updated":"2015-02-04 03:52:53.000000000","message":"Should rewrite to use the directly imported function.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"e6a72e166478c4cbf5be3b59336ae4a1f8d58e81","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        total_time \u003d _time() - start_time"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        msg \u003d (\u0027erase_hardware: completed command in {0} seconds\u0027"},{"line_number":36,"context_line":"               ).format(total_time)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_8f8155c5","line":36,"updated":"2015-02-04 17:45:10.000000000","message":"I\u0027m not sure time is the most valuable thing to log here. Just setting any message at all is sufficient IMO. Things like metrics and timestamps on loglines should provide the \"timing\" value.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2b828f1e37254d92bf1915fa212f57d4f32e85a0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        msg \u003d (\u0027erase_hardware: completed command in {0} seconds\u0027"},{"line_number":36,"context_line":"               ).format(total_time)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_4ee69f16","line":38,"updated":"2015-02-04 01:16:20.000000000","message":"I actually think this method is unused right now, we can likely just remove it :)","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"9ae0620e901cf4f381232d4e88fe1e27df77eb2c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        msg \u003d (\u0027erase_hardware: completed command in {0} seconds\u0027"},{"line_number":36,"context_line":"               ).format(total_time)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_10a4b7b8","line":38,"in_reply_to":"da86d52c_0c1f4a5c","updated":"2015-02-04 12:56:41.000000000","message":"When talking to Jim yesterday he mentioned that even though it\u0027s not used in Ironic or IPA, other people might still be using it. Just thought I\u0027d note that :)","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"05aa97855650cd88d700cca6c8bc8a2c5c367987","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        msg \u003d (\u0027erase_hardware: completed command in {0} seconds\u0027"},{"line_number":36,"context_line":"               ).format(total_time)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_0c1f4a5c","line":38,"in_reply_to":"da86d52c_4ee69f16","updated":"2015-02-04 07:31:09.000000000","message":"Yup, and the function it\u0027s exposing will be part of the cleaning interface.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"}],"ironic_python_agent/extensions/flow.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import time"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ironic_python_agent import errors"},{"line_number":18,"context_line":"from ironic_python_agent.extensions import base"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_98153ce7","line":15,"updated":"2015-02-04 03:52:53.000000000","message":"See comments on decom.py","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":21,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def _time():"},{"line_number":25,"context_line":"    \"\"\"Wraps time.time() for simpler testing.\"\"\""},{"line_number":26,"context_line":"    return time.time()"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_7818881e","line":24,"updated":"2015-02-04 03:52:53.000000000","message":"See comments on decom.py","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"e6a72e166478c4cbf5be3b59336ae4a1f8d58e81","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                        \"%s was failed\" % method"},{"line_number":53,"context_line":"                    )"},{"line_number":54,"context_line":"        total_time \u003d _time() - start_time"},{"line_number":55,"context_line":"        msg \u003d (\u0027start_flow executed in {0}s\u0027).format(total_time)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_efae512d","line":55,"updated":"2015-02-04 17:45:10.000000000","message":"Same here; I\u0027m not sure time is valuable.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"}],"ironic_python_agent/extensions/standby.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2c0f6d6dc103fc3e3b6796bc6e7ea073eafa4631","unresolved":false,"context_lines":[{"line_number":34,"context_line":"IMAGE_CHUNK_SIZE \u003d 1024 * 1024  # 1MB"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def _time():"},{"line_number":38,"context_line":"    \"\"\"Wraps time.time() for simpler testing.\"\"\""},{"line_number":39,"context_line":"    return time.time()"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_b8d5a01d","line":37,"updated":"2015-02-04 03:52:53.000000000","message":"See comments on decom.py","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"e6a72e166478c4cbf5be3b59336ae4a1f8d58e81","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            total_time \u003d _time() - start_time"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"            msg \u003d (\u0027cache_image: image ({0}) cached to device ({1}) in \u0027"},{"line_number":225,"context_line":"                   \u0027{2} seconds\u0027).format(image_info[\u0027id\u0027], device, total_time)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        return msg"},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_0f56452a","line":225,"updated":"2015-02-04 17:45:10.000000000","message":"same","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"e6a72e166478c4cbf5be3b59336ae4a1f8d58e81","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        total_time \u003d _time() - start_time"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        msg \u003d (\u0027prepare_image: image ({0}) written to device ({1}) in \u0027"},{"line_number":249,"context_line":"               \u0027{2} seconds\u0027).format(image_info[\u0027id\u0027], device, total_time)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        return msg"},{"line_number":252,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da86d52c_af47f975","line":249,"updated":"2015-02-04 17:45:10.000000000","message":"Again; I love that we\u0027re returning anything at all, and especially in this case indicating the device it was written to is great; but I\u0027m not sure log messages (which these effectively are) are the right place for timing information.","commit_id":"9b511a021c994abc1bb36e0134113277e5f20cfb"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3d60b80f89624cd859136113bec9d9bd1abf07fb","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def cache_image(self, image_info\u003dNone, force\u003dFalse):"},{"line_number":205,"context_line":"        device \u003d hardware.dispatch_to_managers(\u0027get_os_install_device\u0027)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        result_msg \u003d \u0027cache_image: image ({0}) already present on device {1}\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027] or force:"},{"line_number":210,"context_line":"            _download_image(image_info)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_e434eafc","line":207,"updated":"2015-02-10 15:59:21.000000000","message":"why did you decide to return a string, and does/should it always have the format: \u003cmethod name\u003e:\u003cmessage\u003e?\n\nI was thinking that if you always wanted it to have that format, you could return the \u003cmessage\u003e part, and the decorator could generate the \u003cmethod name\u003e:\u003cmessage\u003e string.","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"9e191099013af574d60182f63fa7df539a7f519d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def cache_image(self, image_info\u003dNone, force\u003dFalse):"},{"line_number":205,"context_line":"        device \u003d hardware.dispatch_to_managers(\u0027get_os_install_device\u0027)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        result_msg \u003d \u0027cache_image: image ({0}) already present on device {1}\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027] or force:"},{"line_number":210,"context_line":"            _download_image(image_info)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_782cdb4a","line":207,"in_reply_to":"da86d52c_4d5ce94b","updated":"2015-02-18 20:09:57.000000000","message":"Done","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"cc30aec203037cd3a43f2a62c079cd9269953750","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def cache_image(self, image_info\u003dNone, force\u003dFalse):"},{"line_number":205,"context_line":"        device \u003d hardware.dispatch_to_managers(\u0027get_os_install_device\u0027)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        result_msg \u003d \u0027cache_image: image ({0}) already present on device {1}\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027] or force:"},{"line_number":210,"context_line":"            _download_image(image_info)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_4d5ce94b","line":207,"in_reply_to":"da86d52c_e434eafc","updated":"2015-02-10 23:40:03.000000000","message":"+1 to the decorator approach. Code re-use is always nice :)","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3d60b80f89624cd859136113bec9d9bd1abf07fb","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        result_msg \u003d \u0027cache_image: image ({0}) already present on device {1}\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027] or force:"},{"line_number":210,"context_line":"            _download_image(image_info)"},{"line_number":211,"context_line":"            _write_image(image_info, device)"},{"line_number":212,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_2471a2e0","line":209,"updated":"2015-02-10 15:59:21.000000000","message":"probably outside the scope of this patch, but it looks like image_info could be None, in which case this won\u0027t work...","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"cc30aec203037cd3a43f2a62c079cd9269953750","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        result_msg \u003d \u0027cache_image: image ({0}) already present on device {1}\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027] or force:"},{"line_number":210,"context_line":"            _download_image(image_info)"},{"line_number":211,"context_line":"            _write_image(image_info, device)"},{"line_number":212,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_283b23d2","line":209,"in_reply_to":"da86d52c_2471a2e0","updated":"2015-02-10 23:40:03.000000000","message":"To reach this point in the code, image_info will always have the following attributes: \u0027id\u0027, \u0027urls\u0027, \u0027checksum\u0027. This is due to the constraints specified in the _validate_image_info method (specified in the decorator [1] applied to this method): [2]\n\n[1]: https://github.com/openstack/ironic-python-agent/blob/master/ironic_python_agent/extensions/base.py#L238-L262\n\n[2]: https://github.com/openstack/ironic-python-agent/blob/master/ironic_python_agent/extensions/standby.py#L179-L185","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9b422db4b72345cd212cc4a4509f8333adeb5f1c","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        result_msg \u003d \u0027cache_image: image ({0}) already present on device {1}\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027] or force:"},{"line_number":210,"context_line":"            _download_image(image_info)"},{"line_number":211,"context_line":"            _write_image(image_info, device)"},{"line_number":212,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_9174e9fe","line":209,"in_reply_to":"da86d52c_283b23d2","updated":"2015-02-19 15:54:43.000000000","message":"Whoa. Well, it seems *odd* to have image_info\u003dNone when that isn\u0027t valid, but anyway.","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3d60b80f89624cd859136113bec9d9bd1abf07fb","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            result_msg \u003d \u0027cache_image: image ({0}) cached to device {1}\u0027"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    @base.async_command(\u0027prepare_image\u0027, _validate_image_info)"},{"line_number":219,"context_line":"    def prepare_image(self,"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_6472bae4","line":216,"updated":"2015-02-10 15:59:21.000000000","message":"but what if image_info is None?","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"cc30aec203037cd3a43f2a62c079cd9269953750","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            result_msg \u003d \u0027cache_image: image ({0}) cached to device {1}\u0027"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    @base.async_command(\u0027prepare_image\u0027, _validate_image_info)"},{"line_number":219,"context_line":"    def prepare_image(self,"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_2842433e","line":216,"in_reply_to":"da86d52c_6472bae4","updated":"2015-02-10 23:40:03.000000000","message":"see above.","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3d60b80f89624cd859136113bec9d9bd1abf07fb","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        device \u003d hardware.dispatch_to_managers(\u0027get_os_install_device\u0027)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # don\u0027t write image again if already cached"},{"line_number":225,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027]:"},{"line_number":226,"context_line":"            _download_image(image_info)"},{"line_number":227,"context_line":"            _write_image(image_info, device)"},{"line_number":228,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_e4bf8a5e","line":225,"updated":"2015-02-10 15:59:21.000000000","message":"probably outside the scope of this patch, but it looks like image_info could be None, in which case this won\u0027t work...","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"cc30aec203037cd3a43f2a62c079cd9269953750","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        device \u003d hardware.dispatch_to_managers(\u0027get_os_install_device\u0027)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # don\u0027t write image again if already cached"},{"line_number":225,"context_line":"        if self.cached_image_id !\u003d image_info[\u0027id\u0027]:"},{"line_number":226,"context_line":"            _download_image(image_info)"},{"line_number":227,"context_line":"            _write_image(image_info, device)"},{"line_number":228,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_e854abff","line":225,"in_reply_to":"da86d52c_e4bf8a5e","updated":"2015-02-10 23:40:03.000000000","message":"see above.","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3d60b80f89624cd859136113bec9d9bd1abf07fb","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        result_msg \u003d \u0027prepare_image: image ({0}) written to device {1}\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    @base.async_command(\u0027run_image\u0027)"},{"line_number":238,"context_line":"    def run_image(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_84aa4e17","line":235,"updated":"2015-02-10 15:59:21.000000000","message":"but what if image_info is None?","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"cc30aec203037cd3a43f2a62c079cd9269953750","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        result_msg \u003d \u0027prepare_image: image ({0}) written to device {1}\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    @base.async_command(\u0027run_image\u0027)"},{"line_number":238,"context_line":"    def run_image(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_085adf29","line":235,"in_reply_to":"da86d52c_84aa4e17","updated":"2015-02-10 23:40:03.000000000","message":"see above.","commit_id":"7f32915e5031beea1c95b38cbf4c660c961474c7"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c7364e33dac42a6697558e1385f68f9537cad5d7","unresolved":false,"context_lines":[{"line_number":216,"context_line":"            _download_image(image_info)"},{"line_number":217,"context_line":"            _write_image(image_info, device)"},{"line_number":218,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"            result_msg \u003d \u0027image ({0}) cached to device {1}\u0027"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_6f824e53","line":219,"updated":"2015-02-18 20:52:55.000000000","message":"Nit: Is the extra line necessary?","commit_id":"4b457bf4bd9f4a9c34bc0dd6642cab22a49d2cf5"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"25930d6c0f5cb96b2f983fb8f2875cb3f3305bba","unresolved":false,"context_lines":[{"line_number":216,"context_line":"            _download_image(image_info)"},{"line_number":217,"context_line":"            _write_image(image_info, device)"},{"line_number":218,"context_line":"            self.cached_image_id \u003d image_info[\u0027id\u0027]"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"            result_msg \u003d \u0027image ({0}) cached to device {1}\u0027"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_0f239205","line":219,"in_reply_to":"da86d52c_6f824e53","updated":"2015-02-18 21:14:01.000000000","message":"Nope! Done.","commit_id":"4b457bf4bd9f4a9c34bc0dd6642cab22a49d2cf5"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c7364e33dac42a6697558e1385f68f9537cad5d7","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if configdrive is not None:"},{"line_number":237,"context_line":"            _write_configdrive_to_partition(configdrive, device)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        result_msg \u003d \u0027image ({0}) written to device {1}\u0027"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_afc6069a","line":239,"updated":"2015-02-18 20:52:55.000000000","message":"Nit: You could remove the need for the result_msg variable if you just formatted and returned the string in one step.","commit_id":"4b457bf4bd9f4a9c34bc0dd6642cab22a49d2cf5"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"25930d6c0f5cb96b2f983fb8f2875cb3f3305bba","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if configdrive is not None:"},{"line_number":237,"context_line":"            _write_configdrive_to_partition(configdrive, device)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        result_msg \u003d \u0027image ({0}) written to device {1}\u0027"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        return result_msg.format(image_info[\u0027id\u0027], device)"},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da86d52c_8204b915","line":239,"in_reply_to":"da86d52c_afc6069a","updated":"2015-02-18 21:14:01.000000000","message":"Done. This was an artifact from the last patch where I removed the command_name prefix. Previously it would not have been able to fit very nicely across lines without parenthesized strings for spanning multiple lines. Anyways, new patch incoming.","commit_id":"4b457bf4bd9f4a9c34bc0dd6642cab22a49d2cf5"}]}
