)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"abstract class methods. I also added an abstract strategy class"},{"line_number":11,"context_line":"per Goal type (dummy, server consolidation, thermal optimization)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This changeset also includes an update of the the /goal Watcher API"},{"line_number":14,"context_line":"endpoint to now use the new Goal model (DB entries) instead of"},{"line_number":15,"context_line":"reading from the configuration file."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba0121b8_c9a09d93","line":13,"range":{"start_line":13,"start_character":46,"end_line":13,"end_character":49},"updated":"2016-03-29 10:50:08.000000000","message":"duplicated","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"abstract class methods. I also added an abstract strategy class"},{"line_number":11,"context_line":"per Goal type (dummy, server consolidation, thermal optimization)."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This changeset also includes an update of the the /goal Watcher API"},{"line_number":14,"context_line":"endpoint to now use the new Goal model (DB entries) instead of"},{"line_number":15,"context_line":"reading from the configuration file."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba0121b8_29966f4c","line":13,"range":{"start_line":13,"start_character":46,"end_line":13,"end_character":49},"in_reply_to":"ba0121b8_c9a09d93","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"}],"watcher/api/controllers/v1/goal.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def get_all(self, marker\u003dNone, limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":177,"context_line":"        \"\"\"Retrieve a list of goals."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":180,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":181,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":182,"context_line":"           to get only actions for that goal."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_9b3ee8b6","line":179,"updated":"2016-03-29 10:50:08.000000000","message":"add \u0027marker\u0027 parameter description","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def get_all(self, marker\u003dNone, limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":177,"context_line":"        \"\"\"Retrieve a list of goals."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":180,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":181,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":182,"context_line":"           to get only actions for that goal."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_49abe374","line":179,"in_reply_to":"ba0121b8_9b3ee8b6","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    @wsme_pecan.wsexpose(GoalCollection, wtypes.text, int,"},{"line_number":187,"context_line":"                         wtypes.text, wtypes.text)"},{"line_number":188,"context_line":"    def detail(self, marker\u003dNone, limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":189,"context_line":"        \"\"\"Retrieve a list of actions with detail."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        :param goal_id: ID of a goal"},{"line_number":192,"context_line":"        :param limit: maximum number of resources to return in a single result."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_1b877862","line":189,"range":{"start_line":189,"start_character":30,"end_line":189,"end_character":37},"updated":"2016-03-29 10:50:08.000000000","message":"s/actions/goals","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    @wsme_pecan.wsexpose(GoalCollection, wtypes.text, int,"},{"line_number":187,"context_line":"                         wtypes.text, wtypes.text)"},{"line_number":188,"context_line":"    def detail(self, marker\u003dNone, limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":189,"context_line":"        \"\"\"Retrieve a list of actions with detail."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        :param goal_id: ID of a goal"},{"line_number":192,"context_line":"        :param limit: maximum number of resources to return in a single result."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_c9037372","line":189,"range":{"start_line":189,"start_character":30,"end_line":189,"end_character":37},"in_reply_to":"ba0121b8_1b877862","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    def detail(self, marker\u003dNone, limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":189,"context_line":"        \"\"\"Retrieve a list of actions with detail."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        :param goal_id: ID of a goal"},{"line_number":192,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":193,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":194,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_9b6548e3","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":36},"updated":"2016-03-29 10:50:08.000000000","message":"remove it\nand add \u0027marker\u0027 parameter description","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":188,"context_line":"    def detail(self, marker\u003dNone, limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027):"},{"line_number":189,"context_line":"        \"\"\"Retrieve a list of actions with detail."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        :param goal_id: ID of a goal"},{"line_number":192,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":193,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":194,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_69aea786","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":36},"in_reply_to":"ba0121b8_9b6548e3","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":193,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":194,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":195,"context_line":"           to get only goals for that goal."},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        # NOTE(lucasagomes): /detail should only work agaist collections"},{"line_number":198,"context_line":"        parent \u003d pecan.request.path.split(\u0027/\u0027)[:-1][-1]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_3b2cfc49","line":195,"range":{"start_line":195,"start_character":10,"end_line":195,"end_character":43},"updated":"2016-03-29 10:50:08.000000000","message":"to remove","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":193,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":194,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":195,"context_line":"           to get only goals for that goal."},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        # NOTE(lucasagomes): /detail should only work agaist collections"},{"line_number":198,"context_line":"        parent \u003d pecan.request.path.split(\u0027/\u0027)[:-1][-1]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_89097b98","line":195,"range":{"start_line":195,"start_character":10,"end_line":195,"end_character":43},"in_reply_to":"ba0121b8_3b2cfc49","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def get_one(self, goal_id):"},{"line_number":208,"context_line":"        \"\"\"Retrieve information about the given goal."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        :param goal_id: name of the goal."},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":"        if self.from_goals:"},{"line_number":213,"context_line":"            raise exception.OperationNotPermitted"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_5b2bb030","line":210,"range":{"start_line":210,"start_character":24,"end_line":210,"end_character":28},"updated":"2016-03-29 10:50:08.000000000","message":"s/name/ID","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    def get_one(self, goal_id):"},{"line_number":208,"context_line":"        \"\"\"Retrieve information about the given goal."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        :param goal_id: name of the goal."},{"line_number":211,"context_line":"        \"\"\""},{"line_number":212,"context_line":"        if self.from_goals:"},{"line_number":213,"context_line":"            raise exception.OperationNotPermitted"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_692187fb","line":210,"range":{"start_line":210,"start_character":24,"end_line":210,"end_character":28},"in_reply_to":"ba0121b8_5b2bb030","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"54c2e77157411553b78c98a3ad6fe90955e91e50","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def get_one(self, goal):"},{"line_number":216,"context_line":"        \"\"\"Retrieve information about the given goal."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        :param goal: UUID of the goal."},{"line_number":219,"context_line":"        \"\"\""},{"line_number":220,"context_line":"        if self.from_goals:"},{"line_number":221,"context_line":"            raise exception.OperationNotPermitted"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_965173db","line":218,"range":{"start_line":218,"start_character":21,"end_line":218,"end_character":25},"updated":"2016-04-19 09:40:11.000000000","message":"uuid or name","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"53ff078666e5e79178e6aab566b75286c4ade9b4","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def get_one(self, goal):"},{"line_number":216,"context_line":"        \"\"\"Retrieve information about the given goal."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        :param goal: UUID of the goal."},{"line_number":219,"context_line":"        \"\"\""},{"line_number":220,"context_line":"        if self.from_goals:"},{"line_number":221,"context_line":"            raise exception.OperationNotPermitted"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_a28e8dcd","line":218,"range":{"start_line":218,"start_character":21,"end_line":218,"end_character":25},"in_reply_to":"1a122d0e_965173db","updated":"2016-04-20 09:39:24.000000000","message":"Done","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"}],"watcher/decision_engine/strategy/strategies/base.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":141,"context_line":"class DummyBaseStrategy(BaseStrategy):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # Note(v-fancoise): Defined here to be used as the translation key for"},{"line_number":144,"context_line":"    # other services"},{"line_number":145,"context_line":"    GOAL_DISPLAY_NAME \u003d \"Dummy strategy\""},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_5b88d0e7","line":143,"range":{"start_line":143,"start_character":6,"end_line":143,"end_character":22},"updated":"2016-03-29 10:50:08.000000000","message":"s/fancoise/francoise ;)","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":140,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":141,"context_line":"class DummyBaseStrategy(BaseStrategy):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    # Note(v-fancoise): Defined here to be used as the translation key for"},{"line_number":144,"context_line":"    # other services"},{"line_number":145,"context_line":"    GOAL_DISPLAY_NAME \u003d \"Dummy strategy\""},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_09528b67","line":143,"range":{"start_line":143,"start_character":6,"end_line":143,"end_character":22},"in_reply_to":"ba0121b8_5b88d0e7","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @classmethod"},{"line_number":152,"context_line":"    def get_goal_display_name(cls):"},{"line_number":153,"context_line":"        return _(\"Dummy strategy\")"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_5bb570cb","line":153,"range":{"start_line":153,"start_character":0,"end_line":153,"end_character":34},"updated":"2016-03-29 10:50:08.000000000","message":"why not return _(self.GOAL_DISPLAY_NAME) ? is it work with i18n ? not sure :)","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    @classmethod"},{"line_number":152,"context_line":"    def get_goal_display_name(cls):"},{"line_number":153,"context_line":"        return _(\"Dummy strategy\")"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_afd0bf54","line":153,"range":{"start_line":153,"start_character":0,"end_line":153,"end_character":34},"in_reply_to":"ba0121b8_5bb570cb","updated":"2016-03-29 13:36:12.000000000","message":"You got it, I need to have both the translated value and the associated key. The translated value can be used directly by the decision engine whereas the translation key will be later be stored into the DB to be then translated by the Watcher API.\nNote: I wrote  them twice so the translation key can be automatically collected in the .pot file","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"c3db8099e3f1d69fbfefe331712602f043d54a1b","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_translatable_goal_display_name(cls):"},{"line_number":169,"context_line":"        return \"Dummy strategy\""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_0b488d2c","line":169,"range":{"start_line":169,"start_character":22,"end_line":169,"end_character":30},"updated":"2016-03-30 10:04:44.000000000","message":"s/strategy/goal","commit_id":"fe17e880de238d67fed4a359034e6704ca46d890"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"dc818c6e404f061e259ba822c19bf8b0227dccad","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_translatable_goal_display_name(cls):"},{"line_number":169,"context_line":"        return \"Dummy strategy\""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_3d1ca576","line":169,"range":{"start_line":169,"start_character":22,"end_line":169,"end_character":30},"in_reply_to":"ba0121b8_0b488d2c","updated":"2016-03-30 12:52:33.000000000","message":"Done","commit_id":"fe17e880de238d67fed4a359034e6704ca46d890"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"860d607a02b49a3a7b89bb7bac699ff4dfeff2bd","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @classmethod"},{"line_number":100,"context_line":"    @abc.abstractmethod"},{"line_number":101,"context_line":"    def get_translatable_goal_display_name(cls):"},{"line_number":102,"context_line":"        \"\"\"The translatable msgid related to the goal of the strategy\"\"\""},{"line_number":103,"context_line":"        # Note(v-francoise): Defined here to be used as the translation key for"},{"line_number":104,"context_line":"        # other services"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_5d77729f","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":42},"updated":"2016-04-01 05:00:11.000000000","message":"I take it that by translatable this means it is not currently translated.","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"afefeb27c8dd0b8e16dfc136c8a1c865b6be8c8e","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @classmethod"},{"line_number":100,"context_line":"    @abc.abstractmethod"},{"line_number":101,"context_line":"    def get_translatable_goal_display_name(cls):"},{"line_number":102,"context_line":"        \"\"\"The translatable msgid related to the goal of the strategy\"\"\""},{"line_number":103,"context_line":"        # Note(v-francoise): Defined here to be used as the translation key for"},{"line_number":104,"context_line":"        # other services"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_9fa99b7e","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":42},"in_reply_to":"ba0121b8_5d77729f","updated":"2016-04-05 09:56:07.000000000","message":"Yes that\u0027s my point. Because both services share the same *.po files, we only have to store the translation keys of each display name into the DB. These msgids will then be used by the Watcher API to translate this into the language defined by the incoming request.","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"},{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"860d607a02b49a3a7b89bb7bac699ff4dfeff2bd","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    @abc.abstractmethod"},{"line_number":101,"context_line":"    def get_translatable_goal_display_name(cls):"},{"line_number":102,"context_line":"        \"\"\"The translatable msgid related to the goal of the strategy\"\"\""},{"line_number":103,"context_line":"        # Note(v-francoise): Defined here to be used as the translation key for"},{"line_number":104,"context_line":"        # other services"},{"line_number":105,"context_line":"        raise NotImplementedError()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_3dd6fe4e","line":104,"range":{"start_line":103,"start_character":29,"end_line":104,"end_character":24},"updated":"2016-04-01 05:00:11.000000000","message":"Why not just use the integer ID? Having to define the display name in two separate places is unfortunate. It would be better IMO to have an integer ID on this class and use that.","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"541b26637eae2540ef0225bb4bc76023a90dee78","unresolved":false,"context_lines":[{"line_number":157,"context_line":"class DummyBaseStrategy(BaseStrategy):"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def get_goal_id(cls):"},{"line_number":161,"context_line":"        return \"DUMMY\""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_58bb9ec4","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":19},"updated":"2016-04-05 08:50:35.000000000","message":"Goal and strategy should be \"has-a\" relationship. It\u0027s better to have strategy keep a reference to goal and initialize it according to some config file.\n\nThis code hacked strategy to return goal name, which is a little bit odd.","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"afefeb27c8dd0b8e16dfc136c8a1c865b6be8c8e","unresolved":false,"context_lines":[{"line_number":157,"context_line":"class DummyBaseStrategy(BaseStrategy):"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def get_goal_id(cls):"},{"line_number":161,"context_line":"        return \"DUMMY\""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_027a54f1","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":19},"in_reply_to":"9a061dce_58bb9ec4","updated":"2016-04-05 09:56:07.000000000","message":"Not sure I understand what you mean here with the config file. Can you please detail a little bit more the way you want to do it? BTW, this implementation follows what has been described in the specs (see https://github.com/openstack/watcher-specs/blob/master/specs/mitaka/approved/get-goal-from-strategy.rst#proposed-change)","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"}],"watcher/decision_engine/strategy/strategies/basic_consolidation.py":[{"author":{"_account_id":13289,"name":"Taylor Peoples","email":"tpeoples@us.ibm.com","username":"tpeoples"},"change_message_id":"860d607a02b49a3a7b89bb7bac699ff4dfeff2bd","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @classmethod"},{"line_number":114,"context_line":"    def get_id(cls):"},{"line_number":115,"context_line":"        return \"basic\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def get_display_name(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_dde0a22b","line":115,"range":{"start_line":115,"start_character":16,"end_line":115,"end_character":21},"updated":"2016-04-01 05:00:11.000000000","message":"Having the ID be a string like this versus an integer is kind of odd IMO.","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"},{"author":{"_account_id":11235,"name":"Edwin Zhai","email":"edwin.zhai@intel.com","username":"gzhai"},"change_message_id":"541b26637eae2540ef0225bb4bc76023a90dee78","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @classmethod"},{"line_number":114,"context_line":"    def get_id(cls):"},{"line_number":115,"context_line":"        return \"basic\""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def get_display_name(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_bde74ce3","line":115,"range":{"start_line":115,"start_character":16,"end_line":115,"end_character":21},"updated":"2016-04-05 08:50:35.000000000","message":"basic is too ambiguous here.","commit_id":"087494ddea3b224f9fef442b71492130557f4de0"}],"watcher/decision_engine/strategy/strategies/dummy_strategy.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u003cNone\u003e"},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    display_name \u003d \"Dummy strategy\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    NOP \u003d \"nop\""},{"line_number":51,"context_line":"    SLEEP \u003d \"sleep\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_db9060ef","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":35},"updated":"2016-03-29 10:50:08.000000000","message":"not used","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    \u003cNone\u003e"},{"line_number":46,"context_line":"    \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    display_name \u003d \"Dummy strategy\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    NOP \u003d \"nop\""},{"line_number":51,"context_line":"    SLEEP \u003d \"sleep\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_af055fc3","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":35},"in_reply_to":"ba0121b8_db9060ef","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"2ee8932542d447d82244c8fd01ef70f03c94201f","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                 input_parameters\u003d{\u0027duration\u0027: 5.0})"},{"line_number":68,"context_line":"        return self.solution"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    DISPLAY_NAME \u003d \"Dummy strategy\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @classmethod"},{"line_number":73,"context_line":"    def get_id(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_7b6dd403","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":35},"updated":"2016-03-29 10:50:08.000000000","message":"is it really used ?","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"1aa4fbea3b38492b9e805eabae9c0c4b94b5b65e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                 input_parameters\u003d{\u0027duration\u0027: 5.0})"},{"line_number":68,"context_line":"        return self.solution"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    DISPLAY_NAME \u003d \"Dummy strategy\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @classmethod"},{"line_number":73,"context_line":"    def get_id(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_6f04e7bf","line":70,"range":{"start_line":70,"start_character":0,"end_line":70,"end_character":35},"in_reply_to":"ba0121b8_7b6dd403","updated":"2016-03-29 13:36:12.000000000","message":"Done","commit_id":"14ca352c3458c5e477af7a0a83385317b3345757"}],"watcher/decision_engine/sync.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"54c2e77157411553b78c98a3ad6fe90955e91e50","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        implemented_strategies \u003d strategy_loader.list_available()"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        for _, strategy_cls in implemented_strategies.items():"},{"line_number":157,"context_line":"            goals_map[strategy_cls.get_goal_name()] \u003d {"},{"line_number":158,"context_line":"                \"name\": strategy_cls.get_goal_name(),"},{"line_number":159,"context_line":"                \"display_name\":"},{"line_number":160,"context_line":"                    strategy_cls.get_translatable_goal_display_name()}"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_bd78ac2c","line":158,"range":{"start_line":157,"start_character":12,"end_line":158,"end_character":52},"updated":"2016-04-19 09:40:11.000000000","message":"it is redundant. why not ? \n\ngoals_map[strategy_cls.get_goal_name()] \u003d {\n                \"display_name\": strategy_cls.get_translatable_goal_display_name()}","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"53ff078666e5e79178e6aab566b75286c4ade9b4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        implemented_strategies \u003d strategy_loader.list_available()"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        for _, strategy_cls in implemented_strategies.items():"},{"line_number":157,"context_line":"            goals_map[strategy_cls.get_goal_name()] \u003d {"},{"line_number":158,"context_line":"                \"name\": strategy_cls.get_goal_name(),"},{"line_number":159,"context_line":"                \"display_name\":"},{"line_number":160,"context_line":"                    strategy_cls.get_translatable_goal_display_name()}"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_6ece5cb5","line":158,"range":{"start_line":157,"start_character":12,"end_line":158,"end_character":52},"in_reply_to":"1a122d0e_bd78ac2c","updated":"2016-04-20 09:39:24.000000000","message":"It\u0027s because I compare dicts (see line 83). So I need to have the same fields on both sides. The reason why I compare dicts is to detect any change of implementation.","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"},{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"54c2e77157411553b78c98a3ad6fe90955e91e50","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                \"display_name\":"},{"line_number":160,"context_line":"                    strategy_cls.get_translatable_goal_display_name()}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            strategies_map[strategy_cls.get_name()] \u003d {"},{"line_number":163,"context_line":"                \"name\": strategy_cls.get_name(),"},{"line_number":164,"context_line":"                \"goal_name\": strategy_cls.get_goal_name(),"},{"line_number":165,"context_line":"                \"display_name\": strategy_cls.get_translatable_display_name()}"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_9dffb066","line":163,"range":{"start_line":162,"start_character":12,"end_line":163,"end_character":48},"updated":"2016-04-19 09:40:11.000000000","message":"ditto","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"53ff078666e5e79178e6aab566b75286c4ade9b4","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                \"display_name\":"},{"line_number":160,"context_line":"                    strategy_cls.get_translatable_goal_display_name()}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"            strategies_map[strategy_cls.get_name()] \u003d {"},{"line_number":163,"context_line":"                \"name\": strategy_cls.get_name(),"},{"line_number":164,"context_line":"                \"goal_name\": strategy_cls.get_goal_name(),"},{"line_number":165,"context_line":"                \"display_name\": strategy_cls.get_translatable_display_name()}"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_2e3bc49d","line":163,"range":{"start_line":162,"start_character":12,"end_line":163,"end_character":48},"in_reply_to":"1a122d0e_9dffb066","updated":"2016-04-20 09:39:24.000000000","message":"ditto at line 90","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"}],"watcher/tests/decision_engine/strategy/loading/test_default_strategy_loader.py":[{"author":{"_account_id":12394,"name":"David TARDIVEL","email":"David.TARDIVEL@b-com.com","username":"David.T"},"change_message_id":"54c2e77157411553b78c98a3ad6fe90955e91e50","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            exception.LoadingError, self.strategy_loader.load, None)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_load_strategy_is_basic(self):"},{"line_number":35,"context_line":"        exptected_strategy \u003d \u0027basic\u0027"},{"line_number":36,"context_line":"        selected_strategy \u003d self.strategy_loader.load(exptected_strategy)"},{"line_number":37,"context_line":"        self.assertEqual("},{"line_number":38,"context_line":"            selected_strategy.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_10f42784","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":17},"updated":"2016-04-19 09:40:11.000000000","message":"s/exptected/expected","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"},{"author":{"_account_id":18971,"name":"Vincent Françoise","email":"Vincent.FRANCOISE@b-com.com","username":"v-francoise"},"change_message_id":"53ff078666e5e79178e6aab566b75286c4ade9b4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            exception.LoadingError, self.strategy_loader.load, None)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_load_strategy_is_basic(self):"},{"line_number":35,"context_line":"        exptected_strategy \u003d \u0027basic\u0027"},{"line_number":36,"context_line":"        selected_strategy \u003d self.strategy_loader.load(exptected_strategy)"},{"line_number":37,"context_line":"        self.assertEqual("},{"line_number":38,"context_line":"            selected_strategy.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_426b39f1","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":17},"in_reply_to":"1a122d0e_10f42784","updated":"2016-04-20 09:39:24.000000000","message":"Done","commit_id":"1a1c747e1fb2d43df9c93bb29493f1f45a7ad218"}]}
