)]}'
{"tricircle/network/central_plugin.py":[{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"176ac3b099de2d2d8c438dfec60aad2618e2cad5","unresolved":false,"context_lines":[{"line_number":576,"context_line":"                t_ctx, resource_id, resource_id, pod[\u0027pod_id\u0027],"},{"line_number":577,"context_line":"                port_body[\u0027tenant_id\u0027], resource_type)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def _trigger_xjob_for_vm_port(self, context, port_body, pod):"},{"line_number":580,"context_line":"        interfaces \u003d super(TricirclePlugin, self).get_ports("},{"line_number":581,"context_line":"            context,"},{"line_number":582,"context_line":"            {\u0027network_id\u0027: [port_body[\u0027network_id\u0027]],"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_671f6e08","line":579,"range":{"start_line":579,"start_character":8,"end_line":579,"end_character":33},"updated":"2017-03-10 02:42:34.000000000","message":"_trigger_xjob_for_router","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"a18c15411e40636c721c025cdc5375c619b6e1c7","unresolved":false,"context_lines":[{"line_number":576,"context_line":"                t_ctx, resource_id, resource_id, pod[\u0027pod_id\u0027],"},{"line_number":577,"context_line":"                port_body[\u0027tenant_id\u0027], resource_type)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def _trigger_xjob_for_vm_port(self, context, port_body, pod):"},{"line_number":580,"context_line":"        interfaces \u003d super(TricirclePlugin, self).get_ports("},{"line_number":581,"context_line":"            context,"},{"line_number":582,"context_line":"            {\u0027network_id\u0027: [port_body[\u0027network_id\u0027]],"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_55abeb74","line":579,"range":{"start_line":579,"start_character":8,"end_line":579,"end_character":33},"in_reply_to":"9a30ddce_671f6e08","updated":"2017-03-10 07:35:33.000000000","message":"ok","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"},{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"176ac3b099de2d2d8c438dfec60aad2618e2cad5","unresolved":false,"context_lines":[{"line_number":1143,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1144,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1145,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1146,"context_line":"            with t_ctx.session.begin():"},{"line_number":1147,"context_line":"                core.delete_resources("},{"line_number":1148,"context_line":"                    t_ctx, models.ResourceRouting,"},{"line_number":1149,"context_line":"                    filters\u003d[{\u0027key\u0027: \u0027top_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1150,"context_line":"                              \u0027value\u0027: bridge_port_id},"},{"line_number":1151,"context_line":"                             {\u0027key\u0027: \u0027pod_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1152,"context_line":"                              \u0027value\u0027: pod[\u0027pod_id\u0027]}])"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"    def delete_router(self, context, _id):"},{"line_number":1155,"context_line":"        router \u003d super(TricirclePlugin,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_677bee28","line":1152,"range":{"start_line":1146,"start_character":12,"end_line":1152,"end_character":55},"updated":"2017-03-10 02:42:34.000000000","message":"move to dbapi","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"a18c15411e40636c721c025cdc5375c619b6e1c7","unresolved":false,"context_lines":[{"line_number":1143,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1144,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1145,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1146,"context_line":"            with t_ctx.session.begin():"},{"line_number":1147,"context_line":"                core.delete_resources("},{"line_number":1148,"context_line":"                    t_ctx, models.ResourceRouting,"},{"line_number":1149,"context_line":"                    filters\u003d[{\u0027key\u0027: \u0027top_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1150,"context_line":"                              \u0027value\u0027: bridge_port_id},"},{"line_number":1151,"context_line":"                             {\u0027key\u0027: \u0027pod_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1152,"context_line":"                              \u0027value\u0027: pod[\u0027pod_id\u0027]}])"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"    def delete_router(self, context, _id):"},{"line_number":1155,"context_line":"        router \u003d super(TricirclePlugin,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_f5e93fb8","line":1152,"range":{"start_line":1146,"start_character":12,"end_line":1152,"end_character":55},"in_reply_to":"9a30ddce_677bee28","updated":"2017-03-10 07:35:33.000000000","message":"these codes are remove in part5, we do not create resource routing entry for shadow port in part5","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"},{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"20afbe16a0d6c7f7a6a649ba36d90c94232c13dd","unresolved":false,"context_lines":[{"line_number":609,"context_line":"            # request may be come from service, we use an admin context"},{"line_number":610,"context_line":"            # to run the xjob"},{"line_number":611,"context_line":"            admin_context \u003d t_context.get_admin_context()"},{"line_number":612,"context_line":"            self.xjob_handler.setup_bottom_router("},{"line_number":613,"context_line":"                admin_context, port_body[\u0027network_id\u0027],"},{"line_number":614,"context_line":"                interfaces[0][\u0027device_id\u0027], pod[\u0027pod_id\u0027])"},{"line_number":615,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a1ff146_11ef52e9","line":612,"range":{"start_line":612,"start_character":17,"end_line":612,"end_character":29},"updated":"2017-03-15 08:03:42.000000000","message":"what if the network has been attached to multiple routers? I suggest at least we need to log all routers the network attached to now. How to handle the multiple routers may put in the wishlist.","commit_id":"6df05b039ca32d43f1f8330c747ff1917b03c37f"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"d475e524470db0722a89823201a1ea30ea75af80","unresolved":false,"context_lines":[{"line_number":609,"context_line":"            # request may be come from service, we use an admin context"},{"line_number":610,"context_line":"            # to run the xjob"},{"line_number":611,"context_line":"            admin_context \u003d t_context.get_admin_context()"},{"line_number":612,"context_line":"            self.xjob_handler.setup_bottom_router("},{"line_number":613,"context_line":"                admin_context, port_body[\u0027network_id\u0027],"},{"line_number":614,"context_line":"                interfaces[0][\u0027device_id\u0027], pod[\u0027pod_id\u0027])"},{"line_number":615,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a1ff146_3c18a584","line":612,"range":{"start_line":612,"start_character":17,"end_line":612,"end_character":29},"in_reply_to":"3a1ff146_11ef52e9","updated":"2017-03-15 08:39:50.000000000","message":"Currently we don\u0027t support one network being attached to multiple routers. As you suggest, I will add a log output here.","commit_id":"6df05b039ca32d43f1f8330c747ff1917b03c37f"},{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"20afbe16a0d6c7f7a6a649ba36d90c94232c13dd","unresolved":false,"context_lines":[{"line_number":1164,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1165,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1166,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1167,"context_line":"            with t_ctx.session.begin():"},{"line_number":1168,"context_line":"                core.delete_resources("},{"line_number":1169,"context_line":"                    t_ctx, models.ResourceRouting,"},{"line_number":1170,"context_line":"                    filters\u003d[{\u0027key\u0027: \u0027top_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1171,"context_line":"                              \u0027value\u0027: bridge_port_id},"},{"line_number":1172,"context_line":"                             {\u0027key\u0027: \u0027pod_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1173,"context_line":"                              \u0027value\u0027: pod[\u0027pod_id\u0027]}])"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    def delete_router(self, context, _id):"},{"line_number":1176,"context_line":"        router \u003d super(TricirclePlugin,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a1ff146_2e186f84","line":1173,"range":{"start_line":1167,"start_character":11,"end_line":1173,"end_character":55},"updated":"2017-03-15 08:03:42.000000000","message":"move to db_api.py","commit_id":"6df05b039ca32d43f1f8330c747ff1917b03c37f"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"d475e524470db0722a89823201a1ea30ea75af80","unresolved":false,"context_lines":[{"line_number":1164,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1165,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1166,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1167,"context_line":"            with t_ctx.session.begin():"},{"line_number":1168,"context_line":"                core.delete_resources("},{"line_number":1169,"context_line":"                    t_ctx, models.ResourceRouting,"},{"line_number":1170,"context_line":"                    filters\u003d[{\u0027key\u0027: \u0027top_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1171,"context_line":"                              \u0027value\u0027: bridge_port_id},"},{"line_number":1172,"context_line":"                             {\u0027key\u0027: \u0027pod_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1173,"context_line":"                              \u0027value\u0027: pod[\u0027pod_id\u0027]}])"},{"line_number":1174,"context_line":""},{"line_number":1175,"context_line":"    def delete_router(self, context, _id):"},{"line_number":1176,"context_line":"        router \u003d super(TricirclePlugin,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a1ff146_bcdbb5ec","line":1173,"range":{"start_line":1167,"start_character":11,"end_line":1173,"end_character":55},"in_reply_to":"3a1ff146_2e186f84","updated":"2017-03-15 08:39:50.000000000","message":"These codes are removed in part5 because we don\u0027t create resource routing entries for shadow ports after the optimization.","commit_id":"6df05b039ca32d43f1f8330c747ff1917b03c37f"},{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"f8e845e42093acce0e8e3532a97f88f24f7e5bb4","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            if bridge_ports:"},{"line_number":1200,"context_line":"                # we will not create bridge ports for local router, so here no"},{"line_number":1201,"context_line":"                # need to check \"is_local_router\" again"},{"line_number":1202,"context_line":"                t_ns_port_id \u003d bridge_ports[0][\u0027id\u0027]"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"                if not is_ns:"},{"line_number":1205,"context_line":"                    b_client.action_routers(t_ctx, \u0027remove_gateway\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a1ced50_5882b653","line":1202,"range":{"start_line":1202,"start_character":16,"end_line":1202,"end_character":28},"updated":"2017-03-18 01:38:00.000000000","message":"t_ns_port_id -\u003e t_bridge_port_id. It\u0027s t-ns-port-id only if is_ns, not always in the loop","commit_id":"658abffd0491a1b6c9902f8f9472045f2a3cbbac"},{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"423b52909e2fd8c06e1c84ad2e1851312cda97bb","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            if bridge_ports:"},{"line_number":1200,"context_line":"                # we will not create bridge ports for local router, so here no"},{"line_number":1201,"context_line":"                # need to check \"is_local_router\" again"},{"line_number":1202,"context_line":"                t_ns_port_id \u003d bridge_ports[0][\u0027id\u0027]"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"                if not is_ns:"},{"line_number":1205,"context_line":"                    b_client.action_routers(t_ctx, \u0027remove_gateway\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a1ced50_18c91e79","line":1202,"range":{"start_line":1202,"start_character":16,"end_line":1202,"end_character":28},"in_reply_to":"1a1ced50_5882b653","updated":"2017-03-18 02:04:45.000000000","message":"if we look at bottom, this port is ns-port if not is_ns, it\u0027s router interface if is_ns","commit_id":"658abffd0491a1b6c9902f8f9472045f2a3cbbac"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"6e2e3ecf02062f57e2cc5378e4a6659890ed8a8a","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            if bridge_ports:"},{"line_number":1200,"context_line":"                # we will not create bridge ports for local router, so here no"},{"line_number":1201,"context_line":"                # need to check \"is_local_router\" again"},{"line_number":1202,"context_line":"                t_ns_port_id \u003d bridge_ports[0][\u0027id\u0027]"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"                if not is_ns:"},{"line_number":1205,"context_line":"                    b_client.action_routers(t_ctx, \u0027remove_gateway\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a1ced50_edd39436","line":1202,"range":{"start_line":1202,"start_character":16,"end_line":1202,"end_character":28},"in_reply_to":"1a1ced50_5882b653","updated":"2017-03-20 01:58:49.000000000","message":"ok, will rename this variable","commit_id":"658abffd0491a1b6c9902f8f9472045f2a3cbbac"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":594,"context_line":"            for sg_id in port_body[\u0027security_groups\u0027]:"},{"line_number":595,"context_line":"                entries.append((sg_id, t_constants.RT_SG))"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        for resource_id, resource_type in entries:"},{"line_number":598,"context_line":"            if db_api.get_bottom_id_by_top_id_region_name("},{"line_number":599,"context_line":"                    t_ctx, resource_id, pod[\u0027region_name\u0027], resource_type):"},{"line_number":600,"context_line":"                continue"},{"line_number":601,"context_line":"            db_api.create_resource_mapping("},{"line_number":602,"context_line":"                t_ctx, resource_id, resource_id, pod[\u0027pod_id\u0027],"},{"line_number":603,"context_line":"                port_body[\u0027tenant_id\u0027], resource_type)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def _trigger_router_xjob_for_vm_port(self, context, port_body, pod):"},{"line_number":606,"context_line":"        interfaces \u003d super(TricirclePlugin, self).get_ports("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_991f345a","line":603,"range":{"start_line":597,"start_character":8,"end_line":603,"end_character":54},"updated":"2017-03-22 21:11:36.000000000","message":"Ideally these operations should be happen in a single transaction, specially because something can be inserted between after the condition in the line 598.  I still don\u0027t have an idea how to do it, but maybe one approach can be extracting this as method and managing the transaction from there.\n\n        for resource_id, resource_type in entries:\n            TricirclePlugin._ensure_resource_mapping(\n                t_ctx, resource_id, pod[\u0027region_name\u0027], resource_type,\n                pod[\u0027pod_id\u0027], port_body[\u0027tenant_id\u0027])\n\n    @staticmethod\n    def _ensure_resource_mapping(\n            ctx, _id, region_name, _type, pod_id, tenant_id):\n        if not db_api.get_bottom_id_by_top_id_region_name(\n                ctx, _id, region_name, _type):\n            db_api.create_resource_mapping(\n                ctx, _id, _id, pod_id, tenant_id, _type)","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":594,"context_line":"            for sg_id in port_body[\u0027security_groups\u0027]:"},{"line_number":595,"context_line":"                entries.append((sg_id, t_constants.RT_SG))"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        for resource_id, resource_type in entries:"},{"line_number":598,"context_line":"            if db_api.get_bottom_id_by_top_id_region_name("},{"line_number":599,"context_line":"                    t_ctx, resource_id, pod[\u0027region_name\u0027], resource_type):"},{"line_number":600,"context_line":"                continue"},{"line_number":601,"context_line":"            db_api.create_resource_mapping("},{"line_number":602,"context_line":"                t_ctx, resource_id, resource_id, pod[\u0027pod_id\u0027],"},{"line_number":603,"context_line":"                port_body[\u0027tenant_id\u0027], resource_type)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def _trigger_router_xjob_for_vm_port(self, context, port_body, pod):"},{"line_number":606,"context_line":"        interfaces \u003d super(TricirclePlugin, self).get_ports("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_f791ff47","line":603,"range":{"start_line":597,"start_character":8,"end_line":603,"end_character":54},"in_reply_to":"1a1ced50_991f345a","updated":"2017-03-23 08:55:27.000000000","message":"create_resource_mapping will catch DBDuplicateEntry exception so if another process creates the same mapping after the judge in line 598, line 601 will not fail.","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                port_body[\u0027tenant_id\u0027], resource_type)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def _trigger_router_xjob_for_vm_port(self, context, port_body, pod):"},{"line_number":606,"context_line":"        interfaces \u003d super(TricirclePlugin, self).get_ports("},{"line_number":607,"context_line":"            context,"},{"line_number":608,"context_line":"            {\u0027network_id\u0027: [port_body[\u0027network_id\u0027]],"},{"line_number":609,"context_line":"             \u0027device_owner\u0027: [constants.DEVICE_OWNER_ROUTER_INTF]})"},{"line_number":610,"context_line":"        interfaces \u003d [inf for inf in interfaces if inf[\u0027device_id\u0027]]"},{"line_number":611,"context_line":"        if interfaces:"},{"line_number":612,"context_line":"            # request may be come from service, we use an admin context"},{"line_number":613,"context_line":"            # to run the xjob"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_397c80b4","line":610,"range":{"start_line":606,"start_character":8,"end_line":610,"end_character":68},"updated":"2017-03-22 21:11:36.000000000","message":"Apparently you can take advantage of the \u0027fields\u0027 argument to only retrieve the device_id information of the ports. So maybe this can be simplified as\n    interfaces \u003d super(TricirclePlugin, self).get_ports(\n            context, filters\u003d{\u0027network_id\u0027: [port_body[\u0027network_id\u0027]],\n             \u0027device_owner\u0027: [constants.DEVICE_OWNER_ROUTER_INTF]}, fields\u003d[\u0027device_id\u0027])\n        interfaces \u003d [inf for inf in interfaces if inf[\u0027device_id\u0027]]","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":607,"context_line":"            context,"},{"line_number":608,"context_line":"            {\u0027network_id\u0027: [port_body[\u0027network_id\u0027]],"},{"line_number":609,"context_line":"             \u0027device_owner\u0027: [constants.DEVICE_OWNER_ROUTER_INTF]})"},{"line_number":610,"context_line":"        interfaces \u003d [inf for inf in interfaces if inf[\u0027device_id\u0027]]"},{"line_number":611,"context_line":"        if interfaces:"},{"line_number":612,"context_line":"            # request may be come from service, we use an admin context"},{"line_number":613,"context_line":"            # to run the xjob"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_2c2fe088","line":610,"range":{"start_line":610,"start_character":8,"end_line":610,"end_character":68},"updated":"2017-03-22 21:11:36.000000000","message":"Given that \u0027device_id\" is the only thing that you use later, you can discard the rest of the information\n\nrouter_ids \u003d [inf[\u0027device_id\u0027] for inf in interfaces if inf[\u0027device_id\u0027]]\n\nthat will simplify the line 621 and remove the line 614","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                port_body[\u0027tenant_id\u0027], resource_type)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def _trigger_router_xjob_for_vm_port(self, context, port_body, pod):"},{"line_number":606,"context_line":"        interfaces \u003d super(TricirclePlugin, self).get_ports("},{"line_number":607,"context_line":"            context,"},{"line_number":608,"context_line":"            {\u0027network_id\u0027: [port_body[\u0027network_id\u0027]],"},{"line_number":609,"context_line":"             \u0027device_owner\u0027: [constants.DEVICE_OWNER_ROUTER_INTF]})"},{"line_number":610,"context_line":"        interfaces \u003d [inf for inf in interfaces if inf[\u0027device_id\u0027]]"},{"line_number":611,"context_line":"        if interfaces:"},{"line_number":612,"context_line":"            # request may be come from service, we use an admin context"},{"line_number":613,"context_line":"            # to run the xjob"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_7cb33498","line":610,"range":{"start_line":606,"start_character":8,"end_line":610,"end_character":68},"in_reply_to":"1a1ced50_397c80b4","updated":"2017-03-23 08:55:27.000000000","message":"oh yes","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                         bridge_port_id, bridge_port_name)"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"    def _delete_shadow_bridge_port(self, t_ctx, bridge_port_id):"},{"line_number":1169,"context_line":"        mappings \u003d db_api.get_bottom_mappings_by_top_id(t_ctx, bridge_port_id,"},{"line_number":1170,"context_line":"                                                        t_constants.RT_SD_PORT)"},{"line_number":1171,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1172,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1173,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1174,"context_line":"            with t_ctx.session.begin():"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_6ca1d8f7","line":1171,"range":{"start_line":1169,"start_character":8,"end_line":1171,"end_character":39},"updated":"2017-03-22 21:11:36.000000000","message":"nit: these lines can be merged\n\n        for pod, b_port_id in b_api.get_bottom_mappings_by_top_id(t_ctx, bridge_port_id,\n                                                        t_constants.RT_SD_PORT):","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"                                         bridge_port_id, bridge_port_name)"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"    def _delete_shadow_bridge_port(self, t_ctx, bridge_port_id):"},{"line_number":1169,"context_line":"        mappings \u003d db_api.get_bottom_mappings_by_top_id(t_ctx, bridge_port_id,"},{"line_number":1170,"context_line":"                                                        t_constants.RT_SD_PORT)"},{"line_number":1171,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1172,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1173,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1174,"context_line":"            with t_ctx.session.begin():"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_3c6c5c07","line":1171,"range":{"start_line":1169,"start_character":8,"end_line":1171,"end_character":39},"in_reply_to":"1a1ced50_6ca1d8f7","updated":"2017-03-23 08:55:27.000000000","message":"ok","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1172,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1173,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1174,"context_line":"            with t_ctx.session.begin():"},{"line_number":1175,"context_line":"                core.delete_resources("},{"line_number":1176,"context_line":"                    t_ctx, models.ResourceRouting,"},{"line_number":1177,"context_line":"                    filters\u003d[{\u0027key\u0027: \u0027top_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1178,"context_line":"                              \u0027value\u0027: bridge_port_id},"},{"line_number":1179,"context_line":"                             {\u0027key\u0027: \u0027pod_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1180,"context_line":"                              \u0027value\u0027: pod[\u0027pod_id\u0027]}])"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":"    def delete_router(self, context, _id):"},{"line_number":1183,"context_line":"        router \u003d super(TricirclePlugin,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_ecc22884","line":1180,"range":{"start_line":1174,"start_character":12,"end_line":1180,"end_character":55},"updated":"2017-03-22 21:11:36.000000000","message":"Shouldn\u0027t be better to have a separate class to execute all the db operations instead of doing in place","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":1171,"context_line":"        for pod, b_port_id in mappings:"},{"line_number":1172,"context_line":"            region_name \u003d pod[\u0027region_name\u0027]"},{"line_number":1173,"context_line":"            self._get_client(region_name).delete_ports(t_ctx, b_port_id)"},{"line_number":1174,"context_line":"            with t_ctx.session.begin():"},{"line_number":1175,"context_line":"                core.delete_resources("},{"line_number":1176,"context_line":"                    t_ctx, models.ResourceRouting,"},{"line_number":1177,"context_line":"                    filters\u003d[{\u0027key\u0027: \u0027top_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1178,"context_line":"                              \u0027value\u0027: bridge_port_id},"},{"line_number":1179,"context_line":"                             {\u0027key\u0027: \u0027pod_id\u0027, \u0027comparator\u0027: \u0027eq\u0027,"},{"line_number":1180,"context_line":"                              \u0027value\u0027: pod[\u0027pod_id\u0027]}])"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":"    def delete_router(self, context, _id):"},{"line_number":1183,"context_line":"        router \u003d super(TricirclePlugin,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_bc2e8ca2","line":1180,"range":{"start_line":1174,"start_character":12,"end_line":1180,"end_character":55},"in_reply_to":"1a1ced50_ecc22884","updated":"2017-03-23 08:55:27.000000000","message":"ok, will move these codes to db/api.py","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"            b_client \u003d self._get_client(pod[\u0027region_name\u0027])"},{"line_number":1198,"context_line":"            bridge_port_name \u003d t_constants.bridge_port_name % (project_id,"},{"line_number":1199,"context_line":"                                                               b_router_id)"},{"line_number":1200,"context_line":"            bridge_ports \u003d super(TricirclePlugin, self).get_ports("},{"line_number":1201,"context_line":"                context, {\u0027name\u0027: [bridge_port_name]})"},{"line_number":1202,"context_line":"            if bridge_ports:"},{"line_number":1203,"context_line":"                # we will not create bridge ports for local router, so here no"},{"line_number":1204,"context_line":"                # need to check \"is_local_router\" again"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_4c089cda","line":1201,"range":{"start_line":1200,"start_character":12,"end_line":1201,"end_character":54},"updated":"2017-03-22 21:11:36.000000000","message":"shouldn\u0027t be better to restrict the number of results to 1?","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"            b_client \u003d self._get_client(pod[\u0027region_name\u0027])"},{"line_number":1198,"context_line":"            bridge_port_name \u003d t_constants.bridge_port_name % (project_id,"},{"line_number":1199,"context_line":"                                                               b_router_id)"},{"line_number":1200,"context_line":"            bridge_ports \u003d super(TricirclePlugin, self).get_ports("},{"line_number":1201,"context_line":"                context, {\u0027name\u0027: [bridge_port_name]})"},{"line_number":1202,"context_line":"            if bridge_ports:"},{"line_number":1203,"context_line":"                # we will not create bridge ports for local router, so here no"},{"line_number":1204,"context_line":"                # need to check \"is_local_router\" again"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_b74a2753","line":1201,"range":{"start_line":1200,"start_character":12,"end_line":1201,"end_character":54},"in_reply_to":"1a1ced50_4c089cda","updated":"2017-03-23 08:55:27.000000000","message":"use limit parameter when calling get_ports or use assertion?","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"4e9445c8a08f58377faed3a15a859a028a09e885","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"            b_client \u003d self._get_client(pod[\u0027region_name\u0027])"},{"line_number":1198,"context_line":"            bridge_port_name \u003d t_constants.bridge_port_name % (project_id,"},{"line_number":1199,"context_line":"                                                               b_router_id)"},{"line_number":1200,"context_line":"            bridge_ports \u003d super(TricirclePlugin, self).get_ports("},{"line_number":1201,"context_line":"                context, {\u0027name\u0027: [bridge_port_name]})"},{"line_number":1202,"context_line":"            if bridge_ports:"},{"line_number":1203,"context_line":"                # we will not create bridge ports for local router, so here no"},{"line_number":1204,"context_line":"                # need to check \"is_local_router\" again"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_174a0428","line":1201,"range":{"start_line":1200,"start_character":12,"end_line":1201,"end_character":54},"in_reply_to":"1a1ced50_b74a2753","updated":"2017-03-23 16:38:17.000000000","message":"get_ports","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"}],"tricircle/network/helper.py":[{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":739,"context_line":""},{"line_number":740,"context_line":"        :param port: port dict"},{"line_number":741,"context_line":"        :param bridge_cidr: bridge subnet CIDR"},{"line_number":742,"context_line":"        :return: True/False"},{"line_number":743,"context_line":"        \"\"\""},{"line_number":744,"context_line":"        device_owner \u003d port.get(\u0027device_owner\u0027, \u0027\u0027)"},{"line_number":745,"context_line":"        if device_owner.startswith(\u0027compute:\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_0c4ea4c0","line":742,"range":{"start_line":742,"start_character":17,"end_line":742,"end_character":27},"updated":"2017-03-22 21:11:36.000000000","message":"and None if the condition in the line 757 is not meet, the execution will reach the end returning None to the caller. Is that the desired behavior? or you can modify it to return it a boolean always\n\n    return (netaddr.IPAddress(ip) in netaddr.IPNetwork(bridge_cidr))","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":739,"context_line":""},{"line_number":740,"context_line":"        :param port: port dict"},{"line_number":741,"context_line":"        :param bridge_cidr: bridge subnet CIDR"},{"line_number":742,"context_line":"        :return: True/False"},{"line_number":743,"context_line":"        \"\"\""},{"line_number":744,"context_line":"        device_owner \u003d port.get(\u0027device_owner\u0027, \u0027\u0027)"},{"line_number":745,"context_line":"        if device_owner.startswith(\u0027compute:\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_d7ec03bd","line":742,"range":{"start_line":742,"start_character":17,"end_line":742,"end_character":27},"in_reply_to":"1a1ced50_0c4ea4c0","updated":"2017-03-23 08:55:27.000000000","message":"oh, should be what you suggest:\n\nreturn (netaddr.IPAddress(ip) in netaddr.IPNetwork(bridge_cidr))","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"}],"tricircle/tests/unit/network/test_central_plugin.py":[{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"176ac3b099de2d2d8c438dfec60aad2618e2cad5","unresolved":false,"context_lines":[{"line_number":2296,"context_line":"                \u0027host\u0027: \u0027fake_host\u0027,"},{"line_number":2297,"context_line":"                \u0027type\u0027: \u0027Open vSwitch agent\u0027,"},{"line_number":2298,"context_line":"                \u0027tunnel_ip\u0027: \u0027192.168.1.101\u0027,"},{"line_number":2299,"context_line":"                \u0027device\u0027: \u0027compute: None\u0027"},{"line_number":2300,"context_line":"            }}"},{"line_number":2301,"context_line":"        }"},{"line_number":2302,"context_line":"        fake_plugin.update_port("}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_62391cd7","line":2299,"range":{"start_line":2299,"start_character":40,"end_line":2299,"end_character":41},"updated":"2017-03-10 02:42:34.000000000","message":"need to add test cases for new function","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"b694f825be670c021cc5b9228ee686cdc169417e","unresolved":false,"context_lines":[{"line_number":2296,"context_line":"                \u0027host\u0027: \u0027fake_host\u0027,"},{"line_number":2297,"context_line":"                \u0027type\u0027: \u0027Open vSwitch agent\u0027,"},{"line_number":2298,"context_line":"                \u0027tunnel_ip\u0027: \u0027192.168.1.101\u0027,"},{"line_number":2299,"context_line":"                \u0027device\u0027: \u0027compute: None\u0027"},{"line_number":2300,"context_line":"            }}"},{"line_number":2301,"context_line":"        }"},{"line_number":2302,"context_line":"        fake_plugin.update_port("}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_9b939f5a","line":2299,"range":{"start_line":2299,"start_character":40,"end_line":2299,"end_character":41},"in_reply_to":"9a30ddce_62391cd7","updated":"2017-03-13 03:03:06.000000000","message":"Most the new functions are old codes but were just moved to a function, so the existing tests already test them. I will add a missing test that tests the vxlan bridge network case.","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"}],"tricircle/tests/unit/network/test_local_plugin.py":[{"author":{"_account_id":11819,"name":"Chaoyi Huang","email":"joehuang@huawei.com","username":"joehuang"},"change_message_id":"176ac3b099de2d2d8c438dfec60aad2618e2cad5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    def get_subnet(self, context, _id, fields\u003dNone):"},{"line_number":115,"context_line":"        return get_resource(\u0027subnet\u0027, False, _id)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def create_port(self, context, port):"},{"line_number":118,"context_line":"        create_resource(\u0027port\u0027, False, port[\u0027port\u0027])"},{"line_number":119,"context_line":"        return port[\u0027port\u0027]"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_2223a4a8","line":117,"range":{"start_line":117,"start_character":35,"end_line":117,"end_character":39},"updated":"2017-03-10 02:42:34.000000000","message":"need to add test cases for new function","commit_id":"30aa7001c15b584562270bfdc72f8b2b40680afc"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":477,"context_line":"            b_port.pop(\u0027project_id\u0027)"},{"line_number":478,"context_line":"            self.assertDictEqual(t_ports[i], b_port)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    # @patch.object(FakeCorePlugin, \u0027update_port\u0027)"},{"line_number":481,"context_line":"    @patch.object(t_context, \u0027get_context_from_neutron_context\u0027)"},{"line_number":482,"context_line":"    @patch.object(FakeNeutronHandle, \u0027handle_update\u0027)"},{"line_number":483,"context_line":"    def test_update_port(self, mock_update, mock_context):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_0f55b6c4","line":480,"range":{"start_line":480,"start_character":4,"end_line":480,"end_character":50},"updated":"2017-03-22 21:11:36.000000000","message":"oops","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":477,"context_line":"            b_port.pop(\u0027project_id\u0027)"},{"line_number":478,"context_line":"            self.assertDictEqual(t_ports[i], b_port)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    # @patch.object(FakeCorePlugin, \u0027update_port\u0027)"},{"line_number":481,"context_line":"    @patch.object(t_context, \u0027get_context_from_neutron_context\u0027)"},{"line_number":482,"context_line":"    @patch.object(FakeNeutronHandle, \u0027handle_update\u0027)"},{"line_number":483,"context_line":"    def test_update_port(self, mock_update, mock_context):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_b71f87b5","line":480,"range":{"start_line":480,"start_character":4,"end_line":480,"end_character":50},"in_reply_to":"1a1ced50_0f55b6c4","updated":"2017-03-23 08:55:27.000000000","message":"oops","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c7fcea50e46de106875b36bbecfb3cdb83b07fdb","unresolved":false,"context_lines":[{"line_number":587,"context_line":"                                    constants.PROFILE_FORCE_UP: True}}})"},{"line_number":588,"context_line":"        b_port \u003d get_resource(\u0027port\u0027, False, port_id)"},{"line_number":589,"context_line":"        # port status is update to active"},{"line_number":590,"context_line":"        self.assertEqual(b_port[\u0027status\u0027], q_constants.PORT_STATUS_ACTIVE)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    @patch.object(t_context, \u0027get_context_from_neutron_context\u0027)"},{"line_number":593,"context_line":"    def test_update_subnet(self, mock_context):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_4f088eda","line":590,"range":{"start_line":590,"start_character":8,"end_line":590,"end_character":74},"updated":"2017-03-22 21:11:36.000000000","message":"Usually the order of the arguments in the assert function is the expected value at the beginning","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"},{"author":{"_account_id":12076,"name":"Zhiyuan Cai","email":"luckyvega.g@gmail.com","username":"zhiyuan_cai"},"change_message_id":"5ef8b760f31532b7c9b134eacd935523cec7a426","unresolved":false,"context_lines":[{"line_number":587,"context_line":"                                    constants.PROFILE_FORCE_UP: True}}})"},{"line_number":588,"context_line":"        b_port \u003d get_resource(\u0027port\u0027, False, port_id)"},{"line_number":589,"context_line":"        # port status is update to active"},{"line_number":590,"context_line":"        self.assertEqual(b_port[\u0027status\u0027], q_constants.PORT_STATUS_ACTIVE)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    @patch.object(t_context, \u0027get_context_from_neutron_context\u0027)"},{"line_number":593,"context_line":"    def test_update_subnet(self, mock_context):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a1ced50_57a1f344","line":590,"range":{"start_line":590,"start_character":8,"end_line":590,"end_character":74},"in_reply_to":"1a1ced50_4f088eda","updated":"2017-03-23 08:55:27.000000000","message":"oh, I need to figure out a way to remember the order","commit_id":"f46835b117b41892b06f992f08f9bad299243f1b"}]}
