)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1e28656d919274d26457efc54e2a987c132d627d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2ab58b4e_63f347c9","updated":"2022-03-31 07:54:39.000000000","message":"WIP, there\u0027s no upstream backend support for this yet.","commit_id":"7881cc437f2d5b697bb23f02c4f64c8f52566680"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"256d370a_96630dca","updated":"2022-04-11 16:36:26.000000000","message":"this looks good; I think it should have some boto/s3api cross-compat tests","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6335c1e743c30d3af94ca730f877229acb9004","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"44872c68_c024e97f","updated":"2022-04-13 17:34:56.000000000","message":"still working on more tests","commit_id":"dce21bb3c5eb26619c9e0d566b5167505ef01db9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"181fd944_acaa1364","updated":"2022-04-25 18:46:27.000000000","message":"I\u0027d be content to have this running in prod.","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3dd80e3bff31f035a776c16756a9dd5419fe1cfb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d70c929a_eb787aa0","updated":"2022-04-26 04:43:15.000000000","message":"Needed to rebase this off another s3api patch that still hasn\u0027t landed so we could build for testing.","commit_id":"92f283ae6028d40d0349af2ebeb4cb7b45f87faa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"988c70c847816b91ad94866ce32b033576237f36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e30c3282_9d395396","updated":"2022-06-02 21:01:43.000000000","message":"recheck","commit_id":"07820047ae934285f3a889a937c570c086444a65"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":669,"context_line":"# inventories are allowed to be configured. The value should be a comma"},{"line_number":670,"context_line":"# separated list; any entry ending with \u0027*\u0027 will match any path starting with"},{"line_number":671,"context_line":"# that entry. The default allows all paths."},{"line_number":672,"context_line":"# s3_inventory_allowed_paths \u003d *"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"[filter:s3token]"},{"line_number":675,"context_line":"# s3token middleware authenticates with keystone using the s3 credentials"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"fc8eb7b3_c4cd616a","line":672,"updated":"2022-04-25 18:46:27.000000000","message":"Are these paths supposed to be quoted or anything? I\u0027m trying to think of how you would specify \"just this one container, which happens to have a star or a comma in it.\" I suppose the bucket naming rules help us, but what if the *account* is the one with the star or comma?\n\nDo we want this mainly for the sake of trialing, but once we have more confidence we expect operators to allow inventories cluster-wide? Or do you see a long-term utility to this ability to filter? Makes me think a bit of https://review.opendev.org/c/openstack/swift/+/126049, where we deprecated an account-list-in-config for sysmeta...","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"}],"swift/common/middleware/s3api/acl_handlers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":475,"context_line":"    {\u0027Permission\u0027: \u0027WRITE\u0027},"},{"line_number":476,"context_line":"    # Inventory"},{"line_number":477,"context_line":"    (\u0027DELETE\u0027, \u0027POST\u0027, \u0027container\u0027):"},{"line_number":478,"context_line":"    {\u0027Permission\u0027: \u0027WRITE\u0027},"},{"line_number":479,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":2,"id":"e2f37535_884dc209","line":478,"range":{"start_line":478,"start_character":20,"end_line":478,"end_character":25},"updated":"2022-04-25 18:46:27.000000000","message":"I think we may want OWNER here -- from https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html and https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\n\n\u003e To use this operation, you must have permissions to perform the s3:PutInventoryConfiguration action. The bucket owner has this permission by default and can grant this permission to others\n\nOTOH, the versioning stuff is also using WRITE... hmm :-/","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"}],"swift/common/middleware/s3api/controllers/inventory.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":82,"context_line":"                    \u0027Destination/S3BucketDestination/Format must be Parquet\u0027)"},{"line_number":83,"context_line":"            if conf.inventory_id !\u003d INVENTORY_ID:"},{"line_number":84,"context_line":"                errors.append("},{"line_number":85,"context_line":"                    \u0027Id must be 0\u0027)"},{"line_number":86,"context_line":"            if errors:"},{"line_number":87,"context_line":"                raise DocumentInvalid(\u0027\\n\u0027.join(errors))"},{"line_number":88,"context_line":"        return conf"}],"source_content_type":"text/x-python","patch_set":2,"id":"b312931c_18225284","line":85,"updated":"2022-04-11 16:36:26.000000000","message":"i\u0027d guess these limitations exist for compatibility with s3 - these are limitations of our proprietary implementation?","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                    \u0027Destination/S3BucketDestination/Format must be Parquet\u0027)"},{"line_number":83,"context_line":"            if conf.inventory_id !\u003d INVENTORY_ID:"},{"line_number":84,"context_line":"                errors.append("},{"line_number":85,"context_line":"                    \u0027Id must be 0\u0027)"},{"line_number":86,"context_line":"            if errors:"},{"line_number":87,"context_line":"                raise DocumentInvalid(\u0027\\n\u0027.join(errors))"},{"line_number":88,"context_line":"        return conf"}],"source_content_type":"text/x-python","patch_set":2,"id":"7d540cb8_4449d63d","line":85,"in_reply_to":"b312931c_18225284","updated":"2022-04-13 17:34:14.000000000","message":"yes - s3 api mandates that format and inventory ID are included in the XML request body, but our backend only supports specific values.","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                \u0027Inventory configuration is not supported for this bucket\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def check_req(self, req):"},{"line_number":162,"context_line":"        if not (req.conf.s3_inventory_enabled and req.is_bucket_request):"},{"line_number":163,"context_line":"            # Handle Object ACL"},{"line_number":164,"context_line":"            raise S3NotImplemented()"},{"line_number":165,"context_line":"        self.check_path(req)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7c90aa0f_694cbdca","line":162,"updated":"2022-04-11 16:36:26.000000000","message":"what does s3 do if you make a inventroy request to an object?!","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                \u0027Inventory configuration is not supported for this bucket\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def check_req(self, req):"},{"line_number":162,"context_line":"        if not (req.conf.s3_inventory_enabled and req.is_bucket_request):"},{"line_number":163,"context_line":"            # Handle Object ACL"},{"line_number":164,"context_line":"            raise S3NotImplemented()"},{"line_number":165,"context_line":"        self.check_path(req)"}],"source_content_type":"text/x-python","patch_set":2,"id":"de14a556_a9eadd43","line":162,"in_reply_to":"7c90aa0f_694cbdca","updated":"2022-04-13 17:34:14.000000000","message":"I\u0027m setting up to do some cross-compatibility testing, I\u0027ll check this one when I can","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":161,"context_line":"    def check_req(self, req):"},{"line_number":162,"context_line":"        if not (req.conf.s3_inventory_enabled and req.is_bucket_request):"},{"line_number":163,"context_line":"            # Handle Object ACL"},{"line_number":164,"context_line":"            raise S3NotImplemented()"},{"line_number":165,"context_line":"        self.check_path(req)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def config_from_sysmeta(self, req, inventory_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"cf4aaddd_4f28c5b1","line":164,"updated":"2022-04-11 16:36:26.000000000","message":"here\u0027s our 501","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def check_req(self, req):"},{"line_number":162,"context_line":"        if not (req.conf.s3_inventory_enabled and req.is_bucket_request):"},{"line_number":163,"context_line":"            # Handle Object ACL"},{"line_number":164,"context_line":"            raise S3NotImplemented()"},{"line_number":165,"context_line":"        self.check_path(req)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def config_from_sysmeta(self, req, inventory_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dcf72b49_881241f0","line":164,"in_reply_to":"cf4aaddd_4f28c5b1","updated":"2022-04-13 17:34:14.000000000","message":"Ack","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    S3NotImplemented, MalformedXML, InvalidRequest, HTTPNoContent, \\"},{"line_number":24,"context_line":"    ErrorResponse"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"MAX_PUT_INVENTORY_BODY_SIZE \u003d 10240"},{"line_number":27,"context_line":"# currently only support a single inventory configuration with id \u00270\u0027"},{"line_number":28,"context_line":"DEFAULT_INVENTORY_ID \u003d \u00270\u0027"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fcbfc5c_2d015a73","line":26,"updated":"2022-04-25 18:46:27.000000000","message":"Seems likely to be a reasonable limit. May need to bump it up as we add support for things like prefix filters and optional fields, but we can cross that bridge later.","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":false,"context_lines":[{"line_number":36,"context_line":"class InventoryConfiguration(object):"},{"line_number":37,"context_line":"    required \u003d {"},{"line_number":38,"context_line":"        \u0027./IsEnabled\u0027: \u0027enabled\u0027,"},{"line_number":39,"context_line":"        \u0027./Destination/S3BucketDestination/Bucket\u0027: \u0027dest_bucket\u0027,"},{"line_number":40,"context_line":"        \u0027./Destination/S3BucketDestination/Format\u0027: \u0027fmt\u0027,"},{"line_number":41,"context_line":"        \u0027./Id\u0027: \u0027inventory_id\u0027,"},{"line_number":42,"context_line":"        \u0027./Schedule/Frequency\u0027: \u0027schedule\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f4ef2a8_0d4cf274","line":39,"updated":"2022-04-25 18:46:27.000000000","message":"Right; so we strip off the arn:aws:s3:... bit in __init__","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":40,"context_line":"        \u0027./Destination/S3BucketDestination/Format\u0027: \u0027fmt\u0027,"},{"line_number":41,"context_line":"        \u0027./Id\u0027: \u0027inventory_id\u0027,"},{"line_number":42,"context_line":"        \u0027./Schedule/Frequency\u0027: \u0027schedule\u0027,"},{"line_number":43,"context_line":"        \u0027IncludedObjectVersions\u0027: \u0027include_versions\u0027,"},{"line_number":44,"context_line":"    }"},{"line_number":45,"context_line":"    unsupported \u003d ["},{"line_number":46,"context_line":"        \u0027Destination/S3BucketDestination/Prefix\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"cde4e869_b8d88246","line":43,"updated":"2022-04-25 18:46:27.000000000","message":"No leading \u0027./\u0027?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                 include_versions\u003d\u0027Current\u0027,"},{"line_number":60,"context_line":"                 deleted\u003dFalse"},{"line_number":61,"context_line":"                 ):"},{"line_number":62,"context_line":"        self.dest_bucket \u003d dest_bucket.split(\u0027:\u0027, 6)[-1]"},{"line_number":63,"context_line":"        self.enabled \u003d config_true_value(enabled)"},{"line_number":64,"context_line":"        self.schedule \u003d schedule"},{"line_number":65,"context_line":"        self.fmt \u003d fmt"}],"source_content_type":"text/x-python","patch_set":4,"id":"37035187_0415ef32","line":62,"updated":"2022-04-25 18:46:27.000000000","message":"OK, we don\u0027t have to worry about container names with a colon, because they would violate S3\u0027s bucket naming rules (even the old ones that allows upper case letters and underscores).","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":90,"context_line":"                    \u0027Destination/S3BucketDestination/Format must be Parquet\u0027)"},{"line_number":91,"context_line":"            if conf.inventory_id !\u003d DEFAULT_INVENTORY_ID:"},{"line_number":92,"context_line":"                errors.append("},{"line_number":93,"context_line":"                    \u0027Id must be 0\u0027)"},{"line_number":94,"context_line":"            if conf.include_versions !\u003d \u0027Current\u0027:"},{"line_number":95,"context_line":"                errors.append(\u0027IncludedObjectVersions must be Current\u0027)"},{"line_number":96,"context_line":"            if errors:"}],"source_content_type":"text/x-python","patch_set":4,"id":"330a3b68_ee07651a","line":93,"range":{"start_line":93,"start_character":32,"end_line":93,"end_character":33},"updated":"2022-04-25 18:46:27.000000000","message":"nit: Feels odd that we wouldn\u0027t do\n\n \u0027Id must be %s\u0027 % DEFAULT_INVENTORY_ID","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0c0f95bc6b742d76f77bce7a9597f1d5a7ef482e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                    \u0027Destination/S3BucketDestination/Format must be Parquet\u0027)"},{"line_number":91,"context_line":"            if conf.inventory_id !\u003d DEFAULT_INVENTORY_ID:"},{"line_number":92,"context_line":"                errors.append("},{"line_number":93,"context_line":"                    \u0027Id must be 0\u0027)"},{"line_number":94,"context_line":"            if conf.include_versions !\u003d \u0027Current\u0027:"},{"line_number":95,"context_line":"                errors.append(\u0027IncludedObjectVersions must be Current\u0027)"},{"line_number":96,"context_line":"            if errors:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ce77aaf7_eafe8abd","line":93,"range":{"start_line":93,"start_character":32,"end_line":93,"end_character":33},"in_reply_to":"330a3b68_ee07651a","updated":"2026-04-10 11:38:16.000000000","message":"Done","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":127,"context_line":"            \u0027source\u0027: \u0027s3api\u0027,"},{"line_number":128,"context_line":"            \u0027deleted\u0027: self.deleted,"},{"line_number":129,"context_line":"            \u0027enabled\u0027: self.enabled,"},{"line_number":130,"context_line":"        }"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"def check_config_id(req, config\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"579f2425_fe19d9cb","line":130,"updated":"2022-04-25 18:46:27.000000000","message":"It bugs me how round-tripping an InventoryConfiguration through to_dict/from_dict or to_xml/from_xml isn\u0027t guaranteed to give you equivalent configs... Maybe I\u0027m just over-eager to support multiple configs, though.","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"class InventoryController(Controller):"},{"line_number":155,"context_line":"    def __init__(self, app, conf, logger, **kwargs):"},{"line_number":156,"context_line":"        super(InventoryController, self).__init__(app, conf, logger, **kwargs)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def check_path(self, req):"},{"line_number":159,"context_line":"        if req.account:"}],"source_content_type":"text/x-python","patch_set":4,"id":"e50c9c50_2add9f24","line":156,"updated":"2022-04-25 18:46:27.000000000","message":"Can we skip overriding __init__?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0c0f95bc6b742d76f77bce7a9597f1d5a7ef482e","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"class InventoryController(Controller):"},{"line_number":155,"context_line":"    def __init__(self, app, conf, logger, **kwargs):"},{"line_number":156,"context_line":"        super(InventoryController, self).__init__(app, conf, logger, **kwargs)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def check_path(self, req):"},{"line_number":159,"context_line":"        if req.account:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1934ad2b_dc70167d","line":156,"in_reply_to":"e50c9c50_2add9f24","updated":"2026-04-10 11:38:16.000000000","message":"Done","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def check_req(self, req):"},{"line_number":174,"context_line":"        if not (req.conf.s3_inventory_enabled and req.is_bucket_request):"},{"line_number":175,"context_line":"            # Handle Object ACL"},{"line_number":176,"context_line":"            raise S3NotImplemented()"},{"line_number":177,"context_line":"        self.check_path(req)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5bfac1e0_715501ff","line":175,"range":{"start_line":175,"start_character":12,"end_line":175,"end_character":31},"updated":"2022-04-25 18:46:27.000000000","message":"Was this comment copied from some other controller? I\u0027m not sure (how) it applies here...","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0c0f95bc6b742d76f77bce7a9597f1d5a7ef482e","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def check_req(self, req):"},{"line_number":174,"context_line":"        if not (req.conf.s3_inventory_enabled and req.is_bucket_request):"},{"line_number":175,"context_line":"            # Handle Object ACL"},{"line_number":176,"context_line":"            raise S3NotImplemented()"},{"line_number":177,"context_line":"        self.check_path(req)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"cddcd913_d8c9a1b9","line":175,"range":{"start_line":175,"start_character":12,"end_line":175,"end_character":31},"in_reply_to":"5bfac1e0_715501ff","updated":"2026-04-10 11:38:16.000000000","message":"Done","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        self.check_req(req)"},{"line_number":220,"context_line":"        # note: no need to validate the id - if it is not the supported id then"},{"line_number":221,"context_line":"        # we\u0027ll just return 404"},{"line_number":222,"context_line":"        config_id \u003d req.params.get(\u0027id\u0027)"},{"line_number":223,"context_line":"        config \u003d self.config_from_sysmeta(req, config_id)"},{"line_number":224,"context_line":"        if config:"}],"source_content_type":"text/x-python","patch_set":4,"id":"63d99ba9_e8b524ab","line":221,"updated":"2022-04-25 18:46:27.000000000","message":"What if an operator has manually configured a second config? It wouldn\u0027t show up in listings, but if the client knew the id anyway, they\u0027d be able to delete it, yeah? Is that... intended behavior?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":225,"context_line":"            config.deleted \u003d True"},{"line_number":226,"context_line":"            config.enabled \u003d False"},{"line_number":227,"context_line":"            add_sysmeta_header(req, config)"},{"line_number":228,"context_line":"            req.get_response(self.app, \u0027POST\u0027)"},{"line_number":229,"context_line":"            response \u003d HTTPNoContent()"},{"line_number":230,"context_line":"        else:"},{"line_number":231,"context_line":"            response \u003d NoSuchInventoryConfiguration()"}],"source_content_type":"text/x-python","patch_set":4,"id":"28b8fb4f_a07220fe","line":228,"updated":"2022-04-25 18:46:27.000000000","message":"So when (if ever) do soft-deleted configs get reaped?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        listing \u003d False"},{"line_number":243,"context_line":"        # note: no need to validate the id - if it is not the supported id then"},{"line_number":244,"context_line":"        # we\u0027ll just return 404"},{"line_number":245,"context_line":"        req_config_id \u003d req.params.get(\u0027id\u0027)"},{"line_number":246,"context_line":"        if req_config_id is None:"},{"line_number":247,"context_line":"            listing \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"14be59a4_306f722a","line":244,"updated":"2022-04-25 18:46:27.000000000","message":"Similar note as with DELETE: if an operator wanted to start testing allowing multiple inventories, (it looks like) a client could read the non-default inventory. Only we\u0027re gonna lie about the id :-/","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3a650b93572a044a3b6e0137d33231d4a99eaf5","unresolved":true,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"def add_sysmeta_header(req, config):"},{"line_number":170,"context_line":"    config_data \u003d config.to_dict()"},{"line_number":171,"context_line":"    config_data[\u0027modified_time\u0027] \u003d float(req.timestamp)"},{"line_number":172,"context_line":"    key \u003d \u0027X-Container-Sysmeta-Inventory-%s-Config\u0027 % config.inventory_id"},{"line_number":173,"context_line":"    req.headers[key] \u003d json.dumps(config_data)"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"0d5df499_1381aba0","line":171,"range":{"start_line":171,"start_character":42,"end_line":171,"end_character":54},"updated":"2026-03-10 10:32:45.000000000","message":"this is NOT the x-timestamp !\n\nThis an S3Request whose ``.timestamp`` property is something different (the x-amz-date header).","commit_id":"2b710017b1798bb40027f5bc596e92f43cc22eab"}],"swift/common/middleware/s3api/s3api.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":291,"context_line":"        self.conf.s3_inventory_enabled \u003d config_true_value("},{"line_number":292,"context_line":"            wsgi_conf.get(\u0027s3_inventory_enabled\u0027, False))"},{"line_number":293,"context_line":"        self.conf.s3_inventory_allowed_paths \u003d list_from_csv("},{"line_number":294,"context_line":"            wsgi_conf.get(\u0027s3_inventory_allowed_paths\u0027, \u0027*\u0027))"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        self.logger \u003d get_logger("},{"line_number":297,"context_line":"            wsgi_conf, log_route\u003dwsgi_conf.get(\u0027log_name\u0027, \u0027s3api\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"15f3bac8_1ab9f756","line":294,"updated":"2022-04-11 16:36:26.000000000","message":"where are these used/applied?","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        self.conf.s3_inventory_enabled \u003d config_true_value("},{"line_number":292,"context_line":"            wsgi_conf.get(\u0027s3_inventory_enabled\u0027, False))"},{"line_number":293,"context_line":"        self.conf.s3_inventory_allowed_paths \u003d list_from_csv("},{"line_number":294,"context_line":"            wsgi_conf.get(\u0027s3_inventory_allowed_paths\u0027, \u0027*\u0027))"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        self.logger \u003d get_logger("},{"line_number":297,"context_line":"            wsgi_conf, log_route\u003dwsgi_conf.get(\u0027log_name\u0027, \u0027s3api\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f11a8c8_81ba6b58","line":294,"in_reply_to":"15f3bac8_1ab9f756","updated":"2022-04-13 17:34:14.000000000","message":"https://review.opendev.org/c/openstack/swift/+/835938/2/swift/common/middleware/s3api/controllers/inventory.py#152\n\nthe s3api conf is passed to the inventory controller when it is constructed","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"}],"swift/common/middleware/s3api/schema/inventory_configuration.rng":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e"},{"line_number":2,"context_line":"\u003cgrammar xmlns\u003d\"http://relaxng.org/ns/structure/1.0\""},{"line_number":3,"context_line":"         datatypeLibrary\u003d\"http://www.w3.org/2001/XMLSchema-datatypes\"\u003e"},{"line_number":4,"context_line":"    \u003cstart\u003e"}],"source_content_type":"application/xml","patch_set":4,"id":"aafc83d3_1c552c93","line":1,"updated":"2022-04-25 18:46:27.000000000","message":"We should probably also have an equivalent schema in doc/s3api/rnc/","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                    \u003celement name\u003d\"OptionalFields\"\u003e"},{"line_number":72,"context_line":"                        \u003coneOrMore\u003e"},{"line_number":73,"context_line":"                            \u003celement name\u003d\"Field\"\u003e"},{"line_number":74,"context_line":"                                \u003cdata type\u003d\"string\"/\u003e"},{"line_number":75,"context_line":"                            \u003c/element\u003e"},{"line_number":76,"context_line":"                        \u003c/oneOrMore\u003e"},{"line_number":77,"context_line":"                    \u003c/element\u003e"}],"source_content_type":"application/xml","patch_set":4,"id":"fffb5d93_7afd531c","line":74,"updated":"2022-04-25 18:46:27.000000000","message":"Shouldn\u0027t this be\n\n \u003cchoice\u003e\n   \u003cvalue type\u003d\"string\"\u003eSize\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eLastModifiedDate\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eStorageClass\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eETag\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eIsMultipartUploaded\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eReplicationStatus\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eEncryptionStatus\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eObjectLockRetainUntilDate\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eObjectLockMode\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eObjectLockLegalHoldStatus\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eIntelligentTieringAccessTier\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eBucketKeyStatus\u003c/value\u003e\n   \u003cvalue type\u003d\"string\"\u003eChecksumAlgorithm\u003c/value\u003e\n \u003c/choice\u003e\n\n?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"}],"test/functional/s3api/test_bucket_inventory.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        \u0027Id\u0027: \u00270\u0027,"},{"line_number":39,"context_line":"        \u0027IncludedObjectVersions\u0027: \u0027All\u0027,"},{"line_number":40,"context_line":"        \u0027Schedule\u0027: {"},{"line_number":41,"context_line":"            \u0027Frequency\u0027: \u0027Daily\u0027"},{"line_number":42,"context_line":"        }"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"93028ee3_752f30cc","line":41,"updated":"2022-04-11 16:36:26.000000000","message":"i haven\u0027t seen  the validation for frequency, yet","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \u0027Id\u0027: \u00270\u0027,"},{"line_number":39,"context_line":"        \u0027IncludedObjectVersions\u0027: \u0027All\u0027,"},{"line_number":40,"context_line":"        \u0027Schedule\u0027: {"},{"line_number":41,"context_line":"            \u0027Frequency\u0027: \u0027Daily\u0027"},{"line_number":42,"context_line":"        }"},{"line_number":43,"context_line":"    }"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c087ee1f_42e9224d","line":41,"in_reply_to":"93028ee3_752f30cc","updated":"2022-04-13 17:34:14.000000000","message":"Done (in unit tests)","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        if not tf.cluster_info[\u0027s3api\u0027].get(\u0027s3_inventory_enabled\u0027, False):"},{"line_number":47,"context_line":"            raise tf.SkipTest(\u0027s3 bucket inventory is not enabled\u0027)"},{"line_number":48,"context_line":"        super(TestS3ApiBucketInventory, self).setUp()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_bucket_inventory(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"a2760b2b_7843a86d","line":47,"updated":"2022-04-11 16:36:26.000000000","message":"fair enough","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        if not tf.cluster_info[\u0027s3api\u0027].get(\u0027s3_inventory_enabled\u0027, False):"},{"line_number":47,"context_line":"            raise tf.SkipTest(\u0027s3 bucket inventory is not enabled\u0027)"},{"line_number":48,"context_line":"        super(TestS3ApiBucketInventory, self).setUp()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_bucket_inventory(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ae57db6d_795e65c0","line":47,"in_reply_to":"a2760b2b_7843a86d","updated":"2022-04-13 17:34:14.000000000","message":"Ack","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":31,"context_line":"    inventory_configuration \u003d {"},{"line_number":32,"context_line":"        \u0027Destination\u0027: {"},{"line_number":33,"context_line":"            \u0027S3BucketDestination\u0027: {"},{"line_number":34,"context_line":"                \u0027Bucket\u0027: \u0027dest-bucket\u0027,"},{"line_number":35,"context_line":"                \u0027Format\u0027: \u0027Parquet\u0027,"},{"line_number":36,"context_line":"            }"},{"line_number":37,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":4,"id":"c5b48660_f069fea1","line":34,"updated":"2022-04-25 18:46:27.000000000","message":"Does AWS let you skip the \"arn:aws:s3:::\" part?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        # GET inventory config list"},{"line_number":88,"context_line":"        resp \u003d self.conn.list_bucket_inventory_configurations("},{"line_number":89,"context_line":"            Bucket\u003dbucket,"},{"line_number":90,"context_line":"            ContinuationToken\u003d\u0027ignored\u0027"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":93,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":4,"id":"2df0dd5e_bf422ac6","line":90,"updated":"2022-04-25 18:46:27.000000000","message":"This can also be omitted, yeah?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":107,"context_line":"            ],"},{"line_number":108,"context_line":"            resp[\u0027InventoryConfigurationList\u0027]"},{"line_number":109,"context_line":"        )"},{"line_number":110,"context_line":"        self.assertNotIn(\u0027ContinuationToken\u0027, resp)"},{"line_number":111,"context_line":"        self.assertEqual(False, resp[\u0027IsTruncated\u0027])"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # DELETE inventory config"}],"source_content_type":"text/x-python","patch_set":4,"id":"9e66e117_19109660","line":110,"updated":"2022-04-25 18:46:27.000000000","message":"Seems like we\u0027re codifying a bug -- isn\u0027t ContinuationToken one of those reflected elements, like Prefix in bucket listings?\n\nSeems like we could use a\n\n self.assertNotIn(\u0027NextContinuationToken\u0027, resp)\n\nthough.","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37089f82d6db7a6fbbe015b304f425ea71827d27","unresolved":true,"context_lines":[{"line_number":139,"context_line":"                Bucket\u003dbucket,"},{"line_number":140,"context_line":"                Id\u003d\u00270\u0027"},{"line_number":141,"context_line":"            )"},{"line_number":142,"context_line":"        self.assertIn(\u0027The specified configuration does not exist.\u0027,"},{"line_number":143,"context_line":"                      str(cm.exception))"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        # GET inventory config unsupported id"}],"source_content_type":"text/x-python","patch_set":4,"id":"9912d951_44be6ccd","line":142,"updated":"2022-04-25 18:46:27.000000000","message":"Should we also assert on status?","commit_id":"d56c49493bebcc8ecbc30892933f015e9ffeea23"}],"test/unit/common/middleware/s3api/test_inventory.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8bed3235251fd3b9c6cac1dc9669219aba7e3199","unresolved":true,"context_lines":[{"line_number":262,"context_line":"                                     \u0027Date\u0027: self.get_date_header()},"},{"line_number":263,"context_line":"                            body\u003dSUPPORTED_XML)"},{"line_number":264,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":265,"context_line":"        self.assertEqual(status.split()[0], \u0027501\u0027)"},{"line_number":266,"context_line":"        self.assertEqual([], self.swift.calls_with_headers)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_PUT_enable_inventory(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7e3a4af6_9c4fc81d","line":265,"updated":"2022-04-11 16:36:26.000000000","message":"not implemented, ok","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c563268f178c42ed3bb3a82d6d899a492abf7b6","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                                     \u0027Date\u0027: self.get_date_header()},"},{"line_number":263,"context_line":"                            body\u003dSUPPORTED_XML)"},{"line_number":264,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":265,"context_line":"        self.assertEqual(status.split()[0], \u0027501\u0027)"},{"line_number":266,"context_line":"        self.assertEqual([], self.swift.calls_with_headers)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    def test_PUT_enable_inventory(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"a6fe4f22_99f66def","line":265,"in_reply_to":"7e3a4af6_9c4fc81d","updated":"2022-04-13 17:34:14.000000000","message":"Ack","commit_id":"d4138177fa3d2671d3e596afc9ad0264d4ce4687"}]}
