)]}'
{"shade/openstackcloud.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"f073c97954dbe64cb52e8a155a2ab0dc7839fc14","unresolved":false,"context_lines":[{"line_number":3382,"context_line":"        # from volume, deleting it will change volume state"},{"line_number":3383,"context_line":"        if (not server[\u0027image\u0027] or not server[\u0027image\u0027][\u0027id\u0027]"},{"line_number":3384,"context_line":"                or self.get_volumes(server)):"},{"line_number":3385,"context_line":"            self.list_volumes.invalidate(self)"},{"line_number":3386,"context_line":""},{"line_number":3387,"context_line":"        if delete_ips:"},{"line_number":3388,"context_line":"            floating_ip \u003d meta.get_server_ip(server, ext_tag\u003d\u0027floating\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_ec8bc666","line":3385,"updated":"2015-12-02 00:17:55.000000000","message":"Isn\u0027t this racey? the invalidation happens before the server deletion which means if I call _delete_server then list volumes after invalidation but before ServerDelete task submission I can repopulate the volume list with an invalid list that won\u0027t update until the next volume update operation.","commit_id":"b7959acb44ad6618625a361d35d7aeca38d5c807"}],"shade/tests/functional/test_compute.py":[{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"07ff826a007b58a7c3d7a598af129ba83fc6c852","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def _assert_volume_attach(self, server, volume_id\u003dNone):"},{"line_number":62,"context_line":"        self.assertEquals(server[\u0027name\u0027], self.server_name)"},{"line_number":63,"context_line":"        self.assertEquals(server[\u0027image\u0027][\u0027id\u0027], \u0027\u0027)"},{"line_number":64,"context_line":"        self.assertEquals(server[\u0027flavor\u0027][\u0027id\u0027], self.flavor.id)"},{"line_number":65,"context_line":"        volumes \u003d self.cloud.get_volumes(server)"},{"line_number":66,"context_line":"        self.assertEquals(len(volumes), 1)"},{"line_number":67,"context_line":"        volume \u003d volumes[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_d1d4b7be","line":64,"updated":"2015-11-30 15:51:16.000000000","message":"assertEquals() wants the values to be (expected, actual). Test still works, but the failure message is confusing unless the order is correct. So just flip these around.","commit_id":"8fa297582bd76f3abec2ec022c04d2a299a612aa"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"07ff826a007b58a7c3d7a598af129ba83fc6c852","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.assertEquals(server[\u0027image\u0027][\u0027id\u0027], \u0027\u0027)"},{"line_number":64,"context_line":"        self.assertEquals(server[\u0027flavor\u0027][\u0027id\u0027], self.flavor.id)"},{"line_number":65,"context_line":"        volumes \u003d self.cloud.get_volumes(server)"},{"line_number":66,"context_line":"        self.assertEquals(len(volumes), 1)"},{"line_number":67,"context_line":"        volume \u003d volumes[0]"},{"line_number":68,"context_line":"        if volume_id:"},{"line_number":69,"context_line":"            self.assertEquals(volume[\u0027id\u0027], volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_31050314","line":66,"updated":"2015-11-30 15:51:16.000000000","message":"(expected, actual) order","commit_id":"8fa297582bd76f3abec2ec022c04d2a299a612aa"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"07ff826a007b58a7c3d7a598af129ba83fc6c852","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.assertEquals(len(volumes), 1)"},{"line_number":67,"context_line":"        volume \u003d volumes[0]"},{"line_number":68,"context_line":"        if volume_id:"},{"line_number":69,"context_line":"            self.assertEquals(volume[\u0027id\u0027], volume_id)"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":72,"context_line":"        self.assertEquals(len(volume[\u0027attachments\u0027]), 1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_f1169b57","line":69,"updated":"2015-11-30 15:51:16.000000000","message":"(expected, actual) order","commit_id":"8fa297582bd76f3abec2ec022c04d2a299a612aa"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"07ff826a007b58a7c3d7a598af129ba83fc6c852","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            volume_id \u003d volume[\u0027id\u0027]"},{"line_number":72,"context_line":"        self.assertEquals(len(volume[\u0027attachments\u0027]), 1)"},{"line_number":73,"context_line":"        self.assertEquals(volume[\u0027attachments\u0027][0][\u0027server_id\u0027], server[\u0027id\u0027])"},{"line_number":74,"context_line":"        return volume_id"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def test_create_boot_from_volume_image(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_31574328","line":73,"updated":"2015-11-30 15:51:16.000000000","message":"(expected, actual) order","commit_id":"8fa297582bd76f3abec2ec022c04d2a299a612aa"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"07ff826a007b58a7c3d7a598af129ba83fc6c852","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertIsNotNone(volume)"},{"line_number":91,"context_line":"        self.assertEquals(volume[\u0027name\u0027], volume[\u0027display_name\u0027])"},{"line_number":92,"context_line":"        self.assertEquals(volume[\u0027bootable\u0027], True)"},{"line_number":93,"context_line":"        self.assertEquals(volume[\u0027attachments\u0027], [])"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def test_create_terminate_volume_image(self):"},{"line_number":96,"context_line":"        if not self.cloud.has_service(\u0027volume\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_6c197279","line":93,"updated":"2015-11-30 15:51:16.000000000","message":"(expected, actual) order","commit_id":"8fa297582bd76f3abec2ec022c04d2a299a612aa"},{"author":{"_account_id":3099,"name":"David Shrewsbury","email":"dshrewsb@redhat.com","username":"dshrews"},"change_message_id":"07ff826a007b58a7c3d7a598af129ba83fc6c852","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.assertIsNotNone(volume)"},{"line_number":130,"context_line":"        self.assertEquals(volume[\u0027name\u0027], volume[\u0027display_name\u0027])"},{"line_number":131,"context_line":"        self.assertEquals(volume[\u0027bootable\u0027], True)"},{"line_number":132,"context_line":"        self.assertEquals(volume[\u0027attachments\u0027], [])"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_create_boot_from_volume_preexisting_terminate(self):"},{"line_number":135,"context_line":"        if not self.cloud.has_service(\u0027volume\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a8ffd7b_2c512a0f","line":132,"updated":"2015-11-30 15:51:16.000000000","message":"(expected, actual) order","commit_id":"8fa297582bd76f3abec2ec022c04d2a299a612aa"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"f073c97954dbe64cb52e8a155a2ab0dc7839fc14","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self.assertEqual(self.server_name, server[\u0027name\u0027])"},{"line_number":63,"context_line":"        self.assertEqual(self.image.id, server[\u0027image\u0027][\u0027id\u0027])"},{"line_number":64,"context_line":"        self.assertEqual(self.flavor.id, server[\u0027flavor\u0027][\u0027id\u0027])"},{"line_number":65,"context_line":"        self.assertTrue(self.cloud.delete_server(self.server_name, wait\u003dTrue))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_get_image_id(self):"},{"line_number":68,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a8ffd7b_0c4c0a41","line":65,"updated":"2015-12-02 00:17:55.000000000","message":"I know the old test doesn\u0027t do this, but I would expect a functional test to assert the cloud state after waiting for deletion of the server otherwise your cleanup is just going to double tap it and you may not function properly without that.","commit_id":"b7959acb44ad6618625a361d35d7aeca38d5c807"}]}
