aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/.gitkeep0
-rw-r--r--app/controllers/image_upload_controller.rb64
-rw-r--r--app/helpers/.gitkeep0
-rw-r--r--app/helpers/concerns/foreman_image_upload/hosts_helper_extensions.rb13
-rw-r--r--app/mailers/.gitkeep0
-rw-r--r--app/models/.gitkeep0
-rw-r--r--app/models/image_info.rb6
-rw-r--r--app/models/image_upload.rb10
-rw-r--r--app/models/libvirt_extensions.rb15
-rw-r--r--app/overrides/add_link_to_image_upload.rb4
-rw-r--r--app/overrides/dashboard/index/sample_override.html.erb.deface4
-rw-r--r--app/views/.gitkeep0
-rw-r--r--app/views/dashboard/_foreman_image_upload_widget.html.erb2
-rw-r--r--app/views/image_upload/_form.html.erb11
-rw-r--r--app/views/image_upload/index.html.erb18
-rw-r--r--app/views/image_upload/new.html.erb2
16 files changed, 149 insertions, 0 deletions
diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/controllers/.gitkeep
diff --git a/app/controllers/image_upload_controller.rb b/app/controllers/image_upload_controller.rb
new file mode 100644
index 0000000..475ae32
--- /dev/null
+++ b/app/controllers/image_upload_controller.rb
@@ -0,0 +1,64 @@
+require 'tmpdir'
+
+class ImageUploadController < ApplicationController
+ before_filter :find_compute
+
+ def index
+ end
+
+ def new
+ # Needed for form
+ @image_info = ImageInfo.new
+ end
+
+ def create
+ uploaded = params[:image_info][:image]
+ source = safe_copy uploaded
+
+ # FIXME: allow to set volume name
+ @image_info = ImageInfo.new(:source => source,
+ :pool_name => params[:image_info][:pool_name],
+ :volume_name => File.basename(uploaded.original_filename))
+ begin
+ @compute.upload_image(@image_info.source,
+ @image_info.pool_name,
+ @image_info.volume_name)
+
+ process_success({:success_redirect => compute_resource_image_upload_index_path(@compute),
+ :success_msg => "Successfully uploaded '#{@image_info.volume_name}' to '#{@image_info.pool_name}'"}
+ )
+ rescue Foreman::Exception => e
+ process_error({:error_redirect => compute_resource_image_upload_index_path(@compute),
+ :error_msg => "#{e}"})
+ end
+
+ rm_copy
+ end
+
+ def find_compute
+ return not_found unless params[:compute_resource_id].present?
+ @compute = ::ComputeResource.find(params[:compute_resource_id])
+ return not_found unless @compute.capabilities.include?(:image)
+ end
+
+ private
+
+ def safe_copy(uploaded)
+ # FIXME: need to fix fog to accep IO instead of filename to save
+ # fthe extra copy
+ image_dir = Rails.root.join 'uploaded_images'
+ Dir.mkdir image_dir unless File.directory? image_dir
+
+ source = image_dir.join uploaded.original_filename
+ File.open(source, 'wb') do |f|
+ f.write(uploaded.read)
+ end
+ source
+ end
+
+ def rm_copy
+ File.unlink @image_info.source if File.exists? @image_info.source
+ @image_info.source = nil
+ end
+
+end
diff --git a/app/helpers/.gitkeep b/app/helpers/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/helpers/.gitkeep
diff --git a/app/helpers/concerns/foreman_image_upload/hosts_helper_extensions.rb b/app/helpers/concerns/foreman_image_upload/hosts_helper_extensions.rb
new file mode 100644
index 0000000..e13f29f
--- /dev/null
+++ b/app/helpers/concerns/foreman_image_upload/hosts_helper_extensions.rb
@@ -0,0 +1,13 @@
+module ForemanImageUpload
+ module HostsHelperExtensions
+ extend ActiveSupport::Concern
+
+ included do
+ # execute callbacks
+ end
+
+ # create or overwrite instance methods...
+ def instance_method_name
+ end
+ end
+end
diff --git a/app/mailers/.gitkeep b/app/mailers/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/mailers/.gitkeep
diff --git a/app/models/.gitkeep b/app/models/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/models/.gitkeep
diff --git a/app/models/image_info.rb b/app/models/image_info.rb
new file mode 100644
index 0000000..9f84379
--- /dev/null
+++ b/app/models/image_info.rb
@@ -0,0 +1,6 @@
+class ImageInfo
+ include ActiveModel::Model
+ attr_accessor :source
+ # Libvirt specific
+ attr_accessor :pool_name, :volume_name
+end
diff --git a/app/models/image_upload.rb b/app/models/image_upload.rb
new file mode 100644
index 0000000..22a8381
--- /dev/null
+++ b/app/models/image_upload.rb
@@ -0,0 +1,10 @@
+class ImageUpload
+
+ def initialize(opts = {})
+ @compute = opts[:compute]
+ end
+
+ private
+ attr_reader :compute
+
+end
diff --git a/app/models/libvirt_extensions.rb b/app/models/libvirt_extensions.rb
new file mode 100644
index 0000000..b9b55c9
--- /dev/null
+++ b/app/models/libvirt_extensions.rb
@@ -0,0 +1,15 @@
+module LibvirtExtensions
+ extend ActiveSupport::Concern
+
+ def upload_image source, pool_name, volume_name
+ begin
+ vol = new_volume(:name => volume_name,
+ :pool_name => pool_name,
+ :capacity => "#{File.size(source)}b")
+ vol.save
+ vol.upload_image source
+ rescue Libvirt::Error => e
+ raise Foreman::Exception.new("Cannot upload image '#{volume_name}' to '#{pool_name}': #{e}")
+ end
+ end
+end
diff --git a/app/overrides/add_link_to_image_upload.rb b/app/overrides/add_link_to_image_upload.rb
new file mode 100644
index 0000000..183816d
--- /dev/null
+++ b/app/overrides/add_link_to_image_upload.rb
@@ -0,0 +1,4 @@
+Deface::Override.new(:virtual_path => 'compute_resources/index',
+ :name => 'upload_image',
+ :insert_top => 'td:last',
+ :text => "<%= link_to 'Image upload',compute_resource_image_upload_index_path(compute), :class => 'btn btn-default btn-sm', :disabled => !compute.capabilities.include?(:image) %>")
diff --git a/app/overrides/dashboard/index/sample_override.html.erb.deface b/app/overrides/dashboard/index/sample_override.html.erb.deface
new file mode 100644
index 0000000..2fce29d
--- /dev/null
+++ b/app/overrides/dashboard/index/sample_override.html.erb.deface
@@ -0,0 +1,4 @@
+<!-- insert_before 'div:contains("title_action")' -->
+<%= title_actions "<h2>ForemanImageUpload</h2>" %>
+
+<!-- vim: set ft=eruby : -->
diff --git a/app/views/.gitkeep b/app/views/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/views/.gitkeep
diff --git a/app/views/dashboard/_foreman_image_upload_widget.html.erb b/app/views/dashboard/_foreman_image_upload_widget.html.erb
new file mode 100644
index 0000000..88b52ca
--- /dev/null
+++ b/app/views/dashboard/_foreman_image_upload_widget.html.erb
@@ -0,0 +1,2 @@
+<h4 class="header ca"><%= _('ForemanImageUpload') %></h4>
+<%= _('Widget content') %>
diff --git a/app/views/image_upload/_form.html.erb b/app/views/image_upload/_form.html.erb
new file mode 100644
index 0000000..8faa14e
--- /dev/null
+++ b/app/views/image_upload/_form.html.erb
@@ -0,0 +1,11 @@
+<%= form_for(@image_info,
+ :url => compute_resource_image_upload_index_path(@compute)
+) do |f| %>
+
+<%= f.label :image %>
+<%= f.file_field :image %>
+
+<%= selectable_f f, :pool_name, @compute.storage_pools.map(&:name), { }, :label => _("Upload to storage pool"), :label_size => "col-md-2" %>
+
+<%= submit_or_cancel f, false, :cancel_path => compute_resource_image_upload_index_path(@compute) %>
+<% end %>
diff --git a/app/views/image_upload/index.html.erb b/app/views/image_upload/index.html.erb
new file mode 100644
index 0000000..380ae57
--- /dev/null
+++ b/app/views/image_upload/index.html.erb
@@ -0,0 +1,18 @@
+<% title "Image upload for #{@compute.name}" %>
+
+<% title_actions button_group(link_to_if_authorized _('Upload Imge'), hash_for_new_compute_resource_image_upload_path(params[:compute_resource_id]), :class => 'btn btn-default') %>
+
+<table class="table table-bordered table-striped table-condensed" data-table='inline'>
+ <thead>
+ <th>Pool</th>
+ <th>Capacity</th>
+ </thead>
+ <tbody>
+ <% @compute.storage_pools.each do |pool| %>
+ <tr>
+ <td><%= pool.name %></td>
+ <td><%= pool.capacity %></td>
+ </tr>
+ <% end -%>
+ </tbody>
+</table>
diff --git a/app/views/image_upload/new.html.erb b/app/views/image_upload/new.html.erb
new file mode 100644
index 0000000..426be11
--- /dev/null
+++ b/app/views/image_upload/new.html.erb
@@ -0,0 +1,2 @@
+<% title _('Upload Image') %>
+<%= render :partial => 'form' %>