)]}'
{"glance/api/v2/images.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"67d724c5bf95d183531c8a5f183cde47b0ed1d04","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            try:"},{"line_number":219,"context_line":"                image.locations \u003d value"},{"line_number":220,"context_line":"                if image.status \u003d\u003d \u0027queued\u0027:"},{"line_number":221,"context_line":"                    image.status \u003d \u0027active\u0027"},{"line_number":222,"context_line":"            except exception.BadStoreUri as bse:"},{"line_number":223,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dunicode(bse))"},{"line_number":224,"context_line":"            except ValueError as ve:    # update image status failed."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B88k%3D","line":221,"updated":"2013-11-18 08:12:15.000000000","message":"So we need catch exception.DuplicateLocation also.","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e30bd8273a022c0e0f3dc2d6117663edab9e2d0e","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            try:"},{"line_number":219,"context_line":"                image.locations \u003d value"},{"line_number":220,"context_line":"                if image.status \u003d\u003d \u0027queued\u0027:"},{"line_number":221,"context_line":"                    image.status \u003d \u0027active\u0027"},{"line_number":222,"context_line":"            except exception.BadStoreUri as bse:"},{"line_number":223,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dunicode(bse))"},{"line_number":224,"context_line":"            except ValueError as ve:    # update image status failed."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B8e0%3D","line":221,"in_reply_to":"AAAATn%2F%2B88k%3D","updated":"2013-11-18 09:29:49.000000000","message":"Done","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"}],"glance/common/exception.py":[{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"0c65b85748cf6fe649d1991b780a025c5cfbf4bf","unresolved":false,"context_lines":[{"line_number":77,"context_line":"class BadStoreUri(GlanceException):"},{"line_number":78,"context_line":"    message \u003d _(\"The Store URI was malformed.\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class Duplicate(GlanceException):"},{"line_number":82,"context_line":"    message \u003d _(\"An object with the same identifier already exists.\")"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BjWo%3D","line":80,"updated":"2013-11-23 23:58:11.000000000","message":"Should DuplicateLocations derive from this class?","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":77,"context_line":"class BadStoreUri(GlanceException):"},{"line_number":78,"context_line":"    message \u003d _(\"The Store URI was malformed.\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class Duplicate(GlanceException):"},{"line_number":82,"context_line":"    message \u003d _(\"An object with the same identifier already exists.\")"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bgzo%3D","line":80,"in_reply_to":"AAAATn%2F%2BjWo%3D","updated":"2013-11-25 10:08:16.000000000","message":"Done","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"273eee0da22f8111cffdf23e0767b5d52cbcdbed","unresolved":false,"context_lines":[{"line_number":77,"context_line":"class BadStoreUri(GlanceException):"},{"line_number":78,"context_line":"    message \u003d _(\"The Store URI was malformed.\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class Duplicate(GlanceException):"},{"line_number":82,"context_line":"    message \u003d _(\"An object with the same identifier already exists.\")"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bi6o%3D","line":80,"in_reply_to":"AAAATn%2F%2BjWo%3D","updated":"2013-11-24 12:59:11.000000000","message":"Good point.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"}],"glance/db/sqlalchemy/migrate_repo/versions/031_remove_duplicated_locations.py":[{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"66e604043787bac1698f5f4a72473e840b9bf26e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import pickle"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import MetaData, Table, Column"},{"line_number":23,"context_line":"from glance.db.sqlalchemy import models"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BjaI%3D","line":22,"updated":"2013-11-23 23:57:10.000000000","message":"Minor nit: Column, Metadata, Table (alphabetical)\nNoticed nikhil mention this comment in another review :)","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import pickle"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import MetaData, Table, Column"},{"line_number":23,"context_line":"from glance.db.sqlalchemy import models"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BgzU%3D","line":22,"in_reply_to":"AAAATn%2F%2BjaI%3D","updated":"2013-11-25 10:08:16.000000000","message":"Done","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"66e604043787bac1698f5f4a72473e840b9bf26e","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import MetaData, Table, Column"},{"line_number":23,"context_line":"from glance.db.sqlalchemy import models"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BjaE%3D","line":23,"updated":"2013-11-23 23:57:10.000000000","message":"maybe an empty line before this?","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import MetaData, Table, Column"},{"line_number":23,"context_line":"from glance.db.sqlalchemy import models"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BgzY%3D","line":23,"in_reply_to":"AAAATn%2F%2BjaE%3D","updated":"2013-11-25 10:08:16.000000000","message":"Done","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e8e51788fb5bfb525b8f771996cd9dba37effc95","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                    row[\u0027value\u0027],"},{"line_number":40,"context_line":"                    row[\u0027meta_data\u0027])"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        if loc_meta not in seen:"},{"line_number":43,"context_line":"            seen.add(loc_meta)"},{"line_number":44,"context_line":"            continue"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BjKc%3D","line":42,"updated":"2013-11-24 07:27:40.000000000","message":"I\u0027m not sure this approach can work well for a large online Cloud deployment in the real world. If glance database contains a lot of location records, this approach will consume much memory, and are you sure migration python pid can work as expected? 32bit arch cpu/system especially since pid only has 1.8G available  memory space in userspace.\n\nMaybe this is a little overkill, but in theory this approach is non-perfect.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                    row[\u0027value\u0027],"},{"line_number":40,"context_line":"                    row[\u0027meta_data\u0027])"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        if loc_meta not in seen:"},{"line_number":43,"context_line":"            seen.add(loc_meta)"},{"line_number":44,"context_line":"            continue"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bgwk%3D","line":42,"in_reply_to":"AAAATn%2F%2BjKc%3D","updated":"2013-11-25 10:08:16.000000000","message":"Yeah, I did think about that. The reason I went down this road is that it is easier to implement, easier to maintain and cross-engine. I\u0027ll work on a DB based solution that works better for every case.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"273eee0da22f8111cffdf23e0767b5d52cbcdbed","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def downgrade(migrate_engine):"},{"line_number":54,"context_line":"    # NOTE(flaper87): There\u0027s no downgrade"},{"line_number":55,"context_line":"    # path for this."},{"line_number":56,"context_line":"    return"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bi64%3D","line":54,"updated":"2013-11-24 12:59:11.000000000","message":"(nit): Do we really need a new line? :-)","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def downgrade(migrate_engine):"},{"line_number":54,"context_line":"    # NOTE(flaper87): There\u0027s no downgrade"},{"line_number":55,"context_line":"    # path for this."},{"line_number":56,"context_line":"    return"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BgyI%3D","line":54,"in_reply_to":"AAAATn%2F%2Bi64%3D","updated":"2013-11-25 10:08:16.000000000","message":"looks better... :P","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"cefa815aee3a3a62db9fc573b3683bd71827bbaa","unresolved":false,"context_lines":[{"line_number":38,"context_line":"           image_locations.c.meta_data]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # NOTE(flaper87): Get all duplicated rows"},{"line_number":41,"context_line":"    # plus their id"},{"line_number":42,"context_line":"    qry \u003d (session.query(*grp)"},{"line_number":43,"context_line":"                  .group_by(*grp)"},{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bb%2BU%3D","line":41,"updated":"2013-11-26 04:15:36.000000000","message":"actually you have not queried id column.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"63d6983d3be1ec52b08fc15cacf954f46ed748b0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"           image_locations.c.meta_data]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # NOTE(flaper87): Get all duplicated rows"},{"line_number":41,"context_line":"    # plus their id"},{"line_number":42,"context_line":"    qry \u003d (session.query(*grp)"},{"line_number":43,"context_line":"                  .group_by(*grp)"},{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Ba5c%3D","line":41,"in_reply_to":"AAAATn%2F%2Bb%2BU%3D","updated":"2013-11-26 10:08:51.000000000","message":"I forgot to update the comment message.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"cefa815aee3a3a62db9fc573b3683bd71827bbaa","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # NOTE(flaper87): Get all duplicated rows"},{"line_number":41,"context_line":"    # plus their id"},{"line_number":42,"context_line":"    qry \u003d (session.query(*grp)"},{"line_number":43,"context_line":"                  .group_by(*grp)"},{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bb7Y%3D","line":42,"updated":"2013-11-26 04:15:36.000000000","message":"1. We can query id column also within this query, and remove below second query at Line #49 in the row-loop, and use this id directly at Line #55.\n\n2. We need add a \u0027where deleted \u003d 0\u0027 condition for this query? since a duplicated location entry can be a deleted record. Correct me if I\u0027m wrong.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"8f83ae60e024ee05c7bfce24e339ae22da58adbd","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # NOTE(flaper87): Get all duplicated rows"},{"line_number":41,"context_line":"    # plus their id"},{"line_number":42,"context_line":"    qry \u003d (session.query(*grp)"},{"line_number":43,"context_line":"                  .group_by(*grp)"},{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bauw%3D","line":42,"in_reply_to":"AAAATn%2F%2Ba5I%3D","updated":"2013-11-26 10:33:59.000000000","message":"1. I can do this successful on my local dev env:\n\nmysql\u003e use glance\n\nmysql\u003e select id, image_id, value, meta_data from image_locations group by image_id, value, meta_data having count(*) \u003e 1;\n\n2. because a duplicated location record can be existing even it\u0027s under deleted status. For example:\n\nmysql\u003e select id, image_id, value, meta_data from image_locations group by image_id, value, meta_data having count(*) \u003e 1; \n\n+----+--------------------------------------+--------------------------------------------------------------------+-----------+\n\n| id | image_id                             | value                                                              | meta_data |\n\n+----+--------------------------------------+--------------------------------------------------------------------+-----------+\n\n| 11 | 4d847a12-5360-4ee8-be71-bfe4cf57be7d | file:///var/lib/glance/images/4d847a12-5360-4ee8-be71-bfe4cf57be7d | {}        |\n\n\nmysql\u003e select deleted, id, image_id, value, meta_data from image_locations where value \u003d \u0027file:///var/lib/glance/images/4d847a12-5360-4ee8-be71-bfe4cf57be7d\u0027;\n\n+---------+----+--------------------------------------+--------------------------------------------------------------------+-----------+\n\n| deleted | id | image_id                             | value                                                              | meta_data |\n\n+---------+----+--------------------------------------+--------------------------------------------------------------------+-----------+\n\n|       0 | 11 | 4d847a12-5360-4ee8-be71-bfe4cf57be7d | file:///var/lib/glance/images/4d847a12-5360-4ee8-be71-bfe4cf57be7d | {}        |\n\n|       1 | 34 | 4d847a12-5360-4ee8-be71-bfe4cf57be7d | file:///var/lib/glance/images/4d847a12-5360-4ee8-be71-bfe4cf57be7d | {}        |\n\n+---------+----+--------------------------------------+--------------------------------------------------------------------+-----------+\n\n\nand then below code will remove that correct location record and keep deleted one stay.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"63d6983d3be1ec52b08fc15cacf954f46ed748b0","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # NOTE(flaper87): Get all duplicated rows"},{"line_number":41,"context_line":"    # plus their id"},{"line_number":42,"context_line":"    qry \u003d (session.query(*grp)"},{"line_number":43,"context_line":"                  .group_by(*grp)"},{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Ba5I%3D","line":42,"in_reply_to":"AAAATn%2F%2Bb7Y%3D","updated":"2013-11-26 10:08:51.000000000","message":"1. We can\u0027t because we\u0027d have to make the id part of the group and that won\u0027t return duplicated records.\n\n2. It can but I don\u0027t see why we should keep it around, anyway. It will be useless after this upgrade happens.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"cefa815aee3a3a62db9fc573b3683bd71827bbaa","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    for row in qry:"},{"line_number":47,"context_line":"        # NOTE(flaper87): Still not the fastest"},{"line_number":48,"context_line":"        # way to do it."},{"line_number":49,"context_line":"        s \u003d (sqlalchemy.sql.select([image_locations.c.id])"},{"line_number":50,"context_line":"             .where(image_locations.c.image_id \u003d\u003d row[0])"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bb9g%3D","line":47,"updated":"2013-11-26 04:15:36.000000000","message":"aha, honest.\n\ndo you want to do that \"fastest\" way in future PS? if no, I prefer remove this comment.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"8f83ae60e024ee05c7bfce24e339ae22da58adbd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    for row in qry:"},{"line_number":47,"context_line":"        # NOTE(flaper87): Still not the fastest"},{"line_number":48,"context_line":"        # way to do it."},{"line_number":49,"context_line":"        s \u003d (sqlalchemy.sql.select([image_locations.c.id])"},{"line_number":50,"context_line":"             .where(image_locations.c.image_id \u003d\u003d row[0])"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BayI%3D","line":47,"in_reply_to":"AAAATn%2F%2Ba4s%3D","updated":"2013-11-26 10:33:59.000000000","message":"OK","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"63d6983d3be1ec52b08fc15cacf954f46ed748b0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                  .having(func.count() \u003e 1))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    for row in qry:"},{"line_number":47,"context_line":"        # NOTE(flaper87): Still not the fastest"},{"line_number":48,"context_line":"        # way to do it."},{"line_number":49,"context_line":"        s \u003d (sqlalchemy.sql.select([image_locations.c.id])"},{"line_number":50,"context_line":"             .where(image_locations.c.image_id \u003d\u003d row[0])"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Ba4s%3D","line":47,"in_reply_to":"AAAATn%2F%2Bb9g%3D","updated":"2013-11-26 10:08:51.000000000","message":"The comment is not a `FIXME` it\u0027s a NOTE for future readers that mentions we know it\u0027s not the fastest but that\u0027s what actually works as for now.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"9d0742f792f8b2cc8a72bf9f7adcc6b81a0d035b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    session \u003d orm.sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    # NOTE(flaper87): Lets group by"},{"line_number":35,"context_line":"    # iamge_id, location and metadata."},{"line_number":36,"context_line":"    grp \u003d [image_locations.c.image_id,"},{"line_number":37,"context_line":"           image_locations.c.value,"},{"line_number":38,"context_line":"           image_locations.c.meta_data]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BWSQ%3D","line":35,"updated":"2013-11-27 03:43:07.000000000","message":"image? typo","commit_id":"fa86c2c55cc165ad245acc9c3fc33f1fee674be1"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"61b00774db81ff51699f1a155750b5f29fc2f8da","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    session \u003d orm.sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    # NOTE(flaper87): Lets group by"},{"line_number":35,"context_line":"    # iamge_id, location and metadata."},{"line_number":36,"context_line":"    grp \u003d [image_locations.c.image_id,"},{"line_number":37,"context_line":"           image_locations.c.value,"},{"line_number":38,"context_line":"           image_locations.c.meta_data]"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BVds%3D","line":35,"in_reply_to":"AAAATn%2F%2BWSQ%3D","updated":"2013-11-27 09:07:27.000000000","message":"Done","commit_id":"fa86c2c55cc165ad245acc9c3fc33f1fee674be1"},{"author":{"_account_id":4463,"name":"iccha-sethi","email":"iccha.sethi@rackspace.com","username":"iccha-sethi"},"change_message_id":"9d0742f792f8b2cc8a72bf9f7adcc6b81a0d035b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    for row in qry:"},{"line_number":47,"context_line":"        stmt \u003d (image_locations.delete()"},{"line_number":48,"context_line":"                .where(image_locations.c.id \u003d\u003d row[0]))"},{"line_number":49,"context_line":"        stmt.execute()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    session.close()"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BWOA%3D","line":49,"updated":"2013-11-27 03:43:07.000000000","message":"If the two rows have different updated_at time stamps, we might want to pick the latest row. Any thoughts?","commit_id":"fa86c2c55cc165ad245acc9c3fc33f1fee674be1"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"61b00774db81ff51699f1a155750b5f29fc2f8da","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    for row in qry:"},{"line_number":47,"context_line":"        stmt \u003d (image_locations.delete()"},{"line_number":48,"context_line":"                .where(image_locations.c.id \u003d\u003d row[0]))"},{"line_number":49,"context_line":"        stmt.execute()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    session.close()"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BVcY%3D","line":49,"in_reply_to":"AAAATn%2F%2BWOA%3D","updated":"2013-11-27 09:07:27.000000000","message":"I gues order_by could help in the query statement","commit_id":"fa86c2c55cc165ad245acc9c3fc33f1fee674be1"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"344bd9be31784c31e89e4d0364a523151ca7548b","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"import pickle"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BVHo%3D","line":18,"updated":"2013-11-27 10:35:22.000000000","message":"unused","commit_id":"5c8caa2456297ef93157f2c10fe3b66528c0ecdc"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"344bd9be31784c31e89e4d0364a523151ca7548b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import json"},{"line_number":19,"context_line":"import pickle"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import distinct, and_, func, orm"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BVHk%3D","line":19,"updated":"2013-11-27 10:35:22.000000000","message":"unused","commit_id":"5c8caa2456297ef93157f2c10fe3b66528c0ecdc"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"344bd9be31784c31e89e4d0364a523151ca7548b","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import pickle"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import distinct, and_, func, orm"},{"line_number":23,"context_line":"from sqlalchemy import Column, MetaData, Table"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from glance.db.sqlalchemy import models"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BVGw%3D","line":22,"updated":"2013-11-27 10:35:22.000000000","message":"remove \"distinct, and_\"","commit_id":"5c8caa2456297ef93157f2c10fe3b66528c0ecdc"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"344bd9be31784c31e89e4d0364a523151ca7548b","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import distinct, and_, func, orm"},{"line_number":23,"context_line":"from sqlalchemy import Column, MetaData, Table"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from glance.db.sqlalchemy import models"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BVGs%3D","line":23,"updated":"2013-11-27 10:35:22.000000000","message":"remove Column","commit_id":"5c8caa2456297ef93157f2c10fe3b66528c0ecdc"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"344bd9be31784c31e89e4d0364a523151ca7548b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from sqlalchemy import distinct, and_, func, orm"},{"line_number":23,"context_line":"from sqlalchemy import Column, MetaData, Table"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from glance.db.sqlalchemy import models"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BVHA%3D","line":25,"updated":"2013-11-27 10:35:22.000000000","message":"unused","commit_id":"5c8caa2456297ef93157f2c10fe3b66528c0ecdc"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"344bd9be31784c31e89e4d0364a523151ca7548b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        # NOTE(flaper87): Not the fastest way to do it."},{"line_number":48,"context_line":"        # This is the best way to do it since sqlalchemy"},{"line_number":49,"context_line":"        # has a bug around delete + limit."},{"line_number":50,"context_line":"        s \u003d (sqlalchemy.sql.select([image_locations.c.id])"},{"line_number":51,"context_line":"             .where(image_locations.c.image_id \u003d\u003d row[0])"},{"line_number":52,"context_line":"             .where(image_locations.c.value \u003d\u003d row[1])"},{"line_number":53,"context_line":"             .where(image_locations.c.meta_data \u003d\u003d row[2])"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BVEc%3D","line":50,"updated":"2013-11-27 10:35:22.000000000","message":"This query also need filter deleted location record out, since it can get duplicated \u0027active\u0027 location(s) and delete it, and then \u0027deleted\u0027 location(s) can stay still.","commit_id":"5c8caa2456297ef93157f2c10fe3b66528c0ecdc"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"99b12c491c69fc0969a2d900aee97c804f83de0d","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy"},{"line_number":19,"context_line":"from sqlalchemy import func, orm"},{"line_number":20,"context_line":"from sqlalchemy import MetaData, Table"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BU90%3D","line":20,"updated":"2013-11-27 10:52:04.000000000","message":"pls remove MetaData also. sorry for separated comment.","commit_id":"62b1cdc175ae8fc644aca418c108a3c223e3159b"}],"glance/store/__init__.py":[{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"67d724c5bf95d183531c8a5f183cde47b0ed1d04","unresolved":false,"context_lines":[{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def new_image(self, **kwargs):"},{"line_number":437,"context_line":"        for l in kwargs.get(\u0027locations\u0027, []):"},{"line_number":438,"context_line":"            _check_image_location(self.context, self.store_api, l)"},{"line_number":439,"context_line":"        return super(ImageFactoryProxy, self).new_image(**kwargs)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B85Q%3D","line":438,"updated":"2013-11-18 08:12:15.000000000","message":"Actually I prefer add checking to here also to make the checking mechanism be complete. Then if so we also need add a migration script to clear duplicated locations from exiting location database records.\n\n(In future, we need add an DuplicateLocation exception catching code to image controller also when we allow end user pass a location list in when he create an image entry)","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"67d724c5bf95d183531c8a5f183cde47b0ed1d04","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            for location in locations:"},{"line_number":551,"context_line":"                _check_image_location(self.image_proxy.context,"},{"line_number":552,"context_line":"                                      self.image_proxy.store_api,"},{"line_number":553,"context_line":"                                      location)"},{"line_number":554,"context_line":"            self.value +\u003d locations"},{"line_number":555,"context_line":"        return self"},{"line_number":556,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B86U%3D","line":553,"updated":"2013-11-18 08:12:15.000000000","message":"Do you think we need add checking to here also? (or redirect the request to \"insert()\")","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e30bd8273a022c0e0f3dc2d6117663edab9e2d0e","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            for location in locations:"},{"line_number":551,"context_line":"                _check_image_location(self.image_proxy.context,"},{"line_number":552,"context_line":"                                      self.image_proxy.store_api,"},{"line_number":553,"context_line":"                                      location)"},{"line_number":554,"context_line":"            self.value +\u003d locations"},{"line_number":555,"context_line":"        return self"},{"line_number":556,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B8eY%3D","line":553,"in_reply_to":"AAAATn%2F%2B86U%3D","updated":"2013-11-18 09:29:49.000000000","message":"I think this should call self..append instead of adding it itself.","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"67d724c5bf95d183531c8a5f183cde47b0ed1d04","unresolved":false,"context_lines":[{"line_number":596,"context_line":"            # NOTE(zhiyan): Check locations are all valid."},{"line_number":597,"context_line":"            for location in value:"},{"line_number":598,"context_line":"                _check_image_location(self.context, self.store_api,"},{"line_number":599,"context_line":"                                      location)"},{"line_number":600,"context_line":"            return setattr(getattr(self, target), attr, list(value))"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"    def del_attr(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B86o%3D","line":599,"updated":"2013-11-18 08:12:15.000000000","message":"We need check location duplication before this line also.","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"e30bd8273a022c0e0f3dc2d6117663edab9e2d0e","unresolved":false,"context_lines":[{"line_number":596,"context_line":"            # NOTE(zhiyan): Check locations are all valid."},{"line_number":597,"context_line":"            for location in value:"},{"line_number":598,"context_line":"                _check_image_location(self.context, self.store_api,"},{"line_number":599,"context_line":"                                      location)"},{"line_number":600,"context_line":"            return setattr(getattr(self, target), attr, list(value))"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"    def del_attr(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2B8eQ%3D","line":599,"in_reply_to":"AAAATn%2F%2B86o%3D","updated":"2013-11-18 09:29:49.000000000","message":"Done","commit_id":"f8a72ca620d925f7d4915ca51a6a19a02d6c0399"}],"glance/tests/unit/test_migrations.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"273eee0da22f8111cffdf23e0767b5d52cbcdbed","unresolved":false,"context_lines":[{"line_number":631,"context_line":"            self.assertEqual(len(rows), 1)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"            row \u003d rows[0]"},{"line_number":634,"context_line":"            print(repr(dict(row)))"},{"line_number":635,"context_line":"            self.assertTrue(uuidutils.is_uuid_like(row[\u0027id\u0027]))"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"            uuids[name] \u003d row[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bi68%3D","side":"PARENT","line":634,"updated":"2013-11-24 12:59:11.000000000","message":"remove this incidentally?","commit_id":"9e439a1f8eb305d5124939b5ab1626d8d9edf8d3"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":631,"context_line":"            self.assertEqual(len(rows), 1)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"            row \u003d rows[0]"},{"line_number":634,"context_line":"            print(repr(dict(row)))"},{"line_number":635,"context_line":"            self.assertTrue(uuidutils.is_uuid_like(row[\u0027id\u0027]))"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"            uuids[name] \u003d row[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BgwA%3D","side":"PARENT","line":634,"in_reply_to":"AAAATn%2F%2Bi68%3D","updated":"2013-11-25 10:08:16.000000000","message":"Nope, on purpose. It\u0027s not needed and it prints stuff in the test logs that makes reading them more difficult.","commit_id":"9e439a1f8eb305d5124939b5ab1626d8d9edf8d3"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"273eee0da22f8111cffdf23e0767b5d52cbcdbed","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"        temp \u003d dict(deleted\u003dFalse,"},{"line_number":1068,"context_line":"                    created_at\u003dnow,"},{"line_number":1069,"context_line":"                    updated_at\u003dnow,"},{"line_number":1070,"context_line":"                    meta_data\u003d\u0027{}\u0027,"},{"line_number":1071,"context_line":"                    image_id\u003dimage_id)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        for location in locations:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bi6s%3D","line":1070,"updated":"2013-11-24 12:59:11.000000000","message":"+1, we\u0027re checking the duplication by location+metadata, so it would be good if the scenarios can be covered.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"e8e51788fb5bfb525b8f771996cd9dba37effc95","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"        temp \u003d dict(deleted\u003dFalse,"},{"line_number":1068,"context_line":"                    created_at\u003dnow,"},{"line_number":1069,"context_line":"                    updated_at\u003dnow,"},{"line_number":1070,"context_line":"                    meta_data\u003d\u0027{}\u0027,"},{"line_number":1071,"context_line":"                    image_id\u003dimage_id)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        for location in locations:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BjK0%3D","line":1070,"updated":"2013-11-24 07:27:40.000000000","message":"can we give a record which contain meta_data field, to tests de-duplication migrate code can work well for url+meta_data record.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"        temp \u003d dict(deleted\u003dFalse,"},{"line_number":1068,"context_line":"                    created_at\u003dnow,"},{"line_number":1069,"context_line":"                    updated_at\u003dnow,"},{"line_number":1070,"context_line":"                    meta_data\u003d\u0027{}\u0027,"},{"line_number":1071,"context_line":"                    image_id\u003dimage_id)"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        for location in locations:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bgv8%3D","line":1070,"in_reply_to":"AAAATn%2F%2Bi6s%3D","updated":"2013-11-25 10:08:16.000000000","message":"Damn, I meant to and then I forgot.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"50be0dc0d9b133da90bd942f58bd8f8e7f9b6f6a","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"                                .execute().fetchall()"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"        locations \u003d [x[\u0027value\u0027] for x in result]"},{"line_number":1087,"context_line":"        actual_locations \u003d [\u0027file://ab\u0027, \u0027file://ab\u0027, \u0027file://ab1\u0027]"},{"line_number":1088,"context_line":"        self.assertEqual(actual_locations, locations)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Bfmw%3D","line":1087,"updated":"2013-11-25 14:30:01.000000000","message":"I prefer verify metadata also, since you have two location those have same URI but different metadata value, so we need make sure those two \u0027file://ab\u0027 location in this expected list has different metadata value.","commit_id":"026771dc55b7c6b2db3e13c93446bfaddf393b7e"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"cefa815aee3a3a62db9fc573b3683bd71827bbaa","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"                                .execute().fetchall()"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"        locations \u003d [x[\u0027value\u0027] for x in result]"},{"line_number":1087,"context_line":"        actual_locations \u003d [\u0027file://ab\u0027, \u0027file://ab\u0027, \u0027file://ab1\u0027]"},{"line_number":1088,"context_line":"        self.assertEqual(actual_locations, locations)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bb8g%3D","line":1087,"updated":"2013-11-26 04:15:36.000000000","message":"I still think my comments for this in https://review.openstack.org/#/c/56663/5/glance/tests/unit/test_migrations.py is valid.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6549,"name":"Zhi Yan Liu","email":"lzy.dev@gmail.com","username":"lzy-dev"},"change_message_id":"8f83ae60e024ee05c7bfce24e339ae22da58adbd","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"                                .execute().fetchall()"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"        locations \u003d [x[\u0027value\u0027] for x in result]"},{"line_number":1087,"context_line":"        actual_locations \u003d [\u0027file://ab\u0027, \u0027file://ab\u0027, \u0027file://ab1\u0027]"},{"line_number":1088,"context_line":"        self.assertEqual(actual_locations, locations)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BauI%3D","line":1087,"in_reply_to":"AAAATn%2F%2Ba4E%3D","updated":"2013-11-26 10:33:59.000000000","message":"thanks.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"63d6983d3be1ec52b08fc15cacf954f46ed748b0","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"                                .execute().fetchall()"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"        locations \u003d [x[\u0027value\u0027] for x in result]"},{"line_number":1087,"context_line":"        actual_locations \u003d [\u0027file://ab\u0027, \u0027file://ab\u0027, \u0027file://ab1\u0027]"},{"line_number":1088,"context_line":"        self.assertEqual(actual_locations, locations)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Ba4E%3D","line":1087,"in_reply_to":"AAAATn%2F%2Bb8g%3D","updated":"2013-11-26 10:08:51.000000000","message":"TBH, I thought you were referring about having some cases where \u0027metadata\u0027 is not empty. Sorry about that. I\u0027ll add it.","commit_id":"3822931edbdbdd78db8379fb3436c0aa0aadab6a"}],"glance/tests/unit/v2/test_images_resource.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"273eee0da22f8111cffdf23e0767b5d52cbcdbed","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"        self.assertEqual(new_location, output.locations[1])"},{"line_number":1123,"context_line":""},{"line_number":1124,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update,"},{"line_number":1125,"context_line":"                          request, UUID1, changes)"},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    def test_update_remove_base_property(self):"},{"line_number":1128,"context_line":"        self.db.image_update(None, UUID1, {\u0027properties\u0027: {\u0027foo\u0027: \u0027bar\u0027}})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bi7I%3D","line":1125,"updated":"2013-11-24 12:59:11.000000000","message":"It would be nice if the \u0027image create\u0027 case and \u0027update replace\u0027 case can be covered as well.","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"6ff89311043d1d4491985ef37a397fde3d978962","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"        self.assertEqual(new_location, output.locations[1])"},{"line_number":1123,"context_line":""},{"line_number":1124,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update,"},{"line_number":1125,"context_line":"                          request, UUID1, changes)"},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    def test_update_remove_base_property(self):"},{"line_number":1128,"context_line":"        self.db.image_update(None, UUID1, {\u0027properties\u0027: {\u0027foo\u0027: \u0027bar\u0027}})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bgvo%3D","line":1125,"in_reply_to":"AAAATn%2F%2Bi7I%3D","updated":"2013-11-25 10:08:16.000000000","message":"Done","commit_id":"d17e3fa03712418a700eb9e4c4ca0bf86ee8f443"}]}
