)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"df3dcb6e2d9d9192a094e4042266153c4ecddd66","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Introduce OVO for quotas"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. OVO integration will be done in furthur"},{"line_number":11,"context_line":"revision."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ic058e66e6780e1f6ff25a5b2bbe7294959905765"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1aa78d24_5722f6a3","line":11,"range":{"start_line":10,"start_character":27,"end_line":11,"end_character":9},"updated":"2016-07-12 13:33:52.000000000","message":"why? We did that at the beginning of the ovo work because we didn\u0027t want to break master before the mitaka freeze but now there\u0027s no reason.\nI prefer seeing how this ovo is used in the code straight away, see that tests are not failing, otherwise we will end up with lots of ovo objects that are not used anywhere. Please integrate the ovo in this patch or in a dependent patch.","commit_id":"34ca8189320e9adc9d39fcd63c3b11f4613787f3"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"faaf55980dd2ed85f9789e60247f4806c63fc41c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Introduce OVO for quotas"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. OVO integration will be done in furthur"},{"line_number":11,"context_line":"revision."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ic058e66e6780e1f6ff25a5b2bbe7294959905765"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1aa78d24_2e854cce","line":11,"range":{"start_line":10,"start_character":27,"end_line":11,"end_character":9},"in_reply_to":"1aa78d24_5722f6a3","updated":"2016-07-12 16:18:38.000000000","message":"by furthur revision I meant another revision of same patch or dependent patch it will be done along with this patch. sorry if wording was confusing.","commit_id":"34ca8189320e9adc9d39fcd63c3b11f4613787f3"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"1529ac4f570df1291e766e287b7c0382c781fc80","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Introduce OVO for quotas"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. OVO integration will be done in furthur"},{"line_number":11,"context_line":"revision."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"fa6399be_2f9356fb","line":10,"range":{"start_line":10,"start_character":59,"end_line":10,"end_character":66},"updated":"2016-10-14 16:45:56.000000000","message":"s/furthur/further","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"80f886f427f09de9be4c053dbaf3e1d5b2deb07a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Introduce OVO for quotas"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. OVO integration will be done in furthur"},{"line_number":11,"context_line":"revision."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"fa6399be_269e18b9","line":10,"range":{"start_line":10,"start_character":59,"end_line":10,"end_character":66},"in_reply_to":"fa6399be_2f9356fb","updated":"2016-10-14 19:58:36.000000000","message":"Done","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a7b26cc289548ce1e75963eaa924baa29703a724","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. There is UsageInfo classes in api for objects"},{"line_number":11,"context_line":"related to quota, after replacement with ovo, I think those  no longer"},{"line_number":12,"context_line":"will be needed, OVO implementation may require a refactor on that so,"},{"line_number":13,"context_line":"this ovo implementation is separated from this patch."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"9a629dbe_8c37c9e2","line":11,"range":{"start_line":11,"start_character":60,"end_line":11,"end_character":61},"updated":"2016-11-07 14:41:50.000000000","message":"nit: extra space","commit_id":"e7b2731532f3d42ffae009c09ed6c16ad70fe520"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a7b26cc289548ce1e75963eaa924baa29703a724","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. There is UsageInfo classes in api for objects"},{"line_number":11,"context_line":"related to quota, after replacement with ovo, I think those  no longer"},{"line_number":12,"context_line":"will be needed, OVO implementation may require a refactor on that so,"},{"line_number":13,"context_line":"this ovo implementation is separated from this patch."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"9a629dbe_acf1edcf","line":12,"range":{"start_line":11,"start_character":46,"end_line":12,"end_character":14},"updated":"2016-11-07 14:41:50.000000000","message":"Can you confirm this?","commit_id":"e7b2731532f3d42ffae009c09ed6c16ad70fe520"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"3d104cb119b3b56e83a0a26947cc830ff1855ff2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch will introduce ovo for quotas in neutron. There are object"},{"line_number":10,"context_line":"definitions in this patch. There is UsageInfo classes in api for objects"},{"line_number":11,"context_line":"related to quota, after replacement with ovo, I think those  no longer"},{"line_number":12,"context_line":"will be needed, OVO implementation may require a refactor on that so,"},{"line_number":13,"context_line":"this ovo implementation is separated from this patch."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"9a629dbe_2b521a14","line":12,"range":{"start_line":11,"start_character":46,"end_line":12,"end_character":14},"in_reply_to":"9a629dbe_acf1edcf","updated":"2016-11-07 17:32:16.000000000","message":"the only use I see of those doing named tuple, If we write object under or top of that thats like 2 more wrapper on top of models, i think we should have only one layer, but i\u0027ll bring this next meeting","commit_id":"e7b2731532f3d42ffae009c09ed6c16ad70fe520"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Depends-On: I834e02b75c7c65eb265de03c446f8db5a9e31c1c"},{"line_number":13,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"},{"line_number":14,"context_line":"Co-Authored-By: Victor Morales\u003cvictor.morales@intel.com\u003e"},{"line_number":15,"context_line":"Change-Id: Ic058e66e6780e1f6ff25a5b2bbe7294959905765"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"1a1ced50_06b4f87f","line":14,"range":{"start_line":14,"start_character":23,"end_line":14,"end_character":38},"updated":"2017-03-21 20:45:11.000000000","message":"nit: there should be a space between name and address","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Depends-On: I834e02b75c7c65eb265de03c446f8db5a9e31c1c"},{"line_number":13,"context_line":"Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db"},{"line_number":14,"context_line":"Co-Authored-By: Victor Morales\u003cvictor.morales@intel.com\u003e"},{"line_number":15,"context_line":"Change-Id: Ic058e66e6780e1f6ff25a5b2bbe7294959905765"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"1a1ced50_517948c7","line":14,"range":{"start_line":14,"start_character":23,"end_line":14,"end_character":38},"in_reply_to":"1a1ced50_06b4f87f","updated":"2017-03-21 23:23:31.000000000","message":"Done","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"}],"neutron/db/quota/api.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"96a2c6999ba09ad0627292c17c9ee4231d0b712a","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        filters[\u0027resource\u0027] \u003d resources"},{"line_number":143,"context_line":"    # synchronize_session\u003dFalse needed because of the IN condition"},{"line_number":144,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, **filters)"},{"line_number":145,"context_line":"    counter \u003d 0"},{"line_number":146,"context_line":"    for obj in query:"},{"line_number":147,"context_line":"        obj.dirty \u003d dirty"},{"line_number":148,"context_line":"        obj.update()"},{"line_number":149,"context_line":"        counter +\u003d 1"},{"line_number":150,"context_line":"    return counter"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_d74ae982","line":150,"range":{"start_line":145,"start_character":4,"end_line":150,"end_character":18},"updated":"2016-11-24 15:28:22.000000000","message":"for obj in query:\n    obj.dirty \u003d dirty\n    obj.update()\nreturn len(query)","commit_id":"a66c6ab6c9515a6c8a11782ca9c5752843eed80e"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"96a2c6999ba09ad0627292c17c9ee4231d0b712a","unresolved":false,"context_lines":[{"line_number":160,"context_line":"              actually updated"},{"line_number":161,"context_line":"    \"\"\""},{"line_number":162,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":163,"context_line":"    counter \u003d 0"},{"line_number":164,"context_line":"    for obj in query:"},{"line_number":165,"context_line":"        obj.dirty \u003d dirty"},{"line_number":166,"context_line":"        obj.update()"},{"line_number":167,"context_line":"        counter +\u003d 1"},{"line_number":168,"context_line":"    return counter"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_0a0a7421","line":168,"range":{"start_line":163,"start_character":4,"end_line":168,"end_character":17},"updated":"2016-11-24 15:28:22.000000000","message":"ditto","commit_id":"a66c6ab6c9515a6c8a11782ca9c5752843eed80e"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"96a2c6999ba09ad0627292c17c9ee4231d0b712a","unresolved":false,"context_lines":[{"line_number":240,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":241,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":242,"context_line":"    counter \u003d 0"},{"line_number":243,"context_line":"    for resv in resv_obj:"},{"line_number":244,"context_line":"        resv.delete()"},{"line_number":245,"context_line":"        counter +\u003d 1"},{"line_number":246,"context_line":"    return counter"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_88776c39","line":246,"range":{"start_line":243,"start_character":4,"end_line":246,"end_character":18},"updated":"2016-11-24 15:28:22.000000000","message":"for resv in resv_obj:\n        resv.delete()\n    return len(resv_obj)","commit_id":"a66c6ab6c9515a6c8a11782ca9c5752843eed80e"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8bef494a53d4ced41d4e7bb8bc99fb717087e963","unresolved":false,"context_lines":[{"line_number":235,"context_line":"@db_api.context_manager.writer"},{"line_number":236,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":237,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":238,"context_line":"    for resv in resv_obj:"},{"line_number":239,"context_line":"        resv.delete()"},{"line_number":240,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba5201f7_3a2cdaaa","line":240,"range":{"start_line":238,"start_character":4,"end_line":240,"end_character":24},"updated":"2017-01-04 10:57:33.000000000","message":"We can use delete_objects here.","commit_id":"c3408f213e5beadde5304d1ba9f947c0caa035ba"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"0639f81d760f57aed5ca7434ca6dde07999e3974","unresolved":false,"context_lines":[{"line_number":235,"context_line":"@db_api.context_manager.writer"},{"line_number":236,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":237,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":238,"context_line":"    for resv in resv_obj:"},{"line_number":239,"context_line":"        resv.delete()"},{"line_number":240,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba5201f7_431fe86b","line":240,"range":{"start_line":238,"start_character":4,"end_line":240,"end_character":24},"in_reply_to":"ba5201f7_3a2cdaaa","updated":"2017-01-04 18:47:14.000000000","message":"this is little bit different, we are calling in get_expired to have and clause and conditions like \u003c. so using get_object directly will not serve here, if delete_objects will be used after L237 that will in turn call get_objects which will query again. so i believe that\u0027s the reason it is done this way.","commit_id":"c3408f213e5beadde5304d1ba9f947c0caa035ba"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    result \u003d quota_obj.QuotaUsage.get_object(context, resource\u003dresource,"},{"line_number":51,"context_line":"                                             project_id\u003dtenant_id)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    if not result:"},{"line_number":54,"context_line":"        return"},{"line_number":55,"context_line":"    return QuotaUsageInfo(result.resource, result.project_id, result.in_use,"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_719eb255","line":52,"updated":"2017-01-10 17:35:19.000000000","message":"What about lock_for_update?","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    result \u003d quota_obj.QuotaUsage.get_object(context, resource\u003dresource,"},{"line_number":51,"context_line":"                                             project_id\u003dtenant_id)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    if not result:"},{"line_number":54,"context_line":"        return"},{"line_number":55,"context_line":"    return QuotaUsageInfo(result.resource, result.project_id, result.in_use,"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_f15e6275","line":52,"in_reply_to":"ba5201f7_719eb255","updated":"2017-01-12 21:33:15.000000000","message":"in next PS, i am adding a modifying get_object a little bit to have a generic approach instead of doing a separate method for object class to solve this","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    :param delta: Specifies whether in_use is an absolute number"},{"line_number":89,"context_line":"                  or a delta (default to False)"},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":"    usage_data \u003d quota_obj.QuotaUsage.get_object("},{"line_number":92,"context_line":"        context, resource\u003dresource, project_id\u003dtenant_id)"},{"line_number":93,"context_line":"    if not usage_data:"},{"line_number":94,"context_line":"        # Must create entry"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_17d1d6cd","line":91,"updated":"2017-01-10 17:35:19.000000000","message":"We still need this transaction for lines 91-105.","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    :param delta: Specifies whether in_use is an absolute number"},{"line_number":89,"context_line":"                  or a delta (default to False)"},{"line_number":90,"context_line":"    \"\"\""},{"line_number":91,"context_line":"    usage_data \u003d quota_obj.QuotaUsage.get_object("},{"line_number":92,"context_line":"        context, resource\u003dresource, project_id\u003dtenant_id)"},{"line_number":93,"context_line":"    if not usage_data:"},{"line_number":94,"context_line":"        # Must create entry"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_6b2f88a1","line":91,"in_reply_to":"ba5201f7_17d1d6cd","updated":"2017-01-12 21:33:15.000000000","message":"Done","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    filters \u003d {\u0027project_id\u0027: tenant_id}"},{"line_number":141,"context_line":"    if resources:"},{"line_number":142,"context_line":"        filters[\u0027resource\u0027] \u003d resources"},{"line_number":143,"context_line":"    # synchronize_session\u003dFalse needed because of the IN condition"},{"line_number":144,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, **filters)"},{"line_number":145,"context_line":"    for obj in query:"},{"line_number":146,"context_line":"        obj.dirty \u003d dirty"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_1e856a58","line":143,"updated":"2017-01-10 17:35:19.000000000","message":"This comment is no longer valid.","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    filters \u003d {\u0027project_id\u0027: tenant_id}"},{"line_number":141,"context_line":"    if resources:"},{"line_number":142,"context_line":"        filters[\u0027resource\u0027] \u003d resources"},{"line_number":143,"context_line":"    # synchronize_session\u003dFalse needed because of the IN condition"},{"line_number":144,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, **filters)"},{"line_number":145,"context_line":"    for obj in query:"},{"line_number":146,"context_line":"        obj.dirty \u003d dirty"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_cb1a347c","line":143,"in_reply_to":"ba5201f7_1e856a58","updated":"2017-01-12 21:33:15.000000000","message":"Done","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":234,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":235,"context_line":"@db_api.context_manager.writer"},{"line_number":236,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":237,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":238,"context_line":"    for resv in resv_obj:"},{"line_number":239,"context_line":"        resv.delete()"},{"line_number":240,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_3ac9577a","line":239,"range":{"start_line":237,"start_character":4,"end_line":239,"end_character":21},"updated":"2017-01-10 17:35:19.000000000","message":"Please use delete_objects here, or create new method delete_expired for example.","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":234,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":235,"context_line":"@db_api.context_manager.writer"},{"line_number":236,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":237,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":238,"context_line":"    for resv in resv_obj:"},{"line_number":239,"context_line":"        resv.delete()"},{"line_number":240,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_a67365b3","line":239,"range":{"start_line":237,"start_character":4,"end_line":239,"end_character":21},"in_reply_to":"ba5201f7_3ac9577a","updated":"2017-01-12 21:33:15.000000000","message":"I explained reason in PS-21, delete_objects will call get_objects which is not needed in this case, I don\u0027t think a new method should be defined unless we encounter same situation more than once","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"26a43fbae45b1bac94116cf8b8c0de5a440ef01e","unresolved":false,"context_lines":[{"line_number":234,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":235,"context_line":"@db_api.context_manager.writer"},{"line_number":236,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":237,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":238,"context_line":"    for resv in resv_obj:"},{"line_number":239,"context_line":"        resv.delete()"},{"line_number":240,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_28d13ece","line":239,"range":{"start_line":237,"start_character":4,"end_line":239,"end_character":21},"in_reply_to":"ba5201f7_a67365b3","updated":"2017-01-13 12:46:29.000000000","message":"Ok, sorry, I have missed that one.","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"bb55e46199af9bee76caf4a4f748ed9676e43558","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    :returns: a QuotaUsageInfo instance"},{"line_number":48,"context_line":"    \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    if lock_for_update:"},{"line_number":51,"context_line":"        result \u003d quota_obj.QuotaUsage.get_object(context, lock_mode\u003d\u0027update\u0027,"},{"line_number":52,"context_line":"                                                 resource\u003dresource,"},{"line_number":53,"context_line":"                                                 project_id\u003dtenant_id)"},{"line_number":54,"context_line":"    else:"},{"line_number":55,"context_line":"        result \u003d quota_obj.QuotaUsage.get_object(context, resource\u003dresource,"},{"line_number":56,"context_line":"                                                 project_id\u003dtenant_id)"},{"line_number":57,"context_line":"    if not result:"},{"line_number":58,"context_line":"        return"},{"line_number":59,"context_line":"    return QuotaUsageInfo(result.resource, result.project_id, result.in_use,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_726ed4ca","line":56,"range":{"start_line":50,"start_character":3,"end_line":56,"end_character":70},"updated":"2017-01-13 12:59:40.000000000","message":"I would rewrite it to:\n\n    lock_mode \u003d \u0027update\u0027 if lock_for_update else None\n    result \u003d quota_obj.QuotaUsage.get_object(context, \n        lock_mode\u003dlock_mode, resource, tenant_id)","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"c6896730a98ac32f297841cf288ed8b0d431ec76","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    :returns: a QuotaUsageInfo instance"},{"line_number":48,"context_line":"    \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    if lock_for_update:"},{"line_number":51,"context_line":"        result \u003d quota_obj.QuotaUsage.get_object(context, lock_mode\u003d\u0027update\u0027,"},{"line_number":52,"context_line":"                                                 resource\u003dresource,"},{"line_number":53,"context_line":"                                                 project_id\u003dtenant_id)"},{"line_number":54,"context_line":"    else:"},{"line_number":55,"context_line":"        result \u003d quota_obj.QuotaUsage.get_object(context, resource\u003dresource,"},{"line_number":56,"context_line":"                                                 project_id\u003dtenant_id)"},{"line_number":57,"context_line":"    if not result:"},{"line_number":58,"context_line":"        return"},{"line_number":59,"context_line":"    return QuotaUsageInfo(result.resource, result.project_id, result.in_use,"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_a0bff4ce","line":56,"range":{"start_line":50,"start_character":3,"end_line":56,"end_character":70},"in_reply_to":"7a3c09a3_726ed4ca","updated":"2017-01-19 18:44:37.000000000","message":"done","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"bb55e46199af9bee76caf4a4f748ed9676e43558","unresolved":false,"context_lines":[{"line_number":238,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":239,"context_line":"@db_api.context_manager.writer"},{"line_number":240,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":241,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":242,"context_line":"    for resv in resv_obj:"},{"line_number":243,"context_line":"        resv.delete()"},{"line_number":244,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_12e59036","line":244,"range":{"start_line":241,"start_character":4,"end_line":244,"end_character":24},"updated":"2017-01-13 12:59:40.000000000","message":"Does it make any sense to put it under transaction?","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"12641040181ce1c2a815447ba4776a7460276df0","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if query:"},{"line_number":126,"context_line":"        query.dirty \u003d dirty"},{"line_number":127,"context_line":"        query.update()"},{"line_number":128,"context_line":"        return 1"},{"line_number":129,"context_line":"    return 0"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_a5c0977d","line":128,"range":{"start_line":128,"start_character":15,"end_line":128,"end_character":16},"updated":"2017-01-21 02:01:02.000000000","message":"Instead of a hard coded number can we return the number of rows updated","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"38b7b239bc12b2821b842f2598cba8eccd9f7bff","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    if query:"},{"line_number":126,"context_line":"        query.dirty \u003d dirty"},{"line_number":127,"context_line":"        query.update()"},{"line_number":128,"context_line":"        return 1"},{"line_number":129,"context_line":"    return 0"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_d516f44a","line":128,"range":{"start_line":128,"start_character":15,"end_line":128,"end_character":16},"in_reply_to":"5a3905b3_a5c0977d","updated":"2017-01-23 16:38:05.000000000","message":"it is query on primary key so no of rows if updated always be 1, \nSqlalchemy\u0027s query.update return that count but object db api does not, it returns db_obj","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    filters \u003d {\u0027project_id\u0027: tenant_id}"},{"line_number":144,"context_line":"    if resources:"},{"line_number":145,"context_line":"        filters[\u0027resource\u0027] \u003d resources"},{"line_number":146,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, **filters)"},{"line_number":147,"context_line":"    for obj in query:"},{"line_number":148,"context_line":"        obj.dirty \u003d dirty"},{"line_number":149,"context_line":"        obj.update()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_6ff1e56a","line":146,"range":{"start_line":146,"start_character":4,"end_line":146,"end_character":9},"updated":"2017-01-23 19:19:54.000000000","message":"nit: s/query/objs/","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    filters \u003d {\u0027project_id\u0027: tenant_id}"},{"line_number":144,"context_line":"    if resources:"},{"line_number":145,"context_line":"        filters[\u0027resource\u0027] \u003d resources"},{"line_number":146,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, **filters)"},{"line_number":147,"context_line":"    for obj in query:"},{"line_number":148,"context_line":"        obj.dirty \u003d dirty"},{"line_number":149,"context_line":"        obj.update()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_cf661429","line":146,"range":{"start_line":146,"start_character":4,"end_line":146,"end_character":9},"in_reply_to":"5a3905b3_6ff1e56a","updated":"2017-01-24 23:23:24.000000000","message":"Done","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    :returns: the number of tenants for which the dirty bit was"},{"line_number":160,"context_line":"              actually updated"},{"line_number":161,"context_line":"    \"\"\""},{"line_number":162,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":163,"context_line":"    for obj in query:"},{"line_number":164,"context_line":"        obj.dirty \u003d dirty"},{"line_number":165,"context_line":"        obj.update()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_ef05d545","line":162,"range":{"start_line":162,"start_character":4,"end_line":162,"end_character":9},"updated":"2017-01-23 19:19:54.000000000","message":"ditto: line 146","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    :returns: the number of tenants for which the dirty bit was"},{"line_number":160,"context_line":"              actually updated"},{"line_number":161,"context_line":"    \"\"\""},{"line_number":162,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":163,"context_line":"    for obj in query:"},{"line_number":164,"context_line":"        obj.dirty \u003d dirty"},{"line_number":165,"context_line":"        obj.update()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_ef6bd0ef","line":162,"range":{"start_line":162,"start_character":4,"end_line":162,"end_character":9},"in_reply_to":"5a3905b3_ef05d545","updated":"2017-01-24 23:23:24.000000000","message":"Done","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        resource_deltas\u003ddelta_objs)"},{"line_number":181,"context_line":"    resv.create()"},{"line_number":182,"context_line":"    return ReservationInfo(resv[\u0027id\u0027],"},{"line_number":183,"context_line":"                           resv[\u0027tenant_id\u0027],"},{"line_number":184,"context_line":"                           resv[\u0027expiration\u0027],"},{"line_number":185,"context_line":"                           dict((delta.resource, delta.amount)"},{"line_number":186,"context_line":"                                for delta in resv.resource_deltas))"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_6fbf2561","line":183,"range":{"start_line":183,"start_character":33,"end_line":183,"end_character":42},"updated":"2017-01-23 19:19:54.000000000","message":"shouldn\u0027t this be project_id?","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        resource_deltas\u003ddelta_objs)"},{"line_number":181,"context_line":"    resv.create()"},{"line_number":182,"context_line":"    return ReservationInfo(resv[\u0027id\u0027],"},{"line_number":183,"context_line":"                           resv[\u0027tenant_id\u0027],"},{"line_number":184,"context_line":"                           resv[\u0027expiration\u0027],"},{"line_number":185,"context_line":"                           dict((delta.resource, delta.amount)"},{"line_number":186,"context_line":"                                for delta in resv.resource_deltas))"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_ef33d060","line":183,"range":{"start_line":183,"start_character":33,"end_line":183,"end_character":42},"in_reply_to":"5a3905b3_6fbf2561","updated":"2017-01-24 23:23:24.000000000","message":"Done","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"12641040181ce1c2a815447ba4776a7460276df0","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        # quota_usage for all resource involved in this reservation must"},{"line_number":215,"context_line":"        # be marked as dirty"},{"line_number":216,"context_line":"        set_resources_quota_usage_dirty(context, resources, tenant_id)"},{"line_number":217,"context_line":"    return 1"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_6545cf15","line":217,"range":{"start_line":217,"start_character":11,"end_line":217,"end_character":12},"updated":"2017-01-21 02:01:02.000000000","message":"ditto. can we return the number of rows deleted instead of hard coded number?","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        # quota_usage for all resource involved in this reservation must"},{"line_number":215,"context_line":"        # be marked as dirty"},{"line_number":216,"context_line":"        set_resources_quota_usage_dirty(context, resources, tenant_id)"},{"line_number":217,"context_line":"    return 1"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_0a392fd7","line":217,"range":{"start_line":217,"start_character":11,"end_line":217,"end_character":12},"in_reply_to":"5a3905b3_550844da","updated":"2017-01-23 19:19:54.000000000","message":"Even if we replace the line 212 for delete_objects method which return the number of deleted rows, that will internally do an unnecessary to call to db.  I don\u0027t like the hardcoded portion but I\u0027m agree with Manjeet.","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"38b7b239bc12b2821b842f2598cba8eccd9f7bff","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        # quota_usage for all resource involved in this reservation must"},{"line_number":215,"context_line":"        # be marked as dirty"},{"line_number":216,"context_line":"        set_resources_quota_usage_dirty(context, resources, tenant_id)"},{"line_number":217,"context_line":"    return 1"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_550844da","line":217,"range":{"start_line":217,"start_character":11,"end_line":217,"end_character":12},"in_reply_to":"5a3905b3_6545cf15","updated":"2017-01-23 16:38:05.000000000","message":"same reason here","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"12641040181ce1c2a815447ba4776a7460276df0","unresolved":false,"context_lines":[{"line_number":236,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":237,"context_line":"@db_api.context_manager.writer"},{"line_number":238,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":239,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":240,"context_line":"    for resv in resv_obj:"},{"line_number":241,"context_line":"        resv.delete()"},{"line_number":242,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_a592579d","line":242,"range":{"start_line":239,"start_character":4,"end_line":242,"end_character":24},"updated":"2017-01-21 02:01:02.000000000","message":"delete_objects can be used her instead of iterating over the retrieved objects and deleting it.","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":236,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":237,"context_line":"@db_api.context_manager.writer"},{"line_number":238,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":239,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":240,"context_line":"    for resv in resv_obj:"},{"line_number":241,"context_line":"        resv.delete()"},{"line_number":242,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_2af26b9a","line":242,"range":{"start_line":239,"start_character":4,"end_line":242,"end_character":24},"in_reply_to":"5a3905b3_7532a0a8","updated":"2017-01-23 19:19:54.000000000","message":"Manjeet, given that get_expired method is only used here, maybe we can modify it to do some removal and return the number of rows affected.  In fact, that will result in avoiding the load process for deltas.","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"38b7b239bc12b2821b842f2598cba8eccd9f7bff","unresolved":false,"context_lines":[{"line_number":236,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":237,"context_line":"@db_api.context_manager.writer"},{"line_number":238,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":239,"context_line":"    resv_obj \u003d quota_obj.Reservation.get_expired(context, utcnow(), tenant_id)"},{"line_number":240,"context_line":"    for resv in resv_obj:"},{"line_number":241,"context_line":"        resv.delete()"},{"line_number":242,"context_line":"    return len(resv_obj)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_7532a0a8","line":242,"range":{"start_line":239,"start_character":4,"end_line":242,"end_character":24},"in_reply_to":"5a3905b3_a592579d","updated":"2017-01-23 16:38:05.000000000","message":"I\u0027ve explained that in previous review, PS 21 and 23 why delete objects does not fit here","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    :param dirty: the desired value for the dirty bit (defaults to True)"},{"line_number":121,"context_line":"    :returns: 1 if the quota usage data were updated, 0 otherwise."},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    query \u003d quota_obj.QuotaUsage.get_object("},{"line_number":124,"context_line":"        context, resource\u003dresource, project_id\u003dtenant_id)"},{"line_number":125,"context_line":"    if query:"},{"line_number":126,"context_line":"        query.dirty \u003d dirty"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_3248f62d","line":123,"range":{"start_line":123,"start_character":4,"end_line":123,"end_character":10},"updated":"2017-02-17 22:15:02.000000000","message":"query? it\u0027s an object, not a query.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    :param dirty: the desired value for the dirty bit (defaults to True)"},{"line_number":121,"context_line":"    :returns: 1 if the quota usage data were updated, 0 otherwise."},{"line_number":122,"context_line":"    \"\"\""},{"line_number":123,"context_line":"    query \u003d quota_obj.QuotaUsage.get_object("},{"line_number":124,"context_line":"        context, resource\u003dresource, project_id\u003dtenant_id)"},{"line_number":125,"context_line":"    if query:"},{"line_number":126,"context_line":"        query.dirty \u003d dirty"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_ebb2e005","line":123,"range":{"start_line":123,"start_character":4,"end_line":123,"end_character":10},"in_reply_to":"da36d5c6_3248f62d","updated":"2017-02-27 19:56:55.000000000","message":"Done","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    for (resource, delta) in deltas.items():"},{"line_number":176,"context_line":"        delta_objs.append(quota_obj.ResourceDelta("},{"line_number":177,"context_line":"            context, resource\u003dresource, amount\u003ddelta))"},{"line_number":178,"context_line":"    resv \u003d quota_obj.Reservation("},{"line_number":179,"context_line":"        context, project_id\u003dtenant_id, expiration\u003dexpiration,"},{"line_number":180,"context_line":"        resource_deltas\u003ddelta_objs)"},{"line_number":181,"context_line":"    resv.create()"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_12ca1250","line":178,"range":{"start_line":178,"start_character":4,"end_line":178,"end_character":8},"updated":"2017-02-17 22:15:02.000000000","message":"reserv_obj?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":190,"context_line":"def get_reservation(context, reservation_id):"},{"line_number":191,"context_line":"    resv \u003d quota_obj.Reservation.get_object("},{"line_number":192,"context_line":"        context,"},{"line_number":193,"context_line":"        id\u003dreservation_id)"},{"line_number":194,"context_line":"    if not resv:"},{"line_number":195,"context_line":"        return"},{"line_number":196,"context_line":"    return ReservationInfo(resv[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_b2e146d3","line":193,"range":{"start_line":191,"start_character":4,"end_line":193,"end_character":26},"updated":"2017-02-17 22:15:02.000000000","message":"please squash lines, it easily fits in 80 chars","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":190,"context_line":"def get_reservation(context, reservation_id):"},{"line_number":191,"context_line":"    resv \u003d quota_obj.Reservation.get_object("},{"line_number":192,"context_line":"        context,"},{"line_number":193,"context_line":"        id\u003dreservation_id)"},{"line_number":194,"context_line":"    if not resv:"},{"line_number":195,"context_line":"        return"},{"line_number":196,"context_line":"    return ReservationInfo(resv[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_8ba9647e","line":193,"range":{"start_line":191,"start_character":4,"end_line":193,"end_character":26},"in_reply_to":"da36d5c6_b2e146d3","updated":"2017-02-27 19:56:55.000000000","message":"Done","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":203,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":204,"context_line":"@db_api.context_manager.writer"},{"line_number":205,"context_line":"def remove_reservation(context, reservation_id, set_dirty\u003dFalse):"},{"line_number":206,"context_line":"    reservation \u003d quota_obj.Reservation.get_object(context, id\u003dreservation_id)"},{"line_number":207,"context_line":"    if not reservation:"},{"line_number":208,"context_line":"        # TODO(salv-orlando): Raise here and then handle the exception?"},{"line_number":209,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_922a82e6","line":206,"updated":"2017-02-17 22:15:02.000000000","message":"since you use the object only to call .delete() in line 212, could you use .delete_objects instead to avoid instantiating the object?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":203,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":204,"context_line":"@db_api.context_manager.writer"},{"line_number":205,"context_line":"def remove_reservation(context, reservation_id, set_dirty\u003dFalse):"},{"line_number":206,"context_line":"    reservation \u003d quota_obj.Reservation.get_object(context, id\u003dreservation_id)"},{"line_number":207,"context_line":"    if not reservation:"},{"line_number":208,"context_line":"        # TODO(salv-orlando): Raise here and then handle the exception?"},{"line_number":209,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_ab5e2877","line":206,"in_reply_to":"da36d5c6_922a82e6","updated":"2017-02-27 19:56:55.000000000","message":"I don\u0027t think either delete_object or delete_objects can be used here, L210 and L211 code is fetching project id and resource_deltas from object. how those calculations would be done with delete_object(s) ?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"f3635213e17810c175c2fc0494b293b933ebb36b","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":63,"context_line":"def get_quota_usage_by_resource(context, resource):"},{"line_number":64,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":65,"context_line":"    return [QuotaUsageInfo(item.resource,"},{"line_number":66,"context_line":"                           item.project_id,"},{"line_number":67,"context_line":"                           item.in_use,"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba2be162_e27491d0","line":64,"range":{"start_line":64,"start_character":4,"end_line":64,"end_character":9},"updated":"2017-03-01 17:32:42.000000000","message":"I think that Ihar commented this before but this is not a query anymore, makes more sense to rename it as objs or something else","commit_id":"e459e16fdd59b0e6a1c54ad546141ffa5b75035b"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"be71089fe9371986ef1037ce5565cd2c61f4ea62","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":63,"context_line":"def get_quota_usage_by_resource(context, resource):"},{"line_number":64,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":65,"context_line":"    return [QuotaUsageInfo(item.resource,"},{"line_number":66,"context_line":"                           item.project_id,"},{"line_number":67,"context_line":"                           item.in_use,"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba2be162_f93a8397","line":64,"range":{"start_line":64,"start_character":4,"end_line":64,"end_character":9},"in_reply_to":"ba2be162_e27491d0","updated":"2017-03-01 18:03:06.000000000","message":"omg ! the comment was on L123 which below, definitely it make sense to rename this as well","commit_id":"e459e16fdd59b0e6a1c54ad546141ffa5b75035b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"f3635213e17810c175c2fc0494b293b933ebb36b","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":72,"context_line":"def get_quota_usage_by_tenant_id(context, tenant_id):"},{"line_number":73,"context_line":"    query \u003d quota_obj.QuotaUsage.get_objects(context, project_id\u003dtenant_id)"},{"line_number":74,"context_line":"    return [QuotaUsageInfo(item.resource,"},{"line_number":75,"context_line":"                           item.project_id,"},{"line_number":76,"context_line":"                           item.in_use,"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba2be162_8244b574","line":73,"range":{"start_line":73,"start_character":4,"end_line":73,"end_character":9},"updated":"2017-03-01 17:32:42.000000000","message":"ditto: line 64","commit_id":"e459e16fdd59b0e6a1c54ad546141ffa5b75035b"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":66,"context_line":"def get_quota_usage_by_tenant_id(context, tenant_id):"},{"line_number":67,"context_line":"    objs \u003d quota_obj.QuotaUsage.get_objects(context, project_id\u003dtenant_id)"},{"line_number":68,"context_line":"    return [QuotaUsageInfo(item.resource,"},{"line_number":69,"context_line":"                           item.project_id,"},{"line_number":70,"context_line":"                           item.in_use,"},{"line_number":71,"context_line":"                           item.dirty) for item in objs]"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_26157448","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":42},"updated":"2017-03-21 20:45:11.000000000","message":"nit: could as well use tenant_id since we already have it passed.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":66,"context_line":"def get_quota_usage_by_tenant_id(context, tenant_id):"},{"line_number":67,"context_line":"    objs \u003d quota_obj.QuotaUsage.get_objects(context, project_id\u003dtenant_id)"},{"line_number":68,"context_line":"    return [QuotaUsageInfo(item.resource,"},{"line_number":69,"context_line":"                           item.project_id,"},{"line_number":70,"context_line":"                           item.in_use,"},{"line_number":71,"context_line":"                           item.dirty) for item in objs]"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_0c6c17cf","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":42},"in_reply_to":"1a1ced50_26157448","updated":"2017-03-21 23:23:31.000000000","message":"Done","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":155,"context_line":"              actually updated"},{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":"    objs \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":158,"context_line":"    for obj in objs:"},{"line_number":159,"context_line":"        obj.dirty \u003d dirty"},{"line_number":160,"context_line":"        obj.update()"},{"line_number":161,"context_line":"    return len(objs)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_71ae44e7","line":161,"range":{"start_line":158,"start_character":4,"end_line":161,"end_character":20},"updated":"2017-03-21 20:45:11.000000000","message":"nit: repeats lines 142-145, you could have an internal helper function for that.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":155,"context_line":"              actually updated"},{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":"    objs \u003d quota_obj.QuotaUsage.get_objects(context, resource\u003dresource)"},{"line_number":158,"context_line":"    for obj in objs:"},{"line_number":159,"context_line":"        obj.dirty \u003d dirty"},{"line_number":160,"context_line":"        obj.update()"},{"line_number":161,"context_line":"    return len(objs)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_a3a231ac","line":161,"range":{"start_line":158,"start_character":4,"end_line":161,"end_character":20},"in_reply_to":"1a1ced50_71ae44e7","updated":"2017-03-21 23:23:31.000000000","message":"i believe there is not much done here both methods can be squashed buy just adding logic based on filters, for api-sake, i\u0027ll prefer doing that in follow-up patch, will leave note.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    :returns: a dictionary mapping resources with corresponding deltas"},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    return quota_obj.Reservation.get_total_reservations_map("},{"line_number":226,"context_line":"        context, utcnow(), tenant_id, resources, expired)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_f10b14d4","line":226,"range":{"start_line":226,"start_character":17,"end_line":226,"end_character":27},"updated":"2017-03-21 20:45:11.000000000","message":"could hide that calculation into the method, simplifying list of params","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    :returns: a dictionary mapping resources with corresponding deltas"},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    return quota_obj.Reservation.get_total_reservations_map("},{"line_number":226,"context_line":"        context, utcnow(), tenant_id, resources, expired)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"@db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_6c1f4b08","line":226,"range":{"start_line":226,"start_character":17,"end_line":226,"end_character":27},"in_reply_to":"1a1ced50_f10b14d4","updated":"2017-03-21 23:23:31.000000000","message":"as in tests we are using api, not object methods directly, I tried hiding this inside object method just calling utcnow from datetime there directly, we have some tests which mock that return type via utcnow from neutron, I believe that could have been done because mock.path return error on mocking built in types. and we\u0027re not import obj in test_api, so redefining utcnow there wouldn\u0027t work either. I\u0027d say it can be made simple by refactoring existing api, which believe should be better if done in followup.\n\nhttps://github.com/openstack/neutron/blob/master/neutron/tests/unit/db/quota/test_api.py#L233-L236","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":229,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":230,"context_line":"@db_api.context_manager.writer"},{"line_number":231,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":232,"context_line":"    return quota_obj.Reservation.delete_expired(context, utcnow(), tenant_id)"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_5174e866","line":232,"range":{"start_line":232,"start_character":57,"end_line":232,"end_character":67},"updated":"2017-03-21 20:45:11.000000000","message":"(No action required) you could hide that calculation into delete_expired itself, simplifying the params list for the method","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":229,"context_line":"@db_api.retry_if_session_inactive()"},{"line_number":230,"context_line":"@db_api.context_manager.writer"},{"line_number":231,"context_line":"def remove_expired_reservations(context, tenant_id\u003dNone):"},{"line_number":232,"context_line":"    return quota_obj.Reservation.delete_expired(context, utcnow(), tenant_id)"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_8c180720","line":232,"range":{"start_line":232,"start_character":57,"end_line":232,"end_character":67},"in_reply_to":"1a1ced50_5174e866","updated":"2017-03-21 23:23:31.000000000","message":"same here","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"}],"neutron/db/quota/driver.py":[{"author":{"_account_id":22776,"name":"Nakul Dahiwade","email":"nakul.dahiwade@intel.com","username":"nakul.dahiwade"},"change_message_id":"467c7ba4b616673139f902906ef7ac0c29280b82","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        if not tenant_quotas:"},{"line_number":86,"context_line":"            # No record deleted means the quota was not found"},{"line_number":87,"context_line":"            raise n_exc.TenantQuotaNotFound(tenant_id\u003dtenant_id)"},{"line_number":88,"context_line":"        for tenant_quota in tenant_quotas:"},{"line_number":89,"context_line":"            tenant_quota.delete()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6eadb0_e77fcfdd","line":88,"updated":"2016-12-15 21:43:59.000000000","message":"You can use the delete_objects method here:\nhttps://review.openstack.org/#/c/403832/","commit_id":"4228583a042745a6c1539ba90dac84737e1df757"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        tenant_quotas \u003d quota_obj.Quota.delete_objects("},{"line_number":84,"context_line":"            context, project_id\u003dtenant_id)"},{"line_number":85,"context_line":"        if tenant_quotas \u003c 1:"},{"line_number":86,"context_line":"            # No record deleted means the quota was not found"},{"line_number":87,"context_line":"            raise n_exc.TenantQuotaNotFound(tenant_id\u003dtenant_id)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_badf070b","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":29},"updated":"2017-01-10 17:35:19.000000000","message":"why not \u0027if not tenant_quotas\u0027?","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        tenant_quotas \u003d quota_obj.Quota.delete_objects("},{"line_number":84,"context_line":"            context, project_id\u003dtenant_id)"},{"line_number":85,"context_line":"        if tenant_quotas \u003c 1:"},{"line_number":86,"context_line":"            # No record deleted means the quota was not found"},{"line_number":87,"context_line":"            raise n_exc.TenantQuotaNotFound(tenant_id\u003dtenant_id)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_d16c060b","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":29},"in_reply_to":"ba5201f7_badf070b","updated":"2017-01-12 21:33:15.000000000","message":"as delete return always length do you think it is still needed ? if it is 0 will it cover that one ?","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        Raise a \"not found\" error if the quota for the given tenant was"},{"line_number":81,"context_line":"        never defined."},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        tenant_quotas \u003d quota_obj.Quota.delete_objects("},{"line_number":84,"context_line":"            context, project_id\u003dtenant_id)"},{"line_number":85,"context_line":"        if tenant_quotas \u003c 1:"},{"line_number":86,"context_line":"            # No record deleted means the quota was not found"},{"line_number":87,"context_line":"            raise n_exc.TenantQuotaNotFound(tenant_id\u003dtenant_id)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_0a53ef6b","line":85,"range":{"start_line":83,"start_character":8,"end_line":85,"end_character":29},"updated":"2017-01-23 19:19:54.000000000","message":"nit: this can be made in a single step\n\n     if quota_obj.Quota.delete_objects(\n         context, project_id\u003dtenant_id) \u003c 1:","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        Raise a \"not found\" error if the quota for the given tenant was"},{"line_number":81,"context_line":"        never defined."},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        tenant_quotas \u003d quota_obj.Quota.delete_objects("},{"line_number":84,"context_line":"            context, project_id\u003dtenant_id)"},{"line_number":85,"context_line":"        if tenant_quotas \u003c 1:"},{"line_number":86,"context_line":"            # No record deleted means the quota was not found"},{"line_number":87,"context_line":"            raise n_exc.TenantQuotaNotFound(tenant_id\u003dtenant_id)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_4f2144b4","line":85,"range":{"start_line":83,"start_character":8,"end_line":85,"end_character":29},"in_reply_to":"5a3905b3_0a53ef6b","updated":"2017-01-24 23:23:24.000000000","message":"Done","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                            for key, resource in resources.items())"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        # update with tenant specific limits"},{"line_number":68,"context_line":"        q_qry \u003d quota_obj.Quota.get_objects(context, project_id\u003dtenant_id)"},{"line_number":69,"context_line":"        for item in q_qry:"},{"line_number":70,"context_line":"            tenant_quota[item[\u0027resource\u0027]] \u003d item[\u0027limit\u0027]"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_f2101eab","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":13},"updated":"2017-02-17 22:15:02.000000000","message":"it\u0027s not query, it\u0027s list of objects (\u0027objs\u0027?)","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    @staticmethod"},{"line_number":121,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":122,"context_line":"    def update_quota_limit(context, tenant_id, resource, limit):"},{"line_number":123,"context_line":"        tenant_quotas \u003d quota_obj.Quota.get_objects("},{"line_number":124,"context_line":"            context, project_id\u003dtenant_id, resource\u003dresource)"},{"line_number":125,"context_line":"        if tenant_quotas:"},{"line_number":126,"context_line":"            tenant_quotas[0].limit \u003d limit"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_327476ce","line":123,"updated":"2017-02-17 22:15:02.000000000","message":"(No action required) I understand that Quota model does not mark resource as a primary key. But isn\u0027t it really such a key in this case? And if so, should we enforce it on schema level? Then we could have Quota object specifying those two keys as primary, and then we could use get_object here and avoid messing with the list.\n\nI mull the idea at: https://review.openstack.org/435614","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    @staticmethod"},{"line_number":121,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":122,"context_line":"    def update_quota_limit(context, tenant_id, resource, limit):"},{"line_number":123,"context_line":"        tenant_quotas \u003d quota_obj.Quota.get_objects("},{"line_number":124,"context_line":"            context, project_id\u003dtenant_id, resource\u003dresource)"},{"line_number":125,"context_line":"        if tenant_quotas:"},{"line_number":126,"context_line":"            tenant_quotas[0].limit \u003d limit"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_06564b06","line":123,"in_reply_to":"da36d5c6_327476ce","updated":"2017-02-27 19:56:55.000000000","message":"I +1 to have primary key (project_id, resource),","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"}],"neutron/objects/base.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"bb55e46199af9bee76caf4a4f748ed9676e43558","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            self[attrname] \u003d None"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    @classmethod"},{"line_number":399,"context_line":"    def get_object(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":"        Fetch object from DB and convert it to a versioned object."},{"line_number":402,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_5231d8a1","line":399,"range":{"start_line":399,"start_character":33,"end_line":399,"end_character":42},"updated":"2017-01-13 12:59:40.000000000","message":"You are not passing lock_mode to db API.","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"c6896730a98ac32f297841cf288ed8b0d431ec76","unresolved":false,"context_lines":[{"line_number":396,"context_line":"            self[attrname] \u003d None"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    @classmethod"},{"line_number":399,"context_line":"    def get_object(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":400,"context_line":"        \"\"\""},{"line_number":401,"context_line":"        Fetch object from DB and convert it to a versioned object."},{"line_number":402,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_7e3a1238","line":399,"range":{"start_line":399,"start_character":33,"end_line":399,"end_character":42},"in_reply_to":"7a3c09a3_5231d8a1","updated":"2017-01-19 18:44:37.000000000","message":"done","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"}],"neutron/objects/db/api.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"bb55e46199af9bee76caf4a4f748ed9676e43558","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    if not lock_mode:"},{"line_number":34,"context_line":"        return query.first()"},{"line_number":35,"context_line":"    else:"},{"line_number":36,"context_line":"        return query.with_lockmode(lock_mode).first()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def count(context, model, **kwargs):"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_72ab348a","line":36,"updated":"2017-01-13 12:59:40.000000000","message":"Nice one. It would be nice to extract it into separate review. Also adding unit tests, if this is working for OVO and concurrent update in other place.","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"c6896730a98ac32f297841cf288ed8b0d431ec76","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    if not lock_mode:"},{"line_number":34,"context_line":"        return query.first()"},{"line_number":35,"context_line":"    else:"},{"line_number":36,"context_line":"        return query.with_lockmode(lock_mode).first()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def count(context, model, **kwargs):"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a3905b3_e2bbc270","line":36,"in_reply_to":"7a3c09a3_72ab348a","updated":"2017-01-19 18:44:37.000000000","message":"I wrote test for this and It was able to update this object, what I wrote was basically created an object, fetched it with locked_mode\u003d\u0027update\u0027 and when i changed the name field and fired object.update() It was getting updated, I believe its because that transaction ends when query is returned in _get_filter_query, so I am implementing a separate method in Quota Usage to handle this.","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        return query"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def get_object(context, model, lock_mode\u003dNone, **kwargs):"},{"line_number":32,"context_line":"    return _get_filter_query(context, model, **kwargs).first()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_be1f8059","line":31,"range":{"start_line":31,"start_character":31,"end_line":31,"end_character":45},"updated":"2017-01-23 19:19:54.000000000","message":"I didn\u0027t see any reference to lock_mode inside of _get_filter_query method","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        return query"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def get_object(context, model, lock_mode\u003dNone, **kwargs):"},{"line_number":32,"context_line":"    return _get_filter_query(context, model, **kwargs).first()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_0f165c55","line":31,"range":{"start_line":31,"start_character":31,"end_line":31,"end_character":45},"in_reply_to":"5a3905b3_be1f8059","updated":"2017-01-24 23:23:24.000000000","message":"good catch, I missed to remove it","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"}],"neutron/objects/quota.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"24d242f3ed6edd46fe2717718172e49099c773a3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":35,"context_line":"        \u0027reservation_id\u0027: obj_fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027amount\u0027: obj_fields.UUIDField(),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_c348b5ce","line":36,"range":{"start_line":36,"start_character":29,"end_line":36,"end_character":40},"updated":"2016-07-07 14:37:41.000000000","message":"it should be integer field.","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"1e45e4c3878cff541e23f2d4c1fbfc34aef9f3df","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":35,"context_line":"        \u0027reservation_id\u0027: obj_fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027amount\u0027: obj_fields.UUIDField(),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_0fd3f7d5","line":36,"range":{"start_line":36,"start_character":29,"end_line":36,"end_character":40},"in_reply_to":"1aa78d24_c348b5ce","updated":"2016-07-07 16:46:22.000000000","message":"Done","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"24d242f3ed6edd46fe2717718172e49099c773a3","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_235c197c","line":49,"range":{"start_line":49,"start_character":32,"end_line":49,"end_character":40},"updated":"2016-07-07 14:37:41.000000000","message":"This should be StringField due to non-keystone setups.","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"1e45e4c3878cff541e23f2d4c1fbfc34aef9f3df","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_b254c8c9","line":49,"range":{"start_line":49,"start_character":32,"end_line":49,"end_character":40},"in_reply_to":"1aa78d24_235c197c","updated":"2016-07-07 16:46:22.000000000","message":"I think better would be to use project id and have field translation same as in subnet. but that\u0027s using uuidfield","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"24d242f3ed6edd46fe2717718172e49099c773a3","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    fields \u003d {"},{"line_number":62,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":63,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":64,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":65,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":66,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_83050d47","line":63,"range":{"start_line":63,"start_character":32,"end_line":63,"end_character":43},"updated":"2016-07-07 14:37:41.000000000","message":"Same line 49.","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"24d242f3ed6edd46fe2717718172e49099c773a3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    fields \u003d {"},{"line_number":62,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":63,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":64,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":65,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":66,"context_line":"    }"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_4311655c","line":65,"range":{"start_line":64,"start_character":8,"end_line":65,"end_character":43},"updated":"2016-07-07 14:37:41.000000000","message":"resource and limit can be nullable from DB perspective, but we should see at integration patch, if it is needed.","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"24d242f3ed6edd46fe2717718172e49099c773a3","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    fields \u003d {"},{"line_number":79,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":80,"context_line":"        \u0027tenant_id\u0027: obj_fields.UUIDField(),"},{"line_number":81,"context_line":"        \u0027dirty\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":82,"context_line":"        \u0027in_use\u0027: obj_fields.IntegerField(default\u003d\"0\"),"},{"line_number":83,"context_line":"        \u0027reserved\u0027: obj_fields.IntegerField(default\u003d\"0\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_03663d29","line":80,"range":{"start_line":80,"start_character":32,"end_line":80,"end_character":43},"updated":"2016-07-07 14:37:41.000000000","message":"Same line 49.","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":12175,"name":"Eli Qiao","email":"qiaoliyong@gmail.com","username":"Eli"},"change_message_id":"7b83108d1889eaf14daab3055bc8fe092b967042","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027tenant_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_82ff4700","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":46},"updated":"2016-08-04 06:25:52.000000000","message":"should be project_id then add it to fields_need_translation ?","commit_id":"34ca8189320e9adc9d39fcd63c3b11f4613787f3"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"1980dc70e89877ff2958f4af33ae641874f26d65","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027tenant_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_52d07653","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":46},"in_reply_to":"bacf61ea_82ff4700","updated":"2016-08-04 09:03:17.000000000","message":"yes, it should be project_id not. No, we do need now to do the fields_need_translation, because the project_id is already merged.","commit_id":"34ca8189320e9adc9d39fcd63c3b11f4613787f3"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"357aa48a1379dfd2ccf15fd6acebe90b3412eb95","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027tenant_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a8ec9b2_6b4e7f97","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":19},"updated":"2016-09-15 12:35:35.000000000","message":"project_id","commit_id":"5fe51b15f16dc95109eef776f0055bc72cd53451"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d106c1d6c01bab692818b946e50cfe1d3a2997f8","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027tenant_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a8ec9b2_5fe404e0","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":19},"in_reply_to":"7a8ec9b2_6b4e7f97","updated":"2016-09-15 23:10:06.000000000","message":"done for all plus updated foreign keys as well.","commit_id":"5fe51b15f16dc95109eef776f0055bc72cd53451"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":35,"context_line":"        \u0027reservation_id\u0027: obj_fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027amount\u0027: obj_fields.IntegerField(),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_8f7abeef","line":36,"range":{"start_line":36,"start_character":8,"end_line":36,"end_character":16},"updated":"2016-09-16 11:11:05.000000000","message":"amount can be nullable.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"e35f2c12ad89bc2f248dd6cff2b63cd0b15ccdfa","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    fields \u003d {"},{"line_number":34,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":35,"context_line":"        \u0027reservation_id\u0027: obj_fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027amount\u0027: obj_fields.IntegerField(),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_f7ea17da","line":36,"range":{"start_line":36,"start_character":8,"end_line":36,"end_character":16},"in_reply_to":"7a8ec9b2_8f7abeef","updated":"2016-09-16 23:58:55.000000000","message":"it shouldn\u0027t be because if resource is there, it should have some amount made correction but rethink","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_0f04ee47","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":21},"updated":"2016-09-16 11:11:05.000000000","message":"Can be nullable.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"e35f2c12ad89bc2f248dd6cff2b63cd0b15ccdfa","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_37f1dfcd","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":21},"in_reply_to":"7a8ec9b2_0f04ee47","updated":"2016-09-16 23:58:55.000000000","message":"Done","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_need_translation \u003d {\u0027project_id\u0027: \u0027tenant_id\u0027}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_8f32be0e","line":52,"updated":"2016-09-16 11:11:05.000000000","message":"Reservation should have \u0027resource_deltas\u0027 as synthetic fields.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"e35f2c12ad89bc2f248dd6cff2b63cd0b15ccdfa","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    fields_need_translation \u003d {\u0027project_id\u0027: \u0027tenant_id\u0027}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_57ecabf2","line":52,"in_reply_to":"7a8ec9b2_8f32be0e","updated":"2016-09-16 23:58:55.000000000","message":"Done","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    fields \u003d {"},{"line_number":64,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":65,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":66,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":67,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":68,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_b2052112","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":20},"updated":"2016-09-16 11:11:05.000000000","message":"Can be nullable.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"e35f2c12ad89bc2f248dd6cff2b63cd0b15ccdfa","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    fields \u003d {"},{"line_number":64,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":65,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":66,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":67,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":68,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_77bd27d7","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":20},"in_reply_to":"7a8ec9b2_b2052112","updated":"2016-09-16 23:58:55.000000000","message":"Done","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    fields \u003d {"},{"line_number":64,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":65,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":66,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":67,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_922745b5","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":17},"updated":"2016-09-16 11:11:05.000000000","message":"Can be nullable.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"e35f2c12ad89bc2f248dd6cff2b63cd0b15ccdfa","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    fields \u003d {"},{"line_number":64,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":65,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":66,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":67,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_b7b32f09","line":66,"range":{"start_line":66,"start_character":9,"end_line":66,"end_character":17},"in_reply_to":"7a8ec9b2_922745b5","updated":"2016-09-16 23:58:55.000000000","message":"Done","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":65,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":66,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":67,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(),"},{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    fields_need_translation \u003d {\u0027project_id\u0027: \u0027tenant_id\u0027}"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_123c15c7","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":14},"updated":"2016-09-16 11:11:05.000000000","message":"Can be nullable.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    fields \u003d {"},{"line_number":83,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":84,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":85,"context_line":"        \u0027dirty\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":86,"context_line":"        \u0027in_use\u0027: obj_fields.IntegerField(default\u003d\"0\"),"},{"line_number":87,"context_line":"        \u0027reserved\u0027: obj_fields.IntegerField(default\u003d\"0\"),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_52b77d39","line":84,"range":{"start_line":84,"start_character":9,"end_line":84,"end_character":19},"updated":"2016-09-16 11:11:05.000000000","message":"This cannot be nullable [1]. Just FYI, not to change project_id everywhere to nullable\u003dTrue.\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/db/model_base.py#L53","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"0891ec7f863a2ce5937f707c76669dce42a21250","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":56,"context_line":"    fields_need_translation \u003d {\u0027project_id\u0027: \u0027tenant_id\u0027}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a8bc5a2_090f8888","line":56,"range":{"start_line":56,"start_character":4,"end_line":56,"end_character":57},"updated":"2016-09-26 14:12:08.000000000","message":"after changes in DB layer, we no longer needs project-id to tenant-id translation. The DB layer is accepting both, and OVO will pass the new project-id, which is desirable action.","commit_id":"e3dd32ca750617d7988a9083dbb4326b71bde61b"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"3663b47b3cb716dd6e6f2e42bc4f177e753aeb80","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":56,"context_line":"    fields_need_translation \u003d {\u0027project_id\u0027: \u0027tenant_id\u0027}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a8bc5a2_14da384c","line":56,"range":{"start_line":56,"start_character":4,"end_line":56,"end_character":57},"in_reply_to":"5a8bc5a2_090f8888","updated":"2016-09-26 16:55:19.000000000","message":"removed all.","commit_id":"e3dd32ca750617d7988a9083dbb4326b71bde61b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"cd6ede82736e0dd8880ecb2769f2a11dbe7826c1","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"        \u0027resource_deltas\u0027: obj_fields.ListOfObjectsField("},{"line_number":52,"context_line":"            ResourceDelta.__name__),"},{"line_number":53,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a8bc5a2_77cebdb5","line":50,"range":{"start_line":50,"start_character":46,"end_line":50,"end_character":66},"updated":"2016-09-28 06:07:21.000000000","message":"can be nullable.","commit_id":"2ea09c49872249a1631e19da54707bcb9459080b"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d05f39596324be5f085771e8ddf7b5bed9b933d9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    fields \u003d {"},{"line_number":48,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"        \u0027resource_deltas\u0027: obj_fields.ListOfObjectsField("},{"line_number":52,"context_line":"            ResourceDelta.__name__),"},{"line_number":53,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a98d1f4_9cc40860","line":50,"range":{"start_line":50,"start_character":46,"end_line":50,"end_character":66},"in_reply_to":"5a8bc5a2_77cebdb5","updated":"2016-09-29 19:07:21.000000000","message":"Done","commit_id":"2ea09c49872249a1631e19da54707bcb9459080b"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"cd6ede82736e0dd8880ecb2769f2a11dbe7826c1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"        \u0027resource_deltas\u0027: obj_fields.ListOfObjectsField("},{"line_number":52,"context_line":"            ResourceDelta.__name__),"},{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a8bc5a2_d7e6b143","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":35},"updated":"2016-09-28 06:07:21.000000000","message":"nullable\u003dTrue","commit_id":"2ea09c49872249a1631e19da54707bcb9459080b"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d05f39596324be5f085771e8ddf7b5bed9b933d9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":50,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse),"},{"line_number":51,"context_line":"        \u0027resource_deltas\u0027: obj_fields.ListOfObjectsField("},{"line_number":52,"context_line":"            ResourceDelta.__name__),"},{"line_number":53,"context_line":"    }"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a98d1f4_bca1c4ab","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":35},"in_reply_to":"5a8bc5a2_d7e6b143","updated":"2016-09-29 19:07:21.000000000","message":"Done","commit_id":"2ea09c49872249a1631e19da54707bcb9459080b"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a260de6eb77300d3afbda1a42047ad173d0f0e3b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 OpenStack Foundation.  All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a95cdbc_4f7aaff2","line":1,"range":{"start_line":1,"start_character":21,"end_line":1,"end_character":41},"updated":"2016-10-06 14:47:41.000000000","message":"s/OpenStack Foundation/Intel Corporation","commit_id":"4438ea8cc3f470b27be28f71957652136404dd7c"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a260de6eb77300d3afbda1a42047ad173d0f0e3b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":85,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":86,"context_line":"        \u0027dirty\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":87,"context_line":"        \u0027in_use\u0027: obj_fields.IntegerField(default\u003d\"0\"),"},{"line_number":88,"context_line":"        \u0027reserved\u0027: obj_fields.IntegerField(default\u003d\"0\"),"},{"line_number":89,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a95cdbc_efd7fbbc","line":87,"range":{"start_line":87,"start_character":50,"end_line":87,"end_character":53},"updated":"2016-10-06 14:47:41.000000000","message":"shouldn\u0027t be an integer instead of string?","commit_id":"4438ea8cc3f470b27be28f71957652136404dd7c"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a260de6eb77300d3afbda1a42047ad173d0f0e3b","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(),"},{"line_number":86,"context_line":"        \u0027dirty\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":87,"context_line":"        \u0027in_use\u0027: obj_fields.IntegerField(default\u003d\"0\"),"},{"line_number":88,"context_line":"        \u0027reserved\u0027: obj_fields.IntegerField(default\u003d\"0\"),"},{"line_number":89,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a95cdbc_6ff20b71","line":88,"range":{"start_line":88,"start_character":52,"end_line":88,"end_character":55},"updated":"2016-10-06 14:47:41.000000000","message":"ditto: line 87","commit_id":"4438ea8cc3f470b27be28f71957652136404dd7c"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"d4f598e171eea6dd489212809c9f49dc502ac23b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":35,"context_line":"        \u0027reservation_id\u0027: obj_fields.UUIDField(),"},{"line_number":36,"context_line":"        \u0027amount\u0027: obj_fields.IntegerField(nullable\u003dTrue),"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a629dbe_eebf105e","line":37,"updated":"2016-11-08 22:05:44.000000000","message":"I think you need a reservation synethetic field because of:\nhttps://github.com/openstack/neutron/blob/master/neutron/db/quota/models.py#L36","commit_id":"b9fd3229def025d894b133e229688323a1deb0b1"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"3753de8a0a05ff65d3e999fc156c717c8afa4620","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ResourceDelta.__name__, nullable\u003dTrue),"},{"line_number":54,"context_line":"    }"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a629dbe_511bcfc9","line":56,"updated":"2016-11-11 01:04:54.000000000","message":"I noticed during the integration[1] that this OVO class requires a class method for getting reservations based on resources\n\n[1] https://review.openstack.org/#/c/371212/2/neutron/db/quota/api.py@225","commit_id":"9ae544910c5fe780273135f4e2f50ab8b826e2f8"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"96a2c6999ba09ad0627292c17c9ee4231d0b712a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":74,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":75,"context_line":"        if project_id:"},{"line_number":76,"context_line":"            project_expr \u003d (models.Reservation.tenant_id \u003d\u003d project_id)"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            project_expr \u003d sql.true()"},{"line_number":79,"context_line":"        resv_query \u003d resv_query.filter(sa.and_("}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_4d3ba6d1","line":76,"range":{"start_line":76,"start_character":47,"end_line":76,"end_character":56},"updated":"2016-11-24 15:28:22.000000000","message":"It can be project_id now.","commit_id":"a66c6ab6c9515a6c8a11782ca9c5752843eed80e"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"96a2c6999ba09ad0627292c17c9ee4231d0b712a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        else:"},{"line_number":98,"context_line":"            exp_expr \u003d (models.Reservation.expiration \u003e\u003d now)"},{"line_number":99,"context_line":"        resv_query \u003d resv_query.filter(sa.and_("},{"line_number":100,"context_line":"            models.Reservation.tenant_id \u003d\u003d project_id,"},{"line_number":101,"context_line":"            models.ResourceDelta.resource.in_(resources),"},{"line_number":102,"context_line":"            exp_expr)).group_by("},{"line_number":103,"context_line":"            models.ResourceDelta.resource,"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_adb51a32","line":100,"range":{"start_line":100,"start_character":31,"end_line":100,"end_character":40},"updated":"2016-11-24 15:28:22.000000000","message":"project_id.","commit_id":"a66c6ab6c9515a6c8a11782ca9c5752843eed80e"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"96a2c6999ba09ad0627292c17c9ee4231d0b712a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            exp_expr)).group_by("},{"line_number":103,"context_line":"            models.ResourceDelta.resource,"},{"line_number":104,"context_line":"            models.Reservation.expiration)"},{"line_number":105,"context_line":"        return dict((resource, total_reserved)"},{"line_number":106,"context_line":"                    for (resource, exp, total_reserved) in resv_query)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_6d9222a1","line":106,"range":{"start_line":105,"start_character":15,"end_line":106,"end_character":70},"updated":"2016-11-24 15:28:22.000000000","message":"should we return OVO here? And convert to dict in place where it was originally created?","commit_id":"a66c6ab6c9515a6c8a11782ca9c5752843eed80e"},{"author":{"_account_id":22524,"name":"Mohit Malik","email":"mohit.malik@intel.com","username":"mmalik4"},"change_message_id":"e9963b97c8b840f5e0197eaf5861238e27d1eae4","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    fields \u003d {"},{"line_number":37,"context_line":"        \u0027resource\u0027: obj_fields.StringField(),"},{"line_number":38,"context_line":"        \u0027reservation_id\u0027: obj_fields.UUIDField(),"},{"line_number":39,"context_line":"        \u0027amount\u0027: obj_fields.IntegerField(nullable\u003dTrue),"},{"line_number":40,"context_line":"    }"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6eadb0_687ad0f2","line":38,"updated":"2016-12-21 15:20:43.000000000","message":"Change this to common_types.UUIDField ?","commit_id":"4228583a042745a6c1539ba90dac84737e1df757"},{"author":{"_account_id":22524,"name":"Mohit Malik","email":"mohit.malik@intel.com","username":"mmalik4"},"change_message_id":"e9963b97c8b840f5e0197eaf5861238e27d1eae4","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    db_model \u003d models.Reservation"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    fields \u003d {"},{"line_number":51,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":52,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":53,"context_line":"        \u0027expiration\u0027: obj_fields.DateTimeField(tzinfo_aware\u003dFalse,"},{"line_number":54,"context_line":"                                               nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6eadb0_284c58c7","line":51,"updated":"2016-12-21 15:20:43.000000000","message":"ditto","commit_id":"4228583a042745a6c1539ba90dac84737e1df757"},{"author":{"_account_id":22524,"name":"Mohit Malik","email":"mohit.malik@intel.com","username":"mmalik4"},"change_message_id":"e9963b97c8b840f5e0197eaf5861238e27d1eae4","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    db_model \u003d models.Quota"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    fields \u003d {"},{"line_number":125,"context_line":"        \u0027id\u0027: obj_fields.UUIDField(),"},{"line_number":126,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":127,"context_line":"        \u0027resource\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":128,"context_line":"        \u0027limit\u0027: obj_fields.IntegerField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6eadb0_68c81023","line":125,"updated":"2016-12-21 15:20:43.000000000","message":"ditto","commit_id":"4228583a042745a6c1539ba90dac84737e1df757"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"8bef494a53d4ced41d4e7bb8bc99fb717087e963","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            exp_expr)).group_by("},{"line_number":112,"context_line":"            models.ResourceDelta.resource,"},{"line_number":113,"context_line":"            models.Reservation.expiration)"},{"line_number":114,"context_line":"        return dict((resource, total_reserved)"},{"line_number":115,"context_line":"                    for (resource, exp, total_reserved) in resv_query)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba5201f7_d569dfbf","line":114,"updated":"2017-01-04 10:57:33.000000000","message":"I think that class methods in objects should return OVO, not dict or SQL object. In PS19 I have suggested to return OVO and convert to dict in place where the dict is required. Or another way would be to rename this method to get_total_reservations_dict for example.","commit_id":"c3408f213e5beadde5304d1ba9f947c0caa035ba"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"0639f81d760f57aed5ca7434ca6dde07999e3974","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            exp_expr)).group_by("},{"line_number":112,"context_line":"            models.ResourceDelta.resource,"},{"line_number":113,"context_line":"            models.Reservation.expiration)"},{"line_number":114,"context_line":"        return dict((resource, total_reserved)"},{"line_number":115,"context_line":"                    for (resource, exp, total_reserved) in resv_query)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba5201f7_86eabeaa","line":114,"in_reply_to":"ba5201f7_d569dfbf","updated":"2017-01-04 18:47:14.000000000","message":"I prefer renaming here, since we\u0027re already accessing it via object, we need dict at only one place it would be inefficient to convert first to object and then back to dict.","commit_id":"c3408f213e5beadde5304d1ba9f947c0caa035ba"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_ba4f0769","line":63,"updated":"2017-01-10 17:35:19.000000000","message":"I\u0027m thinking that this is not the right approach to update the deltas. You have to check, if deltas were changed, then remove old entries for reservation ID, my thinking:\n\n    synthetic_changes \u003d self._get_changed_synthetic_fields()\n    with db_api.autonested_transaction(self.obj_context.session):\n        if \u0027resource_deltas\u0027 in synthetic_changes:\n            ResourceDelta.delete_objects(reservation_id\u003dself.id)\n            for delta in synthetic_changes[\u0027resource_deltas\u0027]:\n                delta.reservation_id \u003d self.id\n                delta.create()\n        super(Reservation, self).create()","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"26a43fbae45b1bac94116cf8b8c0de5a440ef01e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_fced408f","line":63,"in_reply_to":"7a3c09a3_1d25bfc1","updated":"2017-01-13 12:46:29.000000000","message":"Good point, the foreign key constraint need to be fulfilled. \nSo it changes the ordering of the operations, first create the Reservation and then resource deltas. With addition to update the self.resource_deltas at the end.\n\nMy main complain is that, you are referencing the self.resource_deltas, and later in the loop you are appending new values. In the meanwhile, self.resource_deltas were changed by super().create(). I see that in this case, everything is working, but I\u0027ve seen some other examples that were using wrong values because of that.","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_5462c4d9","line":63,"in_reply_to":"ba5201f7_ba4f0769","updated":"2017-01-12 21:33:15.000000000","message":"Done","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"b0e9d5cc99df21a33b88c521b12ce2dab1f3031d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a3c09a3_1d25bfc1","line":63,"in_reply_to":"ba5201f7_ba4f0769","updated":"2017-01-12 23:03:08.000000000","message":"to create Resource Delta don\u0027t we first need to create reservation reservation_id ? following this is creating lot of issues, so many tests are failing","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"bb55e46199af9bee76caf4a4f748ed9676e43558","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":24,"id":"7a3c09a3_3279acfd","line":63,"updated":"2017-01-13 12:59:40.000000000","message":"I would recommend to change it like we discussed in PS23, but this construct also is working.","commit_id":"e610b5271106362675b4521ae449a9d047082fd7"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"},{"line_number":77,"context_line":"            project_expr \u003d (models.Reservation.project_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_be56a003","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":19},"updated":"2017-01-23 19:19:54.000000000","message":"this could be replaced by remove_expired method and returns the number of rows affected.","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"81af7bec9514506b2b9db52b833c0fc2607ea7ca","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"},{"line_number":77,"context_line":"            project_expr \u003d (models.Reservation.project_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a461143_a851b664","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":19},"in_reply_to":"5a3905b3_aae37632","updated":"2017-01-25 21:28:18.000000000","message":"Yeah, that\u0027s true but it\u0027s the only way that we can simplify the remove_expired_reservations method and reduce the number of calls to db, in one hand we can return the number of deleted rows in the other hand sqlalchemy will translate this as single call instead of sending several thru OVO","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"},{"line_number":77,"context_line":"            project_expr \u003d (models.Reservation.project_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_aae37632","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":19},"in_reply_to":"5a3905b3_be56a003","updated":"2017-01-24 23:23:24.000000000","message":"wouldn\u0027t that make this method little convoluted? like doing fetch and remove in in a single method ?","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"80ce927a390615456aba3b6d00d2fa9f4ddfb617","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @classmethod"},{"line_number":151,"context_line":"    def get_object_locked(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":152,"context_line":"        if not lock_mode:"},{"line_number":153,"context_line":"            return super(QuotaUsage, cls).get_object(context, **kwargs)"},{"line_number":154,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_d18a5b63","line":151,"updated":"2017-01-24 12:30:03.000000000","message":"lockmode is going to be depreciated:\nhttps://review.openstack.org/#/c/423581","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"2652024892a47fa846edb7111277dbe8a06dac5b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @classmethod"},{"line_number":151,"context_line":"    def get_object_locked(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":152,"context_line":"        if not lock_mode:"},{"line_number":153,"context_line":"            return super(QuotaUsage, cls).get_object(context, **kwargs)"},{"line_number":154,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_da334260","line":151,"in_reply_to":"5a3905b3_d18a5b63","updated":"2017-01-24 16:56:44.000000000","message":"that\u0027s what i observed during writing, when I fired a query with lock mode \u0027update\u0027 within a transaction I was able to do an update attr value of object, so what next ? should we just use get_object as it ? I did not see any test failing when i directly used get object","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_5cd45abc","line":62,"updated":"2017-02-17 22:15:02.000000000","message":"don\u0027t we need an update to complete object interface?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"7434d7e2d012ffe21dd5e1cc0d242451aaa54c1b","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_621f776c","line":62,"in_reply_to":"fa31d9ce_5cd45abc","updated":"2017-03-02 19:20:05.000000000","message":"Im not totally sure, I added a test in test_quota where I am deleting resource delta and then on update() of reservation it reflects changes, do it still need update here ? and even get_object on reservation after resource delta fields returns updated result.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_dd0ecbe4","line":63,"updated":"2017-02-17 22:15:02.000000000","message":"no tests covering the method (there should be a test validating the lifecycle of the synthetic field - create/update/get/delete/...).","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"7434d7e2d012ffe21dd5e1cc0d242451aaa54c1b","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    synthetic_fields \u003d [\u0027resource_deltas\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create(self):"},{"line_number":63,"context_line":"        deltas \u003d self.resource_deltas"},{"line_number":64,"context_line":"        with db_api.autonested_transaction(self.obj_context.session):"},{"line_number":65,"context_line":"            super(Reservation, self).create()"},{"line_number":66,"context_line":"            if deltas:"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_adb24592","line":63,"in_reply_to":"da36d5c6_dd0ecbe4","updated":"2017-03-02 19:20:05.000000000","message":"added a test","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                    self.resource_deltas.append(delta)"},{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_7d695f8b","line":73,"updated":"2017-02-17 22:15:02.000000000","message":"no tests covering the method","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                    self.resource_deltas.append(delta)"},{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_46af5a2b","line":73,"in_reply_to":"da36d5c6_7d695f8b","updated":"2017-02-28 01:23:12.000000000","message":"i think it is covered underlying method from which it is called, \n\nhttp://logs.openstack.org/25/338625/28/check/neutron-coverage-ubuntu-xenial/b204ef7/cover/neutron_objects_quota_py.html","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"},{"line_number":77,"context_line":"            project_expr \u003d (models.Reservation.project_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_fc626e15","line":74,"updated":"2017-02-17 22:15:02.000000000","message":"since the method is used in a single place, and to delete the objects, wouldn\u0027t it make more sense to instead expose delete_expired_by(...) method that would call db_api.delete_objects? It makes little sense to construct objects only to delete them right away.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.obj_reset_changes([\u0027resource_deltas\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @classmethod"},{"line_number":74,"context_line":"    def get_expired(cls, context, now, project_id):"},{"line_number":75,"context_line":"        resv_query \u003d context.session.query(models.Reservation)"},{"line_number":76,"context_line":"        if project_id:"},{"line_number":77,"context_line":"            project_expr \u003d (models.Reservation.project_id \u003d\u003d project_id)"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_719fba50","line":74,"in_reply_to":"fa31d9ce_fc626e15","updated":"2017-02-28 01:23:12.000000000","message":"I guess whole convoluted thing could be avoided if it supported \u003c \u003e relationships","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            project_expr \u003d sql.true()"},{"line_number":80,"context_line":"        resv_query \u003d resv_query.filter(sa.and_("},{"line_number":81,"context_line":"            project_expr, models.Reservation.expiration \u003c now))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        result \u003d []"},{"line_number":84,"context_line":"        for resv in resv_query:"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_ef254eae","line":81,"range":{"start_line":81,"start_character":45,"end_line":81,"end_character":61},"updated":"2017-02-17 22:15:02.000000000","message":"(No action required) if only we would support \u003c relationship for the object, we could replace that whole method with a regular obj.delete_objects(...) call. I gotta have a look at it. Could you please add a TODO here?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return result"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def get_total_reservations_dict(cls, context, now, project_id, resources,"},{"line_number":95,"context_line":"                               expired):"},{"line_number":96,"context_line":"        if not resources:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_1df943c9","line":93,"updated":"2017-02-17 22:15:02.000000000","message":"no tests covering the code","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        return result"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def get_total_reservations_dict(cls, context, now, project_id, resources,"},{"line_number":95,"context_line":"                               expired):"},{"line_number":96,"context_line":"        if not resources:"},{"line_number":97,"context_line":"            # Do not waste time"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_4c702bdd","line":94,"range":{"start_line":94,"start_character":30,"end_line":94,"end_character":35},"updated":"2017-02-17 22:15:02.000000000","message":"-\u003e _map? That seems more semantically strict - you return a map of resource type to number of reservations.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def get_total_reservations_dict(cls, context, now, project_id, resources,"},{"line_number":95,"context_line":"                               expired):"},{"line_number":96,"context_line":"        if not resources:"},{"line_number":97,"context_line":"            # Do not waste time"},{"line_number":98,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_cc8edbcf","line":95,"updated":"2017-02-17 22:15:02.000000000","message":"would you mind explaining what the method returns, and what it accepts as arguments, and its intent, in a docstring? I struggle to understand it.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @classmethod"},{"line_number":94,"context_line":"    def get_total_reservations_dict(cls, context, now, project_id, resources,"},{"line_number":95,"context_line":"                               expired):"},{"line_number":96,"context_line":"        if not resources:"},{"line_number":97,"context_line":"            # Do not waste time"},{"line_number":98,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_c09ecd62","line":95,"in_reply_to":"fa31d9ce_cc8edbcf","updated":"2017-02-28 01:23:12.000000000","message":"Done","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                               expired):"},{"line_number":96,"context_line":"        if not resources:"},{"line_number":97,"context_line":"            # Do not waste time"},{"line_number":98,"context_line":"            return"},{"line_number":99,"context_line":"        resv_query \u003d context.session.query("},{"line_number":100,"context_line":"            models.ResourceDelta.resource,"},{"line_number":101,"context_line":"            models.Reservation.expiration,"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_e74c9878","line":98,"updated":"2017-02-17 22:15:02.000000000","message":"should we return an empty dict, not None? to keep the type of the result consistent with other code branches.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                               expired):"},{"line_number":96,"context_line":"        if not resources:"},{"line_number":97,"context_line":"            # Do not waste time"},{"line_number":98,"context_line":"            return"},{"line_number":99,"context_line":"        resv_query \u003d context.session.query("},{"line_number":100,"context_line":"            models.ResourceDelta.resource,"},{"line_number":101,"context_line":"            models.Reservation.expiration,"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_2cd5e5b8","line":98,"in_reply_to":"fa31d9ce_e74c9878","updated":"2017-02-28 01:23:12.000000000","message":"I think it\u0027s been part of logic where None is expected if it returned {}, then this https://github.com/openstack/neutron/blob/master/neutron/tests/unit/db/quota/test_api.py#L263 need modification as well.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            models.ResourceDelta.resource,"},{"line_number":113,"context_line":"            models.Reservation.expiration)"},{"line_number":114,"context_line":"        return dict((resource, total_reserved)"},{"line_number":115,"context_line":"                    for (resource, exp, total_reserved) in resv_query)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@obj_base.VersionedObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_6726e817","line":115,"updated":"2017-02-17 22:15:02.000000000","message":"(No action required) I doubt there is any caller that passes more than one resource type to reserve. Why do we need that map? Can\u0027t we have a method that just receives the resource type string, and returns a single integer value?\n\nI explore that idea in I1798d14aa63e25dcf97a044c688411624867ceb9","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @classmethod"},{"line_number":151,"context_line":"    def get_object_locked(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":152,"context_line":"        if not lock_mode:"},{"line_number":153,"context_line":"            return super(QuotaUsage, cls).get_object(context, **kwargs)"},{"line_number":154,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_b203060d","line":151,"updated":"2017-02-17 22:15:02.000000000","message":"I suggest we instead expose it as a common object API: https://review.openstack.org/#/c/435598/","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @classmethod"},{"line_number":151,"context_line":"    def get_object_locked(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":152,"context_line":"        if not lock_mode:"},{"line_number":153,"context_line":"            return super(QuotaUsage, cls).get_object(context, **kwargs)"},{"line_number":154,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_861f9bb6","line":151,"in_reply_to":"da36d5c6_b203060d","updated":"2017-02-27 19:56:55.000000000","message":"can be rebased once https://review.openstack.org/#/c/435598/ pass jenkins","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    @classmethod"},{"line_number":151,"context_line":"    def get_object_locked(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":152,"context_line":"        if not lock_mode:"},{"line_number":153,"context_line":"            return super(QuotaUsage, cls).get_object(context, **kwargs)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            query \u003d context.session.query(cls.db_model)"},{"line_number":156,"context_line":"            query \u003d query.filter_by(**kwargs).with_lockmode(\u0027update\u0027).first()"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa31d9ce_4f5ada2b","line":153,"updated":"2017-02-17 22:15:02.000000000","message":"I prefer we call get_object directly from inside get_quota_usage_by_resource_and_tenant instead of relying on that wrapping.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    @classmethod"},{"line_number":151,"context_line":"    def get_object_locked(cls, context, lock_mode\u003dNone, **kwargs):"},{"line_number":152,"context_line":"        if not lock_mode:"},{"line_number":153,"context_line":"            return super(QuotaUsage, cls).get_object(context, **kwargs)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            query \u003d context.session.query(cls.db_model)"},{"line_number":156,"context_line":"            query \u003d query.filter_by(**kwargs).with_lockmode(\u0027update\u0027).first()"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_c06b2d84","line":153,"in_reply_to":"fa31d9ce_4f5ada2b","updated":"2017-02-28 01:23:12.000000000","message":"Done","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    @classmethod"},{"line_number":144,"context_line":"    def get_object_dirty_protected(cls, context, **kwargs):"},{"line_number":145,"context_line":"        query \u003d context.session.query(cls.db_model)"},{"line_number":146,"context_line":"        query \u003d query.filter_by(**kwargs)"},{"line_number":147,"context_line":"        # NOTE(manjeets) as lock mode was just for protecting dirty bits"},{"line_number":148,"context_line":"        # an update on dirty will prevent the race."},{"line_number":149,"context_line":"        query.filter_by(dirty\u003dTrue).update({\u0027dirty\u0027: True})"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_c64bc085","line":146,"range":{"start_line":146,"start_character":32,"end_line":146,"end_character":40},"updated":"2017-03-21 20:45:11.000000000","message":"nit: shouldn\u0027t we transform filter using modify_fields_to_db before passing into sqlalchemy? I know it doesn\u0027t make much difference right now, since we don\u0027t rename any attributes, but semantically kwargs should be object fields, not sqlalchemy model attributes.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    @classmethod"},{"line_number":144,"context_line":"    def get_object_dirty_protected(cls, context, **kwargs):"},{"line_number":145,"context_line":"        query \u003d context.session.query(cls.db_model)"},{"line_number":146,"context_line":"        query \u003d query.filter_by(**kwargs)"},{"line_number":147,"context_line":"        # NOTE(manjeets) as lock mode was just for protecting dirty bits"},{"line_number":148,"context_line":"        # an update on dirty will prevent the race."},{"line_number":149,"context_line":"        query.filter_by(dirty\u003dTrue).update({\u0027dirty\u0027: True})"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_e37fc914","line":146,"range":{"start_line":146,"start_character":32,"end_line":146,"end_character":40},"in_reply_to":"1a1ced50_c64bc085","updated":"2017-03-21 23:23:31.000000000","message":"Done","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"}],"neutron/tests/unit/db/quota/test_api.py":[{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def setUp(self):"},{"line_number":62,"context_line":"        super(TestQuotaDbApi, self).setUp()"},{"line_number":63,"context_line":"        self._set_context()"},{"line_number":64,"context_line":"        self.plugin \u003d test_driver. FakePlugin()"},{"line_number":65,"context_line":"        directory.add_plugin(const.CORE, self.plugin)"},{"line_number":66,"context_line":"        cfg.CONF.set_override(\"core_plugin\", DB_PLUGIN_KLASS)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_ba1aa77a","line":64,"range":{"start_line":64,"start_character":34,"end_line":64,"end_character":35},"updated":"2017-01-10 17:35:19.000000000","message":"extra space?","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def setUp(self):"},{"line_number":62,"context_line":"        super(TestQuotaDbApi, self).setUp()"},{"line_number":63,"context_line":"        self._set_context()"},{"line_number":64,"context_line":"        self.plugin \u003d test_driver. FakePlugin()"},{"line_number":65,"context_line":"        directory.add_plugin(const.CORE, self.plugin)"},{"line_number":66,"context_line":"        cfg.CONF.set_override(\"core_plugin\", DB_PLUGIN_KLASS)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_66bedd00","line":64,"range":{"start_line":64,"start_character":34,"end_line":64,"end_character":35},"in_reply_to":"ba5201f7_ba1aa77a","updated":"2017-01-12 21:33:15.000000000","message":"Done","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"ceb9a02372dce4d88d60823d4b27a190df5f4248","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                                              expiration\u003dexp_date_2,"},{"line_number":302,"context_line":"                                              tenant_id\u003d\u0027Callejon\u0027)"},{"line_number":303,"context_line":"            self.assertEqual(2, quota_api.remove_expired_reservations("},{"line_number":304,"context_line":"                context.get_admin_context()))"},{"line_number":305,"context_line":"            self.assertIsNone(quota_api.get_reservation("},{"line_number":306,"context_line":"                self.context, resv_2.reservation_id))"},{"line_number":307,"context_line":"            self.assertIsNone(quota_api.get_reservation("}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_3d0eb132","line":304,"updated":"2017-01-10 17:35:19.000000000","message":"Why we need here admin context?","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"06363b61445c500f24a297b70223e9ec9507af4d","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                                              expiration\u003dexp_date_2,"},{"line_number":302,"context_line":"                                              tenant_id\u003d\u0027Callejon\u0027)"},{"line_number":303,"context_line":"            self.assertEqual(2, quota_api.remove_expired_reservations("},{"line_number":304,"context_line":"                context.get_admin_context()))"},{"line_number":305,"context_line":"            self.assertIsNone(quota_api.get_reservation("},{"line_number":306,"context_line":"                self.context, resv_2.reservation_id))"},{"line_number":307,"context_line":"            self.assertIsNone(quota_api.get_reservation("}],"source_content_type":"text/x-python","patch_set":23,"id":"ba5201f7_46d8f97f","line":304,"in_reply_to":"ba5201f7_3d0eb132","updated":"2017-01-12 21:33:15.000000000","message":"if we use normal context then tenant_id is getting overwritten, I saw during query tenant was not actually Callejon due to check, \nhttps://github.com/openstack/neutron/blob/master/neutron/db/common_db_mixin.py#L107\n\nso I used admin_context here.","commit_id":"e7379b080602231559be0435715be7986793db98"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create_quota_usage(self, resource, used, tenant_id\u003dNone):"},{"line_number":45,"context_line":"        tenant_id \u003d tenant_id or self.tenant_id"},{"line_number":46,"context_line":"        return quota_api.set_quota_usage(context.get_admin_context(),"},{"line_number":47,"context_line":"            resource, tenant_id, in_use\u003dused)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _verify_quota_usage(self, usage_info,"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_3d9367a5","line":46,"updated":"2017-02-17 22:15:02.000000000","message":"what\u0027s behind this change? why do we need that?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create_quota_usage(self, resource, used, tenant_id\u003dNone):"},{"line_number":45,"context_line":"        tenant_id \u003d tenant_id or self.tenant_id"},{"line_number":46,"context_line":"        return quota_api.set_quota_usage(context.get_admin_context(),"},{"line_number":47,"context_line":"            resource, tenant_id, in_use\u003dused)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _verify_quota_usage(self, usage_info,"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_bd1cb778","line":46,"in_reply_to":"da36d5c6_3d9367a5","updated":"2017-02-27 19:56:55.000000000","message":"I guess tenant_id or name was getting overwritten and tests were crashing, It was a while back.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                                              expiration\u003dexp_date_2,"},{"line_number":302,"context_line":"                                              tenant_id\u003d\u0027Callejon\u0027)"},{"line_number":303,"context_line":"            self.assertEqual(2, quota_api.remove_expired_reservations("},{"line_number":304,"context_line":"                context.get_admin_context()))"},{"line_number":305,"context_line":"            self.assertIsNone(quota_api.get_reservation("},{"line_number":306,"context_line":"                self.context, resv_2.reservation_id))"},{"line_number":307,"context_line":"            self.assertIsNone(quota_api.get_reservation("}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_7d8ddf7a","line":304,"updated":"2017-02-17 22:15:02.000000000","message":"same question","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                                              expiration\u003dexp_date_2,"},{"line_number":302,"context_line":"                                              tenant_id\u003d\u0027Callejon\u0027)"},{"line_number":303,"context_line":"            self.assertEqual(2, quota_api.remove_expired_reservations("},{"line_number":304,"context_line":"                context.get_admin_context()))"},{"line_number":305,"context_line":"            self.assertIsNone(quota_api.get_reservation("},{"line_number":306,"context_line":"                self.context, resv_2.reservation_id))"},{"line_number":307,"context_line":"            self.assertIsNone(quota_api.get_reservation("}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_1d0ce341","line":304,"in_reply_to":"da36d5c6_7d8ddf7a","updated":"2017-02-27 19:56:55.000000000","message":"same answer","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"}],"neutron/tests/unit/db/quota/test_driver.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        super(TestDbQuotaDriver, self).setUp()"},{"line_number":58,"context_line":"        self.plugin \u003d FakePlugin()"},{"line_number":59,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":60,"context_line":"        self.setup_coreplugin(core_plugin\u003dDB_PLUGIN_KLASS)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_create_quota_limit(self):"},{"line_number":63,"context_line":"        defaults \u003d {RESOURCE: TestResource(RESOURCE, 4)}"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_1d72237d","line":60,"updated":"2017-02-17 22:15:02.000000000","message":"(No action required) I feel like it\u0027s time to make it the job of the base test class: https://review.openstack.org/435615","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        super(TestDbQuotaDriver, self).setUp()"},{"line_number":58,"context_line":"        self.plugin \u003d FakePlugin()"},{"line_number":59,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":60,"context_line":"        self.setup_coreplugin(core_plugin\u003dDB_PLUGIN_KLASS)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def test_create_quota_limit(self):"},{"line_number":63,"context_line":"        defaults \u003d {RESOURCE: TestResource(RESOURCE, 4)}"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_781a4d70","line":60,"in_reply_to":"da36d5c6_1d72237d","updated":"2017-02-27 19:56:55.000000000","message":"that\u0027s a better idea than doing it for each single resource.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"}],"neutron/tests/unit/objects/test_objects.py":[{"author":{"_account_id":9178,"name":"Sayali Lunkad","email":"sayali.lunkad@suse.com","username":"sayalilunkad"},"change_message_id":"1d361eca5758c8c2909a16a1c84987d7287244be","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027QosRuleType\u0027: \u00271.1-8a53fef4c6a43839d477a85b787d22ce\u0027,"},{"line_number":38,"context_line":"    \u0027QosPolicy\u0027: \u00271.1-7c5659e1c1f64395223592d3d3293e22\u0027,"},{"line_number":39,"context_line":"    \u0027Quota\u0027: \u00271.0-16bfcde44576e4af74a0109e95d0d5a3\u0027,"},{"line_number":40,"context_line":"    \u0027QuotaUsage\u0027: \u00271.0-fbebf8874f44902a0ba012d0e9dce0d2\u0027,"},{"line_number":41,"context_line":"    \u0027Reservation\u0027: \u00271.0-b3506e6b8fc126184674b4a742436dd5\u0027,"},{"line_number":42,"context_line":"    \u0027ResourceDelta\u0027: \u00271.0-d93eac012cf71da447870ceee8dc3761\u0027,"},{"line_number":43,"context_line":"    \u0027Route\u0027: \u00271.0-a9883a63b416126f9e345523ec09483b\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_40e67be8","line":40,"updated":"2016-07-07 14:21:11.000000000","message":"Need to update the version for this one to pass the tests.","commit_id":"bb22f511f2d73f06da527ff633856d5b3982bb41"},{"author":{"_account_id":15518,"name":"Artur Korzeniewski","email":"artur.korzen@wp.pl","username":"akorzeni"},"change_message_id":"6f099cb26805df61fbb5958c62fc4a33a0b2999f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \u0027QosMinimumBandwidthRule\u0027: \u00271.2-314c3419f4799067cc31cc319080adff\u0027,"},{"line_number":41,"context_line":"    \u0027QosRuleType\u0027: \u00271.2-e6fd08fcca152c339cbd5e9b94b1b8e7\u0027,"},{"line_number":42,"context_line":"    \u0027QosPolicy\u0027: \u00271.3-2eb3494f990acae59cb51381e7f99443\u0027,"},{"line_number":43,"context_line":"    \u0027Quota\u0027: \u00271.0-619fccffdfa74b2e50275579cab1b1fb\u0027,"},{"line_number":44,"context_line":"    \u0027QuotaUsage\u0027: \u00271.0-de2abb9773b56cf5e01bb02545153441\u0027,"},{"line_number":45,"context_line":"    \u0027Reservation\u0027: \u00271.0-a046980919c5d5449cee062f3eca5543\u0027,"},{"line_number":46,"context_line":"    \u0027ResourceDelta\u0027: \u00271.0-fd470e0ae96fdcfba1ca8cac920839bd\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_5274dd34","line":43,"updated":"2016-09-16 11:11:05.000000000","message":"You need to change the hash versions.","commit_id":"fcff3c2122f03da8a8a6dedcc8bde0d53aafab69"}],"neutron/tests/unit/objects/test_quota.py":[{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a260de6eb77300d3afbda1a42047ad173d0f0e3b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 OpenStack Foundation.  All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a95cdbc_2f9003ec","line":1,"range":{"start_line":1,"start_character":21,"end_line":1,"end_character":41},"updated":"2016-10-06 14:47:41.000000000","message":"s/OpenStack Foundation/Intel Corporation","commit_id":"4438ea8cc3f470b27be28f71957652136404dd7c"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a260de6eb77300d3afbda1a42047ad173d0f0e3b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            self._create_test_reservation("},{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class ReservationObjectIfaceTestCase("}],"source_content_type":"text/x-python","patch_set":12,"id":"1a95cdbc_d26904c0","line":45,"range":{"start_line":39,"start_character":4,"end_line":45,"end_character":34},"updated":"2016-10-06 14:47:41.000000000","message":"I prefer to keep all this functions in the common place in the base class[1], in that way can easily refactor in the future.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/tests/unit/objects/test_base.py#L1092-L1158","commit_id":"4438ea8cc3f470b27be28f71957652136404dd7c"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"c4c8f2c28ab5657d5db56c56163e438071a86481","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            self._create_test_reservation("},{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class ReservationObjectIfaceTestCase("}],"source_content_type":"text/x-python","patch_set":12,"id":"1a95cdbc_321303ba","line":45,"range":{"start_line":39,"start_character":4,"end_line":45,"end_character":34},"in_reply_to":"1a95cdbc_d26904c0","updated":"2016-10-06 16:31:34.000000000","message":"this is never gonna be used out side of this module ? as test_base already so lengthy, for simplicity it is better here. it make much more sense to have common operations like network, subnet, ports there because there are being used by other but not this, I\u0027ll keep it here","commit_id":"4438ea8cc3f470b27be28f71957652136404dd7c"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"1529ac4f570df1291e766e287b7c0382c781fc80","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class ResourceDeltaObjectIfaceTestCase("},{"line_number":23,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    _test_class \u003d quota.ResourceDelta"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa6399be_8f3702fe","line":23,"range":{"start_line":23,"start_character":4,"end_line":23,"end_character":43},"updated":"2016-10-14 16:45:56.000000000","message":"nit: maybe this line can fit in the previous one","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"80f886f427f09de9be4c053dbaf3e1d5b2deb07a","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class ResourceDeltaObjectIfaceTestCase("},{"line_number":23,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    _test_class \u003d quota.ResourceDelta"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa6399be_2677f8a0","line":23,"range":{"start_line":23,"start_character":4,"end_line":23,"end_character":43},"in_reply_to":"fa6399be_8f3702fe","updated":"2016-10-14 19:58:36.000000000","message":"it completes all 79 chars","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"1529ac4f570df1291e766e287b7c0382c781fc80","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class ReservationObjectIfaceTestCase("},{"line_number":49,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    _test_class \u003d quota.Reservation"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa6399be_ef287e9c","line":49,"range":{"start_line":49,"start_character":4,"end_line":49,"end_character":43},"updated":"2016-10-14 16:45:56.000000000","message":"nit: maybe this line can fit in the previous one","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"1529ac4f570df1291e766e287b7c0382c781fc80","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class QuotaObjectIfaceTestCase("},{"line_number":61,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    _test_class \u003d quota.Quota"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa6399be_8f1e226e","line":61,"range":{"start_line":61,"start_character":4,"end_line":61,"end_character":43},"updated":"2016-10-14 16:45:56.000000000","message":"nit: maybe this line can fit in the previous one","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"1529ac4f570df1291e766e287b7c0382c781fc80","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class QuotaUsageObjectIfaceTestCase("},{"line_number":73,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    _test_class \u003d quota.QuotaUsage"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa6399be_0f0bf22a","line":73,"range":{"start_line":73,"start_character":4,"end_line":73,"end_character":43},"updated":"2016-10-14 16:45:56.000000000","message":"nit: maybe this line can fit in the previous one","commit_id":"e3a204274a1bdd11527259643557ae2d96c7e644"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"a7b26cc289548ce1e75963eaa924baa29703a724","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            self._create_test_reservation("},{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class ReservationObjectIfaceTestCase("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a629dbe_8cf6e9d5","line":45,"range":{"start_line":39,"start_character":0,"end_line":45,"end_character":34},"updated":"2016-11-07 14:41:50.000000000","message":"nit: I\u0027m still believing that this should be placed in the base case for future refactoring.","commit_id":"e7b2731532f3d42ffae009c09ed6c16ad70fe520"},{"author":{"_account_id":22776,"name":"Nakul Dahiwade","email":"nakul.dahiwade@intel.com","username":"nakul.dahiwade"},"change_message_id":"467c7ba4b616673139f902906ef7ac0c29280b82","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        super(ResourceDeltaDbObjectTestCase, self).setUp()"},{"line_number":35,"context_line":"        for obj in self.obj_fields:"},{"line_number":36,"context_line":"            self._create_test_reservation("},{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6eadb0_27a2a74b","line":35,"updated":"2016-12-15 21:43:59.000000000","message":"Probably use update_obj_fields here?","commit_id":"4228583a042745a6c1539ba90dac84737e1df757"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_feb2e84a","line":44,"range":{"start_line":40,"start_character":8,"end_line":44,"end_character":34},"updated":"2017-01-23 19:19:54.000000000","message":"What about to use get_random_object_fields method here?","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_9e6b5b85","line":44,"range":{"start_line":40,"start_character":8,"end_line":44,"end_character":34},"in_reply_to":"5a3905b3_feb2e84a","updated":"2017-01-24 23:23:24.000000000","message":"that is usable when there is need for multiple object creation, which is not needed at this point, not used in creation for any of single object","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    _test_class \u003d quota.Reservation"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class QuotaObjectIfaceTestCase("},{"line_number":61,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    _test_class \u003d quota.Quota"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_bef22004","line":61,"range":{"start_line":60,"start_character":0,"end_line":61,"end_character":43},"updated":"2017-01-23 19:19:54.000000000","message":"nit: the format of this two lines can be combined in a single one","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    _test_class \u003d quota.Quota"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class QuotaUsageObjectIfaceTestCase("},{"line_number":73,"context_line":"    obj_test_base.BaseObjectIfaceTestCase):"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    _test_class \u003d quota.QuotaUsage"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_fee0282b","line":73,"range":{"start_line":72,"start_character":0,"end_line":73,"end_character":43},"updated":"2017-01-23 19:19:54.000000000","message":"ditto: line 60","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"af95f0da2e16480abad57ebe56322878e204cea6","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    _test_class \u003d quota.QuotaUsage"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_get_object_locked(self):"},{"line_number":84,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"},{"line_number":85,"context_line":"        obj.create()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        new \u003d self._test_class.get_object_locked(self.context,"},{"line_number":88,"context_line":"                                                 lock_mode\u003d\u0027update\u0027,"},{"line_number":89,"context_line":"                                                 **obj._get_composite_keys())"},{"line_number":90,"context_line":"        self.assertEqual(obj, new)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_5e505cd4","line":90,"range":{"start_line":83,"start_character":4,"end_line":90,"end_character":34},"updated":"2017-01-23 19:19:54.000000000","message":"I don\u0027t think that this is covering the lock mode portion, specially because there is no other operation doing an update in parallel.","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"a76b38c89f44fbb575edcdd63b956829e2aafa74","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    _test_class \u003d quota.QuotaUsage"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_get_object_locked(self):"},{"line_number":84,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"},{"line_number":85,"context_line":"        obj.create()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        new \u003d self._test_class.get_object_locked(self.context,"},{"line_number":88,"context_line":"                                                 lock_mode\u003d\u0027update\u0027,"},{"line_number":89,"context_line":"                                                 **obj._get_composite_keys())"},{"line_number":90,"context_line":"        self.assertEqual(obj, new)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a3905b3_aafff6a8","line":90,"range":{"start_line":83,"start_character":4,"end_line":90,"end_character":34},"in_reply_to":"5a3905b3_5e505cd4","updated":"2017-01-24 23:23:24.000000000","message":"@victor that was minimal test I could get to test if method is working or not, lock_modes are being deprecated we may get rid of this extra method","commit_id":"0ef5bef56ff8685638f0b092a12dd63cb72776be"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_3d1d2710","line":40,"range":{"start_line":40,"start_character":72,"end_line":40,"end_character":75},"updated":"2017-02-17 22:15:02.000000000","message":"why 120 exactly? any reason not to use a random value as get_object_fields() would do?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_260d0638","line":40,"range":{"start_line":40,"start_character":72,"end_line":40,"end_character":75},"in_reply_to":"da36d5c6_178757d8","updated":"2017-02-28 01:23:12.000000000","message":"actually, It is not needed to satisfy foreign constraint just a reservation with id is enough.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"d95634067f56cc4bc6f3f6cea609f13653b6430c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                res_id\u003dobj[\u0027reservation_id\u0027])"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _create_test_reservation(self, res_id):"},{"line_number":40,"context_line":"        expiration \u003d datetime.datetime.utcnow() + datetime.timedelta(0, 120)"},{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_178757d8","line":40,"range":{"start_line":40,"start_character":72,"end_line":40,"end_character":75},"in_reply_to":"da36d5c6_3d1d2710","updated":"2017-02-27 19:56:55.000000000","message":"you mean get_random_db_fields ?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"838900bb3f798e8a589361d7af8fd557ff52f9cb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_9d2b7333","line":44,"updated":"2017-02-17 22:15:02.000000000","message":"can\u0027t we use get_object_fields like we do in other places?","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"6c02922a6e0b3f98e51933419d109d66a7155d1c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._reservation \u003d quota.Reservation("},{"line_number":42,"context_line":"            self.context,"},{"line_number":43,"context_line":"            id\u003dres_id,"},{"line_number":44,"context_line":"            expiration\u003dexpiration)"},{"line_number":45,"context_line":"        self._reservation.create()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"da36d5c6_6b08a72e","line":44,"in_reply_to":"da36d5c6_9d2b7333","updated":"2017-02-28 01:23:12.000000000","message":"I think we can not because reservation_id is a foreign key and to resource_deltas and I believe that reservation_id is already coming from get_random_fields from somewhere in test_base.py.","commit_id":"b333d6fbcef05998852d17c25f42c58a68ec3a23"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        exp_date2 \u003d datetime.datetime(2015, 3, 31, 14, 30)"},{"line_number":68,"context_line":"        self._create_test_reservation(resources, exp_date2)"},{"line_number":69,"context_line":"        self.assertEqual(2, self._test_class.delete_expired(self.context,"},{"line_number":70,"context_line":"            dt, None))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_reservation_synthetic_field(self):"},{"line_number":73,"context_line":"        res \u003d self._create_test_reservation()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_f195d432","line":70,"updated":"2017-03-21 20:45:11.000000000","message":"should also check that the objects are indeed gone from the database","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        exp_date2 \u003d datetime.datetime(2015, 3, 31, 14, 30)"},{"line_number":68,"context_line":"        self._create_test_reservation(resources, exp_date2)"},{"line_number":69,"context_line":"        self.assertEqual(2, self._test_class.delete_expired(self.context,"},{"line_number":70,"context_line":"            dt, None))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_reservation_synthetic_field(self):"},{"line_number":73,"context_line":"        res \u003d self._create_test_reservation()"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_6374b935","line":70,"in_reply_to":"1a1ced50_f195d432","updated":"2017-03-21 23:23:31.000000000","message":"Done","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            resource\u003dresource, reservation_id\u003dres_id, amount\u003d\u002710\u0027)"},{"line_number":78,"context_line":"        res_delta.create()"},{"line_number":79,"context_line":"        obj \u003d self._test_class.get_object(self.context, id\u003dres.id)"},{"line_number":80,"context_line":"        self.assertEqual(res_delta, obj.resource_deltas[0])"},{"line_number":81,"context_line":"        res_delta.delete()"},{"line_number":82,"context_line":"        obj.update()"},{"line_number":83,"context_line":"        # NOTE(manjeets) update on reservation should reflect"},{"line_number":84,"context_line":"        # changes on synthetic field when it is deleted."}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_b1bfdca8","line":81,"range":{"start_line":80,"start_character":8,"end_line":81,"end_character":26},"updated":"2017-03-21 20:45:11.000000000","message":"I think what you should check here is that after obj.resource_deltas.pop() is executed and then obj.update(), consequent get_object(s) return the obj with no removed delta.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            resource\u003dresource, reservation_id\u003dres_id, amount\u003d\u002710\u0027)"},{"line_number":78,"context_line":"        res_delta.create()"},{"line_number":79,"context_line":"        obj \u003d self._test_class.get_object(self.context, id\u003dres.id)"},{"line_number":80,"context_line":"        self.assertEqual(res_delta, obj.resource_deltas[0])"},{"line_number":81,"context_line":"        res_delta.delete()"},{"line_number":82,"context_line":"        obj.update()"},{"line_number":83,"context_line":"        # NOTE(manjeets) update on reservation should reflect"},{"line_number":84,"context_line":"        # changes on synthetic field when it is deleted."}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_a3b791d6","line":81,"range":{"start_line":80,"start_character":8,"end_line":81,"end_character":26},"in_reply_to":"1a1ced50_b1bfdca8","updated":"2017-03-21 23:23:31.000000000","message":"I am not quite sure how I can make sure obj.resource_deltas.pop() is executed, but get_objects will definitely confirm that synthetic field is indeed removed.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"73c186b3e9c57dcb91a2c2d5372cfac93fc64f17","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.context,"},{"line_number":116,"context_line":"            **obj._get_composite_keys())"},{"line_number":117,"context_line":"        self.assertEqual(obj, new)"},{"line_number":118,"context_line":"        self.assertTrue(new.dirty)"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_91f02093","line":118,"updated":"2017-03-21 20:45:11.000000000","message":"to make the test complete, you should also have a usage object that is NOT dirty, and check that it\u0027s NOT returned.","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"f45ce799bedc1aab07040a58cca3a723bd0f7e16","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.context,"},{"line_number":116,"context_line":"            **obj._get_composite_keys())"},{"line_number":117,"context_line":"        self.assertEqual(obj, new)"},{"line_number":118,"context_line":"        self.assertTrue(new.dirty)"}],"source_content_type":"text/x-python","patch_set":37,"id":"1a1ced50_00ea1bac","line":118,"in_reply_to":"1a1ced50_91f02093","updated":"2017-03-21 23:23:31.000000000","message":"Done","commit_id":"ed02fbf3ebdb0d3a3573eb3b9a4ffbd218be98ac"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c9242f115e7aef15ebd5f1c68e3765422f998ce6","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            self.context,"},{"line_number":118,"context_line":"            **obj._get_composite_keys())"},{"line_number":119,"context_line":"        self.assertEqual(obj, new)"},{"line_number":120,"context_line":"        self.assertEqual(new.dirty, dirty)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def test_get_object_dirty_protected(self):"},{"line_number":123,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a1ced50_bbc78094","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":42},"updated":"2017-03-22 23:29:26.000000000","message":"shouldn\u0027t dirty the expected value?\n\n    self.assertEqual(dirty, new.dirty)","commit_id":"f38eebb99ba9c664efe0846f862dbc1b2b6ae34f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8c0f677176b9d202dd29283d8030b5fbf0ba9662","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            self.context,"},{"line_number":118,"context_line":"            **obj._get_composite_keys())"},{"line_number":119,"context_line":"        self.assertEqual(obj, new)"},{"line_number":120,"context_line":"        self.assertEqual(new.dirty, dirty)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def test_get_object_dirty_protected(self):"},{"line_number":123,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a1ced50_ffbe4363","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":42},"in_reply_to":"1a1ced50_bbc78094","updated":"2017-03-23 00:45:09.000000000","message":"Yes though is it really worth a -1?","commit_id":"f38eebb99ba9c664efe0846f862dbc1b2b6ae34f"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"c9242f115e7aef15ebd5f1c68e3765422f998ce6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def test_get_object_dirty_protected(self):"},{"line_number":123,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"},{"line_number":124,"context_line":"        obj1 \u003d self._make_object(self.obj_fields[1])"},{"line_number":125,"context_line":"        self._test_get_object_dirty_protected(obj, dirty\u003dFalse)"},{"line_number":126,"context_line":"        self._test_get_object_dirty_protected(obj1)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a1ced50_fb5498ca","line":125,"range":{"start_line":125,"start_character":51,"end_line":125,"end_character":57},"updated":"2017-03-22 23:29:26.000000000","message":"nit: given that this method only accepts two arguments, it\u0027s not needed to specify \u0027dirty\u0027 as an argument","commit_id":"f38eebb99ba9c664efe0846f862dbc1b2b6ae34f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"8c0f677176b9d202dd29283d8030b5fbf0ba9662","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def test_get_object_dirty_protected(self):"},{"line_number":123,"context_line":"        obj \u003d self._make_object(self.obj_fields[0])"},{"line_number":124,"context_line":"        obj1 \u003d self._make_object(self.obj_fields[1])"},{"line_number":125,"context_line":"        self._test_get_object_dirty_protected(obj, dirty\u003dFalse)"},{"line_number":126,"context_line":"        self._test_get_object_dirty_protected(obj1)"}],"source_content_type":"text/x-python","patch_set":39,"id":"1a1ced50_5fa11745","line":125,"range":{"start_line":125,"start_character":51,"end_line":125,"end_character":57},"in_reply_to":"1a1ced50_fb5498ca","updated":"2017-03-23 00:45:09.000000000","message":"I don\u0027t see a reason not to though.","commit_id":"f38eebb99ba9c664efe0846f862dbc1b2b6ae34f"}]}
