)]}'
{".zuul.yaml":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"2628b248aa081b7471c73eda19bff5471ac13bf2","unresolved":false,"context_lines":[{"line_number":106,"context_line":"      tox_envlist: func-domain-remap-staticweb"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"- job:"},{"line_number":109,"context_line":"    name: swift-tox-func-s3api"},{"line_number":110,"context_line":"    parent: swift-tox-base"},{"line_number":111,"context_line":"    description: |"},{"line_number":112,"context_line":"      Run functional tests for swift under cPython version 2.7."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9f6a8fd7_d3e7daab","line":109,"range":{"start_line":109,"start_character":10,"end_line":109,"end_character":30},"updated":"2018-04-20 19:42:25.000000000","message":"I\u0027m hesitant to add yet another func test. I\u0027m leaning more towards having s3api enabled by default (at least for func testing) that way we would get s3api and encryption testing together for example...","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":106,"context_line":"      tox_envlist: func-domain-remap-staticweb"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"- job:"},{"line_number":109,"context_line":"    name: swift-tox-func-s3api"},{"line_number":110,"context_line":"    parent: swift-tox-base"},{"line_number":111,"context_line":"    description: |"},{"line_number":112,"context_line":"      Run functional tests for swift under cPython version 2.7."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"9f6a8fd7_4bdae977","line":109,"range":{"start_line":109,"start_character":10,"end_line":109,"end_character":30},"in_reply_to":"9f6a8fd7_d3e7daab","updated":"2018-04-25 07:33:40.000000000","message":"See my attempts at devstack [1]. The difficulty to make it by default *FOR NOW* is devstack gate will have old swift3 in the pipeline. Then swift3 and s3api will be in the testing pipeline (and some wrong configuration at the pipeline oder should be fixed in devstack too), then fails a bunch of functional tests on the gate.\n\nI think the reasonable steps are:\n\n1. merge this as optional\n2. change devstack to use s3api instead of swift3\n3. make s3api as default\n\nthat\u0027s my opinion.\n\n1: https://review.openstack.org/#/c/548938/2/lib/swift","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"/COMMIT_MSG":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Import swift3 into swift repo as s3api middleware"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This attempts to import openstack/swift3 package into swift upstream"},{"line_number":10,"context_line":"repository, namespace. This is almost simple porting except folloing items."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"1. Rename swift3 namespace to swift.common.middleware.s3api"},{"line_number":13,"context_line":"1.1 Rename also some conflicted class names (e.g. Request/Response)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9f6a8fd7_e35542fb","line":10,"range":{"start_line":10,"start_character":60,"end_line":10,"end_character":68},"updated":"2018-04-24 09:57:25.000000000","message":"nit: following","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Import swift3 into swift repo as s3api middleware"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This attempts to import openstack/swift3 package into swift upstream"},{"line_number":10,"context_line":"repository, namespace. This is almost simple porting except folloing items."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"1. Rename swift3 namespace to swift.common.middleware.s3api"},{"line_number":13,"context_line":"1.1 Rename also some conflicted class names (e.g. Request/Response)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9f6a8fd7_cb7b5989","line":10,"range":{"start_line":10,"start_character":60,"end_line":10,"end_character":68},"in_reply_to":"9f6a8fd7_e35542fb","updated":"2018-04-25 07:33:40.000000000","message":"Done","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"AUTHORS":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a837fdcbc7607cc760ddad4024a907c3dc40fd29","unresolved":false,"context_lines":[{"line_number":72,"context_line":"Brian Reitz (brian.reitz@oracle.com)"},{"line_number":73,"context_line":"Bryan Keller (kellerbr@us.ibm.com)"},{"line_number":74,"context_line":"Béla Vancsics (vancsics@inf.u-szeged.hu)"},{"line_number":75,"context_line":"Виль Суркин (vills@vills-pro.local)"},{"line_number":76,"context_line":"Caleb Tennis (caleb.tennis@gmail.com)"},{"line_number":77,"context_line":"Cao Xuan Hoang (hoangcx@vn.fujitsu.com)"},{"line_number":78,"context_line":"Carlos Cavanna (ccavanna@ca.ibm.com)"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_d4f45bf3","line":75,"updated":"2018-04-25 05:01:44.000000000","message":"1. The domain does not exist (anymore?). In any case, this is obviously a duplicate of Mr. Surkin\u0027s entry below @vills.me.\n2. Names in Cyrillic are too much. I can see a case for grandfathering Latin-1, but this is no different from putting kanji, Arabic, or Hebrew in. If it weren\u0027t spelled using crazy letters, it would be easier for you to see that it was duplicated.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":72,"context_line":"Brian Reitz (brian.reitz@oracle.com)"},{"line_number":73,"context_line":"Bryan Keller (kellerbr@us.ibm.com)"},{"line_number":74,"context_line":"Béla Vancsics (vancsics@inf.u-szeged.hu)"},{"line_number":75,"context_line":"Виль Суркин (vills@vills-pro.local)"},{"line_number":76,"context_line":"Caleb Tennis (caleb.tennis@gmail.com)"},{"line_number":77,"context_line":"Cao Xuan Hoang (hoangcx@vn.fujitsu.com)"},{"line_number":78,"context_line":"Carlos Cavanna (ccavanna@ca.ibm.com)"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_0b4e3137","line":75,"in_reply_to":"9f6a8fd7_d4f45bf3","updated":"2018-04-25 07:33:40.000000000","message":"OIC. sorry, i didn\u0027t notice it. it\u0027s just ported from swift3\u0027s AUTHORS file...\n\nI\u0027m no sure with this but John said \"don\u0027t worry about AUTHORS file being perfect in the s3 patch. I\u0027ll clean it up anyway on a release\" in IRC today (Apr 25 in jST) so... would we leave this as it is, maybe??","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"bindep.txt":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9c606a8f95a2d7e1249c9fb4e3d3d88d30de013d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"libxml2-dev [platform:dpkg]"},{"line_number":14,"context_line":"libxml2-devel [platform:rpm]"},{"line_number":15,"context_line":"libxslt-devel [platform:rpm]"},{"line_number":16,"context_line":"libxslt1-dev [platform:dpkg]"},{"line_number":17,"context_line":"memcached"},{"line_number":18,"context_line":"python-dev [platform:dpkg]"},{"line_number":19,"context_line":"python-devel [platform:rpm]"}],"source_content_type":"text/plain","patch_set":5,"id":"9f6a8fd7_dc78e6c4","line":16,"updated":"2018-04-26 07:10:34.000000000","message":"Cool, yup, this works in OpenSUSE as well. Nice","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"}],"doc/s3api/conf/ceph-s3.conf.in":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"21f4f1f1ba340668c48d4fedbcaddc8135c97c34","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9f6a8fd7_de33dff5","updated":"2018-04-27 08:31:14.000000000","message":"Ah... this might be unnecessary for now.","commit_id":"636b922f3b2882f7dd6c656983d7862b274dcf98"}],"doc/s3api/conf/object-server.conf.in":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"21f4f1f1ba340668c48d4fedbcaddc8135c97c34","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9f6a8fd7_be506b0c","updated":"2018-04-27 08:31:14.000000000","message":"This is too. because this was used for functional test in swift3","commit_id":"636b922f3b2882f7dd6c656983d7862b274dcf98"}],"doc/source/middleware.rst":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"2628b248aa081b7471c73eda19bff5471ac13bf2","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":".. _s3api:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Amazon S3 Api"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":".. automodule:: swift.common.middleware.s3api.s3api"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f6a8fd7_d39cba0f","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":6},"updated":"2018-04-20 19:42:25.000000000","message":"nit: I\u0027d call it \u0027AWS S3 API\u0027","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":".. _s3api:"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Amazon S3 Api"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":".. automodule:: swift.common.middleware.s3api.s3api"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f6a8fd7_ab62a5ac","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":6},"in_reply_to":"9f6a8fd7_d39cba0f","updated":"2018-04-25 07:33:40.000000000","message":"Done","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Amazon S3 Api"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":".. automodule:: swift.common.middleware.s3api.s3api"},{"line_number":20,"context_line":"    :members:"},{"line_number":21,"context_line":"    :show-inheritance:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f6a8fd7_a358aa87","line":18,"updated":"2018-04-24 09:57:25.000000000","message":"The module list lacks \"swift.common.middleware.s3api.utils\".","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Amazon S3 Api"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":".. automodule:: swift.common.middleware.s3api.s3api"},{"line_number":20,"context_line":"    :members:"},{"line_number":21,"context_line":"    :show-inheritance:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f6a8fd7_eb6bbd81","line":18,"in_reply_to":"9f6a8fd7_a358aa87","updated":"2018-04-25 07:33:40.000000000","message":"Done","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"etc/object-server.conf-sample":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"2628b248aa081b7471c73eda19bff5471ac13bf2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# Comma separated list of headers that can be set in metadata on an object."},{"line_number":121,"context_line":"# This list is in addition to X-Object-Meta-* headers and cannot include"},{"line_number":122,"context_line":"# Content-Type, etag, Content-Length, or deleted"},{"line_number":123,"context_line":"# Note that you may add some extra headers for better S3 compatibility, they are:"},{"line_number":124,"context_line":"# Cache-Control, Content-Language, Expires, and X-Robots-Tag"},{"line_number":125,"context_line":"# allowed_headers \u003d Content-Disposition, Content-Encoding, X-Delete-At, X-Object-Manifest, X-Static-Large-Object"},{"line_number":126,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_738daed1","line":123,"range":{"start_line":123,"start_character":12,"end_line":123,"end_character":23},"updated":"2018-04-20 19:42:25.000000000","message":"you may add is a bit vague, plus I got the impression that if I don\u0027t add it then func tests don\u0027t pass. Are these required? If they are we should just add it by default and say so....","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a837fdcbc7607cc760ddad4024a907c3dc40fd29","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# Comma separated list of headers that can be set in metadata on an object."},{"line_number":121,"context_line":"# This list is in addition to X-Object-Meta-* headers and cannot include"},{"line_number":122,"context_line":"# Content-Type, etag, Content-Length, or deleted"},{"line_number":123,"context_line":"# Note that you may add some extra headers for better S3 compatibility, they are:"},{"line_number":124,"context_line":"# Cache-Control, Content-Language, Expires, and X-Robots-Tag"},{"line_number":125,"context_line":"# allowed_headers \u003d Content-Disposition, Content-Encoding, X-Delete-At, X-Object-Manifest, X-Static-Large-Object"},{"line_number":126,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_8f39eed7","line":123,"range":{"start_line":123,"start_character":12,"end_line":123,"end_character":23},"in_reply_to":"9f6a8fd7_738daed1","updated":"2018-04-25 05:01:44.000000000","message":"I guess the author implies that these headers are not needed if S3 compatibility is not enabled. And if it is enabled, many applications only use a small subset of S3. So, why would they care about X-Robots-Tag :-)","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# Comma separated list of headers that can be set in metadata on an object."},{"line_number":121,"context_line":"# This list is in addition to X-Object-Meta-* headers and cannot include"},{"line_number":122,"context_line":"# Content-Type, etag, Content-Length, or deleted"},{"line_number":123,"context_line":"# Note that you may add some extra headers for better S3 compatibility, they are:"},{"line_number":124,"context_line":"# Cache-Control, Content-Language, Expires, and X-Robots-Tag"},{"line_number":125,"context_line":"# allowed_headers \u003d Content-Disposition, Content-Encoding, X-Delete-At, X-Object-Manifest, X-Static-Large-Object"},{"line_number":126,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_eb75fd32","line":123,"range":{"start_line":123,"start_character":12,"end_line":123,"end_character":23},"in_reply_to":"9f6a8fd7_8f39eed7","updated":"2018-04-25 07:33:40.000000000","message":"As Pete said, it\u0027s needed for a few subset of S3 so that if we want to pass all functional tests as the best compatibility, users should add those headers to here even Swift doesn\u0027t requires the setting.\n\nI think this is related to \"should we have s3api by default?\" question. Once we have the s3api by default, absolutely we should have those by default in object-server but the s3api is still optional for now so I leave the change later than s3api got merged into the master.\n\nThough you can see my proof of hesitation in the history of feature/s3api (e.g. [1]) :P\n\n1: https://github.com/openstack/swift/commit/df26aa72fd3afc9e449f8d09044184ab8f68aad6","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"2628b248aa081b7471c73eda19bff5471ac13bf2","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"# s3api setup:"},{"line_number":449,"context_line":"#"},{"line_number":450,"context_line":"# With either tempauth or your custom auth:"},{"line_number":451,"context_line":"# - Put s3api just before your auth filter(s) in the pipeline"},{"line_number":452,"context_line":"# With keystone:"},{"line_number":453,"context_line":"# - Put s3api and s3token before keystoneauth in the pipeline"},{"line_number":454,"context_line":"#"},{"line_number":455,"context_line":"# Swift has no concept of the S3\u0027s resource owner; the resources"},{"line_number":456,"context_line":"# (i.e. containers and objects) created via the Swift API have no owner"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_6e72a54b","line":453,"range":{"start_line":450,"start_character":2,"end_line":453,"end_character":61},"updated":"2018-04-20 19:42:25.000000000","message":"this info should make it to the docs in a follow-on patch","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"# s3api setup:"},{"line_number":449,"context_line":"#"},{"line_number":450,"context_line":"# With either tempauth or your custom auth:"},{"line_number":451,"context_line":"# - Put s3api just before your auth filter(s) in the pipeline"},{"line_number":452,"context_line":"# With keystone:"},{"line_number":453,"context_line":"# - Put s3api and s3token before keystoneauth in the pipeline"},{"line_number":454,"context_line":"#"},{"line_number":455,"context_line":"# Swift has no concept of the S3\u0027s resource owner; the resources"},{"line_number":456,"context_line":"# (i.e. containers and objects) created via the Swift API have no owner"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"9f6a8fd7_ab7b85f2","line":453,"range":{"start_line":450,"start_character":2,"end_line":453,"end_character":61},"in_reply_to":"9f6a8fd7_6e72a54b","updated":"2018-04-25 07:33:40.000000000","message":"Sorry, I may be missing your context.\n\nDo you mean that the info should be in the docs in swift.common.middleware.s3api.s3api.py (that is basic file included to the docs)?\n\nCurrently, I don\u0027t plan to push a docs-specific patch before this patch landed so any requests to be add into the docs should be discussed here...\n\n^^^^^ is because John wants to make it within a patch to get merged to the master.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/acl_handlers.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            self.obj \u003d org_obj"},{"line_number":103,"context_line":"            self.headers \u003d org_headers"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def handle_acl(self, app, method, container\u003dNone, obj\u003dNone, headers\u003dNone):"},{"line_number":106,"context_line":"        method \u003d method or self.method"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        with self.request_with(container, obj, headers):"},{"line_number":109,"context_line":"            if hasattr(self, method):"},{"line_number":110,"context_line":"                return getattr(self, method)(app)"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                return self._handle_acl(app, method)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _handle_acl(self, app, sw_method, container\u003dNone, obj\u003dNone,"},{"line_number":115,"context_line":"                    permission\u003dNone, headers\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_e9e521dd","line":112,"range":{"start_line":105,"start_character":0,"end_line":112,"end_character":52},"updated":"2018-04-24 09:57:25.000000000","message":"This method\u0027s arguments and implementation are changed from the original swift3.acl_handlers.py.\nI\u0027m confused because the change looks like a kind of refactoring.\nIs this change needed for s3api import?","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            self.obj \u003d org_obj"},{"line_number":103,"context_line":"            self.headers \u003d org_headers"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def handle_acl(self, app, method, container\u003dNone, obj\u003dNone, headers\u003dNone):"},{"line_number":106,"context_line":"        method \u003d method or self.method"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        with self.request_with(container, obj, headers):"},{"line_number":109,"context_line":"            if hasattr(self, method):"},{"line_number":110,"context_line":"                return getattr(self, method)(app)"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                return self._handle_acl(app, method)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _handle_acl(self, app, sw_method, container\u003dNone, obj\u003dNone,"},{"line_number":115,"context_line":"                    permission\u003dNone, headers\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_abc065e2","line":112,"range":{"start_line":105,"start_character":0,"end_line":112,"end_character":52},"in_reply_to":"9f6a8fd7_e9e521dd","updated":"2018-04-25 07:33:40.000000000","message":"That is intended. You can check [1] that is the commit.\nThe reason may be a little complex...\n\n1. I want to avoid global LOGGER instance in s3api word\n2. so I changed s3api to set s3api middleware\u0027s logger into acl_handler (i.e. this module) at init, then hold the original container, obj, headers info in the acl_handler.\n3. however, each acl handling is designed to assert the matches of (original request and the subrequest called inside s3api)\n\nHence the magic of request_with context manager resolves the design as possible instead of changing a lot of caller/callee relationship in s3api modules.\n\nIf we could do more brand-new refactor in the future around acl, it might be nice but imo it\u0027s not now.\n\n1: https://github.com/openstack/swift/commit/9f2763293ddbc5ba885eb791cb54e888b180adf2","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":360,"context_line":"    \"\"\""},{"line_number":361,"context_line":"    PartAclHandler: Handler for PartController"},{"line_number":362,"context_line":"    \"\"\""},{"line_number":363,"context_line":"    def __init__(self, req, logger):"},{"line_number":364,"context_line":"        # pylint: disable-msg\u003dE1003"},{"line_number":365,"context_line":"        super(MultiUploadAclHandler, self).__init__(req, logger)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def HEAD(self, app):"},{"line_number":368,"context_line":"        if self.container.endswith(MULTIUPLOAD_SUFFIX):"},{"line_number":369,"context_line":"            # For _check_upload_info"},{"line_number":370,"context_line":"            container \u003d self.container[:-len(MULTIUPLOAD_SUFFIX)]"},{"line_number":371,"context_line":"            self._handle_acl(app, \u0027HEAD\u0027, container, \u0027\u0027)"},{"line_number":372,"context_line":"        else:"},{"line_number":373,"context_line":"            # For check_copy_source"},{"line_number":374,"context_line":"            return self._handle_acl(app, \u0027HEAD\u0027, self.container, self.obj)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class UploadsAclHandler(MultiUploadAclHandler):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_c9861dba","line":374,"range":{"start_line":363,"start_character":0,"end_line":374,"end_character":74},"updated":"2018-04-24 09:57:25.000000000","message":"Same as above.\nThis class\u0027s implementation is changed from the original swift3/acl_handlers.py\nIs the change refactoring?","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":360,"context_line":"    \"\"\""},{"line_number":361,"context_line":"    PartAclHandler: Handler for PartController"},{"line_number":362,"context_line":"    \"\"\""},{"line_number":363,"context_line":"    def __init__(self, req, logger):"},{"line_number":364,"context_line":"        # pylint: disable-msg\u003dE1003"},{"line_number":365,"context_line":"        super(MultiUploadAclHandler, self).__init__(req, logger)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def HEAD(self, app):"},{"line_number":368,"context_line":"        if self.container.endswith(MULTIUPLOAD_SUFFIX):"},{"line_number":369,"context_line":"            # For _check_upload_info"},{"line_number":370,"context_line":"            container \u003d self.container[:-len(MULTIUPLOAD_SUFFIX)]"},{"line_number":371,"context_line":"            self._handle_acl(app, \u0027HEAD\u0027, container, \u0027\u0027)"},{"line_number":372,"context_line":"        else:"},{"line_number":373,"context_line":"            # For check_copy_source"},{"line_number":374,"context_line":"            return self._handle_acl(app, \u0027HEAD\u0027, self.container, self.obj)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class UploadsAclHandler(MultiUploadAclHandler):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_0e163f4a","line":374,"range":{"start_line":363,"start_character":0,"end_line":374,"end_character":74},"in_reply_to":"9f6a8fd7_c9861dba","updated":"2018-04-25 07:33:40.000000000","message":"Same reason with above.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        self._handle_acl(app, \u0027GET\u0027, self.container, \u0027\u0027)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def PUT(self, app):"},{"line_number":393,"context_line":"        if not self.acl_checked:"},{"line_number":394,"context_line":"            resp \u003d self._handle_acl(app, \u0027HEAD\u0027, obj\u003d\u0027\u0027)"},{"line_number":395,"context_line":"            req_acl \u003d ACL.from_headers(self.req.headers,"},{"line_number":396,"context_line":"                                       resp.bucket_acl.owner,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_69583155","line":393,"range":{"start_line":393,"start_character":8,"end_line":393,"end_character":32},"updated":"2018-04-24 09:57:25.000000000","message":"In the original swift3/acl_handlers.py, this if-clause is \"if not self.obj:\".\nWhy this check is changed?","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        self._handle_acl(app, \u0027GET\u0027, self.container, \u0027\u0027)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def PUT(self, app):"},{"line_number":393,"context_line":"        if not self.acl_checked:"},{"line_number":394,"context_line":"            resp \u003d self._handle_acl(app, \u0027HEAD\u0027, obj\u003d\u0027\u0027)"},{"line_number":395,"context_line":"            req_acl \u003d ACL.from_headers(self.req.headers,"},{"line_number":396,"context_line":"                                       resp.bucket_acl.owner,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_0e2f1f88","line":393,"range":{"start_line":393,"start_character":8,"end_line":393,"end_character":32},"in_reply_to":"9f6a8fd7_69583155","updated":"2018-04-25 07:33:40.000000000","message":"self.obj is not actually nice to handle the context. the intention of the if branch is whether acl is already checked or not. Just older swift3 check it with self.obj. Possibly \"if not self.obj\" can work and it may be a refactoring as you said.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":608,"context_line":"            exc_type, exc_value, exc_traceback \u003d sys.exc_info()"},{"line_number":609,"context_line":"            self.logger.error(e)"},{"line_number":610,"context_line":"            raise exc_type, exc_value, exc_traceback"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        # Check the size of each segment except the last and make sure they are"},{"line_number":613,"context_line":"        # all more than the minimum upload chunk size"},{"line_number":614,"context_line":"        for info in manifest[:-1]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_c4928457","line":611,"updated":"2018-04-24 09:57:25.000000000","message":"In the original swift3/controllers/multi_upload.py, zero-byte final segment is checked.\nBut in this patch the check is removed.\nIs this done on purpose?","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"cdda1ae580b32d24017ed0e7e4092748047f7147","unresolved":false,"context_lines":[{"line_number":608,"context_line":"            exc_type, exc_value, exc_traceback \u003d sys.exc_info()"},{"line_number":609,"context_line":"            self.logger.error(e)"},{"line_number":610,"context_line":"            raise exc_type, exc_value, exc_traceback"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        # Check the size of each segment except the last and make sure they are"},{"line_number":613,"context_line":"        # all more than the minimum upload chunk size"},{"line_number":614,"context_line":"        for info in manifest[:-1]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_5facdfeb","line":611,"in_reply_to":"9f6a8fd7_0e44ff45","updated":"2018-04-27 08:56:28.000000000","message":"I see :)","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":608,"context_line":"            exc_type, exc_value, exc_traceback \u003d sys.exc_info()"},{"line_number":609,"context_line":"            self.logger.error(e)"},{"line_number":610,"context_line":"            raise exc_type, exc_value, exc_traceback"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        # Check the size of each segment except the last and make sure they are"},{"line_number":613,"context_line":"        # all more than the minimum upload chunk size"},{"line_number":614,"context_line":"        for info in manifest[:-1]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_0e44ff45","line":611,"in_reply_to":"9f6a8fd7_c4928457","updated":"2018-04-25 07:33:40.000000000","message":"See https://github.com/openstack/swift/commit/0c41c91d55de1e4cfc09c00fa4968b0525694a96\n\nthe removed code is for backward compatibility for older swift. Because we will land to the newest swift master, the code won\u0027t be necessary.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/etree.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    try:"},{"line_number":61,"context_line":"        elem \u003d lxml.etree.fromstring(text, parser)"},{"line_number":62,"context_line":"    except lxml.etree.XMLSyntaxError as e:"},{"line_number":63,"context_line":"        if logger:"},{"line_number":64,"context_line":"            logger.debug(e)"},{"line_number":65,"context_line":"        raise XMLSyntaxError(e)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_e45a2881","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":18},"updated":"2018-04-24 09:57:25.000000000","message":"In original implementation, the exception is always logged because global LOGGER instance is used.\nBut in this patch, if the logger variable is not set, the exception is not logged.\nBecause some of s3api implementation (e.g. acl_handlers.py) calls the fromstring function without logger variable, logging behavior is changed from the original swift3 behavior.\n\nI think we should not change the logging behavior except the project name (\"swift3\" -\u003e \"s3api\")...","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"cdda1ae580b32d24017ed0e7e4092748047f7147","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    try:"},{"line_number":61,"context_line":"        elem \u003d lxml.etree.fromstring(text, parser)"},{"line_number":62,"context_line":"    except lxml.etree.XMLSyntaxError as e:"},{"line_number":63,"context_line":"        if logger:"},{"line_number":64,"context_line":"            logger.debug(e)"},{"line_number":65,"context_line":"        raise XMLSyntaxError(e)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_3f4d6b3d","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":18},"in_reply_to":"9f6a8fd7_4ef677d9","updated":"2018-04-27 08:56:28.000000000","message":"ok.\nI agree that debug-log can be optional and the error-log handling is correct one.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    try:"},{"line_number":61,"context_line":"        elem \u003d lxml.etree.fromstring(text, parser)"},{"line_number":62,"context_line":"    except lxml.etree.XMLSyntaxError as e:"},{"line_number":63,"context_line":"        if logger:"},{"line_number":64,"context_line":"            logger.debug(e)"},{"line_number":65,"context_line":"        raise XMLSyntaxError(e)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_4ef677d9","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":18},"in_reply_to":"9f6a8fd7_e45a2881","updated":"2018-04-25 07:33:40.000000000","message":"Hmm... it\u0027s discussed at [1]. Originally I wrote as of calling get_logger here but actually, sometimes it is not needed because almost of the logger calls will be as debug so i turned it as optional.\n\nBut looking at the original Tim\u0027s comment, Line 78-79 can be changed because the original swift3 calls it as an error but... I\u0027m still wondering if it\u0027s exactly required.\n\nThat is because the IOError should happen only when schema file doesn\u0027t exist so it would happen only in installation issue cases... ah, it should go an error log.\n\nOK, i\u0027ll fix ONLY that IOError case, because others are just for debugging. Is it reasonable for you?\n\n1: https://review.openstack.org/#/c/529268/4/swift/common/middleware/s3api/etree.py@61","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/exception.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class InvalidSubresource(S3Exception):"},{"line_number":34,"context_line":"    def __init__(self, resource, cause):"},{"line_number":35,"context_line":"        self.resourece \u003d resource"},{"line_number":36,"context_line":"        self.cause \u003d cause"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_04163c56","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":22},"updated":"2018-04-24 09:57:25.000000000","message":"nit: s/resourece/resource/","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class InvalidSubresource(S3Exception):"},{"line_number":34,"context_line":"    def __init__(self, resource, cause):"},{"line_number":35,"context_line":"        self.resourece \u003d resource"},{"line_number":36,"context_line":"        self.cause \u003d cause"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_ee1f4bb4","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":22},"in_reply_to":"9f6a8fd7_04163c56","updated":"2018-04-25 07:33:40.000000000","message":"Done","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class InvalidSubresource(S3Exception):"},{"line_number":34,"context_line":"    def __init__(self, resource, cause):"},{"line_number":35,"context_line":"        self.resourece \u003d resource"},{"line_number":36,"context_line":"        self.cause \u003d cause"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_e4122862","line":36,"range":{"start_line":34,"start_character":0,"end_line":36,"end_character":26},"updated":"2018-04-24 09:57:25.000000000","message":"In the original implementation swift3/exception.py, the code is only \"pass\".\nIn this patch, the constructor is overriden.\nI found the \"cause\" is used for logging.\nBut \"resource\" is not used.\n\nIs the variable \"resource\" needed?","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"cdda1ae580b32d24017ed0e7e4092748047f7147","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class InvalidSubresource(S3Exception):"},{"line_number":34,"context_line":"    def __init__(self, resource, cause):"},{"line_number":35,"context_line":"        self.resourece \u003d resource"},{"line_number":36,"context_line":"        self.cause \u003d cause"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_bfa3bbb1","line":36,"range":{"start_line":34,"start_character":0,"end_line":36,"end_character":26},"in_reply_to":"9f6a8fd7_aef2b36e","updated":"2018-04-27 08:56:28.000000000","message":"ok. The intention sounds good :)","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class InvalidSubresource(S3Exception):"},{"line_number":34,"context_line":"    def __init__(self, resource, cause):"},{"line_number":35,"context_line":"        self.resourece \u003d resource"},{"line_number":36,"context_line":"        self.cause \u003d cause"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_aef2b36e","line":36,"range":{"start_line":34,"start_character":0,"end_line":36,"end_character":26},"in_reply_to":"9f6a8fd7_e4122862","updated":"2018-04-25 07:33:40.000000000","message":"IDK. the resource might be needed.\n\nthe reason of 2 args is just the original code (in somewhere) calls with args that looks resource information. e.g. [1]. I\u0027m not sure if it\u0027s used or we lacks the usage in the swift3. Just my intention is keeping the arg, then add the new cause arg that is perfectly helpful in the migration work.\n\n1: https://github.com/openstack/swift3/blob/master/swift3/subresource.py#L125","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/s3api.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"2628b248aa081b7471c73eda19bff5471ac13bf2","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    pipeline \u003d proxy-logging cache s3api s3token keystoneauth bulk slo"},{"line_number":60,"context_line":"    proxy-logging proxy-server"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. note::"},{"line_number":63,"context_line":"    ``keystonemiddleware.authtoken`` can be located before/after s3api but"},{"line_number":64,"context_line":"    we recommend to put it before s3api because when authtoken is after s3api,"},{"line_number":65,"context_line":"    both authtoken and s3token will issue the acceptable token to keystone"},{"line_number":66,"context_line":"    (i.e. authenticate twice)."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Object-Server Setting"},{"line_number":69,"context_line":"^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_c24ce543","line":66,"range":{"start_line":62,"start_character":3,"end_line":66,"end_character":29},"updated":"2018-04-20 19:42:25.000000000","message":"I\u0027m not sure this is necessary, we should just tell users how to configure it. I noticed line 59 is missing authtoken, is it optional or not? My understanding has always been something like:\n\npipeline \u003d ... authtoken s3api s3token keystoneauth ...","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    pipeline \u003d proxy-logging cache s3api s3token keystoneauth bulk slo"},{"line_number":60,"context_line":"    proxy-logging proxy-server"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. note::"},{"line_number":63,"context_line":"    ``keystonemiddleware.authtoken`` can be located before/after s3api but"},{"line_number":64,"context_line":"    we recommend to put it before s3api because when authtoken is after s3api,"},{"line_number":65,"context_line":"    both authtoken and s3token will issue the acceptable token to keystone"},{"line_number":66,"context_line":"    (i.e. authenticate twice)."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"Object-Server Setting"},{"line_number":69,"context_line":"^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_0bedd1b5","line":66,"range":{"start_line":62,"start_character":3,"end_line":66,"end_character":29},"in_reply_to":"9f6a8fd7_c24ce543","updated":"2018-04-25 07:33:40.000000000","message":"It depends on what APIs a user wants. If an user wants ONLY S3 API, authtoken is optional (the user can remove it in the pipeline ) so the pipeline example above is designed to the use case.\n\nIf we assume like as \"This is Swift configuration so any users always like to use Swift API and then want to add s3api\". The default should include authtoken before s3api.\n\nThe reason of the complexity for this setting is that the desirable order has been changed in the swift3 history. The older swift3 should set \"s3api s3token authtoken keystonauth\" but Tim\u0027s great work[1] avoid the inefficiency, that requires authtoken after s3token, in the swift3 world.\n\nPerhaps, recommending as \"authtoken s3api s3token keystoneauth\" would be nice to have if we don\u0027t think of any historical reason and issues.\n\nHow do you think of?\n\n1:  https://github.com/openstack/swift3/commit/6ffcc294e3881ccc59ff5840ff1568e44d9da4f8","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/s3response.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        def is_swift3_sysmeta(sysmeta_key, server_type):"},{"line_number":92,"context_line":"            swift3_sysmeta_prefix \u003d ("},{"line_number":93,"context_line":"                \u0027x-%s-sysmeta-swift3\u0027 % server_type).lower()"},{"line_number":94,"context_line":"            if sysmeta_key.lower().startswith(swift3_sysmeta_prefix):"},{"line_number":95,"context_line":"                return True"},{"line_number":96,"context_line":"            return False"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        def is_s3api_sysmeta(sysmeta_key, server_type):"},{"line_number":99,"context_line":"            s3api_sysmeta_prefix \u003d sysmeta_prefix(_server_type).lower()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_782d58a6","line":96,"range":{"start_line":94,"start_character":12,"end_line":96,"end_character":24},"updated":"2018-04-24 09:57:25.000000000","message":"I think this function added in this patch.\nWhy not \"return sysmeta_key.lower().startswith(swift3_sysmeta_prefix)\" directly?","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        def is_swift3_sysmeta(sysmeta_key, server_type):"},{"line_number":92,"context_line":"            swift3_sysmeta_prefix \u003d ("},{"line_number":93,"context_line":"                \u0027x-%s-sysmeta-swift3\u0027 % server_type).lower()"},{"line_number":94,"context_line":"            if sysmeta_key.lower().startswith(swift3_sysmeta_prefix):"},{"line_number":95,"context_line":"                return True"},{"line_number":96,"context_line":"            return False"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        def is_s3api_sysmeta(sysmeta_key, server_type):"},{"line_number":99,"context_line":"            s3api_sysmeta_prefix \u003d sysmeta_prefix(_server_type).lower()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_ce6847f6","line":96,"range":{"start_line":94,"start_character":12,"end_line":96,"end_character":24},"in_reply_to":"9f6a8fd7_782d58a6","updated":"2018-04-25 07:33:40.000000000","message":"Good idea, Done.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"e15d4831b82cb7f9c30c79b508128a7baaf774f1","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        def is_s3api_sysmeta(sysmeta_key, server_type):"},{"line_number":99,"context_line":"            s3api_sysmeta_prefix \u003d sysmeta_prefix(_server_type).lower()"},{"line_number":100,"context_line":"            if sysmeta_key.lower().startswith(s3api_sysmeta_prefix):"},{"line_number":101,"context_line":"                return True"},{"line_number":102,"context_line":"            return False"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, val in self.headers.iteritems():"},{"line_number":105,"context_line":"            if is_sys_meta(\u0027object\u0027, key) or is_sys_meta(\u0027container\u0027, key):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_bbc8caa5","line":102,"range":{"start_line":100,"start_character":12,"end_line":102,"end_character":24},"updated":"2018-04-24 09:57:25.000000000","message":"Same as above.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"aa1cb0a7b66691043b97b8ae4d7b3139df07770f","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        def is_s3api_sysmeta(sysmeta_key, server_type):"},{"line_number":99,"context_line":"            s3api_sysmeta_prefix \u003d sysmeta_prefix(_server_type).lower()"},{"line_number":100,"context_line":"            if sysmeta_key.lower().startswith(s3api_sysmeta_prefix):"},{"line_number":101,"context_line":"                return True"},{"line_number":102,"context_line":"            return False"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, val in self.headers.iteritems():"},{"line_number":105,"context_line":"            if is_sys_meta(\u0027object\u0027, key) or is_sys_meta(\u0027container\u0027, key):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_8e6ecffd","line":102,"range":{"start_line":100,"start_character":12,"end_line":102,"end_character":24},"in_reply_to":"9f6a8fd7_bbc8caa5","updated":"2018-04-25 07:33:40.000000000","message":"ditto.","commit_id":"afe74c8c30fbd6bbeb83aec0d5b0266e18a88938"}],"swift/common/middleware/s3api/s3token.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"97b49abb201a553f03051477e48f6300ad05967b","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            conf.get(\u0027delay_auth_decision\u0027))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # where to find the auth service (we use this to validate tokens)"},{"line_number":132,"context_line":"        self._request_uri \u003d conf.get(\u0027auth_uri\u0027, \u0027\u0027).rstrip(\u0027/\u0027) + \u0027/s3tokens\u0027"},{"line_number":133,"context_line":"        parsed \u003d urllib.parse.urlsplit(self._request_uri)"},{"line_number":134,"context_line":"        if not parsed.scheme or not parsed.hostname:"},{"line_number":135,"context_line":"            raise ConfigFileError("}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_f84fdb31","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":78},"updated":"2018-04-27 05:43:08.000000000","message":"At this point in the Swift3 middleware, there is the support for not using auth_uri. It did contain a warning that it will be deprecated as it wasn\u0027t supported passed newton. I\u0027m assuming it\u0027s gone because it\u0027s now considered deprecated.\n\nThis is a new name so also a clean slate, so I\u0027m fine with it. But just wanted to be sure this was the case :)","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"16279622c67cd15222e6bf4dd260fefa7aabb362","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            conf.get(\u0027delay_auth_decision\u0027))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # where to find the auth service (we use this to validate tokens)"},{"line_number":132,"context_line":"        self._request_uri \u003d conf.get(\u0027auth_uri\u0027, \u0027\u0027).rstrip(\u0027/\u0027) + \u0027/s3tokens\u0027"},{"line_number":133,"context_line":"        parsed \u003d urllib.parse.urlsplit(self._request_uri)"},{"line_number":134,"context_line":"        if not parsed.scheme or not parsed.hostname:"},{"line_number":135,"context_line":"            raise ConfigFileError("}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_388473b1","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":78},"in_reply_to":"9f6a8fd7_f84fdb31","updated":"2018-04-27 06:53:44.000000000","message":"That is. The specific commit to the removal is at https://review.openstack.org/#/c/557526/","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"}],"swift/common/middleware/s3api/subresource.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9c606a8f95a2d7e1249c9fb4e3d3d88d30de013d","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from swift.common.utils import json"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from swift.common.middleware.s3api.etree import tostring"},{"line_number":49,"context_line":"from swift.common.middleware.s3api.s3response import InvalidArgument, \\"},{"line_number":50,"context_line":"    MalformedACLError, S3NotImplemented, InvalidRequest, AccessDenied"},{"line_number":51,"context_line":"from swift.common.middleware.s3api.etree import Element, SubElement"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_fa47ea1b","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":40},"updated":"2018-04-26 07:10:34.000000000","message":"Your already importing from etree below","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"16279622c67cd15222e6bf4dd260fefa7aabb362","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from swift.common.utils import json"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"from swift.common.middleware.s3api.etree import tostring"},{"line_number":49,"context_line":"from swift.common.middleware.s3api.s3response import InvalidArgument, \\"},{"line_number":50,"context_line":"    MalformedACLError, S3NotImplemented, InvalidRequest, AccessDenied"},{"line_number":51,"context_line":"from swift.common.middleware.s3api.etree import Element, SubElement"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_78bbcb71","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":40},"in_reply_to":"9f6a8fd7_fa47ea1b","updated":"2018-04-27 06:53:44.000000000","message":"Good eyes. This line was quickly added when I hit the pep8 failure in the older patch set. I\u0027ll fix the importing to merge to the line 51.","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"16279622c67cd15222e6bf4dd260fefa7aabb362","unresolved":false,"context_lines":[{"line_number":402,"context_line":"    root_tag \u003d \u0027AccessControlPolicy\u0027"},{"line_number":403,"context_line":"    max_xml_length \u003d 200 * 1024"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    def __init__(self, owner, grants\u003d[], s3_acl\u003dFalse, allow_no_owner\u003dFalse):"},{"line_number":406,"context_line":"        \"\"\""},{"line_number":407,"context_line":"        :param owner: Owner Class for ACL instance"},{"line_number":408,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_b81de374","line":405,"range":{"start_line":405,"start_character":37,"end_line":405,"end_character":39},"updated":"2018-04-27 06:53:44.000000000","message":"Oh no. We shouldn\u0027t set a list as a default arg in python. Will fix.","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9c606a8f95a2d7e1249c9fb4e3d3d88d30de013d","unresolved":false,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    def __init__(self, owner, grants\u003d[], s3_acl\u003dFalse, allow_no_owner\u003dFalse):"},{"line_number":406,"context_line":"        \"\"\""},{"line_number":407,"context_line":"        :param owner: Owner Class for ACL instance"},{"line_number":408,"context_line":"        \"\"\""},{"line_number":409,"context_line":"        self.owner \u003d owner"},{"line_number":410,"context_line":"        self.grants \u003d grants"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_5a30569f","line":407,"range":{"start_line":407,"start_character":8,"end_line":407,"end_character":50},"updated":"2018-04-26 07:10:34.000000000","message":"NIT: there are more params so they should be mentioned. But that can easily be a follow up, not a feature branch blocker.","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"16279622c67cd15222e6bf4dd260fefa7aabb362","unresolved":false,"context_lines":[{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    def __init__(self, owner, grants\u003d[], s3_acl\u003dFalse, allow_no_owner\u003dFalse):"},{"line_number":406,"context_line":"        \"\"\""},{"line_number":407,"context_line":"        :param owner: Owner Class for ACL instance"},{"line_number":408,"context_line":"        \"\"\""},{"line_number":409,"context_line":"        self.owner \u003d owner"},{"line_number":410,"context_line":"        self.grants \u003d grants"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f6a8fd7_f8a6fb53","line":407,"range":{"start_line":407,"start_character":8,"end_line":407,"end_character":50},"in_reply_to":"9f6a8fd7_5a30569f","updated":"2018-04-27 06:53:44.000000000","message":"oh, yeah. anyway I\u0027ll fix the docs because I\u0027m willing to make a new patch set to fix the importing issue above.","commit_id":"a282570ed52ac9469dde08662eaa7b39da329a9a"}],"swift/common/middleware/s3api/utils.py":[{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"cdda1ae580b32d24017ed0e7e4092748047f7147","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# Need for check_path_header"},{"line_number":24,"context_line":"from swift.common import utils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"MULTIUPLOAD_SUFFIX \u003d \u0027+segments\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f6a8fd7_d2043381","line":23,"range":{"start_line":23,"start_character":11,"end_line":23,"end_character":28},"updated":"2018-04-27 08:56:28.000000000","message":"Now, check_path_header is removed, isn\u0027t it?","commit_id":"636b922f3b2882f7dd6c656983d7862b274dcf98"}]}
