)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"c385694883f57950e2f7e2e6ca661b0c1be0af7d","unresolved":false,"context_lines":[{"line_number":19,"context_line":"default set of planner algorithms currently available in Watcher"},{"line_number":20,"context_line":"using Stevedore."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"The doc need to explain how create a new planner."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"DocImpact"},{"line_number":25,"context_line":"Partially implements: blueprint watcher-add-actions-via-conf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da6ed579_26170fa5","line":22,"updated":"2016-01-12 05:26:44.000000000","message":"Is this a TODO or do you plan to add it to this changeset?","commit_id":"29fd43a146a61850ed9086b5e32054956f8a0f8f"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"ef2d27601b086793a4483fdd54304edc746bec8e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"default set of planner algorithms currently available in Watcher"},{"line_number":20,"context_line":"using Stevedore."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"The doc need to explain how create a new planner."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"DocImpact"},{"line_number":25,"context_line":"Partially implements: blueprint watcher-add-actions-via-conf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da6ed579_e3931ba2","line":22,"in_reply_to":"da6ed579_26170fa5","updated":"2016-01-12 10:53:24.000000000","message":"When we add DocImpact the jeepyb create a bug in launchpad. This often difficult to remember what is the part of the documentation we have to update. This comment can help.","commit_id":"29fd43a146a61850ed9086b5e32054956f8a0f8f"}],"etc/watcher/watcher.conf.sample":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"c385694883f57950e2f7e2e6ca661b0c1be0af7d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"da6ed579_abb3c809","updated":"2016-01-12 05:26:44.000000000","message":"These changes seem irrelevant to the commit message?","commit_id":"29fd43a146a61850ed9086b5e32054956f8a0f8f"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"ef2d27601b086793a4483fdd54304edc746bec8e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"da6ed579_4388e722","in_reply_to":"da6ed579_abb3c809","updated":"2016-01-12 10:53:24.000000000","message":"As a reminder the commit message is : \"Add a dynamic loading of the Watcher Planner implementation\"\n\nIf you take a look to this file which is part of this patchset (https://review.openstack.org/#/c/264840/16/watcher/decision_engine/planner/manager.py) \n\nWe added some parameters in the configuration file.\n\nThis is why we need to regenerate the configuration file.","commit_id":"29fd43a146a61850ed9086b5e32054956f8a0f8f"}],"setup.cfg":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"035ecbe1bc63055add6d0051dd72ee57303a88f2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    outlet_temp_control \u003d watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"watcher_planners \u003d"},{"line_number":50,"context_line":"\tdefault_V1  \u003d watcher.decision_engine.planner.default:DefaultPlanner"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"[build_sphinx]"},{"line_number":53,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":10,"id":"fa69d971_3ffed438","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":1},"updated":"2016-01-11 08:31:49.000000000","message":"nit: you are using a tab here (use 4 spaces instead)","commit_id":"f4e41f5c5a60b3b62c6255c78170673c3a6e01a3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"1c1b1c246268af0b446bcbe3f9a009e42b79c6d4","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    outlet_temp_control \u003d watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"watcher_planners \u003d"},{"line_number":50,"context_line":"\tdefault_V1  \u003d watcher.decision_engine.planner.default:DefaultPlanner"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"[build_sphinx]"},{"line_number":53,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":10,"id":"fa69d971_4356235d","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":1},"in_reply_to":"fa69d971_3ffed438","updated":"2016-01-11 10:26:22.000000000","message":"Done","commit_id":"f4e41f5c5a60b3b62c6255c78170673c3a6e01a3"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    outlet_temp_control \u003d watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"watcher_planners \u003d"},{"line_number":50,"context_line":"    default_V1  \u003d watcher.decision_engine.planner.default:DefaultPlanner"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"[build_sphinx]"},{"line_number":53,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":13,"id":"fa69d971_e0605f37","line":50,"updated":"2016-01-11 14:05:09.000000000","message":"IMHO, version should take place in classpath (like API classes), i.e:\n\ndefault \u003d watcher.decision_engine.planner.v1.default:DefaultPlanner","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    outlet_temp_control \u003d watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"watcher_planners \u003d"},{"line_number":50,"context_line":"    default_V1  \u003d watcher.decision_engine.planner.default:DefaultPlanner"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"[build_sphinx]"},{"line_number":53,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":13,"id":"fa69d971_6718fed3","line":50,"in_reply_to":"fa69d971_e0605f37","updated":"2016-01-11 15:46:05.000000000","message":"We can create a directory to store the versionned actions but we will need a easy way to build the entry_point","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"c385694883f57950e2f7e2e6ca661b0c1be0af7d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    outlet_temp_control \u003d watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"watcher_planners \u003d"},{"line_number":50,"context_line":"    default_V1  \u003d watcher.decision_engine.planner.default:DefaultPlanner"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"[build_sphinx]"},{"line_number":53,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":16,"id":"da6ed579_2b76f83e","line":50,"updated":"2016-01-12 05:26:44.000000000","message":"I agree with what David mentioned earlier.  This seems odd to add a version onto the end of default.  Would we end up having:\n\nwatcher_planners \u003d\n  default_V1 \u003d ...\n  default_V2 \u003d ...\n  default_V3 \u003d ...\n\nWhich one is the \"default\"?","commit_id":"29fd43a146a61850ed9086b5e32054956f8a0f8f"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"ef2d27601b086793a4483fdd54304edc746bec8e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    outlet_temp_control \u003d watcher.decision_engine.strategy.strategies.outlet_temp_control:OutletTempControl"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"watcher_planners \u003d"},{"line_number":50,"context_line":"    default_V1  \u003d watcher.decision_engine.planner.default:DefaultPlanner"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"[build_sphinx]"},{"line_number":53,"context_line":"source-dir \u003d doc/source"}],"source_content_type":"text/x-ttcn-cfg","patch_set":16,"id":"da6ed579_63172ba4","line":50,"in_reply_to":"da6ed579_2b76f83e","updated":"2016-01-12 10:53:24.000000000","message":"The name \u0027default\u0027 is not very well chosen. I plan to rename it in another patchset to \u0027basic\u0027.\n\nwatcher_planners \u003d\n  basic_V1 \u003d ...\n  basic_V2 \u003d ...\n  basic_V3 \u003d ...\n\nWhich one is the \"default\"? \n\nI think like for the strategies, we want to be able to choose an implementation of the planner with the python-watcherclient. But this not the topic of this blueprint.\n\nThis is why we can choose the default in the configuration file : https://review.openstack.org/#/c/264840/16/watcher/decision_engine/planner/manager.py\n[watcher_planner]\n\n#\n# From watcher\n#\n\n# The selected version of the planner (integer value)\n#version \u003d 1\n\n# The selected planner used to schedule the actions (string value)\n#planner \u003d basic","commit_id":"29fd43a146a61850ed9086b5e32054956f8a0f8f"}],"watcher/decision_engine/audit/default.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def planner(self):"},{"line_number":41,"context_line":"        return self._planner_manager.load()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @property"},{"line_number":44,"context_line":"    def messaging(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_d331770c","line":41,"range":{"start_line":41,"start_character":15,"end_line":41,"end_character":43},"updated":"2016-01-11 14:05:09.000000000","message":"IMHO, it\u0027s bizarre to define this property like this. If we invoke twice self.planner attribute, is the driver loaded twice ? What happens on \"print self.planner\" ?\n\nMoreover load() method can raise an exception. How to handle it in a @property ?","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def planner(self):"},{"line_number":41,"context_line":"        return self._planner_manager.load()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @property"},{"line_number":44,"context_line":"    def messaging(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_e75cee4c","line":41,"range":{"start_line":41,"start_character":15,"end_line":41,"end_character":43},"in_reply_to":"fa69d971_d331770c","updated":"2016-01-11 15:46:05.000000000","message":"Done","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"}],"watcher/decision_engine/planner/default.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"import json"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from enum import Enum"},{"line_number":22,"context_line":"from oslo_log import log"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from watcher._i18n import _LW"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_3d3a9e37","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":21},"updated":"2016-01-12 15:52:11.000000000","message":"nit: can you import the enum module directly?","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"98bb8008c8ad0de31e498103cf8798ef1ea4b4f9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"import json"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from enum import Enum"},{"line_number":22,"context_line":"from oslo_log import log"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from watcher._i18n import _LW"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_164778bc","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":21},"in_reply_to":"da6ed579_3d3a9e37","updated":"2016-01-12 17:21:04.000000000","message":"Done","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"}],"watcher/decision_engine/planner/manager.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"WATCHER_PLANNER_OPTS \u003d {"},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027planner\u0027,"},{"line_number":31,"context_line":"               default\u003ddefault_planner,"},{"line_number":32,"context_line":"               required\u003dTrue,"},{"line_number":33,"context_line":"               help\u003d\u0027The selected planner used to schedule the actions\u0027),"},{"line_number":34,"context_line":"    cfg.IntOpt(\u0027version\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_56c5758b","line":31,"range":{"start_line":31,"start_character":23,"end_line":31,"end_character":38},"updated":"2016-01-11 14:05:09.000000000","message":"it is the one set into setup.cfg ? if yes, please sync the name with the one set into setup.cfg.","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"WATCHER_PLANNER_OPTS \u003d {"},{"line_number":30,"context_line":"    cfg.StrOpt(\u0027planner\u0027,"},{"line_number":31,"context_line":"               default\u003ddefault_planner,"},{"line_number":32,"context_line":"               required\u003dTrue,"},{"line_number":33,"context_line":"               help\u003d\u0027The selected planner used to schedule the actions\u0027),"},{"line_number":34,"context_line":"    cfg.IntOpt(\u0027version\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_a729169d","line":31,"range":{"start_line":31,"start_character":23,"end_line":31,"end_character":38},"in_reply_to":"fa69d971_56c5758b","updated":"2016-01-11 15:46:05.000000000","message":"ditto","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":31,"context_line":"               default\u003ddefault_planner,"},{"line_number":32,"context_line":"               required\u003dTrue,"},{"line_number":33,"context_line":"               help\u003d\u0027The selected planner used to schedule the actions\u0027),"},{"line_number":34,"context_line":"    cfg.IntOpt(\u0027version\u0027,"},{"line_number":35,"context_line":"               default\u003d1,"},{"line_number":36,"context_line":"               help\u003d\u0027The selected version of the planner\u0027,"},{"line_number":37,"context_line":"               ),"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":"planner_opt_group \u003d cfg.OptGroup(name\u003d\u0027watcher_planner\u0027,"},{"line_number":40,"context_line":"                                 title\u003d\u0027Defines the parameters of \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_76c2f986","line":37,"range":{"start_line":34,"start_character":0,"end_line":37,"end_character":17},"updated":"2016-01-11 14:05:09.000000000","message":"not sure version should be configurable here. It should be set into setup.cfg planner classpath","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":31,"context_line":"               default\u003ddefault_planner,"},{"line_number":32,"context_line":"               required\u003dTrue,"},{"line_number":33,"context_line":"               help\u003d\u0027The selected planner used to schedule the actions\u0027),"},{"line_number":34,"context_line":"    cfg.IntOpt(\u0027version\u0027,"},{"line_number":35,"context_line":"               default\u003d1,"},{"line_number":36,"context_line":"               help\u003d\u0027The selected version of the planner\u0027,"},{"line_number":37,"context_line":"               ),"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":"planner_opt_group \u003d cfg.OptGroup(name\u003d\u0027watcher_planner\u0027,"},{"line_number":40,"context_line":"                                 title\u003d\u0027Defines the parameters of \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_4ad14156","line":37,"range":{"start_line":34,"start_character":0,"end_line":37,"end_character":17},"in_reply_to":"fa69d971_76c2f986","updated":"2016-01-11 15:46:05.000000000","message":"I think like for the strategies, we want to be able to choose an implementation of the planner with the python-watcherclient.\nFor me this not the topic of this blueprint.","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_log import log"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from watcher.decision_engine.planner.loading.default import \\"},{"line_number":22,"context_line":"    DefaultPlannerLoader"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_5dff5201","line":21,"range":{"start_line":21,"start_character":45,"end_line":21,"end_character":52},"updated":"2016-01-12 15:52:11.000000000","message":"nit: Can you import the module and not the class here ?","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"98bb8008c8ad0de31e498103cf8798ef1ea4b4f9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_log import log"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from watcher.decision_engine.planner.loading.default import \\"},{"line_number":22,"context_line":"    DefaultPlannerLoader"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_5652d068","line":21,"range":{"start_line":21,"start_character":45,"end_line":21,"end_character":52},"in_reply_to":"da6ed579_5dff5201","updated":"2016-01-12 17:21:04.000000000","message":"Done","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7c4d72efe22b648d15c92499a2d9273df7990d0e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from watcher.decision_engine.planner.loading import default as loader"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"default_planner \u003d \u0027default\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"da6ed579_19a8091f","line":24,"range":{"start_line":24,"start_character":3,"end_line":24,"end_character":4},"updated":"2016-01-12 17:15:32.000000000","message":"This is unused","commit_id":"90d46f5447d5562585668c9ca5d686694ec5b3e3"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f1cee6e96ac74b819a76db93eed3ff9191cbfeb3","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def load(self):"},{"line_number":51,"context_line":"        selected_planner \u003d CONF.watcher_planner.planner"},{"line_number":52,"context_line":"        LOG.debug(\"Loading {0}\".format(selected_planner))"},{"line_number":53,"context_line":"        return self.loader.load(name\u003dselected_planner)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_fcfc0340","line":52,"range":{"start_line":52,"start_character":27,"end_line":52,"end_character":30},"updated":"2016-01-12 17:29:43.000000000","message":"You should use the %s string formatting style here like:\n\nLOG.debug(\"Loading %s\", selected_planner)","commit_id":"57e0b8e04e26129d89874f2e16fc53b2d4acfd1e"}],"watcher/decision_engine/solution/default.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"from oslo_log import log"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from watcher.decision_engine.solution.base import BaseSolution"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_9d494ad3","line":21,"range":{"start_line":21,"start_character":38,"end_line":21,"end_character":42},"updated":"2016-01-12 15:52:11.000000000","message":"ditto","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        super(DefaultSolution, self).__init__()"},{"line_number":34,"context_line":"        self._actions \u003d []"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def add_action(self, action_type,"},{"line_number":37,"context_line":"                   applies_to,"},{"line_number":38,"context_line":"                   parameters\u003dNone):"},{"line_number":39,"context_line":"        # todo(jed) add https://pypi.python.org/pypi/schema"},{"line_number":40,"context_line":"        action \u003d {"},{"line_number":41,"context_line":"            \u0027action_type\u0027: action_type,"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_bd31aeee","line":38,"range":{"start_line":36,"start_character":0,"end_line":38,"end_character":36},"updated":"2016-01-12 15:52:11.000000000","message":"nit: this can fit on a single line","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"}],"watcher/decision_engine/strategy/strategies/dummy_strategy.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#"},{"line_number":19,"context_line":"from oslo_log import log"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from watcher.decision_engine.strategy.strategies.base import BaseStrategy"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_dd26e215","line":21,"range":{"start_line":21,"start_character":49,"end_line":21,"end_character":53},"updated":"2016-01-12 15:52:11.000000000","message":"ditto","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    DEFAULT_NAME \u003d \"dummy\""},{"line_number":28,"context_line":"    DEFAULT_DESCRIPTION \u003d \"Dummy Strategy\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    action_nop \u003d \"nop\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, name\u003dDEFAULT_NAME, description\u003dDEFAULT_DESCRIPTION):"},{"line_number":33,"context_line":"        super(DummyStrategy, self).__init__(name, description)"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_7d6336b2","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":14},"updated":"2016-01-12 15:52:11.000000000","message":"on basic consolidation, you didn\u0027t prefix your actions, so why doing it here?","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"}],"watcher/tests/decision_engine/planner/test_default_planner.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher.common.exception import ActionNotFound"},{"line_number":20,"context_line":"from watcher.common import utils"},{"line_number":21,"context_line":"from watcher.db import api as db_api"},{"line_number":22,"context_line":"from watcher.decision_engine.actions.base import BaseAction"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_1617fdee","line":19,"updated":"2016-01-11 14:05:09.000000000","message":"IMHO, it will be better to import only the module, ie:\nfrom watcher.common import exception","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher.common.exception import ActionNotFound"},{"line_number":20,"context_line":"from watcher.common import utils"},{"line_number":21,"context_line":"from watcher.db import api as db_api"},{"line_number":22,"context_line":"from watcher.decision_engine.actions.base import BaseAction"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_e7ccee8a","line":19,"in_reply_to":"fa69d971_1617fdee","updated":"2016-01-11 15:46:05.000000000","message":"Done","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"}],"watcher/tests/decision_engine/planner/test_default_planner_loader.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from watcher.decision_engine.planner.loading.default import \\"},{"line_number":19,"context_line":"    DefaultPlannerLoader"},{"line_number":20,"context_line":"from watcher.tests import base"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_5da192a8","line":18,"range":{"start_line":18,"start_character":45,"end_line":18,"end_character":52},"updated":"2016-01-12 15:52:11.000000000","message":"nit: Can you import the module instead of the class?","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"7c4d72efe22b648d15c92499a2d9273df7990d0e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from watcher.decision_engine.planner.base import BasePlanner"},{"line_number":18,"context_line":"from watcher.decision_engine.planner.loading import default"},{"line_number":19,"context_line":"from watcher.tests import base"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da6ed579_5c38afd3","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":60},"updated":"2016-01-12 17:15:32.000000000","message":"nit: Can you import the module and not the class please?","commit_id":"90d46f5447d5562585668c9ca5d686694ec5b3e3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"f6a6f9d4bf16484cb1ae32707e78fbfa1ed770c5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from watcher.decision_engine.planner.base import BasePlanner"},{"line_number":18,"context_line":"from watcher.decision_engine.planner.loading import default"},{"line_number":19,"context_line":"from watcher.tests import base"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"da6ed579_1ce55736","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":60},"in_reply_to":"da6ed579_5c38afd3","updated":"2016-01-12 17:21:09.000000000","message":"Done","commit_id":"90d46f5447d5562585668c9ca5d686694ec5b3e3"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f1cee6e96ac74b819a76db93eed3ff9191cbfeb3","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestDefaultPlannerLoader(base.TestCase):"},{"line_number":23,"context_line":"    loader \u003d default.DefaultPlannerLoader()"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_endpoints(self):"},{"line_number":26,"context_line":"        for endpoint in self.loader.list_available():"}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_dc4fbf90","line":23,"range":{"start_line":23,"start_character":4,"end_line":23,"end_character":43},"updated":"2016-01-12 17:29:43.000000000","message":"IMHO, this should be declared in the setUp() method for a better test isolation","commit_id":"57e0b8e04e26129d89874f2e16fc53b2d4acfd1e"}],"watcher/tests/decision_engine/planner/test_planner_manager.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"035ecbe1bc63055add6d0051dd72ee57303a88f2","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestPlannerManager(base.TestCase):"},{"line_number":26,"context_line":"    def test_load(self):"},{"line_number":27,"context_line":"        cfg.CONF.set_override(\u0027planner\u0027, \"default\", group\u003d\u0027watcher_planner\u0027)"},{"line_number":28,"context_line":"        cfg.CONF.set_override(\u0027version\u0027, 1, group\u003d\u0027watcher_planner\u0027)"},{"line_number":29,"context_line":"        manager \u003d PlannerManager()"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_45c62b9b","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":17},"updated":"2016-01-11 08:31:49.000000000","message":"Can you make this test more generic using \"testscenarios\" so that whenever we add a new planner (i.e. a new entry point), it would be automatically taken into account in this test?","commit_id":"f4e41f5c5a60b3b62c6255c78170673c3a6e01a3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"47355e187889f48a222c18ed5a2fbdbde2c487b6","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestPlannerManager(base.TestCase):"},{"line_number":26,"context_line":"    def test_load(self):"},{"line_number":27,"context_line":"        cfg.CONF.set_override(\u0027planner\u0027, \"default\", group\u003d\u0027watcher_planner\u0027)"},{"line_number":28,"context_line":"        cfg.CONF.set_override(\u0027version\u0027, 1, group\u003d\u0027watcher_planner\u0027)"},{"line_number":29,"context_line":"        manager \u003d PlannerManager()"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_c3d1b358","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":17},"in_reply_to":"fa69d971_45c62b9b","updated":"2016-01-11 09:27:35.000000000","message":"I agree to this idea as i said here :  https://review.openstack.org/#/c/264782/11/watcher/tests/common/loader/test_loader.py\n\nI will no do it here because I would prefer create a specific class for generic loading tests.","commit_id":"f4e41f5c5a60b3b62c6255c78170673c3a6e01a3"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestPlannerManager(base.TestCase):"},{"line_number":25,"context_line":"    def test_load(self):"},{"line_number":26,"context_line":"        cfg.CONF.set_override(\u0027planner\u0027, \"default\", group\u003d\u0027watcher_planner\u0027)"},{"line_number":27,"context_line":"        cfg.CONF.set_override(\u0027version\u0027, 1, group\u003d\u0027watcher_planner\u0027)"},{"line_number":28,"context_line":"        manager \u003d PlannerManager()"},{"line_number":29,"context_line":"        self.assertIsInstance(manager.load(), DefaultPlanner)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_b684f1d2","line":26,"range":{"start_line":26,"start_character":42,"end_line":26,"end_character":49},"updated":"2016-01-11 14:05:09.000000000","message":"ditto","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestPlannerManager(base.TestCase):"},{"line_number":25,"context_line":"    def test_load(self):"},{"line_number":26,"context_line":"        cfg.CONF.set_override(\u0027planner\u0027, \"default\", group\u003d\u0027watcher_planner\u0027)"},{"line_number":27,"context_line":"        cfg.CONF.set_override(\u0027version\u0027, 1, group\u003d\u0027watcher_planner\u0027)"},{"line_number":28,"context_line":"        manager \u003d PlannerManager()"},{"line_number":29,"context_line":"        self.assertIsInstance(manager.load(), DefaultPlanner)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_67a79ebd","line":26,"range":{"start_line":26,"start_character":42,"end_line":26,"end_character":49},"in_reply_to":"fa69d971_b684f1d2","updated":"2016-01-11 15:46:05.000000000","message":"ditto","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"47a1a1c98408da44334f3edbbe4c1f2277428f11","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class TestPlannerManager(base.TestCase):"},{"line_number":25,"context_line":"    def test_load(self):"},{"line_number":26,"context_line":"        cfg.CONF.set_override(\u0027planner\u0027, \"default\", group\u003d\u0027watcher_planner\u0027)"},{"line_number":27,"context_line":"        cfg.CONF.set_override(\u0027version\u0027, 1, group\u003d\u0027watcher_planner\u0027)"},{"line_number":28,"context_line":"        manager \u003d PlannerManager()"},{"line_number":29,"context_line":"        self.assertIsInstance(manager.load(), DefaultPlanner)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_d67965fd","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":68},"updated":"2016-01-11 14:05:09.000000000","message":"ditto","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":16495,"name":"Jean-Emile DARTOIS","email":"jean-emile.dartois@b-com.com","username":"JeD"},"change_message_id":"da42ecbd6077b2fde9150a3b0ec00db56b145275","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class TestPlannerManager(base.TestCase):"},{"line_number":25,"context_line":"    def test_load(self):"},{"line_number":26,"context_line":"        cfg.CONF.set_override(\u0027planner\u0027, \"default\", group\u003d\u0027watcher_planner\u0027)"},{"line_number":27,"context_line":"        cfg.CONF.set_override(\u0027version\u0027, 1, group\u003d\u0027watcher_planner\u0027)"},{"line_number":28,"context_line":"        manager \u003d PlannerManager()"},{"line_number":29,"context_line":"        self.assertIsInstance(manager.load(), DefaultPlanner)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_a7bef6ab","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":68},"in_reply_to":"fa69d971_d67965fd","updated":"2016-01-11 15:46:05.000000000","message":"ditto","commit_id":"9a0f2a6965c3794acc9623923cddc061b3c5ddf3"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher.decision_engine.planner.default import DefaultPlanner"},{"line_number":20,"context_line":"from watcher.decision_engine.planner.manager import PlannerManager"},{"line_number":21,"context_line":"from watcher.tests import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_5d88b222","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":66},"updated":"2016-01-12 15:52:11.000000000","message":"ditto","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"f1cee6e96ac74b819a76db93eed3ff9191cbfeb3","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from watcher.decision_engine.planner.default import DefaultPlanner"},{"line_number":20,"context_line":"from watcher.decision_engine.planner.manager import PlannerManager"},{"line_number":21,"context_line":"from watcher.tests import base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"da6ed579_1c047715","line":20,"range":{"start_line":19,"start_character":0,"end_line":20,"end_character":66},"updated":"2016-01-12 17:29:43.000000000","message":"nit: Can you import modules instead of classes?","commit_id":"57e0b8e04e26129d89874f2e16fc53b2d4acfd1e"}],"watcher/tests/decision_engine/solution/test_default_solution.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# implied."},{"line_number":14,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"# limitations under the License."},{"line_number":16,"context_line":"from watcher.decision_engine.solution.default import DefaultSolution"},{"line_number":17,"context_line":"from watcher.tests import base"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_fd796630","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":68},"updated":"2016-01-12 15:52:11.000000000","message":"ditto","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"}],"watcher/tests/decision_engine/strategy/loading/test_default_strategy_loader.py":[{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"c0d8fb2dde561961f2ed39badf55a9b7fd06956d","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        def test_endpoints(self):"},{"line_number":75,"context_line":"            for endpoint in self.strategy_loader.list_available():"},{"line_number":76,"context_line":"                self.assertIsNotNone(self.strategy_loader.load(endpoint))"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_fdc72643","line":76,"range":{"start_line":76,"start_character":21,"end_line":76,"end_character":36},"updated":"2016-01-12 15:52:11.000000000","message":"Maybe you should also test that the strategy you loaded is a subclass of BaseStrategy","commit_id":"3f4b26d3fb1f13e00b49727179d09ba834193827"}]}
