)]}'
{"smaug/operationengine/engine/trigger_manager.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        trigger_cls \u003d self._get_trigger_class(trigger_type)"},{"line_number":59,"context_line":"        trigger_cls.check_trigger_definition(trigger_definition)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def register_operation(self, trigger_type, trigger_id, trigger_property,"},{"line_number":62,"context_line":"                           operation_id, operation_name\u003dNone, **kwargs):"},{"line_number":63,"context_line":"        \"\"\"Register operation definition."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        :param trigger_type: The type of trigger"},{"line_number":66,"context_line":"        :param trigger_id: The ID of the trigger which"},{"line_number":67,"context_line":"                           the operation is registered to"},{"line_number":68,"context_line":"        :param operation_id: ID of the operation"},{"line_number":69,"context_line":"        :param operation_name: Name of the operation"},{"line_number":70,"context_line":"        :param kwargs: Any parameters"},{"line_number":71,"context_line":"        :raise InvalidInput if the trigger_type is invalid or"},{"line_number":72,"context_line":"               other exceptionis register_operation of trigger raises"},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        obj \u003d self._get_trigger_object(trigger_type, trigger_id)"},{"line_number":75,"context_line":"        if not obj:"},{"line_number":76,"context_line":"            obj \u003d self._add_trigger_object(trigger_type, trigger_id,"},{"line_number":77,"context_line":"                                           trigger_property)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        obj.register_operation(operation_id, operation_name, **kwargs)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def unregister_operation(self, trigger_type, trigger_id, operation_id,"},{"line_number":82,"context_line":"                             operation_name\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_4d7edd19","line":79,"range":{"start_line":61,"start_character":0,"end_line":79,"end_character":70},"updated":"2016-03-31 07:59:20.000000000","message":"We can eliminate the trigger_type and trigger_property parameters.\nIf the trigger doesn\u0027t exist, don\u0027t create it.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e3c52cad6041bde4f42872ea206fb89d824207c4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        trigger_cls \u003d self._get_trigger_class(trigger_type)"},{"line_number":59,"context_line":"        trigger_cls.check_trigger_definition(trigger_definition)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def register_operation(self, trigger_type, trigger_id, trigger_property,"},{"line_number":62,"context_line":"                           operation_id, operation_name\u003dNone, **kwargs):"},{"line_number":63,"context_line":"        \"\"\"Register operation definition."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        :param trigger_type: The type of trigger"},{"line_number":66,"context_line":"        :param trigger_id: The ID of the trigger which"},{"line_number":67,"context_line":"                           the operation is registered to"},{"line_number":68,"context_line":"        :param operation_id: ID of the operation"},{"line_number":69,"context_line":"        :param operation_name: Name of the operation"},{"line_number":70,"context_line":"        :param kwargs: Any parameters"},{"line_number":71,"context_line":"        :raise InvalidInput if the trigger_type is invalid or"},{"line_number":72,"context_line":"               other exceptionis register_operation of trigger raises"},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        obj \u003d self._get_trigger_object(trigger_type, trigger_id)"},{"line_number":75,"context_line":"        if not obj:"},{"line_number":76,"context_line":"            obj \u003d self._add_trigger_object(trigger_type, trigger_id,"},{"line_number":77,"context_line":"                                           trigger_property)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        obj.register_operation(operation_id, operation_name, **kwargs)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def unregister_operation(self, trigger_type, trigger_id, operation_id,"},{"line_number":82,"context_line":"                             operation_name\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_0ef2e299","line":79,"range":{"start_line":61,"start_character":0,"end_line":79,"end_character":70},"in_reply_to":"ba0121b8_4d7edd19","updated":"2016-04-01 07:18:23.000000000","message":"The api of creating trigger just stores the data in the DB, and will not create trigger. We will create trigger when user creates scheduled operation with it at the first time.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        obj.unregister_operation(operation_id, operation_name, **kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def delete_operation(self, trigger_type, trigger_id, operation_id,"},{"line_number":101,"context_line":"                         operation_name\u003dNone, **kwargs):"},{"line_number":102,"context_line":"        \"\"\"Delete operation."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        :param trigger_type: The type of trigger"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_4da53da0","line":101,"range":{"start_line":100,"start_character":0,"end_line":101,"end_character":56},"updated":"2016-03-31 07:59:20.000000000","message":"same as below. No need to pass the trigger type, only trigger_id.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"28593215bbaffd10c7dc1bfd7b545ce93670c933","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        obj.unregister_operation(operation_id, operation_name, **kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def delete_operation(self, trigger_type, trigger_id, operation_id,"},{"line_number":101,"context_line":"                         operation_name\u003dNone, **kwargs):"},{"line_number":102,"context_line":"        \"\"\"Delete operation."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        :param trigger_type: The type of trigger"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_4c8183fa","line":101,"range":{"start_line":100,"start_character":0,"end_line":101,"end_character":56},"in_reply_to":"ba0121b8_4da53da0","updated":"2016-04-01 07:45:23.000000000","message":"Please see my replay below.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                   operation_name, **kwargs)"},{"line_number":115,"context_line":"        self._executor.cancel_operation(operation_id)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _get_trigger_object(self, trigger_type, trigger_id):"},{"line_number":118,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, {})"},{"line_number":119,"context_line":"        return triggers.get(trigger_id, None)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _add_trigger_object(self, trigger_type, trigger_id,"},{"line_number":122,"context_line":"                            trigger_property):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_2d7ba929","line":119,"range":{"start_line":117,"start_character":0,"end_line":119,"end_character":45},"updated":"2016-03-31 07:59:20.000000000","message":"if _trigger_obj_map is keyed by id (and not a dictionary of dictonaries, as explained below), we can get the trigger object by id, and not send type to this function.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"e3c52cad6041bde4f42872ea206fb89d824207c4","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                                   operation_name, **kwargs)"},{"line_number":115,"context_line":"        self._executor.cancel_operation(operation_id)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _get_trigger_object(self, trigger_type, trigger_id):"},{"line_number":118,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, {})"},{"line_number":119,"context_line":"        return triggers.get(trigger_id, None)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _add_trigger_object(self, trigger_type, trigger_id,"},{"line_number":122,"context_line":"                            trigger_property):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_ce574a56","line":119,"range":{"start_line":117,"start_character":0,"end_line":119,"end_character":45},"in_reply_to":"ba0121b8_2d7ba929","updated":"2016-04-01 07:18:23.000000000","message":"The self._trigger_obj_map stores all kinds of triggers including time, event etc. So the structure of self._trigger_obj_map is like this \n{\u0027time\u0027:{\n     trigger_id: trigger\n },\n \u0027event\u0027:{\n     trigger_id: trigger\n }\n}","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, {})"},{"line_number":119,"context_line":"        return triggers.get(trigger_id, None)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _add_trigger_object(self, trigger_type, trigger_id,"},{"line_number":122,"context_line":"                            trigger_property):"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        trigger_cls \u003d self._get_trigger_class(trigger_type)"},{"line_number":125,"context_line":"        trigger \u003d trigger_cls(trigger_id, trigger_property, self._executor)"},{"line_number":126,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, None)"},{"line_number":127,"context_line":"        if not triggers:"},{"line_number":128,"context_line":"            self._trigger_obj_map[trigger_type] \u003d {}"},{"line_number":129,"context_line":"            triggers \u003d self._trigger_obj_map[trigger_type]"},{"line_number":130,"context_line":"        triggers[trigger_id] \u003d trigger"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        return trigger"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _get_trigger_class(self, trigger_type):"},{"line_number":135,"context_line":"        cls \u003d self._trigger_cls_map.get(trigger_type, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_8d747536","line":132,"range":{"start_line":121,"start_character":0,"end_line":132,"end_character":22},"updated":"2016-03-31 07:59:20.000000000","message":"_trigger_obj_map is a dictionary of dictionaries. First by trigger_type and then by trigger_id. Can we use only one dictionary for _trigger_obj_map, keyed by id? (no need to key by trigger_type)","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"28593215bbaffd10c7dc1bfd7b545ce93670c933","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, {})"},{"line_number":119,"context_line":"        return triggers.get(trigger_id, None)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _add_trigger_object(self, trigger_type, trigger_id,"},{"line_number":122,"context_line":"                            trigger_property):"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        trigger_cls \u003d self._get_trigger_class(trigger_type)"},{"line_number":125,"context_line":"        trigger \u003d trigger_cls(trigger_id, trigger_property, self._executor)"},{"line_number":126,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, None)"},{"line_number":127,"context_line":"        if not triggers:"},{"line_number":128,"context_line":"            self._trigger_obj_map[trigger_type] \u003d {}"},{"line_number":129,"context_line":"            triggers \u003d self._trigger_obj_map[trigger_type]"},{"line_number":130,"context_line":"        triggers[trigger_id] \u003d trigger"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        return trigger"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _get_trigger_class(self, trigger_type):"},{"line_number":135,"context_line":"        cls \u003d self._trigger_cls_map.get(trigger_type, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_2cad2f9b","line":132,"range":{"start_line":121,"start_character":0,"end_line":132,"end_character":22},"in_reply_to":"ba0121b8_8d747536","updated":"2016-04-01 07:45:23.000000000","message":"Please see my reply above.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self._trigger_cls_map \u003d {cls.TRIGGER_TYPE:"},{"line_number":30,"context_line":"                                 cls for cls in all_cls}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        # self._trigger_obj_map \u003d {"},{"line_number":33,"context_line":"        #     \u0027time\u0027: {"},{"line_number":34,"context_line":"        #         trigger_id: trigger,"},{"line_number":35,"context_line":"        #     },"},{"line_number":36,"context_line":"        #     \u0027event\u0027: {"},{"line_number":37,"context_line":"        #         trigger_id: trigger,"},{"line_number":38,"context_line":"        #     },"},{"line_number":39,"context_line":"        # }"},{"line_number":40,"context_line":"        self._trigger_obj_map \u003d {}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # TODO(zengchen) create executor"},{"line_number":43,"context_line":"        self._executor \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_2b10514e","line":40,"range":{"start_line":32,"start_character":0,"end_line":40,"end_character":34},"updated":"2016-04-04 10:06:13.000000000","message":"_trigger_obj_map should contain all triggers by id. No need to split by type.","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        # }"},{"line_number":40,"context_line":"        self._trigger_obj_map \u003d {}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # TODO(zengchen) create executor"},{"line_number":43,"context_line":"        self._executor \u003d None"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def shutdown(self):"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_0b410d0c","line":43,"range":{"start_line":42,"start_character":0,"end_line":43,"end_character":29},"updated":"2016-04-04 10:06:13.000000000","message":"Pass the executor in constructor?","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self._trigger_obj_map.clear()"},{"line_number":53,"context_line":"        self._trigger_cls_map.clear()"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        if self._executor:"},{"line_number":56,"context_line":"            self._executor.shutdown()"},{"line_number":57,"context_line":"            self._executor \u003d None"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def check_trigger_definition(self, trigger_type, trigger_definition):"},{"line_number":60,"context_line":"        \"\"\"Check trigger definition"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_cb5d55ee","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":33},"updated":"2016-04-04 10:06:13.000000000","message":"Move to OperationEngineManager","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        trigger_cls \u003d self._get_trigger_class(trigger_type)"},{"line_number":67,"context_line":"        trigger_cls.check_trigger_definition(trigger_definition)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def register_operation(self, trigger_type, trigger_id, trigger_property,"},{"line_number":70,"context_line":"                           operation_id, operation_name\u003dNone, **kwargs):"},{"line_number":71,"context_line":"        \"\"\"Register operation definition."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        :param trigger_type: The type of trigger"},{"line_number":74,"context_line":"        :param trigger_id: The ID of the trigger which"},{"line_number":75,"context_line":"                           the operation is registered to"},{"line_number":76,"context_line":"        :param operation_id: ID of the operation"},{"line_number":77,"context_line":"        :param operation_name: Name of the operation"},{"line_number":78,"context_line":"        :param kwargs: Any parameters"},{"line_number":79,"context_line":"        :raise InvalidInput if the trigger_type is invalid or"},{"line_number":80,"context_line":"               other exceptionis register_operation of trigger raises"},{"line_number":81,"context_line":"        \"\"\""},{"line_number":82,"context_line":"        obj \u003d self._get_trigger_object(trigger_type, trigger_id)"},{"line_number":83,"context_line":"        if not obj:"},{"line_number":84,"context_line":"            obj \u003d self._add_trigger_object(trigger_type, trigger_id,"},{"line_number":85,"context_line":"                                           trigger_property)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        obj.register_operation(operation_id, operation_name, **kwargs)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def unregister_operation(self, trigger_type, trigger_id, operation_id,"},{"line_number":90,"context_line":"                             operation_name\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_2be4d10b","line":87,"range":{"start_line":69,"start_character":0,"end_line":87,"end_character":70},"updated":"2016-04-04 10:06:13.000000000","message":"register_operation - should receive only trigger_id and operation_id. Look for trigger in self._trogger_obj_map and call register_operation on it with operation id.","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, {})"},{"line_number":127,"context_line":"        return triggers.get(trigger_id, None)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def _add_trigger_object(self, trigger_type, trigger_id,"},{"line_number":130,"context_line":"                            trigger_property):"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        trigger_cls \u003d self._get_trigger_class(trigger_type)"},{"line_number":133,"context_line":"        trigger \u003d trigger_cls(trigger_id, trigger_property, self._executor)"},{"line_number":134,"context_line":"        triggers \u003d self._trigger_obj_map.get(trigger_type, None)"},{"line_number":135,"context_line":"        if not triggers:"},{"line_number":136,"context_line":"            self._trigger_obj_map[trigger_type] \u003d {}"},{"line_number":137,"context_line":"            triggers \u003d self._trigger_obj_map[trigger_type]"},{"line_number":138,"context_line":"        triggers[trigger_id] \u003d trigger"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        return trigger"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _get_trigger_class(self, trigger_type):"},{"line_number":143,"context_line":"        cls \u003d self._trigger_cls_map.get(trigger_type, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_0babcd8a","line":140,"range":{"start_line":129,"start_character":0,"end_line":140,"end_character":22},"updated":"2016-04-04 10:06:13.000000000","message":"TriggerManager should have 3 methods to be called from Trigger RPC.\nadd_trigger(type, id, property)\nremove_trigger(id)\nupdate_trigger(id, property)","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"}],"smaug/operationengine/manager.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self._service_id is not None:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        for i in range(3):"},{"line_number":57,"context_line":"            try:"},{"line_number":58,"context_line":"                service \u003d objects.Service.get_by_args("},{"line_number":59,"context_line":"                    context,"},{"line_number":60,"context_line":"                    self.host,"},{"line_number":61,"context_line":"                    \"smaug-operationengine\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"                if service:"},{"line_number":64,"context_line":"                    self._service_id \u003d service.id"},{"line_number":65,"context_line":"                    break"},{"line_number":66,"context_line":"            except Exception:"},{"line_number":67,"context_line":"                pass"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @messaging.expected_exceptions(exception.ServiceNotFound,"},{"line_number":70,"context_line":"                                   exception.TriggerNotFound,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_0daea580","line":67,"range":{"start_line":56,"start_character":0,"end_line":67,"end_character":20},"updated":"2016-03-31 07:59:20.000000000","message":"why do we iterate 3 times over that?","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"6d7aee5ff6f2f3699bab74db7f52f297c9321f99","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self._service_id is not None:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        for i in range(3):"},{"line_number":57,"context_line":"            try:"},{"line_number":58,"context_line":"                service \u003d objects.Service.get_by_args("},{"line_number":59,"context_line":"                    context,"},{"line_number":60,"context_line":"                    self.host,"},{"line_number":61,"context_line":"                    \"smaug-operationengine\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"                if service:"},{"line_number":64,"context_line":"                    self._service_id \u003d service.id"},{"line_number":65,"context_line":"                    break"},{"line_number":66,"context_line":"            except Exception:"},{"line_number":67,"context_line":"                pass"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @messaging.expected_exceptions(exception.ServiceNotFound,"},{"line_number":70,"context_line":"                                   exception.TriggerNotFound,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_8c443b4a","line":67,"range":{"start_line":56,"start_character":0,"end_line":67,"end_character":20},"in_reply_to":"ba0121b8_0daea580","updated":"2016-04-01 07:26:52.000000000","message":"Here i just try 3 times until get the service id. The time of trying is just the empirical value.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                raise exception.ServiceNotFound(service_id\u003dNone)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # register operation"},{"line_number":84,"context_line":"        trigger \u003d objects.Trigger.get_by_id(context, trigger_id)"},{"line_number":85,"context_line":"        self._trigger_manager.register_operation(trigger.type, trigger.id,"},{"line_number":86,"context_line":"                                                 trigger.properties,"},{"line_number":87,"context_line":"                                                 operation_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_4dcc1d6a","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":64},"updated":"2016-03-31 07:59:20.000000000","message":"handle TriggerNotFound ?","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"6d7aee5ff6f2f3699bab74db7f52f297c9321f99","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                raise exception.ServiceNotFound(service_id\u003dNone)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # register operation"},{"line_number":84,"context_line":"        trigger \u003d objects.Trigger.get_by_id(context, trigger_id)"},{"line_number":85,"context_line":"        self._trigger_manager.register_operation(trigger.type, trigger.id,"},{"line_number":86,"context_line":"                                                 trigger.properties,"},{"line_number":87,"context_line":"                                                 operation_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_6eb8be75","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":64},"in_reply_to":"ba0121b8_4dcc1d6a","updated":"2016-04-01 07:26:52.000000000","message":"The decorator will handle it.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # register operation"},{"line_number":84,"context_line":"        trigger \u003d objects.Trigger.get_by_id(context, trigger_id)"},{"line_number":85,"context_line":"        self._trigger_manager.register_operation(trigger.type, trigger.id,"},{"line_number":86,"context_line":"                                                 trigger.properties,"},{"line_number":87,"context_line":"                                                 operation_id)"},{"line_number":88,"context_line":"        # create ScheduledOperationState record"},{"line_number":89,"context_line":"        state_info \u003d {"},{"line_number":90,"context_line":"            \"operation_id\": operation_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_8dc2b532","line":87,"range":{"start_line":85,"start_character":0,"end_line":87,"end_character":62},"updated":"2016-03-31 07:59:20.000000000","message":"we already have the trigger object and can call register_operation() on it, instead of on the trigger_manager.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"6d7aee5ff6f2f3699bab74db7f52f297c9321f99","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # register operation"},{"line_number":84,"context_line":"        trigger \u003d objects.Trigger.get_by_id(context, trigger_id)"},{"line_number":85,"context_line":"        self._trigger_manager.register_operation(trigger.type, trigger.id,"},{"line_number":86,"context_line":"                                                 trigger.properties,"},{"line_number":87,"context_line":"                                                 operation_id)"},{"line_number":88,"context_line":"        # create ScheduledOperationState record"},{"line_number":89,"context_line":"        state_info \u003d {"},{"line_number":90,"context_line":"            \"operation_id\": operation_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_ce28ea9c","line":87,"range":{"start_line":85,"start_character":0,"end_line":87,"end_character":62},"in_reply_to":"ba0121b8_8dc2b532","updated":"2016-04-01 07:26:52.000000000","message":"Here the variable \u0027trigger\u0027 just is the instance of objects.Trigger which is used to visit the DB.","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            operation_state.create()"},{"line_number":98,"context_line":"        except Exception:"},{"line_number":99,"context_line":"            self._trigger_manager.unregister_operation("},{"line_number":100,"context_line":"                trigger.type, trigger.id, operation_id)"},{"line_number":101,"context_line":"            raise"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @messaging.expected_exceptions(exception.ScheduledOperationStateNotFound,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_0de505db","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":55},"updated":"2016-03-31 07:59:20.000000000","message":"see comments in trigger_manager.py, we can drop the type parameter from unregister_operation()","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"6d7aee5ff6f2f3699bab74db7f52f297c9321f99","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            operation_state.create()"},{"line_number":98,"context_line":"        except Exception:"},{"line_number":99,"context_line":"            self._trigger_manager.unregister_operation("},{"line_number":100,"context_line":"                trigger.type, trigger.id, operation_id)"},{"line_number":101,"context_line":"            raise"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @messaging.expected_exceptions(exception.ScheduledOperationStateNotFound,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_ec04d715","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":55},"in_reply_to":"ba0121b8_0de505db","updated":"2016-04-01 07:26:52.000000000","message":"Please see the replies in the trigger_manager.py","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65db526ffc5b04c058c6362e9bc842fa8df5a9c1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        operation_state.save()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            self._trigger_manager.delete_operation(trigger.type, trigger.id,"},{"line_number":121,"context_line":"                                                   operation_id)"},{"line_number":122,"context_line":"        except exception.InvalidOperationObject:"},{"line_number":123,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_ad0a1988","line":121,"range":{"start_line":120,"start_character":0,"end_line":121,"end_character":64},"updated":"2016-03-31 07:59:20.000000000","message":"ditto","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"6d7aee5ff6f2f3699bab74db7f52f297c9321f99","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        operation_state.save()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            self._trigger_manager.delete_operation(trigger.type, trigger.id,"},{"line_number":121,"context_line":"                                                   operation_id)"},{"line_number":122,"context_line":"        except exception.InvalidOperationObject:"},{"line_number":123,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_8c16fb49","line":121,"range":{"start_line":120,"start_character":0,"end_line":121,"end_character":64},"in_reply_to":"ba0121b8_ad0a1988","updated":"2016-04-01 07:26:52.000000000","message":"Please see the replies in the trigger_manager.py","commit_id":"8689d0171d44944cb3848bdd18cf20a6893b5cb1"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class OperationEngineManager(manager.Manager):"},{"line_number":34,"context_line":"    \"\"\"Smaug OperationEngine Manager.\"\"\""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    RPC_API_VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_1182dc00","line":33,"range":{"start_line":33,"start_character":0,"end_line":33,"end_character":46},"updated":"2016-04-04 10:06:13.000000000","message":"Add 3 RPC methods for triggers: add trigger, change trigger, remove trigger","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self._service_id \u003d None"},{"line_number":44,"context_line":"        self._trigger_manager \u003d None"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def init_host(self):"},{"line_number":47,"context_line":"        self._trigger_manager \u003d trigger_manager.TriggerManager()"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def cleanup_host(self):"},{"line_number":50,"context_line":"        self._trigger_manager.shutdown()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_80c85c76","line":47,"range":{"start_line":46,"start_character":0,"end_line":47,"end_character":64},"updated":"2016-04-04 10:06:13.000000000","message":"When service starts, get all triggers from database and add them to the engine.\nThen register all operations from database to their relevant triggers.","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self._service_id is not None:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        for i in range(3):"},{"line_number":57,"context_line":"            try:"},{"line_number":58,"context_line":"                service \u003d objects.Service.get_by_args("},{"line_number":59,"context_line":"                    context,"},{"line_number":60,"context_line":"                    self.host,"},{"line_number":61,"context_line":"                    \"smaug-operationengine\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"                if service:"},{"line_number":64,"context_line":"                    self._service_id \u003d service.id"},{"line_number":65,"context_line":"                    break"},{"line_number":66,"context_line":"            except Exception:"},{"line_number":67,"context_line":"                pass"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @messaging.expected_exceptions(exception.ServiceNotFound,"},{"line_number":70,"context_line":"                                   exception.TriggerNotFound,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_b74cc877","line":67,"range":{"start_line":56,"start_character":0,"end_line":67,"end_character":20},"updated":"2016-04-04 10:06:13.000000000","message":"I think this is usually handled in db/sqlalchemy/api.py by using wrap_db_retry decorator. Better to handle in low-level, near db, and not in the higher level of the application.","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"74747a387c4bc7f616d78df65b4749ea6ba3cf78","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                raise exception.ServiceNotFound(service_id\u003dNone)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        # register operation"},{"line_number":84,"context_line":"        trigger \u003d objects.Trigger.get_by_id(context, trigger_id)"},{"line_number":85,"context_line":"        self._trigger_manager.register_operation(trigger.type, trigger.id,"},{"line_number":86,"context_line":"                                                 trigger.properties,"},{"line_number":87,"context_line":"                                                 operation_id)"},{"line_number":88,"context_line":"        # create ScheduledOperationState record"},{"line_number":89,"context_line":"        state_info \u003d {"},{"line_number":90,"context_line":"            \"operation_id\": operation_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_40f924c8","line":87,"range":{"start_line":84,"start_character":0,"end_line":87,"end_character":62},"updated":"2016-04-04 10:06:13.000000000","message":"why look in the db? use self._trigger_manager to get the trigger and call register_operation on it.\nAlso, might be better to create the ScheduledOperationState prior to registering the operation on the trigger, to avoid the situation where the operation began and the ScheduledOperationState creation failed.","commit_id":"768eac25cb46bafa7d12a1934bf86e10c78a76c0"}]}
