[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