)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"2c4937bd85abb81e3951c0bbfc4fbbb0c1551794","unresolved":false,"context_lines":[{"line_number":7,"context_line":"VMware: fix bug causing nova-compute CPU to spike to 100%"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When there are hundreds of VMs running each time a VM is referenced"},{"line_number":10,"context_line":"all of the VM\u0027s in the system will be read by nova-compute and then"},{"line_number":11,"context_line":"filtered according to the UUID."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This is addressed by using an API (FindAllByUuid) which reads only"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F9V1g%3D","line":10,"updated":"2013-12-12 14:05:39.000000000","message":"nit: VMs","commit_id":"6007749f253fef24c982a0847e7374e04d9d4c48"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"1a9ffbb80bff64300b459a9d02f472fe118e2556","unresolved":false,"context_lines":[{"line_number":7,"context_line":"VMware: fix bug causing nova-compute CPU to spike to 100%"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When there are hundreds of VMs running each time a VM is referenced"},{"line_number":10,"context_line":"all of the VM\u0027s in the system will be read by nova-compute and then"},{"line_number":11,"context_line":"filtered according to the UUID."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This is addressed by using an API (FindAllByUuid) which reads only"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F9KHE%3D","line":10,"in_reply_to":"AAAATn%2F9V1g%3D","updated":"2013-12-16 08:37:55.000000000","message":"Done","commit_id":"6007749f253fef24c982a0847e7374e04d9d4c48"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"c9e27357fcdac5c6a0db447d5de8cf4f0d761bdc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Gary Kotton \u003cgkotton@vmware.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-02-20 06:18:04 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"VMware: fix bug causing nova-compute CPU to spike to 100%"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When there are hundreds of VMs running each time a VM is referenced"},{"line_number":10,"context_line":"all of the VMs in the system will be read by nova-compute and then"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"AAAAUX%2F%2BjjY%3D","line":7,"updated":"2014-02-20 14:56:15.000000000","message":"The title could be better, as in - summarize what was actually done.","commit_id":"8d0a42f4dce39676953344ad546cf35a1842b420"}],"nova/tests/virt/vmwareapi/test_vm_util.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"8018e50f88a05c265c7e0767b835ebf915d379eb","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                      \u0027afterResume\u0027: True,"},{"line_number":427,"context_line":"                      \u0027afterPowerOn\u0027: True,"},{"line_number":428,"context_line":"            \u0027obj_name\u0027: \u0027ns0:ToolsConfigInfo\u0027},"},{"line_number":429,"context_line":"            \u0027numCPUs\u0027: 2}\"\"\" % (instance_uuid, instance_uuid)"},{"line_number":430,"context_line":"        expected \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, expected)"},{"line_number":431,"context_line":"        result \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, repr(result))"},{"line_number":432,"context_line":"        self.assertEqual(expected, result)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2BnL8%3D","line":429,"updated":"2014-01-23 21:43:40.000000000","message":"If you have to push up another patch, change this to dictionary substitution, i.e.:\n\n    expected \u003d \"\"\"{\n        …\n        \u0027instanceUuid\u0027: \u0027%(instance_uuid)s\u0027,\n        …\n        \u0027extraConfig\u0027: [{\u0027value\u0027: \u0027%(instance_uuid)s\u0027,\n        …\n        \u0027numCPUs\u0027: 2}\"\"\" % {\u0027instance_uuid\u0027: instance_uuid}","commit_id":"1f4d7d15de69d485858a854bf4c420dc8a700eda"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb85cea68f793e8ce0038922f6b7e7e557834037","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                      \u0027afterResume\u0027: True,"},{"line_number":427,"context_line":"                      \u0027afterPowerOn\u0027: True,"},{"line_number":428,"context_line":"            \u0027obj_name\u0027: \u0027ns0:ToolsConfigInfo\u0027},"},{"line_number":429,"context_line":"            \u0027numCPUs\u0027: 2}\"\"\" % (instance_uuid, instance_uuid)"},{"line_number":430,"context_line":"        expected \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, expected)"},{"line_number":431,"context_line":"        result \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, repr(result))"},{"line_number":432,"context_line":"        self.assertEqual(expected, result)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2BkpU%3D","line":429,"in_reply_to":"AAAAUH%2F%2BnL8%3D","updated":"2014-01-24 09:09:34.000000000","message":"Done","commit_id":"1f4d7d15de69d485858a854bf4c420dc8a700eda"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"913ffbdde7b69c15583994d9bb3104c18a88adfb","unresolved":false,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @mock.patch.object(vm_util, \u0027_get_vm_ref_from_vm_uuid\u0027)"},{"line_number":203,"context_line":"    def test_get_host_name_for_vm(self, _get_ref_from_uuid):"},{"line_number":204,"context_line":"        _get_ref_from_uuid.return_value \u003d None"},{"line_number":205,"context_line":"        fake_host \u003d fake.HostSystem()"},{"line_number":206,"context_line":"        fake_host_id \u003d fake_host.obj.value"},{"line_number":207,"context_line":"        fake_vm \u003d fake.VirtualMachine(name\u003d\u0027vm-123\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B%2B%2FE%3D","line":204,"updated":"2014-02-17 20:16:28.000000000","message":"You could have also specified this in the decorator:\n\n    @mock.patch.object(vm_util, \u0027_get_vm_ref_from_vm_uuid\u0027,\n                       return_value\u003dNone)\n\nJFYI","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"219d7dc4976b8b0f2b7114ea3d818fa5c90d897c","unresolved":false,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @mock.patch.object(vm_util, \u0027_get_vm_ref_from_vm_uuid\u0027)"},{"line_number":203,"context_line":"    def test_get_host_name_for_vm(self, _get_ref_from_uuid):"},{"line_number":204,"context_line":"        _get_ref_from_uuid.return_value \u003d None"},{"line_number":205,"context_line":"        fake_host \u003d fake.HostSystem()"},{"line_number":206,"context_line":"        fake_host_id \u003d fake_host.obj.value"},{"line_number":207,"context_line":"        fake_vm \u003d fake.VirtualMachine(name\u003d\u0027vm-123\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B6LM%3D","line":204,"in_reply_to":"AAAAUX%2F%2B%2B%2FE%3D","updated":"2014-02-18 10:01:28.000000000","message":"Done","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"}],"nova/tests/virt/vmwareapi/test_vmwareapi_vm_util.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"5d563e8791660e3e48ddc9f1d150f39608ffe8b5","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                                \u0027afterPowerOn\u0027:True,"},{"line_number":424,"context_line":"                                \u0027obj_name\u0027:\u0027ns0:ToolsConfigInfo\u0027},"},{"line_number":425,"context_line":"                       \u0027numCPUs\u0027:2}\"\"\""},{"line_number":426,"context_line":"        expected \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, expected)"},{"line_number":427,"context_line":"        result \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, repr(result))"},{"line_number":428,"context_line":"        self.assertEqual(expected, result)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9ZfE%3D","line":426,"updated":"2013-12-11 22:47:10.000000000","message":"nit: wouldn\u0027t we do self.assertIn instead of using re here? It looks like where repr() is used we could use json.dumps instead?","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"eeae82374cc04151b49c3fc3f0fd9495b07b4806","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                                \u0027afterPowerOn\u0027:True,"},{"line_number":424,"context_line":"                                \u0027obj_name\u0027:\u0027ns0:ToolsConfigInfo\u0027},"},{"line_number":425,"context_line":"                       \u0027numCPUs\u0027:2}\"\"\""},{"line_number":426,"context_line":"        expected \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, expected)"},{"line_number":427,"context_line":"        result \u003d re.sub(r\u0027\\s+\u0027, \u0027\u0027, repr(result))"},{"line_number":428,"context_line":"        self.assertEqual(expected, result)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9WcI%3D","line":426,"in_reply_to":"AAAATn%2F9ZfE%3D","updated":"2013-12-12 11:39:08.000000000","message":"if possible i would prefer to leave it like this - this is what is done in all of the other test cases when we have the configuration validations.\nmaybe this can be addressed in another patch set","commit_id":"220915f8f542957109fc7620d52b08870db2f485"}],"nova/virt/vmwareapi/vm_util.py":[{"author":{"_account_id":8027,"name":"Vui Lam","email":"vui@vmware.com","username":"vui"},"change_message_id":"b1dca22106233c62e79114ab2760a3dd4f461746","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def vm_ref_delete(uuid):"},{"line_number":42,"context_line":"    global _VM_REFS"},{"line_number":43,"context_line":"    _VM_REFS.pop(uuid, None)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9XfY%3D","line":42,"updated":"2013-12-12 07:47:13.000000000","message":"I don\u0027t find any final word in pep8 or hacking.rst, but just want to call out that the global declaration is only necessary in vm_refs_reset() because it is the one place where the assignment of the variable occurs.\n(http://docs.python.org/2/faq/programming.html#id10), so this line can be removed without affecting correctness.","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"eeae82374cc04151b49c3fc3f0fd9495b07b4806","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def vm_ref_delete(uuid):"},{"line_number":42,"context_line":"    global _VM_REFS"},{"line_number":43,"context_line":"    _VM_REFS.pop(uuid, None)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Wc4%3D","line":42,"in_reply_to":"AAAATn%2F9XfY%3D","updated":"2013-12-12 11:39:08.000000000","message":"Done","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":8027,"name":"Vui Lam","email":"vui@vmware.com","username":"vui"},"change_message_id":"b1dca22106233c62e79114ab2760a3dd4f461746","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def vm_ref_get(uuid):"},{"line_number":47,"context_line":"    global _VM_REFS"},{"line_number":48,"context_line":"    return _VM_REFS.get(uuid)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9XfU%3D","line":47,"updated":"2013-12-12 07:47:13.000000000","message":"ditto","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"eeae82374cc04151b49c3fc3f0fd9495b07b4806","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def vm_ref_get(uuid):"},{"line_number":47,"context_line":"    global _VM_REFS"},{"line_number":48,"context_line":"    return _VM_REFS.get(uuid)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Wc0%3D","line":47,"in_reply_to":"AAAATn%2F9XfU%3D","updated":"2013-12-12 11:39:08.000000000","message":"Done","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":8027,"name":"Vui Lam","email":"vui@vmware.com","username":"vui"},"change_message_id":"b1dca22106233c62e79114ab2760a3dd4f461746","unresolved":false,"context_lines":[{"line_number":692,"context_line":"        return vm_ref"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"    vm_ref \u003d get_vm_ref_from_vm_uuid(session, uuid)"},{"line_number":695,"context_line":"    if not vm_ref:"},{"line_number":696,"context_line":"        vm_ref \u003d get_vm_ref_from_uuid(session, uuid)"},{"line_number":697,"context_line":"    if not vm_ref:"},{"line_number":698,"context_line":"        vm_ref \u003d get_vm_ref_from_name(session, instance[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Xc0%3D","line":695,"updated":"2013-12-12 07:47:13.000000000","message":"not strong on this, but maybe consider:\nvm_ref \u003d (get_vm_ref_from_vm_uuid(session, uuid) or\n              get_vm_ref_from_uuid(session, uuid) or\n              get_vm_ref_from_name(session, instance[\u0027name\u0027])","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"5d563e8791660e3e48ddc9f1d150f39608ffe8b5","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        vm_ref \u003d get_vm_ref_from_name(session, instance[\u0027name\u0027])"},{"line_number":699,"context_line":"    if vm_ref is None:"},{"line_number":700,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":701,"context_line":"    _VM_REFS[uuid] \u003d vm_ref"},{"line_number":702,"context_line":"    return vm_ref"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Zcg%3D","line":701,"updated":"2013-12-11 22:47:10.000000000","message":"you need to have: global _VM_REFS in this function if you actually want the value of _VM_REFS[uuid] to be saved when you leave this method: \n\ndef test():\n    global X\n    print X\n\ndef does_not_update_x():\n    X \u003d 11\n\ndef does_update_x():\n    global X\n    X \u003d 11\n\n\nX \u003d 22\n\n\ndoes_not_update_x()\n\nprint \"X is still 22\"\n\nprint X\n\ndoes_update_x()\n\nprint \"X is now 11\"\n\nprint X\n\n---\n\nX is still 22\n\n22\n\nX is now 11\n\n11","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":8027,"name":"Vui Lam","email":"vui@vmware.com","username":"vui"},"change_message_id":"2de250a9a747767a5d1f53888f227581909ca3c1","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        vm_ref \u003d get_vm_ref_from_name(session, instance[\u0027name\u0027])"},{"line_number":699,"context_line":"    if vm_ref is None:"},{"line_number":700,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":701,"context_line":"    _VM_REFS[uuid] \u003d vm_ref"},{"line_number":702,"context_line":"    return vm_ref"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9XpM%3D","line":701,"in_reply_to":"AAAATn%2F9Zcg%3D","updated":"2013-12-12 06:21:28.000000000","message":"Ah, but dict\u0027s works differently :-), and does not require global:\n\ndef still_update_x():\n    X[\u0027bar\u0027] \u003d 11\n    X[\u0027foo\u0027] \u003d 11\ndef does_update_x():\n    global X\n    X[\u0027foo\u0027] \u003d 33\n\nX \u003d {}\nX[\u0027foo\u0027] \u003d 22\n\nstill_update_x()\nprint X\ndoes_update_x()\nprint X\n\n----\n\n{\u0027foo\u0027: 11, \u0027bar\u0027: 11}\n{\u0027foo\u0027: 33, \u0027bar\u0027: 11}","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"ee4ec92ac16c9b7e4532b27053bbdeee49ecff01","unresolved":false,"context_lines":[{"line_number":673,"context_line":"def get_vm_ref_from_vm_uuid(session, instance_uuid):"},{"line_number":674,"context_line":"    vm_refs \u003d session._call_method("},{"line_number":675,"context_line":"        session._get_vim(),"},{"line_number":676,"context_line":"        \"FindAllByUuid\","},{"line_number":677,"context_line":"        session._get_vim().get_service_content().searchIndex,"},{"line_number":678,"context_line":"        uuid\u003dinstance_uuid,"},{"line_number":679,"context_line":"        vmSearch\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9JmE%3D","line":676,"updated":"2013-12-16 10:05:24.000000000","message":"I guess this is the better way to search by UUID compared to using extraConfig as in https://review.openstack.org/#/c/59571 ?","commit_id":"928416a7a1934a9f15704b9a792d010a94b5f742"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"ee4ec92ac16c9b7e4532b27053bbdeee49ecff01","unresolved":false,"context_lines":[{"line_number":690,"context_line":"        return vm_ref"},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"    vm_ref \u003d (get_vm_ref_from_vm_uuid(session, uuid) or"},{"line_number":693,"context_line":"                  get_vm_ref_from_uuid(session, uuid) or"},{"line_number":694,"context_line":"                  get_vm_ref_from_name(session, instance[\u0027name\u0027]))"},{"line_number":695,"context_line":"    if vm_ref is None:"},{"line_number":696,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9Jlc%3D","line":693,"updated":"2013-12-16 10:05:24.000000000","message":"nit: align vertically get_XXX","commit_id":"928416a7a1934a9f15704b9a792d010a94b5f742"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"61ea6b79dd815e6ec32b11ccee6cfe26e82529fb","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FM20%3D","line":33,"updated":"2014-01-16 14:32:53.000000000","message":"I\u0027m concerned about holding these references indefinitely. This is basically a very long lived cache.","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0f821e024d67ec946d79cece872c324c48f35365","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FBms%3D","line":33,"in_reply_to":"AAAAUH%2F%2FLyM%3D","updated":"2014-01-18 16:25:35.000000000","message":"Why should the cache age? It is dictated by the Nova instance management.","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"24b3a624e74bffe0d512b3fa58cd53489f388076","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FMQ8%3D","line":33,"in_reply_to":"AAAAUH%2F%2FM20%3D","updated":"2014-01-16 15:50:42.000000000","message":"Yes, that is the intent. When nova adds a instance it is registered here and when it is deleted it is removed.","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"648c15bc4dbaad76a86e183a7a886c4b98d59ee1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FLyM%3D","line":33,"in_reply_to":"AAAAUH%2F%2FMQ8%3D","updated":"2014-01-16 16:53:33.000000000","message":"That I understood. I\u0027m objecting to a cache that never invalidates and never ages.","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"648c15bc4dbaad76a86e183a7a886c4b98d59ee1","unresolved":false,"context_lines":[{"line_number":662,"context_line":"                                    _get_object_for_value)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"def get_vm_ref_from_uuid(session, instance_uuid):"},{"line_number":666,"context_line":"    \"\"\"Get reference to the VM with the uuid specified.\"\"\""},{"line_number":667,"context_line":"    vms \u003d session._call_method(vim_util, \"get_objects\","},{"line_number":668,"context_line":"                \"VirtualMachine\", [\"name\"])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FLyQ%3D","line":665,"updated":"2014-01-16 16:53:33.000000000","message":"You would get far more performance improvement by rewriting this method to *not* fetch every VirtualMachine object in vCenter...","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0f821e024d67ec946d79cece872c324c48f35365","unresolved":false,"context_lines":[{"line_number":662,"context_line":"                                    _get_object_for_value)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"def get_vm_ref_from_uuid(session, instance_uuid):"},{"line_number":666,"context_line":"    \"\"\"Get reference to the VM with the uuid specified.\"\"\""},{"line_number":667,"context_line":"    vms \u003d session._call_method(vim_util, \"get_objects\","},{"line_number":668,"context_line":"                \"VirtualMachine\", [\"name\"])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FBnc%3D","line":665,"in_reply_to":"AAAAUH%2F%2FLyQ%3D","updated":"2014-01-18 16:25:35.000000000","message":"there is no need to rewrite that method - this is only used in the worst case scenario when the get_vm_ref_from_vm_uuid fails.\nplease look at http://pubs.vmware.com/vsphere-51/index.jsp?topic\u003d%2Fcom.vmware.wssdk.apiref.doc%2Fvim.SearchIndex.html","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"7b98257d9f5b7f618e8d43a6ae4e70510d7065fa","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BtxM%3D","line":33,"updated":"2014-01-22 21:17:47.000000000","message":"I don\u0027t like this dictionary as a cache floating in a utility module.","commit_id":"c0431cb0e03fbc93643ef73cc28b148627ceaa99"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d6597586d4106c4b9a9138808c1f2ab2ec6b0ea1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BqQU%3D","line":33,"in_reply_to":"AAAAUH%2F%2BtxM%3D","updated":"2014-01-23 13:26:00.000000000","message":"What do you mean a cache floating utility module. The file is a utility file for VM management. This now has the addition of a dictionary mapping the instance UUID to the VM moref. Can you please suggest a more appropriate place for something like this to be?","commit_id":"c0431cb0e03fbc93643ef73cc28b148627ceaa99"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"efc8f76f2d0a8a41b9a63f5f84d6eb0664a4c78f","unresolved":false,"context_lines":[{"line_number":665,"context_line":"def get_vm_ref_from_uuid(session, instance_uuid):"},{"line_number":666,"context_line":"    \"\"\"Get reference to the VM with the uuid specified.\"\"\""},{"line_number":667,"context_line":"    vms \u003d session._call_method(vim_util, \"get_objects\","},{"line_number":668,"context_line":"                \"VirtualMachine\", [\"name\"])"},{"line_number":669,"context_line":"    return _get_object_from_results(session, vms, instance_uuid,"},{"line_number":670,"context_line":"                                    _get_object_for_value)"},{"line_number":671,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Btwc%3D","line":668,"updated":"2014-01-22 21:19:37.000000000","message":"This is a horrendously bad algorithm. It searches *all* VirtualMachine objects on the vCenter/ESX host. This is the same as \"select * from table\" then iterating over all results. Surely, you can conceive of a better way of doing this?","commit_id":"c0431cb0e03fbc93643ef73cc28b148627ceaa99"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d6597586d4106c4b9a9138808c1f2ab2ec6b0ea1","unresolved":false,"context_lines":[{"line_number":665,"context_line":"def get_vm_ref_from_uuid(session, instance_uuid):"},{"line_number":666,"context_line":"    \"\"\"Get reference to the VM with the uuid specified.\"\"\""},{"line_number":667,"context_line":"    vms \u003d session._call_method(vim_util, \"get_objects\","},{"line_number":668,"context_line":"                \"VirtualMachine\", [\"name\"])"},{"line_number":669,"context_line":"    return _get_object_from_results(session, vms, instance_uuid,"},{"line_number":670,"context_line":"                                    _get_object_for_value)"},{"line_number":671,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BqPc%3D","line":668,"in_reply_to":"AAAAUH%2F%2Btwc%3D","updated":"2014-01-23 13:26:00.000000000","message":"That is exactly what has been done below. In order to prevent iterating over all of the instances like you have described above then the SDK has provided an API FindAllByUuid. So instead of doing something O(N) you are doing it in O(1).\n\nIn addition to that we are also caching the results. This is to save the interface with the VC/ESX. That too is an optimization.","commit_id":"c0431cb0e03fbc93643ef73cc28b148627ceaa99"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"c542b7a197eb589ca08bb4d4ef37cb51b8a1f1b1","unresolved":false,"context_lines":[{"line_number":659,"context_line":"    vm_ref \u003d get_vm_ref_from_name(session, vm_uuid)"},{"line_number":660,"context_line":"    vm_ref_delete(vm_uuid)"},{"line_number":661,"context_line":"    return vm_ref"},{"line_number":662,"context_line":" "},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"def get_vm_ref_from_name(session, vm_name):"},{"line_number":665,"context_line":"    \"\"\"Get reference to the VM with the name specified.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2Bpyg%3D","line":662,"updated":"2014-01-23 14:33:39.000000000","message":"whitespace","commit_id":"e42deb543ac8fb150fd0c3b540c07a983461d875"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"c542b7a197eb589ca08bb4d4ef37cb51b8a1f1b1","unresolved":false,"context_lines":[{"line_number":701,"context_line":"                  get_vm_ref_from_name(session, instance[\u0027name\u0027]))"},{"line_number":702,"context_line":"    if vm_ref is None:"},{"line_number":703,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":704,"context_line":"    _VM_REFS[uuid] \u003d vm_ref"},{"line_number":705,"context_line":"    return vm_ref"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2Bpx4%3D","line":704,"updated":"2014-01-23 14:33:39.000000000","message":"consistency -1: \n* line 695 hides the cache object\n* line 704 exposes it","commit_id":"e42deb543ac8fb150fd0c3b540c07a983461d875"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"b28172f3c2ee26253c4a815cd15ed6ce26297070","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from nova.virt.vmwareapi import vim_util"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":"_VM_REFS \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def vm_refs_reset():"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bpu4%3D","line":33,"updated":"2014-01-23 14:38:40.000000000","message":"it is apparent that this is a global cache here... this is *global* so its name should reflect its function *globally* us name _VM_REFS_CACHE","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"b28172f3c2ee26253c4a815cd15ed6ce26297070","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    _VM_REFS.pop(uuid, None)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def vm_ref_get(uuid):"},{"line_number":46,"context_line":"    return _VM_REFS.get(uuid)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BpvQ%3D","line":45,"updated":"2014-01-23 14:38:40.000000000","message":"confusion -1:\nthis vm_ref_get does not actually get vm_ref unless it is cached.","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"78a6fe5832387a149aa5226730943c9b3e3b0b6b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    _VM_REFS.pop(uuid, None)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def vm_ref_get(uuid):"},{"line_number":46,"context_line":"    return _VM_REFS.get(uuid)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bpec%3D","line":45,"in_reply_to":"AAAAUH%2F%2BpvQ%3D","updated":"2014-01-23 15:23:56.000000000","message":"please look at line 695. in order to check that an entry is in the cache you need to read form the cache. that is what this does. if the entry is not in the cache then None is returned and it will interface with the back end and then populate the cache. next time this is referenced then it will return the moref.","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"b28172f3c2ee26253c4a815cd15ed6ce26297070","unresolved":false,"context_lines":[{"line_number":701,"context_line":"                  get_vm_ref_from_name(session, instance[\u0027name\u0027]))"},{"line_number":702,"context_line":"    if vm_ref is None:"},{"line_number":703,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":704,"context_line":"    _VM_REFS[uuid] \u003d vm_ref"},{"line_number":705,"context_line":"    return vm_ref"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bpvo%3D","line":704,"updated":"2014-01-23 14:38:40.000000000","message":"consistency -1:\n\n line 695 you hide the naked cache implementation with a method\n line 704 you interact with the cache directly","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"78a6fe5832387a149aa5226730943c9b3e3b0b6b","unresolved":false,"context_lines":[{"line_number":701,"context_line":"                  get_vm_ref_from_name(session, instance[\u0027name\u0027]))"},{"line_number":702,"context_line":"    if vm_ref is None:"},{"line_number":703,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":704,"context_line":"    _VM_REFS[uuid] \u003d vm_ref"},{"line_number":705,"context_line":"    return vm_ref"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BpeQ%3D","line":704,"in_reply_to":"AAAAUH%2F%2Bpvo%3D","updated":"2014-01-23 15:23:56.000000000","message":"not sure that i understand. this is how a cache works. what do you mean here?","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"33f205bdf2297218e19238b1138e2b18e94012e9","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def vm_ref_get(uuid):"},{"line_number":49,"context_line":"    return _VM_REFS_CACHE.get(uuid)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def build_datastore_path(datastore_name, path):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BpXY%3D","line":49,"updated":"2014-01-23 15:37:45.000000000","message":"clarity -1:\n this does not get vm refs this gets them from cache","commit_id":"adc7fcc4a8c288634e9f437548daec0d03700086"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"33f205bdf2297218e19238b1138e2b18e94012e9","unresolved":false,"context_lines":[{"line_number":706,"context_line":"    if vm_ref is None:"},{"line_number":707,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":708,"context_line":"    # Cache the vm_ref for future reference"},{"line_number":709,"context_line":"    _VM_REFS_CACHE[uuid] \u003d vm_ref"},{"line_number":710,"context_line":"    return vm_ref"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BpXo%3D","line":709,"updated":"2014-01-23 15:37:45.000000000","message":"consistency -1:\n see previous comment","commit_id":"adc7fcc4a8c288634e9f437548daec0d03700086"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"2ec8d07cd5a2923835cf99593aec6d3f2acae1f5","unresolved":false,"context_lines":[{"line_number":670,"context_line":""},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"def get_vm_ref_from_name(session, vm_name,"},{"line_number":673,"context_line":"                         purge_instance_uuid\u003dNone):"},{"line_number":674,"context_line":"    vm_ref \u003d _get_vm_ref_from_name(session, vm_name)"},{"line_number":675,"context_line":"    if purge_instance_uuid:"},{"line_number":676,"context_line":"        vm_ref_cache_delete(purge_instance_uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2BpJU%3D","line":673,"updated":"2014-01-23 16:12:22.000000000","message":"I still don\u0027t like mixing the cache mechanism with the rest of this logic, but this is much better than exposing the cache outside the module.","commit_id":"1f4d7d15de69d485858a854bf4c420dc8a700eda"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"2ec8d07cd5a2923835cf99593aec6d3f2acae1f5","unresolved":false,"context_lines":[{"line_number":710,"context_line":"    if vm_ref is None:"},{"line_number":711,"context_line":"        raise exception.InstanceNotFound(instance_id\u003duuid)"},{"line_number":712,"context_line":"    # Cache the vm_ref for future reference"},{"line_number":713,"context_line":"    vm_ref_cache_update(uuid, vm_ref)"},{"line_number":714,"context_line":"    return vm_ref"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2BpKE%3D","line":713,"updated":"2014-01-23 16:12:22.000000000","message":"much clearer.","commit_id":"1f4d7d15de69d485858a854bf4c420dc8a700eda"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"441b2ccc7aa8300fced46d69b44fd3bf14e94365","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            vm_ref \u003d func(session, instance)"},{"line_number":64,"context_line":"            vm_ref_cache_update(uuid, vm_ref)"},{"line_number":65,"context_line":"        return vm_ref"},{"line_number":66,"context_line":"    return wrapper"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def build_datastore_path(datastore_name, path):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BHFk%3D","line":66,"updated":"2014-01-30 01:55:59.000000000","message":"Impressive.","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0b2cfbfbe4dee78e4302187a34c67340c98e9d59","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            vm_ref \u003d func(session, instance)"},{"line_number":64,"context_line":"            vm_ref_cache_update(uuid, vm_ref)"},{"line_number":65,"context_line":"        return vm_ref"},{"line_number":66,"context_line":"    return wrapper"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def build_datastore_path(datastore_name, path):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BF94%3D","line":66,"in_reply_to":"AAAAUH%2F%2BHFk%3D","updated":"2014-01-30 07:12:22.000000000","message":"thank you","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"65c04989b83769532ca2c747ef74c14a6d87f308","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    config_spec.guestId \u003d os_type"},{"line_number":94,"context_line":"    # The name is the unique identifier for the VM. This will either be the"},{"line_number":95,"context_line":"    # instance UUID or the instance UUID with suffix \u0027-rescue\u0027 for VM\u0027s that"},{"line_number":96,"context_line":"    # are in rescus mode"},{"line_number":97,"context_line":"    config_spec.instanceUuid \u003d name"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    # Allow nested ESX instances to host 64 bit VMs."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FWCo%3D","line":96,"updated":"2014-02-13 20:40:55.000000000","message":"s/rescus/rescue/","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"96df76260f78411c0cf6ef19d277cdc9863b8dc2","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    config_spec.guestId \u003d os_type"},{"line_number":94,"context_line":"    # The name is the unique identifier for the VM. This will either be the"},{"line_number":95,"context_line":"    # instance UUID or the instance UUID with suffix \u0027-rescue\u0027 for VM\u0027s that"},{"line_number":96,"context_line":"    # are in rescus mode"},{"line_number":97,"context_line":"    config_spec.instanceUuid \u003d name"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    # Allow nested ESX instances to host 64 bit VMs."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FSkQ%3D","line":96,"in_reply_to":"AAAAUX%2F%2FWCo%3D","updated":"2014-02-14 07:23:43.000000000","message":"Done","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"65c04989b83769532ca2c747ef74c14a6d87f308","unresolved":false,"context_lines":[{"line_number":686,"context_line":""},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"def get_vm_ref_from_name(session, vm_name,"},{"line_number":689,"context_line":"                         purge_instance_uuid\u003dNone):"},{"line_number":690,"context_line":"    vm_ref \u003d _get_vm_ref_from_name(session, vm_name)"},{"line_number":691,"context_line":"    if purge_instance_uuid:"},{"line_number":692,"context_line":"        vm_ref_cache_delete(purge_instance_uuid)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FWD8%3D","line":689,"updated":"2014-02-13 20:40:55.000000000","message":"My first thought was that this should default to False, but now I see that it\u0027s passing through a uuid to purge.  This seems unexpected to me, given the name of the method.  I would prefer to see an explicit purge method, or a purge_from_cache parameter that took True/False and purged the retrieved vm.","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"96df76260f78411c0cf6ef19d277cdc9863b8dc2","unresolved":false,"context_lines":[{"line_number":686,"context_line":""},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"def get_vm_ref_from_name(session, vm_name,"},{"line_number":689,"context_line":"                         purge_instance_uuid\u003dNone):"},{"line_number":690,"context_line":"    vm_ref \u003d _get_vm_ref_from_name(session, vm_name)"},{"line_number":691,"context_line":"    if purge_instance_uuid:"},{"line_number":692,"context_line":"        vm_ref_cache_delete(purge_instance_uuid)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FSe8%3D","line":689,"in_reply_to":"AAAAUX%2F%2FWD8%3D","updated":"2014-02-14 07:23:43.000000000","message":"Done","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"6e6dd9e50fcb064c140f714d204a95ed542e6604","unresolved":false,"context_lines":[{"line_number":33,"context_line":"# and the value is the VM reference. The VM name is unique. This"},{"line_number":34,"context_line":"# is either the UUID of the instance or UUID-rescue in the case"},{"line_number":35,"context_line":"# that this is a recue VM. This is in order to prevent"},{"line_number":36,"context_line":"# unnecesary communication with the backend."},{"line_number":37,"context_line":"_VM_REFS_CACHE \u003d {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FR5U%3D","line":36,"updated":"2014-02-14 09:48:17.000000000","message":"s/unnecesary/unnecessary/","commit_id":"085df49c5b5a4ea71cf9fe3dba4a785febd15e5f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2e32726f0ed214f15ef93f81d6ae79159430764c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"# and the value is the VM reference. The VM name is unique. This"},{"line_number":34,"context_line":"# is either the UUID of the instance or UUID-rescue in the case"},{"line_number":35,"context_line":"# that this is a recue VM. This is in order to prevent"},{"line_number":36,"context_line":"# unnecesary communication with the backend."},{"line_number":37,"context_line":"_VM_REFS_CACHE \u003d {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FRSM%3D","line":36,"in_reply_to":"AAAAUX%2F%2FR5U%3D","updated":"2014-02-14 11:07:33.000000000","message":"Done","commit_id":"085df49c5b5a4ea71cf9fe3dba4a785febd15e5f"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"6e6dd9e50fcb064c140f714d204a95ed542e6604","unresolved":false,"context_lines":[{"line_number":702,"context_line":"    return vm_ref"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"def get_vm_ref_from_uuid(session, instance_uuid):"},{"line_number":706,"context_line":"    \"\"\"Get reference to the VM with the uuid specified.\"\"\""},{"line_number":707,"context_line":"    vms \u003d session._call_method(vim_util, \"get_objects\","},{"line_number":708,"context_line":"                \"VirtualMachine\", [\"name\"])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FRrE%3D","line":705,"updated":"2014-02-14 09:48:17.000000000","message":"Same comment as for get_vm_ref_from_vm_uuid","commit_id":"085df49c5b5a4ea71cf9fe3dba4a785febd15e5f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2e32726f0ed214f15ef93f81d6ae79159430764c","unresolved":false,"context_lines":[{"line_number":702,"context_line":"    return vm_ref"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"def get_vm_ref_from_uuid(session, instance_uuid):"},{"line_number":706,"context_line":"    \"\"\"Get reference to the VM with the uuid specified.\"\"\""},{"line_number":707,"context_line":"    vms \u003d session._call_method(vim_util, \"get_objects\","},{"line_number":708,"context_line":"                \"VirtualMachine\", [\"name\"])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FRRY%3D","line":705,"in_reply_to":"AAAAUX%2F%2FRrE%3D","updated":"2014-02-14 11:07:33.000000000","message":"Done","commit_id":"085df49c5b5a4ea71cf9fe3dba4a785febd15e5f"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"6e6dd9e50fcb064c140f714d204a95ed542e6604","unresolved":false,"context_lines":[{"line_number":710,"context_line":"                                    _get_object_for_value)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"def get_vm_ref_from_vm_uuid(session, instance_uuid):"},{"line_number":714,"context_line":"    vm_refs \u003d session._call_method("},{"line_number":715,"context_line":"        session._get_vim(),"},{"line_number":716,"context_line":"        \"FindAllByUuid\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FRrc%3D","line":713,"updated":"2014-02-14 09:48:17.000000000","message":"I think this should be a non-public function and its name should start with underscore. My understanding is that we want clients to always use the reference cache, so we want only get_vm_ref_from_name() and get_vm_ref() to be \"public\".","commit_id":"085df49c5b5a4ea71cf9fe3dba4a785febd15e5f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2e32726f0ed214f15ef93f81d6ae79159430764c","unresolved":false,"context_lines":[{"line_number":710,"context_line":"                                    _get_object_for_value)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"def get_vm_ref_from_vm_uuid(session, instance_uuid):"},{"line_number":714,"context_line":"    vm_refs \u003d session._call_method("},{"line_number":715,"context_line":"        session._get_vim(),"},{"line_number":716,"context_line":"        \"FindAllByUuid\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUX%2F%2FRRU%3D","line":713,"in_reply_to":"AAAAUX%2F%2FRrc%3D","updated":"2014-02-14 11:07:33.000000000","message":"Done","commit_id":"085df49c5b5a4ea71cf9fe3dba4a785febd15e5f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d695c598f18b43b911671a91cededdeb35864536","unresolved":false,"context_lines":[{"line_number":32,"context_line":"# A cache for VM references. The key will be the VM name"},{"line_number":33,"context_line":"# and the value is the VM reference. The VM name is unique. This"},{"line_number":34,"context_line":"# is either the UUID of the instance or UUID-rescue in the case"},{"line_number":35,"context_line":"# that this is a recue VM. This is in order to prevent"},{"line_number":36,"context_line":"# unnecessary communication with the backend."},{"line_number":37,"context_line":"_VM_REFS_CACHE \u003d {}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B9qA%3D","line":35,"updated":"2014-02-18 00:04:45.000000000","message":"\"rescue\" is misspelled.","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"219d7dc4976b8b0f2b7114ea3d818fa5c90d897c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"# A cache for VM references. The key will be the VM name"},{"line_number":33,"context_line":"# and the value is the VM reference. The VM name is unique. This"},{"line_number":34,"context_line":"# is either the UUID of the instance or UUID-rescue in the case"},{"line_number":35,"context_line":"# that this is a recue VM. This is in order to prevent"},{"line_number":36,"context_line":"# unnecessary communication with the backend."},{"line_number":37,"context_line":"_VM_REFS_CACHE \u003d {}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B6Gc%3D","line":35,"in_reply_to":"AAAAUX%2F%2B9qA%3D","updated":"2014-02-18 10:01:28.000000000","message":"Done","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d695c598f18b43b911671a91cededdeb35864536","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    # The name is the unique identifier for the VM. This will either be the"},{"line_number":95,"context_line":"    # instance UUID or the instance UUID with suffix \u0027-rescue\u0027 for VM\u0027s that"},{"line_number":96,"context_line":"    # are in rescue mode"},{"line_number":97,"context_line":"    config_spec.instanceUuid \u003d name"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    # Allow nested ESX instances to host 64 bit VMs."},{"line_number":100,"context_line":"    if os_type \u003d\u003d \"vmkernel5Guest\":"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B9o0%3D","line":97,"updated":"2014-02-18 00:04:45.000000000","message":"For instances that have been created before the code is rolled to this point, what happens? If this is null, will it be uncacheable? Or will there be collisions?","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"219d7dc4976b8b0f2b7114ea3d818fa5c90d897c","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    # The name is the unique identifier for the VM. This will either be the"},{"line_number":95,"context_line":"    # instance UUID or the instance UUID with suffix \u0027-rescue\u0027 for VM\u0027s that"},{"line_number":96,"context_line":"    # are in rescue mode"},{"line_number":97,"context_line":"    config_spec.instanceUuid \u003d name"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    # Allow nested ESX instances to host 64 bit VMs."},{"line_number":100,"context_line":"    if os_type \u003d\u003d \"vmkernel5Guest\":"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B6Cw%3D","line":97,"in_reply_to":"AAAAUX%2F%2B9o0%3D","updated":"2014-02-18 10:01:28.000000000","message":"Good question. An instance that is created prior to this fix will be unaffected. When an instance that was created priot to this patch is accessed the method get_vm_ref will be invoked. This will first try and check if the instance moref can be accessed via FindAllByUuid. This will return an empty list as the above parameter has not been configured. The moref will then be accessed via _get_vm_ref_from_uuid or _get_vm_ref_from_name (those are the method that are heavy on the CPU). Once the moref has been found it will be cahced in memory and then will be accessed by O(1) and not having to request from the backend.\n\nI will add to the commit message that this is backward compatible.","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d695c598f18b43b911671a91cededdeb35864536","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                                    _get_object_for_value)"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"def get_vm_ref_from_name(session, vm_name, purge_vm_ref\u003dFalse):"},{"line_number":693,"context_line":"    vm_ref \u003d (vm_ref_cache_get(vm_name) or"},{"line_number":694,"context_line":"                  _get_vm_ref_from_vm_uuid(session, vm_name) or"},{"line_number":695,"context_line":"                  _get_vm_ref_from_name(session, vm_name))"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B9oo%3D","line":692,"updated":"2014-02-18 00:04:45.000000000","message":"It seems very odd to me that the way the cache is purged of an instance is to call \"get\" with \"purge\u003dTrue\"","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"219d7dc4976b8b0f2b7114ea3d818fa5c90d897c","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                                    _get_object_for_value)"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":""},{"line_number":692,"context_line":"def get_vm_ref_from_name(session, vm_name, purge_vm_ref\u003dFalse):"},{"line_number":693,"context_line":"    vm_ref \u003d (vm_ref_cache_get(vm_name) or"},{"line_number":694,"context_line":"                  _get_vm_ref_from_vm_uuid(session, vm_name) or"},{"line_number":695,"context_line":"                  _get_vm_ref_from_name(session, vm_name))"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B6BI%3D","line":692,"in_reply_to":"AAAAUX%2F%2B9oo%3D","updated":"2014-02-18 10:01:28.000000000","message":"Please see https://review.openstack.org/#/c/60259/5/nova/virt/vmwareapi/vmops.py. This was the original solution. A few people reviewing the code felt like the cache should not be exposed to different files - hence the purge parameter here. I agree with you that this is very odd and have dropped the purge.","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d695c598f18b43b911671a91cededdeb35864536","unresolved":false,"context_lines":[{"line_number":710,"context_line":"                                    _get_object_for_value)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"def _get_vm_ref_from_vm_uuid(session, instance_uuid):"},{"line_number":714,"context_line":"    vm_refs \u003d session._call_method("},{"line_number":715,"context_line":"        session._get_vim(),"},{"line_number":716,"context_line":"        \"FindAllByUuid\","}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B9o8%3D","line":713,"updated":"2014-02-18 00:04:45.000000000","message":"This looks strikingly similar to the method above. I don\u0027t see a docstring on this one explaining why/how it\u0027s different and it\u0027s not apparent from looking at the code. Can you unify or better document these?","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"219d7dc4976b8b0f2b7114ea3d818fa5c90d897c","unresolved":false,"context_lines":[{"line_number":710,"context_line":"                                    _get_object_for_value)"},{"line_number":711,"context_line":""},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"def _get_vm_ref_from_vm_uuid(session, instance_uuid):"},{"line_number":714,"context_line":"    vm_refs \u003d session._call_method("},{"line_number":715,"context_line":"        session._get_vim(),"},{"line_number":716,"context_line":"        \"FindAllByUuid\","}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B6Ak%3D","line":713,"in_reply_to":"AAAAUX%2F%2B9o8%3D","updated":"2014-02-18 10:01:28.000000000","message":"Done","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"7bdc11ce18b23fe992f395d46c0691a6b7d38d56","unresolved":false,"context_lines":[{"line_number":693,"context_line":"                                    _get_object_for_value)"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"def get_vm_ref_from_name(session, vm_name, purge_vm_ref\u003dFalse):"},{"line_number":697,"context_line":"    vm_ref \u003d (vm_ref_cache_get(vm_name) or"},{"line_number":698,"context_line":"                  _get_vm_ref_from_vm_uuid(session, vm_name) or"},{"line_number":699,"context_line":"                  _get_vm_ref_from_name(session, vm_name))"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2B2HA%3D","line":696,"updated":"2014-02-18 16:53:54.000000000","message":"You\u0027ve eliminated the code that used purge_vm_ref, but you forgot to drop the argument as well…","commit_id":"5193241d95c97ad3b7ab15177bddf81f7aaedb92"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f06752237163888949965be06f45c5a0f3cb3abb","unresolved":false,"context_lines":[{"line_number":693,"context_line":"                                    _get_object_for_value)"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"def get_vm_ref_from_name(session, vm_name, purge_vm_ref\u003dFalse):"},{"line_number":697,"context_line":"    vm_ref \u003d (vm_ref_cache_get(vm_name) or"},{"line_number":698,"context_line":"                  _get_vm_ref_from_vm_uuid(session, vm_name) or"},{"line_number":699,"context_line":"                  _get_vm_ref_from_name(session, vm_name))"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2B1zg%3D","line":696,"in_reply_to":"AAAAUX%2F%2B2HA%3D","updated":"2014-02-18 17:25:20.000000000","message":"Done","commit_id":"5193241d95c97ad3b7ab15177bddf81f7aaedb92"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"27e99a96f8bb93afffd9ce232a3fbcb93537b1b9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    return wrapper"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def vm_ref_delete(id):"},{"line_number":70,"context_line":"    vm_ref_cache_delete(id)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bkfc%3D","line":69,"updated":"2014-02-20 13:15:41.000000000","message":"This is really vm_ref_delete_from_cache. The name as is is really missleading","commit_id":"095da03a4f52ff57b71d6b19b199ebea61adb849"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8490a42d11bf79e5522b4e0f0153ad833752b8c3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    return wrapper"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def vm_ref_delete(id):"},{"line_number":70,"context_line":"    vm_ref_cache_delete(id)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2BkNY%3D","line":69,"in_reply_to":"AAAAUX%2F%2Bkfc%3D","updated":"2014-02-20 14:13:38.000000000","message":"Done","commit_id":"095da03a4f52ff57b71d6b19b199ebea61adb849"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"27e99a96f8bb93afffd9ce232a3fbcb93537b1b9","unresolved":false,"context_lines":[{"line_number":694,"context_line":""},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"def get_vm_ref_from_name(session, vm_name):"},{"line_number":697,"context_line":"    vm_ref \u003d (vm_ref_cache_get(vm_name) or"},{"line_number":698,"context_line":"                  _get_vm_ref_from_vm_uuid(session, vm_name) or"},{"line_number":699,"context_line":"                  _get_vm_ref_from_name(session, vm_name))"},{"line_number":700,"context_line":"    # Cache the vm_ref for future reference"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2BkiE%3D","line":697,"updated":"2014-02-20 13:15:41.000000000","message":"Can\u0027t we make the decorator a bit more generic so that we don\u0027t have to call the cache here directly, but we decorate another also public function from this module. Inconsistent and confusing if you ask me.","commit_id":"095da03a4f52ff57b71d6b19b199ebea61adb849"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8490a42d11bf79e5522b4e0f0153ad833752b8c3","unresolved":false,"context_lines":[{"line_number":694,"context_line":""},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"def get_vm_ref_from_name(session, vm_name):"},{"line_number":697,"context_line":"    vm_ref \u003d (vm_ref_cache_get(vm_name) or"},{"line_number":698,"context_line":"                  _get_vm_ref_from_vm_uuid(session, vm_name) or"},{"line_number":699,"context_line":"                  _get_vm_ref_from_name(session, vm_name))"},{"line_number":700,"context_line":"    # Cache the vm_ref for future reference"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bj8Q%3D","line":697,"in_reply_to":"AAAAUX%2F%2BkiE%3D","updated":"2014-02-20 14:13:38.000000000","message":"Done","commit_id":"095da03a4f52ff57b71d6b19b199ebea61adb849"}],"nova/virt/vmwareapi/vmops.py":[{"author":{"_account_id":8027,"name":"Vui Lam","email":"vui@vmware.com","username":"vui"},"change_message_id":"b1dca22106233c62e79114ab2760a3dd4f461746","unresolved":false,"context_lines":[{"line_number":966,"context_line":"                                 \"got this exception while deleting\""},{"line_number":967,"context_line":"                                 \" the VM contents from the disk: %s\")"},{"line_number":968,"context_line":"                                 % str(excep))"},{"line_number":969,"context_line":"                vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":970,"context_line":"        except Exception as exc:"},{"line_number":971,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":972,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Xi0%3D","line":969,"updated":"2013-12-12 07:47:13.000000000","message":"This is extraneous given the finally block. It should not have been under the \"if destroy_disks:\" block either.","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"eeae82374cc04151b49c3fc3f0fd9495b07b4806","unresolved":false,"context_lines":[{"line_number":966,"context_line":"                                 \"got this exception while deleting\""},{"line_number":967,"context_line":"                                 \" the VM contents from the disk: %s\")"},{"line_number":968,"context_line":"                                 % str(excep))"},{"line_number":969,"context_line":"                vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":970,"context_line":"        except Exception as exc:"},{"line_number":971,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":972,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F9Wbw%3D","line":969,"in_reply_to":"AAAATn%2F9Xi0%3D","updated":"2013-12-12 11:39:08.000000000","message":"Done","commit_id":"220915f8f542957109fc7620d52b08870db2f485"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"ee4ec92ac16c9b7e4532b27053bbdeee49ecff01","unresolved":false,"context_lines":[{"line_number":969,"context_line":"        except Exception as exc:"},{"line_number":970,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":971,"context_line":"        finally:"},{"line_number":972,"context_line":"            vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"    def pause(self, instance):"},{"line_number":975,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9JiI%3D","line":972,"updated":"2013-12-16 10:05:24.000000000","message":"I hope this will remain the one and only path for destroying instances because otherwise there will be memory leaks because of the cache.","commit_id":"928416a7a1934a9f15704b9a792d010a94b5f742"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"b04b6ea035a3471f3d9e5851879aaabd789bb845","unresolved":false,"context_lines":[{"line_number":970,"context_line":"        except Exception as exc:"},{"line_number":971,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":972,"context_line":"        finally:"},{"line_number":973,"context_line":"            vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    def pause(self, instance):"},{"line_number":976,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FLfc%3D","line":973,"updated":"2014-01-16 17:42:22.000000000","message":"This bugs me as well. You\u0027ve spread cache functions between two modules. This is called a \"tightly coupled\" system, and that\u0027s a warning sign of bad design.","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"0f821e024d67ec946d79cece872c324c48f35365","unresolved":false,"context_lines":[{"line_number":970,"context_line":"        except Exception as exc:"},{"line_number":971,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":972,"context_line":"        finally:"},{"line_number":973,"context_line":"            vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    def pause(self, instance):"},{"line_number":976,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FBm4%3D","line":973,"in_reply_to":"AAAAUH%2F%2FLfc%3D","updated":"2014-01-18 16:25:35.000000000","message":"The design is as follows:\nWhen a VM is added in the spawn method the VM spec is created. In order to have efficient query access to the VM the config spec filed for config_spec.instanceUuid is set with the UUID of instance.\nThe entry is cleared from the cache when the Nova VM is deleted. This is a symmetric operation.\nIn the event that the process restarts and there is a search for the moref of the instance and this is not found n the cache then we use get_vm_ref. This will once again populate the cache.","commit_id":"31d9e78ad75b5ca8589ae39844fce9de7e6c30a5"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"7b98257d9f5b7f618e8d43a6ae4e70510d7065fa","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"        except Exception as exc:"},{"line_number":1018,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":1019,"context_line":"        finally:"},{"line_number":1020,"context_line":"            vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"    def pause(self, instance):"},{"line_number":1023,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2Btxg%3D","line":1020,"updated":"2014-01-22 21:17:47.000000000","message":"This really bothers me. You are having to expose the cache at this point in a module that previously had no knowledge of caching.","commit_id":"c0431cb0e03fbc93643ef73cc28b148627ceaa99"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d6597586d4106c4b9a9138808c1f2ab2ec6b0ea1","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"        except Exception as exc:"},{"line_number":1018,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":1019,"context_line":"        finally:"},{"line_number":1020,"context_line":"            vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"    def pause(self, instance):"},{"line_number":1023,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2BqN0%3D","line":1020,"in_reply_to":"AAAAUH%2F%2Btxg%3D","updated":"2014-01-23 13:26:00.000000000","message":"I my opinion this is the best place to put this. The reason for this is this is where the vm comes to its final destination in its lifecycle. Just like we are indicating to the backend that it can purge all of its data for the VM we are also letting the vm_utility know that it can purge itself of the reference.\nI see no problem with this.","commit_id":"c0431cb0e03fbc93643ef73cc28b148627ceaa99"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"52cd89c6377b7c99dc5bed47fbf95f12a6705cb9","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        except Exception as exc:"},{"line_number":1028,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":1029,"context_line":"        finally:"},{"line_number":1030,"context_line":"            vm_util.vm_ref_delete(instance[\u0027uuid\u0027])"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"    def pause(self, instance):"},{"line_number":1033,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BqB4%3D","line":1030,"updated":"2014-01-23 13:46:17.000000000","message":"I will not +1 this patch as long as this line is here.","commit_id":"a500aeeb8d1197eaac2b47a481d5f9faf993da2c"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"c542b7a197eb589ca08bb4d4ef37cb51b8a1f1b1","unresolved":false,"context_lines":[{"line_number":964,"context_line":"        if not instance_name:"},{"line_number":965,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":966,"context_line":"        try:"},{"line_number":967,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name_and_purge_cache("},{"line_number":968,"context_line":"                    self._session, instance_name, instance[\u0027uuid\u0027])"},{"line_number":969,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":970,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2Bpys%3D","line":967,"updated":"2014-01-23 14:33:39.000000000","message":"I don\u0027t like \"and_purge_cache\" but this is better.","commit_id":"e42deb543ac8fb150fd0c3b540c07a983461d875"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"b28172f3c2ee26253c4a815cd15ed6ce26297070","unresolved":false,"context_lines":[{"line_number":964,"context_line":"        if not instance_name:"},{"line_number":965,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":966,"context_line":"        try:"},{"line_number":967,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name_and_purge_cache("},{"line_number":968,"context_line":"                    self._session, instance_name, instance[\u0027uuid\u0027])"},{"line_number":969,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":970,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BpwU%3D","line":967,"updated":"2014-01-23 14:38:40.000000000","message":"this feels like exposing an implementation detail. I don\u0027t like it but I won\u0027t -1 a patch just for this.\n\nI would prefer a kwargs flag called \"purge_cache\" which was default False but let you trigger the cache purge here.","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"78a6fe5832387a149aa5226730943c9b3e3b0b6b","unresolved":false,"context_lines":[{"line_number":964,"context_line":"        if not instance_name:"},{"line_number":965,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":966,"context_line":"        try:"},{"line_number":967,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name_and_purge_cache("},{"line_number":968,"context_line":"                    self._session, instance_name, instance[\u0027uuid\u0027])"},{"line_number":969,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":970,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bpd4%3D","line":967,"in_reply_to":"AAAAUH%2F%2BpwU%3D","updated":"2014-01-23 15:23:56.000000000","message":"Done","commit_id":"4bf09635b55958f30dc36a1d4e772b4ad595ee74"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"ae2ec293e22bf5803005f4845616981633dc60ce","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if not instance_name:"},{"line_number":967,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":968,"context_line":"        try:"},{"line_number":969,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session, instance_name,"},{"line_number":970,"context_line":"                    purge_instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":971,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":972,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BZUA%3D","line":969,"updated":"2014-01-27 12:03:46.000000000","message":"Now this function has both misleading name *and* side effects. I disagree with Shawn and I think that deleting the reference in the finally block was better.","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7e5ccf3ea466dfa070bde7f9c884e55d80351dc7","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if not instance_name:"},{"line_number":967,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":968,"context_line":"        try:"},{"line_number":969,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session, instance_name,"},{"line_number":970,"context_line":"                    purge_instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":971,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":972,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BJW4%3D","line":969,"in_reply_to":"AAAAUH%2F%2BJ%2BU%3D","updated":"2014-01-29 18:12:28.000000000","message":"That is exactly what the change does - the search for the VM is done by FindAllByUuid. This just retrieves the specific VM from the backend and not all of the VM\u0027s.","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"65c04989b83769532ca2c747ef74c14a6d87f308","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if not instance_name:"},{"line_number":967,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":968,"context_line":"        try:"},{"line_number":969,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session, instance_name,"},{"line_number":970,"context_line":"                    purge_instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":971,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":972,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FWBo%3D","line":969,"in_reply_to":"AAAAUH%2F%2BJW4%3D","updated":"2014-02-13 20:40:55.000000000","message":"I agree with the name and side-effects issue, which I mentioned by the method definition before I saw this comment chain.  I would rather see a True/False parameter that indicates it should be purged, and not allow arbitrary uuids to be passed in for purging.","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":7629,"name":"Shawn Hartsock","email":"hartsock@acm.org","username":"hartsocks"},"change_message_id":"fc7d862846b60507899598aea65bcf5d0e5d46a8","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if not instance_name:"},{"line_number":967,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":968,"context_line":"        try:"},{"line_number":969,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session, instance_name,"},{"line_number":970,"context_line":"                    purge_instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":971,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":972,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BJ%2BU%3D","line":969,"in_reply_to":"AAAAUH%2F%2BZUA%3D","updated":"2014-01-29 16:27:40.000000000","message":"I think we are in agreement about misleading names and side-effects. I very *strongly* object to working with the cache in the finally block here because this module should either have no knowledge of caching or it should have *all* knowledge of caching. This is a layer or \"Separation of Concerns\" issue. \n\nI would prefer to use @memoize which means we do not have to write our own cache and keeps cache a separate concern from our driver.\n\nSee: https://github.com/openstack/nova/blob/master/nova/api/ec2/ec2utils.py#L40\n\nHowever, I am not clear if this memoize was intended for general consumption as this memoize here was: http://docs.openstack.org/developer/horizon/sourcecode/horizon/horizon.utils.memoized.html\n\nNote:\nThe cache will only lessen the number of times the CPU is spiked to 100% due to network IO, fixing the root cause requires changing how the driver fetches VirtualMachine objects from vSphere.","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"96df76260f78411c0cf6ef19d277cdc9863b8dc2","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if not instance_name:"},{"line_number":967,"context_line":"            instance_name \u003d instance[\u0027uuid\u0027]"},{"line_number":968,"context_line":"        try:"},{"line_number":969,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session, instance_name,"},{"line_number":970,"context_line":"                    purge_instance_uuid\u003dinstance[\u0027uuid\u0027])"},{"line_number":971,"context_line":"            lst_properties \u003d [\"config.files.vmPathName\", \"runtime.powerState\","},{"line_number":972,"context_line":"                              \"datastore\"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUX%2F%2FSes%3D","line":969,"in_reply_to":"AAAAUX%2F%2FWBo%3D","updated":"2014-02-14 07:23:43.000000000","message":"Done","commit_id":"1e248b2a24a64da09b49e8467bf8996a28b5f678"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d695c598f18b43b911671a91cededdeb35864536","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            LOG.debug(_(\"Created VM on the ESX host\"), instance\u003dinstance)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        _execute_create_vm()"},{"line_number":306,"context_line":"        if instance_name !\u003d instance[\u0027uuid\u0027]:"},{"line_number":307,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session,"},{"line_number":308,"context_line":"                                                  instance_name)"},{"line_number":309,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B9nQ%3D","line":306,"updated":"2014-02-18 00:04:45.000000000","message":"This definitely seems worthy of an explanation. Especially given instance_name is set to instance[\u0027uuid\u0027] on line 287 as best I can tell.","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"219d7dc4976b8b0f2b7114ea3d818fa5c90d897c","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            LOG.debug(_(\"Created VM on the ESX host\"), instance\u003dinstance)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        _execute_create_vm()"},{"line_number":306,"context_line":"        if instance_name !\u003d instance[\u0027uuid\u0027]:"},{"line_number":307,"context_line":"            vm_ref \u003d vm_util.get_vm_ref_from_name(self._session,"},{"line_number":308,"context_line":"                                                  instance_name)"},{"line_number":309,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2B53Q%3D","line":306,"in_reply_to":"AAAAUX%2F%2B9nQ%3D","updated":"2014-02-18 10:01:28.000000000","message":"I have added a comment. In the case of a rescue VM the instance name is passed to the method.","commit_id":"dd674ffcb2f9841c8d2a5c7427beacbb48dcdcf7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"27e99a96f8bb93afffd9ce232a3fbcb93537b1b9","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        except Exception as exc:"},{"line_number":1036,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":1037,"context_line":"        finally:"},{"line_number":1038,"context_line":"            vm_util.vm_ref_delete(instance_name)"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def pause(self, instance):"},{"line_number":1041,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bkfs%3D","line":1038,"updated":"2014-02-20 13:15:41.000000000","message":"Is destroy the only place where we want to remove the instance from the cache? if so - it\u0027s fine, but if not - maybe we want to make this a bit more general. Also see the comment about the name","commit_id":"095da03a4f52ff57b71d6b19b199ebea61adb849"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8490a42d11bf79e5522b4e0f0153ad833752b8c3","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        except Exception as exc:"},{"line_number":1036,"context_line":"            LOG.exception(exc, instance\u003dinstance)"},{"line_number":1037,"context_line":"        finally:"},{"line_number":1038,"context_line":"            vm_util.vm_ref_delete(instance_name)"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def pause(self, instance):"},{"line_number":1041,"context_line":"        msg \u003d _(\"pause not supported for vmwareapi\")"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bj8M%3D","line":1038,"in_reply_to":"AAAAUX%2F%2Bkfs%3D","updated":"2014-02-20 14:13:38.000000000","message":"Done","commit_id":"095da03a4f52ff57b71d6b19b199ebea61adb849"}]}
