)]}'
{"cloudkitty/common/policies/base.py":[{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"02736872208166ce1dc7e2c351b66ac880fd36ed","unresolved":false,"context_lines":[{"line_number":19,"context_line":"                       description\u003d\u0027Legacy rule for cloud admin access\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027admin_or_owner\u0027,"},{"line_number":21,"context_line":"                       \u0027is_admin:True or tenant:%(tenant_id)s\u0027,"},{"line_number":22,"context_line":"                       description\u003d\u0027Admin or owner API access\u0027),"},{"line_number":23,"context_line":"    policy.RuleDefault(\u0027default\u0027,"},{"line_number":24,"context_line":"                       \u0027\u0027,"},{"line_number":25,"context_line":"                       description\u003d\u0027Default API access rule\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_2f4f216c","line":22,"range":{"start_line":22,"start_character":36,"end_line":22,"end_character":61},"updated":"2017-02-07 07:25:39.000000000","message":"I suggest change the description to something like this \"Rule for cloud admin or owner access\".","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":15917,"name":"Aaron-DH","email":"344677472@qq.com","username":"aaron"},"change_message_id":"7da8c386438bdb7fb3441d78aa1954b81b94b8f1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"                       description\u003d\u0027Legacy rule for cloud admin access\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027admin_or_owner\u0027,"},{"line_number":21,"context_line":"                       \u0027is_admin:True or tenant:%(tenant_id)s\u0027,"},{"line_number":22,"context_line":"                       description\u003d\u0027Admin or owner API access\u0027),"},{"line_number":23,"context_line":"    policy.RuleDefault(\u0027default\u0027,"},{"line_number":24,"context_line":"                       \u0027\u0027,"},{"line_number":25,"context_line":"                       description\u003d\u0027Default API access rule\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_aa8bffc1","line":22,"range":{"start_line":22,"start_character":36,"end_line":22,"end_character":61},"in_reply_to":"1a430d35_2f4f216c","updated":"2017-02-07 08:22:31.000000000","message":"Done","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"76ad557e4ace9e629f033b8e54db594454ecfca4","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027context_is_admin\u0027,"},{"line_number":18,"context_line":"                       \u0027role:admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027Rule for cloud admin access\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027admin_or_owner\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f515b1d_2253376d","line":17,"range":{"start_line":17,"start_character":11,"end_line":17,"end_character":22},"updated":"2017-10-02 14:17:29.000000000","message":"Using DocumentedRuleDefault instead of RuleDefault give you even more tools to describe policies. You can find an example of how keystone employed it here:\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/policies/user.py#L17-L25","commit_id":"835fce0e609660b64ada238ce99c23b0fe7069bc"}],"cloudkitty/common/policies/collector.py":[{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"02736872208166ce1dc7e2c351b66ac880fd36ed","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027collector:list_mappings\u0027,"},{"line_number":18,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027List all services mapped to a collector\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027collector:get_mapping\u0027,"},{"line_number":21,"context_line":"                       \u0027rule:context_is_admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_8f44951b","line":18,"range":{"start_line":18,"start_character":24,"end_line":18,"end_character":45},"updated":"2017-02-07 07:25:39.000000000","message":"Why you change the default rule here? [1]\nAlthrough they are equal logically, I would prefer we keep it as original.\nPlease check the whole patch for this change!\n[1] https://github.com/openstack/cloudkitty/blob/master/etc/cloudkitty/policy.json#L19","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":15917,"name":"Aaron-DH","email":"344677472@qq.com","username":"aaron"},"change_message_id":"7da8c386438bdb7fb3441d78aa1954b81b94b8f1","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027collector:list_mappings\u0027,"},{"line_number":18,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027List all services mapped to a collector\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027collector:get_mapping\u0027,"},{"line_number":21,"context_line":"                       \u0027rule:context_is_admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_6a3917f2","line":18,"range":{"start_line":18,"start_character":24,"end_line":18,"end_character":45},"in_reply_to":"1a430d35_8f44951b","updated":"2017-02-07 08:22:31.000000000","message":"done.\ni have noticed this and meant to keep consistent:)","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"02736872208166ce1dc7e2c351b66ac880fd36ed","unresolved":false,"context_lines":[{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027collector:list_mappings\u0027,"},{"line_number":18,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027List all services mapped to a collector\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027collector:get_mapping\u0027,"},{"line_number":21,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":22,"context_line":"                       description\u003d\u0027Get a service to collector mapping\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_0fed05ef","line":19,"range":{"start_line":19,"start_character":36,"end_line":19,"end_character":75},"updated":"2017-02-07 07:25:39.000000000","message":"How about this \"Access rule for listing all services mapped to a collector\"? The same to other descriptions in this patch.","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":15917,"name":"Aaron-DH","email":"344677472@qq.com","username":"aaron"},"change_message_id":"7da8c386438bdb7fb3441d78aa1954b81b94b8f1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027collector:list_mappings\u0027,"},{"line_number":18,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027List all services mapped to a collector\u0027),"},{"line_number":20,"context_line":"    policy.RuleDefault(\u0027collector:get_mapping\u0027,"},{"line_number":21,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":22,"context_line":"                       description\u003d\u0027Get a service to collector mapping\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_0a2b3395","line":19,"range":{"start_line":19,"start_character":36,"end_line":19,"end_character":75},"in_reply_to":"1a430d35_0fed05ef","updated":"2017-02-07 08:22:31.000000000","message":"done all","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"02736872208166ce1dc7e2c351b66ac880fd36ed","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    policy.RuleDefault(\u0027collector:get_mapping\u0027,"},{"line_number":21,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":22,"context_line":"                       description\u003d\u0027Get a service to collector mapping\u0027),"},{"line_number":23,"context_line":"    policy.RuleDefault(\u0027collector:manage_mappings\u0027,"},{"line_number":24,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":25,"context_line":"                       description\u003d\u0027Manage all services to collector mapping\u0027),"},{"line_number":26,"context_line":"    policy.RuleDefault(\u0027collector:get_state\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_2f84815c","line":23,"range":{"start_line":23,"start_character":24,"end_line":23,"end_character":49},"updated":"2017-02-07 07:25:39.000000000","message":"The rule name used in collector api is actually \"collector:manage_mapping\", and you\u0027ve uploaded a fix for that https://review.openstack.org/#/c/429247/","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":15917,"name":"Aaron-DH","email":"344677472@qq.com","username":"aaron"},"change_message_id":"7da8c386438bdb7fb3441d78aa1954b81b94b8f1","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    policy.RuleDefault(\u0027collector:get_mapping\u0027,"},{"line_number":21,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":22,"context_line":"                       description\u003d\u0027Get a service to collector mapping\u0027),"},{"line_number":23,"context_line":"    policy.RuleDefault(\u0027collector:manage_mappings\u0027,"},{"line_number":24,"context_line":"                       \u0027rule:context_is_admin\u0027,"},{"line_number":25,"context_line":"                       description\u003d\u0027Manage all services to collector mapping\u0027),"},{"line_number":26,"context_line":"    policy.RuleDefault(\u0027collector:get_state\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a430d35_957104ab","line":23,"range":{"start_line":23,"start_character":24,"end_line":23,"end_character":49},"in_reply_to":"1a430d35_2f84815c","updated":"2017-02-07 08:22:31.000000000","message":"done\nIn this case, patch https://review.openstack.org/#/c/429247/ is unnecessary.","commit_id":"84fbb9f9ef62d529fa7b8e0f9db0fe0098544e71"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"76ad557e4ace9e629f033b8e54db594454ecfca4","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027collector:list_mappings\u0027,"},{"line_number":18,"context_line":"                       \u0027role:admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027Access rule for listing all services \u0027"},{"line_number":20,"context_line":"                                   \u0027mapped to a collector\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f515b1d_42063354","line":17,"range":{"start_line":17,"start_character":23,"end_line":17,"end_character":49},"updated":"2017-10-02 14:17:29.000000000","message":"One thing we found helpful for readability was using kwargs when creating DocumentedRuleDefault policies:\n\n  policy.RuleDefault(\n      name\u003d\u0027collector:list_mappings\u0027,\n      check_str\u003d\u0027role:admin\u0027,\n      description\u003d\u0027Access rule for listing all ...\u0027\n      operations\u003d[\n          {\n              \u0027path\u0027: \u0027/path/to/resource\u0027\n              \u0027method\u0027: \u0027GET\u0027\n          }\n      ]\n  )","commit_id":"835fce0e609660b64ada238ce99c23b0fe7069bc"}],"cloudkitty/common/policies/info.py":[{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"2d6f56681abe731ea8b4167ca8086b477ded96ac","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    policy.RuleDefault(\u0027info:get_service_info\u0027,"},{"line_number":22,"context_line":"                       \u0027\u0027,"},{"line_number":23,"context_line":"                       description\u003d\u0027Access rule for getting a service \u0027"},{"line_number":24,"context_line":"                                   \u0027detail info\u0027),"},{"line_number":25,"context_line":"    policy.RuleDefault(\u0027info:get_config\u0027,"},{"line_number":26,"context_line":"                       \u0027\u0027,"},{"line_number":27,"context_line":"                       description\u003d\u0027Access rule for getting config info\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a430d35_e4ae1be5","line":24,"range":{"start_line":24,"start_character":36,"end_line":24,"end_character":42},"updated":"2017-02-07 09:25:48.000000000","message":"detailed","commit_id":"04356f5b20a9c1d3dc2ff6e8b904a669f258e9cc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"76ad557e4ace9e629f033b8e54db594454ecfca4","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027info:list_services_info\u0027,"},{"line_number":18,"context_line":"                       \u0027\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027Access rule for listing all \u0027"},{"line_number":20,"context_line":"                                   \u0027services info\u0027),"},{"line_number":21,"context_line":"    policy.RuleDefault(\u0027info:get_service_info\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f515b1d_62b92f77","line":18,"range":{"start_line":18,"start_character":23,"end_line":18,"end_character":26},"updated":"2017-10-02 14:17:29.000000000","message":"Another thing that might be helpful is naming this so that its easier for developer to know what this special value means.\n\n  UNPROTECTED_POLICY \u003d \u0027\u0027\n  \u003csnip\u003e\n  policy.DocumentedRuleDefault(\n      name\u003d\u0027info:list_services_info\u0027,\n      check_str\u003dUNPROTECTED_POLICY,\n      description\u003d\u0027....\u0027,\n      operations\u003d[..]\n  )","commit_id":"835fce0e609660b64ada238ce99c23b0fe7069bc"}],"cloudkitty/common/policies/rating.py":[{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"2d6f56681abe731ea8b4167ca8086b477ded96ac","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    policy.RuleDefault(\u0027rating:get_module\u0027,"},{"line_number":22,"context_line":"                       \u0027role:admin\u0027,"},{"line_number":23,"context_line":"                       description\u003d\u0027Access rule for getting a rating \u0027"},{"line_number":24,"context_line":"                                   \u0027module detail info\u0027),"},{"line_number":25,"context_line":"    policy.RuleDefault(\u0027rating:update_module\u0027,"},{"line_number":26,"context_line":"                       \u0027role:admin\u0027,"},{"line_number":27,"context_line":"                       description\u003d\u0027Access rule for updating a rating \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a430d35_847ab775","line":24,"range":{"start_line":24,"start_character":43,"end_line":24,"end_character":49},"updated":"2017-02-07 09:25:48.000000000","message":"detailed","commit_id":"04356f5b20a9c1d3dc2ff6e8b904a669f258e9cc"},{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"2d6f56681abe731ea8b4167ca8086b477ded96ac","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                                   \u0027module info\u0027),"},{"line_number":29,"context_line":"    policy.RuleDefault(\u0027rating:quote\u0027,"},{"line_number":30,"context_line":"                       \u0027\u0027,"},{"line_number":31,"context_line":"                       description\u003d\u0027Access rule for computing rating \u0027"},{"line_number":32,"context_line":"                                   \u0027informations from data\u0027),"},{"line_number":33,"context_line":"    policy.RuleDefault(\u0027rating:module_config\u0027,"},{"line_number":34,"context_line":"                       \u0027role:admin\u0027,"},{"line_number":35,"context_line":"                       description\u003d\u0027Access rule for managing all \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a430d35_f07fb6a8","line":32,"range":{"start_line":31,"start_character":36,"end_line":32,"end_character":58},"updated":"2017-02-07 09:25:48.000000000","message":"How about this \"Access rule for calculating an instant quote based on multiple resource descriptions\"?\nI just copy from the description in the code there.","commit_id":"04356f5b20a9c1d3dc2ff6e8b904a669f258e9cc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"76ad557e4ace9e629f033b8e54db594454ecfca4","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"rules \u003d ["},{"line_number":17,"context_line":"    policy.RuleDefault(\u0027rating:list_modules\u0027,"},{"line_number":18,"context_line":"                       \u0027role:admin\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027Access rule for listing all rating \u0027"},{"line_number":20,"context_line":"                                   \u0027modules info\u0027),"},{"line_number":21,"context_line":"    policy.RuleDefault(\u0027rating:get_module\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f515b1d_02aa7b17","line":18,"range":{"start_line":18,"start_character":23,"end_line":18,"end_character":36},"updated":"2017-10-02 14:17:29.000000000","message":"You can also define common policy roles or rules in your base policy module and import them where you use them. For keystone, this made it so that we know we\u0027re using the same thing everywhere.\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/policies/user.py#L20\nand\nhttps://github.com/openstack/keystone/blob/master/keystone/common/policies/base.py#L17","commit_id":"835fce0e609660b64ada238ce99c23b0fe7069bc"}],"cloudkitty/common/policies/storage.py":[{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"2d6f56681abe731ea8b4167ca8086b477ded96ac","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    policy.RuleDefault(\u0027storage:list_data_frames\u0027,"},{"line_number":18,"context_line":"                       \u0027\u0027,"},{"line_number":19,"context_line":"                       description\u003d\u0027Access rule for listing rated \u0027"},{"line_number":20,"context_line":"                                   \u0027date resources\u0027),"},{"line_number":21,"context_line":"]"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a430d35_a4f6d3f6","line":20,"range":{"start_line":20,"start_character":36,"end_line":20,"end_character":40},"updated":"2017-02-07 09:25:48.000000000","message":"data","commit_id":"04356f5b20a9c1d3dc2ff6e8b904a669f258e9cc"}],"etc/cloudkitty/policy.json":[{"author":{"_account_id":21797,"name":"Jeremy Liu","display_name":"Jeremy Liu","email":"liujiong.cc@gmail.com","username":"liujiong"},"change_message_id":"2d6f56681abe731ea8b4167ca8086b477ded96ac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# leave this file empty to use default policy defined in code."},{"line_number":2,"context_line":"{"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"}"}],"source_content_type":"application/json","patch_set":4,"id":"1a430d35_64806bc1","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":1},"updated":"2017-02-07 09:25:48.000000000","message":"I suggest you just delete this file from git, so we won\u0027t maintain it in the future. And don\u0027t forget updating .gitignore.","commit_id":"04356f5b20a9c1d3dc2ff6e8b904a669f258e9cc"}],"releasenotes/notes/oslopolicy-genscripts-957b364b8ffd7c3f.yaml":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"76ad557e4ace9e629f033b8e54db594454ecfca4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Maintenance the policy rules in code and add an oslo.policy CLI script"},{"line_number":4,"context_line":"    in tox to generate policy sample file."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    The script can be called like"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"7f515b1d_c265831f","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":15},"updated":"2017-10-02 14:17:29.000000000","message":"Maintain*?","commit_id":"835fce0e609660b64ada238ce99c23b0fe7069bc"}]}
