[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