diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/.gitkeep | 0 | ||||
-rw-r--r-- | app/controllers/image_upload_controller.rb | 64 | ||||
-rw-r--r-- | app/helpers/.gitkeep | 0 | ||||
-rw-r--r-- | app/helpers/concerns/foreman_image_upload/hosts_helper_extensions.rb | 13 | ||||
-rw-r--r-- | app/mailers/.gitkeep | 0 | ||||
-rw-r--r-- | app/models/.gitkeep | 0 | ||||
-rw-r--r-- | app/models/image_info.rb | 6 | ||||
-rw-r--r-- | app/models/image_upload.rb | 10 | ||||
-rw-r--r-- | app/models/libvirt_extensions.rb | 15 | ||||
-rw-r--r-- | app/overrides/add_link_to_image_upload.rb | 4 | ||||
-rw-r--r-- | app/overrides/dashboard/index/sample_override.html.erb.deface | 4 | ||||
-rw-r--r-- | app/views/.gitkeep | 0 | ||||
-rw-r--r-- | app/views/dashboard/_foreman_image_upload_widget.html.erb | 2 | ||||
-rw-r--r-- | app/views/image_upload/_form.html.erb | 11 | ||||
-rw-r--r-- | app/views/image_upload/index.html.erb | 18 | ||||
-rw-r--r-- | app/views/image_upload/new.html.erb | 2 |
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' %> |