)]}'
{"test/functional/tests.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":754,"context_line":"        for actual in file_list:"},{"line_number":755,"context_line":"            name \u003d actual[\u0027name\u0027]"},{"line_number":756,"context_line":"            self.assertIn(name, expected)"},{"line_number":757,"context_line":"            self.assertEqual(expected[name][\u0027etag\u0027], actual[\u0027hash\u0027])"},{"line_number":758,"context_line":"            self.assertEqual("},{"line_number":759,"context_line":"                expected[name][\u0027content_type\u0027], actual[\u0027content_type\u0027])"},{"line_number":760,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_42787bc4","line":757,"updated":"2016-06-14 05:17:41.000000000","message":"I take it these are all plain-old-swift-objects? No *LOs?","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":754,"context_line":"        for actual in file_list:"},{"line_number":755,"context_line":"            name \u003d actual[\u0027name\u0027]"},{"line_number":756,"context_line":"            self.assertIn(name, expected)"},{"line_number":757,"context_line":"            self.assertEqual(expected[name][\u0027etag\u0027], actual[\u0027hash\u0027])"},{"line_number":758,"context_line":"            self.assertEqual("},{"line_number":759,"context_line":"                expected[name][\u0027content_type\u0027], actual[\u0027content_type\u0027])"},{"line_number":760,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_3d1458e7","line":757,"in_reply_to":"7aa08908_21ad5b9b","updated":"2016-06-14 11:40:35.000000000","message":"+1 Kota\u0027s reply","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7b7df115f50bae06c54abbee086432a2c81347f8","unresolved":false,"context_lines":[{"line_number":754,"context_line":"        for actual in file_list:"},{"line_number":755,"context_line":"            name \u003d actual[\u0027name\u0027]"},{"line_number":756,"context_line":"            self.assertIn(name, expected)"},{"line_number":757,"context_line":"            self.assertEqual(expected[name][\u0027etag\u0027], actual[\u0027hash\u0027])"},{"line_number":758,"context_line":"            self.assertEqual("},{"line_number":759,"context_line":"                expected[name][\u0027content_type\u0027], actual[\u0027content_type\u0027])"},{"line_number":760,"context_line":"            self.assertEqual("}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_21ad5b9b","line":757,"in_reply_to":"7aa08908_42787bc4","updated":"2016-06-14 08:01:00.000000000","message":"It looks like only raw objects[1]\n\n1: https://github.com/openstack/swift/blob/master/test/functional/tests.py#L474-L493","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":758,"context_line":"            self.assertEqual("},{"line_number":759,"context_line":"                expected[name][\u0027content_type\u0027], actual[\u0027content_type\u0027])"},{"line_number":760,"context_line":"            self.assertEqual("},{"line_number":761,"context_line":"                expected[name][\u0027content_length\u0027], int(actual[\u0027bytes\u0027]))"},{"line_number":762,"context_line":"            expected.pop(name)"},{"line_number":763,"context_line":"        self.assertFalse(expected)  # sanity check"},{"line_number":764,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_fd6f8cc1","line":761,"updated":"2016-06-14 05:17:41.000000000","message":"nit: we could strengthen this by having swift_test_client do the int() for the XML listing. Then we\u0027d also assert that the json listing uses the correct type.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":758,"context_line":"            self.assertEqual("},{"line_number":759,"context_line":"                expected[name][\u0027content_type\u0027], actual[\u0027content_type\u0027])"},{"line_number":760,"context_line":"            self.assertEqual("},{"line_number":761,"context_line":"                expected[name][\u0027content_length\u0027], int(actual[\u0027bytes\u0027]))"},{"line_number":762,"context_line":"            expected.pop(name)"},{"line_number":763,"context_line":"        self.assertFalse(expected)  # sanity check"},{"line_number":764,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_738d6f30","line":761,"in_reply_to":"7aa08908_fd6f8cc1","updated":"2016-06-14 11:40:35.000000000","message":"Done","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"}],"test/probe/test_container_merge_policy_index.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            self.fail(\u0027could not HEAD /%s/%s/%s/ from policy %s \u0027"},{"line_number":145,"context_line":"                      \u0027after %s seconds.\u0027 % ("},{"line_number":146,"context_line":"                          self.account, self.container_name, self.object_name,"},{"line_number":147,"context_line":"                          expected_policy_index, TIMEOUT))"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_reconcile_delete(self):"},{"line_number":150,"context_line":"        # generic split brain"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_6a964cf1","side":"PARENT","line":147,"updated":"2016-06-13 10:25:30.000000000","message":"Oh my... the weird code I found at L49 is here. Yeah, it has been just moved from here...","commit_id":"7a50972104095478c91a477f5c5499dda4372711"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            except ClientException as err:"},{"line_number":58,"context_line":"                if err.http_status !\u003d HTTP_NOT_FOUND:"},{"line_number":59,"context_line":"                    raise"},{"line_number":60,"context_line":"                time.sleep(1)"},{"line_number":61,"context_line":"        else:"},{"line_number":62,"context_line":"            self.fail(\u0027could not HEAD /%s/%s/%s/ from policy %s \u0027"},{"line_number":63,"context_line":"                      \u0027after %s seconds.\u0027 % ("}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_af232657","line":60,"updated":"2016-06-13 10:25:30.000000000","message":"Sorry I didn\u0027t get why we need to retry again for a few times when it\u0027s NOT_FOUND. I think _get_object_patiently is called when the probe tests get into the final state so if we retry again, probably the state is not changed (IMO, it should be changed because it means any other components except *consistency engine* can change the backend states)\n\nIf we want to set a connection/node timeout like swift proxy,\n\n try:\n   with Timeout(TIMEOUT):\n      \u003csnip\u003e\n except Timeout:\n   self.fail(\u0027could not HEAD /%s/%s/%s/ from policy %s \u0027\n             \u0027after %s seconds.\u0027 % (\n               self.account, self.container_name, self.object_name,\n               int(policy_index), TIMEOUT))\n\n\nseems a way to resolve the issue? I\u0027m not sure though.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1c38a2f2cdb03d5736bbe4699f83dccea5f0c817","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            except ClientException as err:"},{"line_number":58,"context_line":"                if err.http_status !\u003d HTTP_NOT_FOUND:"},{"line_number":59,"context_line":"                    raise"},{"line_number":60,"context_line":"                time.sleep(1)"},{"line_number":61,"context_line":"        else:"},{"line_number":62,"context_line":"            self.fail(\u0027could not HEAD /%s/%s/%s/ from policy %s \u0027"},{"line_number":63,"context_line":"                      \u0027after %s seconds.\u0027 % ("}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_cc0b1223","line":60,"in_reply_to":"7aa08908_af232657","updated":"2016-06-13 14:36:24.000000000","message":"This code has been broken out to this helper function so it could be re-used, but is not changed. I understood this as a workaround for the possibility that the get request handler in the proxy uses stale (bad) container metadata cached in memcache and so the request fails with 404 because the object has moved to the correct container. The memcache timeout for container info is 60 seconds.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"0ef0e4195fbeb014132db61e86dc3bfb979a7f3a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            except ClientException as err:"},{"line_number":58,"context_line":"                if err.http_status !\u003d HTTP_NOT_FOUND:"},{"line_number":59,"context_line":"                    raise"},{"line_number":60,"context_line":"                time.sleep(1)"},{"line_number":61,"context_line":"        else:"},{"line_number":62,"context_line":"            self.fail(\u0027could not HEAD /%s/%s/%s/ from policy %s \u0027"},{"line_number":63,"context_line":"                      \u0027after %s seconds.\u0027 % ("}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_26d3b1d6","line":60,"in_reply_to":"7aa08908_cc0b1223","updated":"2016-06-14 05:49:02.000000000","message":"Gotcha that is why this is trying to retry.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                   self.object_name, \u0027container\u0027)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _get_object_patiently(self, policy_index):"},{"line_number":50,"context_line":"        # use proxy to access object (bad container info might be cached...)"},{"line_number":51,"context_line":"        timeout \u003d time.time() + TIMEOUT"},{"line_number":52,"context_line":"        while time.time() \u003c timeout:"},{"line_number":53,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_1dc7f898","line":50,"updated":"2016-06-14 05:17:41.000000000","message":"Following on from Kota\u0027s question: if we\u0027re primarily concerned about stale memcache hits, why don\u0027t we talk to memcache directly and kill the bad data? This could be either in the tests themselves when needed, or here and we reduce this to a single retry.\n\nI mean, we\u0027re already in probe tests, so we\u0027re mucking about with a lot of internals, right?\n\nMaybe better as a follow-up, to ensure we don\u0027t change more than is necessary to get crypto landed.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7b7df115f50bae06c54abbee086432a2c81347f8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                   self.object_name, \u0027container\u0027)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _get_object_patiently(self, policy_index):"},{"line_number":50,"context_line":"        # use proxy to access object (bad container info might be cached...)"},{"line_number":51,"context_line":"        timeout \u003d time.time() + TIMEOUT"},{"line_number":52,"context_line":"        while time.time() \u003c timeout:"},{"line_number":53,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_266f31fd","line":50,"in_reply_to":"7aa08908_1dc7f898","updated":"2016-06-14 08:01:00.000000000","message":"Sounds nice! I think we could change test.probe.common.ProbeTest.got_to_final_state to refresh the memcache state right? Anyways, it could be better to do it in follow-up.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                   self.object_name, \u0027container\u0027)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _get_object_patiently(self, policy_index):"},{"line_number":50,"context_line":"        # use proxy to access object (bad container info might be cached...)"},{"line_number":51,"context_line":"        timeout \u003d time.time() + TIMEOUT"},{"line_number":52,"context_line":"        while time.time() \u003c timeout:"},{"line_number":53,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_dd81d4c4","line":50,"in_reply_to":"7aa08908_266f31fd","updated":"2016-06-14 11:40:35.000000000","message":"I\u0027d prefer that to be a separate follow-up patch.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e3b4da38dc33846d77d2ba18611c8271e16ec5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                                   self.object_name, \u0027container\u0027)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _get_object_patiently(self, policy_index):"},{"line_number":50,"context_line":"        # use proxy to access object (bad container info might be cached...)"},{"line_number":51,"context_line":"        timeout \u003d time.time() + TIMEOUT"},{"line_number":52,"context_line":"        while time.time() \u003c timeout:"},{"line_number":53,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_749d3c09","line":50,"in_reply_to":"7aa08908_dd81d4c4","updated":"2016-06-14 17:46:48.000000000","message":"Added to my list of follow-ups.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            self.fail(\u0027could not HEAD /%s/%s/%s/ from policy %s \u0027"},{"line_number":63,"context_line":"                      \u0027after %s seconds.\u0027 % ("},{"line_number":64,"context_line":"                          self.account, self.container_name, self.object_name,"},{"line_number":65,"context_line":"                          int(policy_index), TIMEOUT))"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_merge_storage_policy_index(self):"},{"line_number":68,"context_line":"        # generic split brain"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_7dfd5cb0","line":65,"updated":"2016-06-14 05:17:41.000000000","message":"Right, now it\u0027s starting to make sense to me that we (as an \"external\" proxy user) would care about the policy index...","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.brain.start_primary_half()"},{"line_number":72,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":73,"context_line":"        self.brain.put_container()"},{"line_number":74,"context_line":"        client.put_object(self.url, self.token, self.container_name,"},{"line_number":75,"context_line":"                          self.object_name, contents\u003d\u0027VERIFY\u0027,"},{"line_number":76,"context_line":"                          headers\u003d{\u0027x-object-meta-test\u0027: \u0027custom-meta\u0027})"},{"line_number":77,"context_line":"        self.brain.start_handoff_half()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_7dd55ce3","line":74,"updated":"2016-06-14 05:17:41.000000000","message":"Out of curiosity, any reason to do this instead of plumbing `contents` into BrainSplitter.put_object?","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.brain.start_primary_half()"},{"line_number":72,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":73,"context_line":"        self.brain.put_container()"},{"line_number":74,"context_line":"        client.put_object(self.url, self.token, self.container_name,"},{"line_number":75,"context_line":"                          self.object_name, contents\u003d\u0027VERIFY\u0027,"},{"line_number":76,"context_line":"                          headers\u003d{\u0027x-object-meta-test\u0027: \u0027custom-meta\u0027})"},{"line_number":77,"context_line":"        self.brain.start_handoff_half()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_40c21754","line":74,"in_reply_to":"7aa08908_61492331","updated":"2016-06-14 11:40:35.000000000","message":"The new assertions are already added at lines 151-153. this test is not changed again in later patches, I just wanted to have a little more assurance here that the relocated object body and metadata are not corrupted during the reconciler process.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.brain.start_primary_half()"},{"line_number":72,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":73,"context_line":"        self.brain.put_container()"},{"line_number":74,"context_line":"        client.put_object(self.url, self.token, self.container_name,"},{"line_number":75,"context_line":"                          self.object_name, contents\u003d\u0027VERIFY\u0027,"},{"line_number":76,"context_line":"                          headers\u003d{\u0027x-object-meta-test\u0027: \u0027custom-meta\u0027})"},{"line_number":77,"context_line":"        self.brain.start_handoff_half()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_0093ef5b","line":74,"in_reply_to":"7aa08908_7dd55ce3","updated":"2016-06-14 11:40:35.000000000","message":"Done. yeah that would be neater.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7b7df115f50bae06c54abbee086432a2c81347f8","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.brain.start_primary_half()"},{"line_number":72,"context_line":"        self.brain.stop_handoff_half()"},{"line_number":73,"context_line":"        self.brain.put_container()"},{"line_number":74,"context_line":"        client.put_object(self.url, self.token, self.container_name,"},{"line_number":75,"context_line":"                          self.object_name, contents\u003d\u0027VERIFY\u0027,"},{"line_number":76,"context_line":"                          headers\u003d{\u0027x-object-meta-test\u0027: \u0027custom-meta\u0027})"},{"line_number":77,"context_line":"        self.brain.start_handoff_half()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_61492331","line":74,"in_reply_to":"7aa08908_7dd55ce3","updated":"2016-06-14 08:01:00.000000000","message":"Just what I thought is though, we will add some assertions for the content body and custom object metadata when encyrption turned on.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        self.assertEqual(2, len(old_container_node_ids))"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        # hopefully memcache still has the new policy cached"},{"line_number":408,"context_line":"        client.put_object(self.url, self.token, self.container_name,"},{"line_number":409,"context_line":"                          self.object_name, contents\u003d\u0027VERIFY\u0027,"},{"line_number":410,"context_line":"                          headers\u003d{\u0027x-object-meta-test\u0027: \u0027custom-meta\u0027})"},{"line_number":411,"context_line":"        # double-check object correctly written to new policy"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_f3095f32","line":408,"updated":"2016-06-14 11:40:35.000000000","message":"ditto comment line 74","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        return True"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_dd9570e4","line":348,"updated":"2016-06-14 05:17:41.000000000","message":"Where are we using this? Why don\u0027t we just ensure app.memcache and env[\u0027swift.cache\u0027] are unset/None?","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3a3f8b582644998beb0c800ea397eeeccd42946d","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        return True"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_f760d9a6","line":348,"in_reply_to":"7aa08908_4f0a2921","updated":"2016-06-15 15:45:48.000000000","message":"Oh I get it! Ok so for the test servers setup (helpers.py) I just left memcache unconfigured in the proxy app. That means I can revert FakeMemCacheReturnsNone to its original home and leave it untouched.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e3b4da38dc33846d77d2ba18611c8271e16ec5","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        return True"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_4f0a2921","line":348,"in_reply_to":"7aa08908_b6e98581","updated":"2016-06-14 17:46:48.000000000","message":"I\u0027m still not clear on why we can\u0027t just ensure that memcache is left \"unconfigured\" for those tests. Eh, maybe best to let sleeping dogs lie for now. Added to my list of follow-ups.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        return True"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b6e98581","line":348,"in_reply_to":"7aa08908_dd9570e4","updated":"2016-06-14 11:40:35.000000000","message":"It is used in test/unit/proxy/test_server.py but also in the setup_servers function that I refactored to test/unit/helpers.py. This seemed like a good place to move FakeMemcacheReturnsNone so that it could be imported in both of those modules.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"},{"line_number":352,"context_line":"        # using the FakeMemcache for container existence checks."},{"line_number":353,"context_line":"        return None"},{"line_number":354,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_fd45cc6e","line":351,"range":{"start_line":351,"start_character":30,"end_line":351,"end_character":39},"updated":"2016-06-14 05:17:41.000000000","message":"Isn\u0027t it returning None as the *info* for the container? I.e., there was a cache miss?","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7b7df115f50bae06c54abbee086432a2c81347f8","unresolved":false,"context_lines":[{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"},{"line_number":352,"context_line":"        # using the FakeMemcache for container existence checks."},{"line_number":353,"context_line":"        return None"},{"line_number":354,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_21371b4e","line":351,"range":{"start_line":351,"start_character":30,"end_line":351,"end_character":39},"in_reply_to":"7aa08908_fd45cc6e","updated":"2016-06-14 08:01:00.000000000","message":"As you said, it seems to wrap the memcache.get() [1] and primary user seems to test/unit/proxy/test_server.py (e.g. [2])\n\n1: https://github.com/openstack/swift/blob/master/swift/proxy/controllers/base.py#L563\n2: https://github.com/openstack/swift/blob/master/test/unit/proxy/test_server.py#L180-L181","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":348,"context_line":"class FakeMemcacheReturnsNone(FakeMemcache):"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"    def get(self, key):"},{"line_number":351,"context_line":"        # Returns None as the timestamp of the container; assumes we\u0027re only"},{"line_number":352,"context_line":"        # using the FakeMemcache for container existence checks."},{"line_number":353,"context_line":"        return None"},{"line_number":354,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_b6b7c583","line":351,"range":{"start_line":351,"start_character":30,"end_line":351,"end_character":39},"in_reply_to":"7aa08908_fd45cc6e","updated":"2016-06-14 11:40:35.000000000","message":"The comment seems wonky, I\u0027ll just delete it. There is nothing I can see here that is specific to containers.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    MESSAGE \u003d \u0027Testing application exception\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def __call__(self, env, start_response):"},{"line_number":177,"context_line":"        raise HTTPException(self.MESSAGE)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_32531a3b","line":177,"updated":"2016-06-13 10:25:30.000000000","message":"It might be far from this refactoring but I think we should keep the original code as raise Exception instead of replacing as HTTPException, here. That is because HTTPException with non status_int arg will result in making a HTTPException instance with 200 status_int and that makes us to look odd result at the proxy logging test[1]. The odd point is the app returns 200 but proxy logging make a 500 log. I know the HTTPException should be translated to just a HTTPResponse in proxy app (or catch_errors middleware) and if it isn\u0027t, the proxy-logging will assume it as a 500 exception but in the actual Swift, it won\u0027t happen because proxy-app has the last-resort to handle it[2].\n\n1: https://github.com/openstack/swift/blob/master/test/unit/common/middleware/test_proxy_logging.py#L679\n\n2: https://github.com/openstack/swift/blob/master/test/unit/common/middleware/test_proxy_logging.py#L679","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1c38a2f2cdb03d5736bbe4699f83dccea5f0c817","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    MESSAGE \u003d \u0027Testing application exception\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def __call__(self, env, start_response):"},{"line_number":177,"context_line":"        raise HTTPException(self.MESSAGE)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_c26f59fa","line":177,"in_reply_to":"7aa08908_32531a3b","updated":"2016-06-13 14:36:24.000000000","message":"Fair point.\n\nI will change this to make the exception class a parameter. For test_encrypter we want to test HTTPExceptions being raised and handled in encrypter (other exceptions aere handled by catch_errors). But for test_proxy_logging the default will be Exception, same as on master.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"0ef0e4195fbeb014132db61e86dc3bfb979a7f3a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    MESSAGE \u003d \u0027Testing application exception\u0027"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def __call__(self, env, start_response):"},{"line_number":177,"context_line":"        raise HTTPException(self.MESSAGE)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_6623f9bd","line":177,"in_reply_to":"7aa08908_c26f59fa","updated":"2016-06-14 05:49:02.000000000","message":"Sounds reasonable, thanks.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":3220,"context_line":"            \u0027text/plain; other\u003dthing;swift_bytes\u003d123\u0027:"},{"line_number":3221,"context_line":"                (\u0027text/plain;other\u003dthing\u0027, \u0027123\u0027),"},{"line_number":3222,"context_line":"            \u0027text/plain; swift_bytes\u003d123; other\u003dthing\u0027:"},{"line_number":3223,"context_line":"                (\u0027text/plain;other\u003dthing\u0027, \u0027123\u0027)}"},{"line_number":3224,"context_line":"        for test_value, expected in scenarios.items():"},{"line_number":3225,"context_line":"            self.assertEqual(expected, utils.extract_swift_bytes(test_value))"},{"line_number":3226,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_f8103a02","line":3223,"updated":"2016-06-14 05:17:41.000000000","message":"Might be worth adding a case like\n\n \u0027text/plain; swift_bytes\u003d123; swift_bytes\u003d456\u0027: (\u0027text/plain\u0027, \u0027456\u0027),","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":3220,"context_line":"            \u0027text/plain; other\u003dthing;swift_bytes\u003d123\u0027:"},{"line_number":3221,"context_line":"                (\u0027text/plain;other\u003dthing\u0027, \u0027123\u0027),"},{"line_number":3222,"context_line":"            \u0027text/plain; swift_bytes\u003d123; other\u003dthing\u0027:"},{"line_number":3223,"context_line":"                (\u0027text/plain;other\u003dthing\u0027, \u0027123\u0027)}"},{"line_number":3224,"context_line":"        for test_value, expected in scenarios.items():"},{"line_number":3225,"context_line":"            self.assertEqual(expected, utils.extract_swift_bytes(test_value))"},{"line_number":3226,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_912bb381","line":3223,"in_reply_to":"7aa08908_f8103a02","updated":"2016-06-14 11:40:35.000000000","message":"Done","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"}],"test/unit/helpers.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from swift.account import server as account_server"},{"line_number":30,"context_line":"from swift.common import storage_policy"},{"line_number":31,"context_line":"from swift.common.ring import RingData"},{"line_number":32,"context_line":"from swift.common.storage_policy import StoragePolicy, ECStoragePolicy"},{"line_number":33,"context_line":"from swift.common.middleware import proxy_logging"},{"line_number":34,"context_line":"from swift.common import utils"},{"line_number":35,"context_line":"from swift.common.utils import mkdirs, normalize_timestamp, NullLogger"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_0fdd17e0","line":32,"updated":"2016-06-13 10:25:30.000000000","message":"nits) Why don\u0027t you using storage_policy.StoragePolicy? Or import all components we need via \"from ... import ...\" statement?\n\nHmm... I know we need to touch an underscore variable, _POLICIES, so it might be a reason why you did like this though...","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1c38a2f2cdb03d5736bbe4699f83dccea5f0c817","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from swift.account import server as account_server"},{"line_number":30,"context_line":"from swift.common import storage_policy"},{"line_number":31,"context_line":"from swift.common.ring import RingData"},{"line_number":32,"context_line":"from swift.common.storage_policy import StoragePolicy, ECStoragePolicy"},{"line_number":33,"context_line":"from swift.common.middleware import proxy_logging"},{"line_number":34,"context_line":"from swift.common import utils"},{"line_number":35,"context_line":"from swift.common.utils import mkdirs, normalize_timestamp, NullLogger"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_278bcfc4","line":32,"in_reply_to":"7aa08908_0fdd17e0","updated":"2016-06-13 14:36:24.000000000","message":"I just moved the code from unit/proxy/test_server.py where the imports were the same. But yes, we modify storage_policy._POLICIES so cannot import _POLICIES directly, and then the other imports are just more convenient to refer to in the code without the storage_policy qualifier I guess.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    FakeMemcacheReturnsNone, debug_logger, connect_tcp, readuntil2crlfs"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def setup_servers(the_object_server\u003dobject_server, extra_conf\u003dNone):"},{"line_number":46,"context_line":"    context \u003d {"},{"line_number":47,"context_line":"        \"orig_POLICIES\": storage_policy._POLICIES,"},{"line_number":48,"context_line":"        \"orig_SysLogHandler\": utils.SysLogHandler}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_af9b2365","line":45,"range":{"start_line":45,"start_character":51,"end_line":45,"end_character":66},"updated":"2016-06-13 10:25:30.000000000","message":"Nice, maybe the extra_conf arg is what you want to test the encryption stuff easily.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1c38a2f2cdb03d5736bbe4699f83dccea5f0c817","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    FakeMemcacheReturnsNone, debug_logger, connect_tcp, readuntil2crlfs"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def setup_servers(the_object_server\u003dobject_server, extra_conf\u003dNone):"},{"line_number":46,"context_line":"    context \u003d {"},{"line_number":47,"context_line":"        \"orig_POLICIES\": storage_policy._POLICIES,"},{"line_number":48,"context_line":"        \"orig_SysLogHandler\": utils.SysLogHandler}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_e796e73c","line":45,"range":{"start_line":45,"start_character":51,"end_line":45,"end_character":66},"in_reply_to":"7aa08908_af9b2365","updated":"2016-06-13 14:36:24.000000000","message":"We use this to force fast-post mode in some tests\n\nhttps://github.com/openstack/swift/blob/feature/crypto/test/unit/common/middleware/test_encrypter_decrypter.py#L565","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"0ef0e4195fbeb014132db61e86dc3bfb979a7f3a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    FakeMemcacheReturnsNone, debug_logger, connect_tcp, readuntil2crlfs"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def setup_servers(the_object_server\u003dobject_server, extra_conf\u003dNone):"},{"line_number":46,"context_line":"    context \u003d {"},{"line_number":47,"context_line":"        \"orig_POLICIES\": storage_policy._POLICIES,"},{"line_number":48,"context_line":"        \"orig_SysLogHandler\": utils.SysLogHandler}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_c603cd0e","line":45,"range":{"start_line":45,"start_character":51,"end_line":45,"end_character":66},"in_reply_to":"7aa08908_e796e73c","updated":"2016-06-14 05:49:02.000000000","message":"make sense, thanks.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"from contextlib import closing"},{"line_number":18,"context_line":"from gzip import GzipFile"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_38cc8288","line":15,"updated":"2016-06-14 05:17:41.000000000","message":"Probably deserves a module-level docstring.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import os"},{"line_number":17,"context_line":"from contextlib import closing"},{"line_number":18,"context_line":"from gzip import GzipFile"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_71ac478c","line":15,"in_reply_to":"7aa08908_38cc8288","updated":"2016-06-14 11:40:35.000000000","message":"Done","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e3b4da38dc33846d77d2ba18611c8271e16ec5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        mkdirs(os.path.join(_testdir, drive, \u0027tmp\u0027))"},{"line_number":62,"context_line":"    conf \u003d {\u0027devices\u0027: _testdir, \u0027swift_dir\u0027: _testdir,"},{"line_number":63,"context_line":"            \u0027mount_check\u0027: \u0027false\u0027, \u0027allowed_headers\u0027:"},{"line_number":64,"context_line":"            \u0027content-encoding, x-object-manifest, content-disposition, foo\u0027,"},{"line_number":65,"context_line":"            \u0027allow_versions\u0027: \u0027t\u0027}"},{"line_number":66,"context_line":"    if extra_conf:"},{"line_number":67,"context_line":"        conf.update(extra_conf)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_097e61e3","line":64,"updated":"2016-06-14 17:46:48.000000000","message":"Huh. Neither X-Delete-At nor X-Static-Large-Object? I guess the original didn\u0027t either.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e3b4da38dc33846d77d2ba18611c8271e16ec5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027content-encoding, x-object-manifest, content-disposition, foo\u0027,"},{"line_number":65,"context_line":"            \u0027allow_versions\u0027: \u0027t\u0027}"},{"line_number":66,"context_line":"    if extra_conf:"},{"line_number":67,"context_line":"        conf.update(extra_conf)"},{"line_number":68,"context_line":"    prolis \u003d listen((\u0027localhost\u0027, 0))"},{"line_number":69,"context_line":"    acc1lis \u003d listen((\u0027localhost\u0027, 0))"},{"line_number":70,"context_line":"    acc2lis \u003d listen((\u0027localhost\u0027, 0))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_69b44581","line":67,"updated":"2016-06-14 17:46:48.000000000","message":"Who includes extra_conf? It seems like a sensible option to add, though.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"df3a55b571757ca1a54675fcd3790cbf7bfec469","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027content-encoding, x-object-manifest, content-disposition, foo\u0027,"},{"line_number":65,"context_line":"            \u0027allow_versions\u0027: \u0027t\u0027}"},{"line_number":66,"context_line":"    if extra_conf:"},{"line_number":67,"context_line":"        conf.update(extra_conf)"},{"line_number":68,"context_line":"    prolis \u003d listen((\u0027localhost\u0027, 0))"},{"line_number":69,"context_line":"    acc1lis \u003d listen((\u0027localhost\u0027, 0))"},{"line_number":70,"context_line":"    acc2lis \u003d listen((\u0027localhost\u0027, 0))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_70c87a57","line":67,"in_reply_to":"7aa08908_69b44581","updated":"2016-06-15 13:38:15.000000000","message":"https://github.com/openstack/swift/blob/feature/crypto/test/unit/common/middleware/test_encrypter_decrypter.py#L565","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e3b4da38dc33846d77d2ba18611c8271e16ec5","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                                                         \u0027x-trans-id\u0027: \u0027test\u0027})"},{"line_number":188,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":189,"context_line":"        assert(resp.status \u003d\u003d 201)"},{"line_number":190,"context_line":"    # Create containers, 1 per test policy"},{"line_number":191,"context_line":"    sock \u003d connect_tcp((\u0027localhost\u0027, prolis.getsockname()[1]))"},{"line_number":192,"context_line":"    fd \u003d sock.makefile()"},{"line_number":193,"context_line":"    fd.write(\u0027PUT /v1/a/c HTTP/1.1\\r\\nHost: localhost\\r\\n\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_74fc1c72","line":190,"updated":"2016-06-14 17:46:48.000000000","message":"No container for \u0027ec\u0027 policy? I suppose that\u0027s how it was in the original, too...","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9c72f79eb9e3fa600dbcaf94ee6f491ea6e984cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7aa08908_d8b61edb","line":246,"updated":"2016-06-14 05:17:41.000000000","message":"This seems to be begging for something like\n\n    @contextlib.contextmanager\n    def in_process_servers(the_object_server\u003dobject_server, extra_conf\u003dNone):\n        try:\n            context \u003d setup_servers(the_object_server, extra_conf)\n            yield context\n        finally:\n            teardown_servers(context)\n\nFor that matter, how much do callers actually care about the context? Could it just be a bare `yield`?","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e3b4da38dc33846d77d2ba18611c8271e16ec5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7aa08908_6f1e0560","line":246,"in_reply_to":"7aa08908_d19a5b61","updated":"2016-06-14 17:46:48.000000000","message":"Added to my list of follow-ups.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92706c2256e31647257ddba1d8a7abecaeb5d8cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7aa08908_d19a5b61","line":246,"in_reply_to":"7aa08908_d8b61edb","updated":"2016-06-14 11:40:35.000000000","message":"Nice idea but that would require a lot more refactoring of proxy/test_server.py than I wanted to undertake here (unless i am missing a trick).\n\nThe callers do use the context.","commit_id":"5d838ed7fe345e7f7c4b84531ce87230fc07efbf"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    global _test_context, _testdir, _test_servers, _test_sockets, \\"},{"line_number":96,"context_line":"        _test_POLICIES"},{"line_number":97,"context_line":"    monkey_patch_mimetools()"},{"line_number":98,"context_line":"    _test_context \u003d setup_servers(object_server)"},{"line_number":99,"context_line":"    _testdir \u003d _test_context[\"testdir\"]"},{"line_number":100,"context_line":"    _test_servers \u003d _test_context[\"test_servers\"]"},{"line_number":101,"context_line":"    _test_sockets \u003d _test_context[\"test_sockets\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_2f50d3d3","line":98,"updated":"2016-06-13 10:25:30.000000000","message":"Looks like setup_servers takes swift.obj.server (as objct_server) as default value?\n\nThus, we can remove object_server for this (and maybe also for do_setup).","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1c38a2f2cdb03d5736bbe4699f83dccea5f0c817","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    global _test_context, _testdir, _test_servers, _test_sockets, \\"},{"line_number":96,"context_line":"        _test_POLICIES"},{"line_number":97,"context_line":"    monkey_patch_mimetools()"},{"line_number":98,"context_line":"    _test_context \u003d setup_servers(object_server)"},{"line_number":99,"context_line":"    _testdir \u003d _test_context[\"testdir\"]"},{"line_number":100,"context_line":"    _test_servers \u003d _test_context[\"test_servers\"]"},{"line_number":101,"context_line":"    _test_sockets \u003d _test_context[\"test_sockets\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_c2591937","line":98,"in_reply_to":"7aa08908_2f50d3d3","updated":"2016-06-13 14:36:24.000000000","message":"do_setup is called with a different object_server from test_mem_server.py so we need to pass the arg.\n\nhttps://github.com/openstack/swift/blob/feature/crypto/test/unit/proxy/test_mem_server.py#L25","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"0ef0e4195fbeb014132db61e86dc3bfb979a7f3a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    global _test_context, _testdir, _test_servers, _test_sockets, \\"},{"line_number":96,"context_line":"        _test_POLICIES"},{"line_number":97,"context_line":"    monkey_patch_mimetools()"},{"line_number":98,"context_line":"    _test_context \u003d setup_servers(object_server)"},{"line_number":99,"context_line":"    _testdir \u003d _test_context[\"testdir\"]"},{"line_number":100,"context_line":"    _test_servers \u003d _test_context[\"test_servers\"]"},{"line_number":101,"context_line":"    _test_sockets \u003d _test_context[\"test_sockets\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_2159db35","line":98,"in_reply_to":"7aa08908_c2591937","updated":"2016-06-14 05:49:02.000000000","message":"Ah my. test_mem_server always stands up in front of me :,(\nOK, let\u0027s leave this as is.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"54591ff933d460eab46a37d75c8ef791df8dfe83","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    _testdir \u003d _test_context[\"testdir\"]"},{"line_number":100,"context_line":"    _test_servers \u003d _test_context[\"test_servers\"]"},{"line_number":101,"context_line":"    _test_sockets \u003d _test_context[\"test_sockets\"]"},{"line_number":102,"context_line":"    _test_POLICIES \u003d _test_context[\"test_POLICIES\"]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def unpatch_policies(f):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_2f46134f","line":102,"updated":"2016-06-13 10:25:30.000000000","message":"Alright, all of the servers\u0027s info for test_proxy will be provided by setup_servers.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1c38a2f2cdb03d5736bbe4699f83dccea5f0c817","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    _testdir \u003d _test_context[\"testdir\"]"},{"line_number":100,"context_line":"    _test_servers \u003d _test_context[\"test_servers\"]"},{"line_number":101,"context_line":"    _test_sockets \u003d _test_context[\"test_sockets\"]"},{"line_number":102,"context_line":"    _test_POLICIES \u003d _test_context[\"test_POLICIES\"]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def unpatch_policies(f):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_a2ea0d0d","line":102,"in_reply_to":"7aa08908_2f46134f","updated":"2016-06-13 14:36:24.000000000","message":"Yes. Here I just map the _test_context values to this module\u0027s globals to avoid lots of churn in the test code.","commit_id":"cc5ae0266eab841fdbe7ff71699a3493c69d4636"}]}
