From: Jan Provaznik <[email protected]>

---
 .../controllers/image_factory/builds_controller.rb |   70 ++++++++++++++++++++
 .../image_factory/templates_controller.rb          |   15 ++++-
 src/app/views/image_factory/builds/new.haml        |   55 +++++++++++++++
 src/app/views/image_factory/templates/_images.haml |   20 ++++++
 .../views/image_factory/templates/_properties.haml |    1 +
 src/config/routes.rb                               |    1 +
 6 files changed, 161 insertions(+), 1 deletions(-)
 create mode 100644 src/app/controllers/image_factory/builds_controller.rb
 create mode 100644 src/app/views/image_factory/builds/new.haml
 create mode 100644 src/app/views/image_factory/templates/_images.haml

diff --git a/src/app/controllers/image_factory/builds_controller.rb 
b/src/app/controllers/image_factory/builds_controller.rb
new file mode 100644
index 0000000..97bd32f
--- /dev/null
+++ b/src/app/controllers/image_factory/builds_controller.rb
@@ -0,0 +1,70 @@
+class ImageFactory::BuildsController < ApplicationController
+  before_filter [:require_user, :check_permission]
+
+  def new
+    raise "select template to build" unless id = params[:template_id]
+    @tpl = Template.find(id)
+    if @tpl.imported
+      flash[:warning] = "Build imported template is not supported"
+      redirect_to templates_path
+    end
+    @all_targets = Image.available_targets
+  end
+
+  def create
+    @tpl = Template.find(params[:template_id])
+    @all_targets = Image.available_targets
+
+    if params[:targets].blank?
+      flash.now[:warning] = 'You need to check at least one provider format'
+      render :action => 'new'
+      return
+    end
+
+    @tpl.upload unless @tpl.uploaded
+    errors = {}
+    warnings = []
+    params[:targets].each do |target|
+      begin
+        Image.build(@tpl, target)
+      rescue ImageExistsError
+        warnings << $!.message
+      rescue
+        errors[target] = $!.message
+      end
+    end
+    flash[:warning] = 'Warning: ' + warnings.join unless warnings.empty?
+    if errors.empty?
+      redirect_to image_factory_template_path(@tpl, :details_tab => 'images')
+    else
+      flash_error('Error while trying to build image', errors)
+      render :action => 'new'
+    end
+  end
+
+  def edit
+  end
+
+  def update
+  end
+
+  private
+
+  # TODO: DRY this, is used in templates controller too
+  def get_order(default)
+    @order_dir = params[:order_dir] == 'desc' ? 'desc' : 'asc'
+    @order_field = params[:order_field] || default
+    "#...@order_field} #...@order_dir}"
+  end
+
+  def flash_error(summary, errs)
+    flash.now[:error] ||= {}
+    flash.now[:error][:summary] = summary
+    flash.now[:error][:failures] ||= {}
+    flash.now[:error][:failures].merge!(errs)
+  end
+
+  def check_permission
+    require_privilege(Privilege::IMAGE_MODIFY)
+  end
+end
diff --git a/src/app/controllers/image_factory/templates_controller.rb 
b/src/app/controllers/image_factory/templates_controller.rb
index 2105622..3f18764 100644
--- a/src/app/controllers/image_factory/templates_controller.rb
+++ b/src/app/controllers/image_factory/templates_controller.rb
@@ -11,8 +11,9 @@ class ImageFactory::TemplatesController < 
ApplicationController
   def show
     @tpl = Template.find(params[:id])
     @url_params = params.clone
-    @tab_captions = ['Properties']
+    @tab_captions = ['Properties', 'Images']
     @details_tab = params[:details_tab].blank? ? 'properties' : 
params[:details_tab]
+    load_images(@tpl) if @details_tab == 'images'
     respond_to do |format|
       format.js do
         if @url_params.delete :details_pane
@@ -164,6 +165,18 @@ class ImageFactory::TemplatesController < 
ApplicationController
 
   protected
 
