)]}'
{"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"fb6b87a109e25650345255814de4e33d5e39572c","unresolved":false,"context_lines":[{"line_number":5749,"context_line":"                          \u0027deleted\u0027: True,"},{"line_number":5750,"context_line":"                          \u0027deleted_at\u0027: timeutils.utcnow(),"},{"line_number":5751,"context_line":"                          \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)}"},{"line_number":5752,"context_line":"        model_query(context, models.GroupSnapshot, session\u003dsession).\\"},{"line_number":5753,"context_line":"            filter_by(id\u003dgroup_snapshot_id).\\"},{"line_number":5754,"context_line":"            update(updated_values)"},{"line_number":5755,"context_line":"    del updated_values[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":69,"id":"fa7ab95a_176cbf06","line":5752,"range":{"start_line":5752,"start_character":8,"end_line":5752,"end_character":19},"updated":"2016-08-30 17:56:53.000000000","message":"Don\u0027t we need a check here to make sure that the GroupSnapshot exists?","commit_id":"325f99a64aeb3e7a768904781d854c19bb540580"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"dacf73c43f75f0787d7479aebd4364cc82fd87c3","unresolved":false,"context_lines":[{"line_number":5749,"context_line":"                          \u0027deleted\u0027: True,"},{"line_number":5750,"context_line":"                          \u0027deleted_at\u0027: timeutils.utcnow(),"},{"line_number":5751,"context_line":"                          \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027)}"},{"line_number":5752,"context_line":"        model_query(context, models.GroupSnapshot, session\u003dsession).\\"},{"line_number":5753,"context_line":"            filter_by(id\u003dgroup_snapshot_id).\\"},{"line_number":5754,"context_line":"            update(updated_values)"},{"line_number":5755,"context_line":"    del updated_values[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":69,"id":"fa7ab95a_37054045","line":5752,"range":{"start_line":5752,"start_character":8,"end_line":5752,"end_character":19},"in_reply_to":"fa7ab95a_176cbf06","updated":"2016-08-30 18:13:22.000000000","message":"Good question.  I checked other places and it looks like this is consistent with other destroy methods.","commit_id":"325f99a64aeb3e7a768904781d854c19bb540580"}],"cinder/db/sqlalchemy/migrate_repo/versions/079_add_group_snapshots.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"9f2d3ca53cd83a5722802ed86ced955db7883c4b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2016 EMC Corporation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_648e777a","line":1,"updated":"2016-08-29 21:32:20.000000000","message":"is this really required?","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c33cdc7496fca5fbbe3680cdb336c11b4458974d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2016 EMC Corporation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_9c53d36a","line":1,"in_reply_to":"fa7ab95a_648e777a","updated":"2016-08-29 22:18:19.000000000","message":"No required:).  I usually add copyright for a new file added by me.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":31,"context_line":"        Column(\u0027deleted_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":32,"context_line":"        Column(\u0027deleted\u0027, Boolean(create_constraint\u003dTrue, name\u003dNone)),"},{"line_number":33,"context_line":"        Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027group_id\u0027, String(36),"},{"line_number":35,"context_line":"               ForeignKey(\u0027groups.id\u0027),"},{"line_number":36,"context_line":"               nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_9e61e707","line":33,"range":{"start_line":33,"start_character":49,"end_line":33,"end_character":65},"updated":"2016-08-30 11:55:41.000000000","message":"I don\u0027t think this is needed for primary key.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        Column(\u0027updated_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":31,"context_line":"        Column(\u0027deleted_at\u0027, DateTime(timezone\u003dFalse)),"},{"line_number":32,"context_line":"        Column(\u0027deleted\u0027, Boolean(create_constraint\u003dTrue, name\u003dNone)),"},{"line_number":33,"context_line":"        Column(\u0027id\u0027, String(36), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027group_id\u0027, String(36),"},{"line_number":35,"context_line":"               ForeignKey(\u0027groups.id\u0027),"},{"line_number":36,"context_line":"               nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_4d1faf5a","line":33,"range":{"start_line":33,"start_character":49,"end_line":33,"end_character":65},"in_reply_to":"fa7ab95a_9e61e707","updated":"2016-08-30 13:04:20.000000000","message":"Removed.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               ForeignKey(\u0027group_snapshots.id\u0027))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    snapshots.create_column(group_snapshot_id)"},{"line_number":55,"context_line":"    snapshots.update().values(group_snapshot_id\u003dNone).execute()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add group_snapshot_id column to groups table"},{"line_number":58,"context_line":"    group_snapshot_id \u003d Column(\u0027group_snapshot_id\u0027, String(36))"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_dec7ef61","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":63},"updated":"2016-08-30 11:55:41.000000000","message":"I this update required? I\u0027ve did a quick test on MySQL and it looks like the column will get NULL by default. Same goes for updates below.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                               ForeignKey(\u0027group_snapshots.id\u0027))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    snapshots.create_column(group_snapshot_id)"},{"line_number":55,"context_line":"    snapshots.update().values(group_snapshot_id\u003dNone).execute()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add group_snapshot_id column to groups table"},{"line_number":58,"context_line":"    group_snapshot_id \u003d Column(\u0027group_snapshot_id\u0027, String(36))"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_ffe4aaac","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":63},"in_reply_to":"fa7ab95a_dec7ef61","updated":"2016-08-30 13:04:20.000000000","message":"I think this is to make sure group_snapshot_id is NULL for an existing snapshots entry after migration.  However, I removed this line and tested it and it is not necessary.  I removed this line.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    snapshots.create_column(group_snapshot_id)"},{"line_number":55,"context_line":"    snapshots.update().values(group_snapshot_id\u003dNone).execute()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add group_snapshot_id column to groups table"},{"line_number":58,"context_line":"    group_snapshot_id \u003d Column(\u0027group_snapshot_id\u0027, String(36))"},{"line_number":59,"context_line":"    groups.create_column(group_snapshot_id)"},{"line_number":60,"context_line":"    groups.update().values(group_snapshot_id\u003dNone).execute()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # Add source_group_id column to groups table"},{"line_number":63,"context_line":"    source_group_id \u003d Column(\u0027source_group_id\u0027, String(36))"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_5ea4bf06","line":60,"range":{"start_line":57,"start_character":0,"end_line":60,"end_character":60},"updated":"2016-08-30 11:55:41.000000000","message":"Why do we need this relationship? A single group can have multiple group snapshots, right?","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    snapshots.create_column(group_snapshot_id)"},{"line_number":55,"context_line":"    snapshots.update().values(group_snapshot_id\u003dNone).execute()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    # Add group_snapshot_id column to groups table"},{"line_number":58,"context_line":"    group_snapshot_id \u003d Column(\u0027group_snapshot_id\u0027, String(36))"},{"line_number":59,"context_line":"    groups.create_column(group_snapshot_id)"},{"line_number":60,"context_line":"    groups.update().values(group_snapshot_id\u003dNone).execute()"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    # Add source_group_id column to groups table"},{"line_number":63,"context_line":"    source_group_id \u003d Column(\u0027source_group_id\u0027, String(36))"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_9fb8fe76","line":60,"range":{"start_line":57,"start_character":0,"end_line":60,"end_character":60},"in_reply_to":"fa7ab95a_5ea4bf06","updated":"2016-08-30 13:04:20.000000000","message":"Same as above.  I tested without this line.  It\u0027s not needed to make sure group_snapshot_id is NULL after migration.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    description \u003d Column(String(255))"},{"line_number":187,"context_line":"    status \u003d Column(String(255))"},{"line_number":188,"context_line":"    group_type_id \u003d Column(String(36))"},{"line_number":189,"context_line":"    group_snapshot_id \u003d Column(String(36))"},{"line_number":190,"context_line":"    source_group_id \u003d Column(String(36))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class Cgsnapshot(BASE, CinderBase):"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_4153fe16","line":190,"range":{"start_line":189,"start_character":0,"end_line":190,"end_character":40},"updated":"2016-08-30 11:55:41.000000000","message":"Should we have relationships defined for this?","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    description \u003d Column(String(255))"},{"line_number":187,"context_line":"    status \u003d Column(String(255))"},{"line_number":188,"context_line":"    group_type_id \u003d Column(String(36))"},{"line_number":189,"context_line":"    group_snapshot_id \u003d Column(String(36))"},{"line_number":190,"context_line":"    source_group_id \u003d Column(String(36))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class Cgsnapshot(BASE, CinderBase):"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_07cae61a","line":190,"range":{"start_line":189,"start_character":0,"end_line":190,"end_character":40},"in_reply_to":"fa7ab95a_4153fe16","updated":"2016-08-30 13:04:20.000000000","message":"I don\u0027t think we need to add it.  I looked the volumes table and it doesn\u0027t have relationships for snapshot_id and source_volid.  The group_snapshots table has a relationship defined for groups.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    __tablename__ \u003d \u0027group_snapshots\u0027"},{"line_number":216,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    group_id \u003d Column(String(36))"},{"line_number":219,"context_line":"    user_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":220,"context_line":"    project_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_61080229","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":33},"updated":"2016-08-30 11:55:41.000000000","message":"That\u0027s not nullable in DB migration. And probably should be.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    __tablename__ \u003d \u0027group_snapshots\u0027"},{"line_number":216,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    group_id \u003d Column(String(36))"},{"line_number":219,"context_line":"    user_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":220,"context_line":"    project_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_d2543ecb","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":33},"in_reply_to":"fa7ab95a_61080229","updated":"2016-08-30 13:04:20.000000000","message":"Done","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    group_id \u003d Column(String(36))"},{"line_number":219,"context_line":"    user_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":220,"context_line":"    project_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    name \u003d Column(String(255))"},{"line_number":223,"context_line":"    description \u003d Column(String(255))"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_fe7bd3bb","line":220,"range":{"start_line":219,"start_character":0,"end_line":220,"end_character":52},"updated":"2016-08-30 11:55:41.000000000","message":"You have these columns as nullable in DB migration.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    id \u003d Column(String(36), primary_key\u003dTrue)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    group_id \u003d Column(String(36))"},{"line_number":219,"context_line":"    user_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":220,"context_line":"    project_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    name \u003d Column(String(255))"},{"line_number":223,"context_line":"    description \u003d Column(String(255))"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_52402e07","line":220,"range":{"start_line":219,"start_character":0,"end_line":220,"end_character":52},"in_reply_to":"fa7ab95a_fe7bd3bb","updated":"2016-08-30 13:04:20.000000000","message":"Good catch!  Removed \"nullable\u003dFalse\".","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"}],"cinder/objects/group_snapshot.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    fields \u003d {"},{"line_number":31,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":32,"context_line":"        \u0027group_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027project_id\u0027: fields.StringField(),"},{"line_number":34,"context_line":"        \u0027user_id\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_a1de8ada","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":52},"updated":"2016-08-30 11:55:41.000000000","message":"This is not nullable in DB migration.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    fields \u003d {"},{"line_number":31,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":32,"context_line":"        \u0027group_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027project_id\u0027: fields.StringField(),"},{"line_number":34,"context_line":"        \u0027user_id\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_32c2cae9","line":32,"range":{"start_line":32,"start_character":0,"end_line":32,"end_character":52},"in_reply_to":"fa7ab95a_a1de8ada","updated":"2016-08-30 13:04:20.000000000","message":"Done","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"276bc05d2f7a43ee9d2935c8d83dd844deb5a432","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    fields \u003d {"},{"line_number":31,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":32,"context_line":"        \u0027group_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027project_id\u0027: fields.StringField(),"},{"line_number":34,"context_line":"        \u0027user_id\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027status\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_417f7edf","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":40},"updated":"2016-08-30 11:55:41.000000000","message":"That\u0027s nullable in the DB migration.","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e9a5ba02677d39646f12789b2b441010f1b40a47","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    fields \u003d {"},{"line_number":31,"context_line":"        \u0027id\u0027: fields.UUIDField(),"},{"line_number":32,"context_line":"        \u0027group_id\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027project_id\u0027: fields.StringField(),"},{"line_number":34,"context_line":"        \u0027user_id\u0027: fields.StringField(),"},{"line_number":35,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":36,"context_line":"        \u0027description\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":37,"context_line":"        \u0027status\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":67,"id":"fa7ab95a_b2009a35","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":40},"in_reply_to":"fa7ab95a_417f7edf","updated":"2016-08-30 13:04:20.000000000","message":"Done","commit_id":"6530777b8708346f3ef31a32d485511272d2bf94"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"16214472b2ffaac6e46b9dc50794aab407d3e6a6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from cinder.i18n import _"},{"line_number":18,"context_line":"from cinder import objects"},{"line_number":19,"context_line":"from cinder.objects import base"},{"line_number":20,"context_line":"from oslo_versionedobjects import fields"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":69,"id":"fa7ab95a_cae53edc","line":20,"updated":"2016-08-30 21:46:38.000000000","message":"If you do an update, or if you have a follow up patch, please rearrange the imports into std, third party, local so that osl_versionedobjects is above the cinder imports in its own grouping.","commit_id":"325f99a64aeb3e7a768904781d854c19bb540580"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"be9cf1ee9dcc0506ad2698e8c1b58ecad7401734","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from cinder.i18n import _"},{"line_number":18,"context_line":"from cinder import objects"},{"line_number":19,"context_line":"from cinder.objects import base"},{"line_number":20,"context_line":"from oslo_versionedobjects import fields"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"OPTIONAL_FIELDS \u003d [\u0027group\u0027, \u0027snapshots\u0027]"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":69,"id":"fa7ab95a_656623bc","line":20,"in_reply_to":"fa7ab95a_cae53edc","updated":"2016-08-30 21:56:00.000000000","message":"Good catch.  Will do in a follow up patch.","commit_id":"325f99a64aeb3e7a768904781d854c19bb540580"}],"cinder/tests/unit/objects/test_group_snapshot.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"670c2865b9b9b37b5908a192e76931d8771dd1c2","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            **{\u0027id\u0027: fake.GROUP_ID})"},{"line_number":61,"context_line":"        self.assertRaises(exception.ObjectActionError, group_snapshot.create)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @mock.patch(\u0027cinder.db.group_snapshot_update\u0027)"},{"line_number":64,"context_line":"    def test_save(self, group_snapshot_update):"},{"line_number":65,"context_line":"        group_snapshot \u003d objects.GroupSnapshot._from_db_object("},{"line_number":66,"context_line":"            self.context, objects.GroupSnapshot(), fake_group_snapshot)"}],"source_content_type":"text/x-python","patch_set":66,"id":"fa7ab95a_f60ecf39","line":63,"updated":"2016-08-29 16:57:37.000000000","message":"Thanks for mocking DB calls!","commit_id":"80a6cb0e3669a3461a458fb70f5a211dcba98339"}],"cinder/volume/driver.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"fc3b3138433be142f049d250732088124eca7591","unresolved":false,"context_lines":[{"line_number":1830,"context_line":""},{"line_number":1831,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1832,"context_line":"class GroupSnapshotVD(object):"},{"line_number":1833,"context_line":"    def create_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":1834,"context_line":"        \"\"\"Creates a group_snapshot.\"\"\""},{"line_number":1835,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":1836,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":38,"id":"9ad45d7e_73f87e7d","line":1833,"updated":"2016-08-08 15:18:00.000000000","message":"This should be a manager operation, not a driver operation.  This is 100% manager-level logic.","commit_id":"a7cb05e2a81f8a419b965c0b0dd335411b64b356"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"6581c69550b19afed6f65c01194f0524505e82b5","unresolved":false,"context_lines":[{"line_number":1830,"context_line":""},{"line_number":1831,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1832,"context_line":"class GroupSnapshotVD(object):"},{"line_number":1833,"context_line":"    def create_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":1834,"context_line":"        \"\"\"Creates a group_snapshot.\"\"\""},{"line_number":1835,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":1836,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":38,"id":"9ad45d7e_f17d81e8","line":1833,"in_reply_to":"9ad45d7e_73f87e7d","updated":"2016-08-08 17:38:25.000000000","message":"I just checked how migrate_volume is implemented.  I think I\u0027ll do the same thing.  We\u0027ll call driver\u0027s create_group_snapshot first.  If it is implemented, we are done.  If it is not, we fall back to a method in the manager.  I will move this function to the manager and maybe call it generic_create_group_snapshot.","commit_id":"a7cb05e2a81f8a419b965c0b0dd335411b64b356"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"fc3b3138433be142f049d250732088124eca7591","unresolved":false,"context_lines":[{"line_number":1846,"context_line":""},{"line_number":1847,"context_line":"        return model_update, snapshot_model_updates"},{"line_number":1848,"context_line":""},{"line_number":1849,"context_line":"    def delete_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":1850,"context_line":"        \"\"\"Deletes a group_snapshot.\"\"\""},{"line_number":1851,"context_line":"        model_update \u003d {\u0027status\u0027: group_snapshot.status}"},{"line_number":1852,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":38,"id":"9ad45d7e_b3f2f698","line":1849,"updated":"2016-08-08 15:18:00.000000000","message":"Same here.","commit_id":"a7cb05e2a81f8a419b965c0b0dd335411b64b356"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"6581c69550b19afed6f65c01194f0524505e82b5","unresolved":false,"context_lines":[{"line_number":1846,"context_line":""},{"line_number":1847,"context_line":"        return model_update, snapshot_model_updates"},{"line_number":1848,"context_line":""},{"line_number":1849,"context_line":"    def delete_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":1850,"context_line":"        \"\"\"Deletes a group_snapshot.\"\"\""},{"line_number":1851,"context_line":"        model_update \u003d {\u0027status\u0027: group_snapshot.status}"},{"line_number":1852,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":38,"id":"9ad45d7e_5183adcc","line":1849,"in_reply_to":"9ad45d7e_b3f2f698","updated":"2016-08-08 17:38:25.000000000","message":"Same.","commit_id":"a7cb05e2a81f8a419b965c0b0dd335411b64b356"}],"cinder/volume/drivers/lvm.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a1659f231f5c37f9dcce47bd174acecc8db6d185","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        \"\"\"Updates a group.\"\"\""},{"line_number":840,"context_line":"        return None, None, None"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def create_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":843,"context_line":"        \"\"\"Creates a group_snapshot.\"\"\""},{"line_number":844,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":845,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_7e5f27e5","line":842,"updated":"2016-08-04 18:23:35.000000000","message":"I don\u0027t really see why any of these three methods are implemented in the LVM driver.\n\nThis is all logic which would be done more easily by looping in the volume manager instead, since nothing here is driver-specific.","commit_id":"dfb9241a967a0adddbb5d160411bf1ee84e2e1ae"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7236ed8f346a2a17efba7d91e3da93385db089e8","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        \"\"\"Updates a group.\"\"\""},{"line_number":840,"context_line":"        return None, None, None"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def create_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":843,"context_line":"        \"\"\"Creates a group_snapshot.\"\"\""},{"line_number":844,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":845,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_04985cbf","line":842,"in_reply_to":"bacf61ea_3e75aff9","updated":"2016-08-04 19:08:52.000000000","message":"Moved to driver.py.","commit_id":"dfb9241a967a0adddbb5d160411bf1ee84e2e1ae"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fb53371378dd4bb548ab24706b3b0cd5fcd69bcd","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        \"\"\"Updates a group.\"\"\""},{"line_number":840,"context_line":"        return None, None, None"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def create_group_snapshot(self, context, group_snapshot, snapshots):"},{"line_number":843,"context_line":"        \"\"\"Creates a group_snapshot.\"\"\""},{"line_number":844,"context_line":"        model_update \u003d {\u0027status\u0027: \u0027available\u0027}"},{"line_number":845,"context_line":"        snapshot_model_updates \u003d []"}],"source_content_type":"text/x-python","patch_set":33,"id":"bacf61ea_3e75aff9","line":842,"in_reply_to":"bacf61ea_7e5f27e5","updated":"2016-08-04 18:35:38.000000000","message":"Good point.  I thought we may want the driver maintainers to be aware of this and implement it themselves, but you are right, there\u0027s nothing special to LVM.  We want to allow driver to override this method too. What about I move this to driver.py?","commit_id":"dfb9241a967a0adddbb5d160411bf1ee84e2e1ae"}]}
