)]}'
{"gnocchi/rest/__init__.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7945cb39a9d403e31fc465500dd8d8dfa3a02210","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":112,"context_line":"    def get_all(self):"},{"line_number":113,"context_line":"        return pecan.request.indexer.list_resources(\u0027archive_policy\u0027)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"class EntityController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da9df570_21babade","line":113,"updated":"2014-09-22 17:32:40.000000000","message":"Do we also need some way of querying archive policy by name?\n\n(Seeing as there are likely to relatively few of them, in the style of nova flavors, it would be convenient to be able refer to them by name)\n\nOr even more convenient, allowing the creation of an entity take an archive policy name to avoid the caller having to retrieve the archive policy UUID first.","commit_id":"1dd1e0eab5e1f7ba7bc82ba94a8be281b3515022"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"adfc523ddad8cd463fdcb67385d513d867ddd8d6","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        voluptuous.Required(\"definition\"):"},{"line_number":95,"context_line":"        voluptuous.All([{"},{"line_number":96,"context_line":"            voluptuous.Required(\"granularity\"): PositiveNotNullInt,"},{"line_number":97,"context_line":"            voluptuous.Required(\"points\"): PositiveNotNullInt,"},{"line_number":98,"context_line":"        }],"},{"line_number":99,"context_line":"                       voluptuous.Length(min\u003d1)),"},{"line_number":100,"context_line":"    })"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_50796192","line":97,"updated":"2014-09-29 12:45:04.000000000","message":"Totally unrelated to the current patch, but just checking that my understanding of \"points\" in this context is correct ... it\u0027s the number of contiguous periods for which we retain data, right?","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"cfc28a1468a42142c3eb25dfdec53e68a8f65658","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        voluptuous.Required(\"definition\"):"},{"line_number":95,"context_line":"        voluptuous.All([{"},{"line_number":96,"context_line":"            voluptuous.Required(\"granularity\"): PositiveNotNullInt,"},{"line_number":97,"context_line":"            voluptuous.Required(\"points\"): PositiveNotNullInt,"},{"line_number":98,"context_line":"        }],"},{"line_number":99,"context_line":"                       voluptuous.Length(min\u003d1)),"},{"line_number":100,"context_line":"    })"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_b07b6d28","line":97,"in_reply_to":"baa201ad_50796192","updated":"2014-09-29 12:56:43.000000000","message":"Yes.","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"adfc523ddad8cd463fdcb67385d513d867ddd8d6","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    @staticmethod"},{"line_number":103,"context_line":"    @vexpose(ArchivePolicy, \u0027json\u0027)"},{"line_number":104,"context_line":"    def post(body):"},{"line_number":105,"context_line":"        # TODO(jd) Use policy to limit which user can create a policy"},{"line_number":106,"context_line":"        try:"},{"line_number":107,"context_line":"            ap \u003d pecan.request.indexer.create_archive_policy(**body)"},{"line_number":108,"context_line":"        except indexer.ArchivePolicyAlreadyExists as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_d03631e7","line":105,"updated":"2014-09-29 12:45:04.000000000","message":"\"Use *policy* to limit which user can create a policy\"\n\nsounds a bit circular, would that be clearer as:\n\n\"Use RBAC policy to limit which user can create an archive policy\"","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"cfc28a1468a42142c3eb25dfdec53e68a8f65658","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    @staticmethod"},{"line_number":103,"context_line":"    @vexpose(ArchivePolicy, \u0027json\u0027)"},{"line_number":104,"context_line":"    def post(body):"},{"line_number":105,"context_line":"        # TODO(jd) Use policy to limit which user can create a policy"},{"line_number":106,"context_line":"        try:"},{"line_number":107,"context_line":"            ap \u003d pecan.request.indexer.create_archive_policy(**body)"},{"line_number":108,"context_line":"        except indexer.ArchivePolicyAlreadyExists as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_7099056e","line":105,"in_reply_to":"baa201ad_d03631e7","updated":"2014-09-29 12:56:43.000000000","message":"Done","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"}],"gnocchi/tests/test_rest.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"adfc523ddad8cd463fdcb67385d513d867ddd8d6","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        result \u003d self.app.post_json("},{"line_number":96,"context_line":"            \"/v1/archive_policy\","},{"line_number":97,"context_line":"            params\u003d{\"name\": \"high\","},{"line_number":98,"context_line":"                    \"definition\": \"foobar\"},"},{"line_number":99,"context_line":"            expect_errors\u003dTrue,"},{"line_number":100,"context_line":"            status\u003d400)"},{"line_number":101,"context_line":"        self.assertIn(\u0027Invalid input: expected a list \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_4d1d4e73","line":98,"updated":"2014-09-29 12:45:04.000000000","message":"To isolate this test case to to the duplicate name case, should the broken definition \"foobar\" be replaced with the expected [{\"granularity\": 60, \"points\": 24*60}] style?\n\n(Also that should give rise to a more meaningful error text than \"expected a list ...\")","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"da56feaf17bd257532d32169e16b280953b266a3","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        result \u003d self.app.post_json("},{"line_number":96,"context_line":"            \"/v1/archive_policy\","},{"line_number":97,"context_line":"            params\u003d{\"name\": \"high\","},{"line_number":98,"context_line":"                    \"definition\": \"foobar\"},"},{"line_number":99,"context_line":"            expect_errors\u003dTrue,"},{"line_number":100,"context_line":"            status\u003d400)"},{"line_number":101,"context_line":"        self.assertIn(\u0027Invalid input: expected a list \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_6b0afad3","line":98,"in_reply_to":"baa201ad_10aa7970","updated":"2014-09-29 13:20:33.000000000","message":"From the CI failure, looks like just changing to a proper archive policy definition in this POST gives rise to a more meaningful error:\n\n  409 Conflict\n  There was a conflict when trying to complete your request.\n  Archive policy high already exists","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"cfc28a1468a42142c3eb25dfdec53e68a8f65658","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        result \u003d self.app.post_json("},{"line_number":96,"context_line":"            \"/v1/archive_policy\","},{"line_number":97,"context_line":"            params\u003d{\"name\": \"high\","},{"line_number":98,"context_line":"                    \"definition\": \"foobar\"},"},{"line_number":99,"context_line":"            expect_errors\u003dTrue,"},{"line_number":100,"context_line":"            status\u003d400)"},{"line_number":101,"context_line":"        self.assertIn(\u0027Invalid input: expected a list \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_10aa7970","line":98,"in_reply_to":"baa201ad_4d1d4e73","updated":"2014-09-29 12:56:43.000000000","message":"Right!\n\nThe error is from voluptuous and kinda generic to all errors we raised. Not sure how to improve it?","commit_id":"cc1b4821d71f1c5cc48e2a9a7e3059c1000e0767"}]}
