[Ovirt-devel] [PATCH] model apis for the storage tree view for the new VM form.

Scott Seago sseago at redhat.com
Wed Oct 15 15:07:09 UTC 2008


HardwarePool.storage_tree returns a list of storage pools in the HW pool. For each pool, the :children hash element has a list of storage volumes, filtered to include only available volumes (and ones attached to the current VM for edit operations). For each storage volume, if it supports LVM, then it has a :children element with LVM volumes defined on it.

The hash includes fields showing which are available for use (:available) and which support creating new child volumes (currently iSCSI volumes, with NFS Pools soon to be added)

Signed-off-by: Scott Seago <sseago at redhat.com>
---
 src/app/models/hardware_pool.rb        |    6 +++++
 src/app/models/iscsi_storage_volume.rb |    6 +++++
 src/app/models/storage_pool.rb         |   27 +++++++++++++++++++++++++
 src/app/models/storage_volume.rb       |   34 ++++++++++++++++++++++++++++++++
 4 files changed, 73 insertions(+), 0 deletions(-)

diff --git a/src/app/models/hardware_pool.rb b/src/app/models/hardware_pool.rb
index 160f663..6780329 100644
--- a/src/app/models/hardware_pool.rb
+++ b/src/app/models/hardware_pool.rb
@@ -101,4 +101,10 @@ class HardwarePool < Pool
     return {:total => total, :labels => labels}
   end
 
+  def storage_tree(vm_to_include=nil)
+    storage_pools.find(:all,
+                    :conditions => "type != 'LvmStoragePool'").collect do |pool|
+      pool.storage_tree_element(vm_to_include)
+    end
+  end
 end
diff --git a/src/app/models/iscsi_storage_volume.rb b/src/app/models/iscsi_storage_volume.rb
index b254cd8..00d7db2 100644
--- a/src/app/models/iscsi_storage_volume.rb
+++ b/src/app/models/iscsi_storage_volume.rb
@@ -21,4 +21,10 @@ class IscsiStorageVolume < StorageVolume
   def label_components
     "#{storage_pool[:target]}:#{lun}"
   end
+
+  #FIXME: should also take available free space into account
+  def supports_lvm_subdivision
+    return true
+  end
+
 end
diff --git a/src/app/models/storage_pool.rb b/src/app/models/storage_pool.rb
index 7a6f8f0..aed2902 100644
--- a/src/app/models/storage_pool.rb
+++ b/src/app/models/storage_pool.rb
@@ -28,6 +28,9 @@ class StoragePool < ActiveRecord::Base
     def total_size_in_gb
       find(:all).inject(0){ |sum, sv| sum + sv.size_in_gb }
     end
+    def full_vm_list
+      find(:all).inject([]){ |list, sv| list + sv.vms }
+    end
   end
 
   has_many :smart_pool_tags, :as => :tagged, :dependent => :destroy
@@ -73,4 +76,28 @@ class StoragePool < ActiveRecord::Base
   def search_users
     hardware_pool.search_users
   end
+
+  def user_subdividable
+    false
+  end
+
+  def storage_tree_element(vm_to_include=nil)
+    return_hash = { :id => id,
+      :type => self[:type],
+      :text => display_name,
+      :name => display_name,
+      :available => false,
+      :create_volume => user_subdividable,
+      :selected => false}
+    condition = "vms.id is null"
+    if (vm_to_include and vm_to_include.id)
+      condition +=" or vms.id=#{vm_to_include.id}"
+    end
+    return_hash[:children] = storage_volumes.find(:all,
+                               :include => :vms,
+                               :conditions => condition).collect do |volume|
+      volume.storage_tree_element(vm_to_include)
+    end
+    return_hash
+  end
 end
diff --git a/src/app/models/storage_volume.rb b/src/app/models/storage_volume.rb
index 378b58f..3bd5da0 100644
--- a/src/app/models/storage_volume.rb
+++ b/src/app/models/storage_volume.rb
@@ -70,4 +70,38 @@ class StorageVolume < ActiveRecord::Base
       return []
     end
   end
+
+  def supports_lvm_subdivision
+    return false
+  end
+
+  def storage_tree_element(vm_to_include=nil)
+    vm_ids = vms.collect {|vm| vm.id}
+    return_hash = { :id => id,
+      :type => self[:type],
+      :text => display_name,
+      :name => display_name,
+      :available => ((vm_ids.empty?) or
+                    (vm_to_include and vm_to_include.id and
+                     vm_ids.include?(vm_to_include.id))),
+      :create_volume => supports_lvm_subdivision,
+      :selected => (!vm_ids.empty? and vm_to_include and vm_to_include.id and
+                   (vm_ids.include?(vm_to_include.id)))}
+    if lvm_storage_pool
+      if return_hash[:available]
+        return_hash[:available] = lvm_storage_pool.storage_volumes.full_vm_list.empty?
+      end
+      condition = "vms.id is null"
+      if (vm_to_include and vm_to_include.id)
+        condition +=" or vms.id=#{vm_to_include.id}"
+      end
+      return_hash[:children] = lvm_storage_pool.storage_volumes.find(:all,
+                               :include => :vms,
+                               :conditions => condition).collect do |volume|
+        volume.storage_tree_element(vm_to_include)
+      end
+    end
+    return_hash
+  end
+
 end
-- 
1.5.5.1




More information about the ovirt-devel mailing list