)]}'
{"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b80b0164d8d6c77c953c83579dd3684737f07629","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        query \u003d {} if version_id is None else {\u0027version-id\u0027: version_id}"},{"line_number":93,"context_line":"        if version_id not in (\u0027null\u0027, None):"},{"line_number":94,"context_line":"            container_info \u003d req.get_container_info(self.app)"},{"line_number":95,"context_line":"            if not container_info.get("},{"line_number":96,"context_line":"                    \u0027sysmeta\u0027, {}).get(\u0027versions-container\u0027, \u0027\u0027):"},{"line_number":97,"context_line":"                # Versioning has never been enabled"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_43ea570e","line":94,"updated":"2020-06-05 22:19:02.000000000","message":"well it\u0027s an extra check, but it\u0027s probably cached right?!","commit_id":"1af995f0e81994671583ce0fff4135164be11b6a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b80b0164d8d6c77c953c83579dd3684737f07629","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            if not container_info.get("},{"line_number":96,"context_line":"                    \u0027sysmeta\u0027, {}).get(\u0027versions-container\u0027, \u0027\u0027):"},{"line_number":97,"context_line":"                # Versioning has never been enabled"},{"line_number":98,"context_line":"                raise NoSuchVersion(object_name, version_id)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_e3b72b20","line":98,"updated":"2020-06-05 22:19:02.000000000","message":"Ok, I think this is the right error message:\n\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one$ aws s3api get-object --bucket test.clayg.info --key README.md --profile clayg killme.out --version-id \"oi1YxBCnzt_z7ioBQAucPNgmv8KWRtAn\"\n\nAn error occurred (NoSuchVersion) when calling the GetObject operation: The specified version does not exist.","commit_id":"1af995f0e81994671583ce0fff4135164be11b6a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b80b0164d8d6c77c953c83579dd3684737f07629","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                # Versioning has never been enabled"},{"line_number":98,"context_line":"                raise NoSuchVersion(object_name, version_id)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":103,"context_line":"            resp.app_iter \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_d18914ca","line":100,"updated":"2020-06-05 22:19:02.000000000","message":"I don\u0027t know if you\u0027d already thought this through and ruled it out; but in an attempt to implement this as EAFP instead of LBYL:\n\ndiff --git a/swift/common/middleware/s3api/controllers/obj.py b/swift/common/middleware/s3api/controllers/obj.py\nindex 293b14702..6e04e1e8a 100644\n--- a/swift/common/middleware/s3api/controllers/obj.py\n+++ b/swift/common/middleware/s3api/controllers/obj.py\n@@ -21,13 +21,14 @@ from swift.common.swob import Range, content_range_header_value, \\\n     normalize_etag\n from swift.common.utils import public, list_from_csv, get_swift_info\n \n+from swift.common.middleware.s3api.exception import BadSwiftRequest\n from swift.common.middleware.versioned_writes.object_versioning import \\\n     DELETE_MARKER_CONTENT_TYPE\n from swift.common.middleware.s3api.utils import S3Timestamp, sysmeta_header\n from swift.common.middleware.s3api.controllers.base import Controller\n from swift.common.middleware.s3api.s3response import S3NotImplemented, \\\n     InvalidRange, NoSuchKey, InvalidArgument, HTTPNoContent, \\\n-    PreconditionFailed\n+    PreconditionFailed, NoSuchVersion\n \n \n class ObjectController(Controller):\n@@ -89,7 +90,15 @@ class ObjectController(Controller):\n                 \u0027object_versioning\u0027 not in get_swift_info():\n             raise S3NotImplemented()\n         query \u003d {} if version_id is None else {\u0027version-id\u0027: version_id}\n-        resp \u003d req.get_response(self.app, query\u003dquery)\n+        try:\n+            resp \u003d req.get_response(self.app, query\u003dquery)\n+        except BadSwiftRequest as e:\n+            msg \u003d str(e)\n+            self.logger.debug(\u0027BadSwiftRequest %s %r %r\u0027 % (msg, e, dir(e)))\n+            if \u0027version-aware operations require that the \u0027 \\\n+                    \u0027container is versioned\u0027 in msg:\n+                raise NoSuchVersion(object_name, version_id)\n+            raise\n \n         if req.method \u003d\u003d \u0027HEAD\u0027:\n             resp.app_iter \u003d None\n\n\nI discovered there\u0027s a context problem when this request is a HEAD we don\u0027t have a body error message to say if the problem is versions or not - i guess the same was gunna hold for DELETE too","commit_id":"1af995f0e81994671583ce0fff4135164be11b6a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b80b0164d8d6c77c953c83579dd3684737f07629","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        if version_id not in (\u0027null\u0027, None):"},{"line_number":206,"context_line":"            container_info \u003d req.get_container_info(self.app)"},{"line_number":207,"context_line":"            if not container_info.get("},{"line_number":208,"context_line":"                    \u0027sysmeta\u0027, {}).get(\u0027versions-container\u0027, \u0027\u0027):"},{"line_number":209,"context_line":"                # Versioning has never been enabled"},{"line_number":210,"context_line":"                return HTTPNoContent(headers\u003d{\u0027x-amz-version-id\u0027: version_id})"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff570b3c_a390934f","line":208,"updated":"2020-06-05 22:19:02.000000000","message":"I don\u0027t get why we are checking the versions-container instead of versions-enabled\n\nas best i can tell it doesn\u0027t matter\n\nhttps://review.opendev.org/#/c/722552/","commit_id":"1af995f0e81994671583ce0fff4135164be11b6a"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3634f6b991ff130a64571aea838e8989fdb61b2a","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"    def test_object_DELETE_current_version_id(self):"},{"line_number":1151,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027,"},{"line_number":1152,"context_line":"                            swob.HTTPNoContent, {"},{"line_number":1153,"context_line":"                                SYSMETA_VERSIONS_CONT: \u0027\\x00versions\\x00bucket\u0027,"},{"line_number":1154,"context_line":"                                SYSMETA_VERSIONS_ENABLED: True},"},{"line_number":1155,"context_line":"                            None)"},{"line_number":1156,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f493fa4_b20338b8","line":1153,"updated":"2020-04-25 00:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"911d2a1ea50868f55589a54fe14b54ab3671ee4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3634f6b991ff130a64571aea838e8989fdb61b2a","unresolved":false,"context_lines":[{"line_number":1218,"context_line":"    def test_object_DELETE_current_version_id_is_delete_marker(self):"},{"line_number":1219,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027,"},{"line_number":1220,"context_line":"                            swob.HTTPNoContent, {"},{"line_number":1221,"context_line":"                                SYSMETA_VERSIONS_CONT: \u0027\\x00versions\\x00bucket\u0027,"},{"line_number":1222,"context_line":"                                SYSMETA_VERSIONS_ENABLED: True},"},{"line_number":1223,"context_line":"                            None)"},{"line_number":1224,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f493fa4_92fefcab","line":1221,"updated":"2020-04-25 00:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"911d2a1ea50868f55589a54fe14b54ab3671ee4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3634f6b991ff130a64571aea838e8989fdb61b2a","unresolved":false,"context_lines":[{"line_number":1253,"context_line":"    def test_object_DELETE_current_version_id_is_missing(self):"},{"line_number":1254,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027,"},{"line_number":1255,"context_line":"                            swob.HTTPNoContent, {"},{"line_number":1256,"context_line":"                                SYSMETA_VERSIONS_CONT: \u0027\\x00versions\\x00bucket\u0027,"},{"line_number":1257,"context_line":"                                SYSMETA_VERSIONS_ENABLED: True},"},{"line_number":1258,"context_line":"                            None)"},{"line_number":1259,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f493fa4_f22e6041","line":1256,"updated":"2020-04-25 00:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"911d2a1ea50868f55589a54fe14b54ab3671ee4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3634f6b991ff130a64571aea838e8989fdb61b2a","unresolved":false,"context_lines":[{"line_number":1302,"context_line":"    def test_object_DELETE_current_version_id_GET_error(self):"},{"line_number":1303,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027,"},{"line_number":1304,"context_line":"                            swob.HTTPNoContent, {"},{"line_number":1305,"context_line":"                                SYSMETA_VERSIONS_CONT: \u0027\\x00versions\\x00bucket\u0027,"},{"line_number":1306,"context_line":"                                SYSMETA_VERSIONS_ENABLED: True},"},{"line_number":1307,"context_line":"                            None)"},{"line_number":1308,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f493fa4_d231a4a4","line":1305,"updated":"2020-04-25 00:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"911d2a1ea50868f55589a54fe14b54ab3671ee4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3634f6b991ff130a64571aea838e8989fdb61b2a","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"    def test_object_DELETE_current_version_id_PUT_error(self):"},{"line_number":1333,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027,"},{"line_number":1334,"context_line":"                            swob.HTTPNoContent, {"},{"line_number":1335,"context_line":"                                SYSMETA_VERSIONS_CONT: \u0027\\x00versions\\x00bucket\u0027,"},{"line_number":1336,"context_line":"                                SYSMETA_VERSIONS_ENABLED: True},"},{"line_number":1337,"context_line":"                            None)"},{"line_number":1338,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f493fa4_3229e837","line":1335,"updated":"2020-04-25 00:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"911d2a1ea50868f55589a54fe14b54ab3671ee4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3634f6b991ff130a64571aea838e8989fdb61b2a","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"                            swob.HTTPNoContent, resp_headers, None)"},{"line_number":1404,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027,"},{"line_number":1405,"context_line":"                            swob.HTTPNoContent, {"},{"line_number":1406,"context_line":"                                SYSMETA_VERSIONS_CONT: \u0027\\x00versions\\x00bucket\u0027,"},{"line_number":1407,"context_line":"                                SYSMETA_VERSIONS_ENABLED: True},"},{"line_number":1408,"context_line":"                            None)"},{"line_number":1409,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/\\x00versions\\x00bucket\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f493fa4_122cac45","line":1406,"updated":"2020-04-25 00:49:21.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"911d2a1ea50868f55589a54fe14b54ab3671ee4b"}]}
