[ 
https://issues.apache.org/jira/browse/DTACLOUD-103?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13152773#comment-13152773
 ] 

Alfredo Moralejo commented on DTACLOUD-103:
-------------------------------------------

Hi,

I applied following patch and it seems to be working fine:

--- /usr/share/deltacloud-core/lib/deltacloud/drivers/vsphere/vsphere_driver.rb 
2011-11-09 15:19:33.000000000 +0000
+++ 
/usr/share/deltacloud-core-tiws/lib/deltacloud/drivers/vsphere/vsphere_driver.rb
    2011-11-18 10:21:59.275333873 +0000
@@ -384,12 +384,16 @@
     end
 
     def convert_realm(datastore)
-      Realm::new(
-        :id => datastore.name,
-        :name => datastore.name,
-        :limit => datastore.summary.freeSpace,
-        :state => datastore.summary.accessible ? 'AVAILABLE' : 'UNAVAILABLE'
-      )
+      if datastore.class.to_s == 'Folder'
+        datastore.childEntity.collect { |datastorenew| 
convert_realm(datastorenew) }
+      else
+        Realm::new(
+          :id => datastore.name,
+          :name => datastore.name,
+          :limit => datastore.summary.freeSpace,
+          :state => datastore.summary.accessible ? 'AVAILABLE' : 'UNAVAILABLE'
+        )
+      end
     end
 
     def convert_state(object, state)








--- /usr/share/deltacloud-core/lib/deltacloud/drivers/vsphere/vsphere_client.rb 
2011-11-09 15:19:33.000000000 +0000
+++ 
/usr/share/deltacloud-core-tiws/lib/deltacloud/drivers/vsphere/vsphere_client.rb
    2011-11-18 10:34:36.698334455 +0000
@@ -32,7 +32,8 @@
         rootFolder = vsphere.serviceInstance.content.rootFolder
         vm = {}
         rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).each do |dc|
-          dc.datastoreFolder.childEntity.collect do |datastore|
+          dslist = list_datastores(dc.datastoreFolder)
+           dslist.each do |datastore|
             vm[:instance] = datastore.vm.find { |x| x.name == name }
             if vm[:instance]
               vm[:datastore] = datastore.name
@@ -63,6 +64,7 @@
         dc = rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).select do 
|dc|
           dc.datastoreFolder.childEntity.find { |d| d.name == name }.nil? == 
false
         end.flatten.compact.first
+        dc = rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).first
         dc.hostFolder.childEntity.collect.first.resourcePool
       end
     end
@@ -77,8 +79,12 @@
       safely do
         rootFolder = vsphere.serviceInstance.content.rootFolder
         rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).collect do |dc|
-          dc.datastoreFolder.childEntity.find { |d| d.name == name }
-        end.flatten.compact.first
+          list_datastores(dc.datastoreFolder).each do  |d| 
+            if d.name == name
+              return d
+            end
+          end
+        end
       end
     end
 
@@ -90,7 +96,7 @@
       vms = []
       rootFolder = vsphere.serviceInstance.content.rootFolder
       rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).each do |dc|
-        dc.datastoreFolder.childEntity.each do |datastore|
+        list_datastores(dc.datastoreFolder).each do  |datastore|
           vms += datastore.vm.collect { |vm| { :instance => vm, :datastore => 
datastore.name } unless vm.nil? }
           stored_tasks(datastore, vsphere) do |task|
             if task.info.entity.class == RbVmomi::VIM::VirtualMachine
@@ -102,6 +108,21 @@
       vms.flatten.compact
     end
 
+    # This helper will traverse across all datacenters and folders and gather
+    # all datastores available on vSphere
+    # 
+    def list_datastores(df)
+    datastores = []
+    df.childEntity.each do |object|      
+      if object.class.to_s == 'Folder'
+        datastores += list_datastores(object)
+      else
+        datastores << object
+      end
+    end
+    datastores
+    end
+
     # Map given instance to task. Task name is used as a filename.
     #
     def map_task_to_instance(datastore, task_key, new_instance)



Regards,

Alfredo
                
> vSphere driver does not work when objects are grouped into folders
> ------------------------------------------------------------------
>
>                 Key: DTACLOUD-103
>                 URL: https://issues.apache.org/jira/browse/DTACLOUD-103
>             Project: DeltaCloud
>          Issue Type: Bug
>          Components: Server
>         Environment: DeltaCloud 0.4.1-5 (included with Aeolus 0.5.0)
> Aeolus 0.5.0 on RHEL 6.1
> vSphere 4.1
>            Reporter: Javier Peña
>            Assignee: Michal Fojtik
>              Labels: vsphere
>
> We are trying to setup an Aeolus environment with vSphere as the 
> virtualization backend. Our environment groups datastores and VMs into 
> folders, and this is causing DeltaCloud errors when it is trying to find 
> them. The vSphere hierarchy looks as follows (ASCII art):
> Datacenters
> |-datacenter-21
>   |-group-s24 (Datastores)
>   | |-group-s2583 (Folder)
>   | | |-datastore-2335
>   | | |-datastore-2336
>   |-group-d23 (Hosts)
>   | |-domain-c2310 (ComputeResource)
>   | | |-host-2326
>   | | |-host-2327
>   |-group-v22 (vms)
>   | |-group-v316 (Folder)
>   | | |-group-v23042 (Folder)
>   | | | |-vm-23452
>   | | | |-vm-23453
> Some of the methods that failed in vsphere_client.rb are find_datastore() and 
> list_virtual_machines(). For vsphere_driver.rb, convert_realm() fails as well.
> Please feel free to contact me if you need any additional information.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to