)]}'
{"doc/source/reference/tenants.rst":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"6620d3b79fc0d21fa5ebfb4b3b6595c27c107cf1","unresolved":false,"context_lines":[{"line_number":452,"context_line":"Access Rule Templating"},{"line_number":453,"context_line":"----------------------"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"The special word \"%TENANT%\" can be used in conditions\u0027 values. It will be automatically"},{"line_number":456,"context_line":"substituted for the relevant tenant when evaluating authorizations for a given"},{"line_number":457,"context_line":"set of claims. For example, consider the following rule:"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_977956fb","line":455,"updated":"2020-02-07 14:56:04.000000000","message":"Why %TENANT% and not {tenant}?  There are many other templated strings in Zuul (not only in Ansible, but in Zuul itself, eg, success-url, and they all use python3 style substitution syntax.","commit_id":"75d734f47da303aeeb566ed7c54de6e1ee65601c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"6620d3b79fc0d21fa5ebfb4b3b6595c27c107cf1","unresolved":false,"context_lines":[{"line_number":487,"context_line":"   \u0027sub\u0027: \u0027carol\u0027,"},{"line_number":488,"context_line":"   \u0027iat\u0027: 1234556780,"},{"line_number":489,"context_line":"   \u0027groups\u0027: [\u0027tenant-one\u0027, \u0027some-other-group\u0027]"},{"line_number":490,"context_line":"       }"},{"line_number":491,"context_line":"   },"},{"line_number":492,"context_line":"  }"},{"line_number":493,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_b77ed2df","line":490,"updated":"2020-02-07 14:56:04.000000000","message":"Stray } ?","commit_id":"75d734f47da303aeeb566ed7c54de6e1ee65601c"},{"author":{"_account_id":30637,"name":"Jan Kubovy","email":"jan.kubovy@bmw.de","username":"kubovy"},"change_message_id":"0a692a476df3fb1730efe3c60868e46c5334d0ad","unresolved":false,"context_lines":[{"line_number":499,"context_line":"   \u0027sub\u0027: \u0027carol\u0027,"},{"line_number":500,"context_line":"   \u0027iat\u0027: 1234556780,"},{"line_number":501,"context_line":"   \u0027groups\u0027: [\u0027tenant-one\u0027, \u0027some-other-group\u0027]"},{"line_number":502,"context_line":"       }"},{"line_number":503,"context_line":"   },"},{"line_number":504,"context_line":"  }"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"And this set of claims will be allowed to perform protected actions on **tenant-one**"},{"line_number":507,"context_line":"and **tenant-two**:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_96c11b00","line":504,"range":{"start_line":502,"start_character":1,"end_line":504,"end_character":3},"updated":"2020-02-12 07:37:23.000000000","message":"I guess 2 \"}\" too many?","commit_id":"d1432b99a9ddc6db9a86db96fe9aef84d0ddcccb"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"c9da54b5416f1dd793692784311078c66ac11b81","unresolved":false,"context_lines":[{"line_number":499,"context_line":"   \u0027sub\u0027: \u0027carol\u0027,"},{"line_number":500,"context_line":"   \u0027iat\u0027: 1234556780,"},{"line_number":501,"context_line":"   \u0027groups\u0027: [\u0027tenant-one\u0027, \u0027some-other-group\u0027]"},{"line_number":502,"context_line":"       }"},{"line_number":503,"context_line":"   },"},{"line_number":504,"context_line":"  }"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"And this set of claims will be allowed to perform protected actions on **tenant-one**"},{"line_number":507,"context_line":"and **tenant-two**:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_9cc7fd46","line":504,"range":{"start_line":502,"start_character":1,"end_line":504,"end_character":3},"in_reply_to":"3fa7e38b_96c11b00","updated":"2020-02-12 08:53:32.000000000","message":"Done","commit_id":"d1432b99a9ddc6db9a86db96fe9aef84d0ddcccb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"e8a20fbb40a14fcb62c751013c5bc2856bb5f228","unresolved":false,"context_lines":[{"line_number":464,"context_line":"Access Rule Templating"},{"line_number":465,"context_line":"----------------------"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"The special word \"{TENANT}\" can be used in conditions\u0027 values. It will be automatically"},{"line_number":468,"context_line":"substituted for the relevant tenant when evaluating authorizations for a given"},{"line_number":469,"context_line":"set of claims. For example, consider the following rule:"},{"line_number":470,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_aeafbf2b","line":467,"updated":"2020-02-18 21:06:26.000000000","message":"I know this seems nitpicky, but this could have significant UX impact.  Take a look at the pipeline.start-message templating available.  Here\u0027s the implementation:\n\nhttps://opendev.org/zuul/zuul/src/branch/master/zuul/model.py#L2694\n\nBased on the pattern there, I\u0027d expect to be able to use \"{tenant.name}\" (note lower case) as a substitution.  Unless there\u0027s a good reason to do otherwise, let\u0027s use the same format and case (and even the same methods like https://opendev.org/zuul/zuul/src/branch/master/zuul/model.py#L4476 ) to promote consistency.","commit_id":"e9cbea87c622d60cc586029f8b5e1dab9470f787"}],"tests/unit/test_configloader.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"bbb83e6608097e9aa2d7f315d3b4eda3ebf89a2f","unresolved":false,"context_lines":[{"line_number":575,"context_line":"        claims_2 \u003d {\u0027group\u0027: \u0027tenant-two-admin\u0027}"},{"line_number":576,"context_line":"        rules \u003d self.sched.abide.admin_rules"},{"line_number":577,"context_line":"        self.assertTrue(rules[\u0027tenant-admin\u0027](claims_1,"},{"line_number":578,"context_line":"                                              FakeTenant(\u0027tenant-one\u0027)))"},{"line_number":579,"context_line":"        self.assertTrue(rules[\u0027tenant-admin\u0027](claims_2,"},{"line_number":580,"context_line":"                                              FakeTenant(\u0027tenant-two\u0027)))"},{"line_number":581,"context_line":"        self.assertTrue(not rules[\u0027tenant-admin\u0027](claims_1,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_342f8a58","line":578,"updated":"2020-02-19 18:21:35.000000000","message":"Rather than using a FakeTenant object, use the real one:\n\n  self.sched.abide.tenants.get(\u0027tenant-one\u0027)\n\nThat way we\u0027re covering more real code and we don\u0027t need to keep test fakes in sync.","commit_id":"548f679fdd646ff7b2fb1d604f5a44b01164a976"}],"zuul/model.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"6620d3b79fc0d21fa5ebfb4b3b6595c27c107cf1","unresolved":false,"context_lines":[{"line_number":4828,"context_line":"            template_dict[\u0027%TENANT%\u0027] \u003d tenant"},{"line_number":4829,"context_line":"        x \u003d value"},{"line_number":4830,"context_line":"        for template, substitute in template_dict.items():"},{"line_number":4831,"context_line":"            x \u003d x.replace(template, substitute)"},{"line_number":4832,"context_line":"        return x"},{"line_number":4833,"context_line":""},{"line_number":4834,"context_line":"    def _match_jsonpath(self, claims, tenant):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_57675e53","line":4831,"updated":"2020-02-07 14:56:04.000000000","message":"And if you use the {} syntax, you can just use a python string.format() call here.","commit_id":"75d734f47da303aeeb566ed7c54de6e1ee65601c"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"e8a20fbb40a14fcb62c751013c5bc2856bb5f228","unresolved":false,"context_lines":[{"line_number":4833,"context_line":"        template_dict \u003d {}"},{"line_number":4834,"context_line":"        if tenant is not None:"},{"line_number":4835,"context_line":"            template_dict[\u0027TENANT\u0027] \u003d tenant"},{"line_number":4836,"context_line":"        return value.format(**template_dict)"},{"line_number":4837,"context_line":""},{"line_number":4838,"context_line":"    def _match_jsonpath(self, claims, tenant):"},{"line_number":4839,"context_line":"        matches \u003d [match.value"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_ceb47b84","line":4836,"updated":"2020-02-18 21:06:26.000000000","message":"Here, use the getSafeAttributes method as in:\n  https://opendev.org/zuul/zuul/src/branch/master/zuul/model.py#L4476","commit_id":"e9cbea87c622d60cc586029f8b5e1dab9470f787"}]}
