)]}'
{"HACKING.rst":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f2acb482bab2ae2b13e6e44b082581b239e3097c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"Test class level resources should be defined in the `resource_setup` method of"},{"line_number":129,"context_line":"the test class, except for any credential obtained from the credentials"},{"line_number":130,"context_line":"provider, which should be set-up in the `setup_credentials` method."},{"line_number":131,"context_line":"Cleanup is best scheduled using `addClassResourceCleanup` which ensures that"},{"line_number":132,"context_line":"the cleanup code is always invoked, and in reverse order with respect to the"},{"line_number":133,"context_line":"creation order."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7f287b81_2a520f3c","line":131,"range":{"start_line":131,"start_character":33,"end_line":131,"end_character":56},"updated":"2017-08-29 19:17:59.000000000","message":"This is a really good idea :)","commit_id":"d7164bd136e35907fe457789f6080424295ad2c6"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d2d84b83f8c9a006d8f62a63b8977c8215f2a653","unresolved":false,"context_lines":[{"line_number":128,"context_line":"Test class level resources should be defined in the `resource_setup` method of"},{"line_number":129,"context_line":"the test class, except for any credential obtained from the credentials"},{"line_number":130,"context_line":"provider, which should be set-up in the `setup_credentials` method."},{"line_number":131,"context_line":"Cleanup is best scheduled using `addClassResourceCleanup` which ensures that"},{"line_number":132,"context_line":"the cleanup code is always invoked, and in reverse order with respect to the"},{"line_number":133,"context_line":"creation order."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7f287b81_e56e78fe","line":131,"range":{"start_line":131,"start_character":33,"end_line":131,"end_character":56},"in_reply_to":"7f287b81_2a520f3c","updated":"2017-08-29 20:05:53.000000000","message":":)\n\nThe only drawback may be a bit of slow down in case of tests that provision many resources of the same type at class level, since the cleanup will most likely happen as a delete, wait, delete, wait etc instead of delete all, wait all.\n\nThat can be fixed by using test resources unless when really necessary in tests.","commit_id":"d7164bd136e35907fe457789f6080424295ad2c6"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"0cf9bd6fd45827236673e8e541425e676db592c9","unresolved":false,"context_lines":[{"line_number":132,"context_line":"the cleanup code is always invoked, and in reverse order with respect to the"},{"line_number":133,"context_line":"creation order."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"In both cases - test level and class level cleanups - a wait loop should be"},{"line_number":136,"context_line":"scheduled before the actual delete of resources with an asynchronous delete."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The test base class `BaseTestCase` defines Tempest framework for class level"},{"line_number":139,"context_line":"fixtures. `setUpClass` and `tearDownClass` are defined here and cannot be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7f287b81_ba684687","line":136,"range":{"start_line":135,"start_character":0,"end_line":136,"end_character":75},"updated":"2017-09-01 06:42:54.000000000","message":"I don\u0027t catch what does this mean?","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"e3c4e9e202c80b0cfecb5584af82febbb527c489","unresolved":false,"context_lines":[{"line_number":132,"context_line":"the cleanup code is always invoked, and in reverse order with respect to the"},{"line_number":133,"context_line":"creation order."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"In both cases - test level and class level cleanups - a wait loop should be"},{"line_number":136,"context_line":"scheduled before the actual delete of resources with an asynchronous delete."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The test base class `BaseTestCase` defines Tempest framework for class level"},{"line_number":139,"context_line":"fixtures. `setUpClass` and `tearDownClass` are defined here and cannot be"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7f287b81_332bc095","line":136,"range":{"start_line":135,"start_character":54,"end_line":136,"end_character":76},"updated":"2017-09-08 03:40:57.000000000","message":"this looks a bit confusing, does it mean we should call wait_for_resource_deletion after posting the request of deleting the resource?","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"1364d8616b8db6597fabbe24107c66e2b4bd8f8c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"the cleanup code is always invoked, and in reverse order with respect to the"},{"line_number":133,"context_line":"creation order."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"In both cases - test level and class level cleanups - a wait loop should be"},{"line_number":136,"context_line":"scheduled before the actual delete of resources with an asynchronous delete."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The test base class `BaseTestCase` defines Tempest framework for class level"},{"line_number":139,"context_line":"fixtures. `setUpClass` and `tearDownClass` are defined here and cannot be"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7f287b81_b73315ab","line":136,"range":{"start_line":135,"start_character":54,"end_line":136,"end_character":76},"in_reply_to":"7f287b81_332bc095","updated":"2017-09-08 09:54:01.000000000","message":"That\u0027s the order it will happen during cleanup, which is the inverse of what you scheduler since it\u0027s a stack (or LIFO).\n\nSo first you schedule the wait, then you schedule the delete - as the text above says. There are examples in the code, in the docstrings and in writing tests, I\u0027m not sure I should add another one here.","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"}],"doc/source/write_tests.rst":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e1c44baa4eea94ef3724352380cb5a51eeb1b485","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        super(TestExampleCase, cls).resource_setup()"},{"line_number":119,"context_line":"        cls.shared_server \u003d cls.servers_client.create_server(...)"},{"line_number":120,"context_line":"        cls.addClassResourceCleanup(waiters.wait_for_server_termination,"},{"line_number":121,"context_line":"                                        cls.servers_client,"},{"line_number":122,"context_line":"                                        cls.shared_server[\u0027id\u0027])"},{"line_number":123,"context_line":"        cls.addClassResourceCleanup("},{"line_number":124,"context_line":"                test_utils.call_and_ignore_notfound_exc("}],"source_content_type":"text/x-rst","patch_set":9,"id":"7f287b81_026d1331","line":121,"updated":"2017-09-07 21:03:34.000000000","message":"nit: over-indented","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"e3c4e9e202c80b0cfecb5584af82febbb527c489","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                                        cls.servers_client,"},{"line_number":122,"context_line":"                                        cls.shared_server[\u0027id\u0027])"},{"line_number":123,"context_line":"        cls.addClassResourceCleanup("},{"line_number":124,"context_line":"                test_utils.call_and_ignore_notfound_exc("},{"line_number":125,"context_line":"                    cls.servers_client.delete_server,"},{"line_number":126,"context_line":"                    cls.shared_server[\u0027id\u0027]))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":".. _credentials:"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7f287b81_f3be5863","line":126,"range":{"start_line":124,"start_character":0,"end_line":126,"end_character":45},"updated":"2017-09-08 03:40:57.000000000","message":"nit: over-indented","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"}],"tempest/test.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"1a14b44dadb33ba0505ccc1ba12985524b4820a3","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            except Exception:"},{"line_number":501,"context_line":"                cleanup_errors.append(sys.exc_info())"},{"line_number":502,"context_line":"        while cls._validation_resources:"},{"line_number":503,"context_line":"            _clients, resources \u003d cls._validation_resources.pop()"},{"line_number":504,"context_line":"            try:"},{"line_number":505,"context_line":"                vr.clear_validation_resources("},{"line_number":506,"context_line":"                    _clients, use_neutron\u003dCONF.service_available.neutron,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_4d6b7584","line":503,"range":{"start_line":503,"start_character":12,"end_line":503,"end_character":65},"updated":"2017-08-26 10:37:41.000000000","message":"I cannot loop on a dict like this :S","commit_id":"81016edd96625607fe2e476c9bbefcf468fdc6ec"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e85c19815677a9d509956008b87fd01bb5bba9db","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                # them up during `resource_cleanup`."},{"line_number":204,"context_line":"                # In case of failure during setup, some resource arrays might"},{"line_number":205,"context_line":"                # not be defined at all, in which case the cleanup code might"},{"line_number":206,"context_line":"                # trigger and AttributeError. In such cases we log"},{"line_number":207,"context_line":"                # AttributeError as info instead of exception. Once all cleanup"},{"line_number":208,"context_line":"                # are migrated to addClassResourceCleanup we can remove this."},{"line_number":209,"context_line":"                if tetype is AttributeError and name \u003d\u003d \u0027resources\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_8ba31e00","line":206,"range":{"start_line":206,"start_character":26,"end_line":206,"end_character":29},"updated":"2017-08-31 01:27:11.000000000","message":"s/and/an","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                # them up during `resource_cleanup`."},{"line_number":204,"context_line":"                # In case of failure during setup, some resource arrays might"},{"line_number":205,"context_line":"                # not be defined at all, in which case the cleanup code might"},{"line_number":206,"context_line":"                # trigger and AttributeError. In such cases we log"},{"line_number":207,"context_line":"                # AttributeError as info instead of exception. Once all cleanup"},{"line_number":208,"context_line":"                # are migrated to addClassResourceCleanup we can remove this."},{"line_number":209,"context_line":"                if tetype is AttributeError and name \u003d\u003d \u0027resources\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_7521654d","line":206,"range":{"start_line":206,"start_character":26,"end_line":206,"end_character":29},"in_reply_to":"7f287b81_8ba31e00","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e85c19815677a9d509956008b87fd01bb5bba9db","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                # In case of failure during setup, some resource arrays might"},{"line_number":205,"context_line":"                # not be defined at all, in which case the cleanup code might"},{"line_number":206,"context_line":"                # trigger and AttributeError. In such cases we log"},{"line_number":207,"context_line":"                # AttributeError as info instead of exception. Once all cleanup"},{"line_number":208,"context_line":"                # are migrated to addClassResourceCleanup we can remove this."},{"line_number":209,"context_line":"                if tetype is AttributeError and name \u003d\u003d \u0027resources\u0027:"},{"line_number":210,"context_line":"                    LOG.info(\"tearDownClass of %s failed: %s\", name, te)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_cb9da6bc","line":207,"range":{"start_line":207,"start_character":72,"end_line":207,"end_character":79},"updated":"2017-08-31 01:27:11.000000000","message":"s/cleanup/cleanups","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                # In case of failure during setup, some resource arrays might"},{"line_number":205,"context_line":"                # not be defined at all, in which case the cleanup code might"},{"line_number":206,"context_line":"                # trigger and AttributeError. In such cases we log"},{"line_number":207,"context_line":"                # AttributeError as info instead of exception. Once all cleanup"},{"line_number":208,"context_line":"                # are migrated to addClassResourceCleanup we can remove this."},{"line_number":209,"context_line":"                if tetype is AttributeError and name \u003d\u003d \u0027resources\u0027:"},{"line_number":210,"context_line":"                    LOG.info(\"tearDownClass of %s failed: %s\", name, te)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_551c2912","line":207,"range":{"start_line":207,"start_character":72,"end_line":207,"end_character":79},"in_reply_to":"7f287b81_cb9da6bc","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e85c19815677a9d509956008b87fd01bb5bba9db","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                finally:"},{"line_number":485,"context_line":"                    # Wait server 1"},{"line_number":486,"context_line":"                    cls.addClassResourceCleanup("},{"line_number":487,"context_line":"                        waiters.wait_for_server_termination,"},{"line_number":488,"context_line":"                        cls.servers, cls.shared_server[\u0027id\u0027],"},{"line_number":489,"context_line":"                        ignore_error\u003dFalse)"},{"line_number":490,"context_line":"                        # Delete server 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_8bcafe9d","line":487,"updated":"2017-08-31 01:27:11.000000000","message":"I\u0027m curious why waiter doesn\u0027t need a test_utils.call_and_ignore_notfound when the resource deletion on L492 does.","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"643198cf5a4a0ac1b0586a7f72c254f8fc1c075d","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                finally:"},{"line_number":485,"context_line":"                    # Wait server 1"},{"line_number":486,"context_line":"                    cls.addClassResourceCleanup("},{"line_number":487,"context_line":"                        waiters.wait_for_server_termination,"},{"line_number":488,"context_line":"                        cls.servers, cls.shared_server[\u0027id\u0027],"},{"line_number":489,"context_line":"                        ignore_error\u003dFalse)"},{"line_number":490,"context_line":"                        # Delete server 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_75209eb1","line":487,"in_reply_to":"7f287b81_8bcafe9d","updated":"2017-09-01 20:28:22.000000000","message":"Ignoring NotFound is already in the waiter code.","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e85c19815677a9d509956008b87fd01bb5bba9db","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    def resource_cleanup(cls):"},{"line_number":506,"context_line":"        \"\"\"Class level resource cleanup for test cases."},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        Resource cleanup processes the stack or cleanups produced by"},{"line_number":509,"context_line":"        `addClassResourceCleanup` and then cleans up validation resources"},{"line_number":510,"context_line":"        if any was provisioned."},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_cb86c666","line":508,"range":{"start_line":508,"start_character":45,"end_line":508,"end_character":47},"updated":"2017-08-31 01:27:11.000000000","message":"s/or/of","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    def resource_cleanup(cls):"},{"line_number":506,"context_line":"        \"\"\"Class level resource cleanup for test cases."},{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        Resource cleanup processes the stack or cleanups produced by"},{"line_number":509,"context_line":"        `addClassResourceCleanup` and then cleans up validation resources"},{"line_number":510,"context_line":"        if any was provisioned."},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_f5bb15e2","line":508,"range":{"start_line":508,"start_character":45,"end_line":508,"end_character":47},"in_reply_to":"7f287b81_cb86c666","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e85c19815677a9d509956008b87fd01bb5bba9db","unresolved":false,"context_lines":[{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        Resource cleanup processes the stack or cleanups produced by"},{"line_number":509,"context_line":"        `addClassResourceCleanup` and then cleans up validation resources"},{"line_number":510,"context_line":"        if any was provisioned."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        All cleanups are processed whatever the outcome. Exceptions are"},{"line_number":513,"context_line":"        accumulated and re-raised as a `MultipleExceptions` at the end."}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_8b7c3e72","line":510,"range":{"start_line":510,"start_character":15,"end_line":510,"end_character":18},"updated":"2017-08-31 01:27:11.000000000","message":"s/was/were","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":507,"context_line":""},{"line_number":508,"context_line":"        Resource cleanup processes the stack or cleanups produced by"},{"line_number":509,"context_line":"        `addClassResourceCleanup` and then cleans up validation resources"},{"line_number":510,"context_line":"        if any was provisioned."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        All cleanups are processed whatever the outcome. Exceptions are"},{"line_number":513,"context_line":"        accumulated and re-raised as a `MultipleExceptions` at the end."}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_f5a0b5a7","line":510,"range":{"start_line":510,"start_character":15,"end_line":510,"end_character":18},"in_reply_to":"7f287b81_8b7c3e72","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"0cf9bd6fd45827236673e8e541425e676db592c9","unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"                @classmethod"},{"line_number":530,"context_line":"                def resource_cleanup(cls):"},{"line_number":531,"context_line":"                    # Some pre-cleanup that could not be scheduled earlier"},{"line_number":532,"context_line":"                    super(TestWithReallyComplexCleanup, cls).resource_cleanup()"},{"line_number":533,"context_line":"                    # Some post-cleanup that could not be scheduled earlier"},{"line_number":534,"context_line":"                    # At this point test credentials are still available but"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_bad5e6e7","line":531,"range":{"start_line":531,"start_character":67,"end_line":531,"end_character":74},"updated":"2017-09-01 06:42:54.000000000","message":"this seems confusing","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"                @classmethod"},{"line_number":530,"context_line":"                def resource_cleanup(cls):"},{"line_number":531,"context_line":"                    # Some pre-cleanup that could not be scheduled earlier"},{"line_number":532,"context_line":"                    super(TestWithReallyComplexCleanup, cls).resource_cleanup()"},{"line_number":533,"context_line":"                    # Some post-cleanup that could not be scheduled earlier"},{"line_number":534,"context_line":"                    # At this point test credentials are still available but"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_75cba552","line":531,"range":{"start_line":531,"start_character":67,"end_line":531,"end_character":74},"in_reply_to":"7f287b81_bad5e6e7","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"0cf9bd6fd45827236673e8e541425e676db592c9","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                    cleanup_errors.append(sys.exc_info())"},{"line_number":556,"context_line":"                finally:"},{"line_number":557,"context_line":"                    del cls._validation_resources[_clients]"},{"line_number":558,"context_line":"        if cleanup_errors:"},{"line_number":559,"context_line":"            raise testtools.MultipleExceptions(*cleanup_errors)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    @classmethod"},{"line_number":562,"context_line":"    def addClassResourceCleanup(cls, fn, *arguments, **keywordArguments):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_dad8b21f","line":559,"range":{"start_line":558,"start_character":0,"end_line":559,"end_character":63},"updated":"2017-09-01 06:42:54.000000000","message":"if we raise exception here, then if the testcase calls super\u0027s resource_cleanup first, like\n    @classmethod\n    def resource_cleanup(cls):\n        super(TestWithReallyComplexCleanup, cls).resource_cleanup()\n        cls.delete_aaa()\n\nthen the steps after super\u0027s resource_cleanup() won\u0027t be executed.\ndo we need to suggest doing any cleanups before calling super\u0027s resource_cleanup() if no special reason?","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"31f42d596338b52e80d035b4444324be687cd0b6","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                    cleanup_errors.append(sys.exc_info())"},{"line_number":556,"context_line":"                finally:"},{"line_number":557,"context_line":"                    del cls._validation_resources[_clients]"},{"line_number":558,"context_line":"        if cleanup_errors:"},{"line_number":559,"context_line":"            raise testtools.MultipleExceptions(*cleanup_errors)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    @classmethod"},{"line_number":562,"context_line":"    def addClassResourceCleanup(cls, fn, *arguments, **keywordArguments):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_eaa812dc","line":559,"range":{"start_line":558,"start_character":0,"end_line":559,"end_character":63},"in_reply_to":"7f287b81_b5172652","updated":"2017-09-04 07:22:58.000000000","message":"yeah, agree, we can remove the post from the example, and emphasize that calling super\u0027s resource_cleanup better to be the last statement","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"643198cf5a4a0ac1b0586a7f72c254f8fc1c075d","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                    cleanup_errors.append(sys.exc_info())"},{"line_number":556,"context_line":"                finally:"},{"line_number":557,"context_line":"                    del cls._validation_resources[_clients]"},{"line_number":558,"context_line":"        if cleanup_errors:"},{"line_number":559,"context_line":"            raise testtools.MultipleExceptions(*cleanup_errors)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    @classmethod"},{"line_number":562,"context_line":"    def addClassResourceCleanup(cls, fn, *arguments, **keywordArguments):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_b5172652","line":559,"range":{"start_line":558,"start_character":0,"end_line":559,"end_character":63},"in_reply_to":"7f287b81_dad8b21f","updated":"2017-09-01 20:28:22.000000000","message":"My recommendation is not to override resource_cleanup at all - maybe I should remove the pre/post from the example.","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":555,"context_line":"                    cleanup_errors.append(sys.exc_info())"},{"line_number":556,"context_line":"                finally:"},{"line_number":557,"context_line":"                    del cls._validation_resources[_clients]"},{"line_number":558,"context_line":"        if cleanup_errors:"},{"line_number":559,"context_line":"            raise testtools.MultipleExceptions(*cleanup_errors)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    @classmethod"},{"line_number":562,"context_line":"    def addClassResourceCleanup(cls, fn, *arguments, **keywordArguments):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_15c0e129","line":559,"range":{"start_line":558,"start_character":0,"end_line":559,"end_character":63},"in_reply_to":"7f287b81_eaa812dc","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e85c19815677a9d509956008b87fd01bb5bba9db","unresolved":false,"context_lines":[{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    @classmethod"},{"line_number":562,"context_line":"    def addClassResourceCleanup(cls, fn, *arguments, **keywordArguments):"},{"line_number":563,"context_line":"        \"\"\"Add a cleanup function to be called after during resource_cleanup."},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        Functions added with addClassResourceCleanup will be called in reverse"},{"line_number":566,"context_line":"        order of adding at the beginning of resource_cleanup, before any"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_6bf472f1","line":563,"updated":"2017-08-31 01:27:11.000000000","message":"Pick one: after or during","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"d8bdbc496431a55454ccc06ff99b9d30311f542d","unresolved":false,"context_lines":[{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    @classmethod"},{"line_number":562,"context_line":"    def addClassResourceCleanup(cls, fn, *arguments, **keywordArguments):"},{"line_number":563,"context_line":"        \"\"\"Add a cleanup function to be called after during resource_cleanup."},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        Functions added with addClassResourceCleanup will be called in reverse"},{"line_number":566,"context_line":"        order of adding at the beginning of resource_cleanup, before any"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f287b81_b5346d4b","line":563,"in_reply_to":"7f287b81_6bf472f1","updated":"2017-09-06 14:04:12.000000000","message":"Done","commit_id":"25cea04b8d9089f912516f76719c7935ade78e91"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e1c44baa4eea94ef3724352380cb5a51eeb1b485","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        and can thus safely be re-used by multiple tests."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        System wide resources shared by all tests could instead be provisioned"},{"line_number":334,"context_line":"        only once, before the test run."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        Resources provisioned here must be cleaned up during"},{"line_number":337,"context_line":"        `resource_cleanup`. This is best achieved by scheduling a cleanup via"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f287b81_e2520767","line":334,"range":{"start_line":334,"start_character":30,"end_line":334,"end_character":34},"updated":"2017-09-07 21:03:34.000000000","message":"s/test/tests","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"1364d8616b8db6597fabbe24107c66e2b4bd8f8c","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        and can thus safely be re-used by multiple tests."},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        System wide resources shared by all tests could instead be provisioned"},{"line_number":334,"context_line":"        only once, before the test run."},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        Resources provisioned here must be cleaned up during"},{"line_number":337,"context_line":"        `resource_cleanup`. This is best achieved by scheduling a cleanup via"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f287b81_97249961","line":334,"range":{"start_line":334,"start_character":30,"end_line":334,"end_character":34},"in_reply_to":"7f287b81_e2520767","updated":"2017-09-08 09:54:01.000000000","message":"\"test run\" as a noun - I think it\u0027s spelled right.","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"e3c4e9e202c80b0cfecb5584af82febbb527c489","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                # Schedule delete and wait so that we can first delete the"},{"line_number":351,"context_line":"                # two servers and then wait for both to delete"},{"line_number":352,"context_line":"                # Create server 1"},{"line_number":353,"context_line":"                cls.shared_server \u003d cls.servers.create_server()"},{"line_number":354,"context_line":"                # Create server 2. If something goes wrong we schedule cleanup"},{"line_number":355,"context_line":"                # of server 1 anyways."},{"line_number":356,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f287b81_16e0b225","line":353,"range":{"start_line":353,"start_character":40,"end_line":353,"end_character":47},"updated":"2017-09-08 03:40:57.000000000","message":"in this example, it\u0027s a bit hard to understand what \"cls.servers\" is.","commit_id":"3d15cefda8d2a2922ca6d1e57a53ebe0fb03619a"}],"tempest/tests/test_test.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"453488149ebea378a0dd8e6926f9304cffcc079f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"5f2577a7_884f4f91","updated":"2017-09-12 15:44:13.000000000","message":"it think we should have all test.py tests together in single file but not blocker","commit_id":"de8ce02818db4ec0dd2920e35c96d75ea7b3341f"}]}
