)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"  target."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"To be defensive, also prevent slo and dlo (for reasons simmilar to"},{"line_number":22,"context_line":"sylink)."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: I2617dd1f997abd6cdae78a3adf51e5ee28b74204"},{"line_number":25,"context_line":"Closes-Bug: #1910804"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"65d4b017_d087b380","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":6},"updated":"2021-01-13 20:07:52.000000000","message":"symlink","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"}],"swift/common/wsgi.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99055493be2a7e236b0b0aa4aa3fc578279a8fb5","unresolved":true,"context_lines":[{"line_number":401,"context_line":"        if func:"},{"line_number":402,"context_line":"            func(PipelineWrapper(ctx),"},{"line_number":403,"context_line":"                 allow_modify_pipeline\u003dallow_modify_pipeline,"},{"line_number":404,"context_line":"                 prohibited_filters\u003dprohibited_filters)"},{"line_number":405,"context_line":"        # cache the freshly created app so we con\u0027t have to redo"},{"line_number":406,"context_line":"        # initialization checks and log startup messages again"},{"line_number":407,"context_line":"        ctx.app_context.create \u003d lambda: app"}],"source_content_type":"text/x-python","patch_set":2,"id":"36509824_cd0d8c58","line":404,"updated":"2021-01-14 19:34:54.000000000","message":"can we assume there is no-one using a custom app?","commit_id":"180324a8bbba1cfa5a38706975e2002a8485400d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bda7df1b7fab7d9b023df4e107a606d8988fe877","unresolved":true,"context_lines":[{"line_number":401,"context_line":"        if func:"},{"line_number":402,"context_line":"            func(PipelineWrapper(ctx),"},{"line_number":403,"context_line":"                 allow_modify_pipeline\u003dallow_modify_pipeline,"},{"line_number":404,"context_line":"                 prohibited_filters\u003dprohibited_filters)"},{"line_number":405,"context_line":"        # cache the freshly created app so we con\u0027t have to redo"},{"line_number":406,"context_line":"        # initialization checks and log startup messages again"},{"line_number":407,"context_line":"        ctx.app_context.create \u003d lambda: app"}],"source_content_type":"text/x-python","patch_set":2,"id":"0f8ac807_92e29657","line":404,"in_reply_to":"36509824_cd0d8c58","updated":"2021-01-14 20:37:25.000000000","message":"If there are, it seems like a level of integration where they\u0027d almost need to *expect* breakage with new versions, not unlike swift-on-file or something.","commit_id":"180324a8bbba1cfa5a38706975e2002a8485400d"}],"swift/container/reconciler.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dbdde31762c069edf0a059f7d03ae47227e6eec8","unresolved":true,"context_lines":[{"line_number":372,"context_line":"            \u0027Swift Container Reconciler\u0027,"},{"line_number":373,"context_line":"            request_tries,"},{"line_number":374,"context_line":"            use_replication_network\u003dTrue,"},{"line_number":375,"context_line":"            prohibited_filters\u003d(\u0027symlink\u0027, \u0027encryption\u0027, \u0027slo\u0027, \u0027dlo\u0027))"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        self.stats \u003d defaultdict(int)"},{"line_number":378,"context_line":"        self.last_stat_time \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"f74b36b4_be508dba","line":375,"updated":"2021-01-13 15:14:38.000000000","message":"maybe a CONSTANT right up at the top?","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            \u0027Swift Container Reconciler\u0027,"},{"line_number":373,"context_line":"            request_tries,"},{"line_number":374,"context_line":"            use_replication_network\u003dTrue,"},{"line_number":375,"context_line":"            prohibited_filters\u003d(\u0027symlink\u0027, \u0027encryption\u0027, \u0027slo\u0027, \u0027dlo\u0027))"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"        self.stats \u003d defaultdict(int)"},{"line_number":378,"context_line":"        self.last_stat_time \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7218763a_9cc3fea0","line":375,"in_reply_to":"f74b36b4_be508dba","updated":"2021-01-13 20:07:52.000000000","message":"Done","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99055493be2a7e236b0b0aa4aa3fc578279a8fb5","unresolved":true,"context_lines":[{"line_number":368,"context_line":"            \u0027/etc/swift/container-reconciler.conf\u0027"},{"line_number":369,"context_line":"        self.logger \u003d get_logger(conf, log_route\u003d\u0027container-reconciler\u0027)"},{"line_number":370,"context_line":"        request_tries \u003d int(conf.get(\u0027request_tries\u0027) or 3)"},{"line_number":371,"context_line":"        self.swift \u003d InternalClient("},{"line_number":372,"context_line":"            conf_path,"},{"line_number":373,"context_line":"            \u0027Swift Container Reconciler\u0027,"},{"line_number":374,"context_line":"            request_tries,"}],"source_content_type":"text/x-python","patch_set":2,"id":"d523a6eb_b05ba258","line":371,"updated":"2021-01-14 19:34:54.000000000","message":"right here we could (a) check the conf and raise exception or (b) fix the conf and write to a temp file or (c) fix the conf dict and have internal client optionally accept a conf dict rather than filepath...that avoids the subsequent plumbing to delegate the fix to the client which delegates to the proxy app","commit_id":"180324a8bbba1cfa5a38706975e2002a8485400d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bda7df1b7fab7d9b023df4e107a606d8988fe877","unresolved":true,"context_lines":[{"line_number":368,"context_line":"            \u0027/etc/swift/container-reconciler.conf\u0027"},{"line_number":369,"context_line":"        self.logger \u003d get_logger(conf, log_route\u003d\u0027container-reconciler\u0027)"},{"line_number":370,"context_line":"        request_tries \u003d int(conf.get(\u0027request_tries\u0027) or 3)"},{"line_number":371,"context_line":"        self.swift \u003d InternalClient("},{"line_number":372,"context_line":"            conf_path,"},{"line_number":373,"context_line":"            \u0027Swift Container Reconciler\u0027,"},{"line_number":374,"context_line":"            request_tries,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2c16e363_2c280033","line":371,"in_reply_to":"d523a6eb_b05ba258","updated":"2021-01-14 20:37:25.000000000","message":"Seems like the sort of thing that\u0027d require us to take on a lot of how paste turns a config into a wsgi app -- IIRC one of the advantages of modify_wsgi_pipeline is that it leverages paste to translate filter-name-in-pipeline (which we can\u0027t rely on) to entry-point-name (which we can), for example; IDK that I want to have to do that in Swift.","commit_id":"180324a8bbba1cfa5a38706975e2002a8485400d"}],"swift/proxy/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dbdde31762c069edf0a059f7d03ae47227e6eec8","unresolved":true,"context_lines":[{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        if allow_modify_pipeline:"},{"line_number":754,"context_line":"            for filter_spec in reversed(required_filters):"},{"line_number":755,"context_line":"                filter_name \u003d filter_spec[\u0027name\u0027]"},{"line_number":756,"context_line":"                if filter_name not in pipe and \\"},{"line_number":757,"context_line":"                        filter_name not in prohibited_filters:"},{"line_number":758,"context_line":"                    afters \u003d filter_spec.get(\u0027after_fn\u0027, lambda _: [])(pipe)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2bc2e50b_71cec224","line":755,"updated":"2021-01-13 15:14:38.000000000","message":"it\u0027s always \"interesting\" how you can \"bypass\" the required/prohibited filters by changing filter names in the config","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":true,"context_lines":[{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        if allow_modify_pipeline:"},{"line_number":754,"context_line":"            for filter_spec in reversed(required_filters):"},{"line_number":755,"context_line":"                filter_name \u003d filter_spec[\u0027name\u0027]"},{"line_number":756,"context_line":"                if filter_name not in pipe and \\"},{"line_number":757,"context_line":"                        filter_name not in prohibited_filters:"},{"line_number":758,"context_line":"                    afters \u003d filter_spec.get(\u0027after_fn\u0027, lambda _: [])(pipe)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7fbad2c1_5a184039","line":755,"in_reply_to":"2bc2e50b_71cec224","updated":"2021-01-13 20:07:52.000000000","message":"Well... kind of. filter_spec[\u0027name\u0027] is actually the entry-point name, so even if you\u0027ve got something like\n\n [pipeline:main]\n pipeline \u003d ... dynamic_large_object ...\n\n [filter:dynamic_large_object]\n use \u003d egg:swift#dlo\n\n ...\n\nno proxy should add a second dlo. There\u0027s still the issue of name collisions across projects or (presumably; haven\u0027t tested this one) using\n\n paste.filter_factory \u003d ...\n\nlines, but it\u0027s actually more robust than I thought the first time I dug into it.","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dbdde31762c069edf0a059f7d03ae47227e6eec8","unresolved":true,"context_lines":[{"line_number":754,"context_line":"            for filter_spec in reversed(required_filters):"},{"line_number":755,"context_line":"                filter_name \u003d filter_spec[\u0027name\u0027]"},{"line_number":756,"context_line":"                if filter_name not in pipe and \\"},{"line_number":757,"context_line":"                        filter_name not in prohibited_filters:"},{"line_number":758,"context_line":"                    afters \u003d filter_spec.get(\u0027after_fn\u0027, lambda _: [])(pipe)"},{"line_number":759,"context_line":"                    insert_at \u003d 0"},{"line_number":760,"context_line":"                    for after in afters:"}],"source_content_type":"text/x-python","patch_set":1,"id":"a02c7777_e53069d1","line":757,"updated":"2021-01-13 15:14:38.000000000","message":"required AND prohibited?","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":true,"context_lines":[{"line_number":754,"context_line":"            for filter_spec in reversed(required_filters):"},{"line_number":755,"context_line":"                filter_name \u003d filter_spec[\u0027name\u0027]"},{"line_number":756,"context_line":"                if filter_name not in pipe and \\"},{"line_number":757,"context_line":"                        filter_name not in prohibited_filters:"},{"line_number":758,"context_line":"                    afters \u003d filter_spec.get(\u0027after_fn\u0027, lambda _: [])(pipe)"},{"line_number":759,"context_line":"                    insert_at \u003d 0"},{"line_number":760,"context_line":"                    for after in afters:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f950a4eb_812ba56b","line":757,"in_reply_to":"a02c7777_e53069d1","updated":"2021-01-13 20:07:52.000000000","message":"Shouldn\u0027t come up in practice (reconciler\u0027s the only guy that prohibits filters ATM, and it doesn\u0027t allow pipeline modifications), but this seemed the most reasonable way to handle it if it ever happens. I definitely *didn\u0027t* want to have a situation like\n\n* operator configured a valid pipeline\n* we automatically add a required filter\n* we automatically remove it because it was also prohibited\n* we report that the pipeline was modified when nothing changed.","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dbdde31762c069edf0a059f7d03ae47227e6eec8","unresolved":true,"context_lines":[{"line_number":774,"context_line":"            self.logger.info(\"Pipeline was modified. \""},{"line_number":775,"context_line":"                             \"New pipeline is \\\"%s\\\".\", pipe)"},{"line_number":776,"context_line":"        else:"},{"line_number":777,"context_line":"            self.logger.debug(\"Pipeline is \\\"%s\\\"\", pipe)"},{"line_number":778,"context_line":""},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"def parse_per_policy_config(conf):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6184ec8_77221c13","line":777,"updated":"2021-01-13 15:14:38.000000000","message":"thanks for dropping i18n!","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"}],"test/probe/test_container_merge_policy_index.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":true,"context_lines":[{"line_number":102,"context_line":"                except direct_client.ClientException:"},{"line_number":103,"context_line":"                    continue"},{"line_number":104,"context_line":"                orig_policy_index \u003d policy_index"},{"line_number":105,"context_line":"                crypto_meta \u003d hdrs[\u0027X-Object-Sysmeta-Crypto-Body-Meta\u0027]"},{"line_number":106,"context_line":"                break"},{"line_number":107,"context_line":"            if orig_policy_index is not None:"},{"line_number":108,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ba22d50_16d15429","line":105,"updated":"2021-01-13 20:07:52.000000000","message":"Note that this will come out None if encryption is not enabled -- and we\u0027ll assert that it\u0027s *still* None after it\u0027s moved to the other policy.","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dbdde31762c069edf0a059f7d03ae47227e6eec8","unresolved":true,"context_lines":[{"line_number":475,"context_line":"            self.container_name, symlink_name, {"},{"line_number":476,"context_line":"                \u0027X-Symlink-Target\u0027: \u0027%s/%s\u0027 % ("},{"line_number":477,"context_line":"                    self.container_name, target_name),"},{"line_number":478,"context_line":"                \u0027X-Symlink-Target-Etag\u0027: target_etag,"},{"line_number":479,"context_line":"                \u0027Content-Type\u0027: \u0027application/symlink\u0027,"},{"line_number":480,"context_line":"            }, b\u0027\u0027)"},{"line_number":481,"context_line":"        # ... and then break the symlink"}],"source_content_type":"text/x-python","patch_set":1,"id":"3886db7d_10d2cad4","line":478,"updated":"2021-01-13 15:14:38.000000000","message":"nice!  so we had a probetests for dynamic symlinks - but not for \"hard\" links\n\nI guess we don\u0027t have one that explicitly enables encryption - you just have to turn on encryption (and put it in your internal_client.conf) and then run normal probetests?","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":false,"context_lines":[{"line_number":475,"context_line":"            self.container_name, symlink_name, {"},{"line_number":476,"context_line":"                \u0027X-Symlink-Target\u0027: \u0027%s/%s\u0027 % ("},{"line_number":477,"context_line":"                    self.container_name, target_name),"},{"line_number":478,"context_line":"                \u0027X-Symlink-Target-Etag\u0027: target_etag,"},{"line_number":479,"context_line":"                \u0027Content-Type\u0027: \u0027application/symlink\u0027,"},{"line_number":480,"context_line":"            }, b\u0027\u0027)"},{"line_number":481,"context_line":"        # ... and then break the symlink"}],"source_content_type":"text/x-python","patch_set":1,"id":"6ce637b0_0c6f5694","line":478,"in_reply_to":"3886db7d_10d2cad4","updated":"2021-01-13 20:07:52.000000000","message":"Yup, that\u0027s what I\u0027d done -- tweak my reconciler conf to have symlink, encryption, keymaster, etc. in the pipeline, then check that probe tests still pass.\n\nThe static symlink test came out of me playing with adding a ?symlink\u003dget param to the reconciler -- that was enough to get the dynamic symlink test passing even with symlink in the pipeline. The more I played with scenarios in my head, though, the more I realized that we need to just exclude symlink similar to how we need to exclude encryption (albeit for different reasons) so I wrote a test to confirm it. Once I had the test, it seemed worth including it, even though I backed out the other approach I tried first.","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"}],"test/unit/common/test_wsgi.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c0ec45efe5cfbad49cb8ce90bbf4b08625a8ab1","unresolved":true,"context_lines":[{"line_number":1893,"context_line":""},{"line_number":1894,"context_line":"            with mock.patch("},{"line_number":1895,"context_line":"                    \u0027swift.proxy.server.Application.modify_wsgi_pipeline\u0027,"},{"line_number":1896,"context_line":"                    blow_up), self.assertRaises(CustomException):"},{"line_number":1897,"context_line":"                app \u003d wsgi.loadapp(conf_file, global_conf\u003d{},"},{"line_number":1898,"context_line":"                                   allow_modify_pipeline\u003dFalse)"},{"line_number":1899,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5bcf8965_b16f4454","line":1896,"range":{"start_line":1896,"start_character":30,"end_line":1896,"end_character":64},"updated":"2021-01-13 20:07:52.000000000","message":"So this is a definite change in behavior, but I don\u0027t think anything actually relied on the old behavior.","commit_id":"8e74e1f216e2767501aef934d1f126db77580aea"}]}