+  def load_images(tpl)
+    @images_header = [
+      {:name => 'NAME', :sort_attr => 'templates.name'},
+      {:name => 'OS', :sort_attr => 'templates.platform'},
+      {:name => 'VERSION', :sort_attr => 'templates.platform_version'},
+      {:name => 'ARCH', :sort_attr => 'templates.architecture'},
+      {:name => 'STATUS', :sort_attr => 'status'},
+    ]
+    require_privilege(Privilege::IMAGE_VIEW)
+    @images = tpl.images
+  end
+
   def load_templates
     @header = [
       {:name => 'NAME', :sort_attr => 'name'},
diff --git a/src/app/views/image_factory/builds/new.haml 
b/src/app/views/image_factory/builds/new.haml
new file mode 100644
index 0000000..3d85f98
--- /dev/null
+++ b/src/app/views/image_factory/builds/new.haml
@@ -0,0 +1,55 @@
+%h2 Build Request
+- form_tag :action => 'create' do
+  = hidden_field_tag :template_id, @tpl.id
+  %h3 Deployment Definition
+  %fieldset.clearfix
+    = label_tag :deploy_name, 'Deployment Definition Name:', :class => 'grid_4'
+    = text_field_tag 'deploy_name', 'Deployment Name', :disabled => true, 
:class => 'grid_3'
+    = text_field_tag 'deploy_description', 'Deployment Description', :disabled 
=> true, :class => 'grid_3'
+  %fieldset.clearfix
+    .prefix_4.grid_6
+      = check_box_tag 'use_for_machine', 1, true, :disabled => true
+      = label_tag 'use_for_machine', 'Use for Machine Definition Name and 
Description'
+  %fieldset.clearfix
+    .grid_7
+      = file_field :templates, :choose_logo, :value => 'Choose Logo', 
:disabled => true
+    = text_field :templates, :logo_text, :value => 'Logo Text (5 characters)', 
:disabled => true, :class => "grid_3"
+
+  %fieldset.clearfix
+    %label.grid_4{:for => :template_group}
+      Template Category:
+    .grid_3
+      = select_tag(:template_group, options_for_select([['User Private', 1]]))
+
+  %h3 Deployment Options
+  %fieldset.clearfix
+    .grid_6
+      %label OS:
+      = @tpl.platform
+    .grid_3
+      Hardware Profile
+    .grid_3.suffix_3
+      Locale
+  %fieldset.clearfix
+    .grid_3
+      %label OS Version:
+      = @tpl.platform_version
+    .grid_3.ra
+      %label Global Settings:
+    .grid_3
+      Small
+    .grid_3
+      Any
+    .grid_3
+      = submit_tag "Config", :name => "config", :disabled => true
+  %h3 Build Options
+  %label Choose Provider Format:
+  %section.clearfix.gap
+    %ul.block
+      - @all_targets.each do |target_id, target|
+        %li
+        = check_box_tag 'targets[]', target_id, false, :id => target_id
+        = label_tag target_id, target['name']
+
+  = submit_tag "Submit to Build", :name => "build"
+  = link_to 'Cancel', image_factory_templates_path, :class => 'button'
diff --git a/src/app/views/image_factory/templates/_images.haml 
b/src/app/views/image_factory/templates/_images.haml
new file mode 100644
index 0000000..3fb1046
--- /dev/null
+++ b/src/app/views/image_factory/templates/_images.haml
@@ -0,0 +1,20 @@
+- form_tag :action => "" do
+  /= restful_submit_tag "Cancel Job", :name => "job_details", :disabled => 
true, :class => "icon"
+  /= restful_submit_tag "Show Job Details", :name => "job_details", :disabled 
=> true, :class => "icon"
+  /= restful_submit_tag "Show Job Log", :name => "job_log", :disabled => true, 
:class => "icon"
+  /= restful_submit_tag "Clear Job History", :name => "job_history", :disabled 
=> true, :class => "icon"
+
+  %table
+    = sortable_table_header(@images_header)
+    %tbody
+      - if @images.empty?
+        %tr
+          %td{:colspan => 5} No Images
+      - else
+        - @images.each do |img|
+          %tr
+            %td= img.template.name
+            %td= img.template.platform
+            %td= img.template.platform_version
+            %td= img.template.architecture
+            %td= img.status
diff --git a/src/app/views/image_factory/templates/_properties.haml 
b/src/app/views/image_factory/templates/_properties.haml
index 0fe33ae..e8bf757 100644
--- a/src/app/views/image_factory/templates/_properties.haml
+++ b/src/app/views/image_factory/templates/_properties.haml
@@ -2,3 +2,4 @@
   Properties for
   = @tpl.name
 = link_to "Edit", edit_image_factory_template_path(@tpl), { :class => 'button' 
}
+= link_to "Build", new_image_factory_build_path(:template_id => @tpl.id), { 
:class => 'button' }
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 99ad7cb..a68bc17 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -40,6 +40,7 @@ ActionController::Routing::Routes.draw do |map|
   map.namespace 'image_factory' do |r|
     r.resources :assemblies, :deployables
     r.resources :templates, :collection => {:collections => :get, 
:add_selected => :get, :metagroup_packages => :get, :remove_package => :get}
+    r.resources :builds
   end
 
   map.connect '/set_layout', :controller => 'application', :action => 
'set_layout'
-- 
1.7.2.3

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to