)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52bf5419f3bbb0169f94bbf2b8fb7c0cc0c6bdb5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Nova Ironic driver will implement EAFP approach againsting this fix"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I28ef5ce55399bde7073ffc111e9bc4400e5577ee"},{"line_number":16,"context_line":"Partial-Bug: #1244541"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F9JLM%3D","line":16,"updated":"2013-12-16 11:33:31.000000000","message":"Does it partially fix or close this bug?","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"fbfc62bd7753045ef4efbddec69e39038bab2105","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Nova Ironic driver will implement EAFP approach againsting this fix"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I28ef5ce55399bde7073ffc111e9bc4400e5577ee"},{"line_number":16,"context_line":"Partial-Bug: #1244541"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F9JJk%3D","line":16,"in_reply_to":"AAAATn%2F9JLM%3D","updated":"2013-12-16 11:44:31.000000000","message":"Lucas, we have to implement EAFP approach in our Ironic driver which will call PATCH to associate the instance_uuid, so I just set it as Partial-Bug.","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Current code is overwriting the instance_uuid when multi associating"},{"line_number":10,"context_line":"to update one same node instance_uuid in parallel. In this patch, we"},{"line_number":11,"context_line":"use EAFP approach to avoid such overwriting."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Nova Ironic driver will implement EAFP approach againsting this fix"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F9CZA%3D","line":11,"updated":"2013-12-17 13:01:41.000000000","message":"It seems this should be changed to LBYL as per my comment below","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Current code is overwriting the instance_uuid when multi associating"},{"line_number":10,"context_line":"to update one same node instance_uuid in parallel. In this patch, we"},{"line_number":11,"context_line":"use EAFP approach to avoid such overwriting."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Nova Ironic driver will implement EAFP approach againsting this fix"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F8%2FBY%3D","line":11,"in_reply_to":"AAAATn%2F9CZA%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, with this fix, if we are trying to associate instance_uuid to node which is existing an instance_uuid associated already, the  NodeAssociated exception will be raised, so this should not be LBYL - Look Before You Leap.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to update one same node instance_uuid in parallel. In this patch, we"},{"line_number":11,"context_line":"use EAFP approach to avoid such overwriting."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Nova Ironic driver will implement EAFP approach againsting this fix"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I28ef5ce55399bde7073ffc111e9bc4400e5577ee"},{"line_number":16,"context_line":"Partial-Bug: #1244541"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F9CyA%3D","line":13,"updated":"2013-12-17 13:01:41.000000000","message":"Would you please reword this? Can\u0027t get what it says, Nova Ironic driver will also include some code to avoid race? \n\nAs I understood from the bug description there should be a fix to nova switching it to EAFP approach - it will able to behave in that way because we will check the error here in Ironic. So Ironic will do LBYL instead of Nova. Also please see my comment to api.py","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":10,"context_line":"to update one same node instance_uuid in parallel. In this patch, we"},{"line_number":11,"context_line":"use EAFP approach to avoid such overwriting."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Nova Ironic driver will implement EAFP approach againsting this fix"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I28ef5ce55399bde7073ffc111e9bc4400e5577ee"},{"line_number":16,"context_line":"Partial-Bug: #1244541"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F8%2FBQ%3D","line":13,"in_reply_to":"AAAATn%2F9CyA%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, yes, Nova Ironic driver will catch the NodeAssociated exception, and handle such case.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"5a425dc54b96d666574ed8180b2b1c7cde3fcd9b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Current code is overwriting the instance_uuid when multi associating"},{"line_number":10,"context_line":"to update one same node instance_uuid in parallel. In this patch, we"},{"line_number":11,"context_line":"use will avoid such overwriting, and Nova Ironic driver will handle"},{"line_number":12,"context_line":"such NodeAssociated exception with another patch."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I28ef5ce55399bde7073ffc111e9bc4400e5577ee"},{"line_number":15,"context_line":"Partial-Bug: #1244541"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F8rNA%3D","line":12,"updated":"2013-12-23 12:35:58.000000000","message":"I suggest:\n\nCurrent code can potentially overwrite the instance_uuid without exception when multiple dbapi.update_node calls are issued. This patch adds a check to dbapi so that the NodeAssociated exception will be raised in this case.\n\nThe Nova Ironic driver will handle this exception. This will be introduced in a separate patch.","commit_id":"93f1297d251ef57491db522ddf32b30e76886535"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4f5de38c5c00e415e902a152e068eb8d50524340","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Current code is overwriting the instance_uuid when multi associating"},{"line_number":10,"context_line":"to update one same node instance_uuid in parallel. In this patch, we"},{"line_number":11,"context_line":"use will avoid such overwriting, and Nova Ironic driver will handle"},{"line_number":12,"context_line":"such NodeAssociated exception with another patch."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I28ef5ce55399bde7073ffc111e9bc4400e5577ee"},{"line_number":15,"context_line":"Partial-Bug: #1244541"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F8ofg%3D","line":12,"in_reply_to":"AAAATn%2F8rNA%3D","updated":"2013-12-24 00:32:45.000000000","message":"That is good, thank you Max.","commit_id":"93f1297d251ef57491db522ddf32b30e76886535"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"9857081c0f09ef953748c130b0bf186d1e38dc7b","unresolved":false,"context_lines":[{"line_number":361,"context_line":"            # Associate an instance to a node only if that node is not yet"},{"line_number":362,"context_line":"            # assocated. Support to update any other fields they require"},{"line_number":363,"context_line":"            # in the same updating operation."},{"line_number":364,"context_line":"            if \u0027instance_uuid\u0027 in values.keys() and values[\u0027instance_uuid\u0027]:"},{"line_number":365,"context_line":"                count \u003d query.filter("},{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"},{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9J2o%3D","line":364,"updated":"2013-12-16 09:12:19.000000000","message":"nit: if values.get(\u0027instance_uuid\u0027):","commit_id":"a3f6b74a31b83fc3951e9b615f8faa882ede7ac8"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e4a9ce74714fdaa4a7c667c70c427bfab67a2b9c","unresolved":false,"context_lines":[{"line_number":361,"context_line":"            # Associate an instance to a node only if that node is not yet"},{"line_number":362,"context_line":"            # assocated. Support to update any other fields they require"},{"line_number":363,"context_line":"            # in the same updating operation."},{"line_number":364,"context_line":"            if \u0027instance_uuid\u0027 in values.keys() and values[\u0027instance_uuid\u0027]:"},{"line_number":365,"context_line":"                count \u003d query.filter("},{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"},{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9Jb4%3D","line":364,"in_reply_to":"AAAATn%2F9J2o%3D","updated":"2013-12-16 10:39:04.000000000","message":"OK, good idea, thank you.","commit_id":"a3f6b74a31b83fc3951e9b615f8faa882ede7ac8"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"9857081c0f09ef953748c130b0bf186d1e38dc7b","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                count \u003d query.filter("},{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"},{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":368,"context_line":"                if count !\u003d 1:"},{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9J0I%3D","line":368,"updated":"2013-12-16 09:12:19.000000000","message":"Node maybe also not found in this case.","commit_id":"a3f6b74a31b83fc3951e9b615f8faa882ede7ac8"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e4a9ce74714fdaa4a7c667c70c427bfab67a2b9c","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                count \u003d query.filter("},{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"},{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":368,"context_line":"                if count !\u003d 1:"},{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9JaY%3D","line":368,"in_reply_to":"AAAATn%2F9J0I%3D","updated":"2013-12-16 10:39:04.000000000","message":"Yuriy, I think \"Node not found\" can be catch in this call, https://github.com/openstack/ironic/blob/master/ironic/api/controllers/v1/node.py#L521 first, how do you think?","commit_id":"a3f6b74a31b83fc3951e9b615f8faa882ede7ac8"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"49b4d571c868fc9d859b11d092b6df691888f973","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"},{"line_number":372,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":373,"context_line":"                if count !\u003d 1:"},{"line_number":374,"context_line":"                    raise exception.NodeNotFound(node\u003dnode_id)"},{"line_number":375,"context_line":"            ref \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9JqY%3D","line":372,"updated":"2013-12-16 09:35:47.000000000","message":"Why synchronize_session\u003d\u0027fetch\u0027 needed here?","commit_id":"a3f6b74a31b83fc3951e9b615f8faa882ede7ac8"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e4a9ce74714fdaa4a7c667c70c427bfab67a2b9c","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"},{"line_number":372,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":373,"context_line":"                if count !\u003d 1:"},{"line_number":374,"context_line":"                    raise exception.NodeNotFound(node\u003dnode_id)"},{"line_number":375,"context_line":"            ref \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9JcE%3D","line":372,"in_reply_to":"AAAATn%2F9JqY%3D","updated":"2013-12-16 10:39:04.000000000","message":"Yuriy, this is existing code, not involved by this patch.","commit_id":"a3f6b74a31b83fc3951e9b615f8faa882ede7ac8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52bf5419f3bbb0169f94bbf2b8fb7c0cc0c6bdb5","unresolved":false,"context_lines":[{"line_number":360,"context_line":"            query \u003d add_identity_filter(query, node_id)"},{"line_number":361,"context_line":"            # Associate an instance to a node only if that node is not yet"},{"line_number":362,"context_line":"            # assocated. Support to update any other fields they require"},{"line_number":363,"context_line":"            # in the same updating operation."},{"line_number":364,"context_line":"            if values.get(\u0027instance_uuid\u0027):"},{"line_number":365,"context_line":"                count \u003d query.filter("},{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9JSA%3D","line":363,"updated":"2013-12-16 11:33:31.000000000","message":"s/assocated/associated (missing \u0027i\u0027)\n\nAlso, the second part of the of this comment is odd. Yes this method can update multiple fields at once, the docstring already says that. I would just remove that second part of this comment.","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"fbfc62bd7753045ef4efbddec69e39038bab2105","unresolved":false,"context_lines":[{"line_number":360,"context_line":"            query \u003d add_identity_filter(query, node_id)"},{"line_number":361,"context_line":"            # Associate an instance to a node only if that node is not yet"},{"line_number":362,"context_line":"            # assocated. Support to update any other fields they require"},{"line_number":363,"context_line":"            # in the same updating operation."},{"line_number":364,"context_line":"            if values.get(\u0027instance_uuid\u0027):"},{"line_number":365,"context_line":"                count \u003d query.filter("},{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9JJY%3D","line":363,"in_reply_to":"AAAATn%2F9JSA%3D","updated":"2013-12-16 11:44:31.000000000","message":"OK, thank you Lucas:)","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52bf5419f3bbb0169f94bbf2b8fb7c0cc0c6bdb5","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"},{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":368,"context_line":"                if count !\u003d 1:"},{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"},{"line_number":372,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9JLY%3D","line":369,"updated":"2013-12-16 11:33:31.000000000","message":"Let\u0027s also update the docstring at db/api.py[1] to say this method could raise NodeAssociated and NotNotFound.\n\nhttps://github.com/openstack/ironic/blob/master/ironic/db/api.py#L170","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"fbfc62bd7753045ef4efbddec69e39038bab2105","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                           models.Node.instance_uuid \u003d\u003d None).\\"},{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":368,"context_line":"                if count !\u003d 1:"},{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"},{"line_number":372,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9JJQ%3D","line":369,"in_reply_to":"AAAATn%2F9JLY%3D","updated":"2013-12-16 11:44:31.000000000","message":"Will do, thank you Lucas.","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"52bf5419f3bbb0169f94bbf2b8fb7c0cc0c6bdb5","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":368,"context_line":"                if count !\u003d 1:"},{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"},{"line_number":372,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":373,"context_line":"                if count !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9JNI%3D","line":370,"updated":"2013-12-16 11:33:31.000000000","message":"This might raise the wrong exception. The NodeNotFound should be checked before this block. In this example if I try to update a node that doesn\u0027t exist but has the instance_uuid field present in the values dictionary it\u0027s going to raise NodeAssociated instead of NodeNotFound which would be the correct exception.","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"fbfc62bd7753045ef4efbddec69e39038bab2105","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":368,"context_line":"                if count !\u003d 1:"},{"line_number":369,"context_line":"                    raise exception.NodeAssociated("},{"line_number":370,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":371,"context_line":"            else:"},{"line_number":372,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":373,"context_line":"                if count !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9JJA%3D","line":370,"in_reply_to":"AAAATn%2F9JNI%3D","updated":"2013-12-16 11:44:31.000000000","message":"Lucas, I think \"Node not found\" can be catch in this call  https://github.com/openstack/ironic/blob/master/ironic/api/controllers/v1/node.py#L521 first, so we will not face such NodeNotFound in this code branch.","commit_id":"5b48d78688322cfc8d582d8f3abcbbaba7090cd6"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":367,"context_line":"                if count !\u003d 1:"},{"line_number":368,"context_line":"                    raise exception.NodeAssociated("},{"line_number":369,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":370,"context_line":"            else:"},{"line_number":371,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":372,"context_line":"                if count !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Cl8%3D","line":369,"updated":"2013-12-17 13:01:41.000000000","message":"I\u0027m completely agree with Lucas comments for previous patch. This will lead to wrong exception if node not exist here. Also     \n\n1. If NodeNotFound cannot happen here, why we have the \"else\" below?\n\n2. I think we should not rely on something already handled on the level above (somewhere in REST API), this method should be self-sufficient, so we won\u0027t get in troubles if we use it somewhere else or remove those call from the REST API.\n\nI suggest to rewrite this like:\n\n1. with session.begin()\n\n2. Retreive node from db (complete query with query.one())\n\n3. Catch NoResultFound if occured, and re-throw NodeNotFound in this case\n\n4. if values.get(\u0027instance_uuid\u0027) AND retreived node already has \nsome instance_uuid assigned -\u003e throw NodeAssociated.\n\n5. Perform update\n\n6. close session (\"with\" block will do this) to save changes to Db\n\n7. Return ref\n\nSo this actually will be LBYL approach, not the EAFP. Currently I don\u0027t see a way to implement it like EAFP because we won\u0027t have a way to distinguish NodeAssociated and NodeNotFound as Lucas mentioned.\n\nGuys, please share your opinion regarding this","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"69f790e52b5c26a04b2f59538e507bef8c49bd07","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":367,"context_line":"                if count !\u003d 1:"},{"line_number":368,"context_line":"                    raise exception.NodeAssociated("},{"line_number":369,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":370,"context_line":"            else:"},{"line_number":371,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":372,"context_line":"                if count !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F87Xo%3D","line":369,"in_reply_to":"AAAATn%2F8%2FBI%3D","updated":"2013-12-18 17:30:42.000000000","message":"+1 I liked the solution proposed here :)","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                           update(values, synchronize_session\u003dFalse)"},{"line_number":367,"context_line":"                if count !\u003d 1:"},{"line_number":368,"context_line":"                    raise exception.NodeAssociated("},{"line_number":369,"context_line":"                            node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":370,"context_line":"            else:"},{"line_number":371,"context_line":"                count \u003d query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":372,"context_line":"                if count !\u003d 1:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F8%2FBI%3D","line":369,"in_reply_to":"AAAATn%2F9Cl8%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, yes, good point, I will try your solution and refine this logic and commit new patch, thanks for your good idea.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"5a425dc54b96d666574ed8180b2b1c7cde3fcd9b","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                                    instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":376,"context_line":"            query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":377,"context_line":"            ref \u003d query.one()"},{"line_number":378,"context_line":"        return ref"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    @objects.objectify(objects.Port)"},{"line_number":381,"context_line":"    def get_port(self, port_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F8rFg%3D","line":378,"updated":"2013-12-23 12:35:58.000000000","message":"I suggest the following:\n\n    with session.begin():\n        query \u003d model_query(models.Node, session\u003dsession)\n        query \u003d add_identity_filter(query, node_id)\n        try:\n            ref \u003d query.one()\n        except NoResultFound:\n            raise exception.NodeNotFound(node\u003dnode_id)\n        \n        # Prevent instance_uuid overwriting\n        if values.get(\"instance_uuid\") and ref.instance_uuid:\n            raise exception.NodeAssociated(node\u003dnode_id, instance\u003dvalues[\u0027instance_uuid\u0027])\n\n        ref.update(values)\n    return ref\n\nWith that said we\u0027re loosing synchronize_session\u003d\u0027fetch\u0027 option. It seems there are no way to pass it to the session, or to the Model.update method (Correct me someone if I\u0027m wrong). But currently I don\u0027t see why we would need this option, f.e. it\u0027s not used in update_port and update_chassis. According to Alcemy docs (http://docs.sqlalchemy.org/en/rel_0_7/orm/query.html?highlight\u003dsynchronize_session) \"synchronize_session\u003d\u0027fetch\u0027 \" performs a select query before the update to find objects that are matched by the update query, in other words it clarifies the list of objects being updated right before the update. Since we relying on the node_id in our query, I don\u0027t think that the list will change frequently, there\u0027s always only one object with such node id. So for the moment I think we can safely drop the \"synchronize_session\u003d\u0027fetch\u0027 \".\n\nIf someone have another args, please say. We always can leave things as is and go with\n\n        query.update(values, synchronize_session\u003d\u0027fetch\u0027)\n        ref \u003d query.one()\n    return ref","commit_id":"93f1297d251ef57491db522ddf32b30e76886535"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4f5de38c5c00e415e902a152e068eb8d50524340","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                                    instance\u003dvalues[\u0027instance_uuid\u0027])"},{"line_number":376,"context_line":"            query.update(values, synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":377,"context_line":"            ref \u003d query.one()"},{"line_number":378,"context_line":"        return ref"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    @objects.objectify(objects.Port)"},{"line_number":381,"context_line":"    def get_port(self, port_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F8of0%3D","line":378,"in_reply_to":"AAAATn%2F8rFg%3D","updated":"2013-12-24 00:32:45.000000000","message":"Max, agree with you, will not query twice to check instance_uuid and will not use \u0027fetch\u0027 parameter here. I will create new patch and see more comments here, thank you.","commit_id":"93f1297d251ef57491db522ddf32b30e76886535"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5c73eab8a7c3ffd24af83a64d4ccd93e6c0b9fe","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            query \u003d model_query(models.Node, session\u003dsession)"},{"line_number":363,"context_line":"            query \u003d add_identity_filter(query, node_id)"},{"line_number":364,"context_line":"            try:"},{"line_number":365,"context_line":"                ref \u003d query.one()"},{"line_number":366,"context_line":"            except NoResultFound:"},{"line_number":367,"context_line":"                raise exception.NodeNotFound(node\u003dnode_id)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAT3%2F%2F%2FSs%3D","line":365,"updated":"2013-12-25 10:59:16.000000000","message":"There is race condition possible if two concurrent transaction will do this SELECT.\nYes, we use \u0027reservation\u0027 field in conductor for locking, but IMO better also locks this row on DB level:\n\nref \u003d query.with_lockmode(\u0027update\u0027).one()","commit_id":"1f3849ea60f1bcdb484bbd1cd05ed3b6ec8503ad"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"18060aa7033bb29977cfb018a3e513ffd523b396","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            query \u003d model_query(models.Node, session\u003dsession)"},{"line_number":363,"context_line":"            query \u003d add_identity_filter(query, node_id)"},{"line_number":364,"context_line":"            try:"},{"line_number":365,"context_line":"                ref \u003d query.one()"},{"line_number":366,"context_line":"            except NoResultFound:"},{"line_number":367,"context_line":"                raise exception.NodeNotFound(node\u003dnode_id)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAT3%2F%2F%2FOM%3D","line":365,"in_reply_to":"AAAAT3%2F%2F%2FSs%3D","updated":"2013-12-25 11:17:21.000000000","message":"Good idea, will do, thank you Yuriy.","commit_id":"1f3849ea60f1bcdb484bbd1cd05ed3b6ec8503ad"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"d2ea342fe0ec006fa1709f471bb9a18add76d1f6","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            query \u003d model_query(models.Node, session\u003dsession)"},{"line_number":363,"context_line":"            query \u003d add_identity_filter(query, node_id)"},{"line_number":364,"context_line":"            try:"},{"line_number":365,"context_line":"                ref \u003d query.one()"},{"line_number":366,"context_line":"            except NoResultFound:"},{"line_number":367,"context_line":"                raise exception.NodeNotFound(node\u003dnode_id)"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAT3%2F%2F%2FJ8%3D","line":365,"in_reply_to":"AAAAT3%2F%2F%2FSs%3D","updated":"2013-12-25 11:47:17.000000000","message":"Very nice catch!","commit_id":"1f3849ea60f1bcdb484bbd1cd05ed3b6ec8503ad"}],"ironic/tests/db/test_nodes.py":[{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027extra\u0027: new_extra})"},{"line_number":217,"context_line":"        self.assertEqual(new_extra, res[\u0027extra\u0027])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_update_node_associate_instance(self):"},{"line_number":220,"context_line":"        n \u003d self._create_test_node()"},{"line_number":221,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":222,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9CcY%3D","line":219,"updated":"2013-12-17 13:01:41.000000000","message":"Please rename to test_update_node_associate_disassociate_instance to reflect it\u0027s real purpose","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027extra\u0027: new_extra})"},{"line_number":217,"context_line":"        self.assertEqual(new_extra, res[\u0027extra\u0027])"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def test_update_node_associate_instance(self):"},{"line_number":220,"context_line":"        n \u003d self._create_test_node()"},{"line_number":221,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":222,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F8%2FBE%3D","line":219,"in_reply_to":"AAAATn%2F9CcY%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, ok will do, thank you.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: None})"},{"line_number":225,"context_line":"        self.assertEqual(None, res[\u0027instance_uuid\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def test_update_node_associate_instance_with_other_fields(self):"},{"line_number":228,"context_line":"        n \u003d self._create_test_node()"},{"line_number":229,"context_line":"        new_extra \u003d {\u0027foo\u0027: \u0027bar\u0027}"},{"line_number":230,"context_line":"        self.assertNotEqual(n[\u0027extra\u0027], new_extra)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9CbY%3D","line":227,"updated":"2013-12-17 13:01:41.000000000","message":"This too test_update_node_associate_diassociate_instance_plus_other_fields. \n\nI like this test, but is it really required to cover this patch change? It\u0027s some kind of mixed update tests which should have been written before. I think we may drop it for this patch. Do you have some concerns to have it?","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: None})"},{"line_number":225,"context_line":"        self.assertEqual(None, res[\u0027instance_uuid\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def test_update_node_associate_instance_with_other_fields(self):"},{"line_number":228,"context_line":"        n \u003d self._create_test_node()"},{"line_number":229,"context_line":"        new_extra \u003d {\u0027foo\u0027: \u0027bar\u0027}"},{"line_number":230,"context_line":"        self.assertNotEqual(n[\u0027extra\u0027], new_extra)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F8%2FAo%3D","line":227,"in_reply_to":"AAAATn%2F9CbY%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, yes, this is a special case to update both instance_uuid and other fields together, is not a required case, we can drop:)","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        self.assertEqual(new_extra, res[\u0027extra\u0027])"},{"line_number":237,"context_line":"        self.assertEqual(None, res[\u0027instance_uuid\u0027])"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def test_update_node_associate_instance_fails(self):"},{"line_number":240,"context_line":"        n \u003d self._create_test_node()"},{"line_number":241,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":242,"context_line":"        self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9CdE%3D","line":239,"updated":"2013-12-17 13:01:41.000000000","message":"Please rename to test_update_node_already_assosicated","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        self.assertEqual(new_extra, res[\u0027extra\u0027])"},{"line_number":237,"context_line":"        self.assertEqual(None, res[\u0027instance_uuid\u0027])"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def test_update_node_associate_instance_fails(self):"},{"line_number":240,"context_line":"        n \u003d self._create_test_node()"},{"line_number":241,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":242,"context_line":"        self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F8%2FA0%3D","line":239,"in_reply_to":"AAAATn%2F9CdE%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, ok will do, thank you.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"abef74cbeb422c5577f64d2c37bc4af97ab429fb","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        n \u003d self._create_test_node()"},{"line_number":241,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":242,"context_line":"        self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"},{"line_number":243,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":244,"context_line":"        self.assertRaises(exception.NodeAssociated,"},{"line_number":245,"context_line":"                          self.dbapi.update_node,"},{"line_number":246,"context_line":"                          n[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Cc4%3D","line":243,"updated":"2013-12-17 13:01:41.000000000","message":"Please use some different names for these variables. They could be one_uuid, two_uuid.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"345bab5bb858983e63d37c1093cc9d03c2c58c64","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        n \u003d self._create_test_node()"},{"line_number":241,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":242,"context_line":"        self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"},{"line_number":243,"context_line":"        new_i_uuid \u003d ironic_utils.generate_uuid()"},{"line_number":244,"context_line":"        self.assertRaises(exception.NodeAssociated,"},{"line_number":245,"context_line":"                          self.dbapi.update_node,"},{"line_number":246,"context_line":"                          n[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F8%2FAs%3D","line":243,"in_reply_to":"AAAATn%2F9Cc4%3D","updated":"2013-12-18 03:19:35.000000000","message":"Max, ok will do, thank you.","commit_id":"07c37a15de56c240274007433ff7ca9b64481752"},{"author":{"_account_id":8968,"name":"Max Lobur","email":"max_lobur@outlook.com","username":"max_lobur"},"change_message_id":"5a425dc54b96d666574ed8180b2b1c7cde3fcd9b","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                          self.dbapi.update_node,"},{"line_number":234,"context_line":"                          n[\u0027id\u0027],"},{"line_number":235,"context_line":"                          {\u0027instance_uuid\u0027: new_i_uuid_two})"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def test_reserve_one_node(self):"},{"line_number":238,"context_line":"        n \u003d self._create_test_node()"},{"line_number":239,"context_line":"        uuid \u003d n[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F8rDM%3D","line":236,"updated":"2013-12-23 12:35:58.000000000","message":"Sorry, I know that\u0027s not related to the patch, but currently seems there is no test for \n\n    test_update_node_not_found\n\nwhich will thest NodeNotFound path in update_node method. Would you please add it? I assume it won\u0027t be comlex:\n\n    node_uuid \u003d ironic_utils.generate_uuid()\n    new_extra \u003d {\u0027foo\u0027: \u0027bar\u0027}\n    self.assertRaises(exception.NodeNotFound, self.dbapi.update_node, node_uuid, {\u0027extra\u0027: new_extra})","commit_id":"93f1297d251ef57491db522ddf32b30e76886535"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"4f5de38c5c00e415e902a152e068eb8d50524340","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                          self.dbapi.update_node,"},{"line_number":234,"context_line":"                          n[\u0027id\u0027],"},{"line_number":235,"context_line":"                          {\u0027instance_uuid\u0027: new_i_uuid_two})"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def test_reserve_one_node(self):"},{"line_number":238,"context_line":"        n \u003d self._create_test_node()"},{"line_number":239,"context_line":"        uuid \u003d n[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F8ofc%3D","line":236,"in_reply_to":"AAAATn%2F8rDM%3D","updated":"2013-12-24 00:32:45.000000000","message":"OK, will do, thank you Max.","commit_id":"93f1297d251ef57491db522ddf32b30e76886535"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5c73eab8a7c3ffd24af83a64d4ccd93e6c0b9fe","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"},{"line_number":229,"context_line":"        self.assertEqual(new_i_uuid, res[\u0027instance_uuid\u0027])"},{"line_number":230,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: None})"},{"line_number":231,"context_line":"        self.assertEqual(None, res[\u0027instance_uuid\u0027])"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def test_update_node_already_assosicated(self):"},{"line_number":234,"context_line":"        n \u003d self._create_test_node()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAT3%2F%2F%2FRI%3D","line":231,"updated":"2013-12-25 10:59:16.000000000","message":"Please use self.assertIsNone(res[\u0027instance_uuid\u0027]) here.","commit_id":"1f3849ea60f1bcdb484bbd1cd05ed3b6ec8503ad"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"18060aa7033bb29977cfb018a3e513ffd523b396","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: new_i_uuid})"},{"line_number":229,"context_line":"        self.assertEqual(new_i_uuid, res[\u0027instance_uuid\u0027])"},{"line_number":230,"context_line":"        res \u003d self.dbapi.update_node(n[\u0027id\u0027], {\u0027instance_uuid\u0027: None})"},{"line_number":231,"context_line":"        self.assertEqual(None, res[\u0027instance_uuid\u0027])"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    def test_update_node_already_assosicated(self):"},{"line_number":234,"context_line":"        n \u003d self._create_test_node()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAT3%2F%2F%2FPM%3D","line":231,"in_reply_to":"AAAAT3%2F%2F%2FRI%3D","updated":"2013-12-25 11:17:21.000000000","message":"Will do, thank you Yuriy.","commit_id":"1f3849ea60f1bcdb484bbd1cd05ed3b6ec8503ad"}]}
