)]}'
{"doc/source/dev/action-plugin.rst":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":28,"context_line":"   abstract property that you have to implement. This is the first function to"},{"line_number":29,"context_line":"   be called by the applier before any further processing and its role is to"},{"line_number":30,"context_line":"   validate the input parameters that were provided to it."},{"line_number":31,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.precondition` is"},{"line_number":32,"context_line":"   called before the execution of an action. This is method is a hook that can"},{"line_number":33,"context_line":"   be used to perform some initializations or to make some more advanced"},{"line_number":34,"context_line":"   validation on its input parameters. If you wish to block the execution based"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_ba5ba52d","line":31,"range":{"start_line":31,"start_character":58,"end_line":31,"end_character":70},"updated":"2016-02-22 10:45:12.000000000","message":"IMHO, according to your definition, the term \u0027precondition\u0027 is not the correct one. A precondition is a condition or predicate that must always be true just prior to the execution of some section. So, from my point of view, it should only be used to validate input parameter and/or context. Initialization should take place into a setup() method.","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":33,"context_line":"   be used to perform some initializations or to make some more advanced"},{"line_number":34,"context_line":"   validation on its input parameters. If you wish to block the execution based"},{"line_number":35,"context_line":"   on this factor, you simply have to ``raise`` an exception."},{"line_number":36,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.postcondition` is"},{"line_number":37,"context_line":"   called after the execution of the an action. As this function is called"},{"line_number":38,"context_line":"   regardless of whether an action succeded or not, this can prove itself"},{"line_number":39,"context_line":"   useful to perform cleanup operations."}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_5a6419e3","line":36,"range":{"start_line":36,"start_character":58,"end_line":36,"end_character":71},"updated":"2016-02-22 10:45:12.000000000","message":"ditto. Cleanup operation should take place into a finally() method","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"ba33c3e4b388e92e19f9b8d4788f7b9bbd02a6a9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"   validation on its input parameters. If you wish to block the execution based"},{"line_number":35,"context_line":"   on this factor, you simply have to ``raise`` an exception."},{"line_number":36,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.postcondition` is"},{"line_number":37,"context_line":"   called after the execution of the an action. As this function is called"},{"line_number":38,"context_line":"   regardless of whether an action succeded or not, this can prove itself"},{"line_number":39,"context_line":"   useful to perform cleanup operations."},{"line_number":40,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.execute` is the main"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_db92e89e","line":37,"range":{"start_line":37,"start_character":33,"end_line":37,"end_character":39},"updated":"2016-02-22 11:23:33.000000000","message":"typo? should delete \"the\"?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"ba33c3e4b388e92e19f9b8d4788f7b9bbd02a6a9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"   on this factor, you simply have to ``raise`` an exception."},{"line_number":36,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.postcondition` is"},{"line_number":37,"context_line":"   called after the execution of the an action. As this function is called"},{"line_number":38,"context_line":"   regardless of whether an action succeded or not, this can prove itself"},{"line_number":39,"context_line":"   useful to perform cleanup operations."},{"line_number":40,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.execute` is the main"},{"line_number":41,"context_line":"   component of an action. This is where you should implement the logic of"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_bb59e400","line":38,"range":{"start_line":38,"start_character":35,"end_line":38,"end_character":43},"updated":"2016-02-22 11:23:33.000000000","message":"succeeded?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":41,"context_line":"   component of an action. This is where you should implement the logic of"},{"line_number":42,"context_line":"   your action."},{"line_number":43,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.revert` allows you"},{"line_number":44,"context_line":"   to undo any side-effects caused by its previous execution whenever it went"},{"line_number":45,"context_line":"   wrong. Indeed, this method is called whenever an action raises an exception."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Here is an example showing how you can write a plugin called ``DummyAction``:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_ba13a50c","line":44,"range":{"start_line":44,"start_character":11,"end_line":44,"end_character":27},"updated":"2016-02-22 10:45:12.000000000","message":"IMH, it is not the good term. execute() will move from a resource state A to resource state B. revert() will allow to go back, on failure, to resource state A... Is precondition() can validate the revert() ?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"This implementation is the most basic one. So if you want to have more advanced"},{"line_number":80,"context_line":"examples, have a look at the implementation of the actions already provided"},{"line_number":81,"context_line":"by Watcher like ."},{"line_number":82,"context_line":"To get a better understanding on how to implement a more advanced action,"},{"line_number":83,"context_line":"have a look at the :py:class:`~watcher.applier.actions.migration.Migrate`"},{"line_number":84,"context_line":"class."}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_dade693e","line":81,"range":{"start_line":81,"start_character":15,"end_line":81,"end_character":16},"updated":"2016-02-22 10:45:12.000000000","message":"typo","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":89,"context_line":"Here below is the abstract ``BaseAction`` class that every single action"},{"line_number":90,"context_line":"should implement:"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":".. automodule:: watcher.applier.actions.base"},{"line_number":93,"context_line":"    :noindex:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":".. autoclass:: BaseAction"},{"line_number":96,"context_line":"    :members:"},{"line_number":97,"context_line":"    :noindex:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    .. py:attribute:: schema"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        Defines a Schema that the input parameters shall comply to"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        :returns: A schema declaring the input parameters this action should be"},{"line_number":104,"context_line":"                  provided along with their respective constraints"},{"line_number":105,"context_line":"        :rtype: :py:class:`voluptuous.Schema` instance"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"Register a new entry point"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_daaca9a2","line":105,"range":{"start_line":92,"start_character":0,"end_line":105,"end_character":54},"updated":"2016-02-22 10:45:12.000000000","message":"We have twice the same information in the HTML doc.","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":130,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"The Watcher Applier service will automatically discover any installed plugins"},{"line_number":133,"context_line":"when it is run. If a Python package containing a custom plugin is installed"},{"line_number":134,"context_line":"within the same environment as Watcher, Watcher will automatically make that"},{"line_number":135,"context_line":"plugin available for use."},{"line_number":136,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_ba860511","line":133,"range":{"start_line":133,"start_character":11,"end_line":133,"end_character":14},"updated":"2016-02-22 10:45:12.000000000","message":"restarted ?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":133,"context_line":"when it is run. If a Python package containing a custom plugin is installed"},{"line_number":134,"context_line":"within the same environment as Watcher, Watcher will automatically make that"},{"line_number":135,"context_line":"plugin available for use."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"At this point, you can use your new action plugin in your :ref:`strategy plugin"},{"line_number":138,"context_line":"\u003cimplement_strategy_plugin\u003e` if you reference it in your strategy via the use"},{"line_number":139,"context_line":"of the :py:meth:`~watcher.decision_engine.solution.base.Solution.add_action`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_ba5e0574","line":136,"updated":"2016-02-22 10:45:12.000000000","message":"Maybe, Add console commands to illustrate how to install an action plugin?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":135,"context_line":"plugin available for use."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"At this point, you can use your new action plugin in your :ref:`strategy plugin"},{"line_number":138,"context_line":"\u003cimplement_strategy_plugin\u003e` if you reference it in your strategy via the use"},{"line_number":139,"context_line":"of the :py:meth:`~watcher.decision_engine.solution.base.Solution.add_action`"},{"line_number":140,"context_line":"method:"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_7ababdc1","line":138,"range":{"start_line":138,"start_character":49,"end_line":138,"end_character":65},"updated":"2016-02-22 10:45:12.000000000","message":"to remove","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        input_parameters\u003d{})"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"By doing so, your action will be saved within the Watcher Database, ready to be"},{"line_number":151,"context_line":"processed by the planner for creating an action plan which canthen be executed"},{"line_number":152,"context_line":"by the Watcher Applier via its workflow engine."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_da366951","line":151,"range":{"start_line":151,"start_character":59,"end_line":151,"end_character":66},"updated":"2016-02-22 10:45:12.000000000","message":"typo","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"}],"doc/source/dev/plugin/action-plugin.rst":[{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":" - The :py:attr:`~watcher.applier.actions.base.BaseAction.schema` is an"},{"line_number":28,"context_line":"   abstract property that you have to implement. This is the first function to"},{"line_number":29,"context_line":"   be called by the applier before any further processing and its role is to"},{"line_number":30,"context_line":"   validate the input parameters that were provided to it."},{"line_number":31,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.precondition` is"},{"line_number":32,"context_line":"   called before the execution of an action. This is method is a hook that can"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_a547204a","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":27},"updated":"2016-03-02 07:39:07.000000000","message":"Should provide a link to the Watcher Applier description :\nhttps://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-applier","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":" - The :py:attr:`~watcher.applier.actions.base.BaseAction.schema` is an"},{"line_number":28,"context_line":"   abstract property that you have to implement. This is the first function to"},{"line_number":29,"context_line":"   be called by the applier before any further processing and its role is to"},{"line_number":30,"context_line":"   validate the input parameters that were provided to it."},{"line_number":31,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.precondition` is"},{"line_number":32,"context_line":"   called before the execution of an action. This is method is a hook that can"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_36a34551","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":27},"in_reply_to":"7af24918_a547204a","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"   be called by the applier before any further processing and its role is to"},{"line_number":30,"context_line":"   validate the input parameters that were provided to it."},{"line_number":31,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.precondition` is"},{"line_number":32,"context_line":"   called before the execution of an action. This is method is a hook that can"},{"line_number":33,"context_line":"   be used to perform some initializations or to make some more advanced"},{"line_number":34,"context_line":"   validation on its input parameters. If you wish to block the execution based"},{"line_number":35,"context_line":"   on this factor, you simply have to ``raise`` an exception."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_456f3cc5","line":32,"range":{"start_line":32,"start_character":45,"end_line":32,"end_character":59},"updated":"2016-03-02 07:39:07.000000000","message":"this method","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"   be called by the applier before any further processing and its role is to"},{"line_number":30,"context_line":"   validate the input parameters that were provided to it."},{"line_number":31,"context_line":" - The :py:meth:`~watcher.applier.actions.base.BaseAction.precondition` is"},{"line_number":32,"context_line":"   called before the execution of an action. This is method is a hook that can"},{"line_number":33,"context_line":"   be used to perform some initializations or to make some more advanced"},{"line_number":34,"context_line":"   validation on its input parameters. If you wish to block the execution based"},{"line_number":35,"context_line":"   on this factor, you simply have to ``raise`` an exception."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_56b7f185","line":32,"range":{"start_line":32,"start_character":45,"end_line":32,"end_character":59},"in_reply_to":"7af24918_456f3cc5","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        @property"},{"line_number":60,"context_line":"        def schema(self):"},{"line_number":61,"context_line":"            return Schema({})"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        def execute(self):"},{"line_number":64,"context_line":"            # Does nothing"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_c5e86c13","line":61,"range":{"start_line":61,"start_character":25,"end_line":61,"end_character":29},"updated":"2016-03-02 07:39:07.000000000","message":"Shouldn\u0027t we provide an example of schema here, wit one or two parameters ?","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        @property"},{"line_number":60,"context_line":"        def schema(self):"},{"line_number":61,"context_line":"            return Schema({})"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        def execute(self):"},{"line_number":64,"context_line":"            # Does nothing"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_fdf1c06b","line":61,"range":{"start_line":61,"start_character":25,"end_line":61,"end_character":29},"in_reply_to":"7af24918_c5e86c13","updated":"2016-03-02 13:46:53.000000000","message":"I didn\u0027t really want to because it would will be too difficult to maintain. I added a like to the Migrate action so people can have a look at a full-fledged schema if they want to see a proper example.","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        Defines a Schema that the input parameters shall comply to"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :returns: A schema declaring the input parameters this action should be"},{"line_number":102,"context_line":"                  provided along with their respective constraints"},{"line_number":103,"context_line":"        :rtype: :py:class:`voluptuous.Schema` instance"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_6547d81d","line":102,"range":{"start_line":102,"start_character":55,"end_line":102,"end_character":66},"updated":"2016-03-02 07:39:07.000000000","message":"constraints (type, value range, ...)","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        Defines a Schema that the input parameters shall comply to"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :returns: A schema declaring the input parameters this action should be"},{"line_number":102,"context_line":"                  provided along with their respective constraints"},{"line_number":103,"context_line":"        :rtype: :py:class:`voluptuous.Schema` instance"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_c4f1796c","line":102,"range":{"start_line":102,"start_character":55,"end_line":102,"end_character":66},"in_reply_to":"7af24918_6547d81d","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":106,"context_line":"Register a new entry point"},{"line_number":107,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"In order for the Watcher Applier to load your new action, the"},{"line_number":110,"context_line":"action must be registered as a named entry point under the"},{"line_number":111,"context_line":"``watcher_actions`` entry point of your ``setup.py`` file. If you are using"},{"line_number":112,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_e56128aa","line":109,"range":{"start_line":109,"start_character":17,"end_line":109,"end_character":32},"updated":"2016-03-02 07:39:07.000000000","message":"Missing a link to :\nhttps://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-applier","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":106,"context_line":"Register a new entry point"},{"line_number":107,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"In order for the Watcher Applier to load your new action, the"},{"line_number":110,"context_line":"action must be registered as a named entry point under the"},{"line_number":111,"context_line":"``watcher_actions`` entry point of your ``setup.py`` file. If you are using"},{"line_number":112,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_e44ab582","line":109,"range":{"start_line":109,"start_character":17,"end_line":109,"end_character":32},"in_reply_to":"7af24918_e56128aa","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        applies_to\u003d\"\","},{"line_number":145,"context_line":"        input_parameters\u003d{})"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"By doing so, your action will be saved within the Watcher Database, ready to be"},{"line_number":148,"context_line":"processed by the planner for creating an action plan which can then be executed"},{"line_number":149,"context_line":"by the Watcher Applier via its workflow engine."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_65e35806","line":147,"range":{"start_line":147,"start_character":50,"end_line":147,"end_character":66},"updated":"2016-03-02 07:39:07.000000000","message":"Missing a link to https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-database","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        applies_to\u003d\"\","},{"line_number":145,"context_line":"        input_parameters\u003d{})"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"By doing so, your action will be saved within the Watcher Database, ready to be"},{"line_number":148,"context_line":"processed by the planner for creating an action plan which can then be executed"},{"line_number":149,"context_line":"by the Watcher Applier via its workflow engine."},{"line_number":150,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_64034543","line":147,"range":{"start_line":147,"start_character":50,"end_line":147,"end_character":66},"in_reply_to":"7af24918_65e35806","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":152,"context_line":"Scheduling of an action plugin"},{"line_number":153,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"By default, Watcher only provides a basic planner which is only able to process"},{"line_number":156,"context_line":"the actions provided by default in Watcher. Therefore, you will have to use or"},{"line_number":157,"context_line":":ref:`implement another planner implementation \u003cimplement_planner_plugin\u003e`"},{"line_number":158,"context_line":"that will be able to take into account your new action plugin."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_a59ba071","line":155,"range":{"start_line":155,"start_character":42,"end_line":155,"end_character":49},"updated":"2016-03-02 07:39:07.000000000","message":"Missing a link to https://factory.b-com.com/www/watcher/doc/watcher/glossary.html#watcher-planner","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":152,"context_line":"Scheduling of an action plugin"},{"line_number":153,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"By default, Watcher only provides a basic planner which is only able to process"},{"line_number":156,"context_line":"the actions provided by default in Watcher. Therefore, you will have to use or"},{"line_number":157,"context_line":":ref:`implement another planner implementation \u003cimplement_planner_plugin\u003e`"},{"line_number":158,"context_line":"that will be able to take into account your new action plugin."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_a4fd4d3c","line":155,"range":{"start_line":155,"start_character":42,"end_line":155,"end_character":49},"in_reply_to":"7af24918_a59ba071","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"By default, Watcher only provides a basic planner which is only able to process"},{"line_number":156,"context_line":"the actions provided by default in Watcher. Therefore, you will have to use or"},{"line_number":157,"context_line":":ref:`implement another planner implementation \u003cimplement_planner_plugin\u003e`"},{"line_number":158,"context_line":"that will be able to take into account your new action plugin."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_25b4b0cf","line":156,"range":{"start_line":156,"start_character":42,"end_line":156,"end_character":43},"updated":"2016-03-02 07:39:07.000000000","message":"(the scheduling is done according to each action priority)","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"35d6df1fe66ead996b7e02531e6dcbe4bafa47e6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"By default, Watcher only provides a basic planner which is only able to process"},{"line_number":156,"context_line":"the actions provided by default in Watcher. Therefore, you will have to use or"},{"line_number":157,"context_line":":ref:`implement another planner implementation \u003cimplement_planner_plugin\u003e`"},{"line_number":158,"context_line":"that will be able to take into account your new action plugin."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_e592c84a","line":156,"range":{"start_line":156,"start_character":21,"end_line":156,"end_character":31},"updated":"2016-03-02 07:39:07.000000000","message":"nit: \"by default\" is repeated twice.","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"By default, Watcher only provides a basic planner which is only able to process"},{"line_number":156,"context_line":"the actions provided by default in Watcher. Therefore, you will have to use or"},{"line_number":157,"context_line":":ref:`implement another planner implementation \u003cimplement_planner_plugin\u003e`"},{"line_number":158,"context_line":"that will be able to take into account your new action plugin."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_44ac4935","line":156,"range":{"start_line":156,"start_character":42,"end_line":156,"end_character":43},"in_reply_to":"7af24918_25b4b0cf","updated":"2016-03-02 13:46:53.000000000","message":"FYI, I submitted blueprint generic-planner to tackle this issue.","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7f7be5fa4d8c2316a546502b075e88ca8c1ba7f6","unresolved":false,"context_lines":[{"line_number":153,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"By default, Watcher only provides a basic planner which is only able to process"},{"line_number":156,"context_line":"the actions provided by default in Watcher. Therefore, you will have to use or"},{"line_number":157,"context_line":":ref:`implement another planner implementation \u003cimplement_planner_plugin\u003e`"},{"line_number":158,"context_line":"that will be able to take into account your new action plugin."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_84a65151","line":156,"range":{"start_line":156,"start_character":21,"end_line":156,"end_character":31},"in_reply_to":"7af24918_e592c84a","updated":"2016-03-02 13:46:53.000000000","message":"Done","commit_id":"c8ca76d9b0ef8fc1b373f0627b4beb23d45738fd"}],"doc/source/dev/strategy-plugin.rst":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":16,"context_line":"algorithms."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"This section gives some guidelines on how to implement and integrate custom"},{"line_number":19,"context_line":"Stategies with Watcher."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Pre-requisites"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_a34b8086","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":9},"updated":"2016-02-22 10:45:12.000000000","message":"typo","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Pre-requisites"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Before using any strategy, you should make sure you have your Telemetry service"},{"line_number":25,"context_line":"configured so that it would provide you all the metrics you need to be able to"},{"line_number":26,"context_line":"use your strategy."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Creating a new plugin"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_4303940f","line":26,"range":{"start_line":24,"start_character":0,"end_line":26,"end_character":18},"updated":"2016-02-22 10:45:12.000000000","message":"Technically, is it mandatory ? I don\u0027t think so. It\u0027s more a facility offered by Watcher to have access to OpenStack metrics. You can implement a strategy based on randomize() ;)","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":70,"context_line":"Here below is the abstract ``BaseStrategy`` class that every single strategy"},{"line_number":71,"context_line":"should implement:"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":".. automodule:: watcher.decision_engine.strategy.strategies.base"},{"line_number":74,"context_line":"    :noindex:"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":".. autoclass:: BaseStrategy"},{"line_number":77,"context_line":"    :members:"},{"line_number":78,"context_line":"    :noindex:"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Add a new entry point"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_aeea470d","line":78,"range":{"start_line":73,"start_character":0,"end_line":78,"end_character":13},"updated":"2016-02-22 10:45:12.000000000","message":"same remark on the HTML page structure than the one I wrote for https://review.openstack.org/#/c/280803/4/doc/source/dev/planner-plugin.rst@80","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"To get a better understanding on how to implement a more advanced strategy,"},{"line_number":101,"context_line":"have a look at the :py:class:`BasicConsolidation` class."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":".. _pbr: http://docs.openstack.org/developer/pbr/"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_8e3b039c","line":101,"range":{"start_line":101,"start_character":19,"end_line":101,"end_character":49},"updated":"2016-02-22 10:45:12.000000000","message":"Could you add a link?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":164,"context_line":"with this call:"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":".. code-block:: py"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":" cclient \u003d ceilometerclient.client.get_client(VERSION, os_username\u003dUSERNAME,"},{"line_number":169,"context_line":"  os_password\u003dPASSWORD, os_tenant_name\u003dPROJECT_NAME, os_auth_url\u003dAUTH_URL)"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_4e00dbaa","line":167,"updated":"2016-02-22 10:45:12.000000000","message":"add import","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":".. code-block:: py"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":" value_cpu \u003d cclient.samples.list(meter_name\u003d\u0027cpu_util\u0027, limit\u003d10, q\u003dquery)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"Read usage metrics using the Watcher Cluster History Helper"},{"line_number":178,"context_line":"-----------------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_0ecb7373","line":175,"range":{"start_line":175,"start_character":69,"end_line":175,"end_character":74},"updated":"2016-02-22 10:45:12.000000000","message":"what is \u0027query\u0027 ? Could you illustrate it ?\nDo we have a doc about the ceilometer helper methods ?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"cb263e7aefc02f5af6d1df4e37bc6c496f751e83","unresolved":false,"context_lines":[{"line_number":190,"context_line":"The following snippet code shows how to create a Cluster History class:"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":".. code-block:: py"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    query_history  \u003d CeilometerClusterHistory()"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Using that you can now query the values for that specific metric:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bae84128_ced50bba","line":193,"updated":"2016-02-22 10:45:12.000000000","message":"add required import","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"}],"watcher/applier/actions/base.py":[{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"ba33c3e4b388e92e19f9b8d4788f7b9bbd02a6a9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \"\"\"Executes the main logic of the action"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        This method can be used to perform an action on a given set of input"},{"line_number":64,"context_line":"        parameters to accomplish some type of operation. This operation may a"},{"line_number":65,"context_line":"        boolean value as a result of its execution to triggeer later reverting."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :returns: A flag indicating whether or not the action succeeded"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_fb96cc4a","line":64,"range":{"start_line":64,"start_character":72,"end_line":64,"end_character":77},"updated":"2016-02-22 11:23:33.000000000","message":"may return a boolean value ?","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"ba33c3e4b388e92e19f9b8d4788f7b9bbd02a6a9","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        This method can be used to perform an action on a given set of input"},{"line_number":64,"context_line":"        parameters to accomplish some type of operation. This operation may a"},{"line_number":65,"context_line":"        boolean value as a result of its execution to triggeer later reverting."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :returns: A flag indicating whether or not the action succeeded"},{"line_number":68,"context_line":"        :rtype: bool"}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_7b891c26","line":65,"range":{"start_line":65,"start_character":54,"end_line":65,"end_character":62},"updated":"2016-02-22 11:23:33.000000000","message":"typo","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"ba33c3e4b388e92e19f9b8d4788f7b9bbd02a6a9","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\"Revert this action"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        This method should undo any side-effects caused by previous execution"},{"line_number":77,"context_line":"        of the action if the latter raised an exception."},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        raise NotImplementedError()"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bae84128_fbcb6c51","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":56},"updated":"2016-02-22 11:23:33.000000000","message":"maybe something missing here? I\u0027m not sure","commit_id":"d98ed6236a4afd1df4f1bce1d779abdf8dd81d99"}]}
