)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f76303df445c12469f87b39382e452dc4dddebd0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Allow hardware managers to override clean step priority"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If two hardware managers have the same clean step, for example"},{"line_number":10,"context_line":"\u0027erase_devices\u0027 in the GenericHardwareManager and a customer manager,"},{"line_number":11,"context_line":"the step should be returned to Ironic with the greater of the two"},{"line_number":12,"context_line":"priorities."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa1b9901_ba08b82e","line":10,"updated":"2015-08-18 23:00:22.000000000","message":"nit: s/customer/custom","commit_id":"61a3c2fddc942e9fa34b5e27465e14f7d72def7f"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"37da208557e592568559a8f3e14a61ab36e681d7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Allow hardware managers to override clean step priority"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If two hardware managers have the same clean step, for example"},{"line_number":10,"context_line":"\u0027erase_devices\u0027 in the GenericHardwareManager and a customer manager,"},{"line_number":11,"context_line":"the step should be returned to Ironic with the greater of the two"},{"line_number":12,"context_line":"priorities."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ba15a1d1_9a77cc01","line":10,"in_reply_to":"fa1b9901_ba08b82e","updated":"2015-09-23 00:07:08.000000000","message":"Done","commit_id":"61a3c2fddc942e9fa34b5e27465e14f7d72def7f"}],"ironic_python_agent/extensions/clean.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"045b5ed01c581a492631e88c57aaf2b5ff446257","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        }"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def _deduplicate_steps(candidate_steps):"},{"line_number":81,"context_line":"        \"\"\"Remove duplicated clean steps"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        Decides priority of duplicated steps by choosing the step from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_3106aa86","line":80,"updated":"2015-07-15 10:12:59.000000000","message":"redundant indentation","commit_id":"a5c2e865a4376529044501162bddd9c690929043"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"856285b9c5776c57755ee0d42191372382a8bdd2","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        }"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"def _deduplicate_steps(candidate_steps):"},{"line_number":81,"context_line":"        \"\"\"Remove duplicated clean steps"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        Decides priority of duplicated steps by choosing the step from the"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_67ea5976","line":80,"in_reply_to":"9a41bdd9_3106aa86","updated":"2015-07-28 00:25:18.000000000","message":"Huh, kinda amazed pep8 didn\u0027t catch this. Thanks, fixed!","commit_id":"a5c2e865a4376529044501162bddd9c690929043"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"045b5ed01c581a492631e88c57aaf2b5ff446257","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        # Initialize the clean_steps dictionary to return with the list of"},{"line_number":131,"context_line":"        # manager names and empty array for steps"},{"line_number":132,"context_line":"        clean_steps \u003d {manager: [] for manager in candidate_steps.keys()}"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # Build the deduplicated clean_steps dictionary in the format"},{"line_number":135,"context_line":"        # {manager_name: [step1, step2..]}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_510b2e8e","line":132,"updated":"2015-07-15 10:12:59.000000000","message":"nit: not needed - see below","commit_id":"a5c2e865a4376529044501162bddd9c690929043"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"045b5ed01c581a492631e88c57aaf2b5ff446257","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        # Build the deduplicated clean_steps dictionary in the format"},{"line_number":135,"context_line":"        # {manager_name: [step1, step2..]}"},{"line_number":136,"context_line":"        for step in deduped_steps.values():"},{"line_number":137,"context_line":"            clean_steps[step[\u0027manager\u0027]].append(step[\u0027step\u0027])"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        return clean_steps"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_f1fb6279","line":137,"updated":"2015-07-15 10:12:59.000000000","message":"nit:\n\n clean_steps.setdefault(step[\u0027manager\u0027], []).append(step[\u0027step\u0027])","commit_id":"a5c2e865a4376529044501162bddd9c690929043"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"856285b9c5776c57755ee0d42191372382a8bdd2","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        # Build the deduplicated clean_steps dictionary in the format"},{"line_number":135,"context_line":"        # {manager_name: [step1, step2..]}"},{"line_number":136,"context_line":"        for step in deduped_steps.values():"},{"line_number":137,"context_line":"            clean_steps[step[\u0027manager\u0027]].append(step[\u0027step\u0027])"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        return clean_steps"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_c7f9ed4f","line":137,"in_reply_to":"9a41bdd9_f1fb6279","updated":"2015-07-28 00:25:18.000000000","message":"Ahh nice, fixed.","commit_id":"a5c2e865a4376529044501162bddd9c690929043"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7f9f812e9ff889614f7d7a56f7cb63cebad95cfd","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                        {\u0027manager\u0027: manager, \u0027steps\u0027: manager_steps})"},{"line_number":102,"context_line":"            continue"},{"line_number":103,"context_line":"        for step in manager_steps:"},{"line_number":104,"context_line":"            deduped_step \u003d deduped_steps.get(step[\u0027step\u0027])"},{"line_number":105,"context_line":"            if not deduped_step:"},{"line_number":106,"context_line":"                # No other manager has this step, add it."},{"line_number":107,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_3a6efa2f","line":104,"updated":"2015-08-04 12:13:45.000000000","message":"nit: would be more readable to assign step[\u0027step\u0027] to a local variable","commit_id":"a08f9c6a947414cd2929d9bf7b787df5851240e4"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f76303df445c12469f87b39382e452dc4dddebd0","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                          \u0027step: %s\u0027, deduped_step)"},{"line_number":135,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":136,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":137,"context_line":"            elif deduped_step is not None:"},{"line_number":138,"context_line":"                LOG.debug(\u0027Not adding duplicated clean step: %s\u0027,"},{"line_number":139,"context_line":"                          deduped_step)"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_4d6d2497","line":137,"updated":"2015-08-18 23:00:22.000000000","message":"This would be executed if there are 2 managers that support a clean step and both have the step marked with the same priority, right? Just trying to make sure I understand what\u0027s going on here.","commit_id":"61a3c2fddc942e9fa34b5e27465e14f7d72def7f"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"37da208557e592568559a8f3e14a61ab36e681d7","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                          \u0027step: %s\u0027, deduped_step)"},{"line_number":135,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":136,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":137,"context_line":"            elif deduped_step is not None:"},{"line_number":138,"context_line":"                LOG.debug(\u0027Not adding duplicated clean step: %s\u0027,"},{"line_number":139,"context_line":"                          deduped_step)"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_7a3438fa","line":137,"in_reply_to":"fa1b9901_4d6d2497","updated":"2015-09-23 00:07:08.000000000","message":"Correct","commit_id":"61a3c2fddc942e9fa34b5e27465e14f7d72def7f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f4dad0aab00c033f43e8ec7491dd286161d1cb1e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"LOG \u003d log.getLogger()"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class CleanExtension(base.BaseAgentExtension):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_5d89abc9","line":24,"updated":"2015-09-24 14:25:40.000000000","message":"mmm, seems like it\u0027s the 2nd LOG here","commit_id":"f8f65ae9631bcaa7321412e5320e6266265df483"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f4dad0aab00c033f43e8ec7491dd286161d1cb1e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                        {\u0027manager\u0027: manager, \u0027steps\u0027: manager_steps})"},{"line_number":119,"context_line":"            continue"},{"line_number":120,"context_line":"        for step in manager_steps:"},{"line_number":121,"context_line":"            deduped_step \u003d deduped_steps.get(step[\u0027step\u0027])"},{"line_number":122,"context_line":"            if not deduped_step:"},{"line_number":123,"context_line":"                # No other manager has this step, add it."},{"line_number":124,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_7d86efba","line":121,"updated":"2015-09-24 14:25:40.000000000","message":"nit: I\u0027d call it \"existing_step\"","commit_id":"f8f65ae9631bcaa7321412e5320e6266265df483"},{"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":"efc7627e137990f13a01aa199ea5b192eabcbf15","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def _deduplicate_steps(candidate_steps):"},{"line_number":95,"context_line":"    \"\"\"Remove duplicated clean steps"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Decides priority of duplicated steps by choosing the step from the"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_404981b6","line":94,"updated":"2015-12-10 19:06:28.000000000","message":"This is non-deterministic. Given multiple hardware managers with an identical step and priority, it will not choose the same hardware manager to \"identify\" as the source of the step.","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"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":"f6f454b99258dcda4685d592c34e7907888188c6","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        }"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def _deduplicate_steps(candidate_steps):"},{"line_number":95,"context_line":"    \"\"\"Remove duplicated clean steps"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Decides priority of duplicated steps by choosing the step from the"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_2dcf8d80","line":94,"in_reply_to":"7a740942_404981b6","updated":"2015-12-10 19:44:55.000000000","message":"Done","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c1cc8682481b3eaa69726a77c3617650d0a996f1","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Decides priority of duplicated steps by choosing the step from the"},{"line_number":98,"context_line":"    hardware manager with the highest hardware support level, with"},{"line_number":99,"context_line":"    the larger priority being the tie breaker"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    :param candidate_steps: The dict return from dispatch_to_all_managers"},{"line_number":102,"context_line":"        for \u0027get_clean_steps\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_5ec1f352","line":99,"updated":"2015-09-29 20:39:38.000000000","message":"nit: s/breaker/breaker./","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"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":"f6f454b99258dcda4685d592c34e7907888188c6","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Decides priority of duplicated steps by choosing the step from the"},{"line_number":98,"context_line":"    hardware manager with the highest hardware support level, with"},{"line_number":99,"context_line":"    the larger priority being the tie breaker"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    :param candidate_steps: The dict return from dispatch_to_all_managers"},{"line_number":102,"context_line":"        for \u0027get_clean_steps\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_00661929","line":99,"in_reply_to":"9a1a9d01_5ec1f352","updated":"2015-12-10 19:44:55.000000000","message":"Done","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c1cc8682481b3eaa69726a77c3617650d0a996f1","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    hardware manager with the highest hardware support level, with"},{"line_number":99,"context_line":"    the larger priority being the tie breaker"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    :param candidate_steps: The dict return from dispatch_to_all_managers"},{"line_number":102,"context_line":"        for \u0027get_clean_steps\u0027"},{"line_number":103,"context_line":"    :returns: A deduplicated dictionary of {hardware_manager:"},{"line_number":104,"context_line":"        [clean-steps]}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_3e919f47","line":101,"updated":"2015-09-29 20:39:38.000000000","message":"nit: s/return/returned/\n\nOr \u0027A dict containing all possible clean steps from all managers, key\u003dmanager, value\u003dlist of clean steps ?","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"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":"f6f454b99258dcda4685d592c34e7907888188c6","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    hardware manager with the highest hardware support level, with"},{"line_number":99,"context_line":"    the larger priority being the tie breaker"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    :param candidate_steps: The dict return from dispatch_to_all_managers"},{"line_number":102,"context_line":"        for \u0027get_clean_steps\u0027"},{"line_number":103,"context_line":"    :returns: A deduplicated dictionary of {hardware_manager:"},{"line_number":104,"context_line":"        [clean-steps]}"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_cae02fcf","line":101,"in_reply_to":"9a1a9d01_3e919f47","updated":"2015-12-10 19:44:55.000000000","message":"Done","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c1cc8682481b3eaa69726a77c3617650d0a996f1","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # We cannot deduplicate steps with unknown hardware support"},{"line_number":112,"context_line":"        if manager not in support:"},{"line_number":113,"context_line":"            LOG.warning(\u0027Unknown hardware support for %(manager)s, \u0027"},{"line_number":114,"context_line":"                        \u0027dropping clean steps: %(steps)\u0027,"},{"line_number":115,"context_line":"                        {\u0027manager\u0027: manager, \u0027steps\u0027: manager_steps})"},{"line_number":116,"context_line":"            continue"},{"line_number":117,"context_line":"        for step in manager_steps:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_7ed95721","line":114,"updated":"2015-09-29 20:39:38.000000000","message":"s/%(steps)/%(steps)s/","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"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":"f6f454b99258dcda4685d592c34e7907888188c6","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # We cannot deduplicate steps with unknown hardware support"},{"line_number":112,"context_line":"        if manager not in support:"},{"line_number":113,"context_line":"            LOG.warning(\u0027Unknown hardware support for %(manager)s, \u0027"},{"line_number":114,"context_line":"                        \u0027dropping clean steps: %(steps)\u0027,"},{"line_number":115,"context_line":"                        {\u0027manager\u0027: manager, \u0027steps\u0027: manager_steps})"},{"line_number":116,"context_line":"            continue"},{"line_number":117,"context_line":"        for step in manager_steps:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_6ae7bbe4","line":114,"in_reply_to":"9a1a9d01_7ed95721","updated":"2015-12-10 19:44:55.000000000","message":"Done","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c1cc8682481b3eaa69726a77c3617650d0a996f1","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            if support[manager] \u003e existing_support:"},{"line_number":128,"context_line":"                # Higher hardware support, use this new step"},{"line_number":129,"context_line":"                LOG.debug(\u0027Dropping lower support level, duplicated clean \u0027"},{"line_number":130,"context_line":"                          \u0027step: %s\u0027, deduped_steps[step[\u0027step\u0027]])"},{"line_number":131,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":132,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":133,"context_line":"            elif (support[manager] \u003d\u003d existing_support and"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_7e7f17ab","line":130,"updated":"2015-09-29 20:39:38.000000000","message":"instead of deduped_steps[..], easier to use existing_step.","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c1cc8682481b3eaa69726a77c3617650d0a996f1","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                          \u0027step: %s\u0027, existing_step)"},{"line_number":138,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":139,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":140,"context_line":"            elif existing_step is not None:"},{"line_number":141,"context_line":"                LOG.debug(\u0027Not adding duplicated clean step: %s\u0027,"},{"line_number":142,"context_line":"                          existing_step)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_29396ba4","line":140,"updated":"2015-09-29 20:39:38.000000000","message":"this doesn\u0027t make sense to me. If we get here, existing_step will always be not None (because of line 119)","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"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":"f6f454b99258dcda4685d592c34e7907888188c6","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                          \u0027step: %s\u0027, existing_step)"},{"line_number":138,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":139,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":140,"context_line":"            elif existing_step is not None:"},{"line_number":141,"context_line":"                LOG.debug(\u0027Not adding duplicated clean step: %s\u0027,"},{"line_number":142,"context_line":"                          existing_step)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_ada13dab","line":140,"in_reply_to":"9a1a9d01_29396ba4","updated":"2015-12-10 19:44:55.000000000","message":"Agreed. Changed this to an else.","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c1cc8682481b3eaa69726a77c3617650d0a996f1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":140,"context_line":"            elif existing_step is not None:"},{"line_number":141,"context_line":"                LOG.debug(\u0027Not adding duplicated clean step: %s\u0027,"},{"line_number":142,"context_line":"                          existing_step)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # Build the deduplicated clean_steps dictionary in the format"},{"line_number":145,"context_line":"    # {manager_name: [step1, step2..]}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_490cdfec","line":142,"updated":"2015-09-29 20:39:38.000000000","message":"don\u0027t you want to log \u0027step\u0027 here (since that is the duplicated step that isn\u0027t being used)","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"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":"f6f454b99258dcda4685d592c34e7907888188c6","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":140,"context_line":"            elif existing_step is not None:"},{"line_number":141,"context_line":"                LOG.debug(\u0027Not adding duplicated clean step: %s\u0027,"},{"line_number":142,"context_line":"                          existing_step)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # Build the deduplicated clean_steps dictionary in the format"},{"line_number":145,"context_line":"    # {manager_name: [step1, step2..]}"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_cd8b691d","line":142,"in_reply_to":"9a1a9d01_490cdfec","updated":"2015-12-10 19:44:55.000000000","message":"Done","commit_id":"850d64b0b6fd7438847cedc0d0ca81834b557d6c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a2f051fa86eded826dcfefc39291dd6af706d686","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            if support[manager] \u003e existing_support:"},{"line_number":128,"context_line":"                # Higher hardware support, use this new step"},{"line_number":129,"context_line":"                LOG.debug(\u0027Dropping lower support level, duplicated clean \u0027"},{"line_number":130,"context_line":"                          \u0027step: %s\u0027, step)"},{"line_number":131,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":132,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":133,"context_line":"            elif (support[manager] \u003d\u003d existing_support and"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a7e1126_40747efc","line":130,"updated":"2015-12-16 23:05:00.000000000","message":"Just wondering if it is worthwhile mentioning the manager (of the dropped step). (Ditto for all the logs here.)","commit_id":"976d22120d2c043efdc00ea362a45c250b59ccaf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"04b7344f0fb01e3daf3db7866cdc486f4e1d507b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            if support[manager] \u003e existing_support:"},{"line_number":128,"context_line":"                # Higher hardware support, use this new step"},{"line_number":129,"context_line":"                LOG.debug(\u0027Dropping lower support level, duplicated clean \u0027"},{"line_number":130,"context_line":"                          \u0027step: %s\u0027, step)"},{"line_number":131,"context_line":"                deduped_steps[step[\u0027step\u0027]] \u003d {"},{"line_number":132,"context_line":"                    \u0027manager\u0027: manager, \u0027step\u0027: step}"},{"line_number":133,"context_line":"            elif (support[manager] \u003d\u003d existing_support and"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_19302656","line":130,"in_reply_to":"3a7e1126_40747efc","updated":"2015-12-22 20:22:07.000000000","message":"That sounds useful.","commit_id":"976d22120d2c043efdc00ea362a45c250b59ccaf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a2f051fa86eded826dcfefc39291dd6af706d686","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                          \u0027hardware support level.\u0027, step)"},{"line_number":143,"context_line":"                continue"},{"line_number":144,"context_line":"            # Use ABC order of HardwareManager name as \"tie breaker\" in case of"},{"line_number":145,"context_line":"            # identical step, priority, and hardware support. This will not"},{"line_number":146,"context_line":"            # impact behavior of cleaning, but instead ensure duplicated steps"},{"line_number":147,"context_line":"            # are always returned as a member of the same HardwareManager."},{"line_number":148,"context_line":"            elif manager \u003c existing_step[\u0027manager\u0027]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a7e1126_9b8177fe","line":145,"updated":"2015-12-16 23:05:00.000000000","message":"I might be wrong, but I think you can also get here if identical step, identical hardware support, and step[priority] \u003c existing_step[..][priority].","commit_id":"976d22120d2c043efdc00ea362a45c250b59ccaf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"04b7344f0fb01e3daf3db7866cdc486f4e1d507b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                          \u0027hardware support level.\u0027, step)"},{"line_number":143,"context_line":"                continue"},{"line_number":144,"context_line":"            # Use ABC order of HardwareManager name as \"tie breaker\" in case of"},{"line_number":145,"context_line":"            # identical step, priority, and hardware support. This will not"},{"line_number":146,"context_line":"            # impact behavior of cleaning, but instead ensure duplicated steps"},{"line_number":147,"context_line":"            # are always returned as a member of the same HardwareManager."},{"line_number":148,"context_line":"            elif manager \u003c existing_step[\u0027manager\u0027]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a7b0d38_f9c67a15","line":145,"in_reply_to":"3a7e1126_9b8177fe","updated":"2015-12-22 20:22:07.000000000","message":"Yes, I think that\u0027s true assuming you\u0027re talking about the block below this (manager \u003c existing_step[\u0027manager\u0027])","commit_id":"976d22120d2c043efdc00ea362a45c250b59ccaf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a2f051fa86eded826dcfefc39291dd6af706d686","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            # identical step, priority, and hardware support. This will not"},{"line_number":146,"context_line":"            # impact behavior of cleaning, but instead ensure duplicated steps"},{"line_number":147,"context_line":"            # are always returned as a member of the same HardwareManager."},{"line_number":148,"context_line":"            elif manager \u003c existing_step[\u0027manager\u0027]:"},{"line_number":149,"context_line":"                LOG.debug(\u0027Duplicate steps found: using ABC order of \u0027"},{"line_number":150,"context_line":"                          \u0027HardwareManager name as tie breaker, dropping \u0027"},{"line_number":151,"context_line":"                          \u0027clean step: %s\u0027, existing_step)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a7e1126_1bc82774","line":148,"updated":"2015-12-16 23:05:00.000000000","message":"This is just a suggestion. It makes more sense to me to group this in one of two other ways:\n\n1. if support \u003e existing:\n   elif support \u003d\u003d existing:\n       if step[priority] \u003e existing_step[priority]:\n       elif step \u003d\u003d existing_step:\n           if manager \u003c existing_step[manager]\n   else:\n       # support \u003c existing; do nothing\n\n2. if support \u003e existing:\n        do your stuff/continue\n   elif support \u003c existing:\n        do nothing/continue\n  \n   # at this point, support \u003d\u003d existing, do your logic of checking step priority, then the ABC ordering of HWManager.","commit_id":"976d22120d2c043efdc00ea362a45c250b59ccaf"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ce586135d18daca79c7d62306cb08541613d9412","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        LOG.debug(\u0027Clean steps before deduplication: %s\u0027, candidate_steps)"},{"line_number":44,"context_line":"        clean_steps \u003d _deduplicate_steps(candidate_steps)"},{"line_number":45,"context_line":"        LOG.debug(\u0027Returning clean steps: %s\u0027, clean_steps)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        return {"},{"line_number":48,"context_line":"            \u0027clean_steps\u0027: clean_steps,"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_60bacb0c","line":45,"updated":"2016-01-07 15:29:22.000000000","message":"Just wondering why you don\u0027t put the LOG.debug in _deduplicate_steps() instead.","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"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":"60c9398c61d8127af0187e4427414f74842a772d","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        LOG.debug(\u0027Clean steps before deduplication: %s\u0027, candidate_steps)"},{"line_number":44,"context_line":"        clean_steps \u003d _deduplicate_steps(candidate_steps)"},{"line_number":45,"context_line":"        LOG.debug(\u0027Returning clean steps: %s\u0027, clean_steps)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        return {"},{"line_number":48,"context_line":"            \u0027clean_steps\u0027: clean_steps,"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_158785d8","line":45,"in_reply_to":"fa69d971_60bacb0c","updated":"2016-01-07 20:00:33.000000000","message":"Honestly it just made more sense for me for the function that exists in the API to log rather than the deduplicate_steps method. I can add more logging or move this if you think it\u0027s needed, but I like it better here.","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ce586135d18daca79c7d62306cb08541613d9412","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    Decides priority of duplicated steps by choosing the step from the"},{"line_number":102,"context_line":"    hardware manager with the highest hardware support level, with"},{"line_number":103,"context_line":"    the larger priority being the tie breaker."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    :param candidate_steps: A dict containing all possible clean steps from"},{"line_number":106,"context_line":"        all managers, key\u003dmanager, value\u003dlist of clean steps"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_3b6ba887","line":103,"updated":"2016-01-07 15:29:22.000000000","message":"I\u0027d like this updated to clarify the priority.\n\nIt looks like: hardware support level, clean-step priority, hardware name.\n\nWhy does IPA allow hardware managers to have the same support level?","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"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":"60c9398c61d8127af0187e4427414f74842a772d","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    Decides priority of duplicated steps by choosing the step from the"},{"line_number":102,"context_line":"    hardware manager with the highest hardware support level, with"},{"line_number":103,"context_line":"    the larger priority being the tie breaker."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    :param candidate_steps: A dict containing all possible clean steps from"},{"line_number":106,"context_line":"        all managers, key\u003dmanager, value\u003dlist of clean steps"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_98ff2caa","line":103,"in_reply_to":"fa69d971_3b6ba887","updated":"2016-01-07 20:00:33.000000000","message":"Updated the docstring to make it more clear.\n\nTo clarify about HardwareSupport in IPA, since it\u0027s inception IPA has advertised 3 support levels, GENERIC (1), MAINLINE (2), and SERVICE_PROVIDER (3), with a guarantee IPA will never ship something with a higher priority than MAINLINE. Admittedly, it\u0027s pretty limiting, but it works fairly well for most cases. I don\u0027t think we could ever enforce unique priorities here, as HardwareManagers are essentially plugins -- enforcing some kind of uniqueness for hardware support becomes nearly impossible as a result.\n\nThat being said, working on this patch has shown me the behavior between two managers that have a \"working\" method and equal HardwareSupport values may not have a deterministic result. I plan on writing a test case for this and hopefully fixing it after this patch.","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ce586135d18daca79c7d62306cb08541613d9412","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                           \u0027support\u0027: support[manager]}"},{"line_number":128,"context_line":"            steps[step[\u0027step\u0027]].append(step)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    for step_name, step in steps.items():"},{"line_number":131,"context_line":"        # determine the max support level among candidate steps"},{"line_number":132,"context_line":"        max_support \u003d max([x[\u0027hwm\u0027][\u0027support\u0027] for x in step])"},{"line_number":133,"context_line":"        # filter out any steps that are not at the max support for this step"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_a0c68347","line":130,"updated":"2016-01-07 15:29:22.000000000","message":"step is a list of steps, right? Maybe call it steplist or step_list or list_steps?","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"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":"60c9398c61d8127af0187e4427414f74842a772d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                           \u0027support\u0027: support[manager]}"},{"line_number":128,"context_line":"            steps[step[\u0027step\u0027]].append(step)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    for step_name, step in steps.items():"},{"line_number":131,"context_line":"        # determine the max support level among candidate steps"},{"line_number":132,"context_line":"        max_support \u003d max([x[\u0027hwm\u0027][\u0027support\u0027] for x in step])"},{"line_number":133,"context_line":"        # filter out any steps that are not at the max support for this step"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_d8d7e4bd","line":130,"in_reply_to":"fa69d971_a0c68347","updated":"2016-01-07 20:00:33.000000000","message":"Done","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ce586135d18daca79c7d62306cb08541613d9412","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        # filter out any steps that are not at the max support for this step"},{"line_number":134,"context_line":"        # filters create generators in py3, wrapping in list() required"},{"line_number":135,"context_line":"        post_support \u003d list(filter("},{"line_number":136,"context_line":"            lambda x: x[\u0027hwm\u0027][\u0027support\u0027] \u003d\u003d max_support, step))"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        # determine the max priority among remaining steps"},{"line_number":139,"context_line":"        max_priority \u003d max([x[\u0027priority\u0027] for x in post_support])"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_bb079817","line":136,"updated":"2016-01-07 15:29:22.000000000","message":"I was wondering why you wanted to use filters. Why can\u0027t you do\n\npost_support \u003d [x for x in step if x[\u0027hwm\u0027][\u0027support\u0027] \u003d\u003d max_support ?\n\nAnd I was thinking maybe s/post_support/max_support_steps/\n\nThis works and is probably ok because the number of hardware managers is small, but the above loops twice over a list. I guess you are trying to avoid the logic in the previous revision.","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"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":"60c9398c61d8127af0187e4427414f74842a772d","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        # filter out any steps that are not at the max support for this step"},{"line_number":134,"context_line":"        # filters create generators in py3, wrapping in list() required"},{"line_number":135,"context_line":"        post_support \u003d list(filter("},{"line_number":136,"context_line":"            lambda x: x[\u0027hwm\u0027][\u0027support\u0027] \u003d\u003d max_support, step))"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        # determine the max priority among remaining steps"},{"line_number":139,"context_line":"        max_priority \u003d max([x[\u0027priority\u0027] for x in post_support])"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_38c64017","line":136,"in_reply_to":"fa69d971_bb079817","updated":"2016-01-07 20:00:33.000000000","message":"This works and is better. Thanks!","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ce586135d18daca79c7d62306cb08541613d9412","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        # filter out any steps that are not at the max priority for this step"},{"line_number":141,"context_line":"        post_priority \u003d list(filter("},{"line_number":142,"context_line":"            lambda x: x[\u0027priority\u0027] \u003d\u003d max_priority,"},{"line_number":143,"context_line":"            post_support))"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        # if there are still multiple steps, sort by hwm name and take"},{"line_number":146,"context_line":"        # the first result"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_5b8c5c7f","line":143,"updated":"2016-01-07 15:29:22.000000000","message":"similar question about why we want to use filter().","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"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":"60c9398c61d8127af0187e4427414f74842a772d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        # filter out any steps that are not at the max priority for this step"},{"line_number":141,"context_line":"        post_priority \u003d list(filter("},{"line_number":142,"context_line":"            lambda x: x[\u0027priority\u0027] \u003d\u003d max_priority,"},{"line_number":143,"context_line":"            post_support))"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        # if there are still multiple steps, sort by hwm name and take"},{"line_number":146,"context_line":"        # the first result"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_f8cf4827","line":143,"in_reply_to":"fa69d971_5b8c5c7f","updated":"2016-01-07 20:00:33.000000000","message":"Done","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6e2d81956bcc91cd49293bbbaa534255f6614ba6","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        # determine the max support level among candidate steps"},{"line_number":143,"context_line":"        max_support \u003d max([x[\u0027hwm\u0027][\u0027support\u0027] for x in step_list])"},{"line_number":144,"context_line":"        # filter out any steps that are not at the max support for this step"},{"line_number":145,"context_line":"        # filters create generators in py3, wrapping in list() required"},{"line_number":146,"context_line":"        max_support_steps \u003d [x for x in step_list"},{"line_number":147,"context_line":"                             if x[\u0027hwm\u0027][\u0027support\u0027] \u003d\u003d max_support]"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_27fd16b4","line":145,"updated":"2016-01-14 20:47:00.000000000","message":"this line is no longer relevant.","commit_id":"c235323378aa199546235b65d40ef9d9a5e5ff7b"}],"ironic_python_agent/hardware.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ce586135d18daca79c7d62306cb08541613d9412","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        If multiple hardware managers return the same step name, the largest"},{"line_number":293,"context_line":"        hardware support value, then largest priority will be used as the"},{"line_number":294,"context_line":"        tie-breaker."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        The steps will be called using `hardware.dispatch_to_managers` and"},{"line_number":297,"context_line":"        handled by the best suited hardware manager. If you need a step to be"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_9b917455","line":294,"updated":"2016-01-07 15:29:22.000000000","message":"probably want to update this to include hardware manager name.","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"},{"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":"60c9398c61d8127af0187e4427414f74842a772d","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        If multiple hardware managers return the same step name, the largest"},{"line_number":293,"context_line":"        hardware support value, then largest priority will be used as the"},{"line_number":294,"context_line":"        tie-breaker."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        The steps will be called using `hardware.dispatch_to_managers` and"},{"line_number":297,"context_line":"        handled by the best suited hardware manager. If you need a step to be"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_789278f8","line":294,"in_reply_to":"fa69d971_9b917455","updated":"2016-01-07 20:00:33.000000000","message":"Done","commit_id":"25a9ad9dabf1e775c493438edf48e5413b09af7c"}],"ironic_python_agent/tests/unit/test_multi_hardware_clean_steps.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6e2d81956bcc91cd49293bbbaa534255f6614ba6","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def test_clean_step_ordering(self):"},{"line_number":84,"context_line":"        as_results \u003d self.agent_extension.get_clean_steps(node\u003d{}, ports\u003d[])"},{"line_number":85,"context_line":"        results \u003d as_results.join().command_result"},{"line_number":86,"context_line":"        self.expected_steps \u003d {"},{"line_number":87,"context_line":"            \u0027clean_steps\u0027: {"},{"line_number":88,"context_line":"                \u0027AFakeGenericHardwareManager\u0027: ["},{"line_number":89,"context_line":"                    {\u0027step\u0027: \u0027duped_gn\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_2afcfb6e","line":86,"updated":"2016-01-14 20:47:00.000000000","message":"s/self.// It is only a local variable.","commit_id":"c235323378aa199546235b65d40ef9d9a5e5ff7b"}]}
