From be945de33c794a449c5fcbf991db4bf0d49b1fb7 Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Tue, 14 Jun 2016 19:14:10 +0200 Subject: Initial commit --- app/controllers/.gitkeep | 0 app/controllers/image_upload_controller.rb | 64 ++++++++++++++++++++++ app/helpers/.gitkeep | 0 .../hosts_helper_extensions.rb | 13 +++++ app/mailers/.gitkeep | 0 app/models/.gitkeep | 0 app/models/image_info.rb | 6 ++ app/models/image_upload.rb | 10 ++++ app/models/libvirt_extensions.rb | 15 +++++ app/overrides/add_link_to_image_upload.rb | 4 ++ .../index/sample_override.html.erb.deface | 4 ++ app/views/.gitkeep | 0 .../_foreman_image_upload_widget.html.erb | 2 + app/views/image_upload/_form.html.erb | 11 ++++ app/views/image_upload/index.html.erb | 18 ++++++ app/views/image_upload/new.html.erb | 2 + 16 files changed, 149 insertions(+) create mode 100644 app/controllers/.gitkeep create mode 100644 app/controllers/image_upload_controller.rb create mode 100644 app/helpers/.gitkeep create mode 100644 app/helpers/concerns/foreman_image_upload/hosts_helper_extensions.rb create mode 100644 app/mailers/.gitkeep create mode 100644 app/models/.gitkeep create mode 100644 app/models/image_info.rb create mode 100644 app/models/image_upload.rb create mode 100644 app/models/libvirt_extensions.rb create mode 100644 app/overrides/add_link_to_image_upload.rb create mode 100644 app/overrides/dashboard/index/sample_override.html.erb.deface create mode 100644 app/views/.gitkeep create mode 100644 app/views/dashboard/_foreman_image_upload_widget.html.erb create mode 100644 app/views/image_upload/_form.html.erb create mode 100644 app/views/image_upload/index.html.erb create mode 100644 app/views/image_upload/new.html.erb (limited to 'app') diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep new file mode 100644 index 0000000..e69de29 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 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 diff --git a/app/models/.gitkeep b/app/models/.gitkeep new file mode 100644 index 0000000..e69de29 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 @@ + +<%= title_actions "

ForemanImageUpload

" %> + + diff --git a/app/views/.gitkeep b/app/views/.gitkeep new file mode 100644 index 0000000..e69de29 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 @@ +

<%= _('ForemanImageUpload') %>

+<%= _('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') %> + + + + + + + + <% @compute.storage_pools.each do |pool| %> + + + + + <% end -%> + +
PoolCapacity
<%= pool.name %><%= pool.capacity %>
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' %> -- cgit v1.2.3