)]}'
{"tempest/api/object_storage/test_container_services.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0a4449c5c741b6bc73972d9eb14f7aeb400cdf3c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.assertNotIn(\u0027x-container-meta-test-container-meta\u0027, resp)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @test.idempotent_id(\u0027358f00de-3a86-43d7-9b9d-2a3225c6e4bd\u0027)"},{"line_number":85,"context_line":"    def test_create_container_with_metadata_value_converts_underscore(self):"},{"line_number":86,"context_line":"        \u0027\u0027\u0027Attempt to create container with metadata name using underscores"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        should be converted to hyphens."}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_7d815cfb","line":85,"updated":"2016-05-24 14:20:10.000000000","message":"No need to add a dedicated test for this. Just edit the test test_create_container_with_metadata_value and replace L108 by \nmetadata \u003d {\u0027test_container_meta\u0027: \u0027penguin\u0027}","commit_id":"a7301fc384b402c9df614d201d9d2a77a2f8a57b"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"492c8efecedfa493cbd6f669b6fa12e31dd386cb","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # metadata name using underscores should be converted to hyphens"},{"line_number":68,"context_line":"        metadata \u003d {\u0027test_container_meta\u0027: \u0027Meta1\u0027}"},{"line_number":69,"context_line":"        resp, _ \u003d self.container_client.create_container("},{"line_number":70,"context_line":"            container_name,"},{"line_number":71,"context_line":"            metadata\u003dmetadata)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_fa74fe36","line":68,"updated":"2016-09-15 20:48:10.000000000","message":"This change is unrelated to this patch and shouldn\u0027t be included:\n\n  https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes","commit_id":"7349de25276c651c4bf474c528254de764a2b2ee"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"492c8efecedfa493cbd6f669b6fa12e31dd386cb","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # retrieve container"},{"line_number":135,"context_line":"        resp, body \u003d self.container_client.show_container(container_name)"},{"line_number":136,"context_line":"        self.assertHeaders(resp, \u0027Container\u0027, \u0027GET\u0027)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        resp, object_list \u003d self.container_client.list_container_contents("},{"line_number":139,"context_line":"            container_name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_1a728a49","line":136,"updated":"2016-09-15 20:48:10.000000000","message":"Same here","commit_id":"7349de25276c651c4bf474c528254de764a2b2ee"}],"tempest/api/object_storage/test_container_services_negative.py":[{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def _create_container(self):"},{"line_number":33,"context_line":"        # setup container"},{"line_number":34,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027)"},{"line_number":35,"context_line":"        self.container_client.create_container(container_name)"},{"line_number":36,"context_line":"        self.containers.append(container_name)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        return container_name"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_3e17e252","line":35,"updated":"2016-05-06 11:43:24.000000000","message":"We should check self.assertHeaders(resp, \u0027Container\u0027, \u0027PUT\u0027) here or within the container client.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        data \u003d data_utils.arbitrary_string()"},{"line_number":45,"context_line":"        self.object_client.create_object(container_name,"},{"line_number":46,"context_line":"                                         object_name,"},{"line_number":47,"context_line":"                                         data)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        return object_name"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_7e096a31","line":47,"updated":"2016-05-06 11:43:24.000000000","message":"same assertHeaders comment here.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        \"\"\"Attempts to create a container name that is longer than max.\"\"\""},{"line_number":54,"context_line":"        # create a container with long name"},{"line_number":55,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027 * 30)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.assertRaises(lib_exc.BadRequest,"},{"line_number":58,"context_line":"                          self.container_client.create_container,"},{"line_number":59,"context_line":"                          container_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_4125a7a9","line":56,"updated":"2016-05-06 11:43:24.000000000","message":"I think there is a way to drive this based on max_container_name_length as part of discoverability querying.    Let me know if you need help here, I can look into how this is done.   But it\u0027s part of /info (discoverability) details.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # create a container with long name"},{"line_number":55,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027 * 30)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.assertRaises(lib_exc.BadRequest,"},{"line_number":58,"context_line":"                          self.container_client.create_container,"},{"line_number":59,"context_line":"                          container_name)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_01527f13","line":57,"updated":"2016-05-06 11:43:24.000000000","message":"Another assertHeaders comment","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.assertRaises(lib_exc.BadRequest,"},{"line_number":58,"context_line":"                          self.container_client.create_container,"},{"line_number":59,"context_line":"                          container_name)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @test.idempotent_id(\u0027125a24fa-90a7-4cfc-b604-44e49d788390\u0027)"},{"line_number":62,"context_line":"    def test_update_metadata_with_invalid_container_name(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_c148775e","line":59,"updated":"2016-05-06 11:43:24.000000000","message":"On these bad requests, often times a response body is provided which we should validate.  In this case:\n\nContainer name length of \u003cACTUAL VALUE\u003e longer than \u003cVALUE OF max_container_name_length\u003e\n\nWe shoudl verify the response body here.\n\nAlso we should verify the content type of the response is \"text/html; charset\u003dUTF-8\" in this case.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":65,"context_line":"        metadata \u003d {\"quota-bytes\": str(12),"},{"line_number":66,"context_line":"                    \"quota-count\": str(12), }"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertRaises(lib_exc.NotFound,"},{"line_number":69,"context_line":"                          self.container_client.update_container_metadata,"},{"line_number":70,"context_line":"                          invalid_name, metadata)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_81930fa3","line":67,"updated":"2016-05-06 11:43:24.000000000","message":"Same comments as above with validating headers, body, content-length, and content-type.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":76,"context_line":"        metadata \u003d {\"quota-bytes\": str(12),"},{"line_number":77,"context_line":"                    \"quota-count\": str(12), }"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.assertRaises(lib_exc.NotFound,"},{"line_number":80,"context_line":"                          self.container_client.delete_container_metadata,"},{"line_number":81,"context_line":"                          invalid_name, metadata)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_c18d177d","line":78,"updated":"2016-05-06 11:43:24.000000000","message":"Same comments as above.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_get_invalid_container(self):"},{"line_number":85,"context_line":"        \"\"\"Attempts to get a container that doesn\u0027t exist.\"\"\""},{"line_number":86,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.assertRaises(lib_exc.NotFound,"},{"line_number":89,"context_line":"                          self.container_client.show_container,"},{"line_number":90,"context_line":"                          invalid_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_81daef76","line":87,"updated":"2016-05-06 11:43:24.000000000","message":"same comments as above","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        resp, _ \u003d self.container_client.delete_container(container_name)"},{"line_number":98,"context_line":"        self.assertHeaders(resp, \u0027Container\u0027, \u0027DELETE\u0027)"},{"line_number":99,"context_line":"        self.containers.remove(container_name)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assertRaises(lib_exc.NotFound,"},{"line_number":102,"context_line":"                          self.container_client.show_container,"},{"line_number":103,"context_line":"                          container_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_61ca6ba3","line":100,"updated":"2016-05-06 11:43:24.000000000","message":"Same comment as above except for assertHeaders which is here.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"57f1c2c65916c32d5e9e01128c1d142407db7f9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dab17558_2f74eecc","updated":"2016-05-17 21:51:18.000000000","message":"It seems like there are a number of pep8 errors here that need cleaned up.","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"57f1c2c65916c32d5e9e01128c1d142407db7f9b","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def tearDown(self):"},{"line_number":28,"context_line":"        self.delete_containers(self.containers)"},{"line_number":29,"context_line":"        super(ContainerNegativeTest, self).tearDown()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _create_container(self):"},{"line_number":32,"context_line":"        # setup container"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_a203d50b","line":29,"updated":"2016-05-17 21:51:18.000000000","message":"In one of these test cases you create a container with an object in it, I believe this object will need deleted in the tearDown prior to deleting the containers...","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":9622,"name":"Cindy Lu","email":"clu@us.ibm.com","username":"clu14"},"change_message_id":"adeee9856000f122a14f18b5e594b249fc295797","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def tearDown(self):"},{"line_number":28,"context_line":"        self.delete_containers(self.containers)"},{"line_number":29,"context_line":"        super(ContainerNegativeTest, self).tearDown()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _create_container(self):"},{"line_number":32,"context_line":"        # setup container"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_05cf4b29","line":29,"in_reply_to":"dab17558_a203d50b","updated":"2016-05-17 22:42:19.000000000","message":"https://github.com/openstack/tempest/blob/master/tempest/api/object_storage/base.py#L62 seems like delete containers removes the objects inside as well","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"57f1c2c65916c32d5e9e01128c1d142407db7f9b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        \"\"\"Attempts to create a container name that is longer than max.\"\"\""},{"line_number":57,"context_line":"        # create a container with long name"},{"line_number":58,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027 * 30)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        self.assertRaises(exceptions.BadRequest,"},{"line_number":61,"context_line":"                          self.container_client.create_container,"},{"line_number":62,"context_line":"                          container_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_625bad22","line":59,"updated":"2016-05-17 21:51:18.000000000","message":"This is an interesting case.   What makes this interesting is that the maximum name is configurable in Swift, therefore it should be a configurable item in Tempest.   So this test case would want to look at that value to determine how long the string needs to be to exceed the name length.\n\nI think it would go in tempest.conf under \"[object-storage]\" and there would need to be an update to \"config.py\".   \n\nIt would then be readable via:\n\nCONF.object_storage.[name of element]","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"57f1c2c65916c32d5e9e01128c1d142407db7f9b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def test_delete_with_invalid_container_name(self):"},{"line_number":89,"context_line":"        \"\"\"Attempts to delete metadata using an invalid container name.\"\"\""},{"line_number":90,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":91,"context_line":"        metadata \u003d {\"quota-bytes\": str(12),"},{"line_number":92,"context_line":"                    \"quota-count\": str(12), }"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        self.assertRaises(exceptions.NotFound,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_a2d47546","line":91,"updated":"2016-05-17 21:51:18.000000000","message":"Just curious is there a reason for str(12) here?    More curious than anything...","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"57f1c2c65916c32d5e9e01128c1d142407db7f9b","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        container_name \u003d self._create_container()"},{"line_number":113,"context_line":"        # delete container"},{"line_number":114,"context_line":"        resp, _ \u003d self.container_client.delete_container(container_name)"},{"line_number":115,"context_line":"        self.assertHeaders(resp, \u0027Container\u0027, \u0027DELETE\u0027)"},{"line_number":116,"context_line":"        self.containers.remove(container_name)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self.assertRaises(exceptions.NotFound,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_6289ed6e","line":115,"updated":"2016-05-17 21:51:18.000000000","message":"This is a picky comment, but maybe swap the remove and the first assertion, it comes off cleaner.   But again super picky comment.","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"57f1c2c65916c32d5e9e01128c1d142407db7f9b","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \"\"\"Attempts to delete a container that isn\u0027t empty.\"\"\""},{"line_number":126,"context_line":"        # create a container and an object"},{"line_number":127,"context_line":"        container_name \u003d self._create_container()"},{"line_number":128,"context_line":"        self._create_object(container_name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        self.assertRaises(exceptions.Conflict,"},{"line_number":131,"context_line":"                          self.container_client.delete_container,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_8f2d1aaa","line":128,"updated":"2016-05-17 21:51:18.000000000","message":"you may want to give the object name here some different than \"container_name\".   I think it will functionally work, but it is confusing, I almost thought it was a bug.","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"03730311187bafe7e4905d0e0c6af2c4c9021cc3","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \"\"\"Attempts to delete a container that isn\u0027t empty.\"\"\""},{"line_number":126,"context_line":"        # create a container and an object"},{"line_number":127,"context_line":"        container_name \u003d self._create_container()"},{"line_number":128,"context_line":"        self._create_object(container_name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        self.assertRaises(exceptions.Conflict,"},{"line_number":131,"context_line":"                          self.container_client.delete_container,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_806049d0","line":128,"in_reply_to":"dab17558_658c57d7","updated":"2016-05-17 22:49:24.000000000","message":"My mistake :)  Long day lol","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":9622,"name":"Cindy Lu","email":"clu@us.ibm.com","username":"clu14"},"change_message_id":"adeee9856000f122a14f18b5e594b249fc295797","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        \"\"\"Attempts to delete a container that isn\u0027t empty.\"\"\""},{"line_number":126,"context_line":"        # create a container and an object"},{"line_number":127,"context_line":"        container_name \u003d self._create_container()"},{"line_number":128,"context_line":"        self._create_object(container_name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        self.assertRaises(exceptions.Conflict,"},{"line_number":131,"context_line":"                          self.container_client.delete_container,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_658c57d7","line":128,"in_reply_to":"dab17558_8f2d1aaa","updated":"2016-05-17 22:42:19.000000000","message":"a new object is created inside the \u0027container_name\u0027 passed in\n\nthe name of the object is created on L43","commit_id":"682aa0468ca3a0fee9d0a4a8fe7dbff6cedcff8b"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0a4449c5c741b6bc73972d9eb14f7aeb400cdf3c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.delete_containers(self.containers)"},{"line_number":32,"context_line":"        super(ContainerNegativeTest, self).tearDown()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _create_container(self):"},{"line_number":35,"context_line":"        # setup container"},{"line_number":36,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027)"},{"line_number":37,"context_line":"        resp, _ \u003d self.container_client.create_container(container_name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_5db458d0","line":34,"updated":"2016-05-24 14:20:10.000000000","message":"Code duplication. You should reuse existing code to create a container.","commit_id":"a7301fc384b402c9df614d201d9d2a77a2f8a57b"},{"author":{"_account_id":9622,"name":"Cindy Lu","email":"clu@us.ibm.com","username":"clu14"},"change_message_id":"323e4122a8a487a5cabf1b2bd65ce2d9a0dc7d9f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.delete_containers(self.containers)"},{"line_number":32,"context_line":"        super(ContainerNegativeTest, self).tearDown()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _create_container(self):"},{"line_number":35,"context_line":"        # setup container"},{"line_number":36,"context_line":"        container_name \u003d data_utils.rand_name(name\u003d\u0027TestContainer\u0027)"},{"line_number":37,"context_line":"        resp, _ \u003d self.container_client.create_container(container_name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_57fd3e3a","line":34,"in_reply_to":"bab6814e_5db458d0","updated":"2016-05-24 22:23:10.000000000","message":"Thx for the review, Jordan. Where can I find the reuseable code?","commit_id":"a7301fc384b402c9df614d201d9d2a77a2f8a57b"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0a4449c5c741b6bc73972d9eb14f7aeb400cdf3c","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        return container_name"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _create_object(self, container_name, object_name\u003dNone):"},{"line_number":44,"context_line":"        # setup object"},{"line_number":45,"context_line":"        if object_name is None:"},{"line_number":46,"context_line":"            object_name \u003d data_utils.rand_name(name\u003d\u0027TestObject\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_bdd0e4f8","line":43,"updated":"2016-05-24 14:20:10.000000000","message":"Code duplication too.","commit_id":"a7301fc384b402c9df614d201d9d2a77a2f8a57b"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"34b6a1868be50a723995887fde9e44db16820397","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        # container name."},{"line_number":106,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        self.assertRaises(exceptions.NotFound,"},{"line_number":109,"context_line":"                          self.container_client.list_container_metadata,"},{"line_number":110,"context_line":"                          invalid_name)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a9d85d2_08cc4d88","line":108,"updated":"2016-06-20 18:45:39.000000000","message":"Is there a response body that we can confirm against here?  (applies to all of the NotFound cases)","commit_id":"9d7ca9b3ec6c3942ae37bd2839399159f57d5fa9"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"34b6a1868be50a723995887fde9e44db16820397","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        container_name \u003d self.create_container()"},{"line_number":163,"context_line":"        self.create_object(container_name)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        self.assertRaises(exceptions.Conflict,"},{"line_number":166,"context_line":"                          self.container_client.delete_container,"},{"line_number":167,"context_line":"                          container_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a9d85d2_c8ec05ca","line":165,"updated":"2016-06-20 18:45:39.000000000","message":"Same here, I think there is a response body that can be checked against.\n\nAlso, general comment (this may not be possible), is there a current way to validate the actual response headers in exception cases (e.g. verify the content type of HTML on a Conflict)?","commit_id":"9d7ca9b3ec6c3942ae37bd2839399159f57d5fa9"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"492c8efecedfa493cbd6f669b6fa12e31dd386cb","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":35,"context_line":"    @test.idempotent_id(\u0027ac15d6ba-bbbd-4aa3-b29e-bc55b7f902a6\u0027)"},{"line_number":36,"context_line":"    def test_invalid_http_method_call(self):"},{"line_number":37,"context_line":"        # Attempts to call an invalid HTTP method"},{"line_number":38,"context_line":"        ex \u003d self.assertRaises(exceptions.MethodNotAllowed,"},{"line_number":39,"context_line":"                               self.container_client.request,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_5a96d23f","line":36,"updated":"2016-09-15 20:48:10.000000000","message":"So this one I\u0027m not sure is inside the scope of tempest. This seems like a lower level check I\u0027m also not convinced it\u0027s an important check (even for interop) if you cna\u0027t conform to http","commit_id":"7349de25276c651c4bf474c528254de764a2b2ee"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"f41a2b98ae5b377bda96fc819d00f23937f47a59","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class ContainerNegativeTest(base.BaseObjectTest):"},{"line_number":23,"context_line":"    def setUp(self):"},{"line_number":24,"context_line":"        super(ContainerNegativeTest, self).setUp()"},{"line_number":25,"context_line":"        # use /info to get default constraints"},{"line_number":26,"context_line":"        _, body \u003d self.account_client.list_extensions()"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a8ec9b2_451c2ec1","line":23,"updated":"2016-09-15 22:31:46.000000000","message":"So one question here, is doing this in setUp means we will call list_extensions before each test method. I feel like it would be more desireable to do this just once when we start executing the test class. Was this done on purpose for some reason I\u0027m overlooking? It doesn\u0027t really matter too much, just results in an extra call per test.","commit_id":"7e9fed0ec43a5e2d283c73e29ea2d389326fbe76"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"f41a2b98ae5b377bda96fc819d00f23937f47a59","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.containers \u003d []"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def tearDown(self):"},{"line_number":31,"context_line":"        self.delete_containers()"},{"line_number":32,"context_line":"        super(ContainerNegativeTest, self).tearDown()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @test.attr(type\u003d[\"negative\"])"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a8ec9b2_657beaf5","line":31,"updated":"2016-09-15 22:31:46.000000000","message":"I don\u0027t think we need this we should cleanup any containers we make in the tests themselves. For the most part this is a non issue though (except for one place where we do create container without a delete)","commit_id":"7e9fed0ec43a5e2d283c73e29ea2d389326fbe76"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"f41a2b98ae5b377bda96fc819d00f23937f47a59","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # create a container and an object within it"},{"line_number":152,"context_line":"        # attempt to delete a container that isn\u0027t empty."},{"line_number":153,"context_line":"        container_name \u003d self.create_container()"},{"line_number":154,"context_line":"        self.create_object(container_name)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        ex \u003d self.assertRaises(exceptions.Conflict,"},{"line_number":157,"context_line":"                               self.container_client.delete_container,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a8ec9b2_8580f6c1","line":154,"updated":"2016-09-15 22:31:46.000000000","message":"It\u0027d be better if we used an addCleanup(self.container_client.delete_container, container_name) here just to be a bit more explicit about the cleanup","commit_id":"7e9fed0ec43a5e2d283c73e29ea2d389326fbe76"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"8a8e9e52401c54d42844ed6252f95a68ec1e517f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        # use /info to get default constraints"},{"line_number":30,"context_line":"        _, body \u003d cls.account_client.list_extensions()"},{"line_number":31,"context_line":"        cls.constraints \u003d body[\u0027swift\u0027]"},{"line_number":32,"context_line":"        cls.containers \u003d []"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":35,"context_line":"    @test.idempotent_id(\u002730686921-4bed-4764-a038-40d741ed4e78\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_6c664752","line":32,"updated":"2016-09-16 17:45:37.000000000","message":"What is this used for?","commit_id":"113325de9f3eefc98f140360d71278bc7174ecc3"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"c9999c5fb6e8bd0bc13d9347808ca9b6a7b73c46","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    @classmethod"},{"line_number":25,"context_line":"    def resource_setup(cls):"},{"line_number":26,"context_line":"        super(ContainerNegativeTest, cls).resource_setup()"},{"line_number":27,"context_line":"        cls.container_name \u003d cls.create_container()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        # use /info to get default constraints"},{"line_number":30,"context_line":"        _, body \u003d cls.account_client.list_extensions()"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a8ec9b2_bc407608","line":27,"updated":"2016-09-16 22:53:15.000000000","message":"I don\u0027t see this use anywhere? Do we need to create an empty container for the class? Also if we do this is missing a matching cleanup to make sure we don\u0027t leak a container after the class finishes.","commit_id":"55bb30f14ce645557050011f8d676436921dfb6d"},{"author":{"_account_id":9622,"name":"Cindy Lu","email":"clu@us.ibm.com","username":"clu14"},"change_message_id":"395c5d3a00af7d301b0519dc75e9d3d145e14e45","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    @classmethod"},{"line_number":25,"context_line":"    def resource_setup(cls):"},{"line_number":26,"context_line":"        super(ContainerNegativeTest, cls).resource_setup()"},{"line_number":27,"context_line":"        cls.container_name \u003d cls.create_container()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        # use /info to get default constraints"},{"line_number":30,"context_line":"        _, body \u003d cls.account_client.list_extensions()"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a8ec9b2_17d063f5","line":27,"in_reply_to":"7a8ec9b2_bc407608","updated":"2016-09-17 00:16:32.000000000","message":"yea, you\u0027re right about that. removing.","commit_id":"55bb30f14ce645557050011f8d676436921dfb6d"},{"author":{"_account_id":21422,"name":"Minesh Mehta","email":"mminesh@us.ibm.com","username":"mminesh"},"change_message_id":"1d6baf70bb8cc16a9f2a5673ac2e3f5cdae4395e","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":124,"context_line":"    @test.idempotent_id(\u002714331d21-1e81-420a-beea-19cb5e5207f5\u0027)"},{"line_number":125,"context_line":"    def test_show_invalid_container(self):"},{"line_number":126,"context_line":"        # Attempts to get a container that doesn\u0027t exist."},{"line_number":127,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7a8ec9b2_fadc3048","line":125,"updated":"2016-09-20 19:29:21.000000000","message":"Can this test be combined with \"test_delete_with_invalid_container_name\" seems like doing seem but one with delete and another with get..","commit_id":"74a35c713809e5a1c499dee6d55a8dc441640e4c"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2eea2ed97e696e397c81a5cbc918f8d843810c77","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":91,"context_line":"    @test.idempotent_id(\u00271a95ab2e-b712-4a98-8a4d-8ce21b7557d6\u0027)"},{"line_number":92,"context_line":"    def test_get_metadata_headers_with_invalid_container_name(self):"},{"line_number":93,"context_line":"        # Attempts to retrieve metadata headers with an invalid"},{"line_number":94,"context_line":"        # container name."},{"line_number":95,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_dc47571b","line":92,"range":{"start_line":92,"start_character":39,"end_line":92,"end_character":46},"updated":"2016-09-24 00:55:24.000000000","message":"s/invalid/nonexistent/ to test NotFound case.","commit_id":"f12ab18a5d3eae67c07fad98646f72c6370d300f"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2eea2ed97e696e397c81a5cbc918f8d843810c77","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":102,"context_line":"    @test.idempotent_id(\u0027125a24fa-90a7-4cfc-b604-44e49d788390\u0027)"},{"line_number":103,"context_line":"    def test_update_metadata_with_invalid_container_name(self):"},{"line_number":104,"context_line":"        # Attempts to update metadata using an invalid container name."},{"line_number":105,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":106,"context_line":"        metadata \u003d {\u0027animal\u0027: \u0027penguin\u0027}"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_fc56d3d0","line":103,"range":{"start_line":103,"start_character":34,"end_line":103,"end_character":41},"updated":"2016-09-24 00:55:24.000000000","message":"ditto","commit_id":"f12ab18a5d3eae67c07fad98646f72c6370d300f"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2eea2ed97e696e397c81a5cbc918f8d843810c77","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":113,"context_line":"    @test.idempotent_id(\u002765387dbf-a0e2-4aac-9ddc-16eb3f1f69ba\u0027)"},{"line_number":114,"context_line":"    def test_delete_with_invalid_container_name(self):"},{"line_number":115,"context_line":"        # Attempts to delete metadata using an invalid container name."},{"line_number":116,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"},{"line_number":117,"context_line":"        metadata \u003d {\u0027animal\u0027: \u0027penguin\u0027}"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_1c529fdd","line":114,"range":{"start_line":114,"start_character":25,"end_line":114,"end_character":32},"updated":"2016-09-24 00:55:24.000000000","message":"ditto","commit_id":"f12ab18a5d3eae67c07fad98646f72c6370d300f"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2eea2ed97e696e397c81a5cbc918f8d843810c77","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @test.attr(type\u003d[\"negative\"])"},{"line_number":124,"context_line":"    @test.idempotent_id(\u002714331d21-1e81-420a-beea-19cb5e5207f5\u0027)"},{"line_number":125,"context_line":"    def test_list_all_container_objects_with_invalid_container(self):"},{"line_number":126,"context_line":"        # Attempts to get a listing of all objects on a container"},{"line_number":127,"context_line":"        # that doesn\u0027t exist."},{"line_number":128,"context_line":"        invalid_name \u003d data_utils.rand_name(name\u003d\"TestInvalidContainer\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a8bc5a2_3c5f5be6","line":125,"range":{"start_line":125,"start_character":45,"end_line":125,"end_character":52},"updated":"2016-09-24 00:55:24.000000000","message":"ditto","commit_id":"f12ab18a5d3eae67c07fad98646f72c6370d300f"}],"tempest/lib/common/rest_client.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"492c8efecedfa493cbd6f669b6fa12e31dd386cb","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        if resp.status \u003d\u003d 405:"},{"line_number":766,"context_line":"            if parse_resp:"},{"line_number":767,"context_line":"                resp_body \u003d self._parse_resp(resp_body)"},{"line_number":768,"context_line":"            raise exceptions.MethodNotAllowed(resp_body, resp\u003dresp)"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        if resp.status \u003d\u003d 400:"},{"line_number":771,"context_line":"            if parse_resp:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_3a910648","line":768,"updated":"2016-09-15 20:48:10.000000000","message":"This is only needed in this change because of the test which I don\u0027t think is valid. We can add this in a seperate patch from this and have matching unit tests for it. But since it\u0027s not needed here it shouldn\u0027t be part of this commit.","commit_id":"7349de25276c651c4bf474c528254de764a2b2ee"}],"tempest/lib/common/utils/data_utils.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0a4449c5c741b6bc73972d9eb14f7aeb400cdf3c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    return uuid.uuid4().hex"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def rand_name(name\u003d\u0027\u0027, prefix\u003dNone, length\u003d0):"},{"line_number":42,"context_line":"    \"\"\"Generate a random name that includes a random number"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    :param str name: The name that you want to include"}],"source_content_type":"text/x-python","patch_set":6,"id":"bab6814e_5dd578b7","line":41,"updated":"2016-05-24 14:20:10.000000000","message":"No need to add an extra parameter. arbitrary_string() defined L154 should do what you want.","commit_id":"a7301fc384b402c9df614d201d9d2a77a2f8a57b"}],"tempest/lib/exceptions.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"492c8efecedfa493cbd6f669b6fa12e31dd386cb","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"class MethodNotAllowed(OtherRestClientException):"},{"line_number":119,"context_line":"    message \u003d \"Method not allowed for this resource\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class Gone(ClientRestClientException):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_9a9cda5e","line":119,"updated":"2016-09-15 20:48:10.000000000","message":"Ditto","commit_id":"7349de25276c651c4bf474c528254de764a2b2ee"}],"tempest/services/object_storage/container_client.py":[{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"013e9621ac085f6033283a78ca9c1195dab25339","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        \"\"\"Retrieves the container.\"\"\""},{"line_number":59,"context_line":"        url \u003d str(container_name)"},{"line_number":60,"context_line":"        resp, body \u003d self.get(url)"},{"line_number":61,"context_line":"        self.expected_success([200, 204], resp.status)"},{"line_number":62,"context_line":"        return resp, body"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def update_container_metadata("}],"source_content_type":"text/x-python","patch_set":2,"id":"dab17558_3e49a28c","line":61,"updated":"2016-05-06 11:43:24.000000000","message":"We should probably add a call to:\nself.assertHeaders(resp, \u0027Container\u0027, \u0027GET\u0027)\n\nTo validate the common response headers and their formats.","commit_id":"31b2bc99bb3aa50921354af2aaa1813e7cf69d8a"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"492c8efecedfa493cbd6f669b6fa12e31dd386cb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        url \u003d str(container_name)"},{"line_number":60,"context_line":"        resp, body \u003d self.get(url)"},{"line_number":61,"context_line":"        self.expected_success([200, 204], resp.status)"},{"line_number":62,"context_line":"        return resp, body"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def update_container_metadata("},{"line_number":65,"context_line":"            self, container_name,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a8ec9b2_7a970e3a","line":62,"updated":"2016-09-15 20:48:10.000000000","message":"Hmm, we really didn\u0027t have a show_container method before. We must have really poor coverage here.","commit_id":"7349de25276c651c4bf474c528254de764a2b2ee"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"83305cdfc5d19e45e5c90a65b5e137ac40ed5220","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":55,"context_line":"        return resp, body"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def show_container(self, container_name):"},{"line_number":58,"context_line":"        \"\"\"Retrieves the container.\"\"\""},{"line_number":59,"context_line":"        url \u003d str(container_name)"},{"line_number":60,"context_line":"        resp, body \u003d self.get(url)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_cf7aedbc","line":57,"range":{"start_line":57,"start_character":8,"end_line":57,"end_character":22},"updated":"2016-09-16 18:16:59.000000000","message":"This method improves API coverage, that is good for us.\nHowever, why don\u0027t we add positive test case for this API before negative case?\n\nOne of this problems is that if most servers return NotFound if the API(not container resource) itself doesn\u0027t exist.\nSo if we don\u0027t have positive test case before, we cannot distinguish it.","commit_id":"4bed2e61f528ec2dccbb335754f46c68e0b7e12c"}]}
