)]}'
{"devstack/README.rst":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"924d51576912977498f4e1b016b222751758b33c","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":".. code:: bash"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"   [[post-config|$HEAT_CONF]]"},{"line_number":61,"context_line":"   [oslo_messaging_notifications]"},{"line_number":62,"context_line":"   driver \u003d messagingv2"},{"line_number":63,"context_line":"   topics \u003d notifications,vitrage_notifications"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a6eadb0_f373b1b2","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":27},"updated":"2016-12-13 06:42:44.000000000","message":"You mean AODH_CONF, right?","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"aa60eeb39876bb1bb80f386b3e58a53d5b25437a","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":".. code:: bash"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"   [[post-config|$HEAT_CONF]]"},{"line_number":61,"context_line":"   [oslo_messaging_notifications]"},{"line_number":62,"context_line":"   driver \u003d messagingv2"},{"line_number":63,"context_line":"   topics \u003d notifications,vitrage_notifications"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a6eadb0_975c2827","line":60,"range":{"start_line":60,"start_character":18,"end_line":60,"end_character":27},"in_reply_to":"1a6eadb0_f373b1b2","updated":"2016-12-13 07:14:12.000000000","message":"eh....mistack","commit_id":"66f276585b1352485403455467c02344a85258a1"}],"vitrage/datasources/alarm_driver_base.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"},{"line_number":121,"context_line":"        return alarm \\"},{"line_number":122,"context_line":"            if self._is_valid(alarm) and \\"},{"line_number":123,"context_line":"            (self._is_erroneous(alarm) or self._is_erroneous(old_alarm)) \\"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_1bc37658","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":25},"updated":"2016-12-21 10:26:17.000000000","message":"I think that this name is confusing, since there is a method _is_valid that checks other things. Why do you think that _filter_get_all should be renamed?","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"},{"line_number":121,"context_line":"        return alarm \\"},{"line_number":122,"context_line":"            if self._is_valid(alarm) and \\"},{"line_number":123,"context_line":"            (self._is_erroneous(alarm) or self._is_erroneous(old_alarm)) \\"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_5092c558","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":25},"in_reply_to":"1a6eadb0_1bc37658","updated":"2016-12-22 01:03:52.000000000","message":"The original _filter_get_all filter the alarm with \u0027alarm\u0027 state, but in the notification cache, we need to cache all alarms no matter which states the alarms are. So i rename the funtion, and add a funtion `_filter_get_all` to filter all alarms.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"cd4de7c1a8b769eef2904c473128401e4f3d4798","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"},{"line_number":121,"context_line":"        return alarm \\"},{"line_number":122,"context_line":"            if self._is_valid(alarm) and \\"},{"line_number":123,"context_line":"            (self._is_erroneous(alarm) or self._is_erroneous(old_alarm)) \\"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_f3cbba1c","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":25},"in_reply_to":"da4df55a_5092c558","updated":"2016-12-22 07:35:52.000000000","message":"Ok, I understand. But I still think that _filter_get_valid is confusing. I don\u0027t have a really good name, but how about _filter_get_alarmed? which is also wrong, because we return ex-alarmed alarms as well.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"cbd8255be49f9c30bb47b2527368abf6f726a261","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"},{"line_number":121,"context_line":"        return alarm \\"},{"line_number":122,"context_line":"            if self._is_valid(alarm) and \\"},{"line_number":123,"context_line":"            (self._is_erroneous(alarm) or self._is_erroneous(old_alarm)) \\"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_681430f5","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":25},"in_reply_to":"da4df55a_f3cbba1c","updated":"2016-12-22 09:17:34.000000000","message":"OK.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            self.cache[alarm_key] \u003d alarm, time"},{"line_number":146,"context_line":"            return alarm"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.cache[alarm_key] \u003d alarm, time"},{"line_number":149,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_dbf73ed1","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":43},"updated":"2016-12-21 10:26:17.000000000","message":"You changed the base class, which means that all nagios and zabbix alarms will be cached as well. I prefer that you add an abstract function like _handle_filtered_out_alarms (or find a better name) that will cache these alarms only for aodh","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            self.cache[alarm_key] \u003d alarm, time"},{"line_number":146,"context_line":"            return alarm"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.cache[alarm_key] \u003d alarm, time"},{"line_number":149,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_90aa6d6f","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":43},"in_reply_to":"1a6eadb0_dbf73ed1","updated":"2016-12-22 01:03:52.000000000","message":"No,i didn\u0027t change the base class, i just extract the funtion to handle single alarm which can be used in AodhDriver. See line103.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"cd4de7c1a8b769eef2904c473128401e4f3d4798","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            self.cache[alarm_key] \u003d alarm, time"},{"line_number":146,"context_line":"            return alarm"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.cache[alarm_key] \u003d alarm, time"},{"line_number":149,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_13e83e7c","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":43},"in_reply_to":"da4df55a_90aa6d6f","updated":"2016-12-22 07:35:52.000000000","message":"You are right, sorry.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        return alarms_to_update"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_aee4653b","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":23},"updated":"2016-12-22 08:21:32.000000000","message":"We may call this method \"_filter_get_valid_alarms\"","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"68dd6c85ccfcc9b4b3c3fb5a95399c955b8c824b","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        return alarms_to_update"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_68f8b0e6","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":23},"in_reply_to":"da4df55a_aee4653b","updated":"2016-12-22 09:22:29.000000000","message":"Ok, fix it.","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    def _filter_get_all(self, alarm, old_alarm):"},{"line_number":118,"context_line":"        return alarm if self._is_valid(alarm) else None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _filter_get_vaild(self, alarm, old_alarm):"},{"line_number":121,"context_line":"        return alarm \\"},{"line_number":122,"context_line":"            if self._is_valid(alarm) and \\"},{"line_number":123,"context_line":"            (self._is_erroneous(alarm) or self._is_erroneous(old_alarm)) \\"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_0ecad1a1","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":25},"updated":"2016-12-22 08:21:32.000000000","message":"We may call this method \"_filter_get_valid_and_erroneous_alarms\"","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f227d29dc23664ced2b71e6b02b6b0c57036f7f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            return None"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def _filter_and_cache_alarm(self, alarm, old_alarm, filter_, time):"},{"line_number":141,"context_line":"        ret \u003d alarm if filter_(alarm, old_alarm) else None"},{"line_number":142,"context_line":"        self.cache[self._alarm_key(alarm)] \u003d alarm, time"},{"line_number":143,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_56d8e653","line":143,"range":{"start_line":141,"start_character":0,"end_line":143,"end_character":18},"updated":"2016-12-22 13:22:53.000000000","message":"Why did you remove the DELETED handling?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            return None"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def _filter_and_cache_alarm(self, alarm, old_alarm, filter_, time):"},{"line_number":141,"context_line":"        ret \u003d alarm if filter_(alarm, old_alarm) else None"},{"line_number":142,"context_line":"        self.cache[self._alarm_key(alarm)] \u003d alarm, time"},{"line_number":143,"context_line":"        return ret"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_a95d16eb","line":143,"range":{"start_line":141,"start_character":0,"end_line":143,"end_character":18},"in_reply_to":"da4df55a_56d8e653","updated":"2016-12-23 01:19:54.000000000","message":"Restore to handle it in transformer. Otherwise it will be storage in the cache and lead to some mis-handling.","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}],"vitrage/datasources/alarm_transformer_base.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f227d29dc23664ced2b71e6b02b6b0c57036f7f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _extract_graph_action(self, entity_event):"},{"line_number":37,"context_line":"        # TODO(ifat_afek): this method should reside together with the cache,"},{"line_number":38,"context_line":"        # in the transformer code"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        if DSProps.EVENT_TYPE in entity_event and \\"},{"line_number":41,"context_line":"           entity_event[DSProps.EVENT_TYPE] \u003d\u003d GraphAction.DELETE_ENTITY:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_d6921657","line":38,"range":{"start_line":37,"start_character":0,"end_line":38,"end_character":33},"updated":"2016-12-22 13:22:53.000000000","message":"Is this todo still relevant?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _extract_graph_action(self, entity_event):"},{"line_number":37,"context_line":"        # TODO(ifat_afek): this method should reside together with the cache,"},{"line_number":38,"context_line":"        # in the transformer code"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        if DSProps.EVENT_TYPE in entity_event and \\"},{"line_number":41,"context_line":"           entity_event[DSProps.EVENT_TYPE] \u003d\u003d GraphAction.DELETE_ENTITY:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_ee6ac419","line":38,"range":{"start_line":37,"start_character":0,"end_line":38,"end_character":33},"in_reply_to":"da4df55a_d6921657","updated":"2016-12-23 01:19:54.000000000","message":"No","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"4f24e3da799aa4f07e0453f980008322a0b2cebe","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def _ok_status(self, entity_event):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _extract_graph_action(self, entity_event):"},{"line_number":37,"context_line":"        # TODO(ifat_afek): this method should reside together with the cache,"},{"line_number":38,"context_line":"        # in the transformer code"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        if DSProps.EVENT_TYPE in entity_event and \\"},{"line_number":41,"context_line":"           entity_event[DSProps.EVENT_TYPE] \u003d\u003d GraphAction.DELETE_ENTITY:"},{"line_number":42,"context_line":"            return entity_event[DSProps.EVENT_TYPE]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        datasource_action \u003d entity_event[DSProps.DATASOURCE_ACTION]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if datasource_action in \\"},{"line_number":47,"context_line":"            (DatasourceAction.UPDATE, DatasourceAction.SNAPSHOT):"},{"line_number":48,"context_line":"            return GraphAction.DELETE_ENTITY if self._ok_status(entity_event) else \\"},{"line_number":49,"context_line":"                self.GRAPH_ACTION_MAPPING.get("},{"line_number":50,"context_line":"                entity_event.get(DSProps.EVENT_TYPE, None),"},{"line_number":51,"context_line":"                GraphAction.UPDATE_ENTITY)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if DatasourceAction.INIT_SNAPSHOT \u003d\u003d datasource_action:"},{"line_number":54,"context_line":"            return GraphAction.CREATE_ENTITY"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        raise VitrageTransformerError(\u0027Invalid datasource action: (%s)\u0027"},{"line_number":57,"context_line":"                                      % datasource_action)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def create_placeholder_vertex(self, **kwargs):"},{"line_number":60,"context_line":"        LOG.info(\u0027An alarm cannot be a placeholder\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_d36f8890","line":57,"range":{"start_line":36,"start_character":1,"end_line":57,"end_character":58},"updated":"2016-12-22 12:46:43.000000000","message":"why did you put this here and removed the first if from the TransformerBase?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def _ok_status(self, entity_event):"},{"line_number":34,"context_line":"        pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _extract_graph_action(self, entity_event):"},{"line_number":37,"context_line":"        # TODO(ifat_afek): this method should reside together with the cache,"},{"line_number":38,"context_line":"        # in the transformer code"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        if DSProps.EVENT_TYPE in entity_event and \\"},{"line_number":41,"context_line":"           entity_event[DSProps.EVENT_TYPE] \u003d\u003d GraphAction.DELETE_ENTITY:"},{"line_number":42,"context_line":"            return entity_event[DSProps.EVENT_TYPE]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        datasource_action \u003d entity_event[DSProps.DATASOURCE_ACTION]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if datasource_action in \\"},{"line_number":47,"context_line":"            (DatasourceAction.UPDATE, DatasourceAction.SNAPSHOT):"},{"line_number":48,"context_line":"            return GraphAction.DELETE_ENTITY if self._ok_status(entity_event) else \\"},{"line_number":49,"context_line":"                self.GRAPH_ACTION_MAPPING.get("},{"line_number":50,"context_line":"                entity_event.get(DSProps.EVENT_TYPE, None),"},{"line_number":51,"context_line":"                GraphAction.UPDATE_ENTITY)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if DatasourceAction.INIT_SNAPSHOT \u003d\u003d datasource_action:"},{"line_number":54,"context_line":"            return GraphAction.CREATE_ENTITY"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        raise VitrageTransformerError(\u0027Invalid datasource action: (%s)\u0027"},{"line_number":57,"context_line":"                                      % datasource_action)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def create_placeholder_vertex(self, **kwargs):"},{"line_number":60,"context_line":"        LOG.info(\u0027An alarm cannot be a placeholder\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_ae88bce8","line":57,"range":{"start_line":36,"start_character":1,"end_line":57,"end_character":58},"in_reply_to":"da4df55a_d36f8890","updated":"2016-12-23 01:19:54.000000000","message":"This is to restore my previouse change https://review.openstack.org/#/c/400473/. I move checking alarm with \u0027OK\u0027 state to be deleted from transformer to driver. So the alarm with GraphAction will be cached, it will cause some mis-handling. So i restore it, may be extract the GraphAction in the transformer is reasonable.","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}],"vitrage/datasources/aodh/__init__.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"924d51576912977498f4e1b016b222751758b33c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    \u0027Pull: updates every [changes_interval] seconds.\u0027"},{"line_number":34,"context_line":"                    \u0027Push: updates by getting notifications from the\u0027"},{"line_number":35,"context_line":"                    \u0027 datasource itself.\u0027,"},{"line_number":36,"context_line":"               required\u003dTrue),"},{"line_number":37,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_d38dd57c","line":36,"range":{"start_line":36,"start_character":29,"end_line":36,"end_character":30},"updated":"2016-12-13 06:42:44.000000000","message":"Please restore the changes_interval. \nWe would like to let the user configure whether Aodh datasource should work in PUSH or PULL mode. The default will be PUSH from now on, but we still want to support PULL as well.","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"aa60eeb39876bb1bb80f386b3e58a53d5b25437a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    \u0027Pull: updates every [changes_interval] seconds.\u0027"},{"line_number":34,"context_line":"                    \u0027Push: updates by getting notifications from the\u0027"},{"line_number":35,"context_line":"                    \u0027 datasource itself.\u0027,"},{"line_number":36,"context_line":"               required\u003dTrue),"},{"line_number":37,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_1718181d","line":36,"range":{"start_line":36,"start_character":29,"end_line":36,"end_character":30},"in_reply_to":"1a6eadb0_d38dd57c","updated":"2016-12-13 07:14:12.000000000","message":"Only the updatmethod is pull, the changes_interval is needed, right? The default is PUSH, so why do we need the changes_interval?","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    \u0027Pull: updates every [changes_interval] seconds.\u0027"},{"line_number":34,"context_line":"                    \u0027Push: updates by getting notifications from the\u0027"},{"line_number":35,"context_line":"                    \u0027 datasource itself.\u0027,"},{"line_number":36,"context_line":"               required\u003dTrue),"},{"line_number":37,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_168b4d69","line":36,"range":{"start_line":36,"start_character":1,"end_line":36,"end_character":30},"updated":"2016-12-21 10:26:17.000000000","message":"Please restore the changes_interval. It defines the default interval, in case a user wants to use PULL method (this can be changed in the configuration). It is not likely to happen, but let\u0027s keep this configuration any way","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                    \u0027Pull: updates every [changes_interval] seconds.\u0027"},{"line_number":34,"context_line":"                    \u0027Push: updates by getting notifications from the\u0027"},{"line_number":35,"context_line":"                    \u0027 datasource itself.\u0027,"},{"line_number":36,"context_line":"               required\u003dTrue),"},{"line_number":37,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_d0ba35c0","line":36,"range":{"start_line":36,"start_character":1,"end_line":36,"end_character":30},"in_reply_to":"1a6eadb0_168b4d69","updated":"2016-12-22 01:03:52.000000000","message":"Ok","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"}],"vitrage/datasources/aodh/driver.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_c08d687d","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"updated":"2016-12-12 12:10:13.000000000","message":"There is already a \"cache\" in AlarmDriverBase. Can you use it? maybe it is no longer needed with this new cache? if there must be two completely different caches, then their names should indicate the difference.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"1959f587e69a55ac61900ddc6e31c1310b9cb6a3","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_d71dc010","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"in_reply_to":"1a6eadb0_47a58702","updated":"2016-12-13 07:03:10.000000000","message":"Where do you need to call the cache from a classmethod? \n\nI think you might be re-inventing the wheel... the AlarmDriverBase already handles this logic of when to delete an alarm or not. I looked at zabbix driver, which also handles notifications, and it does not handle the deletion logic at all. \n\nHaving two caches is very confusing, I don\u0027t think we should do it.\n\nIf you do have a problem with calling the instance cache from a static method, let\u0027s discuss it and see what can be changed. Maybe a certain method (in a base class) should not be declared static. But let\u0027s try to keep as much code in common as possible.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"faaf1a8cab5725aae1248aafa61be4f41a2d09a7","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_7f95ff30","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"in_reply_to":"1a6eadb0_b689a228","updated":"2016-12-16 00:40:49.000000000","message":"I saw it merged. But I think we still need a closure to pack the instance object in callback. When the callback is invoded with `callback()` instead of `instance.method()`, the instance object is not passed to `self`.\n\nIt seems not covered by test so far so surprisingly passed verification.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":21414,"name":"Yujun Zhang","email":"zhang.yujunz@zte.com.cn","username":"yujunz"},"change_message_id":"fa87f0c3a4120d995f0457be3dafccfc404c79c6","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_e80ee039","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"in_reply_to":"1a6eadb0_d71dc010","updated":"2016-12-15 10:23:52.000000000","message":"It seems the callback is used everywhere. We need \n\n1) either change all usage of it \n2) or create a closure to refer the context","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0b3bc4e6557059288e31cd914d7cd160e4479ea6","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_b689a228","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"in_reply_to":"1a6eadb0_e80ee039","updated":"2016-12-15 12:29:45.000000000","message":"Yes, I see it now. I created a change for making enrich_event non-static. Hope it will pass the tests. See https://review.openstack.org/411287","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"f813196166ec9b2acefab0c1556dac9bd7bcab89","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_47a58702","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"in_reply_to":"3a71b18c_438082bf","updated":"2016-12-13 04:12:19.000000000","message":"The `classmethod` can\u0027t call the instance cache.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    cache_alarm \u003d dict()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, conf):"},{"line_number":35,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_438082bf","line":32,"range":{"start_line":32,"start_character":4,"end_line":32,"end_character":15},"in_reply_to":"3a71b18c_c08d687d","updated":"2016-12-12 13:08:30.000000000","message":"Ok, i\u0027ll fix it.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                self.cache_alarm[entity_alarm[AodhProps.ALARM_ID]] \u003d \\"},{"line_number":61,"context_line":"                    entity_alarm"},{"line_number":62,"context_line":"        except Exception as e:"},{"line_number":63,"context_line":"                LOG.exception(\"Exception: %s\", e)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_alarms(self):"},{"line_number":66,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_fa2cd34b","line":63,"range":{"start_line":63,"start_character":31,"end_line":63,"end_character":40},"updated":"2016-12-12 12:10:13.000000000","message":"Please add a meaningful comment, like:\n\"Failed to cache all alarms. Exception: ....","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                self.cache_alarm[entity_alarm[AodhProps.ALARM_ID]] \u003d \\"},{"line_number":61,"context_line":"                    entity_alarm"},{"line_number":62,"context_line":"        except Exception as e:"},{"line_number":63,"context_line":"                LOG.exception(\"Exception: %s\", e)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_alarms(self):"},{"line_number":66,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_e9740f9d","line":63,"range":{"start_line":63,"start_character":31,"end_line":63,"end_character":40},"in_reply_to":"3a71b18c_fa2cd34b","updated":"2016-12-12 13:08:30.000000000","message":"fix it.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @classmethod"},{"line_number":180,"context_line":"    def _convert_detail_event(cls, event):"},{"line_number":181,"context_line":"        alarm_info \u003d event[\u0027detail\u0027]"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        entity_detail \u003d {"},{"line_number":184,"context_line":"            AodhProps.DESCRIPTION: alarm_info[AodhProps.DESCRIPTION],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_9dc2f983","line":181,"range":{"start_line":181,"start_character":28,"end_line":181,"end_character":34},"updated":"2016-12-12 12:10:13.000000000","message":"Can you add \u0027detail\u0027 and \u0027rule\u0027 to AodhProps?","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"f813196166ec9b2acefab0c1556dac9bd7bcab89","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @classmethod"},{"line_number":180,"context_line":"    def _convert_detail_event(cls, event):"},{"line_number":181,"context_line":"        alarm_info \u003d event[\u0027detail\u0027]"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        entity_detail \u003d {"},{"line_number":184,"context_line":"            AodhProps.DESCRIPTION: alarm_info[AodhProps.DESCRIPTION],"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_0e372cb1","line":181,"range":{"start_line":181,"start_character":28,"end_line":181,"end_character":34},"in_reply_to":"3a71b18c_419b1766","updated":"2016-12-13 04:12:19.000000000","message":"ok, fix it.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"88af1532687a81ef6e8ffe8a46c5bb238f2963f9","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @classmethod"},{"line_number":180,"context_line":"    def _convert_detail_event(cls, event):"},{"line_number":181,"context_line":"        alarm_info \u003d event[\u0027detail\u0027]"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        entity_detail \u003d {"},{"line_number":184,"context_line":"            AodhProps.DESCRIPTION: alarm_info[AodhProps.DESCRIPTION],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_419b1766","line":181,"range":{"start_line":181,"start_character":28,"end_line":181,"end_character":34},"in_reply_to":"3a71b18c_8911db54","updated":"2016-12-12 14:12:54.000000000","message":"I know, but in vitrage we define such properties in a class","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @classmethod"},{"line_number":180,"context_line":"    def _convert_detail_event(cls, event):"},{"line_number":181,"context_line":"        alarm_info \u003d event[\u0027detail\u0027]"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        entity_detail \u003d {"},{"line_number":184,"context_line":"            AodhProps.DESCRIPTION: alarm_info[AodhProps.DESCRIPTION],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_8911db54","line":181,"range":{"start_line":181,"start_character":28,"end_line":181,"end_character":34},"in_reply_to":"3a71b18c_9dc2f983","updated":"2016-12-12 13:08:30.000000000","message":"Is it necessary? We only use \u0027detail\u0027 and \u0027rule\u0027 to extract the necessary alarm properties.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            AodhProps.TYPE: alarm_info[AodhProps.TYPE]"},{"line_number":190,"context_line":"        }"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if _is_vitrage_alarm(alarm_info[\u0027rule\u0027]):"},{"line_number":193,"context_line":"            entity_detail[AodhProps.VITRAGE_ID] \u003d \\"},{"line_number":194,"context_line":"                _parse_query(alarm_info[\u0027rule\u0027],"},{"line_number":195,"context_line":"                             AodhProps.VITRAGE_ID)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_7dfa7dbe","line":192,"range":{"start_line":192,"start_character":29,"end_line":192,"end_character":47},"updated":"2016-12-12 12:10:13.000000000","message":"I think you can create a parameter for it, like:\nalarm_rule \u003d alarm_info[\u0027rule\u0027]\n\nAlso, this if-else block is quite confusing. I would separate it to several functions, like _convert_detail_threashold_event etc.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            AodhProps.TYPE: alarm_info[AodhProps.TYPE]"},{"line_number":190,"context_line":"        }"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if _is_vitrage_alarm(alarm_info[\u0027rule\u0027]):"},{"line_number":193,"context_line":"            entity_detail[AodhProps.VITRAGE_ID] \u003d \\"},{"line_number":194,"context_line":"                _parse_query(alarm_info[\u0027rule\u0027],"},{"line_number":195,"context_line":"                             AodhProps.VITRAGE_ID)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_8938fbd4","line":192,"range":{"start_line":192,"start_character":29,"end_line":192,"end_character":47},"in_reply_to":"3a71b18c_7dfa7dbe","updated":"2016-12-12 13:08:30.000000000","message":"OK,i\u0027ll fix it.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        cls.cache_alarm[entity[AodhProps.ALARM_ID]] \u003d entity"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        # alarm without alarm state  will not created"},{"line_number":223,"context_line":"        if AodhState.ALARM !\u003d entity[AodhProps.STATE] or \\"},{"line_number":224,"context_line":"            _is_vitrage_alarm(event[\u0027detail\u0027][\u0027rule\u0027]):"},{"line_number":225,"context_line":"            return None"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        return entity"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_fd120db3","line":224,"range":{"start_line":223,"start_character":0,"end_line":224,"end_character":55},"updated":"2016-12-12 12:10:13.000000000","message":"I\u0027m not sure about this condition.\n\n1. alarms that are ok now, but used to be in alarm state - we do want create them and pass them to the evaluator\n\n2. why not create vitrage alarms? in the current get-all implementation, we identify that an aodh alarm is a vitrage alarm, and add aodh data to the original vitrage alarm. See _create_merge_alarm_vertex() in the transformer. Note that this code is a patch that will soon be improved, once we finish rewriting the vitrage-id.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"f813196166ec9b2acefab0c1556dac9bd7bcab89","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        cls.cache_alarm[entity[AodhProps.ALARM_ID]] \u003d entity"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        # alarm without alarm state  will not created"},{"line_number":223,"context_line":"        if AodhState.ALARM !\u003d entity[AodhProps.STATE] or \\"},{"line_number":224,"context_line":"            _is_vitrage_alarm(event[\u0027detail\u0027][\u0027rule\u0027]):"},{"line_number":225,"context_line":"            return None"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        return entity"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_8e4b3c2b","line":224,"range":{"start_line":223,"start_character":0,"end_line":224,"end_character":55},"in_reply_to":"3a71b18c_41e957b6","updated":"2016-12-13 04:12:19.000000000","message":"Done","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"88af1532687a81ef6e8ffe8a46c5bb238f2963f9","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        cls.cache_alarm[entity[AodhProps.ALARM_ID]] \u003d entity"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        # alarm without alarm state  will not created"},{"line_number":223,"context_line":"        if AodhState.ALARM !\u003d entity[AodhProps.STATE] or \\"},{"line_number":224,"context_line":"            _is_vitrage_alarm(event[\u0027detail\u0027][\u0027rule\u0027]):"},{"line_number":225,"context_line":"            return None"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        return entity"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_41e957b6","line":224,"range":{"start_line":223,"start_character":0,"end_line":224,"end_character":55},"in_reply_to":"3a71b18c_4e0b4924","updated":"2016-12-12 14:12:54.000000000","message":"1) ok. might be a good idea to add a comment, because it is not obvious (too many cases here...)","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        cls.cache_alarm[entity[AodhProps.ALARM_ID]] \u003d entity"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        # alarm without alarm state  will not created"},{"line_number":223,"context_line":"        if AodhState.ALARM !\u003d entity[AodhProps.STATE] or \\"},{"line_number":224,"context_line":"            _is_vitrage_alarm(event[\u0027detail\u0027][\u0027rule\u0027]):"},{"line_number":225,"context_line":"            return None"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        return entity"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_4e0b4924","line":224,"range":{"start_line":223,"start_character":0,"end_line":224,"end_character":55},"in_reply_to":"3a71b18c_fd120db3","updated":"2016-12-12 13:08:30.000000000","message":"for 1) It\u0027s alarm creation notification, no old state, so we don\u0027t need to create it in the Graph.\n\n2)OK, we need to update the aodh data to the original vitrage alarm. I\u0027ll fix it.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        entity \u003d {}"},{"line_number":248,"context_line":"        changed_rule \u003d event[\u0027detail\u0027]"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":251,"context_line":"            if alarm_rule \u003d\u003d \u0027rule\u0027:"},{"line_number":252,"context_line":"                entity.update(cls._parse_changed_rule("},{"line_number":253,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":254,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":255,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        cache_entity \u003d cls.cache_alarm[event[AodhProps.ALARM_ID]]"},{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_7d551d4e","line":255,"range":{"start_line":250,"start_character":0,"end_line":255,"end_character":47},"updated":"2016-12-12 12:10:13.000000000","message":"This is not clear. Can you add a comment with examples of the different cases you are handling?","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"88af1532687a81ef6e8ffe8a46c5bb238f2963f9","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        entity \u003d {}"},{"line_number":248,"context_line":"        changed_rule \u003d event[\u0027detail\u0027]"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":251,"context_line":"            if alarm_rule \u003d\u003d \u0027rule\u0027:"},{"line_number":252,"context_line":"                entity.update(cls._parse_changed_rule("},{"line_number":253,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":254,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":255,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        cache_entity \u003d cls.cache_alarm[event[AodhProps.ALARM_ID]]"},{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_c143a7ad","line":255,"range":{"start_line":250,"start_character":0,"end_line":255,"end_character":47},"in_reply_to":"3a71b18c_0ec0714f","updated":"2016-12-12 14:12:54.000000000","message":"Ok, please add this example as a comment.\nBTW, we need to think about the rule change... I understand that aodh allow this, and the alarm id is the same, but isn\u0027t it logically a new alarm? let\u0027s keep your code for now, but I think in the future we might prefer to delete the old alarm and create a new one, since the meaning is completely different. On the other hand, this is Aodh\u0027s logic, not ours.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        entity \u003d {}"},{"line_number":248,"context_line":"        changed_rule \u003d event[\u0027detail\u0027]"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":251,"context_line":"            if alarm_rule \u003d\u003d \u0027rule\u0027:"},{"line_number":252,"context_line":"                entity.update(cls._parse_changed_rule("},{"line_number":253,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":254,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":255,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        cache_entity \u003d cls.cache_alarm[event[AodhProps.ALARM_ID]]"},{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_0ec0714f","line":255,"range":{"start_line":250,"start_character":0,"end_line":255,"end_character":47},"in_reply_to":"3a71b18c_7d551d4e","updated":"2016-12-12 13:08:30.000000000","message":"For example:\n\"detail\": {\"severity\": \"critical\",\n           \"rule\":\n                 {\"query\": [{\"field\": \"traits.resource_id\",\n                              \"type\": \"\",\n                              \"value\": \"1\",\n                              \"op\": \"eq\"}],\n                   \"event_type\": \"instance.update\"}}\nThe changed rules may include the \"query\" item which is affected the resource or other alarm properties.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_401dd860","line":261,"range":{"start_line":261,"start_character":8,"end_line":261,"end_character":60},"updated":"2016-12-12 12:10:13.000000000","message":"Right. In case the resource has changed, do you delete the old edge? I\u0027m not sure this is trivial. I don\u0027t think that we handled it so far.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_4eea6975","line":261,"range":{"start_line":261,"start_character":8,"end_line":261,"end_character":60},"in_reply_to":"3a71b18c_401dd860","updated":"2016-12-12 13:08:30.000000000","message":"we already handle this condition. In update_entity, we do the two steps about _update_neighbors\n1. Removes old neighbor connections\n2. connects the new neighbors.\nSee https://github.com/openstack/vitrage/blob/master/vitrage/entity_graph/processor/processor.py#L101.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"88af1532687a81ef6e8ffe8a46c5bb238f2963f9","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_410eb78c","line":261,"range":{"start_line":261,"start_character":8,"end_line":261,"end_character":60},"in_reply_to":"3a71b18c_4eea6975","updated":"2016-12-12 14:12:54.000000000","message":"ok","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        return cache_entity"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_80145044","line":264,"range":{"start_line":261,"start_character":0,"end_line":264,"end_character":23},"updated":"2016-12-12 12:10:13.000000000","message":"Don\u0027t you need to check the new state as well?","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"88af1532687a81ef6e8ffe8a46c5bb238f2963f9","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        return cache_entity"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_c14807b6","line":264,"range":{"start_line":261,"start_character":0,"end_line":264,"end_character":23},"in_reply_to":"3a71b18c_6e7d651b","updated":"2016-12-12 14:12:54.000000000","message":"Are you sure? I think that if you change the rule, the state will most likely change as a result","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"bdd9f358caf4a5d037ef540482a86fbfdd7b0f75","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        return cache_entity"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_6e7d651b","line":264,"range":{"start_line":261,"start_character":0,"end_line":264,"end_character":23},"in_reply_to":"3a71b18c_80145044","updated":"2016-12-12 13:08:30.000000000","message":"No, state change is another notification. The rule change notification don\u0027t include the state change.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"f813196166ec9b2acefab0c1556dac9bd7bcab89","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        old_state \u003d cache_entity[AodhProps.STATE]"},{"line_number":259,"context_line":"        cache_entity.update(entity)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        # 1.entity in Graph, need to update the relationship"},{"line_number":262,"context_line":"        # 2.entity not in Graph, only need to update the cache"},{"line_number":263,"context_line":"        if old_state !\u003d AodhState.ALARM:"},{"line_number":264,"context_line":"            return None"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        return cache_entity"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_4ef3e40a","line":264,"range":{"start_line":261,"start_character":0,"end_line":264,"end_character":23},"in_reply_to":"3a71b18c_c14807b6","updated":"2016-12-13 04:12:19.000000000","message":"If we only update the alarm rule, the alarm state will not changed. But the `aodh alarm update` cli can also carry the `state` to change the alarm state and send `alarm rule change` notification. I\u0027ll fix it here.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"924d51576912977498f4e1b016b222751758b33c","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        elif entity_detail[AodhProps.TYPE] \u003d\u003d AodhProps.THRESHOLD:"},{"line_number":219,"context_line":"            entity_detail.update("},{"line_number":220,"context_line":"                cls._convert_threshold_alarm_event(alarm_rule))"},{"line_number":221,"context_line":"            entity_detail[AodhProps.STATE_TIMESTAMP] \u003d \\"},{"line_number":222,"context_line":"                event[AodhProps.STATE_TIMESTAMP]"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        return entity_detail"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_d3bb150d","line":222,"range":{"start_line":221,"start_character":12,"end_line":222,"end_character":48},"updated":"2016-12-13 06:42:44.000000000","message":"Why does this appear separately, and not part of the _convert_threshold_alarm_event?","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"aa60eeb39876bb1bb80f386b3e58a53d5b25437a","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        elif entity_detail[AodhProps.TYPE] \u003d\u003d AodhProps.THRESHOLD:"},{"line_number":219,"context_line":"            entity_detail.update("},{"line_number":220,"context_line":"                cls._convert_threshold_alarm_event(alarm_rule))"},{"line_number":221,"context_line":"            entity_detail[AodhProps.STATE_TIMESTAMP] \u003d \\"},{"line_number":222,"context_line":"                event[AodhProps.STATE_TIMESTAMP]"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        return entity_detail"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_17bc9804","line":222,"range":{"start_line":221,"start_character":12,"end_line":222,"end_character":48},"in_reply_to":"1a6eadb0_d3bb150d","updated":"2016-12-13 07:14:12.000000000","message":"Done","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"924d51576912977498f4e1b016b222751758b33c","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        cls.cache_alarm[entity[AodhProps.ALARM_ID]] \u003d entity"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # alarm create without alarm state will not create in the Graph"},{"line_number":235,"context_line":"        if AodhState.ALARM !\u003d entity[AodhProps.STATE]:"},{"line_number":236,"context_line":"            return None"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_936fdd91","line":234,"range":{"start_line":234,"start_character":31,"end_line":234,"end_character":36},"updated":"2016-12-13 06:42:44.000000000","message":"alarm state - this sounds like the state field of the alarm. You were trying to say that the state should equal \u0027alarm\u0027. \\\nMaybe write:\na created alarm that its state is not \u0027alarm\u0027 will not be created in the graph\nOr something similar, as long as it is clear that the state is \u0027alarm\u0027 vs. \u0027ok\u0027.","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"aa60eeb39876bb1bb80f386b3e58a53d5b25437a","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        cls.cache_alarm[entity[AodhProps.ALARM_ID]] \u003d entity"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # alarm create without alarm state will not create in the Graph"},{"line_number":235,"context_line":"        if AodhState.ALARM !\u003d entity[AodhProps.STATE]:"},{"line_number":236,"context_line":"            return None"},{"line_number":237,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_f790fc97","line":234,"range":{"start_line":234,"start_character":31,"end_line":234,"end_character":36},"in_reply_to":"1a6eadb0_936fdd91","updated":"2016-12-13 07:14:12.000000000","message":"Done","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"924d51576912977498f4e1b016b222751758b33c","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                        GraphAction.CREATE_ENTITY"},{"line_number":294,"context_line":"        else:"},{"line_number":295,"context_line":"            if old_state !\u003d AodhState.ALARM:"},{"line_number":296,"context_line":"                cache_entity.update(entity)"},{"line_number":297,"context_line":"                return None"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        cache_entity.update(entity)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_d3eeb5eb","line":296,"range":{"start_line":296,"start_character":16,"end_line":296,"end_character":43},"updated":"2016-12-13 06:42:44.000000000","message":"You are calling cache_entity.update() two lines below for all entities","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"da42c872782c2629153d77aa8d54272f064fd3c5","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                        GraphAction.CREATE_ENTITY"},{"line_number":294,"context_line":"        else:"},{"line_number":295,"context_line":"            if old_state !\u003d AodhState.ALARM:"},{"line_number":296,"context_line":"                cache_entity.update(entity)"},{"line_number":297,"context_line":"                return None"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        cache_entity.update(entity)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_773b0cec","line":296,"range":{"start_line":296,"start_character":16,"end_line":296,"end_character":43},"in_reply_to":"1a6eadb0_b7968492","updated":"2016-12-13 07:19:15.000000000","message":"Right, I missed that","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"aa60eeb39876bb1bb80f386b3e58a53d5b25437a","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                        GraphAction.CREATE_ENTITY"},{"line_number":294,"context_line":"        else:"},{"line_number":295,"context_line":"            if old_state !\u003d AodhState.ALARM:"},{"line_number":296,"context_line":"                cache_entity.update(entity)"},{"line_number":297,"context_line":"                return None"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        cache_entity.update(entity)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_b7968492","line":296,"range":{"start_line":296,"start_character":16,"end_line":296,"end_character":43},"in_reply_to":"1a6eadb0_d3eeb5eb","updated":"2016-12-13 07:14:12.000000000","message":"No, here return.","commit_id":"66f276585b1352485403455467c02344a85258a1"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    cache_alarm \u003d dict()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, conf):"},{"line_number":36,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_363849a0","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":15},"updated":"2016-12-21 10:26:17.000000000","message":"Are you still using this cache? can it be removed?","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class AodhDriver(AlarmDriverBase):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    cache_alarm \u003d dict()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, conf):"},{"line_number":36,"context_line":"        super(AodhDriver, self).__init__()"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_70c42940","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":15},"in_reply_to":"1a6eadb0_363849a0","updated":"2016-12-22 01:03:52.000000000","message":"Sorry,forgot to remove.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        changed_rule \u003d event[AodhProps.DETAIL]"},{"line_number":261,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":262,"context_line":"            if alarm_rule \u003d\u003d AodhProps.RULE:"},{"line_number":263,"context_line":"                entity.update(self._parse_changed_rule("},{"line_number":264,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":265,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":266,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return self._filter_and_cache_alarm(entity,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_5b9b2e18","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":59},"updated":"2016-12-21 10:26:17.000000000","message":"Can you explain this if-elif cases? The example you wrote in the beginning of the function is of the first \u0027if\u0027? and about the elif part - what value can the alarm_rule have?","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        changed_rule \u003d event[AodhProps.DETAIL]"},{"line_number":261,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":262,"context_line":"            if alarm_rule \u003d\u003d AodhProps.RULE:"},{"line_number":263,"context_line":"                entity.update(self._parse_changed_rule("},{"line_number":264,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":265,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":266,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return self._filter_and_cache_alarm(entity,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_30546153","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":59},"in_reply_to":"1a6eadb0_5b9b2e18","updated":"2016-12-22 01:03:52.000000000","message":"In the \u0027if\u0027 case, it handle the \u0027rule\u0027 which may effect the neighbor; in the \u0027else\u0027 case, it handle the alarm other properties like \u0027severity\u0027, \u0027type\u0027 \u0027enabled\u0027 and so on.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"cd4de7c1a8b769eef2904c473128401e4f3d4798","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        changed_rule \u003d event[AodhProps.DETAIL]"},{"line_number":261,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":262,"context_line":"            if alarm_rule \u003d\u003d AodhProps.RULE:"},{"line_number":263,"context_line":"                entity.update(self._parse_changed_rule("},{"line_number":264,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":265,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":266,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return self._filter_and_cache_alarm(entity,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_733c2a30","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":59},"in_reply_to":"da4df55a_30546153","updated":"2016-12-22 07:35:52.000000000","message":"I\u0027m sorry for asking the same question over and over again... but I still don\u0027t fully understand. In the example above, the first alarm_rule will be \u0027severity\u0027 and it will enter the elif, and the second alarm_rule will be \u0027rule\u0027 and it will enter the if?\nPlease add an explanation. And I\u0027m not sure that alarm_rule is the best name for this parameter, because it might be confusing that sometimes it is \u0027rule\u0027 and sometimes something else.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"895df0ba7327f5ea2754974efba3a54bcc9c3d16","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        changed_rule \u003d event[AodhProps.DETAIL]"},{"line_number":261,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":262,"context_line":"            if alarm_rule \u003d\u003d AodhProps.RULE:"},{"line_number":263,"context_line":"                entity.update(self._parse_changed_rule("},{"line_number":264,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":265,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":266,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return self._filter_and_cache_alarm(entity,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_8bddce72","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":59},"in_reply_to":"da4df55a_68b990e9","updated":"2016-12-22 09:27:28.000000000","message":"Maybe change_type and change_info?\nAnd please add more examples in the comment, because most people (everyone except you ;-)) don\u0027t know what the notification looks like","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"cbd8255be49f9c30bb47b2527368abf6f726a261","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        changed_rule \u003d event[AodhProps.DETAIL]"},{"line_number":261,"context_line":"        for (alarm_rule, alarm_info) in changed_rule.items():"},{"line_number":262,"context_line":"            if alarm_rule \u003d\u003d AodhProps.RULE:"},{"line_number":263,"context_line":"                entity.update(self._parse_changed_rule("},{"line_number":264,"context_line":"                    changed_rule[alarm_rule]))"},{"line_number":265,"context_line":"            elif alarm_rule in AodhProps.__dict__.values():"},{"line_number":266,"context_line":"                entity[alarm_rule] \u003d alarm_info"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        return self._filter_and_cache_alarm(entity,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_68b990e9","line":265,"range":{"start_line":262,"start_character":0,"end_line":265,"end_character":59},"in_reply_to":"da4df55a_733c2a30","updated":"2016-12-22 09:17:34.000000000","message":"It\u0027s OK.:) You\u0027re right. What about changed_alarm_properties?","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        entity \u003d old_alarm.copy()"},{"line_number":276,"context_line":"        entity[AodhProps.STATE] \u003d event[AodhProps.DETAIL][AodhProps.STATE]"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        return self._filter_and_cache_alarm(entity,"},{"line_number":279,"context_line":"                                            self._filter_get_change,"},{"line_number":280,"context_line":"                                            datetime_utils.utcnow(False))"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_3b191289","line":278,"range":{"start_line":278,"start_character":20,"end_line":278,"end_character":43},"updated":"2016-12-21 10:26:17.000000000","message":"_filter_and_cache_alarm will get the old_alarm from the cache again, right? so why do it twice? you can pass the old_alarm and the new entity to the _filter_and_cache_alarm function","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        entity \u003d old_alarm.copy()"},{"line_number":276,"context_line":"        entity[AodhProps.STATE] \u003d event[AodhProps.DETAIL][AodhProps.STATE]"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        return self._filter_and_cache_alarm(entity,"},{"line_number":279,"context_line":"                                            self._filter_get_change,"},{"line_number":280,"context_line":"                                            datetime_utils.utcnow(False))"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_7081898f","line":278,"range":{"start_line":278,"start_character":20,"end_line":278,"end_character":43},"in_reply_to":"1a6eadb0_3b191289","updated":"2016-12-22 01:03:52.000000000","message":"The new alarm may not include all the alarm properties. If the alarm is updated in the cache, it may rewrite the old alarm and lost the properties which is written in the alarm_create notification. So i get the old alarms with full properties and update the change.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"cbd8255be49f9c30bb47b2527368abf6f726a261","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        entity \u003d old_alarm.copy()"},{"line_number":276,"context_line":"        entity[AodhProps.STATE] \u003d event[AodhProps.DETAIL][AodhProps.STATE]"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        return self._filter_and_cache_alarm(entity,"},{"line_number":279,"context_line":"                                            self._filter_get_change,"},{"line_number":280,"context_line":"                                            datetime_utils.utcnow(False))"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_88f8747e","line":278,"range":{"start_line":278,"start_character":20,"end_line":278,"end_character":43},"in_reply_to":"da4df55a_33e2a204","updated":"2016-12-22 09:17:34.000000000","message":"Ok,i\u0027ll fix it. All the properties are checked in the test cases.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"cd4de7c1a8b769eef2904c473128401e4f3d4798","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        entity \u003d old_alarm.copy()"},{"line_number":276,"context_line":"        entity[AodhProps.STATE] \u003d event[AodhProps.DETAIL][AodhProps.STATE]"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        return self._filter_and_cache_alarm(entity,"},{"line_number":279,"context_line":"                                            self._filter_get_change,"},{"line_number":280,"context_line":"                                            datetime_utils.utcnow(False))"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_33e2a204","line":278,"range":{"start_line":278,"start_character":20,"end_line":278,"end_character":43},"in_reply_to":"da4df55a_7081898f","updated":"2016-12-22 07:35:52.000000000","message":"I understand that (but it might be a good idea to add a comment about it). What I meant is that the same two lines appear here, and in the beginning of _filter_and_cache_alarm:\n        alarm_key \u003d self._alarm_key(alarm)\n        old_alarm \u003d self.cache.get(alarm_key, (None, None))[0]\nSo you might want to pass the old alarm to _filter_and_cache_alarm instead of retrieving it again.\nAlso, it\u0027s important to check in your tests that no property is deleted from the old alarm after this function in called.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"e8d4b7c2907034d56e364e8472422ffaa3a3d553","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        alarm_key \u003d self._alarm_key(event)"},{"line_number":284,"context_line":"        alarm \u003d self.cache.pop(alarm_key)[0]"},{"line_number":285,"context_line":"        alarm[DSProps.EVENT_TYPE] \u003d GraphAction.DELETE_ENTITY"},{"line_number":286,"context_line":"        return alarm"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"def _parse_query(data, key):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_7b0f0a39","line":286,"range":{"start_line":286,"start_character":15,"end_line":286,"end_character":20},"updated":"2016-12-21 10:26:17.000000000","message":"No need to filter here?","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"fb413ad8751bcf5fcf35d1291506b9588b4afd5a","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        alarm_key \u003d self._alarm_key(event)"},{"line_number":284,"context_line":"        alarm \u003d self.cache.pop(alarm_key)[0]"},{"line_number":285,"context_line":"        alarm[DSProps.EVENT_TYPE] \u003d GraphAction.DELETE_ENTITY"},{"line_number":286,"context_line":"        return alarm"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"def _parse_query(data, key):"}],"source_content_type":"text/x-python","patch_set":10,"id":"da4df55a_7058a957","line":286,"range":{"start_line":286,"start_character":15,"end_line":286,"end_character":20},"in_reply_to":"1a6eadb0_7b0f0a39","updated":"2016-12-22 01:03:52.000000000","message":"Oh, fix it.","commit_id":"d3670e7e04d69d6cb44e60f66d778f3d13e14f37"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        super(AodhDriver, self).__init__()"},{"line_number":35,"context_line":"        self._client \u003d None"},{"line_number":36,"context_line":"        self.conf \u003d conf"},{"line_number":37,"context_line":"        self._cache_all_alarms()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_ee358df7","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":32},"updated":"2016-12-22 08:21:32.000000000","message":"You don\u0027t need this call, because in the initializing stage of Vitrage it calls the get all of all the datasources including aodh, and thus the alarms are written to the cache.","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"e15445ccdfaeeae8d277fbd327c2076960b66d92","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        super(AodhDriver, self).__init__()"},{"line_number":35,"context_line":"        self._client \u003d None"},{"line_number":36,"context_line":"        self.conf \u003d conf"},{"line_number":37,"context_line":"        self._cache_all_alarms()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_17c101e5","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":32},"in_reply_to":"da4df55a_2b306256","updated":"2016-12-22 11:11:09.000000000","message":"I know it can be reload the _filter_get_all. I still have some quesions. In the snapshot and listener server, the Aodh instance is the same one. The init_snapshot want to get all alarms with \"alarm\" state in initializing stage and cache them. We still have to call `_cache_all_alarms()` in AodhDriver construct to cache all alarms. Is that right?","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"68dd6c85ccfcc9b4b3c3fb5a95399c955b8c824b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        super(AodhDriver, self).__init__()"},{"line_number":35,"context_line":"        self._client \u003d None"},{"line_number":36,"context_line":"        self.conf \u003d conf"},{"line_number":37,"context_line":"        self._cache_all_alarms()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_f41c8079","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":32},"in_reply_to":"da4df55a_ee358df7","updated":"2016-12-22 09:22:29.000000000","message":"The init-snapshot get all alarms with \"alarm\" states, but here i want to cache all alarms with all states.","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"871c624fd159faeadd844fb35a5026ef3d197a92","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        super(AodhDriver, self).__init__()"},{"line_number":35,"context_line":"        self._client \u003d None"},{"line_number":36,"context_line":"        self.conf \u003d conf"},{"line_number":37,"context_line":"        self._cache_all_alarms()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_2b306256","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":32},"in_reply_to":"da4df55a_f41c8079","updated":"2016-12-22 09:35:28.000000000","message":"Hi Dong,\nI see your point.\nI have then an even better proposal:\n1. remove this method and it\u0027s implementation.\n2. add here an implementation of the original _filter_get_all method and put your new implementation for the method with only the _is_valid checking.\n3. in AlarmDriverBase we will only 2 methods without the new method that you have added, so we will have the original _filter_get_all  and the _filter_get_change as they were, and now we have the implementation for _filter_get_all of aodh to be different.\n4. Change in AlarmDriverBase the _get_all_alarms to call the self._filter_get_all instead of AlarmDriverBase._filter_get_all.\n\nAnd now everything will work, hopefully.\n\nSorry for all the trouble we make you do.","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def _alarm_key(self, alarm):"},{"line_number":49,"context_line":"        return alarm[AodhProps.ALARM_ID]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _cache_all_alarms(self):"},{"line_number":52,"context_line":"        alarms \u003d self._get_alarms()"},{"line_number":53,"context_line":"        self._filter_and_cache_alarms(alarms,"},{"line_number":54,"context_line":"                                      self._filter_get_all)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_alarms(self):"},{"line_number":57,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_6e227dbb","line":54,"range":{"start_line":51,"start_character":4,"end_line":54,"end_character":59},"updated":"2016-12-22 08:21:32.000000000","message":"no need for this method as well","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"68dd6c85ccfcc9b4b3c3fb5a95399c955b8c824b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def _alarm_key(self, alarm):"},{"line_number":49,"context_line":"        return alarm[AodhProps.ALARM_ID]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _cache_all_alarms(self):"},{"line_number":52,"context_line":"        alarms \u003d self._get_alarms()"},{"line_number":53,"context_line":"        self._filter_and_cache_alarms(alarms,"},{"line_number":54,"context_line":"                                      self._filter_get_all)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_alarms(self):"},{"line_number":57,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_540c6c42","line":54,"range":{"start_line":51,"start_character":4,"end_line":54,"end_character":59},"in_reply_to":"da4df55a_6e227dbb","updated":"2016-12-22 09:22:29.000000000","message":"same as above","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                AodhEventType.DELETION]"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def enrich_event(self, event, event_type):"},{"line_number":138,"context_line":"        if event_type \u003d\u003d AodhEventType.CREATION:"},{"line_number":139,"context_line":"            entity \u003d self._convert_alarm_creation_event(event)"},{"line_number":140,"context_line":"        elif event_type \u003d\u003d AodhEventType.RULE_CHANGE:"},{"line_number":141,"context_line":"            entity \u003d self._convert_alarm_rule_change_event(event)"},{"line_number":142,"context_line":"        elif event_type \u003d\u003d AodhEventType.STATE_TRANSITION:"},{"line_number":143,"context_line":"            entity \u003d self._convert_alarm_state_transition_event(event)"},{"line_number":144,"context_line":"        elif event_type \u003d\u003d AodhEventType.DELETION:"},{"line_number":145,"context_line":"            entity \u003d self._convert_alarm_deletion_event(event)"},{"line_number":146,"context_line":"        else:"},{"line_number":147,"context_line":"            LOG.warning(\u0027Unsupported Aodh event type %s\u0027 % event_type)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # Don\u0027t need to update entity, only update the cache"},{"line_number":150,"context_line":"        if entity is None:"},{"line_number":151,"context_line":"            return None"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not entity.get(DSProps.EVENT_TYPE):"},{"line_number":154,"context_line":"            entity[DSProps.EVENT_TYPE] \u003d event_type"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_b9c11131","line":151,"range":{"start_line":138,"start_character":8,"end_line":151,"end_character":23},"updated":"2016-12-22 08:21:32.000000000","message":"instead of writing those ifs please write the following method:\ndef _aodh_event_actions(self):\n   self.actions \u003d {\n      AodhEventType.CREATION: self._convert_alarm_creation_event(event)\n      AodhEventType.RULE_CHANGE: self._convert_alarm_rule_change_event(event)\n      AodhEventType.STATE_TRANSITION: self._convert_alarm_state_transition_event(event)\n      AodhEventType.DELETION: self._convert_alarm_deletion_event(event)\n   }\ncall this method in the aodh constructor, and then here in the enrich_event write:\nif event_type not in self.actions:\n   LOG.warning(\u0027Unsupported Aodh event type %s\u0027 % event_type)\n   return None\n\nentity \u003d self.actions[event_type]\n\nThis is much more robust solution.","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"68dd6c85ccfcc9b4b3c3fb5a95399c955b8c824b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                AodhEventType.DELETION]"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def enrich_event(self, event, event_type):"},{"line_number":138,"context_line":"        if event_type \u003d\u003d AodhEventType.CREATION:"},{"line_number":139,"context_line":"            entity \u003d self._convert_alarm_creation_event(event)"},{"line_number":140,"context_line":"        elif event_type \u003d\u003d AodhEventType.RULE_CHANGE:"},{"line_number":141,"context_line":"            entity \u003d self._convert_alarm_rule_change_event(event)"},{"line_number":142,"context_line":"        elif event_type \u003d\u003d AodhEventType.STATE_TRANSITION:"},{"line_number":143,"context_line":"            entity \u003d self._convert_alarm_state_transition_event(event)"},{"line_number":144,"context_line":"        elif event_type \u003d\u003d AodhEventType.DELETION:"},{"line_number":145,"context_line":"            entity \u003d self._convert_alarm_deletion_event(event)"},{"line_number":146,"context_line":"        else:"},{"line_number":147,"context_line":"            LOG.warning(\u0027Unsupported Aodh event type %s\u0027 % event_type)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # Don\u0027t need to update entity, only update the cache"},{"line_number":150,"context_line":"        if entity is None:"},{"line_number":151,"context_line":"            return None"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not entity.get(DSProps.EVENT_TYPE):"},{"line_number":154,"context_line":"            entity[DSProps.EVENT_TYPE] \u003d event_type"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_a837f8e1","line":151,"range":{"start_line":138,"start_character":8,"end_line":151,"end_character":23},"in_reply_to":"da4df55a_b9c11131","updated":"2016-12-22 09:22:29.000000000","message":"smart, i\u0027ll fix it. :)","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"4f24e3da799aa4f07e0453f980008322a0b2cebe","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self._client \u003d None"},{"line_number":35,"context_line":"        self.conf \u003d conf"},{"line_number":36,"context_line":"        self._cache_all_alarms()"},{"line_number":37,"context_line":"        self._init_aodh_event_actions()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_33829453","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":39},"updated":"2016-12-22 12:46:43.000000000","message":"sorry for the comment, but this should be before the _cache_all_alarms, because it may cause some problems if the actions aren\u0027t defined before the get_all","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"17f75400100ce24d092808af9708a009e32cf3f1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self._client \u003d None"},{"line_number":35,"context_line":"        self.conf \u003d conf"},{"line_number":36,"context_line":"        self._cache_all_alarms()"},{"line_number":37,"context_line":"        self._init_aodh_event_actions()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_027ec6ad","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":39},"in_reply_to":"da4df55a_1300e2a9","updated":"2016-12-26 01:23:23.000000000","message":"Ok :)","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self._client \u003d None"},{"line_number":35,"context_line":"        self.conf \u003d conf"},{"line_number":36,"context_line":"        self._cache_all_alarms()"},{"line_number":37,"context_line":"        self._init_aodh_event_actions()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_6ec174e4","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":39},"in_reply_to":"da4df55a_33829453","updated":"2016-12-23 01:19:54.000000000","message":"Don\u0027t quite understand.`_cache_all_alarms` don\u0027t do some actions. This is for the listener service, it is not started yet.","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"382ce936182da1b14034add71b1ddb1f55799667","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self._client \u003d None"},{"line_number":35,"context_line":"        self.conf \u003d conf"},{"line_number":36,"context_line":"        self._cache_all_alarms()"},{"line_number":37,"context_line":"        self._init_aodh_event_actions()"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def client(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_1300e2a9","line":37,"range":{"start_line":37,"start_character":8,"end_line":37,"end_character":39},"in_reply_to":"da4df55a_6ec174e4","updated":"2016-12-25 06:48:40.000000000","message":"Hi Dong,\nThe _cache_all_alarms calls the aodh api and receive all the alarms from aodh. this operation may take some time, and mean while we receive some aodh notifications via the oslo bus, then they will throw an error because the event_actions aren\u0027t defined yet. Due to that we should move the _init_aodh_event_actions method be before _cache_all_alarms method.\nThat is the last change :)","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}],"vitrage/datasources/listener_service.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"46c66dc240377a277b3081ec8d2c5a9e9f82982f","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _enqueue_events(self, enriched_events):"},{"line_number":97,"context_line":"        for event in enriched_events:"},{"line_number":98,"context_line":"            if event is not None:"},{"line_number":99,"context_line":"                self.enqueue_callback(event)"},{"line_number":100,"context_line":"                LOG.debug(\u0027EVENT ENQUEUED: \\n\u0027 + str(event))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_a0c22c83","line":98,"range":{"start_line":98,"start_character":12,"end_line":98,"end_character":32},"updated":"2016-12-12 12:10:13.000000000","message":"Why do you add this check? in what scenario did you have a None event?","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"f813196166ec9b2acefab0c1556dac9bd7bcab89","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _enqueue_events(self, enriched_events):"},{"line_number":97,"context_line":"        for event in enriched_events:"},{"line_number":98,"context_line":"            if event is not None:"},{"line_number":99,"context_line":"                self.enqueue_callback(event)"},{"line_number":100,"context_line":"                LOG.debug(\u0027EVENT ENQUEUED: \\n\u0027 + str(event))"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6eadb0_ae8638b7","line":98,"range":{"start_line":98,"start_character":12,"end_line":98,"end_character":32},"in_reply_to":"3a71b18c_a0c22c83","updated":"2016-12-13 04:12:19.000000000","message":"The alarm which is not needed to add in the Graph, only need to update the cache, the driver returns the None event.","commit_id":"7cb76332c9a2b47f63941c2cf42819f32b73a346"}],"vitrage/datasources/transformer_base.py":[{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"4f24e3da799aa4f07e0453f980008322a0b2cebe","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        :return: the action that the processor needs to perform"},{"line_number":213,"context_line":"        :rtype: str"},{"line_number":214,"context_line":"        \"\"\""},{"line_number":215,"context_line":"        datasource_action \u003d entity_event[DSProps.DATASOURCE_ACTION]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        if DatasourceAction.UPDATE \u003d\u003d datasource_action:"},{"line_number":218,"context_line":"            return self.GRAPH_ACTION_MAPPING.get("}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_f3f1ecce","line":215,"updated":"2016-12-22 12:46:43.000000000","message":"Why did you remove the section of code that was here?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        :return: the action that the processor needs to perform"},{"line_number":213,"context_line":"        :rtype: str"},{"line_number":214,"context_line":"        \"\"\""},{"line_number":215,"context_line":"        datasource_action \u003d entity_event[DSProps.DATASOURCE_ACTION]"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        if DatasourceAction.UPDATE \u003d\u003d datasource_action:"},{"line_number":218,"context_line":"            return self.GRAPH_ACTION_MAPPING.get("}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_ae727ce3","line":215,"in_reply_to":"da4df55a_f3f1ecce","updated":"2016-12-23 01:19:54.000000000","message":"Oh,this should not be removed.","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}],"vitrage/tests/unit/datasources/aodh/mock_driver.py":[{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":14,"context_line":"\r"},{"line_number":15,"context_line":"from vitrage.datasources.aodh.driver import AodhDriver\r"},{"line_number":16,"context_line":"\r"},{"line_number":17,"context_line":"\r"},{"line_number":18,"context_line":"class MockAodhDriver(AodhDriver):\r"},{"line_number":19,"context_line":"    \"\"\"A aodh driver for tests.\r"},{"line_number":20,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_7986c9ba","line":17,"updated":"2016-12-22 08:21:32.000000000","message":"do we really need this base class? now that we don\u0027t have that method","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"},{"author":{"_account_id":19122,"name":"Alexey Weyl","email":"aloshaweyl@gmail.com","username":"alexey_weyl"},"change_message_id":"eea0ae16d1fa5c649b8f2b3ad9474e78458a1e87","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    def __init__(self, conf):\r"},{"line_number":24,"context_line":"        super(MockAodhDriver, self).__init__(conf)\r"},{"line_number":25,"context_line":"\r"},{"line_number":26,"context_line":"    def _cache_all_alarms(self):\r"},{"line_number":27,"context_line":"        pass\r"}],"source_content_type":"text/x-python","patch_set":11,"id":"da4df55a_199f7d04","line":27,"range":{"start_line":26,"start_character":3,"end_line":27,"end_character":12},"updated":"2016-12-22 08:21:32.000000000","message":"no need for this test because we removed the method","commit_id":"83c33f4023ba5471ddb024913bcd0ff8689c5344"}],"vitrage/tests/unit/datasources/aodh/test_aodh_driver.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f227d29dc23664ced2b71e6b02b6b0c57036f7f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         alarm[AodhProps.SEVERITY])\r"},{"line_number":81,"context_line":"        self.assertEqual(entity[DSProps.EVENT_TYPE],\r"},{"line_number":82,"context_line":"                         AodhEventType.STATE_TRANSITION)\r"},{"line_number":83,"context_line":"        self.assertEqual(entity[DSProps.EVENT_TYPE],\r"},{"line_number":84,"context_line":"                         AodhEventType.STATE_TRANSITION)\r"},{"line_number":85,"context_line":"\r"},{"line_number":86,"context_line":"        # 3. delete alarm which is \u0027alarm\u0027 state\r"},{"line_number":87,"context_line":"        # prepare data\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_96116eaf","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":56},"updated":"2016-12-22 13:22:53.000000000","message":"Isn\u0027t it the same statement twice?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         alarm[AodhProps.SEVERITY])\r"},{"line_number":81,"context_line":"        self.assertEqual(entity[DSProps.EVENT_TYPE],\r"},{"line_number":82,"context_line":"                         AodhEventType.STATE_TRANSITION)\r"},{"line_number":83,"context_line":"        self.assertEqual(entity[DSProps.EVENT_TYPE],\r"},{"line_number":84,"context_line":"                         AodhEventType.STATE_TRANSITION)\r"},{"line_number":85,"context_line":"\r"},{"line_number":86,"context_line":"        # 3. delete alarm which is \u0027alarm\u0027 state\r"},{"line_number":87,"context_line":"        # prepare data\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_ee5ba452","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":56},"in_reply_to":"da4df55a_96116eaf","updated":"2016-12-23 01:19:54.000000000","message":"mistake.","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f227d29dc23664ced2b71e6b02b6b0c57036f7f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # Test assertions\r"},{"line_number":95,"context_line":"        self.assertIsNotNone(entity)\r"},{"line_number":96,"context_line":"        self._validate_aodh_entity_comm_props(entity, alarm_info)\r"},{"line_number":97,"context_line":"        self.assertEqual(entity[DSProps.EVENT_TYPE],\r"},{"line_number":98,"context_line":"                         AodhEventType.DELETION)\r"},{"line_number":99,"context_line":"\r"},{"line_number":100,"context_line":"        # 4. alarm creation with \u0027alarm\u0027 state\r"},{"line_number":101,"context_line":"        # prepare data\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_765a4a85","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":48},"updated":"2016-12-22 13:22:53.000000000","message":"Why did you remove the previous test with GraphAction.DELETE_ENTITY? don\u0027t we want to have them both?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # Test assertions\r"},{"line_number":95,"context_line":"        self.assertIsNotNone(entity)\r"},{"line_number":96,"context_line":"        self._validate_aodh_entity_comm_props(entity, alarm_info)\r"},{"line_number":97,"context_line":"        self.assertEqual(entity[DSProps.EVENT_TYPE],\r"},{"line_number":98,"context_line":"                         AodhEventType.DELETION)\r"},{"line_number":99,"context_line":"\r"},{"line_number":100,"context_line":"        # 4. alarm creation with \u0027alarm\u0027 state\r"},{"line_number":101,"context_line":"        # prepare data\r"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_4e183085","line":98,"range":{"start_line":97,"start_character":0,"end_line":98,"end_character":48},"in_reply_to":"da4df55a_765a4a85","updated":"2016-12-23 01:19:54.000000000","message":"This is handled in the transformer. Get the action from \u0027GRAPH_ACTION_MAPPING\u0027","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}],"vitrage/tests/unit/datasources/nagios/test_nagios_driver.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f227d29dc23664ced2b71e6b02b6b0c57036f7f","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.assertIsNotNone(services, \u0027No services returned\u0027)"},{"line_number":144,"context_line":"        self.assertEqual(2, len(services))"},{"line_number":145,"context_line":"        self._assert_contains(service_data1, services)"},{"line_number":146,"context_line":"        self._assert_contains(service_data2, services)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Action"},{"line_number":149,"context_line":"        services \u003d nagios_driver._get_all_alarms()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_b6dbd2ec","line":146,"range":{"start_line":146,"start_character":1,"end_line":146,"end_character":54},"updated":"2016-12-22 13:22:53.000000000","message":"Why did you remove the DELETE_ENTITY tests?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.assertIsNotNone(services, \u0027No services returned\u0027)"},{"line_number":144,"context_line":"        self.assertEqual(2, len(services))"},{"line_number":145,"context_line":"        self._assert_contains(service_data1, services)"},{"line_number":146,"context_line":"        self._assert_contains(service_data2, services)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        # Action"},{"line_number":149,"context_line":"        services \u003d nagios_driver._get_all_alarms()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_2e04cc15","line":146,"range":{"start_line":146,"start_character":1,"end_line":146,"end_character":54},"in_reply_to":"da4df55a_b6dbd2ec","updated":"2016-12-23 01:19:54.000000000","message":"restore the check to transformer.","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}],"vitrage/tests/unit/datasources/zabbix/test_zabbix_driver.py":[{"author":{"_account_id":19159,"name":"Ifat Afek","email":"ifat.afek@nokia.com","username":"ifat_afek"},"change_message_id":"0f227d29dc23664ced2b71e6b02b6b0c57036f7f","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self.assertIsNotNone(alarms, \u0027No alarms returned\u0027)"},{"line_number":143,"context_line":"        self.assertEqual(2, len(alarms))"},{"line_number":144,"context_line":"        self._assert_contains(expected_alarm1, alarms)"},{"line_number":145,"context_line":"        self._assert_contains(expected_alarm2, alarms)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        # Step 4 - get all when all alarms are inactivated and their status"},{"line_number":148,"context_line":"        # was not changed"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_16a81e1f","line":145,"range":{"start_line":145,"start_character":0,"end_line":145,"end_character":54},"updated":"2016-12-22 13:22:53.000000000","message":"Why did you remove the DELETE_ENTITY tests?","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"},{"author":{"_account_id":18783,"name":"dongwenjuan","email":"dong.wenjuan@zte.com.cn","username":"dongwenjuan"},"change_message_id":"ebe9a956f31aa0713b42ae81dc9c1b7f147ec746","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self.assertIsNotNone(alarms, \u0027No alarms returned\u0027)"},{"line_number":143,"context_line":"        self.assertEqual(2, len(alarms))"},{"line_number":144,"context_line":"        self._assert_contains(expected_alarm1, alarms)"},{"line_number":145,"context_line":"        self._assert_contains(expected_alarm2, alarms)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        # Step 4 - get all when all alarms are inactivated and their status"},{"line_number":148,"context_line":"        # was not changed"}],"source_content_type":"text/x-python","patch_set":12,"id":"da4df55a_8909322f","line":145,"range":{"start_line":145,"start_character":0,"end_line":145,"end_character":54},"in_reply_to":"da4df55a_16a81e1f","updated":"2016-12-23 01:19:54.000000000","message":"same as before","commit_id":"825d782f3ea908b66406f9d72b3b676cb7565b75"}]}
