)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"772d851a6a73b9ff23c4c0ad495c457b9c2c8645","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     hujie \u003cmike.hu@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-12-14 11:07:41 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"refactor db consistent and object refresher(step1)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I7d6de4a4af833cfdd9d115a2a2004801e7a55f7a"},{"line_number":10,"context_line":"Closes-bug: #1646453"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"1a6eadb0_3ce30307","line":7,"range":{"start_line":7,"start_character":27,"end_line":7,"end_character":33},"updated":"2016-12-14 03:33:54.000000000","message":"briefly describe why and how to refactor","commit_id":"87dff889fb7d09dcd708e118d61a33d64d50093b"}],"dragonflow/common/utils.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"c9c42cfa4ab5faee09d6122d2db6e2dcfd56a7be","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        (n_const.VHOST_USER_DEVICE_PREFIX + port_id)[:14])"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def get_suffix_by_word(word):"},{"line_number":47,"context_line":"    end \u003d word[-2:]"},{"line_number":48,"context_line":"    if end in [\u0027ch\u0027, \u0027os\u0027]:"},{"line_number":49,"context_line":"        return \u0027es\u0027"},{"line_number":50,"context_line":"    elif end in [\u0027is\u0027]:"},{"line_number":51,"context_line":"        return \u0027\u0027"},{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        return \u0027s\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def load_driver(driver_cfg, namespace):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_3ad10e58","line":53,"range":{"start_line":46,"start_character":12,"end_line":53,"end_character":18},"updated":"2016-12-10 04:42:59.000000000","message":"+1 this english magic is not necessary.","commit_id":"95c88e945f42ffae1d806a3e1e81f23d92f41c00"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"21f1e58d728666a6820e33b37c7d85998d386e2f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        (n_const.VHOST_USER_DEVICE_PREFIX + port_id)[:14])"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def get_suffix_by_word(word):"},{"line_number":47,"context_line":"    end \u003d word[-2:]"},{"line_number":48,"context_line":"    if end in [\u0027ch\u0027, \u0027os\u0027]:"},{"line_number":49,"context_line":"        return \u0027es\u0027"},{"line_number":50,"context_line":"    elif end in [\u0027is\u0027]:"},{"line_number":51,"context_line":"        return \u0027\u0027"},{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        return \u0027s\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def load_driver(driver_cfg, namespace):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_6b07701d","line":53,"range":{"start_line":46,"start_character":0,"end_line":53,"end_character":18},"updated":"2016-12-09 03:16:20.000000000","message":"I don\u0027t like this way, with dimak\u0027s change at nb_api, we can use get_all to get all resources from nb_api.\n\nAnd look back to db_store, all the \"get_resources\" methods looks the same. We can just use another get_all(table_name) method to save some code and make code cleaner.","commit_id":"95c88e945f42ffae1d806a3e1e81f23d92f41c00"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"26609ad8ab5037f7acee3b96bc5fe2bb894a177e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        (n_const.VHOST_USER_DEVICE_PREFIX + port_id)[:14])"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def get_suffix_by_word(word):"},{"line_number":47,"context_line":"    end \u003d word[-2:]"},{"line_number":48,"context_line":"    if end in [\u0027ch\u0027, \u0027os\u0027]:"},{"line_number":49,"context_line":"        return \u0027es\u0027"},{"line_number":50,"context_line":"    elif end in [\u0027is\u0027]:"},{"line_number":51,"context_line":"        return \u0027\u0027"},{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        return \u0027s\u0027"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def load_driver(driver_cfg, namespace):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_ba40bea6","line":53,"range":{"start_line":46,"start_character":12,"end_line":53,"end_character":18},"in_reply_to":"3a71b18c_3ad10e58","updated":"2016-12-10 05:31:56.000000000","message":"yes, I also do not like this way, in my previous thinking we do not need \"es\" and \"s\" in the end of method, after discussion with Honghui, I decide to refactor it by another patch, thx guys :)","commit_id":"95c88e945f42ffae1d806a3e1e81f23d92f41c00"}],"dragonflow/controller/common/utils.py":[{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b31cdb3a3bd63d0f0dfeb1c1a0f0419581412880","unresolved":false,"context_lines":[{"line_number":21,"context_line":"UINT32_MAX \u003d 0xffffffff"},{"line_number":22,"context_line":"_aging_cookie \u003d 0"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"table_class_mapping \u003d {"},{"line_number":25,"context_line":"    models.LogicalSwitch.table_name: models.LogicalSwitch,"},{"line_number":26,"context_line":"    models.LogicalPort.table_name: models.LogicalPort,"},{"line_number":27,"context_line":"    models.LogicalRouter.table_name: models.LogicalRouter,"},{"line_number":28,"context_line":"    models.Floatingip.table_name: models.Floatingip,"},{"line_number":29,"context_line":"    models.SecurityGroup.table_name: models.SecurityGroup,"},{"line_number":30,"context_line":"    models.Publisher.table_name: models.Publisher,"},{"line_number":31,"context_line":"    models.QosPolicy.table_name: models.QosPolicy,"},{"line_number":32,"context_line":"    models.Chassis.table_name: models.Chassis"},{"line_number":33,"context_line":"}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def get_class_by_table(table):"},{"line_number":37,"context_line":"    return table_class_mapping.get(table)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def ipv4_text_to_int(ip_text):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6eadb0_f2b0f38d","line":37,"range":{"start_line":24,"start_character":0,"end_line":37,"end_character":41},"updated":"2016-12-13 15:05:16.000000000","message":"I think this is more suitable to dragonflow.db.models","commit_id":"2456144cad0efdc7dfbbb307758a0f1cd72bcb18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"5597d02c71144b6de42fe913ef60ee182e977f5a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"UINT32_MAX \u003d 0xffffffff"},{"line_number":22,"context_line":"_aging_cookie \u003d 0"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"table_class_mapping \u003d {"},{"line_number":25,"context_line":"    models.LogicalSwitch.table_name: models.LogicalSwitch,"},{"line_number":26,"context_line":"    models.LogicalPort.table_name: models.LogicalPort,"},{"line_number":27,"context_line":"    models.LogicalRouter.table_name: models.LogicalRouter,"},{"line_number":28,"context_line":"    models.Floatingip.table_name: models.Floatingip,"},{"line_number":29,"context_line":"    models.SecurityGroup.table_name: models.SecurityGroup,"},{"line_number":30,"context_line":"    models.Publisher.table_name: models.Publisher,"},{"line_number":31,"context_line":"    models.QosPolicy.table_name: models.QosPolicy,"},{"line_number":32,"context_line":"    models.Chassis.table_name: models.Chassis"},{"line_number":33,"context_line":"}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def get_class_by_table(table):"},{"line_number":37,"context_line":"    return table_class_mapping.get(table)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def ipv4_text_to_int(ip_text):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6eadb0_e1b008e0","line":37,"range":{"start_line":24,"start_character":0,"end_line":37,"end_character":41},"in_reply_to":"1a6eadb0_f2b0f38d","updated":"2016-12-14 03:00:22.000000000","message":"Done","commit_id":"2456144cad0efdc7dfbbb307758a0f1cd72bcb18"}],"dragonflow/controller/df_db_objects_refresh.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"1b24cf63ab7393e5ef4f89aad5a874fae2a4e0d0","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        _delete_items()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def process_object(controller, table, action, df_object, obj_id\u003dNone):"},{"line_number":149,"context_line":"    delete_method \u003d \"delete_\" + table"},{"line_number":150,"context_line":"    update_method \u003d \"update_\" + table"},{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6eadb0_814594b4","line":148,"range":{"start_line":148,"start_character":4,"end_line":148,"end_character":18},"updated":"2016-12-14 03:15:34.000000000","message":"What about organize code this way?\n\ndef process_object(controller, table, action, df_object, obj_id\u003dNone):\n    if action \u003d\u003d \"delete\":\n        method_name \u003d  \"delete_\" + table\n        method_param \u003d obj_id\n    else:\n        method_name \u003d  \"update_\" + table\n        method_param \u003d df_object\n\n    method_handler \u003d getattr(controller, method_name, None)\n    method_handler(method_param)\n\nThis way, you don\u0027t need to orchestrate both methods name and get both methods all the time.","commit_id":"2456144cad0efdc7dfbbb307758a0f1cd72bcb18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"5800bb83ee853f40afed0bcb692471bac58845ef","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        _delete_items()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def process_object(controller, table, action, df_object, obj_id\u003dNone):"},{"line_number":149,"context_line":"    delete_method \u003d \"delete_\" + table"},{"line_number":150,"context_line":"    update_method \u003d \"update_\" + table"},{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6eadb0_3cd94384","line":148,"range":{"start_line":148,"start_character":4,"end_line":148,"end_character":18},"in_reply_to":"1a6eadb0_814594b4","updated":"2016-12-14 03:21:34.000000000","message":"Done","commit_id":"2456144cad0efdc7dfbbb307758a0f1cd72bcb18"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"1b24cf63ab7393e5ef4f89aad5a874fae2a4e0d0","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    update_method \u003d \"update_\" + table"},{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"},{"line_number":152,"context_line":"    update_handler \u003d getattr(controller, update_method, None)"},{"line_number":153,"context_line":"    if action \u003d\u003d \u0027delete\u0027:"},{"line_number":154,"context_line":"        delete_handler(obj_id)"},{"line_number":155,"context_line":"    else:"},{"line_number":156,"context_line":"        update_handler(df_object)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6eadb0_21cf6080","line":153,"range":{"start_line":153,"start_character":18,"end_line":153,"end_character":24},"updated":"2016-12-14 03:15:34.000000000","message":"Consider add actions as const","commit_id":"2456144cad0efdc7dfbbb307758a0f1cd72bcb18"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"5800bb83ee853f40afed0bcb692471bac58845ef","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    update_method \u003d \"update_\" + table"},{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"},{"line_number":152,"context_line":"    update_handler \u003d getattr(controller, update_method, None)"},{"line_number":153,"context_line":"    if action \u003d\u003d \u0027delete\u0027:"},{"line_number":154,"context_line":"        delete_handler(obj_id)"},{"line_number":155,"context_line":"    else:"},{"line_number":156,"context_line":"        update_handler(df_object)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6eadb0_fccd0bb8","line":153,"range":{"start_line":153,"start_character":18,"end_line":153,"end_character":24},"in_reply_to":"1a6eadb0_21cf6080","updated":"2016-12-14 03:21:34.000000000","message":"I have found many places that use \u0027delete\u0027 directly in the whole project, so maybe it could be done in another patch:)","commit_id":"2456144cad0efdc7dfbbb307758a0f1cd72bcb18"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"772d851a6a73b9ff23c4c0ad495c457b9c2c8645","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def process_object(controller, table, action, df_object, obj_id\u003dNone):"},{"line_number":149,"context_line":"    delete_method \u003d \"delete_\" + table"},{"line_number":150,"context_line":"    update_method \u003d \"update_\" + table"},{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"},{"line_number":152,"context_line":"    update_handler \u003d getattr(controller, update_method, None)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6eadb0_9c04177f","line":149,"range":{"start_line":149,"start_character":4,"end_line":149,"end_character":17},"updated":"2016-12-14 03:33:54.000000000","message":"you can put these four statements into the if/else block, it will be more efficient.","commit_id":"87dff889fb7d09dcd708e118d61a33d64d50093b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"a98d98e214d911e50a6aa2d97593337c98292000","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def process_object(controller, table, action, df_object, obj_id\u003dNone):"},{"line_number":149,"context_line":"    delete_method \u003d \"delete_\" + table"},{"line_number":150,"context_line":"    update_method \u003d \"update_\" + table"},{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"},{"line_number":152,"context_line":"    update_handler \u003d getattr(controller, update_method, None)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6eadb0_fcb98b7a","line":149,"range":{"start_line":149,"start_character":4,"end_line":149,"end_character":17},"in_reply_to":"1a6eadb0_9c04177f","updated":"2016-12-14 03:41:21.000000000","message":"yes, the newest version patch set 14 has deal with it:)","commit_id":"87dff889fb7d09dcd708e118d61a33d64d50093b"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"772d851a6a73b9ff23c4c0ad495c457b9c2c8645","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"},{"line_number":152,"context_line":"    update_handler \u003d getattr(controller, update_method, None)"},{"line_number":153,"context_line":"    if action \u003d\u003d \u0027delete\u0027:"},{"line_number":154,"context_line":"        delete_handler(obj_id)"},{"line_number":155,"context_line":"    else:"},{"line_number":156,"context_line":"        update_handler(df_object)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6eadb0_bce0f3cd","line":154,"range":{"start_line":154,"start_character":8,"end_line":154,"end_character":22},"updated":"2016-12-14 03:33:54.000000000","message":"what if the handler is None?","commit_id":"87dff889fb7d09dcd708e118d61a33d64d50093b"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"a98d98e214d911e50a6aa2d97593337c98292000","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    delete_handler \u003d getattr(controller, delete_method, None)"},{"line_number":152,"context_line":"    update_handler \u003d getattr(controller, update_method, None)"},{"line_number":153,"context_line":"    if action \u003d\u003d \u0027delete\u0027:"},{"line_number":154,"context_line":"        delete_handler(obj_id)"},{"line_number":155,"context_line":"    else:"},{"line_number":156,"context_line":"        update_handler(df_object)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6eadb0_1cb1e78f","line":154,"range":{"start_line":154,"start_character":8,"end_line":154,"end_character":22},"in_reply_to":"1a6eadb0_bce0f3cd","updated":"2016-12-14 03:41:21.000000000","message":"Done","commit_id":"87dff889fb7d09dcd708e118d61a33d64d50093b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"fde1e6f2f0585effc23c4578968245347e724e57","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        _delete_items()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def process_object(controller, table, action, df_object, obj_id\u003dNone):"},{"line_number":149,"context_line":"    if action \u003d\u003d \u0027delete\u0027:"},{"line_number":150,"context_line":"        method_name \u003d \u0027delete_\u0027 + table"},{"line_number":151,"context_line":"        argument \u003d obj_id"}],"source_content_type":"text/x-python","patch_set":16,"id":"da4df55a_6c73e015","line":148,"range":{"start_line":148,"start_character":46,"end_line":148,"end_character":68},"updated":"2016-12-27 12:32:02.000000000","message":"You always pass exactly one of these: either df_object or obj_id. Maybe allow one argument, \u0027argument\u0027, and use that?","commit_id":"6965944c75db1e24e3e15af81d5ea7f0545c40f6"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9c91de5f1a2e59be2eee490fff1d9be5b1cc5357","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        _delete_items()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def process_object(controller, table, action, df_object, obj_id\u003dNone):"},{"line_number":149,"context_line":"    if action \u003d\u003d \u0027delete\u0027:"},{"line_number":150,"context_line":"        method_name \u003d \u0027delete_\u0027 + table"},{"line_number":151,"context_line":"        argument \u003d obj_id"}],"source_content_type":"text/x-python","patch_set":16,"id":"da4df55a_da2c709b","line":148,"range":{"start_line":148,"start_character":46,"end_line":148,"end_character":68},"in_reply_to":"da4df55a_6c73e015","updated":"2016-12-28 03:23:10.000000000","message":"Done","commit_id":"6965944c75db1e24e3e15af81d5ea7f0545c40f6"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":18903,"name":"Yuli","email":"stremovsky@gmail.com","username":"yuli"},"change_message_id":"661b29c707f6c16c98fed1f2322c128329ceecc3","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            self._queue.task_done()"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def _get_object_by_table(self, table, value):"},{"line_number":201,"context_line":"        if db_models.QosPolicy.table_name \u003d\u003d table:"},{"line_number":202,"context_line":"            return db_models.QosPolicy(value)"},{"line_number":203,"context_line":"        elif db_models.SecurityGroup.table_name \u003d\u003d table:"},{"line_number":204,"context_line":"            return db_models.SecurityGroup(value)"},{"line_number":205,"context_line":"        elif db_models.LogicalPort.table_name \u003d\u003d table:"},{"line_number":206,"context_line":"            return db_models.LogicalPort(value)"},{"line_number":207,"context_line":"        elif db_models.LogicalRouter.table_name \u003d\u003d table:"},{"line_number":208,"context_line":"            return db_models.LogicalRouter(value)"},{"line_number":209,"context_line":"        elif db_models.LogicalSwitch.table_name \u003d\u003d table:"},{"line_number":210,"context_line":"            return db_models.LogicalSwitch(value)"},{"line_number":211,"context_line":"        elif db_models.Floatingip.table_name \u003d\u003d table:"},{"line_number":212,"context_line":"            return db_models.Floatingip(value)"},{"line_number":213,"context_line":"        elif db_models.Chassis.table_name \u003d\u003d table:"},{"line_number":214,"context_line":"            return db_models.Chassis(value)"},{"line_number":215,"context_line":"        elif db_models.Publisher.table_name \u003d\u003d table:"},{"line_number":216,"context_line":"            return db_models.Publisher(value)"},{"line_number":217,"context_line":"        else:"},{"line_number":218,"context_line":"            return None"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def apply_db_change(self, table, key, action, value):"},{"line_number":221,"context_line":"        # determine if the action is allowed or not"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_3dc65e68","line":218,"range":{"start_line":201,"start_character":0,"end_line":218,"end_character":23},"updated":"2016-12-11 10:35:20.000000000","message":"Consider using dictionary here. Something like here:\n\ndict \u003d {}\ndict[db_models.QosPolicy.table_name] \u003d db_models.QosPolicy\ndict[db_models.SecurityGroup.table_name] \u003d \ndb_models.SecurityGroup\n....\n\nif table in dict:\n  return dict[table](value)\nelse:\n  return None","commit_id":"ac15a93fd12026d9fad0fd4566252424a738b3b0"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"a296120850f623274b5c0ed0c9685041bad48f19","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            self._queue.task_done()"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def _get_object_by_table(self, table, value):"},{"line_number":201,"context_line":"        if db_models.QosPolicy.table_name \u003d\u003d table:"},{"line_number":202,"context_line":"            return db_models.QosPolicy(value)"},{"line_number":203,"context_line":"        elif db_models.SecurityGroup.table_name \u003d\u003d table:"},{"line_number":204,"context_line":"            return db_models.SecurityGroup(value)"},{"line_number":205,"context_line":"        elif db_models.LogicalPort.table_name \u003d\u003d table:"},{"line_number":206,"context_line":"            return db_models.LogicalPort(value)"},{"line_number":207,"context_line":"        elif db_models.LogicalRouter.table_name \u003d\u003d table:"},{"line_number":208,"context_line":"            return db_models.LogicalRouter(value)"},{"line_number":209,"context_line":"        elif db_models.LogicalSwitch.table_name \u003d\u003d table:"},{"line_number":210,"context_line":"            return db_models.LogicalSwitch(value)"},{"line_number":211,"context_line":"        elif db_models.Floatingip.table_name \u003d\u003d table:"},{"line_number":212,"context_line":"            return db_models.Floatingip(value)"},{"line_number":213,"context_line":"        elif db_models.Chassis.table_name \u003d\u003d table:"},{"line_number":214,"context_line":"            return db_models.Chassis(value)"},{"line_number":215,"context_line":"        elif db_models.Publisher.table_name \u003d\u003d table:"},{"line_number":216,"context_line":"            return db_models.Publisher(value)"},{"line_number":217,"context_line":"        else:"},{"line_number":218,"context_line":"            return None"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def apply_db_change(self, table, key, action, value):"},{"line_number":221,"context_line":"        # determine if the action is allowed or not"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_b61d2b64","line":218,"range":{"start_line":201,"start_character":0,"end_line":218,"end_character":23},"in_reply_to":"3a71b18c_3dc65e68","updated":"2016-12-11 15:30:23.000000000","message":"Sounds good, thx","commit_id":"ac15a93fd12026d9fad0fd4566252424a738b3b0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b786348c7353d7ec01d532a41e313bf08db47025","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":54,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":55,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":56,"context_line":"        self._table_class_mapping \u003d {"},{"line_number":57,"context_line":"            db_models.LogicalSwitch.table_name: db_models.LogicalSwitch,"},{"line_number":58,"context_line":"            db_models.LogicalPort.table_name: db_models.LogicalPort,"},{"line_number":59,"context_line":"            db_models.LogicalRouter.table_name: db_models.LogicalRouter,"},{"line_number":60,"context_line":"            db_models.Floatingip.table_name: db_models.Floatingip,"},{"line_number":61,"context_line":"            db_models.SecurityGroup.table_name: db_models.SecurityGroup,"},{"line_number":62,"context_line":"            db_models.Publisher.table_name: db_models.Publisher,"},{"line_number":63,"context_line":"            db_models.QosPolicy.table_name: db_models.QosPolicy,"},{"line_number":64,"context_line":"            db_models.Chassis.table_name: db_models.Chassis"},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    def get_instance(is_neutron_server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_0fdcfae2","line":65,"range":{"start_line":56,"start_character":0,"end_line":65,"end_character":9},"updated":"2016-12-12 08:32:22.000000000","message":"Why not just save the list of models?\nI don\u0027t see the benefit of handling both table names and model themselves, if we can always get the table name from the model class.\nFurthermore we only need the table name for db access, I think for all other purposes, passing the model itself is better.","commit_id":"7c3cd02dea02cfaeeb712e0781c00bf39c245a7e"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"0647ca94e162762c0d6fab986ad51c2f18e00e0e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":54,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":55,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":56,"context_line":"        self._table_class_mapping \u003d {"},{"line_number":57,"context_line":"            db_models.LogicalSwitch.table_name: db_models.LogicalSwitch,"},{"line_number":58,"context_line":"            db_models.LogicalPort.table_name: db_models.LogicalPort,"},{"line_number":59,"context_line":"            db_models.LogicalRouter.table_name: db_models.LogicalRouter,"},{"line_number":60,"context_line":"            db_models.Floatingip.table_name: db_models.Floatingip,"},{"line_number":61,"context_line":"            db_models.SecurityGroup.table_name: db_models.SecurityGroup,"},{"line_number":62,"context_line":"            db_models.Publisher.table_name: db_models.Publisher,"},{"line_number":63,"context_line":"            db_models.QosPolicy.table_name: db_models.QosPolicy,"},{"line_number":64,"context_line":"            db_models.Chassis.table_name: db_models.Chassis"},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    def get_instance(is_neutron_server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_14d24500","line":65,"range":{"start_line":56,"start_character":0,"end_line":65,"end_character":9},"in_reply_to":"3a71b18c_0826b0cd","updated":"2016-12-12 11:10:01.000000000","message":"I can even take it further in my nb api patches a provide some method that given a model turns an object relevant to it:\n\n nb_api.handler(model).get_all()","commit_id":"7c3cd02dea02cfaeeb712e0781c00bf39c245a7e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"d60f0f62f1f96ec2d1f53b79c00fc345efd114f7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":54,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":55,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":56,"context_line":"        self._table_class_mapping \u003d {"},{"line_number":57,"context_line":"            db_models.LogicalSwitch.table_name: db_models.LogicalSwitch,"},{"line_number":58,"context_line":"            db_models.LogicalPort.table_name: db_models.LogicalPort,"},{"line_number":59,"context_line":"            db_models.LogicalRouter.table_name: db_models.LogicalRouter,"},{"line_number":60,"context_line":"            db_models.Floatingip.table_name: db_models.Floatingip,"},{"line_number":61,"context_line":"            db_models.SecurityGroup.table_name: db_models.SecurityGroup,"},{"line_number":62,"context_line":"            db_models.Publisher.table_name: db_models.Publisher,"},{"line_number":63,"context_line":"            db_models.QosPolicy.table_name: db_models.QosPolicy,"},{"line_number":64,"context_line":"            db_models.Chassis.table_name: db_models.Chassis"},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    def get_instance(is_neutron_server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_52aa1572","line":65,"range":{"start_line":56,"start_character":0,"end_line":65,"end_character":9},"in_reply_to":"3a71b18c_0fdcfae2","updated":"2016-12-12 08:55:39.000000000","message":"Here I just want to get the corresponding resource class by table name and dict search is more effective than list, and if your patch could provide the similar function, I would like to reuse it:)","commit_id":"7c3cd02dea02cfaeeb712e0781c00bf39c245a7e"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"18d76fbfe5fa17f826e2b1e6e8521e4bf2b2f058","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":54,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":55,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":56,"context_line":"        self._table_class_mapping \u003d {"},{"line_number":57,"context_line":"            db_models.LogicalSwitch.table_name: db_models.LogicalSwitch,"},{"line_number":58,"context_line":"            db_models.LogicalPort.table_name: db_models.LogicalPort,"},{"line_number":59,"context_line":"            db_models.LogicalRouter.table_name: db_models.LogicalRouter,"},{"line_number":60,"context_line":"            db_models.Floatingip.table_name: db_models.Floatingip,"},{"line_number":61,"context_line":"            db_models.SecurityGroup.table_name: db_models.SecurityGroup,"},{"line_number":62,"context_line":"            db_models.Publisher.table_name: db_models.Publisher,"},{"line_number":63,"context_line":"            db_models.QosPolicy.table_name: db_models.QosPolicy,"},{"line_number":64,"context_line":"            db_models.Chassis.table_name: db_models.Chassis"},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    def get_instance(is_neutron_server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_5a7067a4","line":65,"range":{"start_line":56,"start_character":0,"end_line":65,"end_character":9},"in_reply_to":"3a71b18c_14d24500","updated":"2016-12-12 11:20:39.000000000","message":"Actually I missed the part the part where we get table name in apply_db_change. For now we have to translate one to another.\n\nMaybe we can later on move the lookup to db/models.py and even have it created automatically.","commit_id":"7c3cd02dea02cfaeeb712e0781c00bf39c245a7e"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"acb7b191cc55c6e4460877b3484e7704cad027c8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":54,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":55,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":56,"context_line":"        self._table_class_mapping \u003d {"},{"line_number":57,"context_line":"            db_models.LogicalSwitch.table_name: db_models.LogicalSwitch,"},{"line_number":58,"context_line":"            db_models.LogicalPort.table_name: db_models.LogicalPort,"},{"line_number":59,"context_line":"            db_models.LogicalRouter.table_name: db_models.LogicalRouter,"},{"line_number":60,"context_line":"            db_models.Floatingip.table_name: db_models.Floatingip,"},{"line_number":61,"context_line":"            db_models.SecurityGroup.table_name: db_models.SecurityGroup,"},{"line_number":62,"context_line":"            db_models.Publisher.table_name: db_models.Publisher,"},{"line_number":63,"context_line":"            db_models.QosPolicy.table_name: db_models.QosPolicy,"},{"line_number":64,"context_line":"            db_models.Chassis.table_name: db_models.Chassis"},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    def get_instance(is_neutron_server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_e85974fe","line":65,"range":{"start_line":56,"start_character":0,"end_line":65,"end_character":9},"in_reply_to":"3a71b18c_52aa1572","updated":"2016-12-12 09:39:28.000000000","message":"I meant that we don\u0027t need the lookup at all, we can just pass the model on:\n\n for model in self._models:\n     if action \u003d\u003d \u0027delete\u0027:\n          obj_refresh.process_object(\n               self.controller, model, action, None, key)\n      else:\n           nb_object \u003d model(value)\n           obj_refresh.process_object(\n                 self.controller, model, action, nb_object)\n\n\nThis also takes into account that controller methods receive the model class itself rather than the table name (which will be obtained from the model when needed).","commit_id":"7c3cd02dea02cfaeeb712e0781c00bf39c245a7e"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"8f3cd01b2e2e57ed49cfc6a2fe1905c36397eac5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.is_neutron_server \u003d is_neutron_server"},{"line_number":54,"context_line":"        self.enable_selective_topo_dist \u003d \\"},{"line_number":55,"context_line":"            cfg.CONF.df.enable_selective_topology_distribution"},{"line_number":56,"context_line":"        self._table_class_mapping \u003d {"},{"line_number":57,"context_line":"            db_models.LogicalSwitch.table_name: db_models.LogicalSwitch,"},{"line_number":58,"context_line":"            db_models.LogicalPort.table_name: db_models.LogicalPort,"},{"line_number":59,"context_line":"            db_models.LogicalRouter.table_name: db_models.LogicalRouter,"},{"line_number":60,"context_line":"            db_models.Floatingip.table_name: db_models.Floatingip,"},{"line_number":61,"context_line":"            db_models.SecurityGroup.table_name: db_models.SecurityGroup,"},{"line_number":62,"context_line":"            db_models.Publisher.table_name: db_models.Publisher,"},{"line_number":63,"context_line":"            db_models.QosPolicy.table_name: db_models.QosPolicy,"},{"line_number":64,"context_line":"            db_models.Chassis.table_name: db_models.Chassis"},{"line_number":65,"context_line":"        }"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"},{"line_number":68,"context_line":"    def get_instance(is_neutron_server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a71b18c_0826b0cd","line":65,"range":{"start_line":56,"start_character":0,"end_line":65,"end_character":9},"in_reply_to":"3a71b18c_e85974fe","updated":"2016-12-12 09:50:13.000000000","message":"sounds good, it will make the code more clean, thx dimak:)","commit_id":"7c3cd02dea02cfaeeb712e0781c00bf39c245a7e"}],"dragonflow/db/models.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"90a0c464a5c557af41529b991e25df16536ec6c2","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"table_class_mapping \u003d {"},{"line_number":442,"context_line":"    LogicalSwitch.table_name: LogicalSwitch,"},{"line_number":443,"context_line":"    LogicalPort.table_name: LogicalPort,"},{"line_number":444,"context_line":"    LogicalRouter.table_name: LogicalRouter,"},{"line_number":445,"context_line":"    Floatingip.table_name: Floatingip,"},{"line_number":446,"context_line":"    SecurityGroup.table_name: SecurityGroup,"},{"line_number":447,"context_line":"    Publisher.table_name: Publisher,"},{"line_number":448,"context_line":"    QosPolicy.table_name: QosPolicy,"},{"line_number":449,"context_line":"    Chassis.table_name: Chassis"},{"line_number":450,"context_line":"}"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"def get_class_by_table(table):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_a5d7ee21","line":450,"range":{"start_line":441,"start_character":0,"end_line":450,"end_character":1},"updated":"2016-12-14 09:52:10.000000000","message":"I made some changes to this part at https://review.openstack.org/#/c/410645/\n\nthis is a relative complicating change, so I bring it up in a separate patch.","commit_id":"777fed802fa9176945eea587c620d0301ffdca8f"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"fde1e6f2f0585effc23c4578968245347e724e57","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"table_class_mapping \u003d {"},{"line_number":442,"context_line":"    LogicalSwitch.table_name: LogicalSwitch,"},{"line_number":443,"context_line":"    LogicalPort.table_name: LogicalPort,"},{"line_number":444,"context_line":"    LogicalRouter.table_name: LogicalRouter,"}],"source_content_type":"text/x-python","patch_set":16,"id":"da4df55a_cc0a0c79","line":441,"updated":"2016-12-27 12:32:02.000000000","message":"This can be created automatically with the registration code (but that can be done in another patch).","commit_id":"6965944c75db1e24e3e15af81d5ea7f0545c40f6"},{"author":{"_account_id":20287,"name":"hujie","email":"mike.hu@huawei.com","username":"hujie"},"change_message_id":"9c91de5f1a2e59be2eee490fff1d9be5b1cc5357","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        return str(self.ovs_port)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"table_class_mapping \u003d {"},{"line_number":442,"context_line":"    LogicalSwitch.table_name: LogicalSwitch,"},{"line_number":443,"context_line":"    LogicalPort.table_name: LogicalPort,"},{"line_number":444,"context_line":"    LogicalRouter.table_name: LogicalRouter,"}],"source_content_type":"text/x-python","patch_set":16,"id":"da4df55a_3a3c9cc7","line":441,"in_reply_to":"da4df55a_cc0a0c79","updated":"2016-12-28 03:23:10.000000000","message":"yes, that patch has been merged so I can reuse it:)","commit_id":"6965944c75db1e24e3e15af81d5ea7f0545c40f6"}]}
