)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"4824db1cfe2889babf1eff4e8d7d6e7ee80cbeb6","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kebo Duan \u003cduankebo@outlook.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-03-30 17:16:40 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":" Please enter the commit message for your changes. Lines starting"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ice5993aa3700df98fbff421d4583a6ed963c9aaf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ba0121b8_105b9855","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":65},"updated":"2016-03-30 09:51:54.000000000","message":"please provide useful information about this patch.","commit_id":"6f44758b9af70caca1f34d9343fb7ed16e1fe143"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"1ada23626acb7fafb30e24cc72729ecc1953c347","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kebo Duan \u003cduankebo@outlook.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-03-30 17:16:40 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":" Please enter the commit message for your changes. Lines starting"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ice5993aa3700df98fbff421d4583a6ed963c9aaf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ba0121b8_a36ed6fe","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":65},"in_reply_to":"ba0121b8_105b9855","updated":"2016-03-30 13:25:07.000000000","message":"Done","commit_id":"6f44758b9af70caca1f34d9343fb7ed16e1fe143"}],"dragonflow/tests/fullstack/test_topology.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"05d18e3935b4c67b4fd4ff6dcacb4ce6295f7ca3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            \u0027ip_version\u0027: 4,\r"},{"line_number":39,"context_line":"            \u0027name\u0027: \u0027private\u0027,\r"},{"line_number":40,"context_line":"            \u0027enable_dhcp\u0027: True}\r"},{"line_number":41,"context_line":"        subnet \u003d self.neutron.create_subnet({\u0027subnet\u0027: subnet})\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":44,"context_line":"        vm.create(network\u003dnetwork)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_3203e8b9","line":41,"updated":"2016-03-24 01:21:29.000000000","message":"please check the object is created successfully.\nself.assertTrue(network.exists())\nself.assertTrue(subnet.exists())","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"f92418fb763a936d2aeba93b9909c597d6803e23","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            \u0027ip_version\u0027: 4,\r"},{"line_number":39,"context_line":"            \u0027name\u0027: \u0027private\u0027,\r"},{"line_number":40,"context_line":"            \u0027enable_dhcp\u0027: True}\r"},{"line_number":41,"context_line":"        subnet \u003d self.neutron.create_subnet({\u0027subnet\u0027: subnet})\r"},{"line_number":42,"context_line":"\r"},{"line_number":43,"context_line":"        vm \u003d self.store(objects.VMTestObj(self, self.neutron))\r"},{"line_number":44,"context_line":"        vm.create(network\u003dnetwork)\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_55d6464f","line":41,"in_reply_to":"fa0719c6_3203e8b9","updated":"2016-03-24 13:05:44.000000000","message":"Done","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"05d18e3935b4c67b4fd4ff6dcacb4ce6295f7ca3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        vm.close()\r"},{"line_number":50,"context_line":"        self.assertTrue(self._wait_for_flow_removal(vm_ip, 30))\r"},{"line_number":51,"context_line":"        # sometimes, the network can\u0027t be cleared successfully.\r"},{"line_number":52,"context_line":"        time.sleep(10)\r"},{"line_number":53,"context_line":"\r"},{"line_number":54,"context_line":"    def _get_vm_flows(self, vm_ip):\r"},{"line_number":55,"context_line":"        ovs_flows_parser \u003d OvsFlowsParser()\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_52d93c56","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":22},"updated":"2016-03-24 01:21:29.000000000","message":"there is a global timeout definition for commands.\ntime.sleep(utils.DEFAULT_CMD_TIMEOUT)\n\nand you should destroy the resource you created before.\nnetwork.close()","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"f92418fb763a936d2aeba93b9909c597d6803e23","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        vm.close()\r"},{"line_number":50,"context_line":"        self.assertTrue(self._wait_for_flow_removal(vm_ip, 30))\r"},{"line_number":51,"context_line":"        # sometimes, the network can\u0027t be cleared successfully.\r"},{"line_number":52,"context_line":"        time.sleep(10)\r"},{"line_number":53,"context_line":"\r"},{"line_number":54,"context_line":"    def _get_vm_flows(self, vm_ip):\r"},{"line_number":55,"context_line":"        ovs_flows_parser \u003d OvsFlowsParser()\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_9da46e08","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":22},"in_reply_to":"fa0719c6_4a3dea8d","updated":"2016-03-24 13:05:44.000000000","message":"Done","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"47f8480415aa758f267d1816694df7cfb49f29f4","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        vm.close()\r"},{"line_number":50,"context_line":"        self.assertTrue(self._wait_for_flow_removal(vm_ip, 30))\r"},{"line_number":51,"context_line":"        # sometimes, the network can\u0027t be cleared successfully.\r"},{"line_number":52,"context_line":"        time.sleep(10)\r"},{"line_number":53,"context_line":"\r"},{"line_number":54,"context_line":"    def _get_vm_flows(self, vm_ip):\r"},{"line_number":55,"context_line":"        ovs_flows_parser \u003d OvsFlowsParser()\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_4a3dea8d","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":22},"in_reply_to":"fa0719c6_52d93c56","updated":"2016-03-24 12:51:07.000000000","message":"https://github.com/openstack/dragonflow/blob/master/dragonflow/tests/fullstack/test_l2_multicast.py#L88-L95\n\nYou can use wait_until function to guarantee the port is removed.","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"f92418fb763a936d2aeba93b9909c597d6803e23","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        vm.close()\r"},{"line_number":50,"context_line":"        self.assertTrue(self._wait_for_flow_removal(vm_ip, 30))\r"},{"line_number":51,"context_line":"        # sometimes, the network can\u0027t be cleared successfully.\r"},{"line_number":52,"context_line":"        time.sleep(10)\r"},{"line_number":53,"context_line":"\r"},{"line_number":54,"context_line":"    def _get_vm_flows(self, vm_ip):\r"},{"line_number":55,"context_line":"        ovs_flows_parser \u003d OvsFlowsParser()\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_5d9e56b9","line":52,"range":{"start_line":52,"start_character":8,"end_line":52,"end_character":22},"in_reply_to":"fa0719c6_52d93c56","updated":"2016-03-24 13:05:44.000000000","message":"time.sleep is removed.\nnetwork.close will be automatically called when teardown","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"05d18e3935b4c67b4fd4ff6dcacb4ce6295f7ca3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                 (\u0027arp_tpa\u003d\u0027 + vm_ip + \u0027,\u0027) in flow[\u0027match\u0027]]\r"},{"line_number":60,"context_line":"        return flows\r"},{"line_number":61,"context_line":"\r"},{"line_number":62,"context_line":"    def _wait_for_flow_removal(self, vm_ip, timeout):\r"},{"line_number":63,"context_line":"        while timeout \u003e 0:\r"},{"line_number":64,"context_line":"            vm_flows \u003d self._get_vm_flows(vm_ip)\r"},{"line_number":65,"context_line":"            if not any(vm_flows):\r"},{"line_number":66,"context_line":"                return True\r"},{"line_number":67,"context_line":"            timeout -\u003d 1\r"},{"line_number":68,"context_line":"            time.sleep(1)\r"},{"line_number":69,"context_line":"        return False\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_32f128ce","line":69,"range":{"start_line":62,"start_character":4,"end_line":69,"end_character":20},"updated":"2016-03-24 01:21:29.000000000","message":"Please use utils.wait_until_true.\n\nFor example: https://review.openstack.org/#/c/294154/4/dragonflow/tests/fullstack/test_l2_responder.py","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"f92418fb763a936d2aeba93b9909c597d6803e23","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                 (\u0027arp_tpa\u003d\u0027 + vm_ip + \u0027,\u0027) in flow[\u0027match\u0027]]\r"},{"line_number":60,"context_line":"        return flows\r"},{"line_number":61,"context_line":"\r"},{"line_number":62,"context_line":"    def _wait_for_flow_removal(self, vm_ip, timeout):\r"},{"line_number":63,"context_line":"        while timeout \u003e 0:\r"},{"line_number":64,"context_line":"            vm_flows \u003d self._get_vm_flows(vm_ip)\r"},{"line_number":65,"context_line":"            if not any(vm_flows):\r"},{"line_number":66,"context_line":"                return True\r"},{"line_number":67,"context_line":"            timeout -\u003d 1\r"},{"line_number":68,"context_line":"            time.sleep(1)\r"},{"line_number":69,"context_line":"        return False\r"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_95e9feb9","line":69,"range":{"start_line":62,"start_character":4,"end_line":69,"end_character":20},"in_reply_to":"fa0719c6_32f128ce","updated":"2016-03-24 13:05:44.000000000","message":"Done","commit_id":"24fe6d42958981d47c440f0c1e803baaadfd0706"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"b6f9971946383e3e0349e0c3613e38b47990281f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        )\r"},{"line_number":75,"context_line":"        # sometimes, the network can\u0027t be cleared successfully.\r"},{"line_number":76,"context_line":"        wait_until_none(\r"},{"line_number":77,"context_line":"            lambda: self._git_vm_port(vm_ip), timeout\u003d60, sleep\u003d6,\r"},{"line_number":78,"context_line":"            exception\u003dException(\u0027VM port was not deleted\u0027)\r"},{"line_number":79,"context_line":"        )\r"},{"line_number":80,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_7b4b292c","line":77,"range":{"start_line":77,"start_character":25,"end_line":77,"end_character":37},"updated":"2016-03-25 01:12:39.000000000","message":"_get_vm_port","commit_id":"aa4fd0245536202fdd09c60eb900b94995fb8032"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"ef78727c06c8f18a28753e20a820ab2dd6c8b6de","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        )\r"},{"line_number":75,"context_line":"        # sometimes, the network can\u0027t be cleared successfully.\r"},{"line_number":76,"context_line":"        wait_until_none(\r"},{"line_number":77,"context_line":"            lambda: self._git_vm_port(vm_ip), timeout\u003d60, sleep\u003d6,\r"},{"line_number":78,"context_line":"            exception\u003dException(\u0027VM port was not deleted\u0027)\r"},{"line_number":79,"context_line":"        )\r"},{"line_number":80,"context_line":"\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_e5a6280f","line":77,"range":{"start_line":77,"start_character":25,"end_line":77,"end_character":37},"in_reply_to":"da0c15f0_7b4b292c","updated":"2016-03-30 09:20:11.000000000","message":"Done","commit_id":"aa4fd0245536202fdd09c60eb900b94995fb8032"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"b6f9971946383e3e0349e0c3613e38b47990281f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                 (\u0027arp_tpa\u003d\u0027 + vm_ip + \u0027,\u0027) in flow[\u0027match\u0027]]\r"},{"line_number":87,"context_line":"        return flows\r"},{"line_number":88,"context_line":"\r"},{"line_number":89,"context_line":"    def _git_vm_port(self, vm_ip):\r"},{"line_number":90,"context_line":"        ports \u003d self.neutron.list_ports()\r"},{"line_number":91,"context_line":"        if ports is None:\r"},{"line_number":92,"context_line":"            return None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_3b41b10c","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":20},"updated":"2016-03-25 01:12:39.000000000","message":"_get_vm_port","commit_id":"aa4fd0245536202fdd09c60eb900b94995fb8032"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"ef78727c06c8f18a28753e20a820ab2dd6c8b6de","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                 (\u0027arp_tpa\u003d\u0027 + vm_ip + \u0027,\u0027) in flow[\u0027match\u0027]]\r"},{"line_number":87,"context_line":"        return flows\r"},{"line_number":88,"context_line":"\r"},{"line_number":89,"context_line":"    def _git_vm_port(self, vm_ip):\r"},{"line_number":90,"context_line":"        ports \u003d self.neutron.list_ports()\r"},{"line_number":91,"context_line":"        if ports is None:\r"},{"line_number":92,"context_line":"            return None\r"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_16f804e5","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":20},"in_reply_to":"da0c15f0_3b41b10c","updated":"2016-03-30 09:20:11.000000000","message":"Done","commit_id":"aa4fd0245536202fdd09c60eb900b94995fb8032"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eaa6506069b2aa72dadab3b350d7d5ae3ce73b2f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\r"},{"line_number":19,"context_line":"class TestTopology(test_base.DFTestBase):\r"},{"line_number":20,"context_line":"\r"},{"line_number":21,"context_line":"    def setUp(self):\r"},{"line_number":22,"context_line":"        super(TestTopology, self).setUp()\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"    def tearDown(self):\r"}],"source_content_type":"text/x-python","patch_set":4,"id":"da0c15f0_dae93882","line":21,"updated":"2016-03-28 13:39:25.000000000","message":"Is this function needed? All it does is call super. That would happen automatically if it was not defined.","commit_id":"90d78565d74c8e4567d48cf6416df9289bd24e6d"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"c908eaca5b5bc306056ac03333546581c21a2723","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\r"},{"line_number":19,"context_line":"class TestTopology(test_base.DFTestBase):\r"},{"line_number":20,"context_line":"\r"},{"line_number":21,"context_line":"    def setUp(self):\r"},{"line_number":22,"context_line":"        super(TestTopology, self).setUp()\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"    def tearDown(self):\r"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_b4102450","line":21,"in_reply_to":"da0c15f0_dae93882","updated":"2016-03-29 07:54:24.000000000","message":"Done","commit_id":"90d78565d74c8e4567d48cf6416df9289bd24e6d"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"eaa6506069b2aa72dadab3b350d7d5ae3ce73b2f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    def setUp(self):\r"},{"line_number":22,"context_line":"        super(TestTopology, self).setUp()\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"    def tearDown(self):\r"},{"line_number":25,"context_line":"        super(TestTopology, self).tearDown()\r"},{"line_number":26,"context_line":"\r"},{"line_number":27,"context_line":"    def test_topology_create_vm(self):\r"}],"source_content_type":"text/x-python","patch_set":4,"id":"da0c15f0_1a045048","line":24,"updated":"2016-03-28 13:39:25.000000000","message":"Same here.","commit_id":"90d78565d74c8e4567d48cf6416df9289bd24e6d"},{"author":{"_account_id":20297,"name":"duankebo","email":"duankebo@huawei.com","username":"duankebo"},"change_message_id":"c908eaca5b5bc306056ac03333546581c21a2723","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    def setUp(self):\r"},{"line_number":22,"context_line":"        super(TestTopology, self).setUp()\r"},{"line_number":23,"context_line":"\r"},{"line_number":24,"context_line":"    def tearDown(self):\r"},{"line_number":25,"context_line":"        super(TestTopology, self).tearDown()\r"},{"line_number":26,"context_line":"\r"},{"line_number":27,"context_line":"    def test_topology_create_vm(self):\r"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_740e8c35","line":24,"in_reply_to":"da0c15f0_1a045048","updated":"2016-03-29 07:54:24.000000000","message":"Done","commit_id":"90d78565d74c8e4567d48cf6416df9289bd24e6d"}]}
