[Ovirt-devel] [PATCH server 5/8] Factor StorageVolume functionality out of StorageController
David Lutterkort
lutter at redhat.com
Mon Feb 2 20:35:34 UTC 2009
Storage volumes can now be accessed through their own controller. This is
needed to expose them in the API.
---
src/app/controllers/search_controller.rb | 12 +-
src/app/controllers/storage_controller.rb | 204 -----------------
src/app/controllers/storage_volume_controller.rb | 228 ++++++++++++++++++++
src/app/views/storage/_list_volumes.rhtml | 2 +-
src/app/views/storage/_new_volume_form.rhtml | 24 --
src/app/views/storage/new_volume.rhtml | 53 -----
src/app/views/storage/show.rhtml | 2 +-
src/app/views/storage/show_volume.rhtml | 87 --------
.../views/storage_volume/_new_volume_form.rhtml | 24 ++
src/app/views/storage_volume/new.rhtml | 53 +++++
src/app/views/storage_volume/show.rhtml | 87 ++++++++
11 files changed, 400 insertions(+), 376 deletions(-)
create mode 100644 src/app/controllers/storage_volume_controller.rb
delete mode 100644 src/app/views/storage/_new_volume_form.rhtml
delete mode 100644 src/app/views/storage/new_volume.rhtml
delete mode 100644 src/app/views/storage/show_volume.rhtml
create mode 100644 src/app/views/storage_volume/_new_volume_form.rhtml
create mode 100644 src/app/views/storage_volume/new.rhtml
create mode 100644 src/app/views/storage_volume/show.rhtml
diff --git a/src/app/controllers/search_controller.rb b/src/app/controllers/search_controller.rb
index 7551242..0fb6456 100644
--- a/src/app/controllers/search_controller.rb
+++ b/src/app/controllers/search_controller.rb
@@ -37,14 +37,14 @@ class SearchController < ApplicationController
"NfsStoragePool" => {:controller => "storage",
:show_action => "show",
:searched => true},
- "IscsiStorageVolume" => {:controller => "storage",
- :show_action => "show_volume",
+ "IscsiStorageVolume" => {:controller => "storage_volume",
+ :show_action => "show",
:searched => false},
- "NfsStorageVolume" => {:controller => "storage",
- :show_action => "show_volume",
+ "NfsStorageVolume" => {:controller => "storage_volume",
+ :show_action => "show",
:searched => false},
- "LvmStorageVolume" => {:controller => "storage",
- :show_action => "show_volume",
+ "LvmStorageVolume" => {:controller => "storage_volume",
+ :show_action => "show",
:searched => false}}
MULTI_TYPE_MODELS = {"StoragePool" => ["IscsiStoragePool", "NfsStoragePool"]}
diff --git a/src/app/controllers/storage_controller.rb b/src/app/controllers/storage_controller.rb
index ee9f116..3579967 100644
--- a/src/app/controllers/storage_controller.rb
+++ b/src/app/controllers/storage_controller.rb
@@ -24,8 +24,6 @@ class StorageController < ApplicationController
before_filter :pre_pool_admin, :only => [:refresh]
before_filter :pre_new2, :only => [:new2]
- before_filter :pre_json, :only => [:storage_volumes_json]
- before_filter :pre_create_volume, :only => [:create_volume]
before_filter :pre_add, :only => [:add, :addstorage]
def index
@@ -90,35 +88,6 @@ class StorageController < ApplicationController
end
end
- def storage_volumes_json
- @storage_pool = StoragePool.find(params[:id])
- set_perms(@storage_pool.hardware_pool)
- unless @can_view
- flash[:notice] = 'You do not have permission to view this storage pool: redirecting to top level'
- redirect_to :controller => 'dashboard'
- end
- attr_list = []
- attr_list << :id if (@storage_pool.user_subdividable and @can_modify)
- attr_list += [:display_name, :size_in_gb, :get_type_label]
- json_list(@storage_pool.storage_volumes, attr_list)
- end
- def show_volume
- @storage_volume = StorageVolume.find(params[:id])
- set_perms(@storage_volume.storage_pool.hardware_pool)
- unless @can_view
- flash[:notice] = 'You do not have permission to view this storage volume: redirecting to top level'
- respond_to do |format|
- format.html { redirect_to :controller => 'dashboard' }
- format.xml { head :forbidden }
- end
- else
- respond_to do |format|
- format.html { render :layout => 'selection' }
- format.xml { render :xml => @storage_volume.to_xml }
- end
- end
- end
-
def new
end
@@ -127,78 +96,6 @@ class StorageController < ApplicationController
render :layout => false
end
- def new_volume
- @return_to_workflow = params[:return_to_workflow]
- @return_to_workflow ||= false
- if params[:storage_pool_id]
- @storage_pool = StoragePool.find(params[:storage_pool_id])
- unless @storage_pool.user_subdividable
- #fixme: proper error page for popups
- redirect_to :controller => 'dashboard'
- return
- end
- new_volume_internal(@storage_pool,
- { :storage_pool_id => params[:storage_pool_id]})
- else
- @source_volume = StorageVolume.find(params[:source_volume_id])
- unless @source_volume.supports_lvm_subdivision
- #fixme: proper error page for popups
- redirect_to :controller => 'dashboard'
- return
- end
- lvm_pool = @source_volume.lvm_storage_pool
- unless lvm_pool
- # FIXME: what should we do about VG/LV names?
- # for now auto-create VG name as ovirt_vg_#{@source_volume.id}
- new_params = { :vg_name => "ovirt_vg_#{@source_volume.id}",
- :hardware_pool_id => @source_volume.storage_pool.hardware_pool_id}
- lvm_pool = StoragePool.factory(StoragePool::LVM, new_params)
- lvm_pool.source_volumes << @source_volume
- lvm_pool.save!
- end
- new_volume_internal(lvm_pool, { :storage_pool_id => lvm_pool.id})
- @storage_volume.lv_owner_perms='0744'
- @storage_volume.lv_group_perms='0744'
- @storage_volume.lv_mode_perms='0744'
- end
- render :layout => 'popup'
- end
-
- def create_volume
- begin
- StorageVolume.transaction do
- @storage_volume.save!
- @task = StorageVolumeTask.new({ :user => @user,
- :task_target => @storage_volume,
- :action => StorageVolumeTask::ACTION_CREATE_VOLUME,
- :state => Task::STATE_QUEUED})
- @task.save!
- end
- respond_to do |format|
- format.json { render :json => { :object => "storage_volume",
- :success => true,
- :alert => "Storage Volume was successfully created.",
- :new_volume => @storage_volume.storage_tree_element({:filter_unavailable => false, :state => 'new'})} }
- format.xml { render :xml => @storage_volume,
- :status => :created,
- # FIXME: create storage_volume_url method if relevant
- :location => storage_pool_url(@storage_volume)
- }
- end
- rescue => ex
- # FIXME: need to distinguish volume vs. task save errors
- respond_to do |format|
- format.json {
- json_hash = { :object => "storage_volume", :success => false,
- :errors => @storage_volume.errors.localize_error_messages.to_a }
- json_hash[:message] = ex.message if json_hash[:errors].empty?
- render :json => json_hash }
- format.xml { render :xml => @storage_volume.errors,
- :status => :unprocessable_entity }
- end
- end
- end
-
def insert_refresh_task
@task = StorageTask.new({ :user => @user,
:task_target => @storage_pool,
@@ -330,67 +227,6 @@ class StorageController < ApplicationController
end
end
- def delete_volumes
- storage_volume_ids_str = params[:storage_volume_ids]
- storage_volume_ids = storage_volume_ids_str.split(",").collect {|x| x.to_i}
- alerts = []
- status = true
- begin
- StorageVolume.transaction do
- storage = StorageVolume.find(:all, :conditions => "id in (#{storage_volume_ids.join(', ')})")
- unless storage.empty?
- set_perms(storage[0].storage_pool.hardware_pool)
- unless @can_modify and storage[0].storage_pool.user_subdividable
- respond_to do |format|
- format.json { render :json => { :object => "storage_volume",
- :success => false,
- :alert => "You do not have permission to delete this storage volume." } }
- format.xml { head :forbidden }
- end
- else
- storage.each do |storage_volume|
- alert, success = delete_volume_internal(storage_volume)
- alerts << alert
- status = false unless success
- end
- respond_to do |format|
- format.json { render :json => { :object => "storage_volume",
- :success => status, :alert => alerts.join("\n") } }
- format.xml { head(status ? :ok : :method_not_allowed) }
- end
- end
- else
- respond_to do |format|
- format.json { render :json => { :object => "storage_volume",
- :success => false, :alert => "no volumes selected" } }
- format.xml { head(status ? :ok : :method_not_allowed) }
- end
- end
- end
- end
- end
-
- def delete_volume
- @storage_volume = StorageVolume.find(params[:id])
- set_perms(@storage_volume.storage_pool.hardware_pool)
- unless @can_modify and @storage_volume.storage_pool.user_subdividable
- respond_to do |format|
- format.json { render :json => { :object => "storage_volume",
- :success => false,
- :alert => "You do not have permission to delete this storage volume." } }
- format.xml { head :forbidden }
- end
- else
- alert, success = delete_volume_internal(@storage_volume)
- respond_to do |format|
- format.json { render :json => { :object => "storage_volume",
- :success => success, :alert => alert } }
- format.xml { head(success ? :ok : :method_not_allowed) }
- end
- end
-
- end
-
def pre_new
@hardware_pool = HardwarePool.find(params[:hardware_pool_id])
@perm_obj = @hardware_pool
@@ -424,49 +260,9 @@ class StorageController < ApplicationController
@storage_pool = StoragePool.find(params[:id])
@perm_obj = @storage_pool.hardware_pool
end
- def pre_create_volume
- volume = params[:storage_volume]
- unless type = params[:storage_type]
- type = volume.delete(:storage_type)
- end
- @storage_volume = StorageVolume.factory(type, volume)
- @perm_obj = @storage_volume.storage_pool.hardware_pool
- authorize_admin
- end
- def pre_json
- pre_show
- end
def pre_pool_admin
pre_edit
authorize_admin
end
- private
- def new_volume_internal(storage_pool, new_params)
- @storage_volume = StorageVolume.factory(storage_pool.get_type_label, new_params)
- @perm_obj = @storage_volume.storage_pool.hardware_pool
- authorize_admin
- end
-
- def delete_volume_internal(volume)
- begin
- name = volume.display_name
- if !volume.vms.empty?
- vm_list = volume.vms.collect {|vm| vm.description}.join(", ")
- ["Storage Volume #{name} must be unattached from VMs (#{vm_list}) before deleting it.",
- false]
- else
- volume.state=StorageVolume::STATE_PENDING_DELETION
- volume.save!
- @task = StorageVolumeTask.new({ :user => @user,
- :task_target => volume,
- :action => StorageVolumeTask::ACTION_DELETE_VOLUME,
- :state => Task::STATE_QUEUED})
- @task.save!
- ["Storage Volume #{name} deletion was successfully queued.", true]
- end
- rescue => ex
- ["Failed to delete storage volume #{name} (#{ex.message}.",false]
- end
- end
end
diff --git a/src/app/controllers/storage_volume_controller.rb b/src/app/controllers/storage_volume_controller.rb
new file mode 100644
index 0000000..ba486d2
--- /dev/null
+++ b/src/app/controllers/storage_volume_controller.rb
@@ -0,0 +1,228 @@
+#
+# Copyright (C) 2009 Red Hat, Inc.
+# Written by Scott Seago <sseago at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class StorageVolumeController < ApplicationController
+
+ before_filter :pre_create, :only => [:create]
+
+ def new
+ @return_to_workflow = params[:return_to_workflow] || false
+ if params[:storage_pool_id]
+ @storage_pool = StoragePool.find(params[:storage_pool_id])
+ unless @storage_pool.user_subdividable
+ #fixme: proper error page for popups
+ redirect_to :controller => 'dashboard'
+ return
+ end
+ new_volume_internal(@storage_pool,
+ { :storage_pool_id => params[:storage_pool_id]})
+ else
+ @source_volume = StorageVolume.find(params[:source_volume_id])
+ unless @source_volume.supports_lvm_subdivision
+ #fixme: proper error page for popups
+ redirect_to :controller => 'dashboard'
+ return
+ end
+ lvm_pool = @source_volume.lvm_storage_pool
+ unless lvm_pool
+ # FIXME: what should we do about VG/LV names?
+ # for now auto-create VG name as ovirt_vg_#{@source_volume.id}
+ new_params = { :vg_name => "ovirt_vg_#{@source_volume.id}",
+ :hardware_pool_id => @source_volume.storage_pool.hardware_pool_id}
+ lvm_pool = StoragePool.factory(StoragePool::LVM, new_params)
+ lvm_pool.source_volumes << @source_volume
+ lvm_pool.save!
+ end
+ new_volume_internal(lvm_pool, { :storage_pool_id => lvm_pool.id})
+ @storage_volume.lv_owner_perms='0744'
+ @storage_volume.lv_group_perms='0744'
+ @storage_volume.lv_mode_perms='0744'
+ end
+ render :layout => 'popup'
+ end
+
+ def create
+ begin
+ StorageVolume.transaction do
+ @storage_volume.save!
+ @task = StorageVolumeTask.new({ :user => @user,
+ :task_target => @storage_volume,
+ :action => StorageVolumeTask::ACTION_CREATE_VOLUME,
+ :state => Task::STATE_QUEUED})
+ @task.save!
+ end
+ respond_to do |format|
+ format.json { render :json => { :object => "storage_volume",
+ :success => true,
+ :alert => "Storage Volume was successfully created." ,
+ :new_volume => @storage_volume.storage_tree_element({:filter_unavailable => false, :state => 'new'})} }
+ format.xml { render :xml => @storage_volume,
+ :status => :created,
+ # FIXME: create storage_volume_url method if relevant
+ :location => storage_pool_url(@storage_volume)
+ }
+ end
+ rescue => ex
+ # FIXME: need to distinguish volume vs. task save errors
+ respond_to do |format|
+ format.json {
+ json_hash = { :object => "storage_volume", :success => false,
+ :errors => @storage_volume.errors.localize_error_messages.to_a }
+ json_hash[:message] = ex.message if json_hash[:errors].empty?
+ render :json => json_hash }
+ format.xml { render :xml => @storage_volume.errors,
+ :status => :unprocessable_entity }
+ end
+ end
+ end
+
+ def show
+ @storage_volume = StorageVolume.find(params[:id])
+ set_perms(@storage_volume.storage_pool.hardware_pool)
+ @storage_pool = @storage_volume.storage_pool
+ unless @can_view
+ flash[:notice] = 'You do not have permission to view this storage volume: redirecting to top level'
+ respond_to do |format|
+ format.html { redirect_to :controller => 'dashboard' }
+ format.json { redirect_to :controller => 'dashboard' }
+ format.xml { head :forbidden }
+ end
+ else
+ respond_to do |format|
+ format.html { render :layout => 'selection' }
+ format.json do
+ attr_list = []
+ attr_list << :id if (@storage_pool.user_subdividable and @can_modify)
+ attr_list += [:display_name, :size_in_gb, :get_type_label]
+ json_list(@storage_pool.storage_volumes, attr_list)
+ end
+ format.xml { render :xml => @storage_volume.to_xml }
+ end
+ end
+ end
+
+ def destroy
+ if params[:id]
+ delete_volume
+ else
+ delete_volumes
+ end
+ end
+
+ def delete_volumes
+ storage_volume_ids_str = params[:storage_volume_ids]
+ storage_volume_ids = storage_volume_ids_str.split(",").collect {|x| x.to_i}
+ alerts = []
+ status = true
+ begin
+ StorageVolume.transaction do
+ storage = StorageVolume.find(:all, :conditions => "id in (#{storage_volume_ids.join(', ')})")
+ unless storage.empty?
+ set_perms(storage[0].storage_pool.hardware_pool)
+ unless @can_modify and storage[0].storage_pool.user_subdividable
+ respond_to do |format|
+ format.json { render :json => { :object => "storage_volume",
+ :success => false,
+ :alert => "You do not have permission to delete this storage volume." } }
+ format.xml { head :forbidden }
+ end
+ else
+ storage.each do |storage_volume|
+ alert, success = delete_volume_internal(storage_volume)
+ alerts << alert
+ status = false unless success
+ end
+ respond_to do |format|
+ format.json { render :json => { :object => "storage_volume",
+ :success => status, :alert => alerts.join("\n") } }
+ format.xml { head(status ? :ok : :method_not_allowed) }
+ end
+ end
+ else
+ respond_to do |format|
+ format.json { render :json => { :object => "storage_volume",
+ :success => false, :alert => "no volumes selected" } }
+ format.xml { head(status ? :ok : :method_not_allowed) }
+ end
+ end
+ end
+ end
+ end
+
+ def delete_volume
+ @storage_volume = StorageVolume.find(params[:id])
+ set_perms(@storage_volume.storage_pool.hardware_pool)
+ unless @can_modify and @storage_volume.storage_pool.user_subdividable
+ respond_to do |format|
+ format.json { render :json => { :object => "storage_volume",
+ :success => false,
+ :alert => "You do not have permission to delete this storage volume." } }
+ format.xml { head :forbidden }
+ end
+ else
+ alert, success = delete_volume_internal(@storage_volume)
+ respond_to do |format|
+ format.json { render :json => { :object => "storage_volume",
+ :success => success, :alert => alert } }
+ format.xml { head(success ? :ok : :method_not_allowed) }
+ end
+ end
+
+ end
+
+ def pre_create
+ volume = params[:storage_volume]
+ unless type = params[:storage_type]
+ type = volume.delete(:storage_type)
+ end
+ @storage_volume = StorageVolume.factory(type, volume)
+ @perm_obj = @storage_volume.storage_pool.hardware_pool
+ authorize_admin
+ end
+
+ private
+ def new_volume_internal(storage_pool, new_params)
+ @storage_volume = StorageVolume.factory(storage_pool.get_type_label, new_params)
+ @perm_obj = @storage_volume.storage_pool.hardware_pool
+ authorize_admin
+ end
+
+ def delete_volume_internal(volume)
+ begin
+ name = volume.display_name
+ if !volume.vms.empty?
+ vm_list = volume.vms.collect {|vm| vm.description}.join(", ")
+ ["Storage Volume #{name} must be unattached from VMs (#{vm_list}) before deleting it.",
+ false]
+ else
+ volume.state=StorageVolume::STATE_PENDING_DELETION
+ volume.save!
+ @task = StorageVolumeTask.new({ :user => @user,
+ :task_target => volume,
+ :action => StorageVolumeTask::ACTION_DELETE_VOLUME,
+ :state => Task::STATE_QUEUED})
+ @task.save!
+ ["Storage Volume #{name} deletion was successfully queued.", true]
+ end
+ rescue => ex
+ ["Failed to delete storage volume #{name} (#{ex.message}.",false]
+ end
+ end
+
+end
diff --git a/src/app/views/storage/_list_volumes.rhtml b/src/app/views/storage/_list_volumes.rhtml
index 212720e..ab4f623 100644
--- a/src/app/views/storage/_list_volumes.rhtml
+++ b/src/app/views/storage/_list_volumes.rhtml
@@ -19,7 +19,7 @@
<tbody>
<% for storage_volume in type_volumes %>
<tr class="<%= cycle('odd','even', :name => type_volumes) %>">
- <% vol_hash = { :controller => 'storage', :action => 'show_volume', :id => storage_volume }
+ <% vol_hash = { :controller => 'storage_volume', :action => 'show', :id => storage_volume }
vol_hash[:vm_id] = vm_id if defined? vm_id
%>
<td style="text-align:left;"><%= link_to storage_volume.storage_pool.ip_addr, vol_hash, { :class => "show" } %>
diff --git a/src/app/views/storage/_new_volume_form.rhtml b/src/app/views/storage/_new_volume_form.rhtml
deleted file mode 100644
index ae65e18..0000000
--- a/src/app/views/storage/_new_volume_form.rhtml
+++ /dev/null
@@ -1,24 +0,0 @@
-<%= error_messages_for 'storage_volume' %>
-
-<!--[form:storage_pool]-->
-<%= hidden_field 'storage_volume', 'storage_pool_id' %>
-<%= hidden_field_tag 'storage_type', @storage_volume.get_type_label %>
-
-<%= text_field_with_label "Size (GB):", 'storage_volume', 'size_in_gb' %>
-
-<%if @storage_volume.get_type_label==StoragePool::LVM -%>
- <%= text_field_with_label "LV Name:", 'storage_volume', 'lv_name' %>
-
- <%= text_field_with_label "Owner permissions:", 'storage_volume', 'lv_owner_perms' %>
-
- <%= text_field_with_label "Group permissions:", 'storage_volume', 'lv_group_perms' %>
-
- <%= text_field_with_label "Mode permissions:", 'storage_volume', 'lv_mode_perms' %>
-<%- end -%>
-<%= text_field_with_label "LUN:", 'storage_volume', 'lun' if @storage_volume.get_type_label==StoragePool::ISCSI %>
-
-<%= text_field_with_label "Filename:", 'storage_volume', 'filename' if @storage_volume.get_type_label==StoragePool::NFS %>
-
-
-<!--[eoform:storage_volume]-->
-
diff --git a/src/app/views/storage/new_volume.rhtml b/src/app/views/storage/new_volume.rhtml
deleted file mode 100644
index 2e49d16..0000000
--- a/src/app/views/storage/new_volume.rhtml
+++ /dev/null
@@ -1,53 +0,0 @@
-<%- content_for :title do -%>
- <%= _("Add New Volume") %>
-<%- end -%>
-<%- content_for :description do -%>
- Add a new Storage Volume to
- <%= if @storage_volume.get_type_label==StoragePool::LVM
- @source_volume.display_name
- else
- @storage_pool.display_name
- end %>.
-<%- end -%>
-<div class="panel_header"></div>
-<div class="dialog_form">
-<form method="POST" action="<%= url_for :action => 'create_volume' %>" id="storage_volume_form" >
- <div class="dialog_form">
- <div id="new_storage_pool">
- <%= render :partial => 'new_volume_form' %>
- </div>
- </div>
- <!-- FIXME: need to pop up the details dialog again -->
- <% if @return_to_workflow %>
- <%# TODO: update this method in application_helper to take an array, so we can include
- a callback or trigger to to go previous step in flow. %>
- <%= popup_footer("$('#storage_volume_form').submit()", "New Storage Volume") %>
- <% else %>
- <%= popup_footer("$('#storage_volume_form').submit()", "New Storage Volume") %>
- <% end %>
-</form>
-</div>
-<script type="text/javascript">
-function afterStorageVolume(response, status){
- ajax_validation(response, status);
- if (response.success) {
- //this is where I want to publish to...
- //$(document).trigger('STORAGE_VOLUME', [response.new_volume]);
- //but it only picks up correctly right now if I push it here, so this needs to change later
- $('ul.ovirt-tree').trigger('STORAGE_VOLUME', [response.new_volume]);
- <% unless @return_to_workflow -%>
- $(document).trigger('close.facebox');
- <% end -%>
- }
-}
-$(function() {
- var storagevolumeoptions = {
- target: '<%= url_for :action => 'create_volume' %>', // target element to update
- dataType: 'json',
- success: afterStorageVolume // post-submit callback
- };
-
- // bind form using 'ajaxForm'
- $('#storage_volume_form').ajaxForm(storagevolumeoptions);
-});
-</script>
diff --git a/src/app/views/storage/show.rhtml b/src/app/views/storage/show.rhtml
index 7e02f32..dd52d79 100644
--- a/src/app/views/storage/show.rhtml
+++ b/src/app/views/storage/show.rhtml
@@ -12,7 +12,7 @@
</a>
<%if @storage_pool.user_subdividable -%>
<%= link_to image_tag("icon_addstorage.png") + " Add new Volume",
- {:controller => 'storage', :action => 'new_volume', :storage_pool_id => @storage_pool.id},
+ {:controller => 'storage_volume', :action => 'new', :storage_pool_id => @storage_pool.id},
:rel=>"facebox[.bolder]", :class=>"selection_facebox" %>
<% end %>
<a href="#confirm_delete_storage" rel="facebox[.bolder]">
diff --git a/src/app/views/storage/show_volume.rhtml b/src/app/views/storage/show_volume.rhtml
deleted file mode 100644
index f85feaa..0000000
--- a/src/app/views/storage/show_volume.rhtml
+++ /dev/null
@@ -1,87 +0,0 @@
-<%- content_for :title do -%>
- <%=h @storage_volume.display_name %>
-<%- end -%>
-
-<%- content_for :action_links do -%>
- <%if @can_modify -%>
- <%if @storage_volume.supports_lvm_subdivision and @storage_volume.vms.empty? -%>
- <%= link_to image_tag("icon_addstorage.png") + " Add new Volume",
- {:controller => 'storage', :action => 'new_volume', :source_volume_id => @storage_volume.id},
- :rel=>"facebox[.bolder]", :class=>"selection_facebox" %>
- <% end %>
- <%if @storage_volume.deletable -%>
- <a href="#confirm_delete" rel="facebox[.bolder]">
- <%= image_tag "icon_x.png" %> Delete
- </a>
- <%- end -%>
- <%- end -%>
-<%- end -%>
-<%= confirmation_dialog("confirm_delete", "Are you sure?", "delete_volume()") %>
-
- <div class="selection_key">
- <% unless @storage_volume.storage_pool[:type] == "LvmStoragePool" %>
- IP address:<br/>
- <% end %>
- <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
- Port:<br/>
- Target:<br/>
- <% elsif @storage_volume.storage_pool[:type] == "NfsStoragePool" %>
- Export path:<br/>
- <% end %>
- Type:<br/>
- State:<br/>
- Path:<br/>
- <% if @storage_volume[:type] == "IscsiStorageVolume" %>
- LUN:<br/>
- <% elsif @storage_volume[:type] == "NfsStorageVolume" %>
- Filename:<br/>
- <% elsif @storage_volume[:type] == "LvmStorageVolume" %>
- Volume Group:<br/>
- Logical Volume:<br/>
- Permissions (owner/group/mode):<br/>
- <% end %>
- Size:<br/>
- </div>
- <div class="selection_value">
- <% unless @storage_volume.storage_pool[:type] == "LvmStoragePool" %>
- <%=h @storage_volume.storage_pool.ip_addr %><br/>
- <% end %>
- <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
- <%=h @storage_volume.storage_pool.port %><br/>
- <%=h @storage_volume.storage_pool[:target] %><br/>
- <% elsif @storage_volume.storage_pool[:type] == "NfsStoragePool" %>
- <%=h @storage_volume.storage_pool.export_path %><br/>
- <% end %>
- <%=h @storage_volume.storage_pool.get_type_label %><br/>
- <%=h @storage_volume.state %><br/>
- <%=h @storage_volume.path %><br/>
- <% if @storage_volume[:type] == "IscsiStorageVolume" %>
- <%=h @storage_volume.lun %><br/>
- <% elsif @storage_volume[:type] == "NfsStorageVolume" %>
- <%=h @storage_volume.filename %><br/>
- <% elsif @storage_volume[:type] == "LvmStorageVolume" %>
- <%=h @storage_volume.storage_pool.vg_name %><br/>
- <%=h @storage_volume.lv_name %><br/>
- <%=h @storage_volume.lv_owner_perms %>/<%=h @storage_volume.lv_group_perms %>/<%=h @storage_volume.lv_mode_perms %><br/>
- <% end %>
- <%=h @storage_volume.size_in_gb %> GB<br/>
- </div>
-<%- content_for :right do -%>
-
-<%- end -%>
-
-<script type="text/javascript">
- function delete_volume()
- {
- $(document).trigger('close.facebox');
- $.post('<%= url_for :controller => "storage", :action => "delete_volumes" %>',
- { storage_volume_ids: <%= @storage_volume.id %> },
- function(data,status) {
- // FIXME: reload tree
- if (data.alert) {
- $.jGrowl(data.alert);
- }
- empty_summary('storage_selection', 'Storage Pool or Volume');
- }, 'json');
- }
-</script>
diff --git a/src/app/views/storage_volume/_new_volume_form.rhtml b/src/app/views/storage_volume/_new_volume_form.rhtml
new file mode 100644
index 0000000..ae65e18
--- /dev/null
+++ b/src/app/views/storage_volume/_new_volume_form.rhtml
@@ -0,0 +1,24 @@
+<%= error_messages_for 'storage_volume' %>
+
+<!--[form:storage_pool]-->
+<%= hidden_field 'storage_volume', 'storage_pool_id' %>
+<%= hidden_field_tag 'storage_type', @storage_volume.get_type_label %>
+
+<%= text_field_with_label "Size (GB):", 'storage_volume', 'size_in_gb' %>
+
+<%if @storage_volume.get_type_label==StoragePool::LVM -%>
+ <%= text_field_with_label "LV Name:", 'storage_volume', 'lv_name' %>
+
+ <%= text_field_with_label "Owner permissions:", 'storage_volume', 'lv_owner_perms' %>
+
+ <%= text_field_with_label "Group permissions:", 'storage_volume', 'lv_group_perms' %>
+
+ <%= text_field_with_label "Mode permissions:", 'storage_volume', 'lv_mode_perms' %>
+<%- end -%>
+<%= text_field_with_label "LUN:", 'storage_volume', 'lun' if @storage_volume.get_type_label==StoragePool::ISCSI %>
+
+<%= text_field_with_label "Filename:", 'storage_volume', 'filename' if @storage_volume.get_type_label==StoragePool::NFS %>
+
+
+<!--[eoform:storage_volume]-->
+
diff --git a/src/app/views/storage_volume/new.rhtml b/src/app/views/storage_volume/new.rhtml
new file mode 100644
index 0000000..46d379e
--- /dev/null
+++ b/src/app/views/storage_volume/new.rhtml
@@ -0,0 +1,53 @@
+<%- content_for :title do -%>
+ <%= _("Add New Volume") %>
+<%- end -%>
+<%- content_for :description do -%>
+ Add a new Storage Volume to
+ <%= if @storage_volume.get_type_label==StoragePool::LVM
+ @source_volume.display_name
+ else
+ @storage_pool.display_name
+ end %>.
+<%- end -%>
+<div class="panel_header"></div>
+<div class="dialog_form">
+<form method="POST" action="<%= url_for :action => 'create' %>" id="storage_volume_form" >
+ <div class="dialog_form">
+ <div id="new_storage_pool">
+ <%= render :partial => 'new_volume_form' %>
+ </div>
+ </div>
+ <!-- FIXME: need to pop up the details dialog again -->
+ <% if @return_to_workflow %>
+ <%# TODO: update this method in application_helper to take an array, so we can include
+ a callback or trigger to to go previous step in flow. %>
+ <%= popup_footer("$('#storage_volume_form').submit()", "New Storage Volume") %>
+ <% else %>
+ <%= popup_footer("$('#storage_volume_form').submit()", "New Storage Volume") %>
+ <% end %>
+</form>
+</div>
+<script type="text/javascript">
+function afterStorageVolume(response, status){
+ ajax_validation(response, status);
+ if (response.success) {
+ //this is where I want to publish to...
+ //$(document).trigger('STORAGE_VOLUME', [response.new_volume]);
+ //but it only picks up correctly right now if I push it here, so this needs to change later
+ $('ul.ovirt-tree').trigger('STORAGE_VOLUME', [response.new_volume]);
+ <% unless @return_to_workflow -%>
+ $(document).trigger('close.facebox');
+ <% end -%>
+ }
+}
+$(function() {
+ var storagevolumeoptions = {
+ target: '<%= url_for :action => 'create' %>', // target element to update
+ dataType: 'json',
+ success: afterStorageVolume // post-submit callback
+ };
+
+ // bind form using 'ajaxForm'
+ $('#storage_volume_form').ajaxForm(storagevolumeoptions);
+});
+</script>
diff --git a/src/app/views/storage_volume/show.rhtml b/src/app/views/storage_volume/show.rhtml
new file mode 100644
index 0000000..c2434aa
--- /dev/null
+++ b/src/app/views/storage_volume/show.rhtml
@@ -0,0 +1,87 @@
+<%- content_for :title do -%>
+ <%=h @storage_volume.display_name %>
+<%- end -%>
+
+<%- content_for :action_links do -%>
+ <%if @can_modify -%>
+ <%if @storage_volume.supports_lvm_subdivision and @storage_volume.vms.empty? -%>
+ <%= link_to image_tag("icon_addstorage.png") + " Add new Volume",
+ {:controller => 'storage_volume', :action => 'new', :source_volume_id => @storage_volume.id},
+ :rel=>"facebox[.bolder]", :class=>"selection_facebox" %>
+ <% end %>
+ <%if @storage_volume.deletable -%>
+ <a href="#confirm_delete" rel="facebox[.bolder]">
+ <%= image_tag "icon_x.png" %> Delete
+ </a>
+ <%- end -%>
+ <%- end -%>
+<%- end -%>
+<%= confirmation_dialog("confirm_delete", "Are you sure?", "delete_volume()") %>
+
+ <div class="selection_key">
+ <% unless @storage_volume.storage_pool[:type] == "LvmStoragePool" %>
+ IP address:<br/>
+ <% end %>
+ <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
+ Port:<br/>
+ Target:<br/>
+ <% elsif @storage_volume.storage_pool[:type] == "NfsStoragePool" %>
+ Export path:<br/>
+ <% end %>
+ Type:<br/>
+ State:<br/>
+ Path:<br/>
+ <% if @storage_volume[:type] == "IscsiStorageVolume" %>
+ LUN:<br/>
+ <% elsif @storage_volume[:type] == "NfsStorageVolume" %>
+ Filename:<br/>
+ <% elsif @storage_volume[:type] == "LvmStorageVolume" %>
+ Volume Group:<br/>
+ Logical Volume:<br/>
+ Permissions (owner/group/mode):<br/>
+ <% end %>
+ Size:<br/>
+ </div>
+ <div class="selection_value">
+ <% unless @storage_volume.storage_pool[:type] == "LvmStoragePool" %>
+ <%=h @storage_volume.storage_pool.ip_addr %><br/>
+ <% end %>
+ <% if @storage_volume.storage_pool[:type] == "IscsiStoragePool" %>
+ <%=h @storage_volume.storage_pool.port %><br/>
+ <%=h @storage_volume.storage_pool[:target] %><br/>
+ <% elsif @storage_volume.storage_pool[:type] == "NfsStoragePool" %>
+ <%=h @storage_volume.storage_pool.export_path %><br/>
+ <% end %>
+ <%=h @storage_volume.storage_pool.get_type_label %><br/>
+ <%=h @storage_volume.state %><br/>
+ <%=h @storage_volume.path %><br/>
+ <% if @storage_volume[:type] == "IscsiStorageVolume" %>
+ <%=h @storage_volume.lun %><br/>
+ <% elsif @storage_volume[:type] == "NfsStorageVolume" %>
+ <%=h @storage_volume.filename %><br/>
+ <% elsif @storage_volume[:type] == "LvmStorageVolume" %>
+ <%=h @storage_volume.storage_pool.vg_name %><br/>
+ <%=h @storage_volume.lv_name %><br/>
+ <%=h @storage_volume.lv_owner_perms %>/<%=h @storage_volume.lv_group_perms %>/<%=h @storage_volume.lv_mode_perms %><br/>
+ <% end %>
+ <%=h @storage_volume.size_in_gb %> GB<br/>
+ </div>
+<%- content_for :right do -%>
+
+<%- end -%>
+
+<script type="text/javascript">
+ function delete_volume()
+ {
+ $(document).trigger('close.facebox');
+ $.post('<%= url_for :controller => "storage_volume", :action => "destroy" %>',
+ { storage_volume_ids: <%= @storage_volume.id %> },
+ function(data,status) {
+ // FIXME: reload tree
+ if (data.alert) {
+ $.jGrowl(data.alert);
+ }
+ empty_summary('storage_selection', 'Storage Pool or Volume');
+ }, 'json');
+ }
+</script>
--
1.6.0.6
More information about the ovirt-devel
mailing list