)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0c060da55861b12f4966ab1a2f0979c8577b664b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"WIP generic image cache"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Still needs a bunch of tests, but is otherwise mostly kind of working."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: If22bbaff89251e4e82a715170a48b4040f95c09f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"ba3cc151_cf2e02fa","line":10,"updated":"2015-07-07 16:01:30.000000000","message":"Can you reference your blueprint here?","commit_id":"9813d2792e73c8b7f3ebdf7f5da6f33a388f0a85"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"64aab56f4b140d35ccba849be3c09d740b7334e2","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Co-Authored-By: Tomoki Sekiyama \u003ctomoki.sekiyama@hds.com\u003e"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Implements: image-volume-cache"},{"line_number":55,"context_line":"Change-Id: If22bbaff89251e4e82a715170a48b4040f95c09f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":51,"id":"da20952f_d85f60e3","line":54,"updated":"2015-08-31 02:02:16.000000000","message":"This line should be as follows:\n\nImplements: blueprint image-volume-cache","commit_id":"1dc306768342c4ed025da9ecb1324c9b72fbc9d7"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"611f8e8c2c21af6f1251efa156f4270d73e0d788","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Co-Authored-By: Tomoki Sekiyama \u003ctomoki.sekiyama@hds.com\u003e"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Implements: image-volume-cache"},{"line_number":55,"context_line":"Change-Id: If22bbaff89251e4e82a715170a48b4040f95c09f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":51,"id":"da20952f_134cdbc6","line":54,"in_reply_to":"da20952f_d85f60e3","updated":"2015-08-31 03:03:28.000000000","message":"Done","commit_id":"1dc306768342c4ed025da9ecb1324c9b72fbc9d7"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"6fabcf69e815e75c0c8584b7148fd8350c84f64f","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Co-Authored-By: Tomoki Sekiyama \u003ctomoki.sekiyama@hds.com\u003e"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"Implements: image-volume-cache"},{"line_number":55,"context_line":"Change-Id: If22bbaff89251e4e82a715170a48b4040f95c09f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":51,"id":"da20952f_98ad6886","line":54,"in_reply_to":"da20952f_d85f60e3","updated":"2015-08-31 02:13:35.000000000","message":"This shouldn\u0027t be a -1. Make it a 0 with a comment.","commit_id":"1dc306768342c4ed025da9ecb1324c9b72fbc9d7"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"ea7dec12094dd251c7a3bd5f56a9796308b0bedc","unresolved":false,"context_lines":[{"line_number":15,"context_line":"these volumes, which are owned by the Cinder internal tenant. The"},{"line_number":16,"context_line":"original will then be extended to full size. Any subsequent requests to"},{"line_number":17,"context_line":"create a volume from an image will be able to do a volume clone from"},{"line_number":18,"context_line":"the image-volume cache entry instead of downloading the image data from"},{"line_number":19,"context_line":"glance again."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"In the future we could create an entry upon creating an image from a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":52,"id":"da20952f_b60fc12d","line":18,"updated":"2015-09-01 17:07:41.000000000","message":"Q: Can we have an image snapshot as image cache and clone out of the image snapshot to honor subsequent requests?","commit_id":"32bfb5868a1ff8ab1f8b773ac9ab75656a86615a"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"6cdb0d8438e66e898105e72668c64a0214d33032","unresolved":false,"context_lines":[{"line_number":15,"context_line":"these volumes, which are owned by the Cinder internal tenant. The"},{"line_number":16,"context_line":"original will then be extended to full size. Any subsequent requests to"},{"line_number":17,"context_line":"create a volume from an image will be able to do a volume clone from"},{"line_number":18,"context_line":"the image-volume cache entry instead of downloading the image data from"},{"line_number":19,"context_line":"glance again."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"In the future we could create an entry upon creating an image from a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":52,"id":"da20952f_f6b3f9e7","line":18,"in_reply_to":"da20952f_b60fc12d","updated":"2015-09-01 17:17:52.000000000","message":"Don\u0027t -1 questions. These should be 0.","commit_id":"32bfb5868a1ff8ab1f8b773ac9ab75656a86615a"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"39f45037826bf84edccea04d21b8289e9a793533","unresolved":false,"context_lines":[{"line_number":15,"context_line":"these volumes, which are owned by the Cinder internal tenant. The"},{"line_number":16,"context_line":"original will then be extended to full size. Any subsequent requests to"},{"line_number":17,"context_line":"create a volume from an image will be able to do a volume clone from"},{"line_number":18,"context_line":"the image-volume cache entry instead of downloading the image data from"},{"line_number":19,"context_line":"glance again."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"In the future we could create an entry upon creating an image from a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":52,"id":"da20952f_96539d6c","line":18,"in_reply_to":"da20952f_b60fc12d","updated":"2015-09-01 17:22:02.000000000","message":"That is something that we could do as an iteration on this in M. For the first version and base functionality we opted to go with volumes in the cache.","commit_id":"32bfb5868a1ff8ab1f8b773ac9ab75656a86615a"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"e11cb65fc47bd365f40aa7195d6fc46f051e6225","unresolved":false,"context_lines":[{"line_number":3853,"context_line":"            first()"},{"line_number":3854,"context_line":""},{"line_number":3855,"context_line":"        if entry:"},{"line_number":3856,"context_line":"            entry.last_used \u003d timeutils.utcnow()"},{"line_number":3857,"context_line":"            entry.save(session\u003dsession)"},{"line_number":3858,"context_line":"        return entry"},{"line_number":3859,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_5096d54c","line":3856,"updated":"2015-07-28 14:29:18.000000000","message":"Why we update last_used value only here and not in image_volume_cache_get_by_volume_id method?","commit_id":"7e4ad4226a8445c95aa4506d660bf75ae69e6fa9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"93c01795db52de7abf9084242a21a8a92a803858","unresolved":false,"context_lines":[{"line_number":3853,"context_line":"            first()"},{"line_number":3854,"context_line":""},{"line_number":3855,"context_line":"        if entry:"},{"line_number":3856,"context_line":"            entry.last_used \u003d timeutils.utcnow()"},{"line_number":3857,"context_line":"            entry.save(session\u003dsession)"},{"line_number":3858,"context_line":"        return entry"},{"line_number":3859,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_8784105e","line":3856,"in_reply_to":"3a50d1a3_5096d54c","updated":"2015-07-28 22:46:05.000000000","message":"This is the \u0027cache hit\u0027 behavior when we are looking for something in the cache, thinking more on this maybe i should rename the method to explain that it does more than just a \u0027get\u0027 operation.","commit_id":"7e4ad4226a8445c95aa4506d660bf75ae69e6fa9"}],"cinder/db/sqlalchemy/migrate_repo/versions/051_add_image_volume_cache_table.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"e11cb65fc47bd365f40aa7195d6fc46f051e6225","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    try:"},{"line_number":43,"context_line":"        image_volume_cache.create()"},{"line_number":44,"context_line":"    except Exception:"},{"line_number":45,"context_line":"        LOG.error(_LE(\"Table |%s| not created!\"), repr(image_volume_cache))"},{"line_number":46,"context_line":"        raise"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_70a19193","line":45,"updated":"2015-07-28 14:29:18.000000000","message":"Please, remove logging from the migration","commit_id":"7e4ad4226a8445c95aa4506d660bf75ae69e6fa9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"93c01795db52de7abf9084242a21a8a92a803858","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    try:"},{"line_number":43,"context_line":"        image_volume_cache.create()"},{"line_number":44,"context_line":"    except Exception:"},{"line_number":45,"context_line":"        LOG.error(_LE(\"Table |%s| not created!\"), repr(image_volume_cache))"},{"line_number":46,"context_line":"        raise"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_e7895470","line":45,"in_reply_to":"3a50d1a3_70a19193","updated":"2015-07-28 22:46:05.000000000","message":"Done","commit_id":"7e4ad4226a8445c95aa4506d660bf75ae69e6fa9"}],"cinder/db/sqlalchemy/migrate_repo/versions/053_add_image_volume_cache_table.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"0cbe8c8afb6dd567f845d68fb4555b5fbad3fd81","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":28,"context_line":"        Column(\u0027host\u0027, String(length\u003d255), index\u003dTrue, nullable\u003dFalse),"},{"line_number":29,"context_line":"        Column(\u0027image_id\u0027, String(length\u003d36), index\u003dTrue, nullable\u003dFalse),"},{"line_number":30,"context_line":"        Column(\u0027volume_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        Column(\u0027size\u0027, Integer, nullable\u003dFalse),"},{"line_number":32,"context_line":"        Column(\u0027last_used\u0027, DateTime, nullable\u003dFalse),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa1b9901_33385f3d","line":30,"updated":"2015-08-25 17:43:05.000000000","message":"any reason we might want a foreign key pointing to the volumes table for this?","commit_id":"6cefa6bb917c9e9dcd19103c22547300b5827303"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e08bea8f72b7f35f4cc0e71dec5c9968e2fe45c4","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":28,"context_line":"        Column(\u0027host\u0027, String(length\u003d255), index\u003dTrue, nullable\u003dFalse),"},{"line_number":29,"context_line":"        Column(\u0027image_id\u0027, String(length\u003d36), index\u003dTrue, nullable\u003dFalse),"},{"line_number":30,"context_line":"        Column(\u0027volume_id\u0027, String(length\u003d36), nullable\u003dFalse),"},{"line_number":31,"context_line":"        Column(\u0027size\u0027, Integer, nullable\u003dFalse),"},{"line_number":32,"context_line":"        Column(\u0027last_used\u0027, DateTime, nullable\u003dFalse),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa1b9901_9631d95c","line":30,"in_reply_to":"fa1b9901_33385f3d","updated":"2015-08-25 18:11:11.000000000","message":"I thought about that, but we don\u0027t really need it anywhere. The only place we have to use this is when creating a cloned volume and the code in the manager/flow only need the id.\n\nMaybe as a future enhancement we could do that to potentially remove a db lookup call, but it would require changing the create volume from source code path too.","commit_id":"6cefa6bb917c9e9dcd19103c22547300b5827303"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"0c060da55861b12f4966ab1a2f0979c8577b664b","unresolved":false,"context_lines":[{"line_number":590,"context_line":"    \"\"\"Represents an image volume cache entry\"\"\""},{"line_number":591,"context_line":"    __tablename__ \u003d \u0027image_volume_cache\u0027"},{"line_number":592,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":593,"context_line":"    host_id \u003d Column(String(255), index\u003dTrue, nullable\u003dFalse)"},{"line_number":594,"context_line":"    image_id \u003d Column(String(36), index\u003dTrue, nullable\u003dFalse)"},{"line_number":595,"context_line":"    image_updated_at \u003d Column(DateTime, nullable\u003dFalse)"},{"line_number":596,"context_line":"    volume_id \u003d Column(String(36), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_0f686a86","line":593,"updated":"2015-07-07 16:01:30.000000000","message":"This should just be \"host\" to be consistent with other tables.","commit_id":"9813d2792e73c8b7f3ebdf7f5da6f33a388f0a85"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"d1877bf1c4510f3edbcf5515b693b4da6a9e65d9","unresolved":false,"context_lines":[{"line_number":590,"context_line":"    \"\"\"Represents an image volume cache entry\"\"\""},{"line_number":591,"context_line":"    __tablename__ \u003d \u0027image_volume_cache\u0027"},{"line_number":592,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":593,"context_line":"    host_id \u003d Column(String(255), index\u003dTrue, nullable\u003dFalse)"},{"line_number":594,"context_line":"    image_id \u003d Column(String(36), index\u003dTrue, nullable\u003dFalse)"},{"line_number":595,"context_line":"    image_updated_at \u003d Column(DateTime, nullable\u003dFalse)"},{"line_number":596,"context_line":"    volume_id \u003d Column(String(36), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba3cc151_9a9eefb6","line":593,"in_reply_to":"ba3cc151_0f686a86","updated":"2015-07-07 18:31:20.000000000","message":"Done","commit_id":"9813d2792e73c8b7f3ebdf7f5da6f33a388f0a85"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"327ff8bf83571944831c6b575e72e31cdaa06b14","unresolved":false,"context_lines":[{"line_number":586,"context_line":"    value \u003d Column(String(255))"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"class ImageVolumeCacheEntry(BASE, models.ModelBase):"},{"line_number":590,"context_line":"    \"\"\"Represents an image volume cache entry\"\"\""},{"line_number":591,"context_line":"    __tablename__ \u003d \u0027image_volume_cache\u0027"},{"line_number":592,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba3cc151_3bbbf710","line":589,"updated":"2015-07-08 15:25:06.000000000","message":"Should this just be called ImageVolumeCache without \"Entry\" to follow the naming convention?","commit_id":"5d6835ac8e0e31ce96d35e6acf5c29d6c4930b8a"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"2238f7de56c61c6a740254243cc3c4105235a83e","unresolved":false,"context_lines":[{"line_number":586,"context_line":"    value \u003d Column(String(255))"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"class ImageVolumeCacheEntry(BASE, models.ModelBase):"},{"line_number":590,"context_line":"    \"\"\"Represents an image volume cache entry\"\"\""},{"line_number":591,"context_line":"    __tablename__ \u003d \u0027image_volume_cache\u0027"},{"line_number":592,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba3cc151_f817caa0","line":589,"in_reply_to":"ba3cc151_3bbbf710","updated":"2015-07-08 18:19:53.000000000","message":"Hmm yea I\u0027ll update it, but I think to more closely follow the pattern (Volume -\u003e \u0027volumes\u0027, Snapshot -\u003e \u0027snapshots, etc etc) I\u0027ll leave the model name as-is and change the table name to \u0027image_volume_cache_entries\u0027. That keeps the singular model class name, and plural table name.","commit_id":"5d6835ac8e0e31ce96d35e6acf5c29d6c4930b8a"}],"cinder/image/cache.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"327ff8bf83571944831c6b575e72e31cdaa06b14","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        LOG.debug(\u0027Image-volume cache entry image_update_at \u003d %(entry_utc)s, \u0027"},{"line_number":234,"context_line":"                  \u0027requested image updated_at \u003d %(image_utc)s\u0027,"},{"line_number":235,"context_line":"                  {\u0027entry_utc\u0027: str(cache_updated_utc),"},{"line_number":236,"context_line":"                   \u0027image_utc\u0027: str(image_updated_utc)})"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        return image_updated_utc !\u003d cache_updated_utc"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba3cc151_fbffcffe","line":235,"updated":"2015-07-08 15:25:06.000000000","message":"six.text_type","commit_id":"5d6835ac8e0e31ce96d35e6acf5c29d6c4930b8a"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"2238f7de56c61c6a740254243cc3c4105235a83e","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        LOG.debug(\u0027Image-volume cache entry image_update_at \u003d %(entry_utc)s, \u0027"},{"line_number":234,"context_line":"                  \u0027requested image updated_at \u003d %(image_utc)s\u0027,"},{"line_number":235,"context_line":"                  {\u0027entry_utc\u0027: str(cache_updated_utc),"},{"line_number":236,"context_line":"                   \u0027image_utc\u0027: str(image_updated_utc)})"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        return image_updated_utc !\u003d cache_updated_utc"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba3cc151_9dcd5032","line":235,"in_reply_to":"ba3cc151_fbffcffe","updated":"2015-07-08 18:19:53.000000000","message":"Done","commit_id":"5d6835ac8e0e31ce96d35e6acf5c29d6c4930b8a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"327ff8bf83571944831c6b575e72e31cdaa06b14","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return image_updated_utc !\u003d cache_updated_utc"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def _entry_to_str(self, cache_entry):"},{"line_number":241,"context_line":"        return str({"},{"line_number":242,"context_line":"            \u0027id\u0027: cache_entry[\u0027id\u0027],"},{"line_number":243,"context_line":"            \u0027image_id\u0027: cache_entry[\u0027image_id\u0027],"},{"line_number":244,"context_line":"            \u0027volume_id\u0027: cache_entry[\u0027volume_id\u0027],"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba3cc151_a0491633","line":241,"updated":"2015-07-08 15:25:06.000000000","message":"Should use six.text_type instead of str.","commit_id":"5d6835ac8e0e31ce96d35e6acf5c29d6c4930b8a"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"2238f7de56c61c6a740254243cc3c4105235a83e","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return image_updated_utc !\u003d cache_updated_utc"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def _entry_to_str(self, cache_entry):"},{"line_number":241,"context_line":"        return str({"},{"line_number":242,"context_line":"            \u0027id\u0027: cache_entry[\u0027id\u0027],"},{"line_number":243,"context_line":"            \u0027image_id\u0027: cache_entry[\u0027image_id\u0027],"},{"line_number":244,"context_line":"            \u0027volume_id\u0027: cache_entry[\u0027volume_id\u0027],"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba3cc151_bdd294cf","line":241,"in_reply_to":"ba3cc151_a0491633","updated":"2015-07-08 18:19:53.000000000","message":"Done","commit_id":"5d6835ac8e0e31ce96d35e6acf5c29d6c4930b8a"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"8de0d1eac0ea29e1015da56089e9e70af76e2510","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        virtual_size \u003d glance.get_virtual_size_gb(image_meta)"},{"line_number":64,"context_line":"        if virtual_size is None:"},{"line_number":65,"context_line":"            LOG.info(_LI(\u0027Unable to create cache volume because image %s \u0027"},{"line_number":66,"context_line":"                         \u0027does not include properties.virtual_size.\u0027),"},{"line_number":67,"context_line":"                     image_meta[\u0027id\u0027])"},{"line_number":68,"context_line":"            return False"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a50d1a3_3a9986c4","line":66,"updated":"2015-07-29 04:28:03.000000000","message":"Saw this scrolling by when I was testing. I don\u0027t think this going to be helpful to operators in knowing what a properties  virtual size is.","commit_id":"218f4284c08bc35cac552734d59fe524e77bcf7f"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaa8b614ce83bd078f17fd17d8ea79d1953f667a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        # When we are creating an image from a volume the updated_at field"},{"line_number":109,"context_line":"        # will be a unicode representation of the datetime. In that case"},{"line_number":110,"context_line":"        # we just need to parse it into one. If it is an actual datetime"},{"line_number":111,"context_line":"        # we want to just grab it as a UTC naive datetime."},{"line_number":112,"context_line":"        image_updated_at \u003d image_meta[\u0027updated_at\u0027]"},{"line_number":113,"context_line":"        if type(image_updated_at) is unicode:"},{"line_number":114,"context_line":"            image_updated_at \u003d timeutils.parse_strtime(image_updated_at)"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a4dcd0f_6f086292","line":111,"updated":"2015-08-09 01:42:09.000000000","message":"Do you mean \"naive\"?","commit_id":"2c86af2ae78052868aeae8d36dc8830a87c28da1"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6df143ecd5bc2cc8935ef312ebbb5f94bad2526f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        # When we are creating an image from a volume the updated_at field"},{"line_number":109,"context_line":"        # will be a unicode representation of the datetime. In that case"},{"line_number":110,"context_line":"        # we just need to parse it into one. If it is an actual datetime"},{"line_number":111,"context_line":"        # we want to just grab it as a UTC naive datetime."},{"line_number":112,"context_line":"        image_updated_at \u003d image_meta[\u0027updated_at\u0027]"},{"line_number":113,"context_line":"        if type(image_updated_at) is unicode:"},{"line_number":114,"context_line":"            image_updated_at \u003d timeutils.parse_strtime(image_updated_at)"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a4dcd0f_e8f8e34b","line":111,"in_reply_to":"1a4dcd0f_6f086292","updated":"2015-08-09 18:25:05.000000000","message":"Yes? That seems to be a lingo from the docs https://docs.python.org/2/library/datetime.html","commit_id":"2c86af2ae78052868aeae8d36dc8830a87c28da1"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaa8b614ce83bd078f17fd17d8ea79d1953f667a","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            LOG.debug(\u0027Image-volume cache for host %(host)s new size (GB) \u003d \u0027"},{"line_number":173,"context_line":"                      \u0027%(size_gb)s, new count \u003d %(count)s\u0027,"},{"line_number":174,"context_line":"                      {\u0027host\u0027: host,"},{"line_number":175,"context_line":"                       \u0027size_gb\u0027: str(current_size),"},{"line_number":176,"context_line":"                       \u0027count\u0027: str(current_count)})"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        # It is only possible to not free up enough gb, we will always be able"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a4dcd0f_2f025a70","line":175,"updated":"2015-08-09 01:42:09.000000000","message":"Use six.text_type instead of str","commit_id":"2c86af2ae78052868aeae8d36dc8830a87c28da1"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6df143ecd5bc2cc8935ef312ebbb5f94bad2526f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            LOG.debug(\u0027Image-volume cache for host %(host)s new size (GB) \u003d \u0027"},{"line_number":173,"context_line":"                      \u0027%(size_gb)s, new count \u003d %(count)s\u0027,"},{"line_number":174,"context_line":"                      {\u0027host\u0027: host,"},{"line_number":175,"context_line":"                       \u0027size_gb\u0027: str(current_size),"},{"line_number":176,"context_line":"                       \u0027count\u0027: str(current_count)})"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        # It is only possible to not free up enough gb, we will always be able"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a4dcd0f_c84de7c5","line":175,"in_reply_to":"1a4dcd0f_2f025a70","updated":"2015-08-09 18:25:05.000000000","message":"As I look at this again I think we don\u0027t even need str or six.text_type, that value should pretty much always be safe to go directly into the parameter dictionary.","commit_id":"2c86af2ae78052868aeae8d36dc8830a87c28da1"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaa8b614ce83bd078f17fd17d8ea79d1953f667a","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                      \u0027%(size_gb)s, new count \u003d %(count)s\u0027,"},{"line_number":174,"context_line":"                      {\u0027host\u0027: host,"},{"line_number":175,"context_line":"                       \u0027size_gb\u0027: str(current_size),"},{"line_number":176,"context_line":"                       \u0027count\u0027: str(current_count)})"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        # It is only possible to not free up enough gb, we will always be able"},{"line_number":179,"context_line":"        # to free enough count. This is because 0 means unlimited which means"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a4dcd0f_cff7368b","line":176,"updated":"2015-08-09 01:42:09.000000000","message":"Same","commit_id":"2c86af2ae78052868aeae8d36dc8830a87c28da1"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6df143ecd5bc2cc8935ef312ebbb5f94bad2526f","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                      \u0027%(size_gb)s, new count \u003d %(count)s\u0027,"},{"line_number":174,"context_line":"                      {\u0027host\u0027: host,"},{"line_number":175,"context_line":"                       \u0027size_gb\u0027: str(current_size),"},{"line_number":176,"context_line":"                       \u0027count\u0027: str(current_count)})"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        # It is only possible to not free up enough gb, we will always be able"},{"line_number":179,"context_line":"        # to free enough count. This is because 0 means unlimited which means"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a4dcd0f_085e6f45","line":176,"in_reply_to":"1a4dcd0f_cff7368b","updated":"2015-08-09 18:25:05.000000000","message":"Fixed","commit_id":"2c86af2ae78052868aeae8d36dc8830a87c28da1"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"b05cc4859450c59da044bdc20a718fa5c58bfb1c","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def can_use_cache(self, volume, image_meta):"},{"line_number":51,"context_line":"        # Is the image owned by this tenant or public?"},{"line_number":52,"context_line":"        if ((not image_meta.get(\u0027is_public\u0027, False)) and"},{"line_number":53,"context_line":"                (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027])):"},{"line_number":54,"context_line":"            LOG.info(_LI(\u0027Unable to use ImageVolumeCache because image %s \u0027"},{"line_number":55,"context_line":"                         \u0027is not accessible by internal tenant.\u0027),"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a4dcd0f_38450b6e","line":52,"updated":"2015-08-12 20:59:19.000000000","message":"If Image API v2 is enabled, the key \u0027is_public\u0027 is not available.\nInstead, the key \u0027visibility\u0027 must be used.","commit_id":"6b0fecbdc6577ed0ef097af9af74655b1acf43f2"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"72676728202c7a181351fba07918bf580b22a87f","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def can_use_cache(self, volume, image_meta):"},{"line_number":51,"context_line":"        # Is the image owned by this tenant or public?"},{"line_number":52,"context_line":"        if ((not image_meta.get(\u0027is_public\u0027, False)) and"},{"line_number":53,"context_line":"                (image_meta[\u0027owner\u0027] !\u003d volume[\u0027project_id\u0027])):"},{"line_number":54,"context_line":"            LOG.info(_LI(\u0027Unable to use ImageVolumeCache because image %s \u0027"},{"line_number":55,"context_line":"                         \u0027is not accessible by internal tenant.\u0027),"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a4dcd0f_8a496162","line":52,"in_reply_to":"1a4dcd0f_38450b6e","updated":"2015-08-13 01:29:30.000000000","message":"Done","commit_id":"6b0fecbdc6577ed0ef097af9af74655b1acf43f2"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"a999aee16699cd76dca006b14055d05c3fe899fe","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            image_updated_at \u003d image_updated_at.astimezone(timezone(\u0027UTC\u0027))"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        image_updated_at.replace(tzinfo\u003dNone)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        cache_entry \u003d self.db.image_volume_cache_create("},{"line_number":122,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a4dcd0f_09d1a82f","line":119,"updated":"2015-08-13 21:18:18.000000000","message":"datetime replace just returns replaced value and don\u0027t modify original object. This should move to ...","commit_id":"725a1617f9c1a252008e5e0aec5157f747a1e90e"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"25c5de5cc0abd9f615b01fb0f8ef392bc27bc7b9","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        else:"},{"line_number":117,"context_line":"            image_updated_at \u003d image_updated_at.astimezone(timezone(\u0027UTC\u0027))"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        image_updated_at.replace(tzinfo\u003dNone)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        cache_entry \u003d self.db.image_volume_cache_create("},{"line_number":122,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a4dcd0f_e70ca0ee","line":119,"in_reply_to":"1a4dcd0f_09d1a82f","updated":"2015-08-14 00:46:05.000000000","message":"Done","commit_id":"725a1617f9c1a252008e5e0aec5157f747a1e90e"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"a999aee16699cd76dca006b14055d05c3fe899fe","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            context,"},{"line_number":123,"context_line":"            volume_ref[\u0027host\u0027],"},{"line_number":124,"context_line":"            image_id,"},{"line_number":125,"context_line":"            image_updated_at,"},{"line_number":126,"context_line":"            volume_ref[\u0027id\u0027],"},{"line_number":127,"context_line":"            volume_ref[\u0027size\u0027]"},{"line_number":128,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a4dcd0f_89e5b80b","line":125,"updated":"2015-08-13 21:18:18.000000000","message":"here.","commit_id":"725a1617f9c1a252008e5e0aec5157f747a1e90e"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"edf1d59b5d199001be07f3ed3e38fa4b76a9bf4b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        created and is in an available state."},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        LOG.debug(\u0027Creating new image-volume cache entry for image \u0027"},{"line_number":82,"context_line":"                  \u0027%(image_id)s on host %(host)s\u0027,"},{"line_number":83,"context_line":"                  {\u0027image_id\u0027: image_id, \u0027host\u0027: volume_ref[\u0027host\u0027]})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        # When we are creating an image from a volume the updated_at field"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_74d48146","line":82,"updated":"2015-08-27 20:51:01.000000000","message":"Some of your debug messages have periods.  Some don\u0027t.  Can we make that consistent please?","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"890be1c4afe7407b16e44e72455c3ee75ec3bfcb","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        created and is in an available state."},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        LOG.debug(\u0027Creating new image-volume cache entry for image \u0027"},{"line_number":82,"context_line":"                  \u0027%(image_id)s on host %(host)s\u0027,"},{"line_number":83,"context_line":"                  {\u0027image_id\u0027: image_id, \u0027host\u0027: volume_ref[\u0027host\u0027]})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        # When we are creating an image from a volume the updated_at field"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_ef8518ad","line":82,"in_reply_to":"da20952f_74d48146","updated":"2015-08-27 21:12:46.000000000","message":"Done","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"edf1d59b5d199001be07f3ed3e38fa4b76a9bf4b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # When we are creating an image from a volume the updated_at field"},{"line_number":86,"context_line":"        # will be a unicode representation of the datetime. In that case"},{"line_number":87,"context_line":"        # we just need to parse it into one. If it is an actual datetime"},{"line_number":88,"context_line":"        # we want to just grab it as a UTC naive datetime."},{"line_number":89,"context_line":"        image_updated_at \u003d image_meta[\u0027updated_at\u0027]"},{"line_number":90,"context_line":"        if type(image_updated_at) in [unicode, str]:"},{"line_number":91,"context_line":"            image_updated_at \u003d timeutils.parse_strtime(image_updated_at)"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_d469cdbf","line":88,"updated":"2015-08-27 20:51:01.000000000","message":"naive -\u003e native.","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"890be1c4afe7407b16e44e72455c3ee75ec3bfcb","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # When we are creating an image from a volume the updated_at field"},{"line_number":86,"context_line":"        # will be a unicode representation of the datetime. In that case"},{"line_number":87,"context_line":"        # we just need to parse it into one. If it is an actual datetime"},{"line_number":88,"context_line":"        # we want to just grab it as a UTC naive datetime."},{"line_number":89,"context_line":"        image_updated_at \u003d image_meta[\u0027updated_at\u0027]"},{"line_number":90,"context_line":"        if type(image_updated_at) in [unicode, str]:"},{"line_number":91,"context_line":"            image_updated_at \u003d timeutils.parse_strtime(image_updated_at)"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_6fc028e1","line":88,"in_reply_to":"da20952f_d469cdbf","updated":"2015-08-27 21:12:46.000000000","message":"naive is the right work (I think), the datetime is in UTC time but has no timezone information, https://docs.python.org/2/library/datetime.html","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"}],"cinder/image/glance.py":[{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2c9aafa75e1cebc822010d196ceac649b764b1f4","unresolved":false,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"def get_virtual_size_gb(image_meta):"},{"line_number":600,"context_line":"    if (\u0027properties\u0027 in image_meta and"},{"line_number":601,"context_line":"            \u0027virtual_size\u0027 in image_meta[\u0027properties\u0027]):"},{"line_number":602,"context_line":"        virtual_size \u003d image_meta[\u0027properties\u0027][\u0027virtual_size\u0027]"},{"line_number":603,"context_line":"        return int(math.ceil(float(virtual_size)))"},{"line_number":604,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a50d1a3_4d231006","line":601,"updated":"2015-07-24 20:55:01.000000000","message":"This looks like reading virtual_size in the image metadata.\nIn Glance API v2, it returns \"virtual_size\" parameter, like:\n  http://paste.openstack.org/show/405451/\n\nIn addition, when you upload the volume data to an image, as virtual_size is not set in the image metadata nor the image entry. Because of this, the image cache are not actually used on image creation from the uploaded image by an error:\n\n  Unable to create cache volume because image XXX does not include properties.virtual_size.\n\nHow is the \"virtual_size\" intended to be set for this?","commit_id":"df433244df6bbc887ebe6a988e2e8b3c92d5a0d3"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"381fcf4c66a342cfebc8f81862b0482992f3699a","unresolved":false,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"def get_virtual_size_gb(image_meta):"},{"line_number":600,"context_line":"    if (\u0027properties\u0027 in image_meta and"},{"line_number":601,"context_line":"            \u0027virtual_size\u0027 in image_meta[\u0027properties\u0027]):"},{"line_number":602,"context_line":"        virtual_size \u003d image_meta[\u0027properties\u0027][\u0027virtual_size\u0027]"},{"line_number":603,"context_line":"        return int(math.ceil(float(virtual_size)))"},{"line_number":604,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a50d1a3_fdf5e3ec","line":601,"in_reply_to":"3a50d1a3_4d231006","updated":"2015-07-25 03:19:58.000000000","message":"Ohh interesting I didn\u0027t know the v2 api returned that (I probably should have checked the docs more thoroughly). I was operating on the assumption we would require a user to set the property for images.\n\nNow for the images being created from a volume, I guess its probably safe to assume the virtual size is the source volume. I\u0027ll have to play around with that one some more.","commit_id":"df433244df6bbc887ebe6a988e2e8b3c92d5a0d3"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"94f1459347f49304cb95cc4c0346e4678ebbd8b8","unresolved":false,"context_lines":[{"line_number":600,"context_line":"    if (\u0027properties\u0027 in image_meta and"},{"line_number":601,"context_line":"            \u0027virtual_size\u0027 in image_meta[\u0027properties\u0027]):"},{"line_number":602,"context_line":"        virtual_size \u003d image_meta[\u0027properties\u0027][\u0027virtual_size\u0027]"},{"line_number":603,"context_line":"        return int(math.ceil(float(virtual_size)))"},{"line_number":604,"context_line":"    else:"},{"line_number":605,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a50d1a3_885ca6ee","line":603,"updated":"2015-07-24 21:15:52.000000000","message":"Don\u0027t you have to divide it with units.Gi?","commit_id":"df433244df6bbc887ebe6a988e2e8b3c92d5a0d3"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"381fcf4c66a342cfebc8f81862b0482992f3699a","unresolved":false,"context_lines":[{"line_number":600,"context_line":"    if (\u0027properties\u0027 in image_meta and"},{"line_number":601,"context_line":"            \u0027virtual_size\u0027 in image_meta[\u0027properties\u0027]):"},{"line_number":602,"context_line":"        virtual_size \u003d image_meta[\u0027properties\u0027][\u0027virtual_size\u0027]"},{"line_number":603,"context_line":"        return int(math.ceil(float(virtual_size)))"},{"line_number":604,"context_line":"    else:"},{"line_number":605,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a50d1a3_ddf26706","line":603,"in_reply_to":"3a50d1a3_885ca6ee","updated":"2015-07-25 03:19:58.000000000","message":"Yea if we are going to use what the v2 api gives back we will, this was written on the assumption we would get GB values for it set (since everything else in cinder uses GB). I\u0027ll change this.","commit_id":"df433244df6bbc887ebe6a988e2e8b3c92d5a0d3"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"725fa12eeda8ed877d01ec56f047fb7be5454635","unresolved":false,"context_lines":[{"line_number":622,"context_line":"    if virtual_size is not None:"},{"line_number":623,"context_line":"        return int(math.ceil(float(virtual_size) / units.Gi))"},{"line_number":624,"context_line":"    else:"},{"line_number":625,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a4dcd0f_9e49a762","line":625,"updated":"2015-08-12 21:29:23.000000000","message":"Can\u0027t we regard the image size \u003d virtual size if the image format is raw? That will enable cache for raw images regardless of  whether they have virtual_size metadata.","commit_id":"6b0fecbdc6577ed0ef097af9af74655b1acf43f2"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"72676728202c7a181351fba07918bf580b22a87f","unresolved":false,"context_lines":[{"line_number":622,"context_line":"    if virtual_size is not None:"},{"line_number":623,"context_line":"        return int(math.ceil(float(virtual_size) / units.Gi))"},{"line_number":624,"context_line":"    else:"},{"line_number":625,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a4dcd0f_817b87f4","line":625,"in_reply_to":"1a4dcd0f_9e49a762","updated":"2015-08-13 01:29:30.000000000","message":"Yea definitely, thats a good idea!","commit_id":"6b0fecbdc6577ed0ef097af9af74655b1acf43f2"}],"cinder/volume/flows/manager/create_volume.py":[{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"443205b1ada2d829e77bcc6638abc8a3cf7e0859","unresolved":false,"context_lines":[{"line_number":752,"context_line":"                                updates"},{"line_number":753,"context_line":"                            )"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"                model_update \u003d self._create_from_image_download("},{"line_number":756,"context_line":"                    context,"},{"line_number":757,"context_line":"                    volume_ref,"},{"line_number":758,"context_line":"                    image_location,"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_b6d1bacf","line":755,"updated":"2015-08-18 19:24:22.000000000","message":"Shouldn\u0027t this be in the \u0027with image_utils.TemporaryImages.fetch\u0027 clause?\nOtherwise, the temporary image is removed and then downloaded again.","commit_id":"54c53e5ea40c75188577169946933cec63c86ad8"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"1fcc75d0c0a5c447f9db0849065537ed0a5dd9a8","unresolved":false,"context_lines":[{"line_number":752,"context_line":"                                updates"},{"line_number":753,"context_line":"                            )"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"                model_update \u003d self._create_from_image_download("},{"line_number":756,"context_line":"                    context,"},{"line_number":757,"context_line":"                    volume_ref,"},{"line_number":758,"context_line":"                    image_location,"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_6ac5718c","line":755,"in_reply_to":"fa1b9901_b6d1bacf","updated":"2015-08-18 21:02:59.000000000","message":"Good catch, you are correct. I think in the process of rearranging some of this I forgot about that...","commit_id":"54c53e5ea40c75188577169946933cec63c86ad8"},{"author":{"_account_id":17718,"name":"Lallana","email":"gaozhiqiang2@huawei.com","username":"Lallana"},"change_message_id":"0ba15a0b9ffb32a143bcb55de1082889777782c5","unresolved":false,"context_lines":[{"line_number":746,"context_line":"                        if virtual_size \u003e volume_ref.size:"},{"line_number":747,"context_line":"                            params \u003d {\u0027image_size\u0027: virtual_size,"},{"line_number":748,"context_line":"                                      \u0027volume_size\u0027: volume_ref.size}"},{"line_number":749,"context_line":"                            reason \u003d _(\"Image virtual size is %(image_size)dGB\""},{"line_number":750,"context_line":"                                       \" and doesn\u0027t fit in a volume of size\""},{"line_number":751,"context_line":"                                       \" %(volume_size)dGB.\") % params"},{"line_number":752,"context_line":"                            raise exception.ImageUnacceptable("}],"source_content_type":"text/x-python","patch_set":45,"id":"fa1b9901_789f7d50","line":749,"updated":"2015-08-25 03:28:59.000000000","message":"Change \"reason\" to \"message\"\nreason\u003dmessage","commit_id":"53d2a592e87b1232245d5868b945341d1b27dd1e"}],"cinder/volume/manager.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"edf1d59b5d199001be07f3ed3e38fa4b76a9bf4b","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                max_cache_size,"},{"line_number":252,"context_line":"                max_cache_entries"},{"line_number":253,"context_line":"            )"},{"line_number":254,"context_line":"            LOG.debug(\u0027Image-volume cache enabled for host %(host)s\u0027,"},{"line_number":255,"context_line":"                      {\u0027host\u0027: self.host})"},{"line_number":256,"context_line":"        else:"},{"line_number":257,"context_line":"            LOG.debug(\u0027Image-volume cache disabled for host %(host)s\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_8f1edc61","line":254,"updated":"2015-08-27 20:51:01.000000000","message":"I think this would be better as LOG.info please.","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"890be1c4afe7407b16e44e72455c3ee75ec3bfcb","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                max_cache_size,"},{"line_number":252,"context_line":"                max_cache_entries"},{"line_number":253,"context_line":"            )"},{"line_number":254,"context_line":"            LOG.debug(\u0027Image-volume cache enabled for host %(host)s\u0027,"},{"line_number":255,"context_line":"                      {\u0027host\u0027: self.host})"},{"line_number":256,"context_line":"        else:"},{"line_number":257,"context_line":"            LOG.debug(\u0027Image-volume cache disabled for host %(host)s\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_4fc8c422","line":254,"in_reply_to":"da20952f_8f1edc61","updated":"2015-08-27 21:12:46.000000000","message":"Done","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"},{"author":{"_account_id":5149,"name":"Sean Chen","email":"xuchenx@gmail.com","username":"opencompute"},"change_message_id":"f23a6e6aad6e1cdaba5777d86cf552cfac8a1b65","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"                            {\u0027image\u0027: image_id, \u0027host\u0027: volume_ref[\u0027host\u0027]})"},{"line_number":1012,"context_line":"                return"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"            image_volume \u003d self._clone_image_volume(ctx,"},{"line_number":1015,"context_line":"                                                    volume_ref,"},{"line_number":1016,"context_line":"                                                    image_meta)"},{"line_number":1017,"context_line":"            if not image_volume:"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_b5aa4418","line":1014,"updated":"2015-08-27 06:00:41.000000000","message":"I wish there is an optional way to switch the source and target.\n\nIn this scenario, the source volume will be cloned into image_volume, then the original will be extended to full size.\n\nIn a different scenario, the source volume should just be the image_volume, and the cloned volume will be extended to full size.","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"077f27fdc4ed2750ed902f666bbca956855bce4a","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"                            {\u0027image\u0027: image_id, \u0027host\u0027: volume_ref[\u0027host\u0027]})"},{"line_number":1012,"context_line":"                return"},{"line_number":1013,"context_line":""},{"line_number":1014,"context_line":"            image_volume \u003d self._clone_image_volume(ctx,"},{"line_number":1015,"context_line":"                                                    volume_ref,"},{"line_number":1016,"context_line":"                                                    image_meta)"},{"line_number":1017,"context_line":"            if not image_volume:"}],"source_content_type":"text/x-python","patch_set":48,"id":"da20952f_9654c221","line":1014,"in_reply_to":"da20952f_b5aa4418","updated":"2015-08-27 18:15:25.000000000","message":"That was the original design, but it makes things more restrictive and I did not figure out a good way to solve it. I also didn\u0027t look too hard into it because this solution works perfectly for the backends I\u0027ve tested it with. Does it not work for you?\n\nThe problem I ran into is with the image permissions, we need to have the tenant/user in the calling context to create the volume from the image. This means that the image-volume which is owned by the internal tenant cannot access the image data (unless the internal tenant has been configured with permission to get the glance image).\n\nThis is probably something we can tackle with more time in a future enhancement of the feature. There should be no change from an end-users perspective so its not really any reason to block this patch as-is.","commit_id":"b4ae30ff4c83554224931b21988491d9bbbbdb66"}]}
