)]}'
{"doc/source/dev/planner-plugin.rst":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Watcher Decision Engine has an external :ref:`planner \u003cplanner_definition\u003e`"},{"line_number":14,"context_line":"plugin interface which gives anyone the ability to integrate an external"},{"line_number":15,"context_line":":ref:`planner \u003cplanner_definition\u003e` in order to extend the initial set of"},{"line_number":16,"context_line":"planners Watcher provides."},{"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":"planners with Watcher."}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_5c5c6025","line":16,"range":{"start_line":15,"start_character":59,"end_line":16,"end_character":8},"updated":"2016-02-19 16:21:54.000000000","message":"Vincent, how to get the list of planners provided by Watcher ?","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Watcher Decision Engine has an external :ref:`planner \u003cplanner_definition\u003e`"},{"line_number":14,"context_line":"plugin interface which gives anyone the ability to integrate an external"},{"line_number":15,"context_line":":ref:`planner \u003cplanner_definition\u003e` in order to extend the initial set of"},{"line_number":16,"context_line":"planners Watcher provides."},{"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":"planners with Watcher."}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_0f4d2a3e","line":16,"range":{"start_line":15,"start_character":59,"end_line":16,"end_character":8},"in_reply_to":"bae84128_5c5c6025","updated":"2016-02-22 13:48:20.000000000","message":"Will add a reference to the available plugins section (see https://review.openstack.org/#/c/279084/) whenever either gets merged.","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"First of all you have to extend the base"},{"line_number":26,"context_line":":py:class:`~.BasePlanner` class which defines a an abstract method that you"},{"line_number":27,"context_line":"will have to implement:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":" - The :py:meth:`~.BasePlanner.schedule` is the method being called by the"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_eff138cf","line":26,"range":{"start_line":26,"start_character":46,"end_line":26,"end_character":50},"updated":"2016-02-19 16:21:54.000000000","message":"typo","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"First of all you have to extend the base"},{"line_number":26,"context_line":":py:class:`~.BasePlanner` class which defines a an abstract method that you"},{"line_number":27,"context_line":"will have to implement:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":" - The :py:meth:`~.BasePlanner.schedule` is the method being called by the"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_af2a3e2a","line":26,"range":{"start_line":26,"start_character":46,"end_line":26,"end_character":50},"in_reply_to":"bae84128_eff138cf","updated":"2016-02-22 13:48:20.000000000","message":"Done","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":26,"context_line":":py:class:`~.BasePlanner` class which defines a an abstract method that you"},{"line_number":27,"context_line":"will have to implement:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":" - The :py:meth:`~.BasePlanner.schedule` is the method being called by the"},{"line_number":30,"context_line":"   Decision Engine to schedule a given solution (:py:class:`~.BaseSolution`)"},{"line_number":31,"context_line":"   into an action plan."},{"line_number":32,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_3c051cc2","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":3},"updated":"2016-02-19 16:21:54.000000000","message":"Why a bullet here ? this no other items below :)","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":26,"context_line":":py:class:`~.BasePlanner` class which defines a an abstract method that you"},{"line_number":27,"context_line":"will have to implement:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":" - The :py:meth:`~.BasePlanner.schedule` is the method being called by the"},{"line_number":30,"context_line":"   Decision Engine to schedule a given solution (:py:class:`~.BaseSolution`)"},{"line_number":31,"context_line":"   into an action plan."},{"line_number":32,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_0f224a52","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":3},"in_reply_to":"bae84128_3c051cc2","updated":"2016-02-22 13:48:20.000000000","message":"Done","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":27,"context_line":"will have to implement:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":" - The :py:meth:`~.BasePlanner.schedule` is the method being called by the"},{"line_number":30,"context_line":"   Decision Engine to schedule a given solution (:py:class:`~.BaseSolution`)"},{"line_number":31,"context_line":"   into an action plan."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Here is an example showing how you can write a plugin called ``DummyPlanner``:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_af7730d3","line":30,"range":{"start_line":30,"start_character":22,"end_line":30,"end_character":30},"updated":"2016-02-19 16:21:54.000000000","message":"schedule() method .... schedules. ok :) Maybe explain differently what means \"schedule\" in this context ?","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":27,"context_line":"will have to implement:"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":" - The :py:meth:`~.BasePlanner.schedule` is the method being called by the"},{"line_number":30,"context_line":"   Decision Engine to schedule a given solution (:py:class:`~.BaseSolution`)"},{"line_number":31,"context_line":"   into an action plan."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Here is an example showing how you can write a plugin called ``DummyPlanner``:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_0fcc0a69","line":30,"range":{"start_line":30,"start_character":22,"end_line":30,"end_character":30},"in_reply_to":"bae84128_af7730d3","updated":"2016-02-22 13:48:20.000000000","message":"Done","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            new_action_plan.save()"},{"line_number":56,"context_line":"            return new_action_plan"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        def schedule(self, context, audit_id, solution):"},{"line_number":59,"context_line":"            # Empty action plan"},{"line_number":60,"context_line":"            action_plan \u003d self._create_action_plan(context, audit_id)"},{"line_number":61,"context_line":"            # todo: You need to create the workflow of actions here"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_8d107450","line":58,"range":{"start_line":58,"start_character":46,"end_line":58,"end_character":54},"updated":"2016-02-19 16:21:54.000000000","message":"The link between solution, actions and action plan is not clear we you just read the source code.","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            new_action_plan.save()"},{"line_number":56,"context_line":"            return new_action_plan"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        def schedule(self, context, audit_id, solution):"},{"line_number":59,"context_line":"            # Empty action plan"},{"line_number":60,"context_line":"            action_plan \u003d self._create_action_plan(context, audit_id)"},{"line_number":61,"context_line":"            # todo: You need to create the workflow of actions here"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_af5ebe73","line":58,"range":{"start_line":58,"start_character":46,"end_line":58,"end_character":54},"in_reply_to":"bae84128_8d107450","updated":"2016-02-22 13:48:20.000000000","message":"I added a link to the glossary in the paragraph before this code snippet to highlight this.","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":69,"context_line":"Abstract Plugin Class"},{"line_number":70,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Here below is the abstract ``BasePlanner`` class that every single planner"},{"line_number":73,"context_line":"should implement:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. automodule:: watcher.decision_engine.planner.base"},{"line_number":76,"context_line":"    :noindex:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":".. autoclass:: BasePlanner"},{"line_number":79,"context_line":"    :members:"},{"line_number":80,"context_line":"    :noindex:"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"Register a new entry point"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_b2b0338d","line":80,"range":{"start_line":72,"start_character":0,"end_line":80,"end_character":13},"updated":"2016-02-19 16:21:54.000000000","message":"IMHO, this structure of this page is not good. We should have as introduction, the definition of an action plan. Is it done only by \u0027automodule:: watcher.decision_engine.planner.base\u0027 cross references ?","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":69,"context_line":"Abstract Plugin Class"},{"line_number":70,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Here below is the abstract ``BasePlanner`` class that every single planner"},{"line_number":73,"context_line":"should implement:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. automodule:: watcher.decision_engine.planner.base"},{"line_number":76,"context_line":"    :noindex:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":".. autoclass:: BasePlanner"},{"line_number":79,"context_line":"    :members:"},{"line_number":80,"context_line":"    :noindex:"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"Register a new entry point"}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_056a29b3","line":80,"range":{"start_line":72,"start_character":0,"end_line":80,"end_character":13},"in_reply_to":"bae84128_b2b0338d","updated":"2016-02-22 13:48:20.000000000","message":"I removed the Watcher planner definition from here but added back a link where I first mention \"action plan\" which points at the glossary definition of an action plan.","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":84,"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":85,"context_line":""},{"line_number":86,"context_line":"In order for the Watcher Decision Engine to load your new planner, the"},{"line_number":87,"context_line":"planner must be registered as a named entry point under the"},{"line_number":88,"context_line":"``watcher_planners`` entry point of your ``setup.py`` file. If you are using"},{"line_number":89,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_727ceb72","line":87,"range":{"start_line":87,"start_character":32,"end_line":87,"end_character":37},"updated":"2016-02-19 16:21:54.000000000","message":"s/named/new","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":83,"context_line":"Register a new entry point"},{"line_number":84,"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":85,"context_line":""},{"line_number":86,"context_line":"In order for the Watcher Decision Engine to load your new planner, the"},{"line_number":87,"context_line":"planner must be registered as a named entry point under the"},{"line_number":88,"context_line":"``watcher_planners`` entry point of your ``setup.py`` file. If you are using"},{"line_number":89,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_f24bdb57","line":87,"range":{"start_line":86,"start_character":67,"end_line":87,"end_character":7},"updated":"2016-02-19 16:21:54.000000000","message":"this one","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":83,"context_line":"Register a new entry point"},{"line_number":84,"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":85,"context_line":""},{"line_number":86,"context_line":"In order for the Watcher Decision Engine to load your new planner, the"},{"line_number":87,"context_line":"planner must be registered as a named entry point under the"},{"line_number":88,"context_line":"``watcher_planners`` entry point of your ``setup.py`` file. If you are using"},{"line_number":89,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_a5a9bde1","line":87,"range":{"start_line":86,"start_character":67,"end_line":87,"end_character":7},"in_reply_to":"bae84128_f24bdb57","updated":"2016-02-22 13:48:20.000000000","message":"Done","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"In order for the Watcher Decision Engine to load your new planner, the"},{"line_number":87,"context_line":"planner must be registered as a named entry point under the"},{"line_number":88,"context_line":"``watcher_planners`` entry point of your ``setup.py`` file. If you are using"},{"line_number":89,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"The name you give to your entry point has to be unique."}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_329b83cb","line":88,"range":{"start_line":88,"start_character":21,"end_line":88,"end_character":32},"updated":"2016-02-19 16:21:54.000000000","message":"entry points list","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"In order for the Watcher Decision Engine to load your new planner, the"},{"line_number":87,"context_line":"planner must be registered as a named entry point under the"},{"line_number":88,"context_line":"``watcher_planners`` entry point of your ``setup.py`` file. If you are using"},{"line_number":89,"context_line":"pbr_, this entry point should be placed in your ``setup.cfg`` file."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"The name you give to your entry point has to be unique."}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_25e48d39","line":88,"range":{"start_line":88,"start_character":21,"end_line":88,"end_character":32},"in_reply_to":"bae84128_329b83cb","updated":"2016-02-22 13:48:20.000000000","message":"I called it \"entry point namespace\"","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":105,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"The Watcher Decision Engine service will automatically discover any installed"},{"line_number":108,"context_line":"plugins when it is run. If a Python package containing a custom plugin is"},{"line_number":109,"context_line":"installed within the same environment as Watcher, Watcher will automatically"},{"line_number":110,"context_line":"make that plugin available for use."},{"line_number":111,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_9286cfb7","line":108,"range":{"start_line":108,"start_character":19,"end_line":108,"end_character":22},"updated":"2016-02-19 16:21:54.000000000","message":"Do we need to restart the Watcher ? I think so.","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":105,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"The Watcher Decision Engine service will automatically discover any installed"},{"line_number":108,"context_line":"plugins when it is run. If a Python package containing a custom plugin is"},{"line_number":109,"context_line":"installed within the same environment as Watcher, Watcher will automatically"},{"line_number":110,"context_line":"make that plugin available for use."},{"line_number":111,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_850639cc","line":108,"range":{"start_line":108,"start_character":19,"end_line":108,"end_character":22},"in_reply_to":"bae84128_9286cfb7","updated":"2016-02-22 13:48:20.000000000","message":"Done","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"19ba992d4560fca1d26e001f2193eccc424e65ee","unresolved":false,"context_lines":[{"line_number":109,"context_line":"installed within the same environment as Watcher, Watcher will automatically"},{"line_number":110,"context_line":"make that plugin available for use."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"At this point, the way Watcher will use your new planner if you reference it"},{"line_number":113,"context_line":"in the ``planner`` option under the ``[watcher_planner]`` section of your"},{"line_number":114,"context_line":"``watcher.conf`` configuration file. For example, if you want to use a"},{"line_number":115,"context_line":"``dummy`` planner you just installed, you would have to associate it to a goal"},{"line_number":116,"context_line":"like this:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":".. code-block:: ini"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_d2e2179f","line":116,"range":{"start_line":112,"start_character":0,"end_line":116,"end_character":10},"updated":"2016-02-19 16:21:54.000000000","message":"IMHO, talk about a static association between a goal to retrieve and the way to orchestrate a solution\u0027s actions by selecting the action plan engine","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"4ebe640edac53f4f95af13623ab4ece27d247516","unresolved":false,"context_lines":[{"line_number":109,"context_line":"installed within the same environment as Watcher, Watcher will automatically"},{"line_number":110,"context_line":"make that plugin available for use."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"At this point, the way Watcher will use your new planner if you reference it"},{"line_number":113,"context_line":"in the ``planner`` option under the ``[watcher_planner]`` section of your"},{"line_number":114,"context_line":"``watcher.conf`` configuration file. For example, if you want to use a"},{"line_number":115,"context_line":"``dummy`` planner you just installed, you would have to associate it to a goal"},{"line_number":116,"context_line":"like this:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":".. code-block:: ini"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"bae84128_c59a0163","line":116,"range":{"start_line":112,"start_character":0,"end_line":116,"end_character":10},"in_reply_to":"bae84128_d2e2179f","updated":"2016-02-22 13:48:20.000000000","message":"Not sure what you mean here. There is not direct link between a planner and a goal. As of now, a single planner is used to plan all the goals/strategies we use to make audits and should hence be generic.\nBesides, there is also no relationship between a planner/goal and a workflow engine.","commit_id":"67850bb87cb9b06b711bc59c458e6888267271e4"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":31,"context_line":"set of actions contained in the proposed solution (for more details, see"},{"line_number":32,"context_line":":ref:`definition of a solution \u003csolution_definition\u003e`)."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Here is an example showing how you can write a plugin called ``DummyPlanner``:"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":".. code-block:: python"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_50a6dc10","line":34,"range":{"start_line":34,"start_character":45,"end_line":34,"end_character":53},"updated":"2016-03-02 08:01:15.000000000","message":"a planner plugin","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":31,"context_line":"set of actions contained in the proposed solution (for more details, see"},{"line_number":32,"context_line":":ref:`definition of a solution \u003csolution_definition\u003e`)."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Here is an example showing how you can write a plugin called ``DummyPlanner``:"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":".. code-block:: python"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_7f5e3213","line":34,"range":{"start_line":34,"start_character":45,"end_line":34,"end_character":53},"in_reply_to":"7af24918_50a6dc10","updated":"2016-03-02 16:07:58.000000000","message":"Done","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":66,"context_line":"This implementation is the most basic one. So if you want to have more advanced"},{"line_number":67,"context_line":"examples, have a look at the implementation of planners already provided by"},{"line_number":68,"context_line":"Watcher like :py:class:`~.BasePlanner`."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Abstract Plugin Class"},{"line_number":71,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_7078382c","line":69,"updated":"2016-03-02 08:01:15.000000000","message":"Maybe we should add here a description of the way the default implementation schedules the actions ?\nSaying that it uses a very simple rule depending on action priorities","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":66,"context_line":"This implementation is the most basic one. So if you want to have more advanced"},{"line_number":67,"context_line":"examples, have a look at the implementation of planners already provided by"},{"line_number":68,"context_line":"Watcher like :py:class:`~.BasePlanner`."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Abstract Plugin Class"},{"line_number":71,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_549070ec","line":69,"in_reply_to":"7af24918_7078382c","updated":"2016-03-02 16:07:58.000000000","message":"I added a link to the default planner implementation.","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Using planner plugins"},{"line_number":103,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"The Watcher Decision Engine service will automatically discover any installed"},{"line_number":106,"context_line":"plugins when it is started. This means that if Watcher is already running when"},{"line_number":107,"context_line":"you install your plugin, you will have to restart the related  Watcher"},{"line_number":108,"context_line":"services. If a Python package containing a custom plugin is installed within"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_d004acc1","line":105,"range":{"start_line":105,"start_character":4,"end_line":105,"end_character":27},"updated":"2016-03-02 08:01:15.000000000","message":"Should provide a link to https://factory.b-com.com/www/watcher/doc/watcher/architecture.html#watcher-decision-engine","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Using planner plugins"},{"line_number":103,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"The Watcher Decision Engine service will automatically discover any installed"},{"line_number":106,"context_line":"plugins when it is started. This means that if Watcher is already running when"},{"line_number":107,"context_line":"you install your plugin, you will have to restart the related  Watcher"},{"line_number":108,"context_line":"services. If a Python package containing a custom plugin is installed within"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_49bbb90e","line":105,"range":{"start_line":105,"start_character":4,"end_line":105,"end_character":27},"in_reply_to":"7af24918_d004acc1","updated":"2016-03-02 16:07:58.000000000","message":"Done","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"The Watcher Decision Engine service will automatically discover any installed"},{"line_number":106,"context_line":"plugins when it is started. This means that if Watcher is already running when"},{"line_number":107,"context_line":"you install your plugin, you will have to restart the related  Watcher"},{"line_number":108,"context_line":"services. If a Python package containing a custom plugin is installed within"},{"line_number":109,"context_line":"the same environment as Watcher, Watcher will automatically make that plugin"},{"line_number":110,"context_line":"available for use."}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_701cb813","line":107,"range":{"start_line":107,"start_character":61,"end_line":107,"end_character":63},"updated":"2016-03-02 08:01:15.000000000","message":"nit : 2 spaces here","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"The Watcher Decision Engine service will automatically discover any installed"},{"line_number":106,"context_line":"plugins when it is started. This means that if Watcher is already running when"},{"line_number":107,"context_line":"you install your plugin, you will have to restart the related  Watcher"},{"line_number":108,"context_line":"services. If a Python package containing a custom plugin is installed within"},{"line_number":109,"context_line":"the same environment as Watcher, Watcher will automatically make that plugin"},{"line_number":110,"context_line":"available for use."}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_8962e1ab","line":107,"range":{"start_line":107,"start_character":61,"end_line":107,"end_character":63},"in_reply_to":"7af24918_701cb813","updated":"2016-03-02 16:07:58.000000000","message":"Done","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":112,"context_line":"At this point, Watcher will use your new planner if you referenced it in the"},{"line_number":113,"context_line":"``planner`` option under the ``[watcher_planner]`` section of your"},{"line_number":114,"context_line":"``watcher.conf`` configuration file when you started it. For example, if you"},{"line_number":115,"context_line":"want to use the ``dummy`` planner you just installed, you would have to"},{"line_number":116,"context_line":"associate it to a goal like this:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":".. code-block:: ini"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_d0f2ecd1","line":116,"range":{"start_line":115,"start_character":55,"end_line":116,"end_character":32},"updated":"2016-03-02 08:01:15.000000000","message":"I don\u0027t understand why the planner should be associated to a goal.","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":112,"context_line":"At this point, Watcher will use your new planner if you referenced it in the"},{"line_number":113,"context_line":"``planner`` option under the ``[watcher_planner]`` section of your"},{"line_number":114,"context_line":"``watcher.conf`` configuration file when you started it. For example, if you"},{"line_number":115,"context_line":"want to use the ``dummy`` planner you just installed, you would have to"},{"line_number":116,"context_line":"associate it to a goal like this:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":".. code-block:: ini"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7af24918_544b50b0","line":116,"range":{"start_line":115,"start_character":55,"end_line":116,"end_character":32},"in_reply_to":"7af24918_d0f2ecd1","updated":"2016-03-02 16:07:58.000000000","message":"It was actually a remnant from a copy and pasty. So I actually partially rewrote this section with some more details.","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":12361,"name":"Patrick Lechat","email":"patrick.lechat@b-com.com"},"change_message_id":"7cc5a1b6baed524932dbf4a5b109842163937c0f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    from watcher.decision_engine.planner import base"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    class DummyPlanner(baseBasePlanner):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        def _create_action_plan(self, context, audit_id):"},{"line_number":48,"context_line":"            action_plan_dict \u003d {"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7af24918_7ec6e268","line":45,"range":{"start_line":45,"start_character":23,"end_line":45,"end_character":38},"updated":"2016-03-03 14:08:30.000000000","message":"Missing a dot \u003d\u003e base.BasePlanner","commit_id":"fb76cb3b2d3c1dac2b0ab9b96fc0bbe3ffe2c41b"}],"watcher/decision_engine/planner/base.py":[{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def schedule(self, context, audit_uuid, solution):"},{"line_number":51,"context_line":"        \"\"\"The  planner receives a solution to schedule"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param solution: the solution given by the strategy to"},{"line_number":54,"context_line":"        :param audit_uuid: the audit uuid"},{"line_number":55,"context_line":"        :return: Action plan with an ordered sequence of change requests such"},{"line_number":56,"context_line":"                 that all security, dependency, and performance requirements"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_104e146f","line":53,"range":{"start_line":53,"start_character":25,"end_line":53,"end_character":62},"updated":"2016-03-02 08:01:15.000000000","message":"something is missing in this sentence","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def schedule(self, context, audit_uuid, solution):"},{"line_number":51,"context_line":"        \"\"\"The  planner receives a solution to schedule"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param solution: the solution given by the strategy to"},{"line_number":54,"context_line":"        :param audit_uuid: the audit uuid"},{"line_number":55,"context_line":"        :return: Action plan with an ordered sequence of change requests such"},{"line_number":56,"context_line":"                 that all security, dependency, and performance requirements"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_efe8c5b6","line":53,"range":{"start_line":53,"start_character":25,"end_line":53,"end_character":62},"in_reply_to":"7af24918_104e146f","updated":"2016-03-02 16:07:58.000000000","message":"Done","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":19214,"name":"Vincent Mahe","email":"vincent.mahe@b-com.com","username":"vmahe35"},"change_message_id":"9f33aab741b22f5451951999a65f5bdb386a4c36","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param solution: the solution given by the strategy to"},{"line_number":54,"context_line":"        :param audit_uuid: the audit uuid"},{"line_number":55,"context_line":"        :return: Action plan with an ordered sequence of change requests such"},{"line_number":56,"context_line":"                 that all security, dependency, and performance requirements"},{"line_number":57,"context_line":"                 are met."},{"line_number":58,"context_line":"        :rtype: :py:class:`watcher.objects.action_plan.ActionPlan` instance"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_305b5030","line":55,"range":{"start_line":55,"start_character":57,"end_line":55,"end_character":72},"updated":"2016-03-02 08:01:15.000000000","message":"is it \"change requests\" or what we call \"actions\" in Watcher","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"52b646629c6c2e94fa419ee2c793e0fe664d1e71","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        :param solution: the solution given by the strategy to"},{"line_number":54,"context_line":"        :param audit_uuid: the audit uuid"},{"line_number":55,"context_line":"        :return: Action plan with an ordered sequence of change requests such"},{"line_number":56,"context_line":"                 that all security, dependency, and performance requirements"},{"line_number":57,"context_line":"                 are met."},{"line_number":58,"context_line":"        :rtype: :py:class:`watcher.objects.action_plan.ActionPlan` instance"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_0f48912c","line":55,"range":{"start_line":55,"start_character":57,"end_line":55,"end_character":72},"in_reply_to":"7af24918_305b5030","updated":"2016-03-02 16:07:58.000000000","message":"good catch. Thanks","commit_id":"8e7facfe34a0b7981889da719f78eab21d28ca3d"}]}
