)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"d26a498adb3689b3e0706add7b3336a13e3273a7","unresolved":false,"context_lines":[{"line_number":3307,"context_line":""},{"line_number":3308,"context_line":"@require_context"},{"line_number":3309,"context_line":"def security_group_update(context, security_group_id, values):"},{"line_number":3310,"context_line":"    security_group_ref \u003d model_query(context, models.SecurityGroup).\\"},{"line_number":3311,"context_line":"            filter_by(id\u003dsecurity_group_id).first()"},{"line_number":3312,"context_line":""},{"line_number":3313,"context_line":"    if not security_group_ref:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F118%3D","line":3310,"updated":"2013-06-07 19:20:54.000000000","message":"I am not sure that this works as expected.\nBecause .update() method just change the values in model instance, and doesn\u0027t do any request in db. This should be handled by session, but in this case it is not tracked by session. \nso the correct way to make it is to create explicit session:\n\nsession \u003d get_session()\n\nwith session.begin():\n   and make both queries in one session. \n\nAlso could you check do we use returned value, if not then this could be optimized and made through one query.","commit_id":"2cce127396ff82c2b40b655507ed927a56cf1b69"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"f7654b6180fab83871099c8719c38756ae625f70","unresolved":false,"context_lines":[{"line_number":3307,"context_line":""},{"line_number":3308,"context_line":"@require_context"},{"line_number":3309,"context_line":"def security_group_update(context, security_group_id, values):"},{"line_number":3310,"context_line":"    security_group_ref \u003d model_query(context, models.SecurityGroup).\\"},{"line_number":3311,"context_line":"            filter_by(id\u003dsecurity_group_id).first()"},{"line_number":3312,"context_line":""},{"line_number":3313,"context_line":"    if not security_group_ref:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F0D8%3D","line":3310,"in_reply_to":"AAAAPX%2F%2F118%3D","updated":"2013-06-09 15:35:05.000000000","message":"I see; added an explicit session.\n\nReturn value is used in nova/compute/api.py update_security_group() so I think we should not drop it.","commit_id":"2cce127396ff82c2b40b655507ed927a56cf1b69"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"d26a498adb3689b3e0706add7b3336a13e3273a7","unresolved":false,"context_lines":[{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"def security_group_ensure_default(context):"},{"line_number":3321,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3322,"context_line":"    try:"},{"line_number":3323,"context_line":"        default_group \u003d security_group_get_by_name(context,"},{"line_number":3324,"context_line":"                context.project_id, \u0027default\u0027,"},{"line_number":3325,"context_line":"                columns_to_join\u003d[])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F11U%3D","line":3322,"updated":"2013-06-07 19:20:54.000000000","message":"This method contains a tons of bugs.\n\nAll these bugs are connected with the next:\nIf you don\u0027t use explict session with explicit transaction: \n\nsession \u003d get_seesion()\nwith session.begin(): \n   ...\n\nyou will make all requests in separated transaction. \nso if there will be some errors durring this operation we will brake db. (because part of work will be in DB and part not in DB).","commit_id":"2cce127396ff82c2b40b655507ed927a56cf1b69"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"f7654b6180fab83871099c8719c38756ae625f70","unresolved":false,"context_lines":[{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"def security_group_ensure_default(context):"},{"line_number":3321,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3322,"context_line":"    try:"},{"line_number":3323,"context_line":"        default_group \u003d security_group_get_by_name(context,"},{"line_number":3324,"context_line":"                context.project_id, \u0027default\u0027,"},{"line_number":3325,"context_line":"                columns_to_join\u003d[])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F0Eo%3D","line":3322,"in_reply_to":"AAAAPX%2F%2F11U%3D","updated":"2013-06-09 15:35:05.000000000","message":"Done","commit_id":"2cce127396ff82c2b40b655507ed927a56cf1b69"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"035330c6546eda819dfe3ce675d4f887998e4e7f","unresolved":false,"context_lines":[{"line_number":3354,"context_line":""},{"line_number":3355,"context_line":""},{"line_number":3356,"context_line":"def security_group_ensure_default(context):"},{"line_number":3357,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3358,"context_line":"    session \u003d get_session()"},{"line_number":3359,"context_line":""},{"line_number":3360,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F%2BeY%3D","line":3357,"updated":"2013-06-16 13:52:28.000000000","message":"This method won\u0027t work properly at all.","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"67b057db0bba9547dec4f4ef365bb57653b5cd7a","unresolved":false,"context_lines":[{"line_number":3354,"context_line":""},{"line_number":3355,"context_line":""},{"line_number":3356,"context_line":"def security_group_ensure_default(context):"},{"line_number":3357,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3358,"context_line":"    session \u003d get_session()"},{"line_number":3359,"context_line":""},{"line_number":3360,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F968%3D","line":3357,"in_reply_to":"AAAAPn%2F%2F%2BeY%3D","updated":"2013-06-17 07:04:41.000000000","message":"What would be a proper way to fix that? Since we don\u0027t want to pass \u0027session\u0027 to public functions anymore (like \u0027security_group_create\u0027, \u0027security_group_rule_create\u0027 etc) we cannot use them.\n\nLooks like we need to create private helpers like _security_group_rule_create() which accept session param and in public methods just call them without explicit session?\n\ne.g. \n\ndef _security_group_rule_create(context, values, session\u003dNone):\n    security_group_rule_ref \u003d models.SecurityGroupIngressRule()\n    security_group_rule_ref.update(values)\n    security_group_rule_ref.save(session\u003dsession)\n    return security_group_rule_ref\n\ndef security_group_rule_create(context, values):\n    return _security_group_rule_create(context, values)\n\nso in security_group_ensure_default() it will look like:\n\nwith session.begin():\n   ....\n   _security_group_rule_create(context, rule_values, session\u003dsession)\n\ninstead of\n \n    ...\n    security_group_rule_create(context, rule_values)\n\nThe same schema applies to other functions used in security_group_ensure_default(): security_group_get_by_name and security_group_create\n\nWhat do you think about it?","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"dd9eae01e8b1a6de0fc114d0c8a813723a6eed81","unresolved":false,"context_lines":[{"line_number":3354,"context_line":""},{"line_number":3355,"context_line":""},{"line_number":3356,"context_line":"def security_group_ensure_default(context):"},{"line_number":3357,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3358,"context_line":"    session \u003d get_session()"},{"line_number":3359,"context_line":""},{"line_number":3360,"context_line":"    with session.begin():"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F92o%3D","line":3357,"in_reply_to":"AAAAPn%2F%2F968%3D","updated":"2013-06-17 08:19:22.000000000","message":"Yes I think that this is proper way to handle such situations. \n\nCould you also take a look at the top of db.api, and ensure that all these methods are actually used as public methods?","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"035330c6546eda819dfe3ce675d4f887998e4e7f","unresolved":false,"context_lines":[{"line_number":3355,"context_line":""},{"line_number":3356,"context_line":"def security_group_ensure_default(context):"},{"line_number":3357,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3358,"context_line":"    session \u003d get_session()"},{"line_number":3359,"context_line":""},{"line_number":3360,"context_line":"    with session.begin():"},{"line_number":3361,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F%2BeQ%3D","line":3358,"updated":"2013-06-16 13:52:28.000000000","message":"create session \"ses1\"","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"035330c6546eda819dfe3ce675d4f887998e4e7f","unresolved":false,"context_lines":[{"line_number":3357,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3358,"context_line":"    session \u003d get_session()"},{"line_number":3359,"context_line":""},{"line_number":3360,"context_line":"    with session.begin():"},{"line_number":3361,"context_line":"        try:"},{"line_number":3362,"context_line":"            default_group \u003d security_group_get_by_name(context,"},{"line_number":3363,"context_line":"                    context.project_id, \u0027default\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F%2BeE%3D","line":3360,"updated":"2013-06-16 13:52:28.000000000","message":"run transaction \"tran1\" in \"ses1\"","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"035330c6546eda819dfe3ce675d4f887998e4e7f","unresolved":false,"context_lines":[{"line_number":3359,"context_line":""},{"line_number":3360,"context_line":"    with session.begin():"},{"line_number":3361,"context_line":"        try:"},{"line_number":3362,"context_line":"            default_group \u003d security_group_get_by_name(context,"},{"line_number":3363,"context_line":"                    context.project_id, \u0027default\u0027,"},{"line_number":3364,"context_line":"                    columns_to_join\u003d[])"},{"line_number":3365,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F%2BeA%3D","line":3362,"updated":"2013-06-16 13:52:28.000000000","message":"create \"ses2\" and run \"tran2\" (independent transaction) then we make our get and commit. \n\nIf it fails then we are making our except case","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"035330c6546eda819dfe3ce675d4f887998e4e7f","unresolved":false,"context_lines":[{"line_number":3367,"context_line":"                      \u0027description\u0027: \u0027default\u0027,"},{"line_number":3368,"context_line":"                      \u0027user_id\u0027: context.user_id,"},{"line_number":3369,"context_line":"                      \u0027project_id\u0027: context.project_id}"},{"line_number":3370,"context_line":"            default_group \u003d security_group_create(context, values)"},{"line_number":3371,"context_line":"            for default_rule in security_group_default_rule_list(context):"},{"line_number":3372,"context_line":"                # This is suboptimal, it should be programmatic to know"},{"line_number":3373,"context_line":"                # the values of the default_rule"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F%2Bd8%3D","line":3370,"updated":"2013-06-16 13:52:28.000000000","message":"Make \"ses3\" and \"tran3\" (independent of \"tran2\" and \"tran1\")\nrun \"INSERT INTO\" and \"Commit\"","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"035330c6546eda819dfe3ce675d4f887998e4e7f","unresolved":false,"context_lines":[{"line_number":3377,"context_line":"                               \u0027cidr\u0027: default_rule.cidr,"},{"line_number":3378,"context_line":"                               \u0027parent_group_id\u0027: default_group.id,"},{"line_number":3379,"context_line":"                }"},{"line_number":3380,"context_line":"                security_group_rule_create(context, rule_values)"},{"line_number":3381,"context_line":"        return default_group"},{"line_number":3382,"context_line":""},{"line_number":3383,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F%2Bd0%3D","line":3380,"updated":"2013-06-16 13:52:28.000000000","message":"N Independent sessions with N independent transactions to create each rule.  \n\nSo if we get some exception during creation of rules we won\u0027t make rollback for previous rules and our created security_group.\nAnd we will get inconsistent state in db.","commit_id":"eacdf035e99ca3737316c834c2453775488f4126"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"85beab4bd218ae1a839994adfcd704776595b7d2","unresolved":false,"context_lines":[{"line_number":3216,"context_line":""},{"line_number":3217,"context_line":"###################"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"def _security_group_create(context, values, session\u003dNone):"},{"line_number":3220,"context_line":"    security_group_ref \u003d models.SecurityGroup()"},{"line_number":3221,"context_line":"    # FIXME(devcamcar): Unless I do this, rules fails with lazy load exception"},{"line_number":3222,"context_line":"    # once save() is called.  This will get cleaned up in next orm pass."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2F1Ts%3D","line":3219,"updated":"2013-06-20 06:28:28.000000000","message":"Just wonder why this method is not around securtiy_group_create?","commit_id":"96f8ae840dd9b0e4e9a89c05e4cb48942bda00f4"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"cdced1c367b8f118dd8feda21cf5859dbad6bba8","unresolved":false,"context_lines":[{"line_number":3216,"context_line":""},{"line_number":3217,"context_line":"###################"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"def _security_group_create(context, values, session\u003dNone):"},{"line_number":3220,"context_line":"    security_group_ref \u003d models.SecurityGroup()"},{"line_number":3221,"context_line":"    # FIXME(devcamcar): Unless I do this, rules fails with lazy load exception"},{"line_number":3222,"context_line":"    # once save() is called.  This will get cleaned up in next orm pass."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2F1TA%3D","line":3219,"in_reply_to":"AAAAPn%2F%2F1Ts%3D","updated":"2013-06-20 07:50:43.000000000","message":"I noticed that private helpers usually follow in the beginning of the group methods, so I decided to place it here.","commit_id":"96f8ae840dd9b0e4e9a89c05e4cb48942bda00f4"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"85beab4bd218ae1a839994adfcd704776595b7d2","unresolved":false,"context_lines":[{"line_number":3402,"context_line":"def security_group_destroy(context, security_group_id):"},{"line_number":3403,"context_line":"    session \u003d get_session()"},{"line_number":3404,"context_line":"    with session.begin():"},{"line_number":3405,"context_line":"        session.query(models.SecurityGroup).\\"},{"line_number":3406,"context_line":"                filter_by(id\u003dsecurity_group_id).\\"},{"line_number":3407,"context_line":"                soft_delete()"},{"line_number":3408,"context_line":"        session.query(models.SecurityGroupInstanceAssociation).\\"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2F1Tw%3D","line":3405,"updated":"2013-06-20 06:28:28.000000000","message":"As you are working around session, here (in this 4 cases) we should use\n\nmodel_query instead of session.query.","commit_id":"96f8ae840dd9b0e4e9a89c05e4cb48942bda00f4"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3232,"context_line":"    Get security group models for a project by a list of names."},{"line_number":3233,"context_line":"    Raise SecurityGroupNotFoundForProject for a name not found."},{"line_number":3234,"context_line":"    \"\"\""},{"line_number":3235,"context_line":"    query \u003d _security_group_get_query(context, session\u003dsession,"},{"line_number":3236,"context_line":"            read_deleted\u003d\"no\", join_rules\u003dFalse).\\"},{"line_number":3237,"context_line":"            filter_by(project_id\u003dproject_id).\\"},{"line_number":3238,"context_line":"            filter(models.SecurityGroup.name.in_(group_names))"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiN8%3D","line":3235,"updated":"2013-06-28 10:49:21.000000000","message":"as you are refactoring security_group could you fix here align as in comment in 3278 line","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3273,"context_line":""},{"line_number":3274,"context_line":"@require_context"},{"line_number":3275,"context_line":"def security_group_get_by_name(context, project_id, group_name,"},{"line_number":3276,"context_line":"        columns_to_join\u003dNone):"},{"line_number":3277,"context_line":"    query \u003d _security_group_get_query(context,"},{"line_number":3278,"context_line":"            read_deleted\u003d\"no\", join_rules\u003dFalse).\\"},{"line_number":3279,"context_line":"            filter_by(project_id\u003dproject_id).\\"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiOw%3D","line":3276,"updated":"2013-06-28 10:49:21.000000000","message":"align","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3275,"context_line":"def security_group_get_by_name(context, project_id, group_name,"},{"line_number":3276,"context_line":"        columns_to_join\u003dNone):"},{"line_number":3277,"context_line":"    query \u003d _security_group_get_query(context,"},{"line_number":3278,"context_line":"            read_deleted\u003d\"no\", join_rules\u003dFalse).\\"},{"line_number":3279,"context_line":"            filter_by(project_id\u003dproject_id).\\"},{"line_number":3280,"context_line":"            filter_by(name\u003dgroup_name)"},{"line_number":3281,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiOs%3D","line":3278,"updated":"2013-06-28 10:49:21.000000000","message":"read_deleted should be aligned with context","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"        columns_to_join\u003dNone):"},{"line_number":3277,"context_line":"    query \u003d _security_group_get_query(context,"},{"line_number":3278,"context_line":"            read_deleted\u003d\"no\", join_rules\u003dFalse).\\"},{"line_number":3279,"context_line":"            filter_by(project_id\u003dproject_id).\\"},{"line_number":3280,"context_line":"            filter_by(name\u003dgroup_name)"},{"line_number":3281,"context_line":""},{"line_number":3282,"context_line":"    if columns_to_join is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiOk%3D","line":3279,"updated":"2013-06-28 10:49:21.000000000","message":"and don\u0027t touch align of filters\u003d)","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3321,"context_line":"def security_group_in_use(context, group_id):"},{"line_number":3322,"context_line":"    session \u003d get_session()"},{"line_number":3323,"context_line":"    with session.begin():"},{"line_number":3324,"context_line":"        # Are there any instances that haven\u0027t been deleted"},{"line_number":3325,"context_line":"        # that include this group?"},{"line_number":3326,"context_line":"        inst_assoc \u003d model_query(context,"},{"line_number":3327,"context_line":"                                 models.SecurityGroupInstanceAssociation,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiNo%3D","line":3324,"updated":"2013-06-28 10:49:21.000000000","message":"Not in this patch, but in some of the next (probably after adding the unique constraint) I would like to see performance optimization for this method: \n\nfrom inst_assoc you are using only instance_uuid, so it will be ok if you get only instance_uuid","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3327,"context_line":"                                 models.SecurityGroupInstanceAssociation,"},{"line_number":3328,"context_line":"                                 read_deleted\u003d\"no\", session\u003dsession).\\"},{"line_number":3329,"context_line":"                        filter_by(security_group_id\u003dgroup_id).\\"},{"line_number":3330,"context_line":"                        all()"},{"line_number":3331,"context_line":"        for ia in inst_assoc:"},{"line_number":3332,"context_line":"            num_instances \u003d model_query(context, models.Instance,"},{"line_number":3333,"context_line":"                                        session\u003dsession, read_deleted\u003d\"no\").\\"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiNQ%3D","line":3330,"updated":"2013-06-28 10:49:21.000000000","message":"You are making here N request instead of one. \n\nIf you create array of required instance_uuid\n\nand then make something like:\nfitler(models.Instance.uuid.in_(instance_uuids)).count()\n\nIt will be done in 1 DB request.\n\nBut do this in separated patch.","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3351,"context_line":"    with session.begin():"},{"line_number":3352,"context_line":"        security_group_ref \u003d model_query(context, models.SecurityGroup,"},{"line_number":3353,"context_line":"                                         session\u003dsession).\\"},{"line_number":3354,"context_line":"                                filter_by(id\u003dsecurity_group_id).first()"},{"line_number":3355,"context_line":""},{"line_number":3356,"context_line":"        if not security_group_ref:"},{"line_number":3357,"context_line":"            raise exception.SecurityGroupNotFound("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiOg%3D","line":3354,"updated":"2013-06-28 10:49:21.000000000","message":"i would prefer to see .first() on next line","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"ae03934ab38d7ad1e34011f022ab9efff71931cc","unresolved":false,"context_lines":[{"line_number":3363,"context_line":"def security_group_ensure_default(context):"},{"line_number":3364,"context_line":"    \"\"\"Ensure default security group exists for a project_id.\"\"\""},{"line_number":3365,"context_line":"    session \u003d get_session()"},{"line_number":3366,"context_line":""},{"line_number":3367,"context_line":"    with session.begin():"},{"line_number":3368,"context_line":"        try:"},{"line_number":3369,"context_line":"            default_group \u003d _security_group_get_by_names(context,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FiOQ%3D","line":3366,"updated":"2013-06-28 10:49:21.000000000","message":"why empty line?","commit_id":"deda6a1876d8482384c9de910b41f674cf1c8aeb"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"07d9fbab9d8cface7a2c32eb9b30ac026d768e92","unresolved":false,"context_lines":[{"line_number":3233,"context_line":"    Raise SecurityGroupNotFoundForProject for a name not found."},{"line_number":3234,"context_line":"    \"\"\""},{"line_number":3235,"context_line":"    query \u003d _security_group_get_query(context, session\u003dsession,"},{"line_number":3236,"context_line":"                                      read_deleted\u003d\"no\", join_rules\u003dFalse).\\"},{"line_number":3237,"context_line":"            filter_by(project_id\u003dproject_id).\\"},{"line_number":3238,"context_line":"            filter(models.SecurityGroup.name.in_(group_names))"},{"line_number":3239,"context_line":"    sg_models \u003d query.all()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2Fcb4%3D","line":3236,"updated":"2013-07-01 20:22:30.000000000","message":"In the future please avoid unnecessary formatting changes","commit_id":"07568f68e6dfe652d6063c696b9be96447a9c992"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"9185a79780a4e13aea3322ca28de11645cf30b4b","unresolved":false,"context_lines":[{"line_number":3233,"context_line":"    Raise SecurityGroupNotFoundForProject for a name not found."},{"line_number":3234,"context_line":"    \"\"\""},{"line_number":3235,"context_line":"    query \u003d _security_group_get_query(context, session\u003dsession,"},{"line_number":3236,"context_line":"                                      read_deleted\u003d\"no\", join_rules\u003dFalse).\\"},{"line_number":3237,"context_line":"            filter_by(project_id\u003dproject_id).\\"},{"line_number":3238,"context_line":"            filter(models.SecurityGroup.name.in_(group_names))"},{"line_number":3239,"context_line":"    sg_models \u003d query.all()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAPn%2F%2FcFI%3D","line":3236,"in_reply_to":"AAAAPn%2F%2Fcb4%3D","updated":"2013-07-01 22:22:13.000000000","message":"I think this one is needed though... Lining up with the start of the line is hard to read...","commit_id":"07568f68e6dfe652d6063c696b9be96447a9c992"}],"nova/tests/db/test_db_api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"39759b99ee129679f15442b56b0dc719af05a315","unresolved":false,"context_lines":[{"line_number":1619,"context_line":"                                                 \u0027default\u0027))"},{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"    def test_security_group_ensure_default_create_fails(self):"},{"line_number":1622,"context_line":"        self.mox.StubOutWithMock(sqlalchemy_api, \u0027_security_group_create\u0027)"},{"line_number":1623,"context_line":"        sqlalchemy_api._security_group_create(mox.IgnoreArg(),"},{"line_number":1624,"context_line":"                                  mox.IgnoreArg(),"},{"line_number":1625,"context_line":"                                  session\u003dmox.IgnoreArg()).\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAPn%2F%2FvqQ%3D","line":1622,"updated":"2013-06-23 05:15:46.000000000","message":"Pls do no touch the private functionality in tests.","commit_id":"d41e40bf7f3a35cd05066e2177c7a130384065d0"},{"author":{"_account_id":6509,"name":"Roman Bogorodskiy","email":"rbogorodskiy@mirantis.com","username":"novel"},"change_message_id":"43d872b6d15801d516383f6df274825658a6f961","unresolved":false,"context_lines":[{"line_number":1619,"context_line":"                                                 \u0027default\u0027))"},{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"    def test_security_group_ensure_default_create_fails(self):"},{"line_number":1622,"context_line":"        self.mox.StubOutWithMock(sqlalchemy_api, \u0027_security_group_create\u0027)"},{"line_number":1623,"context_line":"        sqlalchemy_api._security_group_create(mox.IgnoreArg(),"},{"line_number":1624,"context_line":"                                  mox.IgnoreArg(),"},{"line_number":1625,"context_line":"                                  session\u003dmox.IgnoreArg()).\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAPn%2F%2Fu3Y%3D","line":1622,"in_reply_to":"AAAAPn%2F%2FvqQ%3D","updated":"2013-06-24 07:59:07.000000000","message":"If I don\u0027t touch private functions in test, I cannot test negative scenarios of security_group_ensure_default(). Should I remove these tests?","commit_id":"d41e40bf7f3a35cd05066e2177c7a130384065d0"}]}
