)]}'
{"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"@require_context"},{"line_number":1257,"context_line":"def _volume_permission_get(cxt, vol_perm_id, session\u003dNone):"},{"line_number":1258,"context_line":"    result \u003d model_query(cxt, models.VolumeACLPermission, session\u003dsession).\\"},{"line_number":1259,"context_line":"        filter_by(id\u003dvol_perm_id).\\"},{"line_number":1260,"context_line":"        first()"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BnE%3D","line":1259,"updated":"2013-08-27 11:14:08.000000000","message":"nit: filter_by(id\u003dvalue) + first() can be replaced with get() call","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"87144f975ff070954dd90a646c419df4811f0345","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"@require_context"},{"line_number":1257,"context_line":"def _volume_permission_get(cxt, vol_perm_id, session\u003dNone):"},{"line_number":1258,"context_line":"    result \u003d model_query(cxt, models.VolumeACLPermission, session\u003dsession).\\"},{"line_number":1259,"context_line":"        filter_by(id\u003dvol_perm_id).\\"},{"line_number":1260,"context_line":"        first()"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F980%3D","line":1259,"in_reply_to":"AAAASn%2F%2F%2BnE%3D","updated":"2013-08-27 12:58:30.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"2565551b8830a0ba510ec027d105b5d6e7948d4f","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"@require_context"},{"line_number":1257,"context_line":"def _volume_permission_get(cxt, vol_perm_id, session\u003dNone):"},{"line_number":1258,"context_line":"    result \u003d model_query(cxt, models.VolumeACLPermission, session\u003dsession).\\"},{"line_number":1259,"context_line":"        filter_by(id\u003dvol_perm_id).\\"},{"line_number":1260,"context_line":"        first()"},{"line_number":1261,"context_line":""},{"line_number":1262,"context_line":"    if not result:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9HM%3D","line":1259,"in_reply_to":"AAAASn%2F%2F980%3D","updated":"2013-08-27 15:43:11.000000000","message":"No, it can\u0027t. model_query contains some filters, e.g. here it filters only non-deleted records, we can\u0027t get permission by id using get() because there may be some deleted records with the same id.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"a886a598bc03eb5870c4c48151e1cfb3aaeba21e","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"def volume_permission_find(context, volume_id, user_or_group_id,"},{"line_number":1295,"context_line":"                           permission_type\u003d\u0027user\u0027):"},{"line_number":1296,"context_line":"    query \u003d _volume_permissions_get_by_volume(context, volume_id).\\"},{"line_number":1297,"context_line":"        filter_by(type\u003dpermission_type).\\"},{"line_number":1298,"context_line":"        filter_by(user_or_group_id\u003duser_or_group_id)"},{"line_number":1299,"context_line":"    return query.first()"},{"line_number":1300,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2B7M%3D","line":1297,"updated":"2013-08-27 08:12:56.000000000","message":"This could be done with one filter_by() with parameters.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"dbf363dbde0749e92cdace9c38d7b8b95fd96f30","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"def volume_permission_find(context, volume_id, user_or_group_id,"},{"line_number":1295,"context_line":"                           permission_type\u003d\u0027user\u0027):"},{"line_number":1296,"context_line":"    query \u003d _volume_permissions_get_by_volume(context, volume_id).\\"},{"line_number":1297,"context_line":"        filter_by(type\u003dpermission_type).\\"},{"line_number":1298,"context_line":"        filter_by(user_or_group_id\u003duser_or_group_id)"},{"line_number":1299,"context_line":"    return query.first()"},{"line_number":1300,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2ByM%3D","line":1297,"in_reply_to":"AAAASn%2F%2F%2B7M%3D","updated":"2013-08-27 09:27:14.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"c030c4f906b7b10113d72d5b696b8ebbc698db8e","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"def volume_permission_find(context, volume_id, user_or_group_id,"},{"line_number":1295,"context_line":"                           permission_type\u003d\u0027user\u0027):"},{"line_number":1296,"context_line":"    query \u003d _volume_permissions_get_by_volume(context, volume_id).\\"},{"line_number":1297,"context_line":"        filter_by(type\u003dpermission_type).\\"},{"line_number":1298,"context_line":"        filter_by(user_or_group_id\u003duser_or_group_id)"},{"line_number":1299,"context_line":"    return query.first()"},{"line_number":1300,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BxQ%3D","line":1297,"in_reply_to":"AAAASn%2F%2F%2B7M%3D","updated":"2013-08-27 08:39:56.000000000","message":"I am not sure that this should be changed, because it will add some inconsistency with other parts of this module.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"915caa455bcce63387939faaf4c43529c4ce3323","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"def volume_permission_find(context, volume_id, user_or_group_id,"},{"line_number":1295,"context_line":"                           permission_type\u003d\u0027user\u0027):"},{"line_number":1296,"context_line":"    query \u003d _volume_permissions_get_by_volume(context, volume_id).\\"},{"line_number":1297,"context_line":"        filter_by(type\u003dpermission_type).\\"},{"line_number":1298,"context_line":"        filter_by(user_or_group_id\u003duser_or_group_id)"},{"line_number":1299,"context_line":"    return query.first()"},{"line_number":1300,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bwg%3D","line":1297,"in_reply_to":"AAAASn%2F%2F%2BxQ%3D","updated":"2013-08-27 08:41:48.000000000","message":"We should not use bad code to be consistent with other bad code. Better to write good code and fixe the bad one.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"@require_context"},{"line_number":1303,"context_line":"def volume_permission_get(cxt, id):"},{"line_number":1304,"context_line":"    query \u003d model_query(cxt, models.VolumeACLPermission).filter_by(id\u003did)"},{"line_number":1305,"context_line":"    return query.first()"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bno%3D","line":1304,"updated":"2013-08-27 11:14:08.000000000","message":"nit: filter_by(id\u003dvalue) + first() can be replaced with get() call","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"87144f975ff070954dd90a646c419df4811f0345","unresolved":false,"context_lines":[{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"@require_context"},{"line_number":1303,"context_line":"def volume_permission_get(cxt, id):"},{"line_number":1304,"context_line":"    query \u003d model_query(cxt, models.VolumeACLPermission).filter_by(id\u003did)"},{"line_number":1305,"context_line":"    return query.first()"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F98g%3D","line":1304,"in_reply_to":"AAAASn%2F%2F%2Bno%3D","updated":"2013-08-27 12:58:30.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":""},{"line_number":1308,"context_line":"@require_context"},{"line_number":1309,"context_line":"def volume_permission_create(context, values):"},{"line_number":1310,"context_line":"    session \u003d get_session()"},{"line_number":1311,"context_line":"    with session.begin():"},{"line_number":1312,"context_line":"        if values.get(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BoI%3D","line":1309,"updated":"2013-08-27 11:14:08.000000000","message":"shouldn\u0027t this method be named \"volume_permission_create_or_update\" to make it obvious to a caller how it actually works?","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"87144f975ff070954dd90a646c419df4811f0345","unresolved":false,"context_lines":[{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":""},{"line_number":1308,"context_line":"@require_context"},{"line_number":1309,"context_line":"def volume_permission_create(context, values):"},{"line_number":1310,"context_line":"    session \u003d get_session()"},{"line_number":1311,"context_line":"    with session.begin():"},{"line_number":1312,"context_line":"        if values.get(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F95k%3D","line":1309,"in_reply_to":"AAAASn%2F%2F%2BoI%3D","updated":"2013-08-27 12:58:30.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"def volume_permission_delete(cxt, vol_perm_id):"},{"line_number":1324,"context_line":"    session \u003d get_session()"},{"line_number":1325,"context_line":"    with session.begin():"},{"line_number":1326,"context_line":"        model_query(cxt, models.VolumeACLPermission).\\"},{"line_number":1327,"context_line":"            filter_by(id\u003dvol_perm_id).\\"},{"line_number":1328,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1329,"context_line":"                    \u0027deleted_at\u0027: timeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Boc%3D","line":1326,"updated":"2013-08-27 11:14:08.000000000","message":"shouldn\u0027t you also check that exactly one row has been updated?","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"87144f975ff070954dd90a646c419df4811f0345","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"def volume_permission_delete(cxt, vol_perm_id):"},{"line_number":1324,"context_line":"    session \u003d get_session()"},{"line_number":1325,"context_line":"    with session.begin():"},{"line_number":1326,"context_line":"        model_query(cxt, models.VolumeACLPermission).\\"},{"line_number":1327,"context_line":"            filter_by(id\u003dvol_perm_id).\\"},{"line_number":1328,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1329,"context_line":"                    \u0027deleted_at\u0027: timeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9%2FA%3D","line":1326,"in_reply_to":"AAAASn%2F%2F%2Boc%3D","updated":"2013-08-27 12:58:30.000000000","message":"id is a primary key, should I?","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d0f418a312d93e6f58e29baa783ff98f82ca9858","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"def volume_permission_delete(cxt, vol_perm_id):"},{"line_number":1324,"context_line":"    session \u003d get_session()"},{"line_number":1325,"context_line":"    with session.begin():"},{"line_number":1326,"context_line":"        model_query(cxt, models.VolumeACLPermission).\\"},{"line_number":1327,"context_line":"            filter_by(id\u003dvol_perm_id).\\"},{"line_number":1328,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1329,"context_line":"                    \u0027deleted_at\u0027: timeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F91A%3D","line":1326,"in_reply_to":"AAAASn%2F%2F9%2FA%3D","updated":"2013-08-27 13:16:09.000000000","message":"I mean, someone can mistakenly pass a non-existent id value and should get a reasonable error message instead of successfully executing an UPDATE query, that does nothing.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"def volume_permission_delete(cxt, vol_perm_id):"},{"line_number":1324,"context_line":"    session \u003d get_session()"},{"line_number":1325,"context_line":"    with session.begin():"},{"line_number":1326,"context_line":"        model_query(cxt, models.VolumeACLPermission).\\"},{"line_number":1327,"context_line":"            filter_by(id\u003dvol_perm_id).\\"},{"line_number":1328,"context_line":"            update({\u0027deleted\u0027: True,"},{"line_number":1329,"context_line":"                    \u0027deleted_at\u0027: timeutils.utcnow(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9pY%3D","line":1326,"in_reply_to":"AAAASn%2F%2F91A%3D","updated":"2013-08-27 14:08:54.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"                or_(models.Volume.id \u003d\u003d id_or_name,"},{"line_number":1180,"context_line":"                    models.Volume.display_name \u003d\u003d id_or_name)).one()"},{"line_number":1181,"context_line":"    except orm_exc.MultipleResultsFound:"},{"line_number":1182,"context_line":"        raise exception.MultipleVolumesFound(volume_id\u003did_or_name)"},{"line_number":1183,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":1184,"context_line":"        raise exception.VolumeNotFound(volume_id\u003did_or_name)"},{"line_number":1185,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5gE%3D","line":1182,"updated":"2013-08-28 09:02:02.000000000","message":"why do you think, that multiple results can be caused only by same volume id, not names?","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"16864f019919b4a95630cb3212c9d6c0586d890a","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"                or_(models.Volume.id \u003d\u003d id_or_name,"},{"line_number":1180,"context_line":"                    models.Volume.display_name \u003d\u003d id_or_name)).one()"},{"line_number":1181,"context_line":"    except orm_exc.MultipleResultsFound:"},{"line_number":1182,"context_line":"        raise exception.MultipleVolumesFound(volume_id\u003did_or_name)"},{"line_number":1183,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":1184,"context_line":"        raise exception.VolumeNotFound(volume_id\u003did_or_name)"},{"line_number":1185,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F4%2BQ%3D","line":1182,"in_reply_to":"AAAASn%2F%2F5E4%3D","updated":"2013-08-28 11:15:49.000000000","message":"reworked","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"                or_(models.Volume.id \u003d\u003d id_or_name,"},{"line_number":1180,"context_line":"                    models.Volume.display_name \u003d\u003d id_or_name)).one()"},{"line_number":1181,"context_line":"    except orm_exc.MultipleResultsFound:"},{"line_number":1182,"context_line":"        raise exception.MultipleVolumesFound(volume_id\u003did_or_name)"},{"line_number":1183,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":1184,"context_line":"        raise exception.VolumeNotFound(volume_id\u003did_or_name)"},{"line_number":1185,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5E4%3D","line":1182,"in_reply_to":"AAAASn%2F%2F5gE%3D","updated":"2013-08-28 10:55:26.000000000","message":"multiple results can be caused by non-unique name only and VolumeNotFound gives us \u0027Volume xxx could not be found\u0027 - without clarification by with name xxx or id xxx. As we expect.","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":1181,"context_line":"    except orm_exc.MultipleResultsFound:"},{"line_number":1182,"context_line":"        raise exception.MultipleVolumesFound(volume_id\u003did_or_name)"},{"line_number":1183,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":1184,"context_line":"        raise exception.VolumeNotFound(volume_id\u003did_or_name)"},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":""},{"line_number":1187,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5gA%3D","line":1184,"updated":"2013-08-28 09:02:02.000000000","message":"ditto","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":1181,"context_line":"    except orm_exc.MultipleResultsFound:"},{"line_number":1182,"context_line":"        raise exception.MultipleVolumesFound(volume_id\u003did_or_name)"},{"line_number":1183,"context_line":"    except orm_exc.NoResultFound:"},{"line_number":1184,"context_line":"        raise exception.VolumeNotFound(volume_id\u003did_or_name)"},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":""},{"line_number":1187,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5EI%3D","line":1184,"in_reply_to":"AAAASn%2F%2F5gA%3D","updated":"2013-08-28 10:55:26.000000000","message":"No results if it doesn\u0027t find any volume with id id_or_name of display_name id_or_name.","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":1282,"context_line":""},{"line_number":1283,"context_line":"@require_context"},{"line_number":1284,"context_line":"def volume_permission_get_all_by_volume(cxt, volume_id):"},{"line_number":1285,"context_line":"    return _volume_permissions_get_by_volume(cxt, volume_id).all()"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":""},{"line_number":1288,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5fU%3D","line":1285,"updated":"2013-08-28 09:02:02.000000000","message":"I\u0027m not sure, but can we get multiple rows here?","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":1282,"context_line":""},{"line_number":1283,"context_line":"@require_context"},{"line_number":1284,"context_line":"def volume_permission_get_all_by_volume(cxt, volume_id):"},{"line_number":1285,"context_line":"    return _volume_permissions_get_by_volume(cxt, volume_id).all()"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":""},{"line_number":1288,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5IA%3D","line":1285,"in_reply_to":"AAAASn%2F%2F5fU%3D","updated":"2013-08-28 10:55:26.000000000","message":"What multiple rows? It returns a list of volume\u0027s permissions and that\u0027s exactly what it should do.","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"}],"cinder/db/sqlalchemy/migrate_repo/versions/018_add_volume_acl.py":[{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"a886a598bc03eb5870c4c48151e1cfb3aaeba21e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Mirantis Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2B5Q%3D","line":3,"updated":"2013-08-27 08:12:56.000000000","message":"Please either remove attribution line or replace it with OpenStack Foundation","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Mirantis Inc."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F95I%3D","line":3,"in_reply_to":"AAAASn%2F%2F%2B5Q%3D","updated":"2013-08-27 14:08:54.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    volume_acl_permissions \u003d Table("},{"line_number":32,"context_line":"        \u0027volume_acl_permissions\u0027, meta,"},{"line_number":33,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027volume_id\u0027, String(length\u003d36), ForeignKey(\u0027volumes.id\u0027),"},{"line_number":35,"context_line":"               nullable\u003dFalse),"},{"line_number":36,"context_line":"        Column(\u0027type\u0027, String(length\u003d10), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bsg%3D","line":33,"updated":"2013-08-27 11:14:08.000000000","message":"nit: nullable\u003dFalse has no effect for PK cols","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    volume_acl_permissions \u003d Table("},{"line_number":32,"context_line":"        \u0027volume_acl_permissions\u0027, meta,"},{"line_number":33,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":34,"context_line":"        Column(\u0027volume_id\u0027, String(length\u003d36), ForeignKey(\u0027volumes.id\u0027),"},{"line_number":35,"context_line":"               nullable\u003dFalse),"},{"line_number":36,"context_line":"        Column(\u0027type\u0027, String(length\u003d10), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9wE%3D","line":33,"in_reply_to":"AAAASn%2F%2F%2Bsg%3D","updated":"2013-08-27 14:08:54.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"b8ad1e228df8d8aa68a58a3930e5a5833cb256f2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Column(\u0027type\u0027, String(length\u003d10), nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027user_or_group_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":38,"context_line":"        Column(\u0027access_permission\u0027, Integer, nullable\u003dFalse),"},{"line_number":39,"context_line":"        Column(\u0027permission_list_access\u0027, Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":41,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":42,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2B7Y%3D","line":39,"updated":"2013-08-27 08:00:50.000000000","message":"`default` missed. See models.py file","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"dbf363dbde0749e92cdace9c38d7b8b95fd96f30","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Column(\u0027type\u0027, String(length\u003d10), nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027user_or_group_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":38,"context_line":"        Column(\u0027access_permission\u0027, Integer, nullable\u003dFalse),"},{"line_number":39,"context_line":"        Column(\u0027permission_list_access\u0027, Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":41,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":42,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BxY%3D","line":39,"in_reply_to":"AAAASn%2F%2F%2B7Y%3D","updated":"2013-08-27 09:27:14.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Column(\u0027type\u0027, String(length\u003d10), nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027user_or_group_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":38,"context_line":"        Column(\u0027access_permission\u0027, Integer, nullable\u003dFalse),"},{"line_number":39,"context_line":"        Column(\u0027permission_list_access\u0027, Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":41,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":42,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BrM%3D","line":39,"in_reply_to":"AAAASn%2F%2F%2B7Y%3D","updated":"2013-08-27 11:14:08.000000000","message":"values of `default` args are used by SA itself, so it is safe to omit them in migrations scripts (what I mean is, that your point would be correct, if `serverdefault` args were used here)","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        Column(\u0027type\u0027, String(length\u003d10), nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027user_or_group_id\u0027, String(length\u003d255), nullable\u003dFalse),"},{"line_number":38,"context_line":"        Column(\u0027access_permission\u0027, Integer, nullable\u003dFalse),"},{"line_number":39,"context_line":"        Column(\u0027permission_list_access\u0027, Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":41,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":42,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9vw%3D","line":39,"in_reply_to":"AAAASn%2F%2F%2BrM%3D","updated":"2013-08-27 14:08:54.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    volume_acl_permissions \u003d Table(\u0027volume_acl_permissions\u0027, meta,"},{"line_number":61,"context_line":"                                   autoload\u003dTrue)"},{"line_number":62,"context_line":"    try:"},{"line_number":63,"context_line":"        volume_acl_permissions.drop()"},{"line_number":64,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bs8%3D","line":61,"updated":"2013-08-27 11:14:08.000000000","message":"nit: you can safely omit autoload\u003dTrue here (otherwise, schema reflection is used to get tables metadata from a DB, which can be an expensive operation, as tables referenced by FKs are also loaded)","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    volume_acl_permissions \u003d Table(\u0027volume_acl_permissions\u0027, meta,"},{"line_number":61,"context_line":"                                   autoload\u003dTrue)"},{"line_number":62,"context_line":"    try:"},{"line_number":63,"context_line":"        volume_acl_permissions.drop()"},{"line_number":64,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9vg%3D","line":61,"in_reply_to":"AAAASn%2F%2F%2Bs8%3D","updated":"2013-08-27 14:08:54.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"}],"cinder/db/sqlalchemy/migrate_repo/versions/019_add_volume_acl.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from cinder.openstack.common import log as logging"},{"line_number":18,"context_line":"from sqlalchemy import Column, MetaData, Boolean, Table"},{"line_number":19,"context_line":"from sqlalchemy import String, Integer, ForeignKey, DateTime"},{"line_number":20,"context_line":"from sqlalchemy.types import Enum"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5dI%3D","line":17,"updated":"2013-08-28 09:02:02.000000000","message":"this impost should be below","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from cinder.openstack.common import log as logging"},{"line_number":18,"context_line":"from sqlalchemy import Column, MetaData, Boolean, Table"},{"line_number":19,"context_line":"from sqlalchemy import String, Integer, ForeignKey, DateTime"},{"line_number":20,"context_line":"from sqlalchemy.types import Enum"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5I4%3D","line":17,"in_reply_to":"AAAASn%2F%2F5dI%3D","updated":"2013-08-28 10:55:26.000000000","message":"Done","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    __tablename__ \u003d \u0027volume_acl_permissions\u0027"},{"line_number":150,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":151,"context_line":"    volume_id \u003d Column(String(36), ForeignKey(\u0027volumes.id\u0027), nullable\u003dFalse)"},{"line_number":152,"context_line":"    type \u003d Column(String(10), nullable\u003dFalse)"},{"line_number":153,"context_line":"    user_or_group_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":154,"context_line":"    access_permission \u003d Column(Integer, nullable\u003dFalse, default\u003d7)"},{"line_number":155,"context_line":"    permission_list_access \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bc8%3D","line":152,"updated":"2013-08-27 11:14:08.000000000","message":"can we just use two separate columns: user_id and group_id? (so there would be separate rules for users and for groups)","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    __tablename__ \u003d \u0027volume_acl_permissions\u0027"},{"line_number":150,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":151,"context_line":"    volume_id \u003d Column(String(36), ForeignKey(\u0027volumes.id\u0027), nullable\u003dFalse)"},{"line_number":152,"context_line":"    type \u003d Column(String(10), nullable\u003dFalse)"},{"line_number":153,"context_line":"    user_or_group_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":154,"context_line":"    access_permission \u003d Column(Integer, nullable\u003dFalse, default\u003d7)"},{"line_number":155,"context_line":"    permission_list_access \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9qE%3D","line":152,"in_reply_to":"AAAASn%2F%2F%2Bc8%3D","updated":"2013-08-27 14:08:54.000000000","message":"That was designed so. We are not interested in separate rules for users and groups very much. Potentially \u0027project\u0027 type will be added, so we can rename user_or_group_id to subject_id. And there will be type and subject_id, and not user_id, group_id, project_id, etc.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"d965b3437cc94bb4626deb06cb615208a1e8bc80","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    type \u003d Column(Enum(\u0027user\u0027, \u0027group\u0027, name\u003d\u0027entity_types\u0027), nullable\u003dFalse)"},{"line_number":156,"context_line":"    entity_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":157,"context_line":"    access_permission \u003d Column(Integer, nullable\u003dFalse, default\u003d7)"},{"line_number":158,"context_line":"    permission_list_access \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":159,"context_line":"    volume \u003d relationship(Volume, backref\u003d\"volume_acl_permissions\","},{"line_number":160,"context_line":"                          foreign_keys\u003dvolume_id,"},{"line_number":161,"context_line":"                          primaryjoin\u003d\u0027and_(\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4lc%3D","line":158,"updated":"2013-08-28 13:03:38.000000000","message":"what is the \"magic\" numbers?","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"86641e10f9500363780ec18c21f14c7f8cd885da","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    type \u003d Column(Enum(\u0027user\u0027, \u0027group\u0027, name\u003d\u0027entity_types\u0027), nullable\u003dFalse)"},{"line_number":156,"context_line":"    entity_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":157,"context_line":"    access_permission \u003d Column(Integer, nullable\u003dFalse, default\u003d7)"},{"line_number":158,"context_line":"    permission_list_access \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":159,"context_line":"    volume \u003d relationship(Volume, backref\u003d\"volume_acl_permissions\","},{"line_number":160,"context_line":"                          foreign_keys\u003dvolume_id,"},{"line_number":161,"context_line":"                          primaryjoin\u003d\u0027and_(\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4X8%3D","line":158,"in_reply_to":"AAAASn%2F%2F4lc%3D","updated":"2013-08-28 13:47:34.000000000","message":"Done","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"7fcede349586e59aa9592ffb996bdf677138c848","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    __tablename__ \u003d \u0027volume_acl_permissions\u0027"},{"line_number":153,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":154,"context_line":"    volume_id \u003d Column(String(36), ForeignKey(\u0027volumes.id\u0027), nullable\u003dFalse)"},{"line_number":155,"context_line":"    type \u003d Column(Enum(\u0027user\u0027, \u0027group\u0027, name\u003d\u0027entity_types\u0027), nullable\u003dFalse)"},{"line_number":156,"context_line":"    entity_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":157,"context_line":"    access_permission \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":158,"context_line":"    volume \u003d relationship(Volume, backref\u003d\"volume_acl_permissions\","}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAASn%2F%2F30k%3D","line":155,"updated":"2013-08-28 16:18:12.000000000","message":"Just a question here - why not just have two columns - user and group - they can be more easily indexable, and setting both to NULL would mean everyone.\n\nJust seems more normalized and easier to program I guess (I could be wrong).","commit_id":"161fdd8baab5b5ea28619822bf08ce3f16c49075"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"9572eb78237610d41353abd393faac6ea5dd428b","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    __tablename__ \u003d \u0027volume_acl_permissions\u0027"},{"line_number":153,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":154,"context_line":"    volume_id \u003d Column(String(36), ForeignKey(\u0027volumes.id\u0027), nullable\u003dFalse)"},{"line_number":155,"context_line":"    type \u003d Column(Enum(\u0027user\u0027, \u0027group\u0027, name\u003d\u0027entity_types\u0027), nullable\u003dFalse)"},{"line_number":156,"context_line":"    entity_id \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":157,"context_line":"    access_permission \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":158,"context_line":"    volume \u003d relationship(Volume, backref\u003d\"volume_acl_permissions\","}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAASn%2F%2F3i0%3D","line":155,"in_reply_to":"AAAASn%2F%2F30k%3D","updated":"2013-08-28 16:44:02.000000000","message":"Thas was designed so...\nAnd setting both to not NULL - ?\nAnd this doesn\u0027t seem more easier to me.\nE.g.:\nWhen we add new type(project e.g.), it doesn\u0027t demand to check if the only of user_id, group_id, project_id is not None. And also we will be able to implement flexible public volumes(cross-tenants visibility):\nif there is a volume permission - volume is visible, so adding permission with\ntype\u003d\u0027project\u0027, entity_id\u003d\u0027everyone\u0027, access_permission\u003d0 - just public volume for all the tenants. It\u0027s clear for user.","commit_id":"161fdd8baab5b5ea28619822bf08ce3f16c49075"}],"cinder/tests/db/test_volume_acl.py":[{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"a886a598bc03eb5870c4c48151e1cfb3aaeba21e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2013 Mirantis Inc."},{"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":2,"id":"AAAASn%2F%2F%2B6I%3D","line":1,"updated":"2013-08-27 08:12:56.000000000","message":"The file should begin with the following line and an empty line after it:\n\n# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4\n\nPlease also either remove attribution line or replace it with OpenStack Foundation","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"dbf363dbde0749e92cdace9c38d7b8b95fd96f30","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (C) 2013 Mirantis Inc."},{"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":2,"id":"AAAASn%2F%2F%2Bu4%3D","line":1,"in_reply_to":"AAAASn%2F%2F%2B6I%3D","updated":"2013-08-27 09:27:14.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"1e3bd43d48c1584449a4790a1a0b39bb5e2e6803","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       size\u003d1):"},{"line_number":43,"context_line":"        \"\"\"Create a volume object.\"\"\""},{"line_number":44,"context_line":"        vol \u003d {}"},{"line_number":45,"context_line":"        vol[\u0027size\u0027] \u003d size"},{"line_number":46,"context_line":"        vol[\u0027user_id\u0027] \u003d self.ctxt.user_id"},{"line_number":47,"context_line":"        vol[\u0027project_id\u0027] \u003d self.ctxt.project_id"},{"line_number":48,"context_line":"        vol[\u0027status\u0027] \u003d status"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2B6E%3D","line":45,"updated":"2013-08-27 08:04:03.000000000","message":"single question: why don\u0027t you use\n\nvol \u003d {\n    \u0027size\u0027: size,\n    ...\n} \n\n?","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"dbf363dbde0749e92cdace9c38d7b8b95fd96f30","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                       size\u003d1):"},{"line_number":43,"context_line":"        \"\"\"Create a volume object.\"\"\""},{"line_number":44,"context_line":"        vol \u003d {}"},{"line_number":45,"context_line":"        vol[\u0027size\u0027] \u003d size"},{"line_number":46,"context_line":"        vol[\u0027user_id\u0027] \u003d self.ctxt.user_id"},{"line_number":47,"context_line":"        vol[\u0027project_id\u0027] \u003d self.ctxt.project_id"},{"line_number":48,"context_line":"        vol[\u0027status\u0027] \u003d status"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bo0%3D","line":45,"in_reply_to":"AAAASn%2F%2F%2B6E%3D","updated":"2013-08-27 09:27:14.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"a886a598bc03eb5870c4c48151e1cfb3aaeba21e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.assertEquals(vol_perm.volume_id, volume_id1,"},{"line_number":88,"context_line":"                          \"Unexpected volume_id\")"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        nctxt \u003d context.RequestContext(user_id\u003d\u0027new_user_id\u0027,"},{"line_number":91,"context_line":"                                       project_id\u003d\u0027new_project_id\u0027)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        vol_perm \u003d db.volume_permission_get(nctxt, perm_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2B30%3D","line":90,"updated":"2013-08-27 08:12:56.000000000","message":"This should be done in a separate test to avoid overlapping assertions.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"dbf363dbde0749e92cdace9c38d7b8b95fd96f30","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.assertEquals(vol_perm.volume_id, volume_id1,"},{"line_number":88,"context_line":"                          \"Unexpected volume_id\")"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        nctxt \u003d context.RequestContext(user_id\u003d\u0027new_user_id\u0027,"},{"line_number":91,"context_line":"                                       project_id\u003d\u0027new_project_id\u0027)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        vol_perm \u003d db.volume_permission_get(nctxt, perm_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BnA%3D","line":90,"in_reply_to":"AAAASn%2F%2F%2B30%3D","updated":"2013-08-27 09:27:14.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6623,"name":"Roman Prykhodchenko","email":"me@romcheg.me","username":"prykhodchenko"},"change_message_id":"a886a598bc03eb5870c4c48151e1cfb3aaeba21e","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.assertEquals(len(perms), 2,"},{"line_number":127,"context_line":"                          \"Unexpected number of volume permission records\")"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def test_volume_permission_delete(self):"},{"line_number":130,"context_line":"        vol1 \u003d self._create_volume(size\u003d1)"},{"line_number":131,"context_line":"        self._create_volume_permission(vol1, self.ctxt.user_id)"},{"line_number":132,"context_line":"        vol2 \u003d self._create_volume(size\u003d1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2B3g%3D","line":129,"updated":"2013-08-27 08:12:56.000000000","message":"Please consider splitting this test to follow \"one assertion per test\" rule. This allows to avoid overlapping assertions.","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"dbf363dbde0749e92cdace9c38d7b8b95fd96f30","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.assertEquals(len(perms), 2,"},{"line_number":127,"context_line":"                          \"Unexpected number of volume permission records\")"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def test_volume_permission_delete(self):"},{"line_number":130,"context_line":"        vol1 \u003d self._create_volume(size\u003d1)"},{"line_number":131,"context_line":"        self._create_volume_permission(vol1, self.ctxt.user_id)"},{"line_number":132,"context_line":"        vol2 \u003d self._create_volume(size\u003d1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2BmE%3D","line":129,"in_reply_to":"AAAASn%2F%2F%2B3g%3D","updated":"2013-08-27 09:27:14.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from cinder import test"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VolumeACLPermissionsTableTestCase(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5ic%3D","line":26,"updated":"2013-08-28 09:02:02.000000000","message":"seems to be unused","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from cinder import test"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class VolumeACLPermissionsTableTestCase(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5HY%3D","line":26,"in_reply_to":"AAAASn%2F%2F5ic%3D","updated":"2013-08-28 10:55:26.000000000","message":"Done","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.ctxt \u003d context.RequestContext(user_id\u003d\u0027user_id\u0027,"},{"line_number":35,"context_line":"                                           project_id\u003d\u0027project_id\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def tearDown(self):"},{"line_number":38,"context_line":"        super(VolumeACLPermissionsTableTestCase, self).tearDown()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _create_volume(self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5iw%3D","line":37,"updated":"2013-08-28 09:02:02.000000000","message":"not required","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.ctxt \u003d context.RequestContext(user_id\u003d\u0027user_id\u0027,"},{"line_number":35,"context_line":"                                           project_id\u003d\u0027project_id\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def tearDown(self):"},{"line_number":38,"context_line":"        super(VolumeACLPermissionsTableTestCase, self).tearDown()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _create_volume(self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5HA%3D","line":37,"in_reply_to":"AAAASn%2F%2F5iw%3D","updated":"2013-08-28 10:55:26.000000000","message":"Done","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       display_name\u003d\u0027test_volume\u0027,"},{"line_number":42,"context_line":"                       display_description\u003d\u0027this is a test volume\u0027,"},{"line_number":43,"context_line":"                       status\u003d\u0027available\u0027,"},{"line_number":44,"context_line":"                       size\u003d1):"},{"line_number":45,"context_line":"        \"\"\"Create a volume object.\"\"\""},{"line_number":46,"context_line":"        vol \u003d {"},{"line_number":47,"context_line":"            \u0027size\u0027: size,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5hg%3D","line":44,"updated":"2013-08-28 09:02:02.000000000","message":"please use single \"brackets\" style. See also line 58.","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                       display_name\u003d\u0027test_volume\u0027,"},{"line_number":42,"context_line":"                       display_description\u003d\u0027this is a test volume\u0027,"},{"line_number":43,"context_line":"                       status\u003d\u0027available\u0027,"},{"line_number":44,"context_line":"                       size\u003d1):"},{"line_number":45,"context_line":"        \"\"\"Create a volume object.\"\"\""},{"line_number":46,"context_line":"        vol \u003d {"},{"line_number":47,"context_line":"            \u0027size\u0027: size,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5Fw%3D","line":44,"in_reply_to":"AAAASn%2F%2F5hg%3D","updated":"2013-08-28 10:55:26.000000000","message":"Could you please explain what does it mean?","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            \u0027status\u0027: status,"},{"line_number":51,"context_line":"            \u0027display_name\u0027: display_name,"},{"line_number":52,"context_line":"            \u0027display_description\u0027: display_description,"},{"line_number":53,"context_line":"            \u0027attach_status\u0027: \u0027detached\u0027"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return db.volume_create(self.ctxt, vol)[\u0027id\u0027]"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5is%3D","line":53,"updated":"2013-08-28 09:02:02.000000000","message":"nit: comma in the end of the line","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"45408cfba5c9f6ee5b07d0afb5c67871423472ef","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            \u0027status\u0027: status,"},{"line_number":51,"context_line":"            \u0027display_name\u0027: display_name,"},{"line_number":52,"context_line":"            \u0027display_description\u0027: display_description,"},{"line_number":53,"context_line":"            \u0027attach_status\u0027: \u0027detached\u0027"},{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return db.volume_create(self.ctxt, vol)[\u0027id\u0027]"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5Gg%3D","line":53,"in_reply_to":"AAAASn%2F%2F5is%3D","updated":"2013-08-28 10:55:26.000000000","message":"Done","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"2c487c8ddd52684566e8aa3f7d6c4a880be4eff5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        }"},{"line_number":55,"context_line":"        return db.volume_create(self.ctxt, vol)[\u0027id\u0027]"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def _create_volume_permission(self, volume_id, entity_id,"},{"line_number":58,"context_line":"                                  perm_type\u003d\u0027user\u0027, access_permission\u003d7):"},{"line_number":59,"context_line":"        \"\"\"Create a volume permission object.\"\"\""},{"line_number":60,"context_line":"        volume_permission \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2F5hY%3D","line":57,"updated":"2013-08-28 09:02:02.000000000","message":"please use single \"brackets\" style. See also line 44.","commit_id":"d06f5084958ea38f9aef2ac2f17cb283df8ca576"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"d965b3437cc94bb4626deb06cb615208a1e8bc80","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.ctxt \u003d context.RequestContext(user_id\u003d\u0027user_id\u0027,"},{"line_number":31,"context_line":"                                           project_id\u003d\u0027project_id\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _create_volume(self,"},{"line_number":34,"context_line":"                       display_name\u003d\u0027test_volume\u0027,"},{"line_number":35,"context_line":"                       display_description\u003d\u0027this is a test volume\u0027,"},{"line_number":36,"context_line":"                       status\u003d\u0027available\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4kw%3D","line":33,"updated":"2013-08-28 13:03:38.000000000","message":"please use either \n\ndef f(a,\n      b,\n      c,\n      d):\n\nor \n\ndef f(a, b,\n      c, d):","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"86641e10f9500363780ec18c21f14c7f8cd885da","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        self.ctxt \u003d context.RequestContext(user_id\u003d\u0027user_id\u0027,"},{"line_number":31,"context_line":"                                           project_id\u003d\u0027project_id\u0027)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _create_volume(self,"},{"line_number":34,"context_line":"                       display_name\u003d\u0027test_volume\u0027,"},{"line_number":35,"context_line":"                       display_description\u003d\u0027this is a test volume\u0027,"},{"line_number":36,"context_line":"                       status\u003d\u0027available\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4Xc%3D","line":33,"in_reply_to":"AAAASn%2F%2F4kw%3D","updated":"2013-08-28 13:47:34.000000000","message":"Done","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"d965b3437cc94bb4626deb06cb615208a1e8bc80","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return db.volume_create(self.ctxt, vol)[\u0027id\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _create_volume_permission(self, volume_id, entity_id,"},{"line_number":51,"context_line":"                                  perm_type\u003d\u0027user\u0027, access_permission\u003d7"},{"line_number":52,"context_line":"                                  ):"},{"line_number":53,"context_line":"        \"\"\"Create a volume permission object.\"\"\""},{"line_number":54,"context_line":"        volume_permission \u003d {"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4kk%3D","line":51,"updated":"2013-08-28 13:03:38.000000000","message":"see line 33","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"86641e10f9500363780ec18c21f14c7f8cd885da","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return db.volume_create(self.ctxt, vol)[\u0027id\u0027]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _create_volume_permission(self, volume_id, entity_id,"},{"line_number":51,"context_line":"                                  perm_type\u003d\u0027user\u0027, access_permission\u003d7"},{"line_number":52,"context_line":"                                  ):"},{"line_number":53,"context_line":"        \"\"\"Create a volume permission object.\"\"\""},{"line_number":54,"context_line":"        volume_permission \u003d {"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4XY%3D","line":51,"in_reply_to":"AAAASn%2F%2F4kk%3D","updated":"2013-08-28 13:47:34.000000000","message":"Done","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"d965b3437cc94bb4626deb06cb615208a1e8bc80","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                                     volume_permission)[\u0027id\u0027]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _volume_permission_detail(self, permission):"},{"line_number":64,"context_line":"        return {"},{"line_number":65,"context_line":"            \u0027id\u0027: permission[\u0027id\u0027],"},{"line_number":66,"context_line":"            \u0027volume_id\u0027: permission[\u0027volume_id\u0027],"},{"line_number":67,"context_line":"            \u0027type\u0027: permission[\u0027type\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4hI%3D","line":64,"updated":"2013-08-28 13:03:38.000000000","message":"question: can it be replaced to\n\nreturn permission.copy()\n\n?","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"86641e10f9500363780ec18c21f14c7f8cd885da","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                                     volume_permission)[\u0027id\u0027]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _volume_permission_detail(self, permission):"},{"line_number":64,"context_line":"        return {"},{"line_number":65,"context_line":"            \u0027id\u0027: permission[\u0027id\u0027],"},{"line_number":66,"context_line":"            \u0027volume_id\u0027: permission[\u0027volume_id\u0027],"},{"line_number":67,"context_line":"            \u0027type\u0027: permission[\u0027type\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2F4W0%3D","line":64,"in_reply_to":"AAAASn%2F%2F4hI%3D","updated":"2013-08-28 13:47:34.000000000","message":"Nope, there is some db specific keys we don\u0027t pick up","commit_id":"e621cf80fce53e2d55ff8cc45366af18ebcb8782"}],"cinder/tests/test_migrations.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"43f558a7a465042f379e88dcea32d3d43d59079d","unresolved":false,"context_lines":[{"line_number":914,"context_line":""},{"line_number":915,"context_line":"            migration_api.upgrade(engine, TestMigrations.REPOSITORY, ver)"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"            self.assertTrue(engine.dialect.has_table(engine.connect(),"},{"line_number":918,"context_line":"                                                     \"volume_acl_permissions\"))"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"            permissions \u003d sqlalchemy.Table(\u0027volume_acl_permissions\u0027, metadata,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F%2Bl0%3D","line":917,"updated":"2013-08-27 11:14:08.000000000","message":"This can be simplified to: self.assertTrue(engine.has_table(\"volume_acl_permissions\"))","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"},{"author":{"_account_id":6506,"name":"Anastasia Guzikova","email":"aguzikova@mirantis.com","username":"aguzikova"},"change_message_id":"a9bf2cdc4113678c29d8d4d7ee3b4fa56552107d","unresolved":false,"context_lines":[{"line_number":914,"context_line":""},{"line_number":915,"context_line":"            migration_api.upgrade(engine, TestMigrations.REPOSITORY, ver)"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"            self.assertTrue(engine.dialect.has_table(engine.connect(),"},{"line_number":918,"context_line":"                                                     \"volume_acl_permissions\"))"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"            permissions \u003d sqlalchemy.Table(\u0027volume_acl_permissions\u0027, metadata,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9ow%3D","line":917,"in_reply_to":"AAAASn%2F%2F%2Bl0%3D","updated":"2013-08-27 14:08:54.000000000","message":"Done","commit_id":"f652aa62fa87e74565e071cb19ef10a4dce8cbbe"}]}
