)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"00ecdfba14f49e692f845bec79d6e4a976e2987b","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Id5907812935096c5c557c896daf72175ed138866"},{"line_number":24,"context_line":"Partial-Bug: #1526290"},{"line_number":25,"context_line":"Depends-On: I0e34407133684e34c4ab9446b3521a24f3038f92"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"bae84128_019556e3","line":25,"updated":"2016-02-19 14:51:31.000000000","message":"can be removed if you happen to create one more patch","commit_id":"e6f6d9eacca0b1120b7a7e2030848b33261a351c"}],"ironicclient/tests/unit/v1/test_node.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"29a5fdf3ca8872f371ddc1ce4150796eb69886fd","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"if six.PY3:"},{"line_number":32,"context_line":"    import io"},{"line_number":33,"context_line":"    file \u003d io.BytesIO"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"NODE1 \u003d {\u0027id\u0027: 123,"},{"line_number":36,"context_line":"         \u0027uuid\u0027: \u002766666666-7777-8888-9999-000000000000\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_17eb51e0","line":33,"updated":"2016-02-08 10:46:45.000000000","message":"Not sure if we should overwrite \"file\" here? Since it\u0027s a built-in type, it can have some undesirable results. Also BytesIO is part of six compat layer:\n\nfrom six import BytesIO","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"85a98ab133b6f069d5995f1629edff71099509fe","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"if six.PY3:"},{"line_number":32,"context_line":"    import io"},{"line_number":33,"context_line":"    file \u003d io.BytesIO"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"NODE1 \u003d {\u0027id\u0027: 123,"},{"line_number":36,"context_line":"         \u0027uuid\u0027: \u002766666666-7777-8888-9999-000000000000\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_cd0af825","line":33,"in_reply_to":"5a5ae5dd_17eb51e0","updated":"2016-02-08 15:35:04.000000000","message":"I think I got this idea from ironic (eg [1], there are other places too). Let me think about it.\n\n[1] https://github.com/openstack/ironic/blob/1a4d589e285a9176f6aff9b69e03f29bdbc4cdfd/ironic/tests/unit/common/test_image_service.py#L33","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"}],"ironicclient/tests/unit/v1/test_node_shell.py":[{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"5b96d923b3d210b0006ece7e2496c5be7a59242e","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        args.node \u003d \u0027node_uuid\u0027"},{"line_number":471,"context_line":"        args.provision_state \u003d \u0027clean\u0027"},{"line_number":472,"context_line":"        args.config_drive \u003d None"},{"line_number":473,"context_line":"        clean_steps \u003d \u0027[{\"step\": \"upgrade\", \"interface\": \"deploy\"}]\u0027"},{"line_number":474,"context_line":"        args.clean_steps \u003d clean_steps"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        n_shell.do_node_set_provision_state(client_mock, args)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_b9a9ed91","line":473,"updated":"2015-12-22 09:22:02.000000000","message":"nit: clean_steps can be a file name or \u0027-\u0027, maybe better to also use them in test_node_shell tests rather than only use the dict of steps.","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"c5a171b6de157f2798ff1d3652fe32ccb1793db6","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        args.node \u003d \u0027node_uuid\u0027"},{"line_number":471,"context_line":"        args.provision_state \u003d \u0027clean\u0027"},{"line_number":472,"context_line":"        args.config_drive \u003d None"},{"line_number":473,"context_line":"        clean_steps \u003d \u0027[{\"step\": \"upgrade\", \"interface\": \"deploy\"}]\u0027"},{"line_number":474,"context_line":"        args.clean_steps \u003d clean_steps"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        n_shell.do_node_set_provision_state(client_mock, args)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_43b0eadd","line":473,"in_reply_to":"1a7b0d38_b4d566ba","updated":"2015-12-23 09:32:38.000000000","message":"From my point of view, this is somehow not for functional test, but for developer to understand the code better, like the potential input. But since we have this in test_node, so it\u0027s not necessary here.","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ff4ddf591ff5d0a98cec76e92da66ef1100b49df","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        args.node \u003d \u0027node_uuid\u0027"},{"line_number":471,"context_line":"        args.provision_state \u003d \u0027clean\u0027"},{"line_number":472,"context_line":"        args.config_drive \u003d None"},{"line_number":473,"context_line":"        clean_steps \u003d \u0027[{\"step\": \"upgrade\", \"interface\": \"deploy\"}]\u0027"},{"line_number":474,"context_line":"        args.clean_steps \u003d clean_steps"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"        n_shell.do_node_set_provision_state(client_mock, args)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_b4d566ba","line":473,"in_reply_to":"3a7e1126_b9a9ed91","updated":"2015-12-22 15:51:33.000000000","message":"I could do that but it is just a string as far as that method is concerned. There is zero checking of the value so I\u0027m not sure it makes sense. Except that you\u0027re asking for it so I\u0027m wondering why. Would it be better if I used some non-sensical value like clean_steps \u003d \u0027some value\u0027 to indicate that it doesn\u0027t matter?","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"dcfd287b6c55b157d90c2967b4bd8a7e853bf64c","unresolved":false,"context_lines":[{"line_number":487,"context_line":"    @mock.patch.object(n_shell, \u0027_get_from_stdin\u0027, autospec\u003dTrue)"},{"line_number":488,"context_line":"    def test_do_node_set_provision_state_clean_stdin(self, mock_stdin):"},{"line_number":489,"context_line":"        clean_steps \u003d \u0027[{\"step\": \"upgrade\", \"interface\": \"deploy\"}]\u0027"},{"line_number":490,"context_line":"        mock_stdin.return_value \u003d clean_steps"},{"line_number":491,"context_line":"        client_mock \u003d mock.MagicMock()"},{"line_number":492,"context_line":"        args \u003d mock.MagicMock()"},{"line_number":493,"context_line":"        args.node \u003d \u0027node_uuid\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_f1e68242","line":490,"updated":"2016-02-18 10:17:54.000000000","message":"stdin will always return a string type, it should be converted by some extra code in our side. See comment in the node_shell.py module.","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"fa62c4f185c092f85851ea265fb6b4ed1bf84d09","unresolved":false,"context_lines":[{"line_number":487,"context_line":"    @mock.patch.object(n_shell, \u0027_get_from_stdin\u0027, autospec\u003dTrue)"},{"line_number":488,"context_line":"    def test_do_node_set_provision_state_clean_stdin(self, mock_stdin):"},{"line_number":489,"context_line":"        clean_steps \u003d \u0027[{\"step\": \"upgrade\", \"interface\": \"deploy\"}]\u0027"},{"line_number":490,"context_line":"        mock_stdin.return_value \u003d clean_steps"},{"line_number":491,"context_line":"        client_mock \u003d mock.MagicMock()"},{"line_number":492,"context_line":"        args \u003d mock.MagicMock()"},{"line_number":493,"context_line":"        args.node \u003d \u0027node_uuid\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_b45cda19","line":490,"in_reply_to":"dae33548_f1e68242","updated":"2016-02-18 14:17:42.000000000","message":"clean_steps is a string here :)","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"d7a064449a7044ca4f8e06f446e4471defd48e3b","unresolved":false,"context_lines":[{"line_number":500,"context_line":"        client_mock.node.set_provision_state.assert_called_once_with("},{"line_number":501,"context_line":"            \u0027node_uuid\u0027, \u0027clean\u0027, configdrive\u003dNone,"},{"line_number":502,"context_line":"            cleansteps\u003djson.loads(clean_steps))"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @mock.patch.object(n_shell, \u0027_get_from_stdin\u0027, autospec\u003dTrue)"},{"line_number":505,"context_line":"    def test_do_node_set_provision_state_clean_stdin_fails(self, mock_stdin):"},{"line_number":506,"context_line":"        mock_stdin.side_effect \u003d exc.InvalidAttribute(\u0027bad\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_d7e7f7a9","line":503,"updated":"2016-02-18 08:47:24.000000000","message":"nit:better to add a test like test_do_node_set_provision_state_clean_file() in the case of given clean_steps is a file name","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"272539992f2a15823608ca01608d7b734aa53552","unresolved":false,"context_lines":[{"line_number":500,"context_line":"        client_mock.node.set_provision_state.assert_called_once_with("},{"line_number":501,"context_line":"            \u0027node_uuid\u0027, \u0027clean\u0027, configdrive\u003dNone,"},{"line_number":502,"context_line":"            cleansteps\u003djson.loads(clean_steps))"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @mock.patch.object(n_shell, \u0027_get_from_stdin\u0027, autospec\u003dTrue)"},{"line_number":505,"context_line":"    def test_do_node_set_provision_state_clean_stdin_fails(self, mock_stdin):"},{"line_number":506,"context_line":"        mock_stdin.side_effect \u003d exc.InvalidAttribute(\u0027bad\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_9db3b24c","line":503,"in_reply_to":"dae33548_54f2ae06","updated":"2016-02-18 16:11:45.000000000","message":"Done","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"fa62c4f185c092f85851ea265fb6b4ed1bf84d09","unresolved":false,"context_lines":[{"line_number":500,"context_line":"        client_mock.node.set_provision_state.assert_called_once_with("},{"line_number":501,"context_line":"            \u0027node_uuid\u0027, \u0027clean\u0027, configdrive\u003dNone,"},{"line_number":502,"context_line":"            cleansteps\u003djson.loads(clean_steps))"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @mock.patch.object(n_shell, \u0027_get_from_stdin\u0027, autospec\u003dTrue)"},{"line_number":505,"context_line":"    def test_do_node_set_provision_state_clean_stdin_fails(self, mock_stdin):"},{"line_number":506,"context_line":"        mock_stdin.side_effect \u003d exc.InvalidAttribute(\u0027bad\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_54f2ae06","line":503,"in_reply_to":"dae33548_d7e7f7a9","updated":"2016-02-18 14:17:42.000000000","message":"We can add one, yes, I was thinking I cover that in test__handle_clean_steps_arg_file","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"}],"ironicclient/v1/node.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"29a5fdf3ca8872f371ddc1ce4150796eb69886fd","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            elif cleansteps \u003d\u003d \u0027-\u0027:"},{"line_number":286,"context_line":"                # read it in from stdin"},{"line_number":287,"context_line":"                try:"},{"line_number":288,"context_line":"                    cleansteps \u003d sys.stdin.read().strip()"},{"line_number":289,"context_line":"                except Exception as e:"},{"line_number":290,"context_line":"                    err \u003d _(\"Cannot get clean steps from standard input. \""},{"line_number":291,"context_line":"                            \"Error: %(err)s\") % {\u0027err\u0027: e}"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_d74859ce","line":288,"updated":"2016-02-08 10:46:45.000000000","message":"Few thoughts there:\n\nThe node.py module is the library I don\u0027t think we should allow reading from the the stdin here. If we want to offer this feature this bits should go to node_shell.py which is the interface with the command line (where people type stuff), the *_shell.py module can then convert from stdin to a JSON/string and then pass to this module here.\n\nAlso, realistically, do we expect people to interactively type the string with the clean steps ?","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"85a98ab133b6f069d5995f1629edff71099509fe","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            elif cleansteps \u003d\u003d \u0027-\u0027:"},{"line_number":286,"context_line":"                # read it in from stdin"},{"line_number":287,"context_line":"                try:"},{"line_number":288,"context_line":"                    cleansteps \u003d sys.stdin.read().strip()"},{"line_number":289,"context_line":"                except Exception as e:"},{"line_number":290,"context_line":"                    err \u003d _(\"Cannot get clean steps from standard input. \""},{"line_number":291,"context_line":"                            \"Error: %(err)s\") % {\u0027err\u0027: e}"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_6ddae418","line":288,"in_reply_to":"5a5ae5dd_d74859ce","updated":"2016-02-08 15:35:04.000000000","message":"Yes, good point about the stdin handling being in node_shell.py.\n\nwrt interactively typing the string, I think the use case was to pipe the input (https://review.openstack.org/#/c/185122/5/specs/liberty/implement-zapping-states.rst, line 203).","commit_id":"3c4193edb55db5b3a2900a6d17a204d59ff5d52b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"517dac2cee3fef5347c2fa7098848d2f2192194c","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                            cleansteps\u003dNone):"},{"line_number":265,"context_line":"        \"\"\"Set the provision state for the node."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        :param node_uuid: The UUID or name of the node."},{"line_number":268,"context_line":"        :param state: The desired provision state. One of \u0027active\u0027, \u0027deleted\u0027,"},{"line_number":269,"context_line":"             \u0027rebuild\u0027, \u0027inspect\u0027, \u0027provide\u0027, \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027."},{"line_number":270,"context_line":"        :param configdrive: A gzipped, base64-encoded configuration drive"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_14687486","line":267,"updated":"2016-02-17 11:41:58.000000000","message":"+1, though it\u0027s a bit out of scope here","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"b515c70066e9fe139eca90317b38436d655d8431","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                            cleansteps\u003dNone):"},{"line_number":265,"context_line":"        \"\"\"Set the provision state for the node."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        :param node_uuid: The UUID or name of the node."},{"line_number":268,"context_line":"        :param state: The desired provision state. One of \u0027active\u0027, \u0027deleted\u0027,"},{"line_number":269,"context_line":"             \u0027rebuild\u0027, \u0027inspect\u0027, \u0027provide\u0027, \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027."},{"line_number":270,"context_line":"        :param configdrive: A gzipped, base64-encoded configuration drive"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_665a042c","line":267,"updated":"2016-02-17 07:45:05.000000000","message":"nit:node_uuid is confusing because it also can be node name. What about change the variable name to node_ident or node?","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bdb9f8964c13904a2eb7b6f497170612a12ae9ba","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                            cleansteps\u003dNone):"},{"line_number":265,"context_line":"        \"\"\"Set the provision state for the node."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        :param node_uuid: The UUID or name of the node."},{"line_number":268,"context_line":"        :param state: The desired provision state. One of \u0027active\u0027, \u0027deleted\u0027,"},{"line_number":269,"context_line":"             \u0027rebuild\u0027, \u0027inspect\u0027, \u0027provide\u0027, \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027."},{"line_number":270,"context_line":"        :param configdrive: A gzipped, base64-encoded configuration drive"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_24972aed","line":267,"in_reply_to":"dae33548_14687486","updated":"2016-02-17 19:20:17.000000000","message":"Yeah I would leave that out, cause all the other rmethods uses node_uuid.","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a7fcbd4bdf0633807f0a61beaa5290dbae4cb1c0","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                            cleansteps\u003dNone):"},{"line_number":265,"context_line":"        \"\"\"Set the provision state for the node."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        :param node_uuid: The UUID or name of the node."},{"line_number":268,"context_line":"        :param state: The desired provision state. One of \u0027active\u0027, \u0027deleted\u0027,"},{"line_number":269,"context_line":"             \u0027rebuild\u0027, \u0027inspect\u0027, \u0027provide\u0027, \u0027manage\u0027, \u0027clean\u0027, \u0027abort\u0027."},{"line_number":270,"context_line":"        :param configdrive: A gzipped, base64-encoded configuration drive"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_13a2254b","line":267,"in_reply_to":"dae33548_24972aed","updated":"2016-02-18 00:16:07.000000000","message":"Totally out of scope for this patch!","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"517dac2cee3fef5347c2fa7098848d2f2192194c","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            a directory containing the config drive files. In case it\u0027s a"},{"line_number":273,"context_line":"            directory, a config drive will be generated from it. This is only"},{"line_number":274,"context_line":"            valid when setting state to \u0027active\u0027."},{"line_number":275,"context_line":"        :param cleansteps: The clean steps in JSON format. May be the path to"},{"line_number":276,"context_line":"            a file containing the clean steps OR a string. The value should be"},{"line_number":277,"context_line":"            a list of clean-step dictionaries; each dictionary should have keys"},{"line_number":278,"context_line":"            \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. This must be"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_740740ca","line":275,"updated":"2016-02-17 11:41:58.000000000","message":"if we accept JSON format, it should be a structure (aka dict or list), not a string. Then we\u0027ll have easier time distinguishing between files and JSON data as well. Imagine someone using this API from Python, not from CLI.","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a7fcbd4bdf0633807f0a61beaa5290dbae4cb1c0","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            a directory containing the config drive files. In case it\u0027s a"},{"line_number":273,"context_line":"            directory, a config drive will be generated from it. This is only"},{"line_number":274,"context_line":"            valid when setting state to \u0027active\u0027."},{"line_number":275,"context_line":"        :param cleansteps: The clean steps in JSON format. May be the path to"},{"line_number":276,"context_line":"            a file containing the clean steps OR a string. The value should be"},{"line_number":277,"context_line":"            a list of clean-step dictionaries; each dictionary should have keys"},{"line_number":278,"context_line":"            \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. This must be"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_b37ff9a9","line":275,"in_reply_to":"dae33548_0fbe7f64","updated":"2016-02-18 00:16:07.000000000","message":"Good point!","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"bdb9f8964c13904a2eb7b6f497170612a12ae9ba","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            a directory containing the config drive files. In case it\u0027s a"},{"line_number":273,"context_line":"            directory, a config drive will be generated from it. This is only"},{"line_number":274,"context_line":"            valid when setting state to \u0027active\u0027."},{"line_number":275,"context_line":"        :param cleansteps: The clean steps in JSON format. May be the path to"},{"line_number":276,"context_line":"            a file containing the clean steps OR a string. The value should be"},{"line_number":277,"context_line":"            a list of clean-step dictionaries; each dictionary should have keys"},{"line_number":278,"context_line":"            \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. This must be"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_c4a59e47","line":275,"in_reply_to":"dae33548_740740ca","updated":"2016-02-17 19:20:17.000000000","message":"++ indeed, we can convert the string to dict in the node_shell.py module","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"713db0538d7b686c663f0946095d0bc69d882562","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            a directory containing the config drive files. In case it\u0027s a"},{"line_number":273,"context_line":"            directory, a config drive will be generated from it. This is only"},{"line_number":274,"context_line":"            valid when setting state to \u0027active\u0027."},{"line_number":275,"context_line":"        :param cleansteps: The clean steps in JSON format. May be the path to"},{"line_number":276,"context_line":"            a file containing the clean steps OR a string. The value should be"},{"line_number":277,"context_line":"            a list of clean-step dictionaries; each dictionary should have keys"},{"line_number":278,"context_line":"            \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. This must be"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_0fbe7f64","line":275,"in_reply_to":"dae33548_c4a59e47","updated":"2016-02-17 19:37:53.000000000","message":"Agree, I also believe the opening of the file should be moved to the shell interaction.","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"517dac2cee3fef5347c2fa7098848d2f2192194c","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                            \"Error: %(err)s\") % {\u0027err\u0027: e, \u0027file\u0027: cleansteps}"},{"line_number":303,"context_line":"                    raise exc.InvalidAttribute(err)"},{"line_number":304,"context_line":"            try:"},{"line_number":305,"context_line":"                cleansteps \u003d json.loads(cleansteps)"},{"line_number":306,"context_line":"            except ValueError as e:"},{"line_number":307,"context_line":"                err \u003d (_(\"For clean steps: \u0027%(steps)s\u0027, error: \u0027%(err)s\u0027\") %"},{"line_number":308,"context_line":"                       {\u0027err\u0027: e, \u0027steps\u0027: cleansteps})"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_540cbcec","line":305,"updated":"2016-02-17 11:41:58.000000000","message":"leave it up to the caller (see above)","commit_id":"9a88b4f051d50f1ce53c76f8d1ba53aa257c2fc9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"370b7f53a421befe354474169c2cb8e087330153","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                configdrive \u003d utils.make_configdrive(configdrive)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"            body[\u0027configdrive\u0027] \u003d configdrive"},{"line_number":292,"context_line":"        elif cleansteps:"},{"line_number":293,"context_line":"            body[\u0027clean_steps\u0027] \u003d cleansteps"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        return self.update(path, body, http_method\u003d\u0027PUT\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_ef422dad","line":292,"updated":"2016-02-18 01:36:58.000000000","message":"In revision 5, the cleansteps file was being passed and handled here, but it was changed to be handled in node_shell.py. Note that this seems inconsistent with the configdrive, where the file is handled here.","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5881de70d6dd9a7902d11dd8333e11442dfbf7fd","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                configdrive \u003d utils.make_configdrive(configdrive)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"            body[\u0027configdrive\u0027] \u003d configdrive"},{"line_number":292,"context_line":"        elif cleansteps:"},{"line_number":293,"context_line":"            body[\u0027clean_steps\u0027] \u003d cleansteps"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        return self.update(path, body, http_method\u003d\u0027PUT\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_b8822dc6","line":292,"in_reply_to":"dae33548_ef422dad","updated":"2016-02-18 03:26:27.000000000","message":"Yeah, it is inconsistent, however given that a configdrive is an ISO image of a directory tree, that seems sane for a python client user. OTOH, if I\u0027m writing a python application that deals with clean steps, I\u0027d prefer to just pass in a list.","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"}],"ironicclient/v1/node_shell.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"da48f674ee15ab74b332afd05c69a42b57779b4e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    return info"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def _handle_clean_steps_arg(steps):"},{"line_number":52,"context_line":"    \"\"\"Attempts to read clean steps argument."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    :param clean_steps: May be a file name containing the clean steps, or"}],"source_content_type":"text/x-python","patch_set":6,"id":"dae33548_4e39a0d6","line":51,"updated":"2016-02-17 23:03:28.000000000","message":"The problem with copy/paste. We have \u0027steps\u0027, \u0027clean_steps\u0027, and \u0027cleansteps\u0027. I think we want \u0027clean_steps\u0027 :)\n\n(I had \u0027cleansteps\u0027 cuz it was in node.py and the other args there eg \u0027configdrive\u0027 didn\u0027t have an underscore), but here, we seem to use underscores.","commit_id":"a6a3f0253d5d07b75813dcbba30d2cca37b7e52b"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e7ef7487717f630228b9535e02155ae248fb6629","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    \u0027--clean-steps\u0027,"},{"line_number":444,"context_line":"    metavar\u003d\u0027\u003cclean-steps\u003e\u0027,"},{"line_number":445,"context_line":"    default\u003dNone,"},{"line_number":446,"context_line":"    help\u003d(\"The clean steps in JSON format. May be the path to a file \""},{"line_number":447,"context_line":"          \"containing the clean steps; OR \u0027-\u0027, with the clean steps being \""},{"line_number":448,"context_line":"          \"read from standard input; OR a string. The value should be \""},{"line_number":449,"context_line":"          \"a list of clean-step dictionaries; each dictionary should have \""},{"line_number":450,"context_line":"          \"keys \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. \""},{"line_number":451,"context_line":"          \"This argument must be specified (and is only valid) when \""},{"line_number":452,"context_line":"          \"setting provision-state to \u0027clean\u0027.\"))"},{"line_number":453,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":454,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":455,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_92d3cad4","line":452,"range":{"start_line":446,"start_character":4,"end_line":452,"end_character":49},"updated":"2016-02-18 02:19:47.000000000","message":"nit: I think this clean-steps are not easy to populate for user, so can we show an clean-steps json example instance here to guide user as reference, or we will have documentation for this?","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"184698c050e9b50616cbcfa75f4a15521251b68a","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    \u0027--clean-steps\u0027,"},{"line_number":444,"context_line":"    metavar\u003d\u0027\u003cclean-steps\u003e\u0027,"},{"line_number":445,"context_line":"    default\u003dNone,"},{"line_number":446,"context_line":"    help\u003d(\"The clean steps in JSON format. May be the path to a file \""},{"line_number":447,"context_line":"          \"containing the clean steps; OR \u0027-\u0027, with the clean steps being \""},{"line_number":448,"context_line":"          \"read from standard input; OR a string. The value should be \""},{"line_number":449,"context_line":"          \"a list of clean-step dictionaries; each dictionary should have \""},{"line_number":450,"context_line":"          \"keys \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. \""},{"line_number":451,"context_line":"          \"This argument must be specified (and is only valid) when \""},{"line_number":452,"context_line":"          \"setting provision-state to \u0027clean\u0027.\"))"},{"line_number":453,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":454,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":455,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_6353d617","line":452,"range":{"start_line":446,"start_character":4,"end_line":452,"end_character":49},"in_reply_to":"dae33548_38c8dd73","updated":"2016-02-18 03:35:25.000000000","message":"Ok, got, thanks for Jim and Ruby updates.","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5131bafe89264c030236ab0906c08e19572d898b","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    \u0027--clean-steps\u0027,"},{"line_number":444,"context_line":"    metavar\u003d\u0027\u003cclean-steps\u003e\u0027,"},{"line_number":445,"context_line":"    default\u003dNone,"},{"line_number":446,"context_line":"    help\u003d(\"The clean steps in JSON format. May be the path to a file \""},{"line_number":447,"context_line":"          \"containing the clean steps; OR \u0027-\u0027, with the clean steps being \""},{"line_number":448,"context_line":"          \"read from standard input; OR a string. The value should be \""},{"line_number":449,"context_line":"          \"a list of clean-step dictionaries; each dictionary should have \""},{"line_number":450,"context_line":"          \"keys \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. \""},{"line_number":451,"context_line":"          \"This argument must be specified (and is only valid) when \""},{"line_number":452,"context_line":"          \"setting provision-state to \u0027clean\u0027.\"))"},{"line_number":453,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":454,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":455,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_38c8dd73","line":452,"range":{"start_line":446,"start_character":4,"end_line":452,"end_character":49},"in_reply_to":"dae33548_92d3cad4","updated":"2016-02-18 03:32:26.000000000","message":"There is a documentation patch. Please take a look to see if the example there is helpful: https://review.openstack.org/#/c/264266/","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5881de70d6dd9a7902d11dd8333e11442dfbf7fd","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    \u0027--clean-steps\u0027,"},{"line_number":444,"context_line":"    metavar\u003d\u0027\u003cclean-steps\u003e\u0027,"},{"line_number":445,"context_line":"    default\u003dNone,"},{"line_number":446,"context_line":"    help\u003d(\"The clean steps in JSON format. May be the path to a file \""},{"line_number":447,"context_line":"          \"containing the clean steps; OR \u0027-\u0027, with the clean steps being \""},{"line_number":448,"context_line":"          \"read from standard input; OR a string. The value should be \""},{"line_number":449,"context_line":"          \"a list of clean-step dictionaries; each dictionary should have \""},{"line_number":450,"context_line":"          \"keys \u0027interface\u0027 and \u0027step\u0027, and optional key \u0027args\u0027. \""},{"line_number":451,"context_line":"          \"This argument must be specified (and is only valid) when \""},{"line_number":452,"context_line":"          \"setting provision-state to \u0027clean\u0027.\"))"},{"line_number":453,"context_line":"def do_node_set_provision_state(cc, args):"},{"line_number":454,"context_line":"    \"\"\"Initiate a provisioning state change for a node.\"\"\""},{"line_number":455,"context_line":"    if args.config_drive and args.provision_state !\u003d \u0027active\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_58f4c159","line":452,"range":{"start_line":446,"start_character":4,"end_line":452,"end_character":49},"in_reply_to":"dae33548_92d3cad4","updated":"2016-02-18 03:26:27.000000000","message":"There is documentation, with examples, proposed in this patch: https://review.openstack.org/#/c/264266/\n\nI\u0027d prefer to keep examples out of the help messages :)","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"dcfd287b6c55b157d90c2967b4bd8a7e853bf64c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        info \u003d sys.stdin.read().strip()"},{"line_number":47,"context_line":"    except Exception as e:"},{"line_number":48,"context_line":"        err \u003d _(\"Cannot get %(desc)s from standard input. Error: %(err)s\")"},{"line_number":49,"context_line":"        raise exc.InvalidAttribute(err % {\u0027desc\u0027: info_desc, \u0027err\u0027: e})"},{"line_number":50,"context_line":"    return info"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_f16162d4","line":49,"updated":"2016-02-18 10:17:54.000000000","message":"We should convert this input to json too right? To check the format and convert to a dict type.","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"79f62853a90bb97947b869f319a8467da33bf0a8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        info \u003d sys.stdin.read().strip()"},{"line_number":47,"context_line":"    except Exception as e:"},{"line_number":48,"context_line":"        err \u003d _(\"Cannot get %(desc)s from standard input. Error: %(err)s\")"},{"line_number":49,"context_line":"        raise exc.InvalidAttribute(err % {\u0027desc\u0027: info_desc, \u0027err\u0027: e})"},{"line_number":50,"context_line":"    return info"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_d117eba0","line":49,"in_reply_to":"dae33548_54574ec9","updated":"2016-02-18 15:17:16.000000000","message":"Oh I missed that bits in the L467","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"fa62c4f185c092f85851ea265fb6b4ed1bf84d09","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        info \u003d sys.stdin.read().strip()"},{"line_number":47,"context_line":"    except Exception as e:"},{"line_number":48,"context_line":"        err \u003d _(\"Cannot get %(desc)s from standard input. Error: %(err)s\")"},{"line_number":49,"context_line":"        raise exc.InvalidAttribute(err % {\u0027desc\u0027: info_desc, \u0027err\u0027: e})"},{"line_number":50,"context_line":"    return info"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dae33548_54574ec9","line":49,"in_reply_to":"dae33548_f16162d4","updated":"2016-02-18 14:17:42.000000000","message":"This is just a generic method to get a string from stdin, the conversion is handled by the caller. do_node_set_provision_state will pass the string to _handle_clean_steps_arg, which does the conversion.","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"00ecdfba14f49e692f845bec79d6e4a976e2987b","unresolved":false,"context_lines":[{"line_number":463,"context_line":"                                        \u0027setting provision state to \"clean\"\u0027))"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    clean_steps \u003d args.clean_steps"},{"line_number":466,"context_line":"    if args.clean_steps \u003d\u003d \u0027-\u0027:"},{"line_number":467,"context_line":"        clean_steps \u003d _get_from_stdin(\u0027clean steps\u0027)"},{"line_number":468,"context_line":"    if clean_steps:"},{"line_number":469,"context_line":"        clean_steps \u003d _handle_clean_steps_arg(clean_steps)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bae84128_e1995221","line":466,"updated":"2016-02-19 14:51:31.000000000","message":"nit: s/args.//","commit_id":"e6f6d9eacca0b1120b7a7e2030848b33261a351c"}],"releasenotes/notes/manual-clean-09f6b49df7d2513f.yaml":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e7ef7487717f630228b9535e02155ae248fb6629","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds manual cleaning API: \"ironic node-set-provision-state"},{"line_number":4,"context_line":"    --clean-steps \u003cclean-steps\u003e \u003cnode\u003e \u003cprovision-state\u003e\""},{"line_number":5,"context_line":"    where \u003cprovision-state\u003e is \u0027clean\u0027 and \u003cclean-steps\u003e is the clean steps"},{"line_number":6,"context_line":"    in JSON format. May be the path to a file containing the clean steps;"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dae33548_f28cd6db","line":3,"range":{"start_line":3,"start_character":25,"end_line":3,"end_character":28},"updated":"2016-02-18 02:19:47.000000000","message":"s/API/CLI ??","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"5131bafe89264c030236ab0906c08e19572d898b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds manual cleaning API: \"ironic node-set-provision-state"},{"line_number":4,"context_line":"    --clean-steps \u003cclean-steps\u003e \u003cnode\u003e \u003cprovision-state\u003e\""},{"line_number":5,"context_line":"    where \u003cprovision-state\u003e is \u0027clean\u0027 and \u003cclean-steps\u003e is the clean steps"},{"line_number":6,"context_line":"    in JSON format. May be the path to a file containing the clean steps;"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dae33548_781b8581","line":3,"range":{"start_line":3,"start_character":25,"end_line":3,"end_character":28},"in_reply_to":"dae33548_38fc5d3d","updated":"2016-02-18 03:32:26.000000000","message":"Yeah, the problem is that I just describe the CLI, not the SDK part. So I changed it to CLI. Or we could change it to mention CLI \u0026 SDK and not the details of the actual CLI. WDYT? I also just realized that it doesn\u0027t mention that ironic API version 1.15+ is needed for this.","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5881de70d6dd9a7902d11dd8333e11442dfbf7fd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds manual cleaning API: \"ironic node-set-provision-state"},{"line_number":4,"context_line":"    --clean-steps \u003cclean-steps\u003e \u003cnode\u003e \u003cprovision-state\u003e\""},{"line_number":5,"context_line":"    where \u003cprovision-state\u003e is \u0027clean\u0027 and \u003cclean-steps\u003e is the clean steps"},{"line_number":6,"context_line":"    in JSON format. May be the path to a file containing the clean steps;"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dae33548_38fc5d3d","line":3,"range":{"start_line":3,"start_character":25,"end_line":3,"end_character":28},"in_reply_to":"dae33548_f28cd6db","updated":"2016-02-18 03:26:27.000000000","message":"Maybe \"adds support for manual cleaning API\"? This adds both CLI support and python SDK support.","commit_id":"a94a4a834e76722d11cd3cf00a5ae1bd91e80dd5"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"09574f08ae63caf2c5dadb695a3e36fcb738f82a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds manual cleaning CLI \"ironic node-set-provision-state"},{"line_number":4,"context_line":"    --clean-steps \u003cclean-steps\u003e \u003cnode\u003e \u003cprovision-state\u003e\""},{"line_number":5,"context_line":"    where \u003cprovision-state\u003e is \u0027clean\u0027 and \u003cclean-steps\u003e is the clean steps"},{"line_number":6,"context_line":"    in JSON format. May be the path to a file containing the clean steps;"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dae33548_983da9df","line":3,"updated":"2016-02-18 03:30:56.000000000","message":"Maybe \"adds support for manual cleaning API\"? This adds both CLI support and python SDK support.","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"272539992f2a15823608ca01608d7b734aa53552","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds manual cleaning CLI \"ironic node-set-provision-state"},{"line_number":4,"context_line":"    --clean-steps \u003cclean-steps\u003e \u003cnode\u003e \u003cprovision-state\u003e\""},{"line_number":5,"context_line":"    where \u003cprovision-state\u003e is \u0027clean\u0027 and \u003cclean-steps\u003e is the clean steps"},{"line_number":6,"context_line":"    in JSON format. May be the path to a file containing the clean steps;"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dae33548_9d99f27b","line":3,"in_reply_to":"dae33548_063daa8e","updated":"2016-02-18 16:11:45.000000000","message":"I don\u0027t know if we want to describe the CLI or not, so I\u0027ll leave it in and you decide. :)","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"dcfd287b6c55b157d90c2967b4bd8a7e853bf64c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds manual cleaning CLI \"ironic node-set-provision-state"},{"line_number":4,"context_line":"    --clean-steps \u003cclean-steps\u003e \u003cnode\u003e \u003cprovision-state\u003e\""},{"line_number":5,"context_line":"    where \u003cprovision-state\u003e is \u0027clean\u0027 and \u003cclean-steps\u003e is the clean steps"},{"line_number":6,"context_line":"    in JSON format. May be the path to a file containing the clean steps;"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dae33548_063daa8e","line":3,"in_reply_to":"dae33548_983da9df","updated":"2016-02-18 10:17:54.000000000","message":"+1 sounds cleaner yes","commit_id":"a91b80bf999e24235b14ca3f339ef6b84361af10"}]}
