)]}'
{"heat/db/sqlalchemy/api.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"7274115a6aa179ec4f3625978261038df1dba7a5","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"def stack_lock_release(context, stack_id):"},{"line_number":320,"context_line":"    session \u003d get_session()"},{"line_number":321,"context_line":"    session.begin()"},{"line_number":322,"context_line":"    session.query(models.StackLock).filter_by(stack_id\u003dstack_id).delete()"},{"line_number":323,"context_line":"    session.commit()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FC9Y%3D","line":320,"updated":"2013-11-15 07:53:27.000000000","message":"why don\u0027t you use with statement? Can this code be replaced to something like \n\n    session \u003d get_session()\n    with session.begin(): \n        session.query(models.StackLock).filter_by(stack_id\u003dstack_id).delete()","commit_id":"b5a972b44a253dce9f7571231664ff1d05b6015f"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d3b4f254d16f3fa96c6acd8f2bc400dbd1343962","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"def stack_lock_release(context, stack_id):"},{"line_number":320,"context_line":"    session \u003d get_session()"},{"line_number":321,"context_line":"    session.begin()"},{"line_number":322,"context_line":"    session.query(models.StackLock).filter_by(stack_id\u003dstack_id).delete()"},{"line_number":323,"context_line":"    session.commit()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FAAo%3D","line":320,"in_reply_to":"AAAATn%2F%2FC9Y%3D","updated":"2013-11-15 22:14:22.000000000","message":"Done","commit_id":"b5a972b44a253dce9f7571231664ff1d05b6015f"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"f962726fcb8932b93690c76a852434face0c4365","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    session.flush()"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"def stack_lock_get(stack_id):"},{"line_number":338,"context_line":"    session \u003d get_session()"},{"line_number":339,"context_line":"    return session.query(models.StackLock).get(stack_id)"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B6B8%3D","line":337,"updated":"2013-11-18 18:08:13.000000000","message":"This function probably should not exist.","commit_id":"f982d8bb8635bd937785e324497fe3ae2ce21619"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"ef07486bf497f97203746c66c9f8130948bbc8aa","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    session.flush()"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"def stack_lock_get(stack_id):"},{"line_number":338,"context_line":"    session \u003d get_session()"},{"line_number":339,"context_line":"    return session.query(models.StackLock).get(stack_id)"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B0GY%3D","line":337,"in_reply_to":"AAAATn%2F%2B2W8%3D","updated":"2013-11-19 19:36:49.000000000","message":"Thanks for the example Zane.  I actually woke up this morning thinking about how inappropriate it was to handle DBDuplicateEntry in stack_lock.py :)","commit_id":"f982d8bb8635bd937785e324497fe3ae2ce21619"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"c16f0a138a309f585846c5a049d3bb2c181a6dfe","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    session.flush()"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"def stack_lock_get(stack_id):"},{"line_number":338,"context_line":"    session \u003d get_session()"},{"line_number":339,"context_line":"    return session.query(models.StackLock).get(stack_id)"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B2W8%3D","line":337,"in_reply_to":"AAAATn%2F%2B5Dg%3D","updated":"2013-11-19 11:53:31.000000000","message":"By encapsulating all of the DB-related logic in this module, e.g. something like this:\n\n    def stack_lock_create(stack_id, engine_id):\n        session \u003d get_session()\n        try:\n            with session.begin():\n                session.add(models.StackLock(stack_id\u003dstack_id,\n                            engine_id\u003dengine_id))\n        except db_exception.DBDuplicateEntry:\n            pass\n\n        lock \u003d session.query(models.StackLock).get(stack_id)\n        return lock and lock.engine_id\n\n(Ideally we would actually want to do the attempted add and reading the actual value in the same transaction... I haven\u0027t changed the control flow because I\u0027m not sure how the exception handling works.)","commit_id":"f982d8bb8635bd937785e324497fe3ae2ce21619"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"1132d742624472fcef07c97b1151a7fdb56b0366","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    session.flush()"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"def stack_lock_get(stack_id):"},{"line_number":338,"context_line":"    session \u003d get_session()"},{"line_number":339,"context_line":"    return session.query(models.StackLock).get(stack_id)"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2B5Dg%3D","line":337,"in_reply_to":"AAAATn%2F%2B6B8%3D","updated":"2013-11-18 22:08:30.000000000","message":"Please see the latest patch.\n\nIn case the create fails, I need a way to get the ID of the engine that has the lock to see if that engine is still alive.  Not sure how I could do that without this function.","commit_id":"f982d8bb8635bd937785e324497fe3ae2ce21619"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"06e226c6b09eece632f42a1a7a449c072a354913","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    session \u003d get_session()"},{"line_number":380,"context_line":"    with session.begin():"},{"line_number":381,"context_line":"        return session.query(models.StackLock).\\"},{"line_number":382,"context_line":"            filter_by(stack_id\u003dstack_id).\\"},{"line_number":383,"context_line":"            delete()"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B2T8%3D","line":382,"updated":"2013-11-19 11:55:34.000000000","message":"This probably also needs to filter by engine_id the same way that stack_lock_steal() now does.","commit_id":"93212cc9810bc90ee4e26a20189dff752db93369"},{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"bb8b7bbce6b3c38a5f6f5638cac72b856071a9f7","unresolved":false,"context_lines":[{"line_number":379,"context_line":"    session \u003d get_session()"},{"line_number":380,"context_line":"    with session.begin():"},{"line_number":381,"context_line":"        return session.query(models.StackLock).\\"},{"line_number":382,"context_line":"            filter_by(stack_id\u003dstack_id).\\"},{"line_number":383,"context_line":"            delete()"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B1Ec%3D","line":382,"in_reply_to":"AAAATn%2F%2B2T8%3D","updated":"2013-11-19 16:27:04.000000000","message":"I agree with Zane, another engine should not be able to have the lock before it is released but I can imagine some usecases where filtering on expected engine id as well would be safer.","commit_id":"93212cc9810bc90ee4e26a20189dff752db93369"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"fb7e66d17010904d5c9c85c745633890541522dc","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return \"existing\", lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return \"new\", engine_id"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"def stack_lock_steal(stack_id, old_engine_id, new_engine_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bz1M%3D","line":370,"updated":"2013-11-19 21:11:35.000000000","message":"I\u0027d be prepared to overlook returning the tuple, but returning a string literal that is not defined anywhere is a bit on the nose.\n\nThis doesn\u0027t seem necessary at all to me, though. You could just return lock.engine_id and do:\n\n    lock_owner \u003d stack_lock_create(stack_id, engine_id)\n    if lock_owner \u003d\u003d engine_id:\n        # Got it\n    else:\n        # Steal it?","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"ba26d860c548b07331ce0569d30ca9a857a0b973","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return \"existing\", lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return \"new\", engine_id"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"def stack_lock_steal(stack_id, old_engine_id, new_engine_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bzns%3D","line":370,"in_reply_to":"AAAATn%2F%2Bz1M%3D","updated":"2013-11-19 22:16:48.000000000","message":"I will post an update to the stack_lock review that should make this clearer.  Basically, an active \"lock\" on the current engine is respected because, if it weren\u0027t, we\u0027d have inconsistent behavior depending on which engine got the request.  For example, with your code above, stack-delete would work if the engine who received the request had the lock, and it wouldn\u0027t work if an engine who didn\u0027t have the lock received the request.  The way I implemented it, actions are not allowed if there\u0027s an active lock, period.  I realize we\u0027ll eventually want to figure out how to interrupt an action to allow deletes.\n\nThat being said, if this approach makes sense to you, please let me know if there\u0027s a better way of doing this (other than using arbitrary \"existing\" and \"new\" strings).","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"9faf9d9f915644cd377aba33550c2559a5ca83b1","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return \"existing\", lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return \"new\", engine_id"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"def stack_lock_steal(stack_id, old_engine_id, new_engine_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bzjo%3D","line":370,"in_reply_to":"AAAATn%2F%2Bzns%3D","updated":"2013-11-19 22:34:13.000000000","message":"Hmm, OK that makes sense.\n\nOne option is to define constants that you export:\n\n    (LOCK_CREATED, LOCK_FAILED) \u003d (\u0027new\u0027, \u0027existing\u0027)\n\n    ...\n\n            return LOCK_FAILED, lock.engine_id\n\nbut tbh even returning True/False would be better than comparing string literals imho.","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"1c895533f4e55b13b5cf391fb19b9398e8dcc0c5","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                models.StackLock(stack_id\u003dstack_id, engine_id\u003dengine_id))"},{"line_number":366,"context_line":"    except db_exception.DBDuplicateEntry:"},{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return \"existing\", lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return \"new\", engine_id"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BxB8%3D","line":368,"updated":"2013-11-20 14:08:33.000000000","message":"Returning a tuple here looks odd, surely you either get the lock (return True or the lock ID) or you don\u0027t (return False or None)\n\nIs the assumption here that one engine can do concurrent operations on the same stack, therefore getting (\"existing\", id) is OK, ie the lock is per engine, not per stack?\n\nIf so that is not what I was hoping, I was expecting this locking method to provide a method to prevent concurent actions on a stack regardless of which engine the action is processed on, ref:\n\nhttps://bugs.launchpad.net/heat/+bug/1239061 (see Clints comment, #3)\n\nand \n\nhttps://bugs.launchpad.net/heat/+bug/1232195","commit_id":"ca28b969855e5af27ff5fab987d0b59a33f2b354"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"565d5b6f7d49aa22fce403c0bbb29f9aba0282f6","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                models.StackLock(stack_id\u003dstack_id, engine_id\u003dengine_id))"},{"line_number":366,"context_line":"    except db_exception.DBDuplicateEntry:"},{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return \"existing\", lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return \"new\", engine_id"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Bw2I%3D","line":368,"in_reply_to":"AAAATn%2F%2BxB8%3D","updated":"2013-11-20 14:55:00.000000000","message":"No, that will not be allowed.  See my reply to Zane on line 370:\nhttps://review.openstack.org/#/c/56476/4/heat/db/sqlalchemy/api.py\n\nThe reason it\u0027s necessary to know the engine ID of an existing lock is because we have to do an RPC call on that topic (topics are named according to engine IDs) to see if the lock is still active.  See line 55 of:\nhttps://review.openstack.org/#/c/56477/5/heat/engine/stack_lock.py\n\nWould you be okay with returning (True, engine_id) if it\u0027s a new lock and (False, engine_id) if it\u0027s an existing lock as Zane suggested?","commit_id":"ca28b969855e5af27ff5fab987d0b59a33f2b354"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"3664b7b67ea3cf8b553cd0d271589c9eb0137a29","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                models.StackLock(stack_id\u003dstack_id, engine_id\u003dengine_id))"},{"line_number":366,"context_line":"    except db_exception.DBDuplicateEntry:"},{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return False, lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return True, engine_id"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BrRg%3D","line":368,"updated":"2013-11-21 17:25:41.000000000","message":"Even simpler, couldn\u0027t you just return lock.engine_id if there is an existing lock, and None otherwise?","commit_id":"c7236bbd17ad78064a59174bb1fa3a8f28f30cac"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"7ec04fb3f2ce1c21984dafd56b9210a64f8f92e7","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                models.StackLock(stack_id\u003dstack_id, engine_id\u003dengine_id))"},{"line_number":366,"context_line":"    except db_exception.DBDuplicateEntry:"},{"line_number":367,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":368,"context_line":"        return False, lock.engine_id"},{"line_number":369,"context_line":"    else:"},{"line_number":370,"context_line":"        return True, engine_id"},{"line_number":371,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BrDY%3D","line":368,"in_reply_to":"AAAATn%2F%2BrRg%3D","updated":"2013-11-21 18:29:48.000000000","message":"Great idea.  Will do that.","commit_id":"c7236bbd17ad78064a59174bb1fa3a8f28f30cac"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"cb961834a9098a82ca00ba014721b8c951572cd8","unresolved":false,"context_lines":[{"line_number":369,"context_line":"            session.add("},{"line_number":370,"context_line":"                models.StackLock(stack_id\u003dstack_id, engine_id\u003dengine_id))"},{"line_number":371,"context_line":"    except db_exception.DBDuplicateEntry:"},{"line_number":372,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":373,"context_line":"        return lock.engine_id"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BOxk%3D","line":372,"updated":"2013-11-28 15:42:19.000000000","message":"Just to give a heads up, as Zane pointed out before this query can possibly return None if the lock is removed by anther engine in between the add and query. So the following line would try to dereference None. We would probably want to put the add and query in the same transaction.","commit_id":"f4ff1c5b394232a783e053a98f57043f31aff794"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d6218842f80ae121272f65837382fef7b9ff2648","unresolved":false,"context_lines":[{"line_number":369,"context_line":"            session.add("},{"line_number":370,"context_line":"                models.StackLock(stack_id\u003dstack_id, engine_id\u003dengine_id))"},{"line_number":371,"context_line":"    except db_exception.DBDuplicateEntry:"},{"line_number":372,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":373,"context_line":"        return lock.engine_id"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BEsQ%3D","line":372,"in_reply_to":"AAAATn%2F%2BOxk%3D","updated":"2013-12-02 22:09:01.000000000","message":"Done","commit_id":"f4ff1c5b394232a783e053a98f57043f31aff794"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"5f6041e20f5e347efce661c23ff30c3e301b5620","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            filter_by(stack_id\u003dstack_id, engine_id\u003dold_engine_id).\\"},{"line_number":381,"context_line":"            update({\"engine_id\": new_engine_id})"},{"line_number":382,"context_line":"    if rows_affected \u003d\u003d 1:"},{"line_number":383,"context_line":"        return True"},{"line_number":384,"context_line":"    else:"},{"line_number":385,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":386,"context_line":"        if lock is not None:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BPWU%3D","line":383,"updated":"2013-11-28 13:13:28.000000000","message":"Traditionally you return None (or at least a false-y value) when there\u0027s no error, as stack_lock_create() does. In the interests of consistency I think it\u0027s probably worth sticking to that convention:\n\n  if not rows_affected:\n      lock \u003d session.query(models.StackLock).get(stack_id)\n      return lock.engine_id if lock is not None else True","commit_id":"f4ff1c5b394232a783e053a98f57043f31aff794"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d6218842f80ae121272f65837382fef7b9ff2648","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            filter_by(stack_id\u003dstack_id, engine_id\u003dold_engine_id).\\"},{"line_number":381,"context_line":"            update({\"engine_id\": new_engine_id})"},{"line_number":382,"context_line":"    if rows_affected \u003d\u003d 1:"},{"line_number":383,"context_line":"        return True"},{"line_number":384,"context_line":"    else:"},{"line_number":385,"context_line":"        lock \u003d session.query(models.StackLock).get(stack_id)"},{"line_number":386,"context_line":"        if lock is not None:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BEOg%3D","line":383,"in_reply_to":"AAAATn%2F%2BPWU%3D","updated":"2013-12-02 22:09:01.000000000","message":"Done","commit_id":"f4ff1c5b394232a783e053a98f57043f31aff794"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"5f6041e20f5e347efce661c23ff30c3e301b5620","unresolved":false,"context_lines":[{"line_number":390,"context_line":"def stack_lock_release(stack_id, engine_id):"},{"line_number":391,"context_line":"    session \u003d get_session()"},{"line_number":392,"context_line":"    with session.begin():"},{"line_number":393,"context_line":"        return session.query(models.StackLock).\\"},{"line_number":394,"context_line":"            filter_by(stack_id\u003dstack_id, engine_id\u003dengine_id).\\"},{"line_number":395,"context_line":"            delete()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BPTo%3D","line":393,"updated":"2013-11-28 13:13:28.000000000","message":"Again, for consistency I think we should be checking the return value in here rather than expecting the caller to interpret the return code from the database.","commit_id":"f4ff1c5b394232a783e053a98f57043f31aff794"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d6218842f80ae121272f65837382fef7b9ff2648","unresolved":false,"context_lines":[{"line_number":390,"context_line":"def stack_lock_release(stack_id, engine_id):"},{"line_number":391,"context_line":"    session \u003d get_session()"},{"line_number":392,"context_line":"    with session.begin():"},{"line_number":393,"context_line":"        return session.query(models.StackLock).\\"},{"line_number":394,"context_line":"            filter_by(stack_id\u003dstack_id, engine_id\u003dengine_id).\\"},{"line_number":395,"context_line":"            delete()"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BEOc%3D","line":393,"in_reply_to":"AAAATn%2F%2BPTo%3D","updated":"2013-12-02 22:09:01.000000000","message":"Done","commit_id":"f4ff1c5b394232a783e053a98f57043f31aff794"}],"heat/db/sqlalchemy/migrate_repo/versions/029_stack_lock.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5d78f08f8e50220ca0fc60677a335c4cecc123b5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                          nullable\u003dFalse),"},{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36)),"},{"line_number":30,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":32,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BjgM%3D","line":29,"updated":"2013-11-23 20:39:59.000000000","message":"This column needs index\u003dtrue, since engine_id is used for filtering.","commit_id":"f02ff6c9e2835bf00b36616cd9e354ffeb0217cc"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"2fd1d1e21b63e2af20f62f928db6812e56711202","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                          nullable\u003dFalse),"},{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36)),"},{"line_number":30,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":32,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Be7k%3D","line":29,"in_reply_to":"AAAATn%2F%2BjgM%3D","updated":"2013-11-25 16:12:16.000000000","message":"Done","commit_id":"f02ff6c9e2835bf00b36616cd9e354ffeb0217cc"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"17658e2f976d5a43eabe441dcf447daa60b37e9a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                          nullable\u003dFalse),"},{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36)),"},{"line_number":30,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":32,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BhKE%3D","line":29,"in_reply_to":"AAAATn%2F%2BjgM%3D","updated":"2013-11-25 08:33:00.000000000","message":"It\u0027s better to add this index obviously, because if we use index\u003dTrue, database will generate this index and we will have random index names on different backends","commit_id":"f02ff6c9e2835bf00b36616cd9e354ffeb0217cc"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"fcb99ca4062ddac4fbe14b3c6d19af7c55956de7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36),"},{"line_number":30,"context_line":"                          index\u003dTrue),"},{"line_number":31,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":32,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BenM%3D","line":30,"updated":"2013-11-25 16:56:44.000000000","message":"Please add this index as Index() instead of index\u003dTrue","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"83e2d14e8ff6144085dc1a0735c38d4a75baec8f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36),"},{"line_number":30,"context_line":"                          index\u003dTrue),"},{"line_number":31,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":32,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2Bd2o%3D","line":30,"in_reply_to":"AAAATn%2F%2Bd%2FU%3D","updated":"2013-11-25 19:52:30.000000000","message":"Makes sense.  I\u0027ll go ahead and add it.  Thanks.","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"89332f07db851a78e3f02e39191b8666ce634dc7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36),"},{"line_number":30,"context_line":"                          index\u003dTrue),"},{"line_number":31,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":32,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2Bd%2FU%3D","line":30,"in_reply_to":"AAAATn%2F%2BeVk%3D","updated":"2013-11-25 18:44:48.000000000","message":"It\u0027s a giant PITA in the event that you ever want to modify/delete the index in a future migration - you have to go trawling through the list of indices trying to one that\u0027s a plausible match. If you give it a name at the start, you can just grab it.","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"dc379532ce758c937a82fc55de6613fc92b9fb7f","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sqlalchemy.Column(\u0027created_at\u0027, sqlalchemy.DateTime),"},{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36),"},{"line_number":30,"context_line":"                          index\u003dTrue),"},{"line_number":31,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":32,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":33,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BeVk%3D","line":30,"in_reply_to":"AAAATn%2F%2BenM%3D","updated":"2013-11-25 17:47:00.000000000","message":"Hi Victor,\n\nIs this related to your comment about having \"random index names on different backends\" in patchset 10?  If so, why is that a bad thing?","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"dd7ae9870397017400189bd5b274acc119968572","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":32,"context_line":"    )"},{"line_number":33,"context_line":"    sqlalchemy.Table(\u0027stack\u0027, meta, autoload\u003dTrue)"},{"line_number":34,"context_line":"    sqlalchemy.Index(\u0027idx_stack_lock_engine_id\u0027, stack_lock.c.engine_id)"},{"line_number":35,"context_line":"    stack_lock.create()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BdCo%3D","line":34,"updated":"2013-11-25 21:41:30.000000000","message":"This index is not needed. The API calls all use stack ID, which is the primary key and thus the best way to query anyway.","commit_id":"3b854174539f539b93c3e8d0527193dfe4454a6a"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"7db7102b38685007e265118d4e3c92d7a8227e03","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":32,"context_line":"    )"},{"line_number":33,"context_line":"    sqlalchemy.Table(\u0027stack\u0027, meta, autoload\u003dTrue)"},{"line_number":34,"context_line":"    sqlalchemy.Index(\u0027idx_stack_lock_engine_id\u0027, stack_lock.c.engine_id)"},{"line_number":35,"context_line":"    stack_lock.create()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F%2BZHg%3D","line":34,"in_reply_to":"AAAATn%2F%2BdCo%3D","updated":"2013-11-26 15:44:17.000000000","message":"I agree.  There will be only one stack ID and it\u0027s already indexed.  The reason the engine ID is in the where clause is to make sure a race condition didn\u0027t occur.  I will remove the index.","commit_id":"3b854174539f539b93c3e8d0527193dfe4454a6a"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"b859714bde44145a33fc533164c06c460b0add89","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sqlalchemy.Column(\u0027updated_at\u0027, sqlalchemy.DateTime),"},{"line_number":29,"context_line":"        sqlalchemy.Column(\u0027engine_id\u0027, sqlalchemy.String(length\u003d36)),"},{"line_number":30,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":32,"context_line":"    )"},{"line_number":33,"context_line":"    sqlalchemy.Table(\u0027stack\u0027, meta, autoload\u003dTrue)"},{"line_number":34,"context_line":"    stack_lock.create()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9yaw%3D","line":31,"updated":"2013-12-05 22:10:58.000000000","message":"funny thing, utf8 would actually be better as the index would be 36*3 bytes smaller, and since we\u0027re talking about UUIDs it is entirely appropriate... but I digress.. it will be confusing unless we also do it on all the other UUID\u0027s in OpenStack.","commit_id":"50b45d96e12d96b26aef352b54e2a11afb349eba"}],"heat/db/sqlalchemy/models.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"7274115a6aa179ec4f3625978261038df1dba7a5","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    __tablename__ \u003d \u0027stack_lock\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String,"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":154,"context_line":"    engine_id \u003d sqlalchemy.Column(sqlalchemy.String)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FC9A%3D","line":151,"updated":"2013-11-15 07:53:27.000000000","message":"can you please add the length  here?","commit_id":"b5a972b44a253dce9f7571231664ff1d05b6015f"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d3b4f254d16f3fa96c6acd8f2bc400dbd1343962","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    __tablename__ \u003d \u0027stack_lock\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String,"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":154,"context_line":"    engine_id \u003d sqlalchemy.Column(sqlalchemy.String)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FAAk%3D","line":151,"in_reply_to":"AAAATn%2F%2FC9A%3D","updated":"2013-11-15 22:14:22.000000000","message":"Done","commit_id":"b5a972b44a253dce9f7571231664ff1d05b6015f"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"7274115a6aa179ec4f3625978261038df1dba7a5","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String,"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":154,"context_line":"    engine_id \u003d sqlalchemy.Column(sqlalchemy.String)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class UserCreds(BASE, HeatBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FC9E%3D","line":154,"updated":"2013-11-15 07:53:27.000000000","message":"ditto","commit_id":"b5a972b44a253dce9f7571231664ff1d05b6015f"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d3b4f254d16f3fa96c6acd8f2bc400dbd1343962","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String,"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":154,"context_line":"    engine_id \u003d sqlalchemy.Column(sqlalchemy.String)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"class UserCreds(BASE, HeatBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FAAg%3D","line":154,"in_reply_to":"AAAATn%2F%2FC9E%3D","updated":"2013-11-15 22:14:22.000000000","message":"Done","commit_id":"b5a972b44a253dce9f7571231664ff1d05b6015f"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"fcb99ca4062ddac4fbe14b3c6d19af7c55956de7","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    \"\"\"Store stack locks for deployments with multiple-engines.\"\"\""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    __tablename__ \u003d \u0027stack_lock\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String(36),"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2Bem8%3D","line":150,"updated":"2013-11-25 16:56:44.000000000","message":"you also should add index to model description","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"261483184d674b43da044585b76fedc83cf79d0d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    \"\"\"Store stack locks for deployments with multiple-engines.\"\"\""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    __tablename__ \u003d \u0027stack_lock\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String(36),"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2Bau0%3D","line":150,"in_reply_to":"AAAATn%2F%2BdoE%3D","updated":"2013-11-26 10:31:42.000000000","message":"You can see, for example, how Nova folks do it - \nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/models.py#L152\n\n(sure, it is still actual)","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"83e2d14e8ff6144085dc1a0735c38d4a75baec8f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    \"\"\"Store stack locks for deployments with multiple-engines.\"\"\""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    __tablename__ \u003d \u0027stack_lock\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    stack_id \u003d sqlalchemy.Column(sqlalchemy.String(36),"},{"line_number":152,"context_line":"                                 sqlalchemy.ForeignKey(\u0027stack.id\u0027),"},{"line_number":153,"context_line":"                                 primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BdoE%3D","line":150,"in_reply_to":"AAAATn%2F%2Bem8%3D","updated":"2013-11-25 19:52:30.000000000","message":"Can you show me how?  I can\u0027t find anything in the sqlalchemy docs about referring to the index in the classical mapping.  Seems like the database would just use the index (created by the migration script) if it were there.","commit_id":"e5eecf899c4e06d548047d8e6d2413852c319179"}],"heat/tests/test_sqlalchemy_api.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"fb7e66d17010904d5c9c85c745633890541522dc","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def test_stack_lock_create_fail(self):"},{"line_number":880,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":881,"context_line":"        lock_type, lock_engine_id \u003d create_stack_lock(self.stack.id, UUID1)"},{"line_number":882,"context_line":"        self.assertEqual(lock_type, \"existing\")"},{"line_number":883,"context_line":"        self.assertEqual(lock_engine_id, UUID1)"},{"line_number":884,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bz0E%3D","line":881,"updated":"2013-11-19 21:11:35.000000000","message":"Is this supposed to be UUID2?","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"ba26d860c548b07331ce0569d30ca9a857a0b973","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def test_stack_lock_create_fail(self):"},{"line_number":880,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":881,"context_line":"        lock_type, lock_engine_id \u003d create_stack_lock(self.stack.id, UUID1)"},{"line_number":882,"context_line":"        self.assertEqual(lock_type, \"existing\")"},{"line_number":883,"context_line":"        self.assertEqual(lock_engine_id, UUID1)"},{"line_number":884,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BzqE%3D","line":881,"in_reply_to":"AAAATn%2F%2Bz0E%3D","updated":"2013-11-19 22:16:48.000000000","message":"I added a test for that.  The current test is also valid (see comment in api.py).","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"fb7e66d17010904d5c9c85c745633890541522dc","unresolved":false,"context_lines":[{"line_number":900,"context_line":"    def test_stack_lock_release_fail(self):"},{"line_number":901,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":902,"context_line":"        db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":903,"context_line":"        rows \u003d db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":904,"context_line":"        self.assertEqual(rows, 0)"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bzzc%3D","line":903,"updated":"2013-11-19 21:11:35.000000000","message":"Would be good to also add another test that does:\n\n  create_stack_lock(self.stack.id, UUID1)\n  db_api.stack_lock_release(self.stack.id, UUID2)\n\nand make sure the lock is not deleted.","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"ba26d860c548b07331ce0569d30ca9a857a0b973","unresolved":false,"context_lines":[{"line_number":900,"context_line":"    def test_stack_lock_release_fail(self):"},{"line_number":901,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":902,"context_line":"        db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":903,"context_line":"        rows \u003d db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":904,"context_line":"        self.assertEqual(rows, 0)"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bzsk%3D","line":903,"in_reply_to":"AAAATn%2F%2Bzzc%3D","updated":"2013-11-19 22:16:48.000000000","message":"Done","commit_id":"3d7ca6cf97490ff9096de70d7989da284670256a"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"8d637bc7f9e6572387ea2fe9180c5ff4d3eb45fa","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def test_stack_lock_steal_success(self):"},{"line_number":887,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":888,"context_line":"        rows \u003d db_api.stack_lock_steal(self.stack.id, UUID1, UUID2)"},{"line_number":889,"context_line":"        self.assertEqual(rows, 1)"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def test_stack_lock_steal_fail(self):"},{"line_number":892,"context_line":"        create_stack_lock(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Bq1c%3D","line":889,"updated":"2013-11-21 19:30:35.000000000","message":"assertEqual correct usage is assertEqual(expected, observed).  change the order here.","commit_id":"3ba697e4b6d2d44126c2bf4c6f1812410ed23280"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"80efa78cedb358a8b4d0c9fb12b63cf42972df28","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def test_stack_lock_steal_success(self):"},{"line_number":887,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":888,"context_line":"        rows \u003d db_api.stack_lock_steal(self.stack.id, UUID1, UUID2)"},{"line_number":889,"context_line":"        self.assertEqual(rows, 1)"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def test_stack_lock_steal_fail(self):"},{"line_number":892,"context_line":"        create_stack_lock(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Bmkc%3D","line":889,"in_reply_to":"AAAATn%2F%2BpQw%3D","updated":"2013-11-22 15:59:46.000000000","message":"Vijendar explained that the unittest output will actually show the wrong expected/observed order in the test failure output if the order is reversed.  I will change the order.  Thanks!","commit_id":"3ba697e4b6d2d44126c2bf4c6f1812410ed23280"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"42ae00ff274f426148fd477618fb2696eec2ad9f","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def test_stack_lock_steal_success(self):"},{"line_number":887,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":888,"context_line":"        rows \u003d db_api.stack_lock_steal(self.stack.id, UUID1, UUID2)"},{"line_number":889,"context_line":"        self.assertEqual(rows, 1)"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def test_stack_lock_steal_fail(self):"},{"line_number":892,"context_line":"        create_stack_lock(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Bqkk%3D","line":889,"in_reply_to":"AAAATn%2F%2Bq1c%3D","updated":"2013-11-21 20:27:36.000000000","message":"As  we discussed, there is no consistency in the order of the arguments in Heat.","commit_id":"3ba697e4b6d2d44126c2bf4c6f1812410ed23280"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"90737f0b591f715db5d0b959f15c17fbc2ae3f27","unresolved":false,"context_lines":[{"line_number":886,"context_line":"    def test_stack_lock_steal_success(self):"},{"line_number":887,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":888,"context_line":"        rows \u003d db_api.stack_lock_steal(self.stack.id, UUID1, UUID2)"},{"line_number":889,"context_line":"        self.assertEqual(rows, 1)"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def test_stack_lock_steal_fail(self):"},{"line_number":892,"context_line":"        create_stack_lock(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BpQw%3D","line":889,"in_reply_to":"AAAATn%2F%2Bqkk%3D","updated":"2013-11-22 02:50:07.000000000","message":"Jason, older tests were written before we moved to testtools, which most definitely follows (expected, observed), and generates test failure messages with that assumption.\n\nI wouldn\u0027t object to a separate change from someone who fixes all the old (observed, expected) cases.","commit_id":"3ba697e4b6d2d44126c2bf4c6f1812410ed23280"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"8d637bc7f9e6572387ea2fe9180c5ff4d3eb45fa","unresolved":false,"context_lines":[{"line_number":891,"context_line":"    def test_stack_lock_steal_fail(self):"},{"line_number":892,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":893,"context_line":"        rows \u003d db_api.stack_lock_steal(self.stack.id, UUID3, UUID2)"},{"line_number":894,"context_line":"        self.assertEqual(rows, 0)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def test_stack_lock_release_success(self):"},{"line_number":897,"context_line":"        create_stack_lock(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Bq1Y%3D","line":894,"updated":"2013-11-21 19:30:35.000000000","message":"same here and rest of the asserts below.","commit_id":"3ba697e4b6d2d44126c2bf4c6f1812410ed23280"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"42ae00ff274f426148fd477618fb2696eec2ad9f","unresolved":false,"context_lines":[{"line_number":891,"context_line":"    def test_stack_lock_steal_fail(self):"},{"line_number":892,"context_line":"        create_stack_lock(self.stack.id, UUID1)"},{"line_number":893,"context_line":"        rows \u003d db_api.stack_lock_steal(self.stack.id, UUID3, UUID2)"},{"line_number":894,"context_line":"        self.assertEqual(rows, 0)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def test_stack_lock_release_success(self):"},{"line_number":897,"context_line":"        create_stack_lock(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BqkY%3D","line":894,"in_reply_to":"AAAATn%2F%2Bq1Y%3D","updated":"2013-11-21 20:27:36.000000000","message":"(see above)","commit_id":"3ba697e4b6d2d44126c2bf4c6f1812410ed23280"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"b859714bde44145a33fc533164c06c460b0add89","unresolved":false,"context_lines":[{"line_number":509,"context_line":""},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"def create_stack_lock(stack_id, engine_id):"},{"line_number":512,"context_line":"    return db_api.stack_lock_create(stack_id, engine_id)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"def create_event(ctx, **kwargs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9yaY%3D","line":512,"updated":"2013-12-05 22:10:58.000000000","message":"is this necessary? What purpose does this serve?","commit_id":"50b45d96e12d96b26aef352b54e2a11afb349eba"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"6cb91e6dc870473106fbb01014cee5e16198ba94","unresolved":false,"context_lines":[{"line_number":509,"context_line":""},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"def create_stack_lock(stack_id, engine_id):"},{"line_number":512,"context_line":"    return db_api.stack_lock_create(stack_id, engine_id)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"def create_event(ctx, **kwargs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9yXc%3D","line":512,"in_reply_to":"AAAATn%2F9yaY%3D","updated":"2013-12-05 22:16:53.000000000","message":"It really isn\u0027t.  I was just trying to follow the conventions in this file.  I\u0027ll remove it.","commit_id":"50b45d96e12d96b26aef352b54e2a11afb349eba"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"071eaa3a2bc29a8ff7a895772435215776df616d","unresolved":false,"context_lines":[{"line_number":969,"context_line":"    def test_stack_lock_release_success(self):"},{"line_number":970,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"},{"line_number":971,"context_line":"        observed \u003d db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":972,"context_line":"        self.assertEqual(None, observed)"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"    def test_stack_lock_release_fail_double(self):"},{"line_number":975,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9jds%3D","line":972,"updated":"2013-12-10 10:29:45.000000000","message":"please use assertIsNone","commit_id":"8511a5caf485161f48067789dd3b54d9024c6a94"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"0e33583937cc442dd8cfd6eeaf0a7d42913622a8","unresolved":false,"context_lines":[{"line_number":969,"context_line":"    def test_stack_lock_release_success(self):"},{"line_number":970,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"},{"line_number":971,"context_line":"        observed \u003d db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":972,"context_line":"        self.assertEqual(None, observed)"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"    def test_stack_lock_release_fail_double(self):"},{"line_number":975,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9iJc%3D","line":972,"in_reply_to":"AAAATn%2F9jds%3D","updated":"2013-12-10 14:23:01.000000000","message":"Done","commit_id":"8511a5caf485161f48067789dd3b54d9024c6a94"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"071eaa3a2bc29a8ff7a895772435215776df616d","unresolved":false,"context_lines":[{"line_number":975,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"},{"line_number":976,"context_line":"        db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":977,"context_line":"        observed \u003d db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":978,"context_line":"        self.assertEqual(True, observed)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"    def test_stack_lock_release_fail_wrong_engine_id(self):"},{"line_number":981,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9jY4%3D","line":978,"updated":"2013-12-10 10:29:45.000000000","message":"if testing that exactly True singleton was returned, please use assertIs(observed, True), otherwise assertTrue(observed)","commit_id":"8511a5caf485161f48067789dd3b54d9024c6a94"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"0e33583937cc442dd8cfd6eeaf0a7d42913622a8","unresolved":false,"context_lines":[{"line_number":975,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"},{"line_number":976,"context_line":"        db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":977,"context_line":"        observed \u003d db_api.stack_lock_release(self.stack.id, UUID1)"},{"line_number":978,"context_line":"        self.assertEqual(True, observed)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"    def test_stack_lock_release_fail_wrong_engine_id(self):"},{"line_number":981,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9iJo%3D","line":978,"in_reply_to":"AAAATn%2F9jY4%3D","updated":"2013-12-10 14:23:01.000000000","message":"Done","commit_id":"8511a5caf485161f48067789dd3b54d9024c6a94"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"071eaa3a2bc29a8ff7a895772435215776df616d","unresolved":false,"context_lines":[{"line_number":980,"context_line":"    def test_stack_lock_release_fail_wrong_engine_id(self):"},{"line_number":981,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"},{"line_number":982,"context_line":"        observed \u003d db_api.stack_lock_release(self.stack.id, UUID2)"},{"line_number":983,"context_line":"        self.assertEqual(True, observed)"},{"line_number":984,"context_line":""},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"class DBAPIResourceDataTest(HeatTestCase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9jYg%3D","line":983,"updated":"2013-12-10 10:29:45.000000000","message":"the same as my previous comment above","commit_id":"8511a5caf485161f48067789dd3b54d9024c6a94"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"0e33583937cc442dd8cfd6eeaf0a7d42913622a8","unresolved":false,"context_lines":[{"line_number":980,"context_line":"    def test_stack_lock_release_fail_wrong_engine_id(self):"},{"line_number":981,"context_line":"        db_api.stack_lock_create(self.stack.id, UUID1)"},{"line_number":982,"context_line":"        observed \u003d db_api.stack_lock_release(self.stack.id, UUID2)"},{"line_number":983,"context_line":"        self.assertEqual(True, observed)"},{"line_number":984,"context_line":""},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"class DBAPIResourceDataTest(HeatTestCase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9iJg%3D","line":983,"in_reply_to":"AAAATn%2F9jYg%3D","updated":"2013-12-10 14:23:01.000000000","message":"Done","commit_id":"8511a5caf485161f48067789dd3b54d9024c6a94"}]}
