)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"72d5dd9f3be78118c28e62003cc553e8e496a732","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Switch get_all_snapshots to use objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The following patch completes the conversion of snapshot"},{"line_number":10,"context_line":"APIs (get, update, delete) to use objects. It fixes a"},{"line_number":11,"context_line":"problem where SnapshotList could not be properly loaded"},{"line_number":12,"context_line":"because fields that are not part of the Snapshot model,"},{"line_number":13,"context_line":"i.e. name and volume_name, were not specified as"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a80dd14_0206041d","line":10,"updated":"2015-03-09 09:16:57.000000000","message":"Would you like to submit the fix as a bug?","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"d6bf37509d79b47855717262d899dbecdda90a99","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Switch get_all_snapshots to use objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The following patch completes the conversion of snapshot"},{"line_number":10,"context_line":"APIs (get, update, delete) to use objects. It fixes a"},{"line_number":11,"context_line":"problem where SnapshotList could not be properly loaded"},{"line_number":12,"context_line":"because fields that are not part of the Snapshot model,"},{"line_number":13,"context_line":"i.e. name and volume_name, were not specified as"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a80dd14_9ef6c48d","line":10,"in_reply_to":"9a80dd14_0206041d","updated":"2015-03-09 13:58:34.000000000","message":"Sure","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4ddf2703b646e2a0f052d54dda0801397c3c25b6","unresolved":false,"context_lines":[{"line_number":10,"context_line":"volume/api.py get_all_snapshots to use SnapshotList"},{"line_number":11,"context_line":"instead."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint cinder-objects"},{"line_number":14,"context_line":"Change-Id: Ifdccc81a087f9797fcfbf098d3ecea3875ad7bd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bab921fb_da4433b8","line":13,"updated":"2015-04-25 03:46:52.000000000","message":"This should be:\n\nPartial-Implements","commit_id":"f5770d83eef08c11d9e73daa99683a35de12fc23"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"94ab3dcb4fecad92d8f47a318775f739820e28f8","unresolved":false,"context_lines":[{"line_number":10,"context_line":"volume/api.py get_all_snapshots to use SnapshotList"},{"line_number":11,"context_line":"instead."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Implements: blueprint cinder-objects"},{"line_number":14,"context_line":"Change-Id: Ifdccc81a087f9797fcfbf098d3ecea3875ad7bd9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bab921fb_13326d5f","line":13,"in_reply_to":"bab921fb_da4433b8","updated":"2015-04-26 23:02:02.000000000","message":"Done","commit_id":"f5770d83eef08c11d9e73daa99683a35de12fc23"}],"cinder/objects/snapshot.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"72d5dd9f3be78118c28e62003cc553e8e496a732","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # NOTE(thangp): obj_extra_fields is used to hold properties that are not"},{"line_number":63,"context_line":"    # usually part of the model"},{"line_number":64,"context_line":"    obj_extra_fields \u003d [\u0027name\u0027, \u0027volume_name\u0027]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_22578803","line":64,"updated":"2015-03-09 09:16:57.000000000","message":"The fields.StringField(nullable\u003dTrue) is lost here. What if the field is not a string and need to specify a type?","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"d6bf37509d79b47855717262d899dbecdda90a99","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # NOTE(thangp): obj_extra_fields is used to hold properties that are not"},{"line_number":63,"context_line":"    # usually part of the model"},{"line_number":64,"context_line":"    obj_extra_fields \u003d [\u0027name\u0027, \u0027volume_name\u0027]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_5ed44cbc","line":64,"in_reply_to":"9a80dd14_22578803","updated":"2015-03-09 13:58:34.000000000","message":"That is wrong.  volume_name does a lazy load of the volume object, where volume.name returns return CONF.volume_name_template % self.name_id, which never returns None because name_id \u003d volume.id, and id is not allowed to be nullabl, i.e. fields.UUIDField().","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"19bbdc149bf988efc40a9a2cc353ef2f42af3529","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # NOTE(thangp): obj_extra_fields is used to hold properties that are not"},{"line_number":63,"context_line":"    # usually part of the model"},{"line_number":64,"context_line":"    obj_extra_fields \u003d [\u0027name\u0027, \u0027volume_name\u0027]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_c13301f4","line":64,"in_reply_to":"9a80dd14_5ed44cbc","updated":"2015-03-09 14:01:13.000000000","message":"This applies to name property too, since it takes the \u0027id\u0027 attribute, and \u0027id\u0027 is not allowed to be nullable.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"e39af9817f5e3e7aca23dc6beecdaa0a00b190ce","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # NOTE(thangp): obj_extra_fields is used to hold properties that are not"},{"line_number":63,"context_line":"    # usually part of the model"},{"line_number":64,"context_line":"    obj_extra_fields \u003d [\u0027name\u0027, \u0027volume_name\u0027]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @property"},{"line_number":67,"context_line":"    def name(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_b30b9f7b","line":64,"in_reply_to":"9a80dd14_c13301f4","updated":"2015-03-10 08:03:54.000000000","message":"Thanks for your reply. I think I mean another thing. Let me rephrase. Suppose a field \u0027abc\u0027. Originally it is declared by \u0027abc\u0027: fields.XXXField(nullable\u003dXX). We use fields.XXXField(nullable\u003dXX) to specify what type \u0027abc\u0027 should be. But after you modified \u0027abc\u0027 to be in obj_extra_fields, the type information is lost. Its value is specified by @property method.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"72d5dd9f3be78118c28e62003cc553e8e496a732","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if attrname \u003d\u003d \u0027volume\u0027:"},{"line_number":177,"context_line":"            self.volume \u003d objects.Volume.get_by_id(self._context,"},{"line_number":178,"context_line":"                                                   self.volume_id)"},{"line_number":179,"context_line":"        self.obj_reset_changes(fields\u003d[attrname])"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def delete_metadata_key(self, context, key):"},{"line_number":182,"context_line":"        db.snapshot_metadata_delete(context, self.id, key)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_629980c3","line":179,"updated":"2015-03-09 09:16:57.000000000","message":"If only when attrname \u003d\u003d \u0027volume\u0027 will the attribute be loaded, why would you need to obj_reset_changes for every attrname?","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"e39af9817f5e3e7aca23dc6beecdaa0a00b190ce","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if attrname \u003d\u003d \u0027volume\u0027:"},{"line_number":177,"context_line":"            self.volume \u003d objects.Volume.get_by_id(self._context,"},{"line_number":178,"context_line":"                                                   self.volume_id)"},{"line_number":179,"context_line":"        self.obj_reset_changes(fields\u003d[attrname])"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def delete_metadata_key(self, context, key):"},{"line_number":182,"context_line":"        db.snapshot_metadata_delete(context, self.id, key)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_3357af27","line":179,"in_reply_to":"9a80dd14_5e70ccdb","updated":"2015-03-10 08:03:54.000000000","message":"Thank you for explaining that!","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"d6bf37509d79b47855717262d899dbecdda90a99","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        if attrname \u003d\u003d \u0027volume\u0027:"},{"line_number":177,"context_line":"            self.volume \u003d objects.Volume.get_by_id(self._context,"},{"line_number":178,"context_line":"                                                   self.volume_id)"},{"line_number":179,"context_line":"        self.obj_reset_changes(fields\u003d[attrname])"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def delete_metadata_key(self, context, key):"},{"line_number":182,"context_line":"        db.snapshot_metadata_delete(context, self.id, key)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_5e70ccdb","line":179,"in_reply_to":"9a80dd14_629980c3","updated":"2015-03-09 13:58:34.000000000","message":"You want to reset any changes that may be there, since you just loaded the attribute.  You do not want to say \u0027foo\u0027 got changed, when \u0027foo\u0027 is just loaded here.  Otherwise, it would be a false report.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"}],"cinder/tests/api/v1/test_snapshots.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"72d5dd9f3be78118c28e62003cc553e8e496a732","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    param \u003d _get_default_snapshot_param()"},{"line_number":73,"context_line":"    return param"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def stub_snapshot_get_all(self, context, search_opts\u003dNone):"},{"line_number":77,"context_line":"    param \u003d _get_default_snapshot_param()"},{"line_number":78,"context_line":"    return [param]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_62ea60dc","line":75,"updated":"2015-03-09 09:16:57.000000000","message":"I think you can remove this method. It is no longer used.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"e39af9817f5e3e7aca23dc6beecdaa0a00b190ce","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    param \u003d _get_default_snapshot_param()"},{"line_number":73,"context_line":"    return param"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def stub_snapshot_get_all(self, context, search_opts\u003dNone):"},{"line_number":77,"context_line":"    param \u003d _get_default_snapshot_param()"},{"line_number":78,"context_line":"    return [param]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_eedfee66","line":75,"in_reply_to":"9a80dd14_4d7ca072","updated":"2015-03-10 08:03:54.000000000","message":"Thanks for pointing it out. Located cinder.objects.snapshot.SnapshotList.get_all invokes that.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"242ab47b3bfda885297162a9955f45f96592cd06","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    param \u003d _get_default_snapshot_param()"},{"line_number":73,"context_line":"    return param"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"def stub_snapshot_get_all(self, context, search_opts\u003dNone):"},{"line_number":77,"context_line":"    param \u003d _get_default_snapshot_param()"},{"line_number":78,"context_line":"    return [param]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_4d7ca072","line":75,"in_reply_to":"9a80dd14_62ea60dc","updated":"2015-03-09 15:40:11.000000000","message":"That is wrong.  It is required by test_admin_list_snapshots_all_tenants.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"72d5dd9f3be78118c28e62003cc553e8e496a732","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.controller \u003d snapshots.SnapshotsController()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.stubs.Set(db, \u0027snapshot_get_all_by_project\u0027,"},{"line_number":87,"context_line":"                       stubs.stub_snapshot_get_all_by_project)"},{"line_number":88,"context_line":"        self.stubs.Set(db, \u0027snapshot_get_all\u0027,"},{"line_number":89,"context_line":"                       stubs.stub_snapshot_get_all)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_e2a490bb","line":87,"updated":"2015-03-09 09:16:57.000000000","message":"Remove here, too.","commit_id":"e819b72a7615a83ebe6106b1fa454e004fcdf20e"}],"cinder/tests/unit/api/v1/test_snapshots.py":[{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"5e3bc67e48fc93e9a0592ac54b5465fcbf8ebc3b","unresolved":false,"context_lines":[{"line_number":283,"context_line":"    @mock.patch(\u0027cinder.objects.Snapshot.get_by_id\u0027)"},{"line_number":284,"context_line":"    @mock.patch(\u0027cinder.volume.api.API.get_all_snapshots\u0027)"},{"line_number":285,"context_line":"    def test_snapshot_detail(self, get_all_snapshots, snapshot_get_by_id,"},{"line_number":286,"context_line":"                             volume_get_by_id, snapshot_metadata_get):"},{"line_number":287,"context_line":"        snapshot \u003d {"},{"line_number":288,"context_line":"            \u0027id\u0027: UUID,"},{"line_number":289,"context_line":"            \u0027volume_id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_c2401ea8","line":286,"updated":"2015-05-01 00:11:20.000000000","message":"snapshot_metadata_get is not used in this test","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"5e3bc67e48fc93e9a0592ac54b5465fcbf8ebc3b","unresolved":false,"context_lines":[{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @mock.patch(\u0027cinder.db.snapshot_metadata_get\u0027, return_value\u003ddict())"},{"line_number":414,"context_line":"    def test_list_snapshots_with_limit_and_offset(self,"},{"line_number":415,"context_line":"                                                  snapshot_metadata_get):"},{"line_number":416,"context_line":"        def list_snapshots_with_limit_and_offset(is_admin):"},{"line_number":417,"context_line":"            def stub_snapshot_get_all_by_project(context, project_id):"},{"line_number":418,"context_line":"                return ["}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_a2fe4236","line":415,"updated":"2015-05-01 00:11:20.000000000","message":"snapshot_metadata_get is not used","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6b3913566e472336bcfa65d2df0da5925987c9c0","unresolved":false,"context_lines":[{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @mock.patch(\u0027cinder.db.snapshot_metadata_get\u0027, return_value\u003ddict())"},{"line_number":414,"context_line":"    def test_list_snapshots_with_limit_and_offset(self,"},{"line_number":415,"context_line":"                                                  snapshot_metadata_get):"},{"line_number":416,"context_line":"        def list_snapshots_with_limit_and_offset(is_admin):"},{"line_number":417,"context_line":"            def stub_snapshot_get_all_by_project(context, project_id):"},{"line_number":418,"context_line":"                return ["}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_abd73dbe","line":415,"in_reply_to":"3acd31a7_a2fe4236","updated":"2015-05-01 02:55:08.000000000","message":"metadata is one of the expected_attrs that is loaded.  Every snapshot object when loaded will attempt to get its metadata.  This just mocks out the method to return an empty dict for snapshot metadata, which is fine.  Checking the metadata for each of those tests is not relevant.","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"af7b05a89b35a60c9bc7963a9ae93910fe38cefb","unresolved":false,"context_lines":[{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @mock.patch(\u0027cinder.db.snapshot_metadata_get\u0027, return_value\u003ddict())"},{"line_number":414,"context_line":"    def test_list_snapshots_with_limit_and_offset(self,"},{"line_number":415,"context_line":"                                                  snapshot_metadata_get):"},{"line_number":416,"context_line":"        def list_snapshots_with_limit_and_offset(is_admin):"},{"line_number":417,"context_line":"            def stub_snapshot_get_all_by_project(context, project_id):"},{"line_number":418,"context_line":"                return ["}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_993826a2","line":415,"in_reply_to":"3acd31a7_abd73dbe","updated":"2015-05-04 15:55:35.000000000","message":"hah got it. thanks. removing the -1","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"}],"cinder/tests/unit/api/v2/test_snapshots.py":[{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"5e3bc67e48fc93e9a0592ac54b5465fcbf8ebc3b","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    @mock.patch(\u0027cinder.objects.Snapshot.get_by_id\u0027)"},{"line_number":296,"context_line":"    @mock.patch(\u0027cinder.volume.api.API.get_all_snapshots\u0027)"},{"line_number":297,"context_line":"    def test_snapshot_detail(self, get_all_snapshots, snapshot_get_by_id,"},{"line_number":298,"context_line":"                             volume_get_by_id, snapshot_metadata_get):"},{"line_number":299,"context_line":"        snapshot \u003d {"},{"line_number":300,"context_line":"            \u0027id\u0027: UUID,"},{"line_number":301,"context_line":"            \u0027volume_id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_0583c005","line":298,"updated":"2015-05-01 00:11:20.000000000","message":"snapshot_metadata_get not used","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6b3913566e472336bcfa65d2df0da5925987c9c0","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    @mock.patch(\u0027cinder.objects.Snapshot.get_by_id\u0027)"},{"line_number":296,"context_line":"    @mock.patch(\u0027cinder.volume.api.API.get_all_snapshots\u0027)"},{"line_number":297,"context_line":"    def test_snapshot_detail(self, get_all_snapshots, snapshot_get_by_id,"},{"line_number":298,"context_line":"                             volume_get_by_id, snapshot_metadata_get):"},{"line_number":299,"context_line":"        snapshot \u003d {"},{"line_number":300,"context_line":"            \u0027id\u0027: UUID,"},{"line_number":301,"context_line":"            \u0027volume_id\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_8be6c1b2","line":298,"in_reply_to":"3acd31a7_0583c005","updated":"2015-05-01 02:55:08.000000000","message":"Ditto","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"5e3bc67e48fc93e9a0592ac54b5465fcbf8ebc3b","unresolved":false,"context_lines":[{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    @mock.patch(\u0027cinder.db.snapshot_metadata_get\u0027, return_value\u003ddict())"},{"line_number":426,"context_line":"    def test_list_snapshots_with_limit_and_offset(self,"},{"line_number":427,"context_line":"                                                  snapshot_metadata_get):"},{"line_number":428,"context_line":"        def list_snapshots_with_limit_and_offset(is_admin):"},{"line_number":429,"context_line":"            def stub_snapshot_get_all_by_project(context, project_id):"},{"line_number":430,"context_line":"                return ["}],"source_content_type":"text/x-python","patch_set":12,"id":"3acd31a7_c5f94882","line":427,"updated":"2015-05-01 00:11:20.000000000","message":"snapshot_metadata_get not used","commit_id":"b6258fc376ae82fc7ad33cc91df790348980bc51"}],"tools/lintstack.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d58e60f1f8188ea376c94ee55602495ee210eec4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"objects_ignore_messages \u003d ["},{"line_number":64,"context_line":"    \"No value passed for parameter \u0027id\u0027 in function call\","},{"line_number":65,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Snapshot\u0027 member\","},{"line_number":66,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member\","},{"line_number":67,"context_line":"]"},{"line_number":68,"context_line":"objects_ignore_modules \u003d [\"cinder/objects/\"]"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bab921fb_b9f909cb","line":66,"updated":"2015-04-23 05:22:11.000000000","message":"The correct path should be cinder.objects.snapshot.SnapshotList.  \u0027cinder.objects\u0027 indeed doesn\u0027t have \u0027SnapshotList\u0027 directly.  Can you point to me the line of code that pylint is complaining about?","commit_id":"53f99671ab5f1444ae910166ef5bff2a2ab18a70"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bf500b910344140ef8c31b7b1e02706052e45b7d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"objects_ignore_messages \u003d ["},{"line_number":64,"context_line":"    \"No value passed for parameter \u0027id\u0027 in function call\","},{"line_number":65,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Snapshot\u0027 member\","},{"line_number":66,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member\","},{"line_number":67,"context_line":"]"},{"line_number":68,"context_line":"objects_ignore_modules \u003d [\"cinder/objects/\"]"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bab921fb_cbf240d2","line":66,"in_reply_to":"bab921fb_2e211f4e","updated":"2015-04-24 18:05:29.000000000","message":"Sure. Thanks.","commit_id":"53f99671ab5f1444ae910166ef5bff2a2ab18a70"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"2f9863c81fda24f0e1c6164178d9d94e70ece499","unresolved":false,"context_lines":[{"line_number":63,"context_line":"objects_ignore_messages \u003d ["},{"line_number":64,"context_line":"    \"No value passed for parameter \u0027id\u0027 in function call\","},{"line_number":65,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027Snapshot\u0027 member\","},{"line_number":66,"context_line":"    \"Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member\","},{"line_number":67,"context_line":"]"},{"line_number":68,"context_line":"objects_ignore_modules \u003d [\"cinder/objects/\"]"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bab921fb_2e211f4e","line":66,"in_reply_to":"bab921fb_b9f909cb","updated":"2015-04-23 13:37:07.000000000","message":"This is because SnapshotList is loaded dynamically in https://github.com/openstack/cinder/blob/master/cinder/objects/__init__.py#L28, so the path  is \u0027cinder.objects\u0027.\n\nThe actual error, without this line, is:\n\ncinder/volume/api.py:477: [E1101, API.get_all_snapshots] Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member\n\ncinder/volume/api.py:479: [E1101, API.get_all_snapshots] Module \u0027cinder.objects\u0027 has no \u0027SnapshotList\u0027 member","commit_id":"53f99671ab5f1444ae910166ef5bff2a2ab18a70"}]}
