)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f2f0f2d477d25f9890d9934647177d2430c35e2c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"NOTE: the code is backward compatible. All newly created instances"},{"line_number":17,"context_line":"will be placed in the aforementioned folder. Existing instances will"},{"line_number":18,"context_line":"continue to work as usual."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I6c653cf580e844f121a6566c4f2cbe320531f4e4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"ba3cc151_73bc0606","line":19,"updated":"2015-07-09 14:26:03.000000000","message":"We should probably have a specless blueprint for this change, it\u0027s not a bug fix, it\u0027s really a feature, and we should track it as something that goes against the liberty series in launchpad with a blueprint (again, not saying you need a spec).  I\u0027ll ask in the nova meeting.","commit_id":"661c36ece4dd49f2d0b6c6b2db218961c4d6644e"}],"nova/tests/unit/virt/vmwareapi/fake.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":1281,"context_line":"        task_mdo \u003d create_task(method, \"success\", result\u003dvm_ref)"},{"line_number":1282,"context_line":"        return task_mdo.obj"},{"line_number":1283,"context_line":""},{"line_number":1284,"context_line":"    def _create_folder(self, method, *args, **kwargs):"},{"line_number":1285,"context_line":"        folder \u003d Folder()"},{"line_number":1286,"context_line":"        _create_object(\u0027Folder\u0027, folder)"},{"line_number":1287,"context_line":"        return folder.obj"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_9a56b15a","line":1284,"updated":"2015-12-19 15:23:11.000000000","message":"Why not just re-use the global create_folder method above that\u0027s doing the same thing except it would need to return the folder object?","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":1281,"context_line":"        task_mdo \u003d create_task(method, \"success\", result\u003dvm_ref)"},{"line_number":1282,"context_line":"        return task_mdo.obj"},{"line_number":1283,"context_line":""},{"line_number":1284,"context_line":"    def _create_folder(self, method, *args, **kwargs):"},{"line_number":1285,"context_line":"        folder \u003d Folder()"},{"line_number":1286,"context_line":"        _create_object(\u0027Folder\u0027, folder)"},{"line_number":1287,"context_line":"        return folder.obj"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_fb5fb4e2","line":1284,"in_reply_to":"3a7e1126_9a56b15a","updated":"2015-12-20 08:34:03.000000000","message":"Done","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e161961a390f21acade15cbdb32f14ea787f6f70","unresolved":false,"context_lines":[{"line_number":1314,"context_line":"        task_mdo \u003d create_task(method, \"success\", result\u003dvm_ref)"},{"line_number":1315,"context_line":"        return task_mdo.obj"},{"line_number":1316,"context_line":""},{"line_number":1317,"context_line":"    def _create_folder(self, method, *args, **kwargs):"},{"line_number":1318,"context_line":"        return create_folder()"},{"line_number":1319,"context_line":""},{"line_number":1320,"context_line":"    def _reconfig_vm(self, method, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a7b0d38_069e8256","line":1317,"updated":"2015-12-22 22:24:03.000000000","message":"Do we even need this method? I see the caller is following a pattern, but it seems unnecessary.","commit_id":"23907ba774dad5843beecaaa6e4fa6873946b2a3"}],"nova/tests/unit/virt/vmwareapi/test_vm_util.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":1327,"context_line":"        child_folder \u003d mock.sentinel.child_folder"},{"line_number":1328,"context_line":"        session \u003d fake.FakeSession()"},{"line_number":1329,"context_line":"        with mock.patch.object(session, \u0027_call_method\u0027,"},{"line_number":1330,"context_line":"                               side_effect \u003d [None, child_folder]):"},{"line_number":1331,"context_line":"            parent_folder \u003d mock.sentinel.parent_folder"},{"line_number":1332,"context_line":"            parent_folder.value \u003d \u0027parent-ref\u0027"},{"line_number":1333,"context_line":"            child_name \u003d \u0027child_folder\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_9c077d81","line":1330,"updated":"2015-07-02 14:26:59.000000000","message":"I\u0027m surprised there isn\u0027t a pep8 violation for whitespaces around the \u003d in a kwarg.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":1327,"context_line":"        child_folder \u003d mock.sentinel.child_folder"},{"line_number":1328,"context_line":"        session \u003d fake.FakeSession()"},{"line_number":1329,"context_line":"        with mock.patch.object(session, \u0027_call_method\u0027,"},{"line_number":1330,"context_line":"                               side_effect \u003d [None, child_folder]):"},{"line_number":1331,"context_line":"            parent_folder \u003d mock.sentinel.parent_folder"},{"line_number":1332,"context_line":"            parent_folder.value \u003d \u0027parent-ref\u0027"},{"line_number":1333,"context_line":"            child_name \u003d \u0027child_folder\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_1178ebf7","line":1330,"in_reply_to":"ba3cc151_9c077d81","updated":"2015-07-05 07:24:47.000000000","message":"Done","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"            ret \u003d vm_util.create_folder(session, parent_folder, child_name)"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"            self.assertEqual(child_folder, ret)"},{"line_number":1337,"context_line":"            expected_calls \u003d [mock.call(vutil, \u0027get_object_property\u0027,"},{"line_number":1338,"context_line":"                                        parent_folder,"},{"line_number":1339,"context_line":"                                       \u0027childEntity\u0027),"},{"line_number":1340,"context_line":"                              mock.call(session.vim, \u0027CreateFolder\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_fc700942","line":1337,"updated":"2015-07-02 14:26:59.000000000","message":"I\u0027d prefer that the vm_util._get_folder method were tested separately rather than as part of testing create_folder (could have mocked out _get_folder when testing create_folder), but I won\u0027t block on this.  It makes the tests a bit more fragile though.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"            ret \u003d vm_util.create_folder(session, parent_folder, child_name)"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"            self.assertEqual(child_folder, ret)"},{"line_number":1337,"context_line":"            expected_calls \u003d [mock.call(vutil, \u0027get_object_property\u0027,"},{"line_number":1338,"context_line":"                                        parent_folder,"},{"line_number":1339,"context_line":"                                       \u0027childEntity\u0027),"},{"line_number":1340,"context_line":"                              mock.call(session.vim, \u0027CreateFolder\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_34b43d7e","line":1337,"in_reply_to":"ba3cc151_fc700942","updated":"2015-07-05 07:24:47.000000000","message":"i think that this test with the one below covers all of the flows and each line of code is tested.\ni will add in a few extra tests to validate the _get_folder","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":1344,"context_line":""},{"line_number":1345,"context_line":"    def test_create_folder_not_present(self):"},{"line_number":1346,"context_line":"        \"\"\"Test create_folder when child not present.\"\"\""},{"line_number":1347,"context_line":"        prop_val \u003d mock.Mock(spec\u003dobject)"},{"line_number":1348,"context_line":"        prop_val.ManagedObjectReference \u003d []"},{"line_number":1349,"context_line":"        child_folder \u003d mock.sentinel.child_folder"},{"line_number":1350,"context_line":"        session \u003d fake.FakeSession()"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_9cb9bdce","line":1347,"updated":"2015-07-02 14:26:59.000000000","message":"I\u0027m not sure that how much effect spec\u003dobject has here?","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":1344,"context_line":""},{"line_number":1345,"context_line":"    def test_create_folder_not_present(self):"},{"line_number":1346,"context_line":"        \"\"\"Test create_folder when child not present.\"\"\""},{"line_number":1347,"context_line":"        prop_val \u003d mock.Mock(spec\u003dobject)"},{"line_number":1348,"context_line":"        prop_val.ManagedObjectReference \u003d []"},{"line_number":1349,"context_line":"        child_folder \u003d mock.sentinel.child_folder"},{"line_number":1350,"context_line":"        session \u003d fake.FakeSession()"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_317defe7","line":1347,"in_reply_to":"ba3cc151_9cb9bdce","updated":"2015-07-05 07:24:47.000000000","message":"Done","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":1372,"context_line":"        child_entity_1._type \u003d \u0027Folder\u0027"},{"line_number":1373,"context_line":"        child_entity_1_name \u003d \u0027SomeOtherName\u0027"},{"line_number":1374,"context_line":"        child_entity_2 \u003d mock.Mock(spec\u003dobject)"},{"line_number":1375,"context_line":"        child_entity_2._type \u003d \u0027Folder\u0027"},{"line_number":1376,"context_line":"        child_entity_2_name \u003d child_name"},{"line_number":1377,"context_line":"        prop_val.ManagedObjectReference \u003d [child_entity_1, child_entity_2]"},{"line_number":1378,"context_line":"        session \u003d fake.FakeSession()"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_77597234","line":1375,"updated":"2015-07-02 14:26:59.000000000","message":"You could make this a bit better with 3 children:\n\nThe first child has type Folder but the name doesn\u0027t match, the second child has some other type that isn\u0027t Folder so it\u0027s skipped, and then the third child is type Folder and the name matches.  That would hit all of your conditions in that loop.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":1372,"context_line":"        child_entity_1._type \u003d \u0027Folder\u0027"},{"line_number":1373,"context_line":"        child_entity_1_name \u003d \u0027SomeOtherName\u0027"},{"line_number":1374,"context_line":"        child_entity_2 \u003d mock.Mock(spec\u003dobject)"},{"line_number":1375,"context_line":"        child_entity_2._type \u003d \u0027Folder\u0027"},{"line_number":1376,"context_line":"        child_entity_2_name \u003d child_name"},{"line_number":1377,"context_line":"        prop_val.ManagedObjectReference \u003d [child_entity_1, child_entity_2]"},{"line_number":1378,"context_line":"        session \u003d fake.FakeSession()"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_da441b4b","line":1375,"in_reply_to":"ba3cc151_77597234","updated":"2015-07-05 07:24:47.000000000","message":"ok, i\u0027ll update","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"}],"nova/tests/unit/virt/vmwareapi/test_vmops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":943,"context_line":"                    \u0027image_id\u0027: image_id,"},{"line_number":944,"context_line":"                    \u0027version\u0027: version.version_string_with_package()})"},{"line_number":945,"context_line":""},{"line_number":946,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_create_folders\u0027,"},{"line_number":947,"context_line":"                       return_value\u003d\u0027fake_vm_folder\u0027)"},{"line_number":948,"context_line":"    @mock.patch(\u0027nova.virt.vmwareapi.vm_util.power_on_instance\u0027)"},{"line_number":949,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_use_disk_image_as_linked_clone\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_9a8b11c3","line":946,"updated":"2015-12-19 15:23:11.000000000","message":"From what I can tell, you\u0027re mocking out _create_folders in here everywhere, so what\u0027s testing the logic in _create_folders?","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"769140d269be0416c8afe7700d8cd557098ed43e","unresolved":false,"context_lines":[{"line_number":943,"context_line":"                    \u0027image_id\u0027: image_id,"},{"line_number":944,"context_line":"                    \u0027version\u0027: version.version_string_with_package()})"},{"line_number":945,"context_line":""},{"line_number":946,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_create_folders\u0027,"},{"line_number":947,"context_line":"                       return_value\u003d\u0027fake_vm_folder\u0027)"},{"line_number":948,"context_line":"    @mock.patch(\u0027nova.virt.vmwareapi.vm_util.power_on_instance\u0027)"},{"line_number":949,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_use_disk_image_as_linked_clone\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a7b0d38_66f186cd","line":946,"in_reply_to":"3a7e1126_7b742467","updated":"2015-12-22 22:08:30.000000000","message":"That\u0027s testing vm_util, not vmops._create_folder that has it\u0027s own logic and calls vm_util. And vmops._create_folders is mocked out everywhere in here, so it\u0027s not tested anywhere from what I can tell. i.e. I could probably pull this down, raise an exception in _create_folders and the unit tests wouldn\u0027t catch that.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":943,"context_line":"                    \u0027image_id\u0027: image_id,"},{"line_number":944,"context_line":"                    \u0027version\u0027: version.version_string_with_package()})"},{"line_number":945,"context_line":""},{"line_number":946,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_create_folders\u0027,"},{"line_number":947,"context_line":"                       return_value\u003d\u0027fake_vm_folder\u0027)"},{"line_number":948,"context_line":"    @mock.patch(\u0027nova.virt.vmwareapi.vm_util.power_on_instance\u0027)"},{"line_number":949,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_use_disk_image_as_linked_clone\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_7b742467","line":946,"in_reply_to":"3a7e1126_9a8b11c3","updated":"2015-12-20 08:34:03.000000000","message":"did you look at the test_vm_util changes that covers that pretty well. that was and is addressed in comments from june ...","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e161961a390f21acade15cbdb32f14ea787f6f70","unresolved":false,"context_lines":[{"line_number":944,"context_line":"                    \u0027image_id\u0027: image_id,"},{"line_number":945,"context_line":"                    \u0027version\u0027: version.version_string_with_package()})"},{"line_number":946,"context_line":""},{"line_number":947,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_create_folders\u0027,"},{"line_number":948,"context_line":"                       return_value\u003d\u0027fake_vm_folder\u0027)"},{"line_number":949,"context_line":"    @mock.patch(\u0027nova.virt.vmwareapi.vm_util.power_on_instance\u0027)"},{"line_number":950,"context_line":"    @mock.patch.object(vmops.VMwareVMOps, \u0027_use_disk_image_as_linked_clone\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a7b0d38_c6ce3a5a","line":947,"updated":"2015-12-22 22:24:03.000000000","message":"Following up on my reply to PS23, _create_folders could be nicely unit tested here in test_vmops, which I\u0027d like to see still, but it does look like without that, it\u0027s tested via the fakes and the test_driver_api module, I verified:\n\nhttp://paste.openstack.org/show/482557/\n\nSo I guess I won\u0027t block on this.","commit_id":"23907ba774dad5843beecaaa6e4fa6873946b2a3"}],"nova/virt/vmwareapi/vm_util.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# Format: {inventory_path: folder_ref}"},{"line_number":60,"context_line":"_FOLDER_PATH_REF_MAPPING \u003d {}"},{"line_number":61,"context_line":"# Format: {folder_ref.value: inventory_path}"},{"line_number":62,"context_line":"_FOLDER_REF_PATH_MAPPING \u003d {}"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# A cache for VM references. The key will be the VM name"},{"line_number":65,"context_line":"# and the value is the VM reference. The VM name is unique. This"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_b39fc74f","line":62,"updated":"2015-06-19 14:01:32.000000000","message":"This is unused.  Things are written to it but not read from it so what\u0027s the point?","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":59,"context_line":"# Format: {inventory_path: folder_ref}"},{"line_number":60,"context_line":"_FOLDER_PATH_REF_MAPPING \u003d {}"},{"line_number":61,"context_line":"# Format: {folder_ref.value: inventory_path}"},{"line_number":62,"context_line":"_FOLDER_REF_PATH_MAPPING \u003d {}"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"# A cache for VM references. The key will be the VM name"},{"line_number":65,"context_line":"# and the value is the VM reference. The VM name is unique. This"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_16af7e95","line":62,"in_reply_to":"fa32b979_b39fc74f","updated":"2015-06-21 07:43:57.000000000","message":"Yeah my bad","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":"def _get_folder(session, parent_folder_ref, name):"},{"line_number":1561,"context_line":"    # Get list of child entities for the parent folder"},{"line_number":1562,"context_line":"    prop_val \u003d session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1563,"context_line":"                                    parent_folder_ref,"},{"line_number":1564,"context_line":"                                    \u0027childEntity\u0027)"},{"line_number":1565,"context_line":"    if prop_val:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_1311d3af","line":1562,"updated":"2015-06-19 14:01:32.000000000","message":"prop_val is really subfolders right?  Maybe a more descriptive variable name would be good here.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":"def _get_folder(session, parent_folder_ref, name):"},{"line_number":1561,"context_line":"    # Get list of child entities for the parent folder"},{"line_number":1562,"context_line":"    prop_val \u003d session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1563,"context_line":"                                    parent_folder_ref,"},{"line_number":1564,"context_line":"                                    \u0027childEntity\u0027)"},{"line_number":1565,"context_line":"    if prop_val:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ccede98f","line":1562,"in_reply_to":"fa32b979_1311d3af","updated":"2015-06-21 07:43:57.000000000","message":"i am not sure. this gets the property values. part of these are folder names. if you have a VC then you can take a look at the object and see that it is not only folders","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"},{"line_number":1569,"context_line":"        for child_entity in child_entities:"},{"line_number":1570,"context_line":"            if child_entity._type !\u003d \u0027Folder\u0027:"},{"line_number":1571,"context_line":"                continue"},{"line_number":1572,"context_line":"            child_entity_name \u003d _get_entity_name(session, child_entity)"},{"line_number":1573,"context_line":"            if child_entity_name \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_337df7e7","line":1570,"updated":"2015-06-19 14:01:32.000000000","message":"Is there no way to filter this out when getting the childEntity from parent_folder_ref above?","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"},{"line_number":1569,"context_line":"        for child_entity in child_entities:"},{"line_number":1570,"context_line":"            if child_entity._type !\u003d \u0027Folder\u0027:"},{"line_number":1571,"context_line":"                continue"},{"line_number":1572,"context_line":"            child_entity_name \u003d _get_entity_name(session, child_entity)"},{"line_number":1573,"context_line":"            if child_entity_name \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_f9244d61","line":1570,"in_reply_to":"fa32b979_337df7e7","updated":"2015-06-21 07:43:57.000000000","message":"sadly no","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    LOG.debug(\"Creating folder \u0027%s\u0027\", name)"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_f35d4f7a","line":1577,"updated":"2015-06-19 14:01:32.000000000","message":"nit: I like to see docstrings for public utility methods.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    LOG.debug(\"Creating folder \u0027%s\u0027\", name)"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_192a512d","line":1577,"in_reply_to":"fa32b979_f35d4f7a","updated":"2015-06-21 07:43:57.000000000","message":"Done","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    LOG.debug(\"Creating folder \u0027%s\u0027\", name)"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"},{"line_number":1581,"context_line":"    if folder:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_d3e5abdc","line":1578,"updated":"2015-06-19 14:01:32.000000000","message":"The folder isn\u0027t actually created if it already exists (checks below), but if it doesn\u0027t exist this would be logged twice, so it could be confusing.  I\u0027d remove this line and just leave the one below when you\u0027re actually creating the folder.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    LOG.debug(\"Creating folder \u0027%s\u0027\", name)"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"},{"line_number":1581,"context_line":"    if folder:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_39871514","line":1578,"in_reply_to":"fa32b979_d3e5abdc","updated":"2015-06-21 07:43:57.000000000","message":"Done","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1581,"context_line":"    if folder:"},{"line_number":1582,"context_line":"        LOG.debug(\"Folder already exists: %s.\", name)"},{"line_number":1583,"context_line":"        return folder"},{"line_number":1584,"context_line":"    LOG.debug(\"Creating folder: %s.\", name)"},{"line_number":1585,"context_line":"    try:"},{"line_number":1586,"context_line":"        folder \u003d session._call_method(session.vim, \"CreateFolder\","},{"line_number":1587,"context_line":"                                      parent_folder_ref, name\u003dname)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_d3e60bb0","line":1584,"updated":"2015-06-19 14:01:32.000000000","message":"Add parent_folder_ref to this for context?  The name is just the name of the folder right?  Not the full path.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1581,"context_line":"    if folder:"},{"line_number":1582,"context_line":"        LOG.debug(\"Folder already exists: %s.\", name)"},{"line_number":1583,"context_line":"        return folder"},{"line_number":1584,"context_line":"    LOG.debug(\"Creating folder: %s.\", name)"},{"line_number":1585,"context_line":"    try:"},{"line_number":1586,"context_line":"        folder \u003d session._call_method(session.vim, \"CreateFolder\","},{"line_number":1587,"context_line":"                                      parent_folder_ref, name\u003dname)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ec99cd20","line":1584,"in_reply_to":"fa32b979_d3e60bb0","updated":"2015-06-21 07:43:57.000000000","message":"The name is the new folder under the parent folder (parent_folder_ref)","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1585,"context_line":"    try:"},{"line_number":1586,"context_line":"        folder \u003d session._call_method(session.vim, \"CreateFolder\","},{"line_number":1587,"context_line":"                                      parent_folder_ref, name\u003dname)"},{"line_number":1588,"context_line":"    except vexc.DuplicateName as e:"},{"line_number":1589,"context_line":"        val \u003d e.details[\u0027object\u0027]"},{"line_number":1590,"context_line":"        folder \u003d vim_util.get_moref(val, \u0027Folder\u0027)"},{"line_number":1591,"context_line":"    LOG.info(_LI(\"Created folder: %s.\"), name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_738fffcc","line":1588,"updated":"2015-06-19 14:01:32.000000000","message":"I assume this would only happen due to a race creating the folder since we\u0027re already checking for it above.\n\nWe could add a lock around create_folder based on the parent_folder_ref and name....","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1585,"context_line":"    try:"},{"line_number":1586,"context_line":"        folder \u003d session._call_method(session.vim, \"CreateFolder\","},{"line_number":1587,"context_line":"                                      parent_folder_ref, name\u003dname)"},{"line_number":1588,"context_line":"    except vexc.DuplicateName as e:"},{"line_number":1589,"context_line":"        val \u003d e.details[\u0027object\u0027]"},{"line_number":1590,"context_line":"        folder \u003d vim_util.get_moref(val, \u0027Folder\u0027)"},{"line_number":1591,"context_line":"    LOG.info(_LI(\"Created folder: %s.\"), name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_f933ed60","line":1588,"in_reply_to":"fa32b979_738fffcc","updated":"2015-06-21 07:43:57.000000000","message":"If there are a number of different compute services running then a lock wil not help here. I think that the exception handling in the VC is sufficient and will save the locking","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"    except vexc.DuplicateName as e:"},{"line_number":1589,"context_line":"        val \u003d e.details[\u0027object\u0027]"},{"line_number":1590,"context_line":"        folder \u003d vim_util.get_moref(val, \u0027Folder\u0027)"},{"line_number":1591,"context_line":"    LOG.info(_LI(\"Created folder: %s.\"), name)"},{"line_number":1592,"context_line":"    return folder"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_b37347e7","line":1591,"updated":"2015-06-19 14:01:32.000000000","message":"We should probably not log this if we got the DuplicateName exception above.  Log this if we actually did create the folder and then log info/debug if we got the DuplicateName so we know there was a race creating the folder.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"    except vexc.DuplicateName as e:"},{"line_number":1589,"context_line":"        val \u003d e.details[\u0027object\u0027]"},{"line_number":1590,"context_line":"        folder \u003d vim_util.get_moref(val, \u0027Folder\u0027)"},{"line_number":1591,"context_line":"    LOG.info(_LI(\"Created folder: %s.\"), name)"},{"line_number":1592,"context_line":"    return folder"},{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_d93b8937","line":1591,"in_reply_to":"fa32b979_b37347e7","updated":"2015-06-21 07:43:57.000000000","message":"Done","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":1562,"context_line":"    prop_val \u003d session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1563,"context_line":"                                    parent_folder_ref,"},{"line_number":1564,"context_line":"                                    \u0027childEntity\u0027)"},{"line_number":1565,"context_line":"    if prop_val:"},{"line_number":1566,"context_line":"        child_entities \u003d prop_val.ManagedObjectReference"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_baced72a","line":1565,"updated":"2015-06-25 13:51:32.000000000","message":"We should have a unit test that this is None.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":1562,"context_line":"    prop_val \u003d session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1563,"context_line":"                                    parent_folder_ref,"},{"line_number":1564,"context_line":"                                    \u0027childEntity\u0027)"},{"line_number":1565,"context_line":"    if prop_val:"},{"line_number":1566,"context_line":"        child_entities \u003d prop_val.ManagedObjectReference"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_e5e6f049","line":1565,"in_reply_to":"fa32b979_baced72a","updated":"2015-06-25 18:51:05.000000000","message":"Done","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"        child_entities \u003d prop_val.ManagedObjectReference"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"},{"line_number":1569,"context_line":"        for child_entity in child_entities:"},{"line_number":1570,"context_line":"            if child_entity._type !\u003d \u0027Folder\u0027:"},{"line_number":1571,"context_line":"                continue"},{"line_number":1572,"context_line":"            child_entity_name \u003d _get_entity_name(session, child_entity)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_1af34374","line":1569,"updated":"2015-06-25 13:51:32.000000000","message":"We should have a test that child_entities is empty.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":1566,"context_line":"        child_entities \u003d prop_val.ManagedObjectReference"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"},{"line_number":1569,"context_line":"        for child_entity in child_entities:"},{"line_number":1570,"context_line":"            if child_entity._type !\u003d \u0027Folder\u0027:"},{"line_number":1571,"context_line":"                continue"},{"line_number":1572,"context_line":"            child_entity_name \u003d _get_entity_name(session, child_entity)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_05ec3428","line":1569,"in_reply_to":"fa32b979_1af34374","updated":"2015-06-25 18:51:05.000000000","message":"Done","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"},{"line_number":1569,"context_line":"        for child_entity in child_entities:"},{"line_number":1570,"context_line":"            if child_entity._type !\u003d \u0027Folder\u0027:"},{"line_number":1571,"context_line":"                continue"},{"line_number":1572,"context_line":"            child_entity_name \u003d _get_entity_name(session, child_entity)"},{"line_number":1573,"context_line":"            if child_entity_name \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_1ac103e4","line":1570,"updated":"2015-06-25 13:51:32.000000000","message":"And we should probably have a test that there are child entities but none of them match the Folder type.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"        # Return if the child folder with input name is already present"},{"line_number":1569,"context_line":"        for child_entity in child_entities:"},{"line_number":1570,"context_line":"            if child_entity._type !\u003d \u0027Folder\u0027:"},{"line_number":1571,"context_line":"                continue"},{"line_number":1572,"context_line":"            child_entity_name \u003d _get_entity_name(session, child_entity)"},{"line_number":1573,"context_line":"            if child_entity_name \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_c5f5eced","line":1570,"in_reply_to":"fa32b979_1ac103e4","updated":"2015-06-25 18:51:05.000000000","message":"Done","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_7a560f5d","line":1577,"updated":"2015-06-25 13:51:32.000000000","message":"I don\u0027t see tests in test_vm_util for any of this new utility code.  The stubs add to fake.py just create a folder and return it (record keeping).\n\nThere are no unit tests for the side conditions here, like if the folder already exists on the first create, or if you get the DuplicateName exception below.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_69e967e5","line":1577,"in_reply_to":"fa32b979_7a560f5d","updated":"2015-06-25 18:51:05.000000000","message":"Done","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."},{"line_number":1581,"context_line":"    \"\"\""},{"line_number":1582,"context_line":""},{"line_number":1583,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_fade9f0f","line":1580,"updated":"2015-06-25 13:51:32.000000000","message":"nit: could point out that the created folder is returned.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."},{"line_number":1581,"context_line":"    \"\"\""},{"line_number":1582,"context_line":""},{"line_number":1583,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_098d3b30","line":1580,"in_reply_to":"fa32b979_fade9f0f","updated":"2015-06-25 18:51:05.000000000","message":"Done","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":1595,"context_line":"        LOG.debug(\"Folder already exists: %(name)s. Parent ref: %(parent)s.\","},{"line_number":1596,"context_line":"                  {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"},{"line_number":1597,"context_line":"        val \u003d e.details[\u0027object\u0027]"},{"line_number":1598,"context_line":"        folder \u003d vim_util.get_moref(val, \u0027Folder\u0027)"},{"line_number":1599,"context_line":"    return folder"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_c5df2c39","line":1598,"updated":"2015-06-25 18:51:05.000000000","message":"complete test coverage helped me find a bug here :)","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abb1f50ba8690dd5d9d2f15f8bfaaa44547909dc","unresolved":false,"context_lines":[{"line_number":1595,"context_line":"        LOG.debug(\"Folder already exists: %(name)s. Parent ref: %(parent)s.\","},{"line_number":1596,"context_line":"                  {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"},{"line_number":1597,"context_line":"        val \u003d e.details[\u0027object\u0027]"},{"line_number":1598,"context_line":"        folder \u003d vim_util.get_moref(val, \u0027Folder\u0027)"},{"line_number":1599,"context_line":"    return folder"},{"line_number":1600,"context_line":""},{"line_number":1601,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba3cc151_3cdc3172","line":1598,"in_reply_to":"fa32b979_c5df2c39","updated":"2015-07-02 13:54:49.000000000","message":"\\o/","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"b1dd827b40570657ccaa4b862bba6efca35a1f80","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"    return devices"},{"line_number":1553,"context_line":""},{"line_number":1554,"context_line":""},{"line_number":1555,"context_line":"def _get_entity_name(session, entity):"},{"line_number":1556,"context_line":"    return session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1557,"context_line":"                                entity, \u0027name\u0027)"},{"line_number":1558,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_e62fa43c","line":1555,"updated":"2015-07-30 21:33:54.000000000","message":"can this method go to vim_util.py since it is generic for any entity like datastore?\n\nAlso, since a similar folder structure is going to be used for Images too, folder related methods can go to vim_util unless it is specific to vm folder.","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"713c8f63f98a010a15dec799ecea5f4c4459af04","unresolved":false,"context_lines":[{"line_number":1552,"context_line":"    return devices"},{"line_number":1553,"context_line":""},{"line_number":1554,"context_line":""},{"line_number":1555,"context_line":"def _get_entity_name(session, entity):"},{"line_number":1556,"context_line":"    return session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1557,"context_line":"                                entity, \u0027name\u0027)"},{"line_number":1558,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_73b530eb","line":1555,"in_reply_to":"3a50d1a3_e62fa43c","updated":"2015-08-03 10:24:38.000000000","message":"Done","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"341d38e8e62ddb240be196c0d496655f23688f71","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_e1922e4b","line":1577,"updated":"2015-07-30 22:15:25.000000000","message":"Might be good for oslo.vmware if other projects might use this.  Seems general enough.","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"d6c58201d0f571cb8951b03d175306f8703bb321","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_53729fe4","line":1577,"in_reply_to":"3a50d1a3_476c5236","updated":"2015-07-31 21:46:24.000000000","message":"Cinder patch: https://review.openstack.org/#/c/193095","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"713c8f63f98a010a15dec799ecea5f4c4459af04","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_93ba3ce0","line":1577,"in_reply_to":"3a50d1a3_53729fe4","updated":"2015-08-03 10:24:38.000000000","message":"that is a good idea but it is something that we can and should refactor in when that is ready. i do not see it as something blocking this.","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"69d5398634d7df1b602ab54c98b7f4e7016a4e86","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                return child_entity"},{"line_number":1575,"context_line":""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"def create_folder(session, parent_folder_ref, name):"},{"line_number":1578,"context_line":"    \"\"\"Creates a folder in vCenter"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    A folder of \u0027name\u0027 will be created under the parent folder."}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_476c5236","line":1577,"in_reply_to":"3a50d1a3_e1922e4b","updated":"2015-07-30 22:52:38.000000000","message":"I believe Cinder would use this too.","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":1540,"context_line":""},{"line_number":1541,"context_line":"def _get_folder(session, parent_folder_ref, name):"},{"line_number":1542,"context_line":"    # Get list of child entities for the parent folder"},{"line_number":1543,"context_line":"    prop_val \u003d session._call_method(vutil, \u0027get_object_property\u0027,"},{"line_number":1544,"context_line":"                                    parent_folder_ref,"},{"line_number":1545,"context_line":"                                    \u0027childEntity\u0027)"},{"line_number":1546,"context_line":"    if prop_val:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_faa1f546","line":1543,"updated":"2015-12-19 15:23:11.000000000","message":"Seems you could try getting the folder from the cache first by calling folder_ref_cache_get and if it\u0027s not there, then create it. Unless we expect the cache can be invalidated by the admin deleting the folder path on the system, in which case we\u0027d need to re-create the folder and update the cache ourselves, but that seems bad.\n\nBasically, I don\u0027t think vmops should know about the cache, it should only really have to call create_folder (you could even name it get_or_create_folder I guess), but it seems we should restrict the cache usage to this module and the public create_folder method.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":1564,"context_line":""},{"line_number":1565,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"},{"line_number":1566,"context_line":"    if folder:"},{"line_number":1567,"context_line":"        LOG.debug(\"Folder already exists: %s.\", name)"},{"line_number":1568,"context_line":"        return folder"},{"line_number":1569,"context_line":"    LOG.debug(\"Creating folder: %(name)s. Parent ref: %(parent)s.\","},{"line_number":1570,"context_line":"              {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_1ac96126","line":1567,"updated":"2015-12-19 15:23:11.000000000","message":"I\u0027m not sure we actually need to log this, since if it doesn\u0027t exist we log that we\u0027re creating it, and if you don\u0027t see that you can assume it already exists. Just seems like this would add noise to the logs.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":1564,"context_line":""},{"line_number":1565,"context_line":"    folder \u003d _get_folder(session, parent_folder_ref, name)"},{"line_number":1566,"context_line":"    if folder:"},{"line_number":1567,"context_line":"        LOG.debug(\"Folder already exists: %s.\", name)"},{"line_number":1568,"context_line":"        return folder"},{"line_number":1569,"context_line":"    LOG.debug(\"Creating folder: %(name)s. Parent ref: %(parent)s.\","},{"line_number":1570,"context_line":"              {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_3b6a1c82","line":1567,"in_reply_to":"3a7e1126_1ac96126","updated":"2015-12-20 08:34:03.000000000","message":"Done","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"    LOG.debug(\"Creating folder: %(name)s. Parent ref: %(parent)s.\","},{"line_number":1570,"context_line":"              {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"},{"line_number":1571,"context_line":"    try:"},{"line_number":1572,"context_line":"        folder \u003d session._call_method(session.vim, \"CreateFolder\","},{"line_number":1573,"context_line":"                                      parent_folder_ref, name\u003dname)"},{"line_number":1574,"context_line":"        LOG.info(_LI(\"Created folder: %(name)s in parent %(parent)s.\"),"},{"line_number":1575,"context_line":"                 {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_ba012d3a","line":1572,"updated":"2015-12-19 15:23:11.000000000","message":"I\u0027d call folder_ref_cache_update after creating the folder rather than have vmops do it. The cache is a detail that I don\u0027t think vmops needs to really know about.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"    LOG.debug(\"Creating folder: %(name)s. Parent ref: %(parent)s.\","},{"line_number":1570,"context_line":"              {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"},{"line_number":1571,"context_line":"    try:"},{"line_number":1572,"context_line":"        folder \u003d session._call_method(session.vim, \"CreateFolder\","},{"line_number":1573,"context_line":"                                      parent_folder_ref, name\u003dname)"},{"line_number":1574,"context_line":"        LOG.info(_LI(\"Created folder: %(name)s in parent %(parent)s.\"),"},{"line_number":1575,"context_line":"                 {\u0027name\u0027: name, \u0027parent\u0027: parent_folder_ref.value})"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_1b0c00ec","line":1572,"in_reply_to":"3a7e1126_ba012d3a","updated":"2015-12-20 08:34:03.000000000","message":"that is not relevant - the cache is done according to the full folder patch and that information is not valid here.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"}],"nova/virt/vmwareapi/vmops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":289,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":290,"context_line":"        # is 36 maximum prefix for name is 40"},{"line_number":291,"context_line":"        if name:"},{"line_number":292,"context_line":"            return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":293,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_331c1777","line":290,"updated":"2015-06-19 14:01:32.000000000","message":"nit: maybe point out that the id is a uuid and must not be truncated since that has to remain unique across all folders.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":289,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":290,"context_line":"        # is 36 maximum prefix for name is 40"},{"line_number":291,"context_line":"        if name:"},{"line_number":292,"context_line":"            return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":293,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_79fb5d48","line":290,"in_reply_to":"fa32b979_331c1777","updated":"2015-06-21 07:43:57.000000000","message":"Done","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":289,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":290,"context_line":"        # is 36 maximum prefix for name is 40"},{"line_number":291,"context_line":"        if name:"},{"line_number":292,"context_line":"            return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":293,"context_line":"        else:"},{"line_number":294,"context_line":"            return id[:36]"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_4e1c906a","line":291,"updated":"2015-06-19 14:01:32.000000000","message":"Why even let name be optional?  Plus the code that\u0027s calling this is always passing \u0027Project\u0027.","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":288,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":289,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":290,"context_line":"        # is 36 maximum prefix for name is 40"},{"line_number":291,"context_line":"        if name:"},{"line_number":292,"context_line":"            return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":293,"context_line":"        else:"},{"line_number":294,"context_line":"            return id[:36]"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_f9b44d83","line":291,"in_reply_to":"fa32b979_4e1c906a","updated":"2015-06-21 07:43:57.000000000","message":"I was planning on using this code for future patches. But will add that if and when necessary","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ed716c6b88baf6330423a33fba70f1280f1a100c","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":322,"context_line":"                                            context.project_id)"},{"line_number":323,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder,"},{"line_number":324,"context_line":"                                      [\u0027OpenStack\u0027, folder_name, \u0027Instances\u0027])"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # Create the VM"},{"line_number":327,"context_line":"        vm_ref \u003d vm_util.create_vm(self._session, instance, folder,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ae5afc4e","line":324,"updated":"2015-06-19 14:01:32.000000000","message":"Can\u0027t you just send in \u0027OpenStack/folder_name/Instances/\u0027 and then in _create_folders split that into a list?  Then the caller doesn\u0027t need to know how the internal goop is handled (since it\u0027s not like a mkdir -p call).","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"69d240c778d5c4f09cc9621a13335e40d54e9897","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":322,"context_line":"                                            context.project_id)"},{"line_number":323,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder,"},{"line_number":324,"context_line":"                                      [\u0027OpenStack\u0027, folder_name, \u0027Instances\u0027])"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # Create the VM"},{"line_number":327,"context_line":"        vm_ref \u003d vm_util.create_vm(self._session, instance, folder,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_4c89d9c9","line":324,"in_reply_to":"fa32b979_ae5afc4e","updated":"2015-06-21 07:43:57.000000000","message":"Done","commit_id":"6cd3314fe4e711cd8fa81c1f6158068a3a5c63cc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        for folder in folders:"},{"line_number":278,"context_line":"            path_list.append(folder)"},{"line_number":279,"context_line":"            folder_path \u003d \u0027/\u0027.join(path_list)"},{"line_number":280,"context_line":"            folder_ref \u003d vm_util.folder_ref_cache_get(folder_path)"},{"line_number":281,"context_line":"            if not folder_ref:"},{"line_number":282,"context_line":"                folder_ref \u003d vm_util.create_folder(self._session,"},{"line_number":283,"context_line":"                                                   parent_folder,"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_7a604f01","line":280,"updated":"2015-06-25 13:51:32.000000000","message":"Why isn\u0027t this caching done in vm_util.create_folder?  The utility method should abstract the caching away from the caller so that vmops doesn\u0027t need to do this on it\u0027s own.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"cf6fad388763f87010886cf01dec7042a7cdb48b","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        for folder in folders:"},{"line_number":278,"context_line":"            path_list.append(folder)"},{"line_number":279,"context_line":"            folder_path \u003d \u0027/\u0027.join(path_list)"},{"line_number":280,"context_line":"            folder_ref \u003d vm_util.folder_ref_cache_get(folder_path)"},{"line_number":281,"context_line":"            if not folder_ref:"},{"line_number":282,"context_line":"                folder_ref \u003d vm_util.create_folder(self._session,"},{"line_number":283,"context_line":"                                                   parent_folder,"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_651e600f","line":280,"in_reply_to":"fa32b979_7a604f01","updated":"2015-06-25 18:51:05.000000000","message":"the reason is that the cache is done according to the folder patch and not the moref of the folders.","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6da1f335f041ee4596e6498c2cf72e47f043bd29","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":290,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":291,"context_line":"        # is 36 maximum prefix for name is 40. We cannot concatenate the \u0027id\u0027"},{"line_number":292,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":293,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_5aea2bd9","line":291,"updated":"2015-06-25 13:51:32.000000000","message":"s/concatenate/truncate/","commit_id":"6bce554d38c9acbc69d5e7264791d0d5eea7e9df"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                                                 profile_spec\u003dprofile_spec,"},{"line_number":297,"context_line":"                                                 metadata\u003dmetadata)"},{"line_number":298,"context_line":"        # Create the VM"},{"line_number":299,"context_line":"        vm_ref \u003d vm_util.create_vm(self._session, instance, dc_info.vmFolder,"},{"line_number":300,"context_line":"                                   config_spec, self._root_resource_pool)"},{"line_number":301,"context_line":"        return vm_ref"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_a2081adb","side":"PARENT","line":299,"updated":"2015-07-02 14:26:59.000000000","message":"So...I was wondering about impacts of this change to instances created before it, and I don\u0027t think that\u0027d be a problem for instances created before the change since there are other places in this code using dc_info.vmFolder, like _create_linked_clone_from_snapshot, but what about instances created after this change?  I guess my question is, are there other operations in here that rely on the location of the folder and with this change you\u0027re now putting the vm into a sub-folder by project but not checking that elsewhere if you need to pull or move files from that folder?  Or delete/cleanup for example?","commit_id":"53677ebba6c86bd02ae80867028ed5f21b1299da"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                                                 profile_spec\u003dprofile_spec,"},{"line_number":297,"context_line":"                                                 metadata\u003dmetadata)"},{"line_number":298,"context_line":"        # Create the VM"},{"line_number":299,"context_line":"        vm_ref \u003d vm_util.create_vm(self._session, instance, dc_info.vmFolder,"},{"line_number":300,"context_line":"                                   config_spec, self._root_resource_pool)"},{"line_number":301,"context_line":"        return vm_ref"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_d9698cfa","side":"PARENT","line":299,"in_reply_to":"ba3cc151_a2081adb","updated":"2015-07-05 07:24:47.000000000","message":"There are no problems and this code is backward compatible. It is only where the instance is created in the folder tree. So instead of this being the root folder it is a well know folder. I have tested this with existing instances and it works without breaking anything.\nAll of the work done on the instances from the moment that they are created is via the instanceUUID which is the openstack UUID. So we are good here.","commit_id":"53677ebba6c86bd02ae80867028ed5f21b1299da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                                   instance.image_ref,"},{"line_number":272,"context_line":"                                   version.version_string_with_package())"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def _create_folders(self, parent_folder, folder_path):"},{"line_number":275,"context_line":"        folders \u003d folder_path.split(\u0027/\u0027)"},{"line_number":276,"context_line":"        path_list \u003d []"},{"line_number":277,"context_line":"        for folder in folders:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_d74ddec4","line":274,"updated":"2015-07-02 14:26:59.000000000","message":"How/where is this actually unit tested?  The only changes to test_vmops mock this out and return a fake string object (and it wouldn\u0027t be a string anyway, it\u0027d be a moref).\n\nLike I don\u0027t think any of your caching logic is being tested or that the path is split properly.\n\nIf this is being tested with the fake stuff, then we should have an assertion that the folders are stored in the vcenter, i.e. at the end of a test we can get the folders created during the run from the fake and assert they are the ones we expected to be created, like a list of:\n\n[\u0027Openstack\u0027, \u0027Project (uuid)\u0027, \u0027Instances\u0027]","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                                   instance.image_ref,"},{"line_number":272,"context_line":"                                   version.version_string_with_package())"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def _create_folders(self, parent_folder, folder_path):"},{"line_number":275,"context_line":"        folders \u003d folder_path.split(\u0027/\u0027)"},{"line_number":276,"context_line":"        path_list \u003d []"},{"line_number":277,"context_line":"        for folder in folders:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_54122158","line":274,"in_reply_to":"ba3cc151_d74ddec4","updated":"2015-07-05 07:24:47.000000000","message":"I\u0027ll add more tests","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"e876462a9cb2427f91e89b3c13f857f1545a771d","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        for folder in folders:"},{"line_number":278,"context_line":"            path_list.append(folder)"},{"line_number":279,"context_line":"            folder_path \u003d \u0027/\u0027.join(path_list)"},{"line_number":280,"context_line":"            folder_ref \u003d vm_util.folder_ref_cache_get(folder_path)"},{"line_number":281,"context_line":"            if not folder_ref:"},{"line_number":282,"context_line":"                folder_ref \u003d vm_util.create_folder(self._session,"},{"line_number":283,"context_line":"                                                   parent_folder,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_25d5f1e6","line":280,"updated":"2015-07-02 15:28:31.000000000","message":"Assuming that we already create folder OpenStack/Project-abc/Instances, and manually remove OpenStack/Project-abc from datastore. OpenStack/Project-abc is still in cache. When we boot an instance in this tenant, the code get folder_ref of OpenStack/Project-abc in cache, so it will skip to create this folder, and driver will fail to boot instance, correct?\n\nBecause driver code does not cleanup project folder, there might be a lot of project folders accumulated in datastore, and VC admin might hope to cleanup them. If one project folder is removed by mistake, which dose not have instance but is still in use, that problem will happen, I think.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        for folder in folders:"},{"line_number":278,"context_line":"            path_list.append(folder)"},{"line_number":279,"context_line":"            folder_path \u003d \u0027/\u0027.join(path_list)"},{"line_number":280,"context_line":"            folder_ref \u003d vm_util.folder_ref_cache_get(folder_path)"},{"line_number":281,"context_line":"            if not folder_ref:"},{"line_number":282,"context_line":"                folder_ref \u003d vm_util.create_folder(self._session,"},{"line_number":283,"context_line":"                                                   parent_folder,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_f90250b3","line":280,"in_reply_to":"ba3cc151_25d5f1e6","updated":"2015-07-05 07:24:47.000000000","message":"The admin should not delete anything that is created and managed by openstack. It is the same as with every other hypervisor - if the root user starts to delete things owned by openstack then it will naturally destroy things.\n\nThe caching of the folder saves expensive calls to the VC. Having these called each time an instance is booted is not good in my opinion. If the admin did delete it then the first instance spawned will fail and the admin wil discover his/her mistake and they can restart the service...\n\nAt the moment there is no hook from keystone to have an indication that a tenant has been deleted. If the tenant is deleted then that tenant does not have any access to management of the instances. The fact that the admin left the instance up and running is a problem that the admin may have missed and the tenant could be using some valuable cloud resources without paying for them. So this will actually help clean thins up.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":290,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":291,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":292,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":293,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_17fca66e","line":291,"updated":"2015-07-02 14:26:59.000000000","message":"We should have a unit test just on this method, not the other stuff calling this method, but the test would pass in some name and id combo that would exceed 80 characters so we can assert that the name is truncated properly and that the uuid is not truncated at all.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":290,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":291,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":292,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":293,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_b94da89b","line":291,"in_reply_to":"ba3cc151_17fca66e","updated":"2015-07-05 07:24:47.000000000","message":"I will add one","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2319982dc85e997215bf20de00c801e546ff66e","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":291,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":292,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":293,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"},{"line_number":296,"context_line":"                              dc_info, datastore, network_info, extra_specs,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_b7693afb","line":293,"updated":"2015-07-02 14:26:59.000000000","message":"Is a space OK here?  Or should there be a dash?","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":8574,"name":"Qin Zhao","username":"zhaoqin","inactive":true},"change_message_id":"e876462a9cb2427f91e89b3c13f857f1545a771d","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":291,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":292,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":293,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"},{"line_number":296,"context_line":"                              dc_info, datastore, network_info, extra_specs,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_7d84f309","line":293,"in_reply_to":"ba3cc151_b7693afb","updated":"2015-07-02 15:28:31.000000000","message":"I support a dash.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"b586f44d69da8c9e2ea1b3fd842b792aa835448a","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":291,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":292,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":293,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"},{"line_number":296,"context_line":"                              dc_info, datastore, network_info, extra_specs,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_998544d0","line":293,"in_reply_to":"ba3cc151_b7693afb","updated":"2015-07-05 07:24:47.000000000","message":"This was done on purpose for usability. If offers a clear distinction between the name of the folder and the UUID. That is very important. I prefer to leave it like this and feel like the - will make things cryptic like they are today.\nProject (e2b86092bf064181ade43deb3188f8e4) is far more intuitive than Project-e2b86092bf064181ade43deb3188f8e4\nIn addition to this the patch that follows this does better renaming for instances and that has the same format.\nHopefully one day when Cinder is able to get the project name then we can drop \u0027Project\u0027 and use the project name.","commit_id":"49144ea41cd61993ad06181e0a2bd728243c654d"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"341d38e8e62ddb240be196c0d496655f23688f71","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        return folder_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":291,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":292,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":293,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":294,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_460bf82b","line":291,"updated":"2015-07-30 22:15:25.000000000","message":"I was a little confused by this statement.  Is the following accurate?  If so, could you rewrite as the following.\n\nThe \u0027id\u0027 length is 36.  The maximum prefix for name is 40.","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"713c8f63f98a010a15dec799ecea5f4c4459af04","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        return folder_ref"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":291,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":292,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":293,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":294,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_336b2820","line":291,"in_reply_to":"3a50d1a3_460bf82b","updated":"2015-08-03 10:24:38.000000000","message":"Done","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"341d38e8e62ddb240be196c0d496655f23688f71","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":292,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":293,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":294,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"},{"line_number":297,"context_line":"                              dc_info, datastore, network_info, extra_specs,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_e1778e9d","line":294,"updated":"2015-07-30 22:15:25.000000000","message":"Isn\u0027t the id being truncated here to 36?  If the max id len is 36, why use the slice?","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"713c8f63f98a010a15dec799ecea5f4c4459af04","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        # Maximum folder length must be less than 80 characters. \u0027id\u0027 length"},{"line_number":292,"context_line":"        # is 36 maximum prefix for name is 40. We cannot truncate the \u0027id\u0027"},{"line_number":293,"context_line":"        # as this is unqiue across OpenStack."},{"line_number":294,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"},{"line_number":297,"context_line":"                              dc_info, datastore, network_info, extra_specs,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_13dcece2","line":294,"in_reply_to":"3a50d1a3_e1778e9d","updated":"2015-08-03 10:24:38.000000000","message":"to be on the safe side","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"341d38e8e62ddb240be196c0d496655f23688f71","unresolved":false,"context_lines":[{"line_number":318,"context_line":"                                                 profile_spec\u003dprofile_spec,"},{"line_number":319,"context_line":"                                                 metadata\u003dmetadata)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":322,"context_line":"                                            context.project_id)"},{"line_number":323,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":324,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_2151f6d8","line":321,"updated":"2015-07-30 22:15:25.000000000","message":"why use \u0027Project\u0027 and not the name of the project?","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"341d38e8e62ddb240be196c0d496655f23688f71","unresolved":false,"context_lines":[{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":322,"context_line":"                                            context.project_id)"},{"line_number":323,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":324,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        # Create the VM"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_e1a46eba","line":323,"updated":"2015-07-30 22:15:25.000000000","message":"or maybe \"Openstack/Project/\u003cproject name (id)/Instances/\"\n\nAlso should domains be in this file path?","commit_id":"b8445713ed42a90547a6352a6f85e601081dc17c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                folder_ref \u003d vm_util.create_folder(self._session,"},{"line_number":286,"context_line":"                                                   parent_folder,"},{"line_number":287,"context_line":"                                                   folder)"},{"line_number":288,"context_line":"                vm_util.folder_ref_cache_update(folder_path, folder_ref)"},{"line_number":289,"context_line":"            parent_folder \u003d folder_ref"},{"line_number":290,"context_line":"        return folder_ref"},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_5ae369a4","line":288,"updated":"2015-12-19 15:23:11.000000000","message":"I\u0027d actually move the folder_ref_cache_update call into vm_util.create_folder so the create_folder method controls setting the cache, then it\u0027s nicely centralized rather than relying on the caller in a different module to update the private cache in the vm_util module.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                folder_ref \u003d vm_util.create_folder(self._session,"},{"line_number":286,"context_line":"                                                   parent_folder,"},{"line_number":287,"context_line":"                                                   folder)"},{"line_number":288,"context_line":"                vm_util.folder_ref_cache_update(folder_path, folder_ref)"},{"line_number":289,"context_line":"            parent_folder \u003d folder_ref"},{"line_number":290,"context_line":"        return folder_ref"},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_bb0cccec","line":288,"in_reply_to":"3a7e1126_5ae369a4","updated":"2015-12-20 08:34:03.000000000","message":"please look at the method. the caching is done according to the full patch and not the parent (if you look at the folder API that is done according to parent folders so internal caching is not relevant there)","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":293,"context_line":"        # Maximum folder length must be less than 80 characters."},{"line_number":294,"context_line":"        # The \u0027id\u0027 length is 36. The maximum prefix for name is 40."},{"line_number":295,"context_line":"        # We cannot truncate the \u0027id\u0027 as this is unqiue across OpenStack."},{"line_number":296,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_7ae0a596","line":295,"range":{"start_line":295,"start_character":49,"end_line":295,"end_character":55},"updated":"2015-12-19 15:23:11.000000000","message":"unique","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    def _get_folder_name(self, name, id):"},{"line_number":293,"context_line":"        # Maximum folder length must be less than 80 characters."},{"line_number":294,"context_line":"        # The \u0027id\u0027 length is 36. The maximum prefix for name is 40."},{"line_number":295,"context_line":"        # We cannot truncate the \u0027id\u0027 as this is unqiue across OpenStack."},{"line_number":296,"context_line":"        return \u0027%s (%s)\u0027 % (name[:40], id[:36])"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def build_virtual_machine(self, context, instance, image_info,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_db119805","line":295,"range":{"start_line":295,"start_character":49,"end_line":295,"end_character":55},"in_reply_to":"3a7e1126_7ae0a596","updated":"2015-12-20 08:34:03.000000000","message":"Done","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                                                 metadata\u003dmetadata)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":324,"context_line":"                                            context.project_id)"},{"line_number":325,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":326,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_faea5573","line":324,"updated":"2015-12-19 15:23:11.000000000","message":"Wait, the instance has a project_id on it, so why do we need the project_id from the context here? They are probably the same, but if you get it from the instance then you don\u0027t need to change the method signature to pass in the context.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                                                 metadata\u003dmetadata)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":324,"context_line":"                                            context.project_id)"},{"line_number":325,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":326,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_3b01bcaf","line":324,"in_reply_to":"3a7e1126_faea5573","updated":"2015-12-20 08:34:03.000000000","message":"nice suggestion","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0bb2c934db44427e0672af1eefbd1d4d36bc7243","unresolved":false,"context_lines":[{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":324,"context_line":"                                            context.project_id)"},{"line_number":325,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":326,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # Create the VM"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_1dd22601","line":325,"updated":"2015-12-17 13:12:49.000000000","message":"I notice non of these strings are being translated here.\n\nIs that on purpose?","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8b35a26e9d864c1ba47f6cea99c4113951d4f0e","unresolved":false,"context_lines":[{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":324,"context_line":"                                            context.project_id)"},{"line_number":325,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":326,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # Create the VM"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_ba6ccd35","line":325,"in_reply_to":"3a7e1126_1dd22601","updated":"2015-12-19 15:23:11.000000000","message":"These are path strings on the vcenter so they shouldn\u0027t be translated.","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"19ee19bc27d079c5a2085ba24336c6820d78f7b3","unresolved":false,"context_lines":[{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":324,"context_line":"                                            context.project_id)"},{"line_number":325,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":326,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # Create the VM"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a7e1126_bba84c8d","line":325,"in_reply_to":"3a7e1126_ba6ccd35","updated":"2015-12-20 08:34:03.000000000","message":"I agree with Matt. I asked the guys who I work with in China and they too agree","commit_id":"2d1aafa7d384dab0bcac8f353002e19a490353c3"},{"author":{"_account_id":16929,"name":"Giridhar Jayavelu","email":"gjayavelu@vmware.com","username":"gjayavelu"},"change_message_id":"7a5d2370db51bb7f18ba785adc81ff44f7ccbe5f","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                                                 profile_spec\u003dprofile_spec,"},{"line_number":320,"context_line":"                                                 metadata\u003dmetadata)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        folder_name \u003d self._get_folder_name(\u0027Project\u0027,"},{"line_number":323,"context_line":"                                            instance.project_id)"},{"line_number":324,"context_line":"        folder_path \u003d \u0027OpenStack/%s/Instances\u0027 % folder_name"},{"line_number":325,"context_line":"        folder \u003d self._create_folders(dc_info.vmFolder, folder_path)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_39f0da66","line":322,"updated":"2015-12-21 05:16:10.000000000","message":"Can we pass the actual project name instead of \"Project\"? That will give better information to VC admins. This would be similar to naming improvements done in https://review.openstack.org/166608","commit_id":"0e9c877a3a6589517bbbf282973ba323302b8bc8"}]}
