)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Naohiro Tamura \u003cnaohirot@jp.fujitsu.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-01 18:38:10 +0900"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generic power I/F for soft reboot and soft power off"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates the generic power interface to support SOFT_REBOOT"},{"line_number":10,"context_line":"and SOFT_POWER_OFF."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"bacf61ea_f133da60","line":7,"updated":"2016-08-02 13:00:48.000000000","message":"I/F -\u003e interface","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Naohiro Tamura \u003cnaohirot@jp.fujitsu.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-01 18:38:10 +0900"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generic power I/F for soft reboot and soft power off"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates the generic power interface to support SOFT_REBOOT"},{"line_number":10,"context_line":"and SOFT_POWER_OFF."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"bacf61ea_d2caa64e","line":7,"in_reply_to":"bacf61ea_f133da60","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll fix that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Generic power I/F for soft reboot and soft power off"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates the generic power interface to support SOFT_REBOOT"},{"line_number":10,"context_line":"and SOFT_POWER_OFF."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: #1526226"},{"line_number":13,"context_line":"Change-Id: I1c9bbd1f11f6a8565607c874b3c99aa10eeb62a5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"bacf61ea_d1385640","line":10,"updated":"2016-08-02 13:00:48.000000000","message":"please mention introduction of \"timeout\"","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Generic power I/F for soft reboot and soft power off"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates the generic power interface to support SOFT_REBOOT"},{"line_number":10,"context_line":"and SOFT_POWER_OFF."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: #1526226"},{"line_number":13,"context_line":"Change-Id: I1c9bbd1f11f6a8565607c874b3c99aa10eeb62a5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"bacf61ea_12c55e3b","line":10,"in_reply_to":"bacf61ea_d1385640","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll fix that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90daac16e86a5594b3f81e162f824fd4133dc5c5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generic power interface for soft reboot and soft power off"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates the generic power interface to support SOFT_REBOOT"},{"line_number":10,"context_line":"and SOFT_POWER_OFF, and also introduces \"timeout\" optional parameter."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: #1526226"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"1a6eadb0_b1a3ec4e","line":9,"updated":"2016-12-19 13:52:18.000000000","message":"Please update commit message to be more specific here. From this message new argument timeout is applicable only for SOFT_* actions, while after looking into code it will affect all operations including power ON, OFF.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generic power interface for soft reboot and soft power off"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates the generic power interface to support SOFT_REBOOT"},{"line_number":10,"context_line":"and SOFT_POWER_OFF, and also introduces \"timeout\" optional parameter."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partial-Bug: #1526226"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"1a6eadb0_84f3f49e","line":9,"in_reply_to":"1a6eadb0_b1a3ec4e","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"}],"doc/source/dev/webapi-version-history.rst":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc5e17156373278df1b4eddfb00bfa4ddab1440a","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft reboot`` and ``soft power off`` to the ``target`` field of the"},{"line_number":8,"context_line":"    power state. And also add ``timeout`` field to the power state."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.26** (Ocata)"}],"source_content_type":"text/x-rst","patch_set":31,"id":"1a6eadb0_77594c8e","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":20},"updated":"2016-12-19 11:49:21.000000000","message":"\"soft rebooting\" in states.py","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft reboot`` and ``soft power off`` to the ``target`` field of the"},{"line_number":8,"context_line":"    power state. And also add ``timeout`` field to the power state."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.26** (Ocata)"}],"source_content_type":"text/x-rst","patch_set":31,"id":"1a6eadb0_d1b8752d","line":7,"range":{"start_line":7,"start_character":47,"end_line":7,"end_character":53},"updated":"2016-12-19 11:20:16.000000000","message":"as possible values for the","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft reboot`` and ``soft power off`` to the ``target`` field of the"},{"line_number":8,"context_line":"    power state. And also add ``timeout`` field to the power state."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.26** (Ocata)"}],"source_content_type":"text/x-rst","patch_set":31,"id":"1a6eadb0_537c3772","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":20},"in_reply_to":"1a6eadb0_77594c8e","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft reboot`` and ``soft power off`` to the ``target`` field of the"},{"line_number":8,"context_line":"    power state. And also add ``timeout`` field to the power state."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.26** (Ocata)"}],"source_content_type":"text/x-rst","patch_set":31,"id":"1a6eadb0_b3aaebd0","line":7,"range":{"start_line":7,"start_character":47,"end_line":7,"end_character":53},"in_reply_to":"1a6eadb0_d1b8752d","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft reboot`` and ``soft power off`` to the ``target`` field of the"},{"line_number":8,"context_line":"    power state. And also add ``timeout`` field to the power state."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.26** (Ocata)"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-rst","patch_set":31,"id":"1a6eadb0_7145e115","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":67},"updated":"2016-12-19 11:20:16.000000000","message":"power state change payload, and also adds ``timeout`` field to it.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft reboot`` and ``soft power off`` to the ``target`` field of the"},{"line_number":8,"context_line":"    power state. And also add ``timeout`` field to the power state."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.26** (Ocata)"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-rst","patch_set":31,"id":"1a6eadb0_13d0ff52","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":67},"in_reply_to":"1a6eadb0_7145e115","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f39e6b8f2aed685bdea66c8643dc85701087bf22","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft rebooting`` and ``soft power off`` as possible values"},{"line_number":8,"context_line":"    for the ``target`` field of the power state change payload, and"},{"line_number":9,"context_line":"    also adds ``timeout`` field to it."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"**1.26** (Ocata)"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"1a6eadb0_7048f25c","line":9,"range":{"start_line":9,"start_character":9,"end_line":9,"end_character":13},"updated":"2016-12-21 16:33:36.000000000","message":"nit - add","commit_id":"a426f9dce7825b49d09b9fc2f21ade68b65e3158"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"afbc73b6ae6c2e94afd5db00da5f1d092069ac02","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add ``soft rebooting`` and ``soft power off`` as possible values"},{"line_number":8,"context_line":"    for the ``target`` field of the power state change payload, and"},{"line_number":9,"context_line":"    also adds ``timeout`` field to it."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"**1.26** (Ocata)"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"da4df55a_42467224","line":9,"range":{"start_line":9,"start_character":9,"end_line":9,"end_character":13},"in_reply_to":"1a6eadb0_7048f25c","updated":"2016-12-22 05:10:15.000000000","message":"I\u0027ll fix that.","commit_id":"a426f9dce7825b49d09b9fc2f21ade68b65e3158"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":410,"context_line":"            raise"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":413,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text, wtypes.text,"},{"line_number":414,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":415,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":416,"context_line":"        \"\"\"Set the power state of the node."}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_71f1aa95","line":413,"updated":"2016-08-02 13:00:48.000000000","message":"timeout is integer, not text","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":410,"context_line":"            raise"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":413,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text, wtypes.text,"},{"line_number":414,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":415,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":416,"context_line":"        \"\"\"Set the power state of the node."}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_b2d612c1","line":413,"in_reply_to":"bacf61ea_71f1aa95","updated":"2016-08-04 09:29:04.000000000","message":"I struggled a little bit and confirmed that the type of \u0027timeout\u0027 value was \u0027int\u0027 event though wtypes.txt by the debugger before submitting this patch set 6. \nAnyway I\u0027ll try to fix again.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        #                    target state from the current one"},{"line_number":430,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":431,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if target not in [ir_states.POWER_ON,"},{"line_number":434,"context_line":"                          ir_states.POWER_OFF,"},{"line_number":435,"context_line":"                          ir_states.REBOOT,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_51ee26b5","line":432,"updated":"2016-08-02 13:00:48.000000000","message":"due to our API versioning we need to hide this change behind the new version. please see e.g. provision states for examples of such change. In pseudocode it essentially boils down to:\n\n if (target in [SOFT_REBOOT, SOFT_POWER_OFF] or timeout) and api_version \u003c API_VERSION_SOFT_OFF:\n   raise exception.NotAcceptable()","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        #                    target state from the current one"},{"line_number":430,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":431,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if target not in [ir_states.POWER_ON,"},{"line_number":434,"context_line":"                          ir_states.POWER_OFF,"},{"line_number":435,"context_line":"                          ir_states.REBOOT,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_d202a63d","line":432,"in_reply_to":"bacf61ea_51ee26b5","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll fix that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                          ir_states.POWER_OFF,"},{"line_number":435,"context_line":"                          ir_states.REBOOT,"},{"line_number":436,"context_line":"                          ir_states.SOFT_REBOOT,"},{"line_number":437,"context_line":"                          ir_states.SOFT_POWER_OFF]:"},{"line_number":438,"context_line":"            raise exception.InvalidStateRequested("},{"line_number":439,"context_line":"                action\u003dtarget, node\u003dnode_ident,"},{"line_number":440,"context_line":"                state\u003drpc_node.power_state)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_b12962f5","line":437,"updated":"2016-08-02 13:00:48.000000000","message":"let\u0027s make it a constant ALLOWED_TARGET_POWER_STATES and move to ironic.common.states","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                          ir_states.POWER_OFF,"},{"line_number":435,"context_line":"                          ir_states.REBOOT,"},{"line_number":436,"context_line":"                          ir_states.SOFT_REBOOT,"},{"line_number":437,"context_line":"                          ir_states.SOFT_POWER_OFF]:"},{"line_number":438,"context_line":"            raise exception.InvalidStateRequested("},{"line_number":439,"context_line":"                action\u003dtarget, node\u003dnode_ident,"},{"line_number":440,"context_line":"                state\u003drpc_node.power_state)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_72a2da4c","line":437,"in_reply_to":"bacf61ea_b12962f5","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll fix that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"60cccaea9c25d41d7769978ffca11aaa0a8bea6e","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                     readonly\u003dTrue)"},{"line_number":350,"context_line":"    \"\"\"The desired RAID configuration, to be used the next time the node"},{"line_number":351,"context_line":"    is configured.\"\"\""},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    @staticmethod"},{"line_number":354,"context_line":"    def convert(rpc_node):"},{"line_number":355,"context_line":"        attr_list \u003d [\u0027console_enabled\u0027, \u0027last_error\u0027, \u0027power_state\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_e9909445","line":352,"updated":"2016-10-03 03:02:46.000000000","message":"Are we going to add supported_power_status listed in REST API impacts in the SPEC[1]?\n\n[1] https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/enhance-power-interface-for-soft-reboot-and-nmi.html#rest-api-impact","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"0209ca4d9b617933f973ad03398d29411cf34938","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                     readonly\u003dTrue)"},{"line_number":350,"context_line":"    \"\"\"The desired RAID configuration, to be used the next time the node"},{"line_number":351,"context_line":"    is configured.\"\"\""},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    @staticmethod"},{"line_number":354,"context_line":"    def convert(rpc_node):"},{"line_number":355,"context_line":"        attr_list \u003d [\u0027console_enabled\u0027, \u0027last_error\u0027, \u0027power_state\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_ed009536","line":352,"in_reply_to":"3a98d1f4_e9909445","updated":"2016-10-03 07:26:29.000000000","message":"No, we discussed it during the spec review.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"f3f459284ea7b0de48d12ad41ac6820be36b576a","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                                     readonly\u003dTrue)"},{"line_number":350,"context_line":"    \"\"\"The desired RAID configuration, to be used the next time the node"},{"line_number":351,"context_line":"    is configured.\"\"\""},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    @staticmethod"},{"line_number":354,"context_line":"    def convert(rpc_node):"},{"line_number":355,"context_line":"        attr_list \u003d [\u0027console_enabled\u0027, \u0027last_error\u0027, \u0027power_state\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_d9bc50de","line":352,"in_reply_to":"3a98d1f4_ed009536","updated":"2016-10-04 00:39:14.000000000","message":"I see.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            raise"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":440,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text, int,"},{"line_number":441,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":442,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":443,"context_line":"        \"\"\"Set the power state of the node."}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_6253c7e2","line":440,"range":{"start_line":440,"start_character":58,"end_line":440,"end_character":61},"updated":"2016-10-07 16:56:41.000000000","message":"can we use wtypes.IntegerType? it allows to specify the minimum value.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            raise"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":440,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text, int,"},{"line_number":441,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":442,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":443,"context_line":"        \"\"\"Set the power state of the node."}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_9c9377fa","line":440,"range":{"start_line":440,"start_character":58,"end_line":440,"end_character":61},"in_reply_to":"1a95cdbc_6253c7e2","updated":"2016-10-11 08:27:55.000000000","message":"I\u0027ll fix that.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        :param node_ident: the UUID or logical name of a node."},{"line_number":446,"context_line":"        :param target: The desired power state of the node."},{"line_number":447,"context_line":"        :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":448,"context_line":"          ``None`` indicates to use default timeout."},{"line_number":449,"context_line":"        :raises: ClientSideError (HTTP 409) if a power operation is"},{"line_number":450,"context_line":"                 already in progress."},{"line_number":451,"context_line":"        :raises: InvalidStateRequested (HTTP 400) if the requested target"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_620107af","line":448,"range":{"start_line":448,"start_character":12,"end_line":448,"end_character":16},"updated":"2016-10-07 16:56:41.000000000","message":"Hm, you add an int validator, is it even possible not to specify it?","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        :param node_ident: the UUID or logical name of a node."},{"line_number":446,"context_line":"        :param target: The desired power state of the node."},{"line_number":447,"context_line":"        :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":448,"context_line":"          ``None`` indicates to use default timeout."},{"line_number":449,"context_line":"        :raises: ClientSideError (HTTP 409) if a power operation is"},{"line_number":450,"context_line":"                 already in progress."},{"line_number":451,"context_line":"        :raises: InvalidStateRequested (HTTP 400) if the requested target"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_68f8a17d","line":448,"range":{"start_line":448,"start_character":12,"end_line":448,"end_character":16},"in_reply_to":"1a95cdbc_620107af","updated":"2016-10-11 08:27:55.000000000","message":"Yes, it\u0027s necessary to accept lower api version call.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        :raises: InvalidStateRequested (HTTP 400) if the requested target"},{"line_number":452,"context_line":"                 state is not valid or if the node is in CLEANING state."},{"line_number":453,"context_line":"        :raises: NotAcceptable for soft reboot, soft power off or timeout,"},{"line_number":454,"context_line":"          if requested version of the API is less than 1.21."},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        \"\"\""},{"line_number":457,"context_line":"        cdict \u003d pecan.request.context.to_dict()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_42716b75","line":454,"range":{"start_line":454,"start_character":55,"end_line":454,"end_character":59},"updated":"2016-10-07 16:56:41.000000000","message":"needs a bump","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        :raises: InvalidStateRequested (HTTP 400) if the requested target"},{"line_number":452,"context_line":"                 state is not valid or if the node is in CLEANING state."},{"line_number":453,"context_line":"        :raises: NotAcceptable for soft reboot, soft power off or timeout,"},{"line_number":454,"context_line":"          if requested version of the API is less than 1.21."},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        \"\"\""},{"line_number":457,"context_line":"        cdict \u003d pecan.request.context.to_dict()"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_a8c8f975","line":454,"range":{"start_line":454,"start_character":55,"end_line":454,"end_character":59},"in_reply_to":"1a95cdbc_42716b75","updated":"2016-10-11 08:27:55.000000000","message":"I\u0027ll fix that.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"60cccaea9c25d41d7769978ffca11aaa0a8bea6e","unresolved":false,"context_lines":[{"line_number":743,"context_line":"    \"\"\"The resource class for the node, useful for classifying or grouping"},{"line_number":744,"context_line":"       nodes. Used, for example, to classify nodes in Nova\u0027s placement"},{"line_number":745,"context_line":"       engine.\"\"\""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    # NOTE: properties should use a class to enforce required properties"},{"line_number":748,"context_line":"    #       current list: arch, cpus, disk, ram, image"},{"line_number":749,"context_line":"    properties \u003d {wtypes.text: types.jsontype}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_c9bf58a8","line":746,"updated":"2016-10-03 03:02:46.000000000","message":"ditto","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"46478e22549d7de32f478fba81d82b239d9ed79d","unresolved":false,"context_lines":[{"line_number":743,"context_line":"    \"\"\"The resource class for the node, useful for classifying or grouping"},{"line_number":744,"context_line":"       nodes. Used, for example, to classify nodes in Nova\u0027s placement"},{"line_number":745,"context_line":"       engine.\"\"\""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    # NOTE: properties should use a class to enforce required properties"},{"line_number":748,"context_line":"    #       current list: arch, cpus, disk, ram, image"},{"line_number":749,"context_line":"    properties \u003d {wtypes.text: types.jsontype}"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_d4685ebd","line":746,"in_reply_to":"3a98d1f4_40fbe078","updated":"2016-10-05 08:52:38.000000000","message":"implemented in another patch, https://review.openstack.org/#/c/382194/","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"bfa597be95c0a0e4df6b2c3a10a474eca3306785","unresolved":false,"context_lines":[{"line_number":743,"context_line":"    \"\"\"The resource class for the node, useful for classifying or grouping"},{"line_number":744,"context_line":"       nodes. Used, for example, to classify nodes in Nova\u0027s placement"},{"line_number":745,"context_line":"       engine.\"\"\""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    # NOTE: properties should use a class to enforce required properties"},{"line_number":748,"context_line":"    #       current list: arch, cpus, disk, ram, image"},{"line_number":749,"context_line":"    properties \u003d {wtypes.text: types.jsontype}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_40fbe078","line":746,"in_reply_to":"3a98d1f4_793fbcb3","updated":"2016-10-04 07:45:50.000000000","message":"Aha, now I understood, I\u0027ll fix that. Thanks Hironori!","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"f3f459284ea7b0de48d12ad41ac6820be36b576a","unresolved":false,"context_lines":[{"line_number":743,"context_line":"    \"\"\"The resource class for the node, useful for classifying or grouping"},{"line_number":744,"context_line":"       nodes. Used, for example, to classify nodes in Nova\u0027s placement"},{"line_number":745,"context_line":"       engine.\"\"\""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    # NOTE: properties should use a class to enforce required properties"},{"line_number":748,"context_line":"    #       current list: arch, cpus, disk, ram, image"},{"line_number":749,"context_line":"    properties \u003d {wtypes.text: types.jsontype}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_793fbcb3","line":746,"in_reply_to":"3a98d1f4_8d9e3105","updated":"2016-10-04 00:39:14.000000000","message":"These endpoints are listed in the spec to add supported_power_states.\n  - GET /v1/nodes/(node_ident)\n  - GET /v1/nodes/(node_ident)/states\nSo, I added comments to NodeState and Node.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"0209ca4d9b617933f973ad03398d29411cf34938","unresolved":false,"context_lines":[{"line_number":743,"context_line":"    \"\"\"The resource class for the node, useful for classifying or grouping"},{"line_number":744,"context_line":"       nodes. Used, for example, to classify nodes in Nova\u0027s placement"},{"line_number":745,"context_line":"       engine.\"\"\""},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    # NOTE: properties should use a class to enforce required properties"},{"line_number":748,"context_line":"    #       current list: arch, cpus, disk, ram, image"},{"line_number":749,"context_line":"    properties \u003d {wtypes.text: types.jsontype}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a98d1f4_8d9e3105","line":746,"in_reply_to":"3a98d1f4_c9bf58a8","updated":"2016-10-03 07:26:29.000000000","message":"ditto? is this typo?","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"07d1379672b890ace51f6bd32ab5065c99e3bf46","unresolved":false,"context_lines":[{"line_number":439,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":440,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":441,"context_line":"                   wtypes.IntegerType(minimum\u003d1),"},{"line_number":442,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":443,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":444,"context_line":"        \"\"\"Set the power state of the node."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        :param node_ident: the UUID or logical name of a node."}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_4c51140e","line":443,"range":{"start_line":442,"start_character":52,"end_line":443,"end_character":40},"updated":"2016-10-18 12:36:11.000000000","message":"if timeout may be set in conf file by user, why you are passing this as a parameter to this method? What do you think about just erasing this parameter and user only config value in order to avoid redundance?\nOr opposite thing: erase it from config and use in the client... I propose just not to use it in both ways","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"249f38476ca626ba98edc5c31b09b26aed0e8564","unresolved":false,"context_lines":[{"line_number":439,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":440,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":441,"context_line":"                   wtypes.IntegerType(minimum\u003d1),"},{"line_number":442,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":443,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":444,"context_line":"        \"\"\"Set the power state of the node."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        :param node_ident: the UUID or logical name of a node."}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_19d1c757","line":443,"range":{"start_line":442,"start_character":52,"end_line":443,"end_character":40},"in_reply_to":"fa6399be_2c63b21b","updated":"2016-10-20 09:21:32.000000000","message":"Thank you for your reply, I was not -1-ing basing on that , just was interested","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"1a249d1bbd325e767d874063ab03159c75509e92","unresolved":false,"context_lines":[{"line_number":439,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":440,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":441,"context_line":"                   wtypes.IntegerType(minimum\u003d1),"},{"line_number":442,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":443,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":444,"context_line":"        \"\"\"Set the power state of the node."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"        :param node_ident: the UUID or logical name of a node."}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_2c63b21b","line":443,"range":{"start_line":442,"start_character":52,"end_line":443,"end_character":40},"in_reply_to":"fa6399be_4c51140e","updated":"2016-10-20 01:39:57.000000000","message":"Timeout value in the config file is for all of managed nodes.\nBasically soft power timeout does NOT depend on baremetal hardware or a kind of power driver such as ipmitool driver, but each user\u0027s OS and application.\nIf large database is running on a OS, soft power off is likely to take longer than the timeout in the config file.\nBut if timeout in the config is changed to a larger value, it is likely to be long for other managed nodes.","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"07d1379672b890ace51f6bd32ab5065c99e3bf46","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":464,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":467,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_2c4ce075","line":467,"range":{"start_line":466,"start_character":8,"end_line":467,"end_character":64},"updated":"2016-10-18 12:36:11.000000000","message":"I think, it is wrong to use timeout value to define if state will be changed or not. Timeout option is not demonstrative for that\n\nWhat do you think about new option in config responsible for turning on and off \u0027soft power off\u0027 and \u0027soft reboot\u0027 options (if you leave soft_power_off_timeout)","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"1a249d1bbd325e767d874063ab03159c75509e92","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":464,"context_line":"        topic \u003d pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":467,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_27d3cb39","line":467,"range":{"start_line":466,"start_character":8,"end_line":467,"end_character":64},"in_reply_to":"fa6399be_2c4ce075","updated":"2016-10-20 01:39:57.000000000","message":"Hmm, this code just checks if API call has the required API version or not for the two cases:\n 1) SOFT_REBOOT or SOFT_POWER_OFF operation\n 2) ANY operation with timeout parameter\n\nSo it should be OK, WDYT?\n\nIn terms of the new option in config, I believe that other part of my replies has an answer to you.","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"07d1379672b890ace51f6bd32ab5065c99e3bf46","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":471,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":472,"context_line":"            raise exception.NotAcceptable("},{"line_number":473,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_80ce93b2","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":46},"updated":"2016-10-18 12:36:11.000000000","message":"Could you explain, why wtypes.IntegerType does not work for this case?\n\nnit: may be, if you are sure that it does not work, it can be checked by extending wtypes.IntegerType somehow? I did not try it yet, but I think it should work like this? What do you think about attempt to do this?","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"1a8db84eb40827d5b90ffe80bc8192e60dc533ea","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":471,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":472,"context_line":"            raise exception.NotAcceptable("},{"line_number":473,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6895a0_b655b81e","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":46},"in_reply_to":"da6895a0_f1c023e3","updated":"2016-10-21 08:43:23.000000000","message":"Well.. I see that for this method in master there are also hacks like this one so it is ok to do like you are doing\nAnd to make work what I propose, I think it is not enough just decorator. \nBut let\u0027s see what more experienced reviewers will say, if it possible to do better","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d0b41f97fd73a1e5d2c280170e8986628fe0ad53","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":471,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":472,"context_line":"            raise exception.NotAcceptable("},{"line_number":473,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"da6895a0_f1c023e3","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":46},"in_reply_to":"fa6399be_59f09ffd","updated":"2016-10-21 04:27:34.000000000","message":"Galyna,\n\nThanks for the helpful information.\nI tried the following 6 patterns and several other patterns, but even though timeout is 0 the function returned HTTP status code 202, or even though timeout is 2 it returned 400.\n\nDo you have any advice?\n\nIn addition to your reference, I referred to http://wsme.readthedocs.io/en/latest/gettingstarted.html?highlight\u003dvalidate\n\n    @METRICS.timer(\u0027NodeStatesController.power\u0027)\n    @wsme.validate(types.uuid_or_name, wtypes.text, wtypes.IntegerType(minimum\u003d1))\n    @expose.expose(None, types.uuid_or_name, wtypes.text,\n                   wtypes.IntegerType(minimum\u003d1),\n                   status_code\u003dhttp_client.ACCEPTED)\n    def power(self, node_ident, target, timeout\u003dNone):\n\n    @METRICS.timer(\u0027NodeStatesController.power\u0027)\n    @wsme.validate(types.uuid_or_name, wtypes.text, wtypes.IntegerType(minimum\u003d1))\n    @expose.expose(None, types.uuid_or_name, wtypes.text,\n                   wtypes.IntegerType,\n                   status_code\u003dhttp_client.ACCEPTED)\n    def power(self, node_ident, target, timeout\u003dNone):\n\n\n    @METRICS.timer(\u0027NodeStatesController.power\u0027)\n    @wsme.validate(types.uuid_or_name, wtypes.text, wtypes.IntegerType(minimum\u003d1))\n    @expose.expose(None, types.uuid_or_name, wtypes.text,\n                   int,\n                   status_code\u003dhttp_client.ACCEPTED)\n    def power(self, node_ident, target, timeout\u003dNone):\n\n\n    @METRICS.timer(\u0027NodeStatesController.power\u0027)\n    @expose.expose(None, types.uuid_or_name, wtypes.text,\n                   wtypes.IntegerType(minimum\u003d1),\n                   status_code\u003dhttp_client.ACCEPTED)\n    @wsme.validate(types.uuid_or_name, wtypes.text, wtypes.IntegerType(minimum\u003d1))\n    def power(self, node_ident, target, timeout\u003dNone):\n\n    @METRICS.timer(\u0027NodeStatesController.power\u0027)\n    @expose.expose(None, types.uuid_or_name, wtypes.text,\n                   wtypes.IntegerType,\n                   status_code\u003dhttp_client.ACCEPTED)\n    @wsme.validate(types.uuid_or_name, wtypes.text, wtypes.IntegerType(minimum\u003d1))\n    def power(self, node_ident, target, timeout\u003dNone):\n\n\n    @METRICS.timer(\u0027NodeStatesController.power\u0027)\n    @expose.expose(None, types.uuid_or_name, wtypes.text,\n                   int,\n                   status_code\u003dhttp_client.ACCEPTED)\n    @wsme.validate(types.uuid_or_name, wtypes.text, wtypes.IntegerType(minimum\u003d1))\n    def power(self, node_ident, target, timeout\u003dNone):","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"1a249d1bbd325e767d874063ab03159c75509e92","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":471,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":472,"context_line":"            raise exception.NotAcceptable("},{"line_number":473,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_c7aa0fd2","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":46},"in_reply_to":"fa6399be_80ce93b2","updated":"2016-10-20 01:39:57.000000000","message":"wtypes.IntegerType(minimum\u003d1) validates that the timeout is int, but not minimum\u003d1.\nIf timeout is 0, wtypes.IntegerType(minimum\u003d1) doesn\u0027t cause an error.\n\nI spent a certain amount of time to investigate, but I couldn\u0027t figure out if it is a bug or my usage is wrong.\n\nAny advice or hint is very appreciated.","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"249f38476ca626ba98edc5c31b09b26aed0e8564","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            raise exception.NotAcceptable()"},{"line_number":469,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":470,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":471,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":472,"context_line":"            raise exception.NotAcceptable("},{"line_number":473,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_59f09ffd","line":471,"range":{"start_line":471,"start_character":8,"end_line":471,"end_character":46},"in_reply_to":"fa6399be_c7aa0fd2","updated":"2016-10-20 09:21:32.000000000","message":"You can use standard validate method from wsme Integer Type .\nhttp://wsme.readthedocs.io/en/latest/_modules/wsme/types.html\n\nI did this in the patch https://review.openstack.org/#/c/345248/9\nThere I had String Type, but it works the same way, they are all children of UserType\n\nThe methods accepting these kinds of params use wsme.validate as decorator (see https://github.com/openstack/ironic/blob/master/ironic/api/controllers/v1/chassis.py#L284) and it works for UserType, so you can just add here this decorator and no need in this timeout workaround\n\nThank you for your attention to this","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3fb332c4ba23d1aa5bd6725f96b5ca4272659671","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        :param node_ident: the UUID or logical name of a node."},{"line_number":448,"context_line":"        :param target: The desired power state of the node."},{"line_number":449,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":450,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":451,"context_line":"        :raises: ClientSideError (HTTP 409) if a power operation is"},{"line_number":452,"context_line":"                 already in progress."},{"line_number":453,"context_line":"        :raises: InvalidStateRequested (HTTP 400) if the requested target"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_2581554e","line":450,"updated":"2016-11-30 10:40:21.000000000","message":"Question, this timeout affects all operations ? Hard power off and soft power off for example ?\n\nIf it\u0027s related to soft opeartions only we should indicate it.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a7b261bca89195717cadf5d8eabd301240399107","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        :param node_ident: the UUID or logical name of a node."},{"line_number":448,"context_line":"        :param target: The desired power state of the node."},{"line_number":449,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":450,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":451,"context_line":"        :raises: ClientSideError (HTTP 409) if a power operation is"},{"line_number":452,"context_line":"                 already in progress."},{"line_number":453,"context_line":"        :raises: InvalidStateRequested (HTTP 400) if the requested target"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_05718ca8","line":450,"in_reply_to":"5a74a57a_2581554e","updated":"2016-12-01 06:22:49.000000000","message":"Yes, this timeout affects all operation.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3fb332c4ba23d1aa5bd6725f96b5ca4272659671","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":468,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":469,"context_line":"            raise exception.NotAcceptable()"},{"line_number":470,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":471,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":472,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":473,"context_line":"            raise exception.NotAcceptable("},{"line_number":474,"context_line":"                _(\"timeout has to be positive integer\"))"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_45865166","line":471,"range":{"start_line":470,"start_character":8,"end_line":471,"end_character":72},"updated":"2016-11-30 10:40:21.000000000","message":":-(\n\nDo we have a bug for this in WSME ?","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a7b261bca89195717cadf5d8eabd301240399107","unresolved":false,"context_lines":[{"line_number":467,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":468,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":469,"context_line":"            raise exception.NotAcceptable()"},{"line_number":470,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":471,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":472,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":473,"context_line":"            raise exception.NotAcceptable("},{"line_number":474,"context_line":"                _(\"timeout has to be positive integer\"))"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_b4500bd6","line":471,"range":{"start_line":470,"start_character":8,"end_line":471,"end_character":72},"in_reply_to":"5a74a57a_45865166","updated":"2016-12-01 06:22:49.000000000","message":"I feel that the following might have something to do with this.\n\nhttps://bugs.launchpad.net/wsme/+bug/1227039\n\nBut it has been fixed in WSME 0.8.0.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3fb332c4ba23d1aa5bd6725f96b5ca4272659671","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":471,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":472,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":473,"context_line":"            raise exception.NotAcceptable("},{"line_number":474,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        if target not in ALLOWED_TARGET_POWER_STATES:"},{"line_number":477,"context_line":"            raise exception.InvalidStateRequested("}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_a5956589","line":474,"range":{"start_line":473,"start_character":12,"end_line":474,"end_character":56},"updated":"2016-11-30 10:40:21.000000000","message":"Not sure if NotAcceptable (406) is the right error here ? This value has nothing to do with the headers that were sent in.\n\nThis should be a BadRequest (400).\n\nhttps://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a7b261bca89195717cadf5d8eabd301240399107","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":471,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":472,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":473,"context_line":"            raise exception.NotAcceptable("},{"line_number":474,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        if target not in ALLOWED_TARGET_POWER_STATES:"},{"line_number":477,"context_line":"            raise exception.InvalidStateRequested("}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_45aaa4d3","line":474,"range":{"start_line":473,"start_character":12,"end_line":474,"end_character":56},"in_reply_to":"5a74a57a_a5956589","updated":"2016-12-01 06:22:49.000000000","message":"I\u0027ll fix that.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"6964f3f41268c159224513559b1a219774a52cd6","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":469,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":470,"context_line":"            raise exception.NotAcceptable()"},{"line_number":471,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":472,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":473,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":474,"context_line":"            raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_471f475b","line":471,"range":{"start_line":471,"start_character":10,"end_line":471,"end_character":14},"updated":"2016-12-19 09:41:24.000000000","message":"s/Note/FIXME","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":469,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":470,"context_line":"            raise exception.NotAcceptable()"},{"line_number":471,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":472,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":473,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":474,"context_line":"            raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_18881c22","line":471,"range":{"start_line":471,"start_character":10,"end_line":471,"end_character":14},"in_reply_to":"1a6eadb0_471f475b","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":469,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":470,"context_line":"            raise exception.NotAcceptable()"},{"line_number":471,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":472,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":473,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":474,"context_line":"            raise exception.Invalid("},{"line_number":475,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        if target not in ALLOWED_TARGET_POWER_STATES:"},{"line_number":478,"context_line":"            raise exception.InvalidStateRequested("}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_c41fd5b5","line":475,"range":{"start_line":471,"start_character":8,"end_line":475,"end_character":56},"updated":"2016-12-19 11:20:16.000000000","message":"OK, that\u0027s weird. The proper thing to do here is I think to define a new method in ironic types module, that will be doing validation in frombasetype method instead of validate.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        if ((target in [ir_states.SOFT_REBOOT, ir_states.SOFT_POWER_OFF] or"},{"line_number":469,"context_line":"             timeout) and not api_utils.allow_soft_power_off()):"},{"line_number":470,"context_line":"            raise exception.NotAcceptable()"},{"line_number":471,"context_line":"        # Note(naohirot): This check is workaround because"},{"line_number":472,"context_line":"        #                 wtypes.IntegerType(minimum\u003d1) is not effective"},{"line_number":473,"context_line":"        if timeout is not None and timeout \u003c 1:"},{"line_number":474,"context_line":"            raise exception.Invalid("},{"line_number":475,"context_line":"                _(\"timeout has to be positive integer\"))"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        if target not in ALLOWED_TARGET_POWER_STATES:"},{"line_number":478,"context_line":"            raise exception.InvalidStateRequested("}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_3834f8f9","line":475,"range":{"start_line":471,"start_character":8,"end_line":475,"end_character":56},"in_reply_to":"1a6eadb0_c41fd5b5","updated":"2016-12-20 08:08:32.000000000","message":"Yes, it\u0027s very weird. I think we will not have good luck even if we defined the new type in ironic type module it wouldn\u0027t work with the decorator @expose.expose().\nWDYT?","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"31eaca25bc8703b5a365073663bbbdf82e687ffb","unresolved":false,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    @METRICS.timer(\u0027NodeStatesController.power\u0027)"},{"line_number":441,"context_line":"    @expose.expose(None, types.uuid_or_name, wtypes.text,"},{"line_number":442,"context_line":"                   wtypes.IntegerType(minimum\u003d1),"},{"line_number":443,"context_line":"                   status_code\u003dhttp_client.ACCEPTED)"},{"line_number":444,"context_line":"    def power(self, node_ident, target, timeout\u003dNone):"},{"line_number":445,"context_line":"        \"\"\"Set the power state of the node."}],"source_content_type":"text/x-python","patch_set":33,"id":"da4df55a_d6793631","line":442,"updated":"2016-12-22 13:12:38.000000000","message":"So the fix for that is defining the custom type in types.py as follows:\n\n class IntegerType(wtypes.IntegerType):\n\n     @staticmethod\n     def frombasetype(value):\n         if value is not None:\n             super(IntegerType, IntegerType).validate(value)\n         return super(IntegerType, IntegerType).frombasetype(value)\n\nand using types.IntegerType(minimum\u003d1) here. Just a thing to keep in mind, can be fixed later. Fixing it in wsme, i.e. doing validate inside frombasetype may break other projects using it, so we\u0027ll have to do that hack ^^.","commit_id":"45593302f4e5b62780632fc70a49ec1d77408cc5"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3fb332c4ba23d1aa5bd6725f96b5ca4272659671","unresolved":false,"context_lines":[{"line_number":362,"context_line":"def allow_soft_power_off():"},{"line_number":363,"context_line":"    \"\"\"Check if Soft Power Off is allowed for the node."},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    Version 1.26 of the API allows Soft Power Off for the node."},{"line_number":366,"context_line":"    \"\"\""},{"line_number":367,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_26_SOFT_POWER_OFF"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_a5dc8575","line":365,"updated":"2016-11-30 10:40:21.000000000","message":"nit: and soft reboot as well","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a7b261bca89195717cadf5d8eabd301240399107","unresolved":false,"context_lines":[{"line_number":362,"context_line":"def allow_soft_power_off():"},{"line_number":363,"context_line":"    \"\"\"Check if Soft Power Off is allowed for the node."},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    Version 1.26 of the API allows Soft Power Off for the node."},{"line_number":366,"context_line":"    \"\"\""},{"line_number":367,"context_line":"    return pecan.request.version.minor \u003e\u003d versions.MINOR_26_SOFT_POWER_OFF"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_4591c499","line":365,"in_reply_to":"5a74a57a_a5dc8575","updated":"2016-12-01 06:22:49.000000000","message":"I\u0027ll fix that.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":80,"context_line":"MINOR_23_SOFT_POWER_OFF \u003d 23"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"# When adding another version, update MINOR_MAX_VERSION and also update"},{"line_number":83,"context_line":"# doc/source/webapi/v1.rst with a detailed explanation of what the version has"},{"line_number":84,"context_line":"# changed."},{"line_number":85,"context_line":"MINOR_MAX_VERSION \u003d MINOR_23_SOFT_POWER_OFF"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_e2b19702","line":83,"updated":"2016-10-07 16:56:41.000000000","message":"Please leave the comment as is, it\u0027s not v1.rst anymore.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":80,"context_line":"MINOR_23_SOFT_POWER_OFF \u003d 23"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"# When adding another version, update MINOR_MAX_VERSION and also update"},{"line_number":83,"context_line":"# doc/source/webapi/v1.rst with a detailed explanation of what the version has"},{"line_number":84,"context_line":"# changed."},{"line_number":85,"context_line":"MINOR_MAX_VERSION \u003d MINOR_23_SOFT_POWER_OFF"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_e873d1b2","line":83,"in_reply_to":"1a95cdbc_e2b19702","updated":"2016-10-11 08:27:55.000000000","message":"I\u0027ll fix that.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"}],"ironic/conductor/manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"            if new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":178,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":179,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":180,"context_line":"            else:"},{"line_number":181,"context_line":"                power_timeout \u003d timeout"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_d101766c","line":179,"updated":"2016-08-02 13:00:48.000000000","message":"I don\u0027t think we should apply option called \"soft_power_off_timeout\" to hard power off. Please either rename the option, or only used it for SOFT_POWER_OFF","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"            if new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":178,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":179,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":180,"context_line":"            else:"},{"line_number":181,"context_line":"                power_timeout \u003d timeout"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_0d6383dd","line":179,"in_reply_to":"bacf61ea_d101766c","updated":"2016-08-04 09:29:04.000000000","message":"You are right, it must be my careless mistake,\ns/states.POWER_OFF/states.SOFT_REBOOT/","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"daa142f706deae9816e3695a9a8c7aae36b757f6","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            task.driver.power.validate(task)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            if new_state in (states.SOFT_REBOOT, states.SOFT_POWER_OFF):"},{"line_number":175,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":176,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":177,"context_line":"            else:"},{"line_number":178,"context_line":"                power_timeout \u003d timeout"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_d655f3f9","line":176,"range":{"start_line":175,"start_character":0,"end_line":176,"end_character":71},"updated":"2016-09-27 23:39:17.000000000","message":"This should be in each power interface implementation since it seems that a driver could define its own timeout parameter[1].\nIf timeout is set here, the own parameter never works.\n\n[1] https://review.openstack.org/#/c/216743/8/ironic/drivers/modules/irmc/power.py@103","commit_id":"1fc2decb178bdb49e27fd9424833e32bd4b738fd"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"94e3fb51f0501f3fdf7a8ee048539c6e03db5d36","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            task.driver.power.validate(task)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            if new_state in (states.SOFT_REBOOT, states.SOFT_POWER_OFF):"},{"line_number":175,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":176,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":177,"context_line":"            else:"},{"line_number":178,"context_line":"                power_timeout \u003d timeout"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a98d1f4_5d7725d4","line":176,"range":{"start_line":175,"start_character":0,"end_line":176,"end_character":71},"in_reply_to":"5a8bc5a2_ab054715","updated":"2016-09-29 12:28:25.000000000","message":"I got it. Thank you for the kind reply.","commit_id":"1fc2decb178bdb49e27fd9424833e32bd4b738fd"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"c008d97982a06a87c6683fbd1eb8b41903e2831d","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            task.driver.power.validate(task)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            if new_state in (states.SOFT_REBOOT, states.SOFT_POWER_OFF):"},{"line_number":175,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":176,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":177,"context_line":"            else:"},{"line_number":178,"context_line":"                power_timeout \u003d timeout"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_ab054715","line":176,"range":{"start_line":175,"start_character":0,"end_line":176,"end_character":71},"in_reply_to":"5a8bc5a2_d655f3f9","updated":"2016-09-28 01:18:01.000000000","message":"iRMC implementation is wrong, I\u0027ll fix iRMC code.\n\nWe had discussed timeout a lot in the spec review [1].\nThe conclusion is that timeout value does NOT depend on a driver, but user OS.\nThat is the reason we added the timeout parameter in API so that user can set appropriate timeout value for each user OS.\n\n[1] https://review.openstack.org/#/c/186700/","commit_id":"1fc2decb178bdb49e27fd9424833e32bd4b738fd"},{"author":{"_account_id":22724,"name":"Galyna Zholtkevych","email":"galynazholtkevych1991@gmail.com","username":"gzholtkevych"},"change_message_id":"07d1379672b890ace51f6bd32ab5065c99e3bf46","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                    {\u0027driver\u0027: task.node.driver, \u0027state\u0027: new_state})"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"            if new_state in (states.SOFT_REBOOT, states.SOFT_POWER_OFF):"},{"line_number":188,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":189,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":190,"context_line":"            else:"},{"line_number":191,"context_line":"                power_timeout \u003d timeout"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_4c93d44f","line":189,"range":{"start_line":188,"start_character":32,"end_line":189,"end_character":71},"updated":"2016-10-18 12:36:11.000000000","message":"nit: why you use one timeout option for both states? if you use config value, it is not really clear for soft reboot","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"1a249d1bbd325e767d874063ab03159c75509e92","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                    {\u0027driver\u0027: task.node.driver, \u0027state\u0027: new_state})"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"            if new_state in (states.SOFT_REBOOT, states.SOFT_POWER_OFF):"},{"line_number":188,"context_line":"                power_timeout \u003d (timeout or"},{"line_number":189,"context_line":"                                 CONF.conductor.soft_power_off_timeout)"},{"line_number":190,"context_line":"            else:"},{"line_number":191,"context_line":"                power_timeout \u003d timeout"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_2cb652dc","line":189,"range":{"start_line":188,"start_character":32,"end_line":189,"end_character":71},"in_reply_to":"fa6399be_4c93d44f","updated":"2016-10-20 01:39:57.000000000","message":"In the spec [1], we agreed on that \u0027timeout\u0027 optional parameter should be effective not only soft power operation but also hard power operation. This has been decided in  the spec review that user confuses if timeout parameter is applied to only soft power operation in CLI or API. We must create soft_timeout parameter to avoid this issue, howerver it\u0027s not consistent for user because there is hard_timeout exists in the current conductor code which user cannot change the hard_timeout through the CLI or API,  \n\n[1] http://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/enhance-power-interface-for-soft-reboot-and-nmi.html","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        return node_obj"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @METRICS.timer(\u0027ConductorManager.change_node_power_state\u0027)"},{"line_number":160,"context_line":"    @messaging.expected_exceptions(exception.Invalid,"},{"line_number":161,"context_line":"                                   exception.NoFreeConductorWorker,"},{"line_number":162,"context_line":"                                   exception.NodeLocked)"},{"line_number":163,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_b52a618e","line":160,"range":{"start_line":160,"start_character":45,"end_line":160,"end_character":52},"updated":"2016-12-06 07:49:51.000000000","message":"I\u0027ll revert it.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":177,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":178,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":179,"context_line":"                 async task."},{"line_number":180,"context_line":"        :raises: Invalid"},{"line_number":181,"context_line":"        :raises: InvalidParameterValue"},{"line_number":182,"context_line":"        :raises: MissingParameterValue"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_ae88c123","line":180,"range":{"start_line":180,"start_character":17,"end_line":180,"end_character":24},"updated":"2016-12-02 13:31:52.000000000","message":"Where this exception raised?","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":177,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":178,"context_line":"        :raises: NoFreeConductorWorker when there is no free worker to start"},{"line_number":179,"context_line":"                 async task."},{"line_number":180,"context_line":"        :raises: Invalid"},{"line_number":181,"context_line":"        :raises: InvalidParameterValue"},{"line_number":182,"context_line":"        :raises: MissingParameterValue"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_d5327d0f","line":180,"range":{"start_line":180,"start_character":17,"end_line":180,"end_character":24},"in_reply_to":"3a71b18c_ae88c123","updated":"2016-12-06 07:49:51.000000000","message":"I\u0027ll fix that.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90daac16e86a5594b3f81e162f824fd4133dc5c5","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    @METRICS.timer(\u0027ConductorManager.change_node_power_state\u0027)"},{"line_number":179,"context_line":"    @messaging.expected_exceptions(exception.InvalidParameterValue,"},{"line_number":180,"context_line":"                                   exception.NoFreeConductorWorker,"},{"line_number":181,"context_line":"                                   exception.NodeLocked)"},{"line_number":182,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"},{"line_number":183,"context_line":"                                timeout\u003dNone):"},{"line_number":184,"context_line":"        \"\"\"RPC method to encapsulate changes to a node\u0027s state."}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_a62494af","line":181,"updated":"2016-12-19 13:52:18.000000000","message":"MissingParameterValue is missed in expected exceptions.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    @METRICS.timer(\u0027ConductorManager.change_node_power_state\u0027)"},{"line_number":179,"context_line":"    @messaging.expected_exceptions(exception.InvalidParameterValue,"},{"line_number":180,"context_line":"                                   exception.NoFreeConductorWorker,"},{"line_number":181,"context_line":"                                   exception.NodeLocked)"},{"line_number":182,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"},{"line_number":183,"context_line":"                                timeout\u003dNone):"},{"line_number":184,"context_line":"        \"\"\"RPC method to encapsulate changes to a node\u0027s state."}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_d8bea4fe","line":181,"in_reply_to":"1a6eadb0_a62494af","updated":"2016-12-20 08:08:32.000000000","message":"Yuriy pointed out that InvalidParameterValue covers MissingParameterValue since MissingParameterValue is a subclass of InvalidParameterValue.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            if (new_state not in"},{"line_number":212,"context_line":"                task.driver.power.get_supported_power_states(task)):"},{"line_number":213,"context_line":"                raise exception.InvalidParameterValue("},{"line_number":214,"context_line":"                    _(\u0027The driver %(driver)s does not support the power state,\u0027"},{"line_number":215,"context_line":"                      \u0027 %(state)s\u0027) %"},{"line_number":216,"context_line":"                    {\u0027driver\u0027: task.node.driver, \u0027state\u0027: new_state})"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_dd5ec411","line":214,"range":{"start_line":214,"start_character":36,"end_line":214,"end_character":42},"updated":"2016-12-19 11:20:16.000000000","message":"After driver composition, I think we should print power interface name here instead of driver, worth adding a FIXME","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            if (new_state not in"},{"line_number":212,"context_line":"                task.driver.power.get_supported_power_states(task)):"},{"line_number":213,"context_line":"                raise exception.InvalidParameterValue("},{"line_number":214,"context_line":"                    _(\u0027The driver %(driver)s does not support the power state,\u0027"},{"line_number":215,"context_line":"                      \u0027 %(state)s\u0027) %"},{"line_number":216,"context_line":"                    {\u0027driver\u0027: task.node.driver, \u0027state\u0027: new_state})"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_d3c4c741","line":214,"range":{"start_line":214,"start_character":36,"end_line":214,"end_character":42},"in_reply_to":"1a6eadb0_dd5ec411","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll add that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc5e17156373278df1b4eddfb00bfa4ddab1440a","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # Set the target_power_state and clear any last_error, since we\u0027re"},{"line_number":225,"context_line":"            # starting a new operation. This will expose to other processes"},{"line_number":226,"context_line":"            # and clients that work is in progress."},{"line_number":227,"context_line":"            if new_state \u003d\u003d states.REBOOT:"},{"line_number":228,"context_line":"                task.node.target_power_state \u003d states.POWER_ON"},{"line_number":229,"context_line":"            else:"},{"line_number":230,"context_line":"                task.node.target_power_state \u003d new_state"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_1755781c","line":227,"updated":"2016-12-19 11:49:21.000000000","message":"There is no states.SOFT_REBOOT. Main reason for \"-1\".","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a24d032ee9706209561f351b1155f9fb1660820d","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # Set the target_power_state and clear any last_error, since we\u0027re"},{"line_number":225,"context_line":"            # starting a new operation. This will expose to other processes"},{"line_number":226,"context_line":"            # and clients that work is in progress."},{"line_number":227,"context_line":"            if new_state \u003d\u003d states.REBOOT:"},{"line_number":228,"context_line":"                task.node.target_power_state \u003d states.POWER_ON"},{"line_number":229,"context_line":"            else:"},{"line_number":230,"context_line":"                task.node.target_power_state \u003d new_state"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_7d404b08","line":227,"in_reply_to":"1a6eadb0_1755781c","updated":"2016-12-19 12:09:26.000000000","message":"Oh, good catch, in case of SOFT_REBOOT, it will get written as target_power_state. This is not something that will cause an error, but is incorrect based on the other power state handling logic.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # Set the target_power_state and clear any last_error, since we\u0027re"},{"line_number":225,"context_line":"            # starting a new operation. This will expose to other processes"},{"line_number":226,"context_line":"            # and clients that work is in progress."},{"line_number":227,"context_line":"            if new_state \u003d\u003d states.REBOOT:"},{"line_number":228,"context_line":"                task.node.target_power_state \u003d states.POWER_ON"},{"line_number":229,"context_line":"            else:"},{"line_number":230,"context_line":"                task.node.target_power_state \u003d new_state"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_134abf83","line":227,"in_reply_to":"1a6eadb0_7d0beb7d","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a02bc01a71f02df997143c1d9e887af2e8c1d62e","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # Set the target_power_state and clear any last_error, since we\u0027re"},{"line_number":225,"context_line":"            # starting a new operation. This will expose to other processes"},{"line_number":226,"context_line":"            # and clients that work is in progress."},{"line_number":227,"context_line":"            if new_state \u003d\u003d states.REBOOT:"},{"line_number":228,"context_line":"                task.node.target_power_state \u003d states.POWER_ON"},{"line_number":229,"context_line":"            else:"},{"line_number":230,"context_line":"                task.node.target_power_state \u003d new_state"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_7d0beb7d","line":227,"in_reply_to":"1a6eadb0_7d404b08","updated":"2016-12-19 12:21:59.000000000","message":"In the spec defined that SOFT_REBOOT can not be target power state.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"5d27d80eef20b6cfd7137aed51bf1330285cf014","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return cctxt.call(context, \u0027update_node\u0027, node_obj\u003dnode_obj)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"},{"line_number":164,"context_line":"                                timeout\u003dNone, topic\u003dNone):"},{"line_number":165,"context_line":"        \"\"\"Change a node\u0027s power state."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        Synchronously, acquire lock and start the conductor background task"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa7ab95a_f92bad31","line":164,"range":{"start_line":164,"start_character":32,"end_line":164,"end_character":44},"updated":"2016-08-26 07:04:31.000000000","message":"It could break an existing call without specifying argument name. It would be safer to add a new argument to the tail.","commit_id":"d683c7430ac700af78642bf1a490de2d8513d062"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"647eb2a67d3975129d0e7969b2a2f88d1ce119e6","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return cctxt.call(context, \u0027update_node\u0027, node_obj\u003dnode_obj)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"},{"line_number":164,"context_line":"                                timeout\u003dNone, topic\u003dNone):"},{"line_number":165,"context_line":"        \"\"\"Change a node\u0027s power state."},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        Synchronously, acquire lock and start the conductor background task"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa7ab95a_77e24105","line":164,"range":{"start_line":164,"start_character":32,"end_line":164,"end_character":44},"in_reply_to":"fa7ab95a_f92bad31","updated":"2016-08-29 02:48:26.000000000","message":"I\u0027ll fix that.","commit_id":"d683c7430ac700af78642bf1a490de2d8513d062"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"c2bd7c26a5626182416765ddf3a2f708a65a63dd","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.6\u0027)"},{"line_number":181,"context_line":"        return cctxt.call(context, \u0027change_node_power_state\u0027, node_id\u003dnode_id,"},{"line_number":182,"context_line":"                          timeout\u003dtimeout, new_state\u003dnew_state)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def vendor_passthru(self, context, node_id, driver_method, http_method,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a8ec9b2_23955786","line":181,"updated":"2016-09-23 02:59:29.000000000","message":"It changes the signature of an RPC.\nIt would be better to increment the RPC version according to the guide[1].\n\n[1] http://docs.openstack.org/developer/ironic/dev/code-contribution-guide.html#ironic-api-rpc-versions","commit_id":"42ed6ba3ef300051e6b424d8f04bad94fcc733d6"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"573616c888d89a6f967445c5a3ce4abf2c6232f5","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.6\u0027)"},{"line_number":181,"context_line":"        return cctxt.call(context, \u0027change_node_power_state\u0027, node_id\u003dnode_id,"},{"line_number":182,"context_line":"                          timeout\u003dtimeout, new_state\u003dnew_state)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def vendor_passthru(self, context, node_id, driver_method, http_method,"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a8bc5a2_1bf1ad95","line":181,"in_reply_to":"7a8ec9b2_23955786","updated":"2016-09-26 04:59:21.000000000","message":"I\u0027ll fix that.","commit_id":"42ed6ba3ef300051e6b424d8f04bad94fcc733d6"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"a8b68ca3b4c85775ee661822aaf0197d1af5ea27","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                 async task."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.6\u0027)"},{"line_number":182,"context_line":"        return cctxt.call(context, \u0027change_node_power_state\u0027, node_id\u003dnode_id,"},{"line_number":183,"context_line":"                          new_state\u003dnew_state, timeout\u003dtimeout)"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5a8bc5a2_89e2b82d","line":181,"range":{"start_line":181,"start_character":72,"end_line":181,"end_character":75},"updated":"2016-09-26 14:08:01.000000000","message":"It is also necessary to update this version to \u00271.35\u0027.","commit_id":"e2ac095abfd8fe58b8f287945efc3fe32d8ef784"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"38ea160b67397516f9fb1eb6f89dc1eb0036e2c9","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                 async task."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        \"\"\""},{"line_number":181,"context_line":"        cctxt \u003d self.client.prepare(topic\u003dtopic or self.topic, version\u003d\u00271.6\u0027)"},{"line_number":182,"context_line":"        return cctxt.call(context, \u0027change_node_power_state\u0027, node_id\u003dnode_id,"},{"line_number":183,"context_line":"                          new_state\u003dnew_state, timeout\u003dtimeout)"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5a8bc5a2_f38a2a63","line":181,"range":{"start_line":181,"start_character":72,"end_line":181,"end_character":75},"in_reply_to":"5a8bc5a2_89e2b82d","updated":"2016-09-27 01:15:10.000000000","message":"I\u0027ll fix that.","commit_id":"e2ac095abfd8fe58b8f287945efc3fe32d8ef784"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return cctxt.call(context, \u0027update_node\u0027, node_obj\u003dnode_obj)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"},{"line_number":165,"context_line":"                                topic\u003dNone, timeout\u003dNone):"},{"line_number":166,"context_line":"        \"\"\"Change a node\u0027s power state."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        Synchronously, acquire lock and start the conductor background task"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_62abc775","line":165,"range":{"start_line":165,"start_character":32,"end_line":165,"end_character":42},"updated":"2016-10-07 16:56:41.000000000","message":"nit - topic tends to be the last parameter.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return cctxt.call(context, \u0027update_node\u0027, node_obj\u003dnode_obj)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def change_node_power_state(self, context, node_id, new_state,"},{"line_number":165,"context_line":"                                topic\u003dNone, timeout\u003dNone):"},{"line_number":166,"context_line":"        \"\"\"Change a node\u0027s power state."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        Synchronously, acquire lock and start the conductor background task"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_d7787392","line":165,"range":{"start_line":165,"start_character":32,"end_line":165,"end_character":42},"in_reply_to":"1a95cdbc_62abc775","updated":"2016-10-11 08:27:55.000000000","message":"This is due to the comment https://review.openstack.org/#/c/216730/9..15/ironic/conductor/rpcapi.py","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    |    1.34 - Added heartbeat"},{"line_number":84,"context_line":"    |    1.35 - Added destroy_volume_connector and update_volume_connector"},{"line_number":85,"context_line":"    |    1.36 - Added create_node"},{"line_number":86,"context_line":"    |    1.37 - Added timeout optional parameter to change_node_power_state"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_a87358e6","line":86,"updated":"2016-12-02 13:31:52.000000000","message":"This is strange but approved spec does not contain any info in RPC API impact section.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    |    1.34 - Added heartbeat"},{"line_number":84,"context_line":"    |    1.35 - Added destroy_volume_connector and update_volume_connector"},{"line_number":85,"context_line":"    |    1.36 - Added create_node"},{"line_number":86,"context_line":"    |    1.37 - Added timeout optional parameter to change_node_power_state"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_35157148","line":86,"in_reply_to":"3a71b18c_a87358e6","updated":"2016-12-06 07:49:51.000000000","message":"I\u0027ll update the spec.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"}],"ironic/conductor/utils.py":[{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"eb028182c7061733e35f909bedfd6f6e758fb095","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if new_state \u003d\u003d states.POWER_ON:"},{"line_number":114,"context_line":"            _not_going_to_change()"},{"line_number":115,"context_line":"            return"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    elif curr_state \u003d\u003d states.POWER_OFF:"},{"line_number":118,"context_line":"        if new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":119,"context_line":"            _not_going_to_change()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_be2bf532","line":116,"updated":"2016-03-15 12:15:41.000000000","message":"No blank line needed between if/else block i think.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"f1e9ca6fbaeb92f2b60907ee9625080d67d2ed08","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if new_state \u003d\u003d states.POWER_ON:"},{"line_number":114,"context_line":"            _not_going_to_change()"},{"line_number":115,"context_line":"            return"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    elif curr_state \u003d\u003d states.POWER_OFF:"},{"line_number":118,"context_line":"        if new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":119,"context_line":"            _not_going_to_change()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_92e7e1e3","line":116,"in_reply_to":"1af94dfe_be2bf532","updated":"2016-03-16 03:05:55.000000000","message":"I\u0027ll fix that.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"eb028182c7061733e35f909bedfd6f6e758fb095","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        if new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":119,"context_line":"            _not_going_to_change()"},{"line_number":120,"context_line":"            return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        # if curr_state \u003d\u003d states.ERROR:"},{"line_number":124,"context_line":"        #     be optimistic and continue action"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_1e1dc90f","line":121,"updated":"2016-03-15 12:15:41.000000000","message":"ditto","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"f1e9ca6fbaeb92f2b60907ee9625080d67d2ed08","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        if new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":119,"context_line":"            _not_going_to_change()"},{"line_number":120,"context_line":"            return"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        # if curr_state \u003d\u003d states.ERROR:"},{"line_number":124,"context_line":"        #     be optimistic and continue action"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_5204397d","line":121,"in_reply_to":"1af94dfe_1e1dc90f","updated":"2016-03-16 03:05:55.000000000","message":"I\u0027ll fix that.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"eb028182c7061733e35f909bedfd6f6e758fb095","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        # if curr_state \u003d\u003d states.ERROR:"},{"line_number":124,"context_line":"        #     be optimistic and continue action"},{"line_number":125,"context_line":"        LOG.warning(_LW(\"Driver returns ERROR power state for node %s.\"),"},{"line_number":126,"context_line":"                    node.uuid)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_a4512811","line":124,"range":{"start_line":124,"start_character":11,"end_line":124,"end_character":14},"updated":"2016-03-15 12:15:41.000000000","message":"No indentations needed here if the code above is commented as a note.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"f1e9ca6fbaeb92f2b60907ee9625080d67d2ed08","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    else:"},{"line_number":123,"context_line":"        # if curr_state \u003d\u003d states.ERROR:"},{"line_number":124,"context_line":"        #     be optimistic and continue action"},{"line_number":125,"context_line":"        LOG.warning(_LW(\"Driver returns ERROR power state for node %s.\"),"},{"line_number":126,"context_line":"                    node.uuid)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_72033574","line":124,"range":{"start_line":124,"start_character":11,"end_line":124,"end_character":14},"in_reply_to":"1af94dfe_a4512811","updated":"2016-03-16 03:05:55.000000000","message":"I\u0027ll fix that.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"3b3b68d378f877923bb209eb187aad145a995ef0","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":105,"context_line":"        node.save()"},{"line_number":106,"context_line":"        LOG.warning(_LW(\"Not going to change node %(node)s power \""},{"line_number":107,"context_line":"                        \"state because current state \u003d requested state \""},{"line_number":108,"context_line":"                        \"\u003d \u0027%(state)s\u0027.\"),"},{"line_number":109,"context_line":"                    {\u0027node\u0027: node.uuid, \u0027state\u0027: curr_state})"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_dc450d18","line":107,"range":{"start_line":107,"start_character":53,"end_line":107,"end_character":54},"updated":"2016-07-27 15:28:46.000000000","message":"nit: How about s/\u003d/\u003d\u003d/?","commit_id":"7357cfaa5ed021ea7d2dd24d8c48eb79d9afada4"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"61b1fe9dc799bc856db529383895d8c7feb1f442","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":105,"context_line":"        node.save()"},{"line_number":106,"context_line":"        LOG.warning(_LW(\"Not going to change node %(node)s power \""},{"line_number":107,"context_line":"                        \"state because current state \u003d requested state \""},{"line_number":108,"context_line":"                        \"\u003d \u0027%(state)s\u0027.\"),"},{"line_number":109,"context_line":"                    {\u0027node\u0027: node.uuid, \u0027state\u0027: curr_state})"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_f6b08945","line":107,"range":{"start_line":107,"start_character":53,"end_line":107,"end_character":54},"in_reply_to":"bacf61ea_dc450d18","updated":"2016-07-29 07:37:34.000000000","message":"This message comes from the base code at L.144.\nIt would be better to keep AS IS.\n\n 113:           LOG.warning(_LW(\"Not going to change node %(node)s power \"\n 114:                           \"state because current state \u003d requested state \"\n 115:                           \"\u003d \u0027%(state)s\u0027.\"),","commit_id":"7357cfaa5ed021ea7d2dd24d8c48eb79d9afada4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":157,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":160,"context_line":"        else:"},{"line_number":161,"context_line":"            task.driver.power.reboot(task)"},{"line_number":162,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_313e122a","line":159,"updated":"2016-08-02 13:00:48.000000000","message":"I think we need to error out here if timeout was requested, but the driver does not support it (but do not fail if timeout is not requested)","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":157,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":160,"context_line":"        else:"},{"line_number":161,"context_line":"            task.driver.power.reboot(task)"},{"line_number":162,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_6dcddfb6","line":159,"in_reply_to":"bacf61ea_313e122a","updated":"2016-08-04 09:29:04.000000000","message":"Okay, I\u0027ll add that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"5d27d80eef20b6cfd7137aed51bf1330285cf014","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":155,"context_line":"            else:"},{"line_number":156,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":157,"context_line":"                LOG.error(_(\"The set_power_state method of %s(driver_name)s \""},{"line_number":158,"context_line":"                            \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":159,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":160,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa7ab95a_24f3280c","line":157,"range":{"start_line":157,"start_character":20,"end_line":157,"end_character":25},"updated":"2016-08-26 07:04:31.000000000","message":"Warning is better because the action doesn\u0027t abort.\n\nI prefer logging this message before calling the method because this message would be helpful when the method hasn\u0027t returned.","commit_id":"d683c7430ac700af78642bf1a490de2d8513d062"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"647eb2a67d3975129d0e7969b2a2f88d1ce119e6","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":155,"context_line":"            else:"},{"line_number":156,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":157,"context_line":"                LOG.error(_(\"The set_power_state method of %s(driver_name)s \""},{"line_number":158,"context_line":"                            \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":159,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":160,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa7ab95a_c248538a","line":157,"range":{"start_line":157,"start_character":20,"end_line":157,"end_character":25},"in_reply_to":"fa7ab95a_24f3280c","updated":"2016-08-29 02:48:26.000000000","message":"LOG.error is chosen rather than LOG.warnning based on the comment in the patch set 6.\n\nI\u0027ll fix the order.","commit_id":"d683c7430ac700af78642bf1a490de2d8513d062"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"daa142f706deae9816e3695a9a8c7aae36b757f6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":154,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":155,"context_line":"            else:"},{"line_number":156,"context_line":"                LOG.error(_(\"The set_power_state method of %s(driver_name)s \""},{"line_number":157,"context_line":"                            \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":158,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":159,"context_line":"                task.driver.power.set_power_state(task, new_state)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_e0aea57f","line":156,"range":{"start_line":156,"start_character":26,"end_line":156,"end_character":27},"updated":"2016-09-27 23:39:17.000000000","message":"_LE() is better for LOG.error.","commit_id":"1fc2decb178bdb49e27fd9424833e32bd4b738fd"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"c008d97982a06a87c6683fbd1eb8b41903e2831d","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":154,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":155,"context_line":"            else:"},{"line_number":156,"context_line":"                LOG.error(_(\"The set_power_state method of %s(driver_name)s \""},{"line_number":157,"context_line":"                            \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":158,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":159,"context_line":"                task.driver.power.set_power_state(task, new_state)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_aeb8f52b","line":156,"range":{"start_line":156,"start_character":26,"end_line":156,"end_character":27},"in_reply_to":"5a8bc5a2_e0aea57f","updated":"2016-09-28 01:18:01.000000000","message":"I\u0027ll fix that.","commit_id":"1fc2decb178bdb49e27fd9424833e32bd4b738fd"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"32b6485548f9df00d11b6cf9a19d70349eeda05e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        target_state \u003d states.POWER_OFF"},{"line_number":88,"context_line":"    else:"},{"line_number":89,"context_line":"        target_state \u003d None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _not_going_to_change():"},{"line_number":92,"context_line":"        # Neither the ironic service nor the hardware has erred. The"},{"line_number":93,"context_line":"        # node is, for some reason, already in the requested state,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a98d1f4_28abf98a","line":90,"updated":"2016-09-29 12:50:06.000000000","message":"I guess we need to see if a driver has get_supported_power_states() and supports the new_state like checking if power.set_power_state() accept timeout.","commit_id":"fe22598e0a077ae64bd6e50ec9f87e278180b90a"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"32b98d8b63a1748a1a19e805fc9f5dc2aabaed0d","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        target_state \u003d states.POWER_OFF"},{"line_number":88,"context_line":"    else:"},{"line_number":89,"context_line":"        target_state \u003d None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _not_going_to_change():"},{"line_number":92,"context_line":"        # Neither the ironic service nor the hardware has erred. The"},{"line_number":93,"context_line":"        # node is, for some reason, already in the requested state,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a98d1f4_ed3d47bc","line":90,"in_reply_to":"3a98d1f4_28abf98a","updated":"2016-09-30 05:04:55.000000000","message":"I\u0027ll add the check into ironic/conductor/manager.py","commit_id":"fe22598e0a077ae64bd6e50ec9f87e278180b90a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    # take power action"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":151,"context_line":"            sig \u003d reflection.get_signature(task.driver.power.set_power_state)"},{"line_number":152,"context_line":"            if \u0027timeout\u0027 in sig.parameters:"},{"line_number":153,"context_line":"                task.driver.power.set_power_state(task, new_state,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_5d530ae2","line":150,"range":{"start_line":150,"start_character":31,"end_line":150,"end_character":37},"updated":"2016-10-07 16:56:41.000000000","message":"did you intend to add soft_reboot here too? And maybe add a timeout parameter to driver.power.reboot too that will be passed further to driver.power.set_power_state. Otherwise set_power_state will need to start handling soft_reboot, which is weird.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    # take power action"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":151,"context_line":"            sig \u003d reflection.get_signature(task.driver.power.set_power_state)"},{"line_number":152,"context_line":"            if \u0027timeout\u0027 in sig.parameters:"},{"line_number":153,"context_line":"                task.driver.power.set_power_state(task, new_state,"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_0852c513","line":150,"range":{"start_line":150,"start_character":31,"end_line":150,"end_character":37},"in_reply_to":"1a95cdbc_5d530ae2","updated":"2016-10-11 08:27:55.000000000","message":"I\u0027ll add a timeout parameter to driver.power.reboot too.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    # take power action"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":151,"context_line":"            sig \u003d reflection.get_signature(task.driver.power.set_power_state)"},{"line_number":152,"context_line":"            if \u0027timeout\u0027 in sig.parameters:"},{"line_number":153,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":154,"context_line":"                                                  timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_627f47ab","line":151,"range":{"start_line":151,"start_character":29,"end_line":151,"end_character":42},"updated":"2016-10-07 16:56:41.000000000","message":"Hm, can we check the supported_power_states, and pass timeout only if it contains soft_* states? Or maybe it\u0027s a bad idea, eg someone introduces a different state needing timeout...","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    # take power action"},{"line_number":149,"context_line":"    try:"},{"line_number":150,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":151,"context_line":"            sig \u003d reflection.get_signature(task.driver.power.set_power_state)"},{"line_number":152,"context_line":"            if \u0027timeout\u0027 in sig.parameters:"},{"line_number":153,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":154,"context_line":"                                                  timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_779fa75f","line":151,"range":{"start_line":151,"start_character":29,"end_line":151,"end_character":42},"in_reply_to":"1a95cdbc_627f47ab","updated":"2016-10-11 08:27:55.000000000","message":"We agreed that \u0027timeout\u0027 optional parameter is effective for not only soft_(power_off|reboot) but also (power_off|reboot) through the spec review.\nSo checking get_supported_power_states() is not sufficient to keep compatibility with \u0027out of tree driver\u0027.","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"610fa5ae837690f39fe98e5351ab864299fd1ace","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":77,"context_line":"    :param new_state: Any power state from ironic.common.states."},{"line_number":78,"context_line":"    :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":79,"context_line":"      ``None`` indicates to use default timeout."},{"line_number":80,"context_line":"    :raises: InvalidParameterValue when the wrong state is specified"},{"line_number":81,"context_line":"             or the wrong driver info is specified."}],"source_content_type":"text/x-python","patch_set":19,"id":"ba5da102_eac1fe2f","line":78,"range":{"start_line":78,"start_character":20,"end_line":78,"end_character":44},"updated":"2016-10-27 07:20:24.000000000","message":"I\u0027ll add the unit.\n\nDitto to other places which doesn\u0027t have the unit.","commit_id":"42128eac74a5610d0fa6802ab2bf61ff5977975e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3fb332c4ba23d1aa5bd6725f96b5ca4272659671","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":163,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":164,"context_line":"            else:"},{"line_number":165,"context_line":"                LOG.error(_LE(\"The set_power_state method of %s(driver_name)s \""},{"line_number":166,"context_line":"                              \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":167,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":168,"context_line":"                task.driver.power.set_power_state(task, new_state)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_055299dd","line":165,"range":{"start_line":165,"start_character":16,"end_line":165,"end_character":25},"updated":"2016-11-30 10:40:21.000000000","message":"This should be a WARNING, because we are going to continue the operation (we are just skipping the timeout).\n\nError should be used in case the whole operation failed.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a7b261bca89195717cadf5d8eabd301240399107","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":163,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":164,"context_line":"            else:"},{"line_number":165,"context_line":"                LOG.error(_LE(\"The set_power_state method of %s(driver_name)s \""},{"line_number":166,"context_line":"                              \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":167,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":168,"context_line":"                task.driver.power.set_power_state(task, new_state)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_2572087d","line":165,"range":{"start_line":165,"start_character":16,"end_line":165,"end_character":25},"in_reply_to":"5a74a57a_055299dd","updated":"2016-12-01 06:22:49.000000000","message":"I\u0027ll fix that.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3fb332c4ba23d1aa5bd6725f96b5ca4272659671","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":172,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"},{"line_number":173,"context_line":"            else:"},{"line_number":174,"context_line":"                LOG.error(_LE(\"The reboot method of %s(driver_name)s \""},{"line_number":175,"context_line":"                              \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":176,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":177,"context_line":"                task.driver.power.reboot(task)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_855ce9ee","line":174,"range":{"start_line":174,"start_character":16,"end_line":174,"end_character":25},"updated":"2016-11-30 10:40:21.000000000","message":"ditto re WARNING","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a7b261bca89195717cadf5d8eabd301240399107","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":172,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"},{"line_number":173,"context_line":"            else:"},{"line_number":174,"context_line":"                LOG.error(_LE(\"The reboot method of %s(driver_name)s \""},{"line_number":175,"context_line":"                              \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":176,"context_line":"                          {\u0027driver_name\u0027: node.driver})"},{"line_number":177,"context_line":"                task.driver.power.reboot(task)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5a74a57a_656c009d","line":174,"range":{"start_line":174,"start_character":16,"end_line":174,"end_character":25},"in_reply_to":"5a74a57a_855ce9ee","updated":"2016-12-01 06:22:49.000000000","message":"I\u0027ll fix that.","commit_id":"94f8fda2ea37dafbc947a5dea8f7ef1f2f00ccc9"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    elif new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":94,"context_line":"        target_state \u003d states.POWER_OFF"},{"line_number":95,"context_line":"    else:"},{"line_number":96,"context_line":"        target_state \u003d None"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _not_going_to_change():"},{"line_number":99,"context_line":"        # Neither the ironic service nor the hardware has erred. The"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_f43b66e9","line":96,"updated":"2016-12-02 13:31:52.000000000","message":"Use case for this target state?","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    elif new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":94,"context_line":"        target_state \u003d states.POWER_OFF"},{"line_number":95,"context_line":"    else:"},{"line_number":96,"context_line":"        target_state \u003d None"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _not_going_to_change():"},{"line_number":99,"context_line":"        # Neither the ironic service nor the hardware has erred. The"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_8be54839","line":96,"in_reply_to":"3a71b18c_f43b66e9","updated":"2016-12-06 07:49:51.000000000","message":"This is necessary to make invalid test case pass.\nironic.tests.unit.conductor.test_utils.NodePowerActionTestCase.test_node_power_action_invalid_state","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                        \"\u003d \u0027%(state)s\u0027.\"),"},{"line_number":119,"context_line":"                    {\u0027node\u0027: node.uuid, \u0027state\u0027: curr_state})"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    curr_state \u003d None"},{"line_number":122,"context_line":"    try:"},{"line_number":123,"context_line":"        curr_state \u003d task.driver.power.get_power_state(task)"},{"line_number":124,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_37b08043","line":121,"updated":"2016-12-02 13:31:52.000000000","message":"This line not needed.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                        \"\u003d \u0027%(state)s\u0027.\"),"},{"line_number":119,"context_line":"                    {\u0027node\u0027: node.uuid, \u0027state\u0027: curr_state})"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    curr_state \u003d None"},{"line_number":122,"context_line":"    try:"},{"line_number":123,"context_line":"        curr_state \u003d task.driver.power.get_power_state(task)"},{"line_number":124,"context_line":"    except Exception as e:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_2b5a742a","line":121,"in_reply_to":"3a71b18c_37b08043","updated":"2016-12-06 07:49:51.000000000","message":"I\u0027ll remove it.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    # take power action"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":160,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":161,"context_line":"                    task.driver.power.set_power_state).parameters):"},{"line_number":162,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":163,"context_line":"                                                  timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_14862213","line":160,"updated":"2016-12-02 13:31:52.000000000","message":"This is not needed for default timeout (None)","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    # take power action"},{"line_number":158,"context_line":"    try:"},{"line_number":159,"context_line":"        if new_state !\u003d states.REBOOT:"},{"line_number":160,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":161,"context_line":"                    task.driver.power.set_power_state).parameters):"},{"line_number":162,"context_line":"                task.driver.power.set_power_state(task, new_state,"},{"line_number":163,"context_line":"                                                  timeout\u003dtimeout)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_30865fdb","line":160,"in_reply_to":"3a71b18c_14862213","updated":"2016-12-06 07:49:51.000000000","message":"This check is for \"out of tree drivers\".\nIf a \"out of driver\" doesn\u0027t support timeout parameter. then it has to go to L.169.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                    {\u0027driver_name\u0027: node.driver})"},{"line_number":169,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":170,"context_line":"        else:"},{"line_number":171,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":172,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":173,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"},{"line_number":174,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_94723248","line":171,"updated":"2016-12-02 13:31:52.000000000","message":"ditto","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                    {\u0027driver_name\u0027: node.driver})"},{"line_number":169,"context_line":"                task.driver.power.set_power_state(task, new_state)"},{"line_number":170,"context_line":"        else:"},{"line_number":171,"context_line":"            if (\u0027timeout\u0027 in reflection.get_signature("},{"line_number":172,"context_line":"                    task.driver.power.reboot).parameters):"},{"line_number":173,"context_line":"                task.driver.power.reboot(task, timeout\u003dtimeout)"},{"line_number":174,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_907573fb","line":171,"in_reply_to":"3a71b18c_94723248","updated":"2016-12-06 07:49:51.000000000","message":"same as above.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a02bc01a71f02df997143c1d9e887af2e8c1d62e","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    # starting a new operation. This will expose to other processes"},{"line_number":150,"context_line":"    # and clients that work is in progress."},{"line_number":151,"context_line":"    if node[\u0027target_power_state\u0027] !\u003d new_state:"},{"line_number":152,"context_line":"        node[\u0027target_power_state\u0027] \u003d new_state"},{"line_number":153,"context_line":"        node[\u0027last_error\u0027] \u003d None"},{"line_number":154,"context_line":"        node.save()"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_5d7d4fe6","line":152,"updated":"2016-12-19 12:21:59.000000000","message":"In the spec defined that SOFT_REBOOT can not be target power state (Proposed change, 4).","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    # starting a new operation. This will expose to other processes"},{"line_number":150,"context_line":"    # and clients that work is in progress."},{"line_number":151,"context_line":"    if node[\u0027target_power_state\u0027] !\u003d new_state:"},{"line_number":152,"context_line":"        node[\u0027target_power_state\u0027] \u003d new_state"},{"line_number":153,"context_line":"        node[\u0027last_error\u0027] \u003d None"},{"line_number":154,"context_line":"        node.save()"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_7d5e6246","line":152,"in_reply_to":"1a6eadb0_5d7d4fe6","updated":"2016-12-20 08:08:32.000000000","message":"Right, I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":163,"context_line":"            else:"},{"line_number":164,"context_line":"                LOG.warning("},{"line_number":165,"context_line":"                    _LW(\"The set_power_state method of %s(driver_name)s \""},{"line_number":166,"context_line":"                        \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":167,"context_line":"                    {\u0027driver_name\u0027: node.driver})"},{"line_number":168,"context_line":"                task.driver.power.set_power_state(task, new_state)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_f8354ea8","line":165,"updated":"2016-12-19 11:20:16.000000000","message":"ditto here, fixme","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                                                  timeout\u003dtimeout)"},{"line_number":163,"context_line":"            else:"},{"line_number":164,"context_line":"                LOG.warning("},{"line_number":165,"context_line":"                    _LW(\"The set_power_state method of %s(driver_name)s \""},{"line_number":166,"context_line":"                        \"doesn\u0027t support \u0027timeout\u0027 parameter.\"),"},{"line_number":167,"context_line":"                    {\u0027driver_name\u0027: node.driver})"},{"line_number":168,"context_line":"                task.driver.power.set_power_state(task, new_state)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_2e1bd281","line":165,"in_reply_to":"1a6eadb0_f8354ea8","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll add that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            task, fields.NotificationLevel.INFO, fields.NotificationStatus.END,"},{"line_number":198,"context_line":"            new_state)"},{"line_number":199,"context_line":"        LOG.info(_LI(\u0027Successfully set node %(node)s power state to \u0027"},{"line_number":200,"context_line":"                     \u0027%(target_state)s by %(new_state)s.\u0027),"},{"line_number":201,"context_line":"                 {\u0027node\u0027: node.uuid,"},{"line_number":202,"context_line":"                  \u0027target_state\u0027: target_state,"},{"line_number":203,"context_line":"                  \u0027new_state\u0027: new_state})"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_7825be08","line":200,"updated":"2016-12-19 11:20:16.000000000","message":"This reads a bit weird but maybe that\u0027s OK","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            task, fields.NotificationLevel.INFO, fields.NotificationStatus.END,"},{"line_number":198,"context_line":"            new_state)"},{"line_number":199,"context_line":"        LOG.info(_LI(\u0027Successfully set node %(node)s power state to \u0027"},{"line_number":200,"context_line":"                     \u0027%(target_state)s by %(new_state)s.\u0027),"},{"line_number":201,"context_line":"                 {\u0027node\u0027: node.uuid,"},{"line_number":202,"context_line":"                  \u0027target_state\u0027: target_state,"},{"line_number":203,"context_line":"                  \u0027new_state\u0027: new_state})"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_3d822a01","line":200,"in_reply_to":"1a6eadb0_7825be08","updated":"2016-12-20 08:08:32.000000000","message":"Okay, I\u0027ll change it anytime if you provid a better way.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f39e6b8f2aed685bdea66c8643dc85701087bf22","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        new_state)"},{"line_number":89,"context_line":"    node \u003d task.node"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    if new_state in (states.POWER_ON, states.REBOOT, states.SOFT_REBOOT):"},{"line_number":92,"context_line":"        target_state \u003d states.POWER_ON"},{"line_number":93,"context_line":"    elif new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":94,"context_line":"        target_state \u003d states.POWER_OFF"},{"line_number":95,"context_line":"    else:"},{"line_number":96,"context_line":"        target_state \u003d None"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _not_going_to_change():"},{"line_number":99,"context_line":"        # Neither the ironic service nor the hardware has erred. The"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_2a0d2b3e","line":96,"range":{"start_line":91,"start_character":4,"end_line":96,"end_character":27},"updated":"2016-12-21 16:33:36.000000000","message":"You could just do task.node.target_power_state now right?","commit_id":"a426f9dce7825b49d09b9fc2f21ade68b65e3158"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"afbc73b6ae6c2e94afd5db00da5f1d092069ac02","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        new_state)"},{"line_number":89,"context_line":"    node \u003d task.node"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    if new_state in (states.POWER_ON, states.REBOOT, states.SOFT_REBOOT):"},{"line_number":92,"context_line":"        target_state \u003d states.POWER_ON"},{"line_number":93,"context_line":"    elif new_state in (states.POWER_OFF, states.SOFT_POWER_OFF):"},{"line_number":94,"context_line":"        target_state \u003d states.POWER_OFF"},{"line_number":95,"context_line":"    else:"},{"line_number":96,"context_line":"        target_state \u003d None"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _not_going_to_change():"},{"line_number":99,"context_line":"        # Neither the ironic service nor the hardware has erred. The"}],"source_content_type":"text/x-python","patch_set":32,"id":"da4df55a_22ca4ea2","line":96,"range":{"start_line":91,"start_character":4,"end_line":96,"end_character":27},"in_reply_to":"1a6eadb0_2a0d2b3e","updated":"2016-12-22 05:10:15.000000000","message":"Unit test [1] requires these code.\n\n[1] ironic/tests/unit/conductor/test_utils.py","commit_id":"a426f9dce7825b49d09b9fc2f21ade68b65e3158"}],"ironic/conf/conductor.py":[{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"3b3b68d378f877923bb209eb187aad145a995ef0","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                      \u0027ramdisk doing the cleaning. If the timeout is reached \u0027"},{"line_number":130,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":131,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":132,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":133,"context_line":"               default\u003d600,"},{"line_number":134,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":135,"context_line":"                      \u0027off operation. This value always has to be \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_82904e97","line":132,"range":{"start_line":132,"start_character":16,"end_line":132,"end_character":38},"updated":"2016-07-27 15:28:46.000000000","message":"I\u0027m not sure do we need add some checking logic to validate this option in somewhere?","commit_id":"7357cfaa5ed021ea7d2dd24d8c48eb79d9afada4"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"61b1fe9dc799bc856db529383895d8c7feb1f442","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                      \u0027ramdisk doing the cleaning. If the timeout is reached \u0027"},{"line_number":130,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":131,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":132,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":133,"context_line":"               default\u003d600,"},{"line_number":134,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":135,"context_line":"                      \u0027off operation. This value always has to be \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_56d4f545","line":132,"range":{"start_line":132,"start_character":16,"end_line":132,"end_character":38},"in_reply_to":"bacf61ea_82904e97","updated":"2016-07-29 07:37:34.000000000","message":"I\u0027ll fix that.","commit_id":"7357cfaa5ed021ea7d2dd24d8c48eb79d9afada4"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":133,"context_line":"               default\u003d600,"},{"line_number":134,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":135,"context_line":"                      \u0027off operation. This value always has to be \u0027"},{"line_number":136,"context_line":"                      \u0027positive(\u003e 0).\u0027)),"},{"line_number":137,"context_line":"]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_912edef8","line":136,"updated":"2016-08-02 13:00:48.000000000","message":"I think positive is pretty clear, so no need for (\u003e 0)","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":133,"context_line":"               default\u003d600,"},{"line_number":134,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":135,"context_line":"                      \u0027off operation. This value always has to be \u0027"},{"line_number":136,"context_line":"                      \u0027positive(\u003e 0).\u0027)),"},{"line_number":137,"context_line":"]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_2d3ac798","line":136,"in_reply_to":"bacf61ea_912edef8","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll fix that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":131,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":132,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":133,"context_line":"               default\u003d600,"},{"line_number":134,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":135,"context_line":"                      \u0027off operation. This value always has to be positive.\u0027)),"},{"line_number":136,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_8e730515","line":133,"updated":"2016-12-02 13:31:52.000000000","message":"Makes sense to set min value here.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":131,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":132,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":133,"context_line":"               default\u003d600,"},{"line_number":134,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":135,"context_line":"                      \u0027off operation. This value always has to be positive.\u0027)),"},{"line_number":136,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a71b18c_107a4377","line":133,"in_reply_to":"3a71b18c_8e730515","updated":"2016-12-06 07:49:51.000000000","message":"The min value is 1 sec.\nDo you mean that we should set the default to 1?\nIMO, it seems that 1 sec is too short in general.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":133,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":134,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":135,"context_line":"               default\u003d600,"},{"line_number":136,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":137,"context_line":"                      \u0027off operation. This value always has to be positive.\u0027)),"},{"line_number":138,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_78da1eeb","line":135,"updated":"2016-12-19 11:20:16.000000000","message":"What Yuriy meant here, is to add min\u003d1 here, so that incorrect value here (eg -1) will prevent the service from starting.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":133,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":134,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":135,"context_line":"               default\u003d600,"},{"line_number":136,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":137,"context_line":"                      \u0027off operation. This value always has to be positive.\u0027)),"},{"line_number":138,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_3d7cea71","line":135,"in_reply_to":"1a6eadb0_0662a8d8","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll add that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":133,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":134,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":135,"context_line":"               default\u003d600,"},{"line_number":136,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":137,"context_line":"                      \u0027off operation. This value always has to be positive.\u0027)),"},{"line_number":138,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_1d856e58","line":135,"in_reply_to":"1a6eadb0_78da1eeb","updated":"2016-12-20 08:08:32.000000000","message":"Now I got it, thanks.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90daac16e86a5594b3f81e162f824fd4133dc5c5","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":133,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":134,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":135,"context_line":"               default\u003d600,"},{"line_number":136,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"},{"line_number":137,"context_line":"                      \u0027off operation. This value always has to be positive.\u0027)),"},{"line_number":138,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_0662a8d8","line":135,"in_reply_to":"1a6eadb0_78da1eeb","updated":"2016-12-19 13:52:18.000000000","message":"Please add a minimum allowed value here.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f39e6b8f2aed685bdea66c8643dc85701087bf22","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                      \u0027ramdisk doing the cleaning. If the timeout is reached \u0027"},{"line_number":132,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":133,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":134,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":135,"context_line":"               default\u003d600,"},{"line_number":136,"context_line":"               min\u003d1,"},{"line_number":137,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_d02b8680","line":134,"updated":"2016-12-21 16:33:36.000000000","message":"You need to regenerate the config sample","commit_id":"a426f9dce7825b49d09b9fc2f21ade68b65e3158"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"afbc73b6ae6c2e94afd5db00da5f1d092069ac02","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                      \u0027ramdisk doing the cleaning. If the timeout is reached \u0027"},{"line_number":132,"context_line":"                      \u0027the node will be put in the \"clean failed\" provision \u0027"},{"line_number":133,"context_line":"                      \u0027state. Set to 0 to disable timeout.\u0027)),"},{"line_number":134,"context_line":"    cfg.IntOpt(\u0027soft_power_off_timeout\u0027,"},{"line_number":135,"context_line":"               default\u003d600,"},{"line_number":136,"context_line":"               min\u003d1,"},{"line_number":137,"context_line":"               help\u003d_(\u0027Timeout (in seconds) of soft reboot and soft power \u0027"}],"source_content_type":"text/x-python","patch_set":32,"id":"da4df55a_9d5286dc","line":134,"in_reply_to":"1a6eadb0_d02b8680","updated":"2016-12-22 05:10:15.000000000","message":"I\u0027ll fix that.","commit_id":"a426f9dce7825b49d09b9fc2f21ade68b65e3158"}],"ironic/drivers/base.py":[{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"eb028182c7061733e35f909bedfd6f6e758fb095","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":516,"context_line":"        \"\"\""},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":519,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_81033eb8","line":518,"range":{"start_line":518,"start_character":4,"end_line":518,"end_character":47},"updated":"2016-03-15 12:15:41.000000000","message":"It should also be an abstract method for the following two reasons at least I think:\n1. for consistency with the other method defined in this class.\n2. the real power states supported should depend on the specific driver.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"f1e9ca6fbaeb92f2b60907ee9625080d67d2ed08","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":516,"context_line":"        \"\"\""},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":519,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_12c5913b","line":518,"range":{"start_line":518,"start_character":4,"end_line":518,"end_character":47},"in_reply_to":"1af94dfe_81033eb8","updated":"2016-03-16 03:05:55.000000000","message":"If we defined this method as abstract, existing drivers have to implement this method, that means those driver including out of tree driver turn not to work.\nTherefor I think this method needs to be concrete method.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":16066,"name":"xiexs","email":"xiexs@cn.fujitsu.com","username":"simen"},"change_message_id":"eb028182c7061733e35f909bedfd6f6e758fb095","unresolved":false,"context_lines":[{"line_number":518,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":519,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":522,"context_line":"        :returns: A list with the supported power states defined"},{"line_number":523,"context_line":"                  in :mod:`ironic.common.states`."},{"line_number":524,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_9ec0b9e2","line":521,"range":{"start_line":521,"start_character":21,"end_line":521,"end_character":22},"updated":"2016-03-15 12:15:41.000000000","message":"s/a/A/","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"f1e9ca6fbaeb92f2b60907ee9625080d67d2ed08","unresolved":false,"context_lines":[{"line_number":518,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":519,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":522,"context_line":"        :returns: A list with the supported power states defined"},{"line_number":523,"context_line":"                  in :mod:`ironic.common.states`."},{"line_number":524,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_b2cbfd71","line":521,"range":{"start_line":521,"start_character":21,"end_line":521,"end_character":22},"in_reply_to":"1af94dfe_9ec0b9e2","updated":"2016-03-16 03:05:55.000000000","message":"I\u0027ll fix that.","commit_id":"6483b3c412870cb231c0a972ccd28cb56b314150"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":515,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":516,"context_line":"        :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":517,"context_line":"          ``None`` indicates to use default timeout which depends on"},{"line_number":518,"context_line":"          ``power_state``[*]_ and driver."},{"line_number":519,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_31f7328e","line":516,"updated":"2016-08-02 13:00:48.000000000","message":"duplicate \"timeout\"","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":515,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":516,"context_line":"        :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":517,"context_line":"          ``None`` indicates to use default timeout which depends on"},{"line_number":518,"context_line":"          ``power_state``[*]_ and driver."},{"line_number":519,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_8d5813fc","line":516,"in_reply_to":"bacf61ea_31f7328e","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll fix that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7df772dda10e0bfd0a31b1170cef795e73cc6c24","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":516,"context_line":"        :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":517,"context_line":"          ``None`` indicates to use default timeout which depends on"},{"line_number":518,"context_line":"          ``power_state``[*]_ and driver."},{"line_number":519,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":520,"context_line":"        \"\"\""},{"line_number":521,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_11f4ae85","line":518,"updated":"2016-08-02 13:00:48.000000000","message":"I\u0027m not sure what you mean by \"depends on ..\" here. could you please clarify? the meaning of timeout is roughly the same: maximum time to reach power state.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a92ec5e1b3d676db750fbe3aad36cf749e9d70c7","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":516,"context_line":"        :param timeout: timeout positive integer (\u003e 0) for any power state."},{"line_number":517,"context_line":"          ``None`` indicates to use default timeout which depends on"},{"line_number":518,"context_line":"          ``power_state``[*]_ and driver."},{"line_number":519,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":520,"context_line":"        \"\"\""},{"line_number":521,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_cd204b4c","line":518,"in_reply_to":"bacf61ea_11f4ae85","updated":"2016-08-04 09:29:04.000000000","message":"I\u0027ll try to clarify that.","commit_id":"8dae71560b341113566f78feee1ca078a4734967"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"32b6485548f9df00d11b6cf9a19d70349eeda05e","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":541,"context_line":"        \"\"\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":544,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        :param task: A TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a98d1f4_3da41956","line":543,"updated":"2016-09-29 12:50:06.000000000","message":"How is this method used?\nIt doesn\u0027t seem that supported_power_states are exposed in APIs as designed in the SPEC.","commit_id":"fe22598e0a077ae64bd6e50ec9f87e278180b90a"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"32b98d8b63a1748a1a19e805fc9f5dc2aabaed0d","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":541,"context_line":"        \"\"\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def get_supported_power_states(self, task):"},{"line_number":544,"context_line":"        \"\"\"Get a list of the supported power states."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        :param task: A TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":14,"id":"3a98d1f4_4d755b96","line":543,"in_reply_to":"3a98d1f4_3da41956","updated":"2016-09-30 05:04:55.000000000","message":"Excellent catch! I\u0027ll add the check code.","commit_id":"fe22598e0a077ae64bd6e50ec9f87e278180b90a"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\""},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"    @abc.abstractmethod"},{"line_number":533,"context_line":"    def reboot(self, task):"},{"line_number":534,"context_line":"        \"\"\"Perform a hard reboot of the task\u0027s node."},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"        Drivers are expected to properly handle case when node is powered off"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_46890fca","line":533,"range":{"start_line":533,"start_character":4,"end_line":533,"end_character":27},"updated":"2016-10-11 08:27:55.000000000","message":"I\u0027ll add timeout optional parameter to reflect the comment at\nhttps://review.openstack.org/#/c/216730/15/ironic/conductor/utils.py@150","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7e6ae0160d521be8ad3ef4eeaa7aa6f486eaa844","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        \"\"\"Set the power state of the task\u0027s node."},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":493,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":494,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":495,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":496,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_405f2875","line":493,"range":{"start_line":493,"start_character":27,"end_line":493,"end_character":75},"updated":"2016-12-19 12:46:13.000000000","message":"Include REBOOT?","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        \"\"\"Set the power state of the task\u0027s node."},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":493,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":494,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":495,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":496,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_5d2366a7","line":493,"range":{"start_line":493,"start_character":27,"end_line":493,"end_character":75},"in_reply_to":"1a6eadb0_405f2875","updated":"2016-12-20 08:08:32.000000000","message":"I think it could include REBOOT depending on a concrete driver.\niRMC power driver can take REBOOT at least.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc5e17156373278df1b4eddfb00bfa4ddab1440a","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":493,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":494,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":495,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":496,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":497,"context_line":"        \"\"\""},{"line_number":498,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_d73b0037","line":495,"range":{"start_line":495,"start_character":49,"end_line":495,"end_character":65},"updated":"2016-12-19 11:49:21.000000000","message":"This is only applicable for new \"soft\" states.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"06c77736efe5f31fafa2acc0e4ba6f4e47ed9ee9","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":493,"context_line":"        :param power_state: Any power state from :mod:`ironic.common.states`."},{"line_number":494,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":495,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":496,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":497,"context_line":"        \"\"\""},{"line_number":498,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_603504f6","line":495,"range":{"start_line":495,"start_character":49,"end_line":495,"end_character":65},"in_reply_to":"1a6eadb0_d73b0037","updated":"2016-12-19 12:50:52.000000000","message":"Ok, there is driver default even w/o new options.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc5e17156373278df1b4eddfb00bfa4ddab1440a","unresolved":false,"context_lines":[{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":507,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":508,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":509,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":510,"context_line":"        \"\"\""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_174658bf","line":508,"range":{"start_line":508,"start_character":49,"end_line":508,"end_character":65},"updated":"2016-12-19 11:49:21.000000000","message":"ditto","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7e6ae0160d521be8ad3ef4eeaa7aa6f486eaa844","unresolved":false,"context_lines":[{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":507,"context_line":"        :param timeout: timeout (in seconds) positive integer (\u003e 0) for any"},{"line_number":508,"context_line":"          power state. ``None`` indicates to use default timeout."},{"line_number":509,"context_line":"        :raises: MissingParameterValue if a required parameter is missing."},{"line_number":510,"context_line":"        \"\"\""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_e0cd945e","line":508,"range":{"start_line":508,"start_character":49,"end_line":508,"end_character":65},"in_reply_to":"1a6eadb0_174658bf","updated":"2016-12-19 12:46:13.000000000","message":"Ok, is only for hard reboot (l501).","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"}],"ironic/drivers/modules/fake.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"04357d2a0b543f724743eaa7154f683371d404ff","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def set_power_state(self, task, power_state):"},{"line_number":47,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF,"},{"line_number":48,"context_line":"                               states.SOFT_REBOOT, states.SOFT_POWER_OFF]:"},{"line_number":49,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":50,"context_line":"                _(\"set_power_state called with an invalid power\""},{"line_number":51,"context_line":"                  \"state: %s.\") % power_state)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a95cdbc_220e1f3b","line":48,"updated":"2016-10-07 16:56:41.000000000","message":"Why is it here? You\u0027re not overriding the get supported states method, so the supported ones are [states.POWER_ON, states.POWER_OFF, states.REBOOT]. You intended to overload it?","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"b7925bf7d2fb345264a712a76c89d27acdc80d98","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def set_power_state(self, task, power_state):"},{"line_number":47,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF,"},{"line_number":48,"context_line":"                               states.SOFT_REBOOT, states.SOFT_POWER_OFF]:"},{"line_number":49,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":50,"context_line":"                _(\"set_power_state called with an invalid power\""},{"line_number":51,"context_line":"                  \"state: %s.\") % power_state)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_c6e8bf19","line":48,"in_reply_to":"1a95cdbc_220e1f3b","updated":"2016-10-11 08:27:55.000000000","message":"This change was necessary for unit test.\nBut I\u0027ll removed that and add class FakeSoftPower(FakePower).","commit_id":"5148195d1fbf17c2544dc45224a03c741f95416f"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d09eab3aaca43ae0d1a788aad1547322684a7379","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def set_power_state(self, task, power_state):"},{"line_number":47,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF]:"},{"line_number":48,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":49,"context_line":"                _(\"set_power_state called with an invalid power\""},{"line_number":50,"context_line":"                  \"state: %s.\") % power_state)"},{"line_number":51,"context_line":"        task.node.power_state \u003d power_state"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_033490f9","line":49,"range":{"start_line":49,"start_character":63,"end_line":49,"end_character":64},"updated":"2016-10-17 02:23:11.000000000","message":"I\u0027ll fix too.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"9ea11d6f9acc5900ae72ab35e79047a8e4ca1d2d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF,"},{"line_number":62,"context_line":"                               states.SOFT_REBOOT, states.SOFT_POWER_OFF]:"},{"line_number":63,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":64,"context_line":"                _(\"set_power_state called with an invalid power\""},{"line_number":65,"context_line":"                  \"state: %s.\") % power_state)"},{"line_number":66,"context_line":"        task.node.power_state \u003d power_state"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_2ab99279","line":64,"range":{"start_line":64,"start_character":63,"end_line":64,"end_character":64},"updated":"2016-10-14 13:17:11.000000000","message":"nit: needs a whitespace.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d09eab3aaca43ae0d1a788aad1547322684a7379","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF,"},{"line_number":62,"context_line":"                               states.SOFT_REBOOT, states.SOFT_POWER_OFF]:"},{"line_number":63,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":64,"context_line":"                _(\"set_power_state called with an invalid power\""},{"line_number":65,"context_line":"                  \"state: %s.\") % power_state)"},{"line_number":66,"context_line":"        task.node.power_state \u003d power_state"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_2337d4ff","line":64,"range":{"start_line":64,"start_character":63,"end_line":64,"end_character":64},"in_reply_to":"fa6399be_2ab99279","updated":"2016-10-17 02:23:11.000000000","message":"I\u0027ll fix that.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b8aa32934cbbe6c4f5525537ff51c3d0097fb1fc","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\"Example implementation of a simple soft power operations.\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def set_power_state(self, task, power_state, timeout\u003dNone):"},{"line_number":61,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF,"},{"line_number":62,"context_line":"                               states.SOFT_REBOOT, states.SOFT_POWER_OFF]:"},{"line_number":63,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":64,"context_line":"                _(\"set_power_state called with an invalid power \""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_b39e9961","line":61,"updated":"2016-12-19 11:20:16.000000000","message":"What about usual reboot here?","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    \"\"\"Example implementation of a simple soft power operations.\"\"\""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def set_power_state(self, task, power_state, timeout\u003dNone):"},{"line_number":61,"context_line":"        if power_state not in [states.POWER_ON, states.POWER_OFF,"},{"line_number":62,"context_line":"                               states.SOFT_REBOOT, states.SOFT_POWER_OFF]:"},{"line_number":63,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":64,"context_line":"                _(\"set_power_state called with an invalid power \""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_5aa28c4c","line":61,"in_reply_to":"1a6eadb0_b39e9961","updated":"2016-12-20 08:08:32.000000000","message":"I understood your point, but I just followed the way of FakePower driver by referring L.47 which doesn\u0027t contain states.REBOOT.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"}],"ironic/tests/unit/api/v1/test_nodes.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"9ea11d6f9acc5900ae72ab35e79047a8e4ca1d2d","unresolved":false,"context_lines":[{"line_number":2202,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s/states\u0027 % self.node.uuid"},{"line_number":2203,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":2204,"context_line":"                         expected_location)"},{"line_number":2205,"context_line":""},{"line_number":2206,"context_line":"    def test_power_state_by_name_unsupported(self):"},{"line_number":2207,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.name,"},{"line_number":2208,"context_line":"                                 {\u0027target\u0027: states.POWER_ON},"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_00cf4d29","line":2205,"updated":"2016-10-14 13:17:11.000000000","message":"It would be better to add a test with an API call with a timeout parameter.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d09eab3aaca43ae0d1a788aad1547322684a7379","unresolved":false,"context_lines":[{"line_number":2202,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s/states\u0027 % self.node.uuid"},{"line_number":2203,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":2204,"context_line":"                         expected_location)"},{"line_number":2205,"context_line":""},{"line_number":2206,"context_line":"    def test_power_state_by_name_unsupported(self):"},{"line_number":2207,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.name,"},{"line_number":2208,"context_line":"                                 {\u0027target\u0027: states.POWER_ON},"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_a30a0424","line":2205,"in_reply_to":"fa6399be_00cf4d29","updated":"2016-10-17 02:23:11.000000000","message":"I\u0027ll add that.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"33589650bdc6be2d2b7459877feb8c73e4b49002","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":2219,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s/states\u0027 % self.node.uuid"},{"line_number":2220,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":2221,"context_line":"                         expected_location)"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    def test_power_state_by_name_unsupported(self):"},{"line_number":2224,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.name,"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa6399be_9265371f","line":2221,"updated":"2016-10-17 13:19:11.000000000","message":"Could you please a unit test for timeout validation like \u0027timeout\u0027: 0 ?","commit_id":"238097e2191e0cac3093cbc74f0e3023eb3567ba"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"6eb7a98eb2986f34bcbeb43910e0419282f55aae","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertIsNotNone(response.location)"},{"line_number":2219,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s/states\u0027 % self.node.uuid"},{"line_number":2220,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":2221,"context_line":"                         expected_location)"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    def test_power_state_by_name_unsupported(self):"},{"line_number":2224,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.name,"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa6399be_54ec4b8f","line":2221,"in_reply_to":"fa6399be_9265371f","updated":"2016-10-18 07:00:11.000000000","message":"I\u0027ll fix that.","commit_id":"238097e2191e0cac3093cbc74f0e3023eb3567ba"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"33589650bdc6be2d2b7459877feb8c73e4b49002","unresolved":false,"context_lines":[{"line_number":2219,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s/states\u0027 % self.node.uuid"},{"line_number":2220,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":2221,"context_line":"                         expected_location)"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    def test_power_state_by_name_unsupported(self):"},{"line_number":2224,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.name,"},{"line_number":2225,"context_line":"                                 {\u0027target\u0027: states.POWER_ON},"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa6399be_f7274560","line":2222,"updated":"2016-10-17 13:19:11.000000000","message":"Could you please add unit tests for older microversion?\nsuch as:\n  - Specify soft power off with older version.\n  - Specify power on and timeout with older version,","commit_id":"238097e2191e0cac3093cbc74f0e3023eb3567ba"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"6eb7a98eb2986f34bcbeb43910e0419282f55aae","unresolved":false,"context_lines":[{"line_number":2219,"context_line":"        expected_location \u003d \u0027/v1/nodes/%s/states\u0027 % self.node.uuid"},{"line_number":2220,"context_line":"        self.assertEqual(urlparse.urlparse(response.location).path,"},{"line_number":2221,"context_line":"                         expected_location)"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"    def test_power_state_by_name_unsupported(self):"},{"line_number":2224,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.name,"},{"line_number":2225,"context_line":"                                 {\u0027target\u0027: states.POWER_ON},"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa6399be_74014f39","line":2222,"in_reply_to":"fa6399be_f7274560","updated":"2016-10-18 07:00:11.000000000","message":"I\u0027ll fix that.","commit_id":"238097e2191e0cac3093cbc74f0e3023eb3567ba"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"1a249d1bbd325e767d874063ab03159c75509e92","unresolved":false,"context_lines":[{"line_number":2297,"context_line":"        self.assertEqual(http_client.NOT_ACCEPTABLE, response.status_code)"},{"line_number":2298,"context_line":"        self.assertTrue(response.json[\u0027error_message\u0027])"},{"line_number":2299,"context_line":""},{"line_number":2300,"context_line":"    def test_power_state_power_off_no_timeout_no_ver(self):"},{"line_number":2301,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.uuid,"},{"line_number":2302,"context_line":"                                 {\u0027target\u0027: states.POWER_OFF})"},{"line_number":2303,"context_line":"        self.assertEqual(http_client.ACCEPTED, response.status_code)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_67b4e3f1","line":2300,"range":{"start_line":2300,"start_character":25,"end_line":2300,"end_character":34},"updated":"2016-10-20 01:39:57.000000000","message":"s/power_off/soft_power_off/\n\nditto for below cases","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"1a249d1bbd325e767d874063ab03159c75509e92","unresolved":false,"context_lines":[{"line_number":2299,"context_line":""},{"line_number":2300,"context_line":"    def test_power_state_power_off_no_timeout_no_ver(self):"},{"line_number":2301,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.uuid,"},{"line_number":2302,"context_line":"                                 {\u0027target\u0027: states.POWER_OFF})"},{"line_number":2303,"context_line":"        self.assertEqual(http_client.ACCEPTED, response.status_code)"},{"line_number":2304,"context_line":"        self.assertEqual(b\u0027\u0027, response.body)"},{"line_number":2305,"context_line":"        self.mock_cnps.assert_called_once_with(mock.ANY,"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa6399be_e7c8f376","line":2302,"range":{"start_line":2302,"start_character":44,"end_line":2302,"end_character":60},"updated":"2016-10-20 01:39:57.000000000","message":"s/states.POWER_OFF/states.SOFT_POWER_OFF/\n\nditto for below cases","commit_id":"74cf5a80f2386143c2b53addff0c64216e7ab87c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90daac16e86a5594b3f81e162f824fd4133dc5c5","unresolved":false,"context_lines":[{"line_number":2372,"context_line":"    def test_power_state_power_on_valid_timeout_invalid_soft_ver(self):"},{"line_number":2373,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.uuid,"},{"line_number":2374,"context_line":"                                 {\u0027target\u0027: states.POWER_ON, \u0027timeout\u0027: 2},"},{"line_number":2375,"context_line":"                                 headers\u003d{api_base.Version.string: \"1.26\"},"},{"line_number":2376,"context_line":"                                 expect_errors\u003dTrue)"},{"line_number":2377,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":2378,"context_line":"        self.assertEqual(http_client.NOT_ACCEPTABLE, response.status_code)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_66befcd5","line":2375,"updated":"2016-12-19 13:52:18.000000000","message":"All tests are similar, we may introduce helper function [0] that combine same steps for all tests.\n[0] _test_power_state(target_state, timeout, api_version):","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":2372,"context_line":"    def test_power_state_power_on_valid_timeout_invalid_soft_ver(self):"},{"line_number":2373,"context_line":"        response \u003d self.put_json(\u0027/nodes/%s/states/power\u0027 % self.node.uuid,"},{"line_number":2374,"context_line":"                                 {\u0027target\u0027: states.POWER_ON, \u0027timeout\u0027: 2},"},{"line_number":2375,"context_line":"                                 headers\u003d{api_base.Version.string: \"1.26\"},"},{"line_number":2376,"context_line":"                                 expect_errors\u003dTrue)"},{"line_number":2377,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":2378,"context_line":"        self.assertEqual(http_client.NOT_ACCEPTABLE, response.status_code)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_9a3a6433","line":2375,"in_reply_to":"1a6eadb0_66befcd5","updated":"2016-12-20 08:08:32.000000000","message":"Right, I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"9ea11d6f9acc5900ae72ab35e79047a8e4ca1d2d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            # Verify the reservation has been cleared by"},{"line_number":81,"context_line":"            # background task\u0027s link callback."},{"line_number":82,"context_line":"            self.assertIsNone(node.reservation)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @mock.patch.object(conductor_utils, \u0027node_power_action\u0027)"},{"line_number":85,"context_line":"    def test_change_node_power_state_node_already_locked(self,"},{"line_number":86,"context_line":"                                                         pwr_act_mock):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_726460b8","line":83,"updated":"2016-10-14 13:17:11.000000000","message":"It would be better to add a test which calls change_node_power_state() with timeout to test a new parameter.\n\nHow about mocking task.spawn_after and checking if timeout parameter is passed as expected using assert_call_once_with?\n\nthere are 4cases for timeout.\n- power_on, timeout\u003dNone\n- power_on, timeout\u003d10\n- soft_power_off, timeout\u003dNone\n- soft_power_off, timeout\u003d10","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d09eab3aaca43ae0d1a788aad1547322684a7379","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            # Verify the reservation has been cleared by"},{"line_number":81,"context_line":"            # background task\u0027s link callback."},{"line_number":82,"context_line":"            self.assertIsNone(node.reservation)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @mock.patch.object(conductor_utils, \u0027node_power_action\u0027)"},{"line_number":85,"context_line":"    def test_change_node_power_state_node_already_locked(self,"},{"line_number":86,"context_line":"                                                         pwr_act_mock):"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_f863caae","line":83,"in_reply_to":"fa6399be_726460b8","updated":"2016-10-17 02:23:11.000000000","message":"I\u0027ll add a soft_power_off case using fake_soft_power driver.\nBut we cannot verify task.spawn_after which requires \u0027task\u0027.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"9ea11d6f9acc5900ae72ab35e79047a8e4ca1d2d","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                          power_state\u003dinitial_state)"},{"line_number":210,"context_line":"        self._start_service()"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":213,"context_line":"                               \u0027get_supported_power_states\u0027) as supported_mock:"},{"line_number":214,"context_line":"            supported_mock.return_value \u003d ["},{"line_number":215,"context_line":"                states.POWER_ON, states.POWER_OFF, states.REBOOT]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":218,"context_line":"                                    self.service.change_node_power_state,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_e550ab34","line":215,"range":{"start_line":212,"start_character":0,"end_line":215,"end_character":65},"updated":"2016-10-14 13:17:11.000000000","message":"I don\u0027t think it\u0027s necessary to use mock here.\nget_power_state of fake driver is available as-is.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d09eab3aaca43ae0d1a788aad1547322684a7379","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                          power_state\u003dinitial_state)"},{"line_number":210,"context_line":"        self._start_service()"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        with mock.patch.object(self.driver.power,"},{"line_number":213,"context_line":"                               \u0027get_supported_power_states\u0027) as supported_mock:"},{"line_number":214,"context_line":"            supported_mock.return_value \u003d ["},{"line_number":215,"context_line":"                states.POWER_ON, states.POWER_OFF, states.REBOOT]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            exc \u003d self.assertRaises(messaging.rpc.ExpectedException,"},{"line_number":218,"context_line":"                                    self.service.change_node_power_state,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_7570a372","line":215,"range":{"start_line":212,"start_character":0,"end_line":215,"end_character":65},"in_reply_to":"fa6399be_e550ab34","updated":"2016-10-17 02:23:11.000000000","message":"It\u0027s true that this mock returns same value as \u0027fake\u0027 driver\u0027s implementation.\n\nBut this mock is necessary to check that get_supported_power_states is certainly called at 226.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"}],"ironic/tests/unit/conductor/test_utils.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"9ea11d6f9acc5900ae72ab35e79047a8e4ca1d2d","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            self.assertIsNone(node[\u0027target_power_state\u0027])"},{"line_number":360,"context_line":"            self.assertIsNone(node[\u0027last_error\u0027])"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"class CleanupAfterTimeoutTestCase(tests_base.TestCase):"},{"line_number":364,"context_line":"    def setUp(self):"},{"line_number":365,"context_line":"        super(CleanupAfterTimeoutTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_f51e9a0a","line":362,"updated":"2016-10-14 13:17:11.000000000","message":"I prefer adding at least one test which calls node_power_action() with a timeout parameter.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"d09eab3aaca43ae0d1a788aad1547322684a7379","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            self.assertIsNone(node[\u0027target_power_state\u0027])"},{"line_number":360,"context_line":"            self.assertIsNone(node[\u0027last_error\u0027])"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"class CleanupAfterTimeoutTestCase(tests_base.TestCase):"},{"line_number":364,"context_line":"    def setUp(self):"},{"line_number":365,"context_line":"        super(CleanupAfterTimeoutTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa6399be_b8c23251","line":362,"in_reply_to":"fa6399be_f51e9a0a","updated":"2016-10-17 02:23:11.000000000","message":"I\u0027ll add that.","commit_id":"eaf29b346bede2d6ceb755f31608aeeca8e0e209"}],"releasenotes/notes/soft-reboot-poweroff-9fdb0a4306dd668d.yaml":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e2156841ff71455bbb5a565b36c0dc6358a8b5e3","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce \"timeout\" optional"},{"line_number":5,"context_line":"    parameter."}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3a71b18c_f75a8882","line":5,"updated":"2016-12-02 13:31:52.000000000","message":"Please mention also new config option.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"a14014d11d401ae81c095162006f2a95e77bc9b3","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce \"timeout\" optional"},{"line_number":5,"context_line":"    parameter."}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3a71b18c_90181320","line":5,"in_reply_to":"3a71b18c_f75a8882","updated":"2016-12-06 07:49:51.000000000","message":"I\u0027ll add that.","commit_id":"1d5fd4613ab89e5c84393b2d6001d8d007a77ad7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fc5e17156373278df1b4eddfb00bfa4ddab1440a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce ``timeout`` optional"},{"line_number":5,"context_line":"    parameter and ``[conductor]/soft_power_off_timeout`` configuration"},{"line_number":6,"context_line":"    option."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_935a7d4f","line":3,"range":{"start_line":3,"start_character":13,"end_line":3,"end_character":24},"updated":"2016-12-19 11:49:21.000000000","message":"soft rebooting","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce ``timeout`` optional"},{"line_number":5,"context_line":"    parameter and ``[conductor]/soft_power_off_timeout`` configuration"},{"line_number":6,"context_line":"    option."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_4ee72ee4","line":3,"range":{"start_line":3,"start_character":13,"end_line":3,"end_character":24},"in_reply_to":"1a6eadb0_31aa7c71","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll add that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce ``timeout`` optional"},{"line_number":5,"context_line":"    parameter and ``[conductor]/soft_power_off_timeout`` configuration"},{"line_number":6,"context_line":"    option."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_2ed67227","line":3,"range":{"start_line":3,"start_character":13,"end_line":3,"end_character":24},"in_reply_to":"1a6eadb0_935a7d4f","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll fix that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90daac16e86a5594b3f81e162f824fd4133dc5c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce ``timeout`` optional"},{"line_number":5,"context_line":"    parameter and ``[conductor]/soft_power_off_timeout`` configuration"},{"line_number":6,"context_line":"    option."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_31aa7c71","line":3,"range":{"start_line":3,"start_character":13,"end_line":3,"end_character":24},"in_reply_to":"1a6eadb0_935a7d4f","updated":"2016-12-19 13:52:18.000000000","message":"While it is available via API, the node will not be soft rebooted or soft power off until appropriate change is merged to power driver. Might be mention that custom power drivers may be enhanced to support soft power off/reboot?","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90daac16e86a5594b3f81e162f824fd4133dc5c5","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce ``timeout`` optional"},{"line_number":5,"context_line":"    parameter and ``[conductor]/soft_power_off_timeout`` configuration"},{"line_number":6,"context_line":"    option."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_069f0860","line":6,"updated":"2016-12-19 13:52:18.000000000","message":"Please mention API version where this feature is available.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"9b4008e023a10d8c720a73c54ae02411b62794f1","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Support \"soft reboot\" and \"soft power off\" requests to change"},{"line_number":4,"context_line":"    node\u0027s power state, and also introduce ``timeout`` optional"},{"line_number":5,"context_line":"    parameter and ``[conductor]/soft_power_off_timeout`` configuration"},{"line_number":6,"context_line":"    option."}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_8ee78611","line":6,"in_reply_to":"1a6eadb0_069f0860","updated":"2016-12-20 08:08:32.000000000","message":"I\u0027ll add that.","commit_id":"18a642bfe03dbd4c5480e4f28a660f2dbf0a1349"}]}
