)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Richard Avelar \u003ccsravelar@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-02-18 13:49:04 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Policy in Code (part 1)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds the basic framework for registering and using default policy"},{"line_number":10,"context_line":"rules in code. Rules should be defined and returned from a module in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da36d5c6_a11729ec","line":7,"updated":"2017-02-18 17:17:15.000000000","message":"nit: We could make the commit messages a bit more descriptive here (instead of breaking things into \"parts\"). Which also helps if we go dig through commits histories after things land, too.\n\n  Introduce in-code policies and move catalog defaults into code\n\nWe could also break down the commit message but listing everything we\u0027re changing, too.\n\n  This commit does the following:\n    - Introduces framework for registering default policies in code\n    - Moves default endpoint policies into code\n    - Moves default service policies into code\n    - Moves default region policies into code\n   \nDepending on the reviewer\u0027s style, if they start with the commit message they get a very good idea of exactly what you\u0027re doing from the commit message.","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"}],"keystone/policies/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":15,"context_line":"IDENTITY \u003d \u0027identity:%s\u0027"},{"line_number":16,"context_line":"RULE_ADMIN_REQUIRED \u003d \u0027rule:admin_required\u0027"},{"line_number":17,"context_line":"RULE_ADMIN_OR_OWNER \u003d \u0027rule:admin_or_owner\u0027"},{"line_number":18,"context_line":"RULE_ANY \u003d \u0027\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"rules \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_61e4510d","line":18,"updated":"2017-02-18 17:17:15.000000000","message":"Looks like antwash already has quite a bit of this plumbing done [0]. We could rebase this on top of his work to reduce duplication and only target moving catalog default policies into code.\n\n\n[0] https://review.openstack.org/#/c/435609","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":15,"context_line":"IDENTITY \u003d \u0027identity:%s\u0027"},{"line_number":16,"context_line":"RULE_ADMIN_REQUIRED \u003d \u0027rule:admin_required\u0027"},{"line_number":17,"context_line":"RULE_ADMIN_OR_OWNER \u003d \u0027rule:admin_or_owner\u0027"},{"line_number":18,"context_line":"RULE_ANY \u003d \u0027\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"rules \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_b7520adc","line":18,"in_reply_to":"da36d5c6_61e4510d","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"}],"keystone/policies/service.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    policy.RuleDefault(name\u003dbase.IDENTITY % \u0027update_service\u0027,"},{"line_number":25,"context_line":"                       check_str\u003dbase.RULE_ADMIN_REQUIRED),"},{"line_number":26,"context_line":"    policy.RuleDefault(name\u003dbase.IDENTITY % \u0027delete_service\u0027,"},{"line_number":27,"context_line":"                       check_str\u003dbase.RULE_ADMIN_REQUIRED)"},{"line_number":28,"context_line":"]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_e1be81d3","line":27,"updated":"2017-02-18 17:17:15.000000000","message":"I love how clean this looks, nice work!","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    policy.RuleDefault(name\u003dbase.IDENTITY % \u0027update_service\u0027,"},{"line_number":25,"context_line":"                       check_str\u003dbase.RULE_ADMIN_REQUIRED),"},{"line_number":26,"context_line":"    policy.RuleDefault(name\u003dbase.IDENTITY % \u0027delete_service\u0027,"},{"line_number":27,"context_line":"                       check_str\u003dbase.RULE_ADMIN_REQUIRED)"},{"line_number":28,"context_line":"]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_d75dbeed","line":27,"in_reply_to":"da36d5c6_e1be81d3","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"}],"keystone/policy/backends/rules.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def register_rules(enforcer):"},{"line_number":75,"context_line":"    enforcer.register_defaults(policies.list_rules())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class Policy(base.PolicyDriverBase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_c1b97dee","line":75,"updated":"2017-02-18 17:17:15.000000000","message":"Same comment here as in base.py.","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def register_rules(enforcer):"},{"line_number":75,"context_line":"    enforcer.register_defaults(policies.list_rules())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class Policy(base.PolicyDriverBase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_f762c2ac","line":75,"in_reply_to":"da36d5c6_c1b97dee","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"}],"keystone/tests/unit/test_policy.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def _load_entries(self, filename):"},{"line_number":177,"context_line":"        return set(json.load(open(filename)))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def add_missing_default_rules(self, rules):"},{"line_number":180,"context_line":"        \"\"\"Add default rules and their values to the given rules dict."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        The given rulen dict may have an incomplete set of policy rules."}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_a1c5695c","line":179,"updated":"2017-02-18 17:17:15.000000000","message":"nit: This is only being used from within this class, meaning it would be a great candidate for private method naming:\n\n  def _add_missing_default_rules(self, rules)","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def _load_entries(self, filename):"},{"line_number":177,"context_line":"        return set(json.load(open(filename)))"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def add_missing_default_rules(self, rules):"},{"line_number":180,"context_line":"        \"\"\"Add default rules and their values to the given rules dict."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        The given rulen dict may have an incomplete set of policy rules."}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_175836fa","line":179,"in_reply_to":"da36d5c6_a1c5695c","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def add_missing_default_rules(self, rules):"},{"line_number":180,"context_line":"        \"\"\"Add default rules and their values to the given rules dict."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        The given rulen dict may have an incomplete set of policy rules."},{"line_number":183,"context_line":"        This method will add the default policy rules and their values to the"},{"line_number":184,"context_line":"        dict. It will not override the existing rules."},{"line_number":185,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_c1a09da8","line":182,"updated":"2017-02-18 17:17:15.000000000","message":"rules*","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def add_missing_default_rules(self, rules):"},{"line_number":180,"context_line":"        \"\"\"Add default rules and their values to the given rules dict."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        The given rulen dict may have an incomplete set of policy rules."},{"line_number":183,"context_line":"        This method will add the default policy rules and their values to the"},{"line_number":184,"context_line":"        dict. It will not override the existing rules."},{"line_number":185,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_375d3aea","line":182,"in_reply_to":"da36d5c6_c1a09da8","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        The given rulen dict may have an incomplete set of policy rules."},{"line_number":183,"context_line":"        This method will add the default policy rules and their values to the"},{"line_number":184,"context_line":"        dict. It will not override the existing rules."},{"line_number":185,"context_line":"        \"\"\""},{"line_number":186,"context_line":"        for rule in policies.list_rules():"},{"line_number":187,"context_line":"            if rule.name not in rules:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_21b099f4","line":184,"updated":"2017-02-18 17:17:15.000000000","message":"We could also elaborate that this is only needed while we transition from testing policy.json to in-code defaults. I assume once all of our defaults are in code, we won\u0027t need this utility anymore.","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        The given rulen dict may have an incomplete set of policy rules."},{"line_number":183,"context_line":"        This method will add the default policy rules and their values to the"},{"line_number":184,"context_line":"        dict. It will not override the existing rules."},{"line_number":185,"context_line":"        \"\"\""},{"line_number":186,"context_line":"        for rule in policies.list_rules():"},{"line_number":187,"context_line":"            if rule.name not in rules:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_776fb292","line":184,"in_reply_to":"da36d5c6_21b099f4","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8382a3a396846f29baa23c418540b1b9bdecd350","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                       \u0027is_admin_project\u0027: True, \u0027project_id\u0027: None,"},{"line_number":215,"context_line":"                       \u0027domain_id\u0027: uuid.uuid4().hex}"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        rules.init()"},{"line_number":218,"context_line":"        result \u003d rules._ENFORCER.enforce(action, target, credentials)"},{"line_number":219,"context_line":"        self.assertTrue(result)"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_21b979ea","line":217,"updated":"2017-02-18 17:17:15.000000000","message":"We should add a comment here that explains what this .init() is doing.","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8b231f5078cf914a77100f49cf51083cd622c3dc","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                       \u0027is_admin_project\u0027: True, \u0027project_id\u0027: None,"},{"line_number":215,"context_line":"                       \u0027domain_id\u0027: uuid.uuid4().hex}"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        rules.init()"},{"line_number":218,"context_line":"        result \u003d rules._ENFORCER.enforce(action, target, credentials)"},{"line_number":219,"context_line":"        self.assertTrue(result)"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_976c269e","line":217,"in_reply_to":"da36d5c6_21b979ea","updated":"2017-02-19 06:33:06.000000000","message":"Done","commit_id":"1e86f96d88930b8f40103728ea0d8bd22b693046"}]}
