]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
VMware:Fix error creating vCenter inventory folder
authorVipin Balachandran <vbala@vmware.com>
Thu, 22 Jan 2015 09:49:20 +0000 (15:19 +0530)
committerVipin Balachandran <vbala@vmware.com>
Thu, 22 Jan 2015 10:06:05 +0000 (15:36 +0530)
Creating vCenter inventory folder for grouping volumes will
fail with AttributeError if the vCenter's datacenter doesn't
have any child folder under vmFolder (inventory folder for
grouping virtual machines). This patch fixes it.

Change-Id: I0454a6c6a8c1dd49b0e369887883e2b45a778885
Closes-Bug: #1413537

cinder/tests/test_vmware_volumeops.py
cinder/volume/drivers/vmware/volumeops.py

index 9644413a779a21621099bee3bda37291d40e69db..d7c30aee9060b5bc307cebfe3a6a3e3227c151aa 100644 (file)
@@ -378,6 +378,24 @@ class VolumeOpsTestCase(test.TestCase):
                                                         mock.sentinel.dc,
                                                         'vmFolder')
 
+    def test_create_folder_with_empty_vmfolder(self):
+        """Test create_folder when the datacenter vmFolder is empty"""
+        child_folder = mock.sentinel.child_folder
+        self.session.invoke_api.side_effect = [None, child_folder]
+
+        parent_folder = mock.sentinel.parent_folder
+        child_name = 'child_folder'
+        ret = self.vops.create_folder(parent_folder, child_name)
+
+        self.assertEqual(child_folder, ret)
+        expected_calls = [mock.call(vim_util, 'get_object_property',
+                                    self.session.vim, parent_folder,
+                                    'childEntity'),
+                          mock.call(self.session.vim, 'CreateFolder',
+                                    parent_folder, name=child_name)]
+        self.assertEqual(expected_calls,
+                         self.session.invoke_api.call_args_list)
+
     def test_create_folder_not_present(self):
         """Test create_folder when child not present."""
         parent_folder = mock.sentinel.parent_folder
index 58b81285e6e428cfda16c22a46eaf1c1fdde92fc..752aa8cf1f3bf3e74787886280e90e0889b2a029 100644 (file)
@@ -523,18 +523,20 @@ class VMwareVolumeOps(object):
         prop_val = self._session.invoke_api(vim_util, 'get_object_property',
                                             self._session.vim, parent_folder,
                                             'childEntity')
-        child_entities = prop_val.ManagedObjectReference
-
-        # Return if the child folder with input name is already present
-        for child_entity in child_entities:
-            if child_entity._type != 'Folder':
-                continue
-            child_entity_name = self.get_entity_name(child_entity)
-            if child_entity_name and (urllib.unquote(child_entity_name) ==
-                                      child_folder_name):
-                LOG.debug("Child folder: %s already present.",
-                          child_folder_name)
-                return child_entity
+
+        if prop_val and hasattr(prop_val, 'ManagedObjectReference'):
+            child_entities = prop_val.ManagedObjectReference
+
+            # Return if the child folder with input name is already present
+            for child_entity in child_entities:
+                if child_entity._type != 'Folder':
+                    continue
+                child_entity_name = self.get_entity_name(child_entity)
+                if child_entity_name and (urllib.unquote(child_entity_name) ==
+                                          child_folder_name):
+                    LOG.debug("Child folder: %s already present.",
+                              child_folder_name)
+                    return child_entity
 
         # Need to create the child folder
         child_folder = self._session.invoke_api(self._session.vim,