)]}'
{"cinder/api/v3/snapshots.py":[{"author":{"_account_id":19774,"name":"Vivek Agrawal","email":"vivek.agrawal@veritas.com","username":"viveksagrawal"},"change_message_id":"f7415c4c67c0aa60c64fc38b7f76a03ed99e2f76","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":117,"context_line":"        filters \u003d req.params.copy()"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        allowed_search_options \u003d (\u0027status\u0027, \u0027volume_id\u0027, \u0027name\u0027)"},{"line_number":120,"context_line":"        utils.remove_invalid_filter_options(context, filters,"},{"line_number":121,"context_line":"                                            allowed_search_options)"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_3e80a746","line":119,"updated":"2017-02-01 18:59:09.000000000","message":"Use self._process_filters() instead. This has 2 advantages\n1. This is a high level API as it is giving summary. Filtering over such high level APIs becomes consistent.\n2. We should reuse the code already written. If you see process_filters does the exact same thing of removing unwanted options.","commit_id":"e5748b0ab5d35f2bc6738b572bb6966fad177d30"},{"author":{"_account_id":19774,"name":"Vivek Agrawal","email":"vivek.agrawal@veritas.com","username":"viveksagrawal"},"change_message_id":"63ba33e9186e964ca948f9a8e84a387eecb9abb3","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        filters \u003d req.params.copy()"},{"line_number":118,"context_line":"        search_opts \u003d req.GET.copy()"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        self._process_filters(req, context, search_opts)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        snapshots \u003d self.volume_api.get_snapshot_summary(context,"},{"line_number":123,"context_line":"                                                         filters\u003dfilters)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ffe62b97_c3747200","line":120,"updated":"2017-03-30 01:01:09.000000000","message":"Thanks for accommodating comments...\n\nWe are processing search_opts and passing filters? Am I missing something here?\n\nIt will also be nice to see a test case for summary with filters applied.","commit_id":"b4f8a32cc15653c57ed157dc30437a84a178934d"}],"cinder/api/v3/views/snapshots.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"89a35b676cfc35ea212d69a2b8602516f78252db","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        return {"},{"line_number":39,"context_line":"            \u0027snapshot-summary\u0027: {"},{"line_number":40,"context_line":"                \u0027total_count\u0027: snapshot_count,"},{"line_number":41,"context_line":"                \u0027total_size\u0027: snapshot_size"},{"line_number":42,"context_line":"            },"},{"line_number":43,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_267408fc","line":41,"updated":"2017-01-25 11:02:00.000000000","message":"Missing comma at the end.\n\nhttp://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"e21df6232caeebbe35d57572b62f73856b0377e1"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":2651,"context_line":""},{"line_number":2652,"context_line":""},{"line_number":2653,"context_line":"@require_admin_context"},{"line_number":2654,"context_line":"def get_snapshot_summary_all(context):"},{"line_number":2655,"context_line":"    \"\"\"Retrieves all snapshot summary."},{"line_number":2656,"context_line":""},{"line_number":2657,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_a7a47b08","line":2654,"range":{"start_line":2654,"start_character":4,"end_line":2654,"end_character":28},"updated":"2016-12-08 12:57:48.000000000","message":"This method is missing unit tests.","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":2662,"context_line":"                        read_deleted\u003d\"no\")"},{"line_number":2663,"context_line":""},{"line_number":2664,"context_line":"    if query is None:"},{"line_number":2665,"context_line":"        return []"},{"line_number":2666,"context_line":""},{"line_number":2667,"context_line":"    result \u003d query.first()"},{"line_number":2668,"context_line":"    return (result[0] or 0, result[1] or 0)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_74176f54","line":2665,"range":{"start_line":2665,"start_character":15,"end_line":2665,"end_character":17},"updated":"2016-12-08 12:57:48.000000000","message":"Would be better to return an empty tuple:\n\n        return ()","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":""},{"line_number":2671,"context_line":"@require_context"},{"line_number":2672,"context_line":"def get_snapshot_summary_by_project(context, project_id):"},{"line_number":2673,"context_line":"    \"\"\"Retrieves all snapshot summary in a project."},{"line_number":2674,"context_line":""},{"line_number":2675,"context_line":"    :param context: context to query under"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_47b6473e","line":2672,"range":{"start_line":2672,"start_character":4,"end_line":2672,"end_character":35},"updated":"2016-12-08 12:57:48.000000000","message":"This method is missing unit tests.","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":2676,"context_line":"    :param project_id: project for all volumes being retrieved"},{"line_number":2677,"context_line":"    :returns: snapshot summary of a project"},{"line_number":2678,"context_line":"    \"\"\""},{"line_number":2679,"context_line":"    query \u003d model_query(context, func.count(models.Snapshot.id),"},{"line_number":2680,"context_line":"                        func.sum(models.Snapshot.volume_size), read_deleted\u003d\"no\").\\"},{"line_number":2681,"context_line":"        filter_by(project_id\u003dproject_id)"},{"line_number":2682,"context_line":""},{"line_number":2683,"context_line":"    if query is None:"},{"line_number":2684,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_b43ae7e5","line":2681,"range":{"start_line":2679,"start_character":0,"end_line":2681,"end_character":40},"updated":"2016-12-08 12:57:48.000000000","message":"Please wrap lines using parentheses instead of backslash. Also line 2680 is longer than 79 characters - this shouldn\u0027t pass pep8. Maybe:\n\n    query \u003d model_query(context, func.count(models.Snapshot.id),\n                        func.sum(models.Snapshot.volume_size),\n                        read_deleted\u003d\"no\")\n    query \u003d query.filter_by(project_id\u003dproject_id)","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":2681,"context_line":"        filter_by(project_id\u003dproject_id)"},{"line_number":2682,"context_line":""},{"line_number":2683,"context_line":"    if query is None:"},{"line_number":2684,"context_line":"        return []"},{"line_number":2685,"context_line":""},{"line_number":2686,"context_line":"    result \u003d query.first()"},{"line_number":2687,"context_line":"    return (result[0] or 0, result[1] or 0)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_d4168354","line":2684,"range":{"start_line":2684,"start_character":0,"end_line":2684,"end_character":17},"updated":"2016-12-08 12:57:48.000000000","message":"return ()","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"89a35b676cfc35ea212d69a2b8602516f78252db","unresolved":false,"context_lines":[{"line_number":2918,"context_line":""},{"line_number":2919,"context_line":"@require_context"},{"line_number":2920,"context_line":"def get_snapshot_summary_by_project(context, project_id):"},{"line_number":2921,"context_line":"    \"\"\"Retrieves all snapshot summary in a project."},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"    :param context: context to query under"},{"line_number":2924,"context_line":"    :param project_id: project for all volumes being retrieved"},{"line_number":2925,"context_line":"    :returns: snapshot summary of a project"},{"line_number":2926,"context_line":"    \"\"\""},{"line_number":2927,"context_line":"    query \u003d model_query(context, func.count(models.Snapshot.id),"},{"line_number":2928,"context_line":"                        func.sum(models.Snapshot.volume_size),"},{"line_number":2929,"context_line":"                        read_deleted\u003d\"no\")"},{"line_number":2930,"context_line":"    query \u003d query.filter_by(project_id\u003dproject_id)"},{"line_number":2931,"context_line":""},{"line_number":2932,"context_line":"    if query is None:"},{"line_number":2933,"context_line":"        return ()"},{"line_number":2934,"context_line":""},{"line_number":2935,"context_line":"    result \u003d query.first()"},{"line_number":2936,"context_line":"    return (result[0] or 0, result[1] or 0)"},{"line_number":2937,"context_line":""},{"line_number":2938,"context_line":""},{"line_number":2939,"context_line":"def _snaps_get_query(context, session\u003dNone, project_only\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_66c0d0e1","line":2936,"range":{"start_line":2921,"start_character":0,"end_line":2936,"end_character":43},"updated":"2017-01-25 11:02:00.000000000","message":"A lot of code here is duplicated in get_snapshot_summary_all. You should reuse this method with e.g. project_id\u003dNone in previous method.","commit_id":"e21df6232caeebbe35d57572b62f73856b0377e1"}],"cinder/objects/snapshot.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        return base.obj_make_list(context, cls(context), objects.Snapshot,"},{"line_number":329,"context_line":"                                  snapshots, expected_attrs\u003dexpected_attrs)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    @classmethod"},{"line_number":332,"context_line":"    def get_snapshot_summary_all(cls, context):"},{"line_number":333,"context_line":"        snapshots \u003d db.get_snapshot_summary_all(context)"},{"line_number":334,"context_line":"        return snapshots"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    @classmethod"},{"line_number":337,"context_line":"    def get_snapshot_summary_by_project(cls, context, project_id):"},{"line_number":338,"context_line":"        snapshots \u003d db.get_snapshot_summary_by_project(context, project_id)"},{"line_number":339,"context_line":"        return snapshots"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_6781834d","line":339,"range":{"start_line":331,"start_character":0,"end_line":339,"end_character":24},"updated":"2016-12-08 12:57:48.000000000","message":"These methods are missing unit tests.","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"}],"cinder/tests/unit/api/v3/test_snapshots.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            \"volume_id\": volume.id,"},{"line_number":106,"context_line":"            \"force\": False,"},{"line_number":107,"context_line":"            \"name\": snapshot_name,"},{"line_number":108,"context_line":"            \"description\": snapshot_description"},{"line_number":109,"context_line":"        }"},{"line_number":110,"context_line":"        body \u003d dict(snapshot\u003dsnapshot)"},{"line_number":111,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v3/snapshots\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_0710cf4d","line":108,"updated":"2016-12-08 12:57:48.000000000","message":"Missing comma: http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            \"description\": snapshot_description"},{"line_number":109,"context_line":"        }"},{"line_number":110,"context_line":"        body \u003d dict(snapshot\u003dsnapshot)"},{"line_number":111,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v3/snapshots\u0027)"},{"line_number":112,"context_line":"        res_dict \u003d self.controller.create(req, body)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        req \u003d self._fake_snapshot_summary_request()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_0737efe3","line":111,"range":{"start_line":111,"start_character":39,"end_line":111,"end_character":52},"updated":"2016-12-08 12:57:48.000000000","message":"Shouldn\u0027t this be a different URL?","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"},{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"7075027254212fa0d2a443647b89302ad5f80920","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        # verify some snapshot is returned"},{"line_number":195,"context_line":"        self.assertNotEqual(0, len(res_dict[\u0027snapshots\u0027]))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def _snapshot_summary_admin_req(self, summ_url, version\u003d\u00273.24\u0027):"},{"line_number":198,"context_line":"        \"\"\"Function call to build request for admin context\"\"\""},{"line_number":199,"context_line":"        req \u003d fakes.HTTPRequest.blank(summ_url, use_admin_context\u003dTrue)"},{"line_number":200,"context_line":"        req.headers \u003d {\u0027OpenStack-API-Version\u0027: \u0027volume \u0027 + version}"},{"line_number":201,"context_line":"        req.api_version_request \u003d api_version.APIVersionRequest(version)"},{"line_number":202,"context_line":"        return req"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _snapshot_summary_non_admin_req(self, summ_url, version\u003d\u00273.24\u0027):"},{"line_number":205,"context_line":"        \"\"\"Function call to build request for non-admin context\"\"\""},{"line_number":206,"context_line":"        req \u003d fakes.HTTPRequest.blank(summ_url, use_admin_context\u003dFalse)"},{"line_number":207,"context_line":"        req.headers \u003d {\u0027OpenStack-API-Version\u0027: \u0027volume \u0027 + version}"},{"line_number":208,"context_line":"        req.api_version_request \u003d api_version.APIVersionRequest(version)"},{"line_number":209,"context_line":"        return req"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def test_snapshot_in_unsupport_version(self):"},{"line_number":212,"context_line":"        \"\"\"Function call to test summary snapshot API in unsupported version\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_7f901744","line":209,"range":{"start_line":197,"start_character":0,"end_line":209,"end_character":18},"updated":"2017-01-16 12:44:21.000000000","message":"-1\nIt\u0027s better to make use_admin_context as a parameter and not duplicate the same code","commit_id":"5aa864363de0acb4f186cec2d5222313fff03bff"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"89a35b676cfc35ea212d69a2b8602516f78252db","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        \"\"\"Create snapshot in Project1\"\"\""},{"line_number":224,"context_line":"        self._create_snapshot_in_tenant(fake.USER_ID, fake.PROJECT_ID)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        \"\"\"Create snapshot in Project2\"\"\""},{"line_number":227,"context_line":"        self._create_snapshot_in_tenant(fake.USER2_ID, fake.PROJECT2_ID)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        summ_url \u003d \u0027/v3/%s/snapshots/summary\u0027 % fake.PROJECT_ID"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_2655e81c","line":226,"range":{"start_line":226,"start_character":8,"end_line":226,"end_character":41},"updated":"2017-01-25 11:02:00.000000000","message":"nit: I think it\u0027s preferred to use # for simple inline comments.","commit_id":"e21df6232caeebbe35d57572b62f73856b0377e1"}],"cinder/volume/api.py":[{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"7075027254212fa0d2a443647b89302ad5f80920","unresolved":false,"context_lines":[{"line_number":629,"context_line":"        allTenants \u003d utils.get_bool_param(\u0027all_tenants\u0027, filters)"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        if context.is_admin and allTenants:"},{"line_number":632,"context_line":"            del filters[\u0027all_tenants\u0027]"},{"line_number":633,"context_line":"            snapshots \u003d objects.SnapshotList.get_snapshot_summary_all(context)"},{"line_number":634,"context_line":"        else:"},{"line_number":635,"context_line":"            snapshots \u003d objects.SnapshotList.get_snapshot_summary_by_project("}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_446e2e96","line":632,"range":{"start_line":632,"start_character":12,"end_line":632,"end_character":38},"updated":"2017-01-16 12:44:21.000000000","message":"What is the sense of this del, if filters aren\u0027t used further?","commit_id":"5aa864363de0acb4f186cec2d5222313fff03bff"}],"releasenotes/notes/snapshots-summary-01487ff196a5bc21.yaml":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"a00b31663a0373548d0033595e5663532458f3a0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - A new API to display the snapshots summary. This summary API displays the"},{"line_number":4,"context_line":"    total number of snapshots and total snapshots\u0027s size in GB."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"3a71b18c_e76753e8","line":4,"range":{"start_line":4,"start_character":40,"end_line":4,"end_character":51},"updated":"2016-12-08 12:57:48.000000000","message":"s/snapshots\u0027s/snapshots","commit_id":"d2083a39054daec422f4021b6799365bfc110ced"}]}
