From: Jan Provaznik <[email protected]>

---
 src/app/controllers/templates_controller.rb        |  200 ++++++++------------
 src/app/util/image_descriptor_xml.rb               |   31 +++
 src/app/views/templates/_basics.haml               |   31 ++--
 src/app/views/templates/_build_images.haml         |    5 -
 src/app/views/templates/_content_selection.haml    |   24 +++
 src/app/views/templates/_groups.haml               |   11 -
 src/app/views/templates/_image_formats.haml        |    7 -
 src/app/views/templates/_managed_content.haml      |   10 +
 src/app/views/templates/_nav.haml                  |   16 --
 src/app/views/templates/_packages.haml             |    6 -
 src/app/views/templates/_platform.haml             |   12 --
 src/app/views/templates/_scripting.haml            |   10 -
 src/app/views/templates/_services.haml             |   23 ---
 src/app/views/templates/_software.haml             |   85 ---------
 src/app/views/templates/_targets.haml              |   18 --
 src/app/views/templates/_templates.haml            |   45 +++--
 src/app/views/templates/build_form.haml            |   27 +++
 src/app/views/templates/builds.haml                |   44 +++++-
 src/app/views/templates/index.haml                 |   27 +++-
 src/app/views/templates/new.haml                   |   50 ++++-
 src/app/views/templates/packages.haml              |    8 -
 src/app/views/templates/services.haml              |   38 ----
 src/app/views/templates/software.haml              |   95 ---------
 src/app/views/templates/summary.haml               |   61 ------
 src/app/views/templates/targets.haml               |    1 -
 .../image_descriptor_platform_repositories.yml     |    4 +
 src/config/image_descriptor_targets.yml            |    8 +-
 27 files changed, 330 insertions(+), 567 deletions(-)
 delete mode 100644 src/app/views/templates/_build_images.haml
 create mode 100644 src/app/views/templates/_content_selection.haml
 delete mode 100644 src/app/views/templates/_groups.haml
 delete mode 100644 src/app/views/templates/_image_formats.haml
 create mode 100644 src/app/views/templates/_managed_content.haml
 delete mode 100644 src/app/views/templates/_nav.haml
 delete mode 100644 src/app/views/templates/_packages.haml
 delete mode 100644 src/app/views/templates/_platform.haml
 delete mode 100644 src/app/views/templates/_scripting.haml
 delete mode 100644 src/app/views/templates/_services.haml
 delete mode 100644 src/app/views/templates/_software.haml
 delete mode 100644 src/app/views/templates/_targets.haml
 create mode 100644 src/app/views/templates/build_form.haml
 delete mode 100644 src/app/views/templates/packages.haml
 delete mode 100644 src/app/views/templates/services.haml
 delete mode 100644 src/app/views/templates/software.haml
 delete mode 100644 src/app/views/templates/summary.haml
 delete mode 100644 src/app/views/templates/targets.haml

diff --git a/src/app/controllers/templates_controller.rb 
b/src/app/controllers/templates_controller.rb
index 974b433..98b2e5f 100644
--- a/src/app/controllers/templates_controller.rb
+++ b/src/app/controllers/templates_controller.rb
@@ -1,160 +1,110 @@
 require 'util/repository_manager'
 
 class TemplatesController < ApplicationController
-  layout :layout
-  before_filter :require_user, :check_permission, :check_for_cancel
-
-  def layout
-    request.xhr? ? false : 'aggregator'
-  end
+  before_filter :require_user
+  before_filter :check_permission, :except => [:index, :builds]
 
   def index
-    @repository_manager = RepositoryManager.new
-    @pools = Pool.list_for_user(@current_user, Privilege::POOL_VIEW)
+    # TODO: add template permission check
+    require_privilege(Privilege::IMAGE_VIEW)
+    @order_dir = params[:order_dir] == 'desc' ? 'desc' : 'asc'
+    @order_field = params[:order_field] || 'name'
+    @templates = Template.find(
+      :all,
+      :include => :images,
+      :order => @order_field + ' ' + @order_dir
+    )
+  end
+
+  def action
+    if params[:new]
+      redirect_to :action => 'new'
+    elsif params[:delete]
+      redirect_to :action => 'delete', :id => params[:id].to_a.first
+    elsif params[:edit]
+      redirect_to :action => 'new', :id => params[:id].to_a.first
+    elsif params[:build]
+      redirect_to :action => 'build_form', 'image[template_id]' => 
params[:id].to_a.first
+    else
+      raise "Unknown action"
+    end
   end
 
   def new
-    update_xml
+    # can't use @template variable - is used by compass (or something other)
+    @tpl = Template.find_or_create(params[:id])
     @repository_manager = RepositoryManager.new
-    @image_descriptor = params[:id] ? Template.find(params[:id]) : Template.new
     @groups = @repository_manager.all_groups(params[:repository])
-    @hardware_profiles = HardwareProfile.find(:all)
-    @all_targets = Image.available_targets
-    if params[:tab].to_s == 'packages'
-      @selected_tab = 'packages'
-      @packages = @repository_manager.all_packages(params[:repository])
-    else
-      @selected_tab = 'groups'
-    end
-
-    if request.xhr?
-      render :partial => @selected_tab
-      return
-    end
-    if params[:build_and_monitor]
-      update_xml
-      redirect_to :action => 'summary', :id => @image_descriptor.id, 
:build=>"build", :targets =>params[:targets]
-    end
-    #if params[:next]
-    #  redirect_to :action => 'services', :id => @image_descriptor
-    #end
-  end
-
-  def packages
-    repository_manager = RepositoryManager.new
-    @packages = repository_manager.get_packages
-  end
-
-  def builds
-    #This will be the list of builds associated with template specified by {id}
   end
 
-  def services
-    update_xml
-    if params[:back]
-      redirect_to :action => 'new', :id => @image_descriptor
-    elsif params[:next]
-      redirect_to :action => 'software', :id => @image_descriptor
-    end
+  def select_package
+    update_group_or_package(:add_package, params[:package], params[:group])
+    render :action => 'new'
   end
 
-  def software
-    @repository_manager = RepositoryManager.new
-    @image_descriptor = params[:id] ? Template.find(params[:id]) : Template.new
-    @groups = @repository_manager.all_groups(params[:repository])
-    if params[:tab].to_s == 'packages'
-      @selected_tab = 'packages'
-      @packages = @repository_manager.all_packages(params[:repository])
-    else
-      @selected_tab = 'groups'
-    end
-
-    if request.xhr?
-      render :partial => @selected_tab
-      return
-    end
-
-    @image_descriptor.update_xml_attributes!(params[:xml] || {})
-
-    if params[:back]
-      redirect_to :action => 'services', :id => @image_descriptor
-    elsif params[:next]
-      # template is complete, upload it
-      @image_descriptor.upload_template
-      @image_descriptor.update_attribute(:complete, true)
-      redirect_to :action => 'summary', :id => @image_descriptor
-    end
+  def remove_package
+    update_group_or_package(:remove_package, params[:package], params[:group])
+    render :action => 'new'
   end
 
-  def summary
-    update_xml
-    @all_targets = Image.available_targets
-    if params[:build]
-      if params[:targets]
-        params[:targets].each do |target|
-          # TODO: support versioning
-          Image.new_if_not_exists(
-            :name => "#...@image_descriptor.xml.name}/#{target}",
-            :target => target,
-            :template_id => params[:id],
-            :status => Image::STATE_QUEUED
-          )
-        end
-      end
+  def create
+    @tpl = (params[:tpl] && !params[:tpl][:id].to_s.empty?) ? 
Template.find(params[:tpl][:id]) : Template.new(params[:tpl])
+    # this is crazy, but we have most attrs in xml and also in model,
+    # synchronize it at first to xml
+    @tpl.update_xml_attributes!(params[:tpl])
+    if @tpl.save
+      redirect_to :action => 'index'
     else
-      if params[:back]
-        redirect_to :action => 'new', :id => @image_descriptor
-      elsif params[:done]
-        redirect_to :controller => 'dashboard', :action => 'index'
-      end
+      @repository_manager = RepositoryManager.new
+      @groups = @repository_manager.all_groups(params[:repository])
+      render :action => 'new'
     end
   end
 
-  def targets
-    @image_descriptor = Template.find(params[:id])
+  def build_form
+    raise "template to build is not set" unless params[:image] and 
params[:image][:template_id]
+    @image = Image.new(params[:image])
     @all_targets = Image.available_targets
   end
 
-  def select_group
-    update_group_or_package(:add_group, params[:group])
+  def build
+    if params[:cancel]
+      redirect_to :action => 'index'
+      return
+    end
+    @image = Image.new(params[:image])
+    params[:targets].each do |target|
+      Image.new_if_not_exists(
+        :name => "#[email protected]}/#{target}",
+        :target => target,
+        :template_id => @image.template_id,
+        :status => Image::STATE_QUEUED
+      )
+    end
+    redirect_to :action => 'builds'
   end
 
-  def remove_group
-    update_group_or_package(:remove_group, params[:group])
+  def builds
+    @running_images = Image.all(:include => :template, :conditions => ['status 
IN (?)', Image::ACTIVE_STATES])
+    @completed_images = Image.all(:include => :template, :conditions => 
{:status => Image::STATE_COMPLETE})
+    require_privilege(Privilege::IMAGE_VIEW)
   end
 
-  def select_package
-    update_group_or_package(:add_package, params[:package], params[:group])
+  def delete
+    Template.destroy(params[:id].to_a)
+    redirect_to :action => 'index'
   end
 
   private
 
-  def check_for_cancel
-    if params[:cancel]
-      redirect_to :controller => "dashboard", :action => 'index'
-      return false
-    end
-    return true
-  end
-
-  def check_permission
-    require_privilege(Privilege::IMAGE_MODIFY)
-  end
-
   def update_group_or_package(method, *args)
-    @image_descriptor = params[:id] ? Template.find(params[:id]) : Template.new
-    @image_descriptor.xml.send(method, *args)
-    @image_descriptor.save_xml!
-    if request.xhr?
-      render :partial => 'selected_packages'
-    else
-      redirect_to :action => 'software', :id => @image_descriptor
-    end
-  end
-
-  def update_xml
-    @image_descriptor = params[:id] ? Template.find(params[:id]) : Template.new
-    @image_descriptor.update_xml_attributes!(params[:xml] || {})
+    @repository_manager = RepositoryManager.new
+    @groups = @repository_manager.all_groups(params[:repository])
+    @tpl = Template.find_or_create(params[:id])
+    @tpl.xml.send(method, *args)
+    # we save template w/o validation (we can add package before name,... is
+    # set)
+    @tpl.save_xml!
   end
 
   def check_permission
diff --git a/src/app/util/image_descriptor_xml.rb 
b/src/app/util/image_descriptor_xml.rb
index 2509cbf..ec8a3ad 100644
--- a/src/app/util/image_descriptor_xml.rb
+++ b/src/app/util/image_descriptor_xml.rb
@@ -64,6 +64,24 @@ class ImageDescriptorXML
     return get_node_text('os')
   end
 
+  def platform_version
+    return get_node_text('os_version')
+  end
+
+  def platform_version=(str)
+    node = get_or_create_node('os_version')
+    node.content = str
+  end
+
+  def architecture
+    return get_node_text('architecture')
+  end
+
+  def architecture=(str)
+    node = get_or_create_node('architecture')
+    node.content = str
+  end
+
   def platforms
     unless @platforms
       @platforms = 
YAML.load_file("#{RAILS_ROOT}/config/image_descriptor_platform_repositories.yml")
@@ -200,6 +218,19 @@ class ImageDescriptorXML
     end
   end
 
+  # FIXME: rewrite cleanly w/o recreating all nodes
+  def remove_package(package, grp = nil)
+    groups = packages_by_group
+    pkgs_node = get_or_create_node('packages')
+    pkgs_node.xpath('.//package').remove
+    groups_node = get_or_create_node('groups')
+    groups_node.xpath('.//group').remove
+    groups.each do |group, pkgs|
+      pkgs.select { |pkg| pkg[:name] != package }.each { |pkg| 
add_package_node(pkgs_node, pkg[:name], group) }
+      add_group_node(groups_node, group)
+    end
+  end
+
   private
 
   def add_group_node(parent, group)
diff --git a/src/app/views/templates/_basics.haml 
b/src/app/views/templates/_basics.haml
index 9e0e7d8..9bdebb1 100644
--- a/src/app/views/templates/_basics.haml
+++ b/src/app/views/templates/_basics.haml
@@ -1,12 +1,19 @@
-#clear
-  %h3 Basic Template Properties
-  %ul
-    %li
-      %label Name
-      = text_field_tag("xml[name]", @image_descriptor.xml.name)
-    %li
-      %label Description
-      = text_field_tag("xml[description]", @image_descriptor.xml.description, 
:rows =>4)
-    %li
-      %label Template Category
-      = select_tag("xml[category]", "<option>User - private</option>")
+%h4 GENERAL INFORMATION
+%p
+  = text_field :tpl, :name
+  = text_field :tpl, :summary
+  = file_field_tag 'logo', :disabled => true
+%p
+  %hr
+  = label :tpl, :platform, 'Platform choice'
+  = select :tpl, :platform, @tpl.xml.platforms.map {|id, p| [p['name'], id]}
+  / FIXME: it's currently possible to choose bad os<->version combination, for 
example
+  / RHEL 11, JS will be required to fix this
+  = select :tpl, :platform_version, @tpl.xml.platforms.map {|id, p| 
p['version']}.sort.uniq
+  = select :tpl, :architecture, @tpl.xml.platforms.map {|id, p| 
p['architecture']}.sort.uniq
+%p
+  = label_tag :bootable, 'Bootable'
+  = radio_button_tag :bootable, 'yes', true, :disabled => true
+  = label_tag :bootable, 'Yes'
+  = radio_button_tag :bootable, 'no', :disabled => true
+  = label_tag :bootable, 'No'
diff --git a/src/app/views/templates/_build_images.haml 
b/src/app/views/templates/_build_images.haml
deleted file mode 100644
index 728c676..0000000
--- a/src/app/views/templates/_build_images.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-#clear
-  .submit
-    = submit_tag("Build", :disabled => true)
-    = submit_tag("Build & Monitor", :name=> "build_and_monitor")
-    = submit_tag("Build & Launch", :disabled => true)
diff --git a/src/app/views/templates/_content_selection.haml 
b/src/app/views/templates/_content_selection.haml
new file mode 100644
index 0000000..7574061
--- /dev/null
+++ b/src/app/views/templates/_content_selection.haml
@@ -0,0 +1,24 @@
+%h4 MANAGED CONTENT SELECTION
+%b Search for Content
+%br
+Repositories to Search:
+%a (Check all)
+%br
+- @repository_manager.repositories.each do |repo|
+  = check_box_tag 'repositories[]', repo.id, true
+  = label_tag 'repositories[]', repo.name
+%br
+= radio_button_tag :show_mode, 'group', true
+= label_tag :show_mode, 'Show by Group'
+= radio_button_tag :show_mode, 'type', false, :disabled => true
+= label_tag :show_mode, 'Show by Type'
+%hr
+%ul{:style => 'height: 300px; overflow: auto;'}
+  - @groups.keys.sort.each do |group|
+    %li
+      %b= group
+      %ul
+        - @groups[group][:packages].each do |pkg, type|
+          %li
+            = pkg
+            %a{:href => url_for(:action => 'select_package', :id => @tpl.id, 
:package => pkg)} Add
diff --git a/src/app/views/templates/_groups.haml 
b/src/app/views/templates/_groups.haml
deleted file mode 100644
index 21fce86..0000000
--- a/src/app/views/templates/_groups.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-%ul{:class => 'groups_to_select selection_list'}
-  - @groups.keys.sort.each do |group|
-    %li
-      - pkgs = @groups[group][:packages].keys.join("','")
-      = group
-      %a{:class => 'select_group action_link', :href => url_for(:action => 
'select_group', :id => params[:id], :group => group)}
-        Select
-      %ul{:class => 'groupkgs'}
-        - @groups[group][:packages].each do |pkg, type|
-          %li
-            = pkg
diff --git a/src/app/views/templates/_image_formats.haml 
b/src/app/views/templates/_image_formats.haml
deleted file mode 100644
index c661694..0000000
--- a/src/app/views/templates/_image_formats.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-#clear
-  %h3 Build Options
-  %label Image formats
-  - @all_targets.each do |target_id, target|
-    %br
-    = check_box_tag 'targets[]', target_id, false
-    = target['name']
diff --git a/src/app/views/templates/_managed_content.haml 
b/src/app/views/templates/_managed_content.haml
new file mode 100644
index 0000000..1e5be90
--- /dev/null
+++ b/src/app/views/templates/_managed_content.haml
@@ -0,0 +1,10 @@
+%h4 MANAGED CONTENT TO BUNDLE
+%hr
+%ul
+  - @tpl.xml.packages.each do |pkg|
+    %li
+      = text_field_tag 'packages[]', pkg[:name], :disabled => true
+      repository (we don't keep it now)
+      %button{:type => 'button', :disabled => 'disabled'} Config
+      %button{:type => 'button', :disabled => 'disabled'} Metadata
+      %a{:href => url_for(:action => 'remove_package', :id => @tpl, :package 
=> pkg[:name])} (Remove)
diff --git a/src/app/views/templates/_nav.haml 
b/src/app/views/templates/_nav.haml
deleted file mode 100644
index c5dab0e..0000000
--- a/src/app/views/templates/_nav.haml
+++ /dev/null
@@ -1,16 +0,0 @@
-- menu = [                                                                     
   |
-  { :id => 'new', :text => 'BASICS', :description => 'Basic RHEL LAMP' },      
   |
-  { :id => 'services', :text => 'SERVICES', :description => 'Add services' },  
   |
-  { :id => 'software', :text => 'SOFTWARE', :description => 'Add software' },  
   |
-  { :id => 'summary', :text => 'SUMMARY', :description => 'Create images' },   
   |
-]                                                                              
   |
-
-#image_descriptor_nav
-  %h2 Create a New Template Master
-  %ul{:class => 'nav'}
-    - menu.each do |item|
-      %li{:class => controller.action_name == item[:id] ? 'selected' : nil}
-        %h4
-          = item[:text]
-        %p
-          = item[:description]
diff --git a/src/app/views/templates/_packages.haml 
b/src/app/views/templates/_packages.haml
deleted file mode 100644
index 1e0c2a5..0000000
--- a/src/app/views/templates/_packages.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%ul{:class => 'packages_to_select selection_list'}
-  - @packages.each do |pkg|
-    %li
-      = pkg[:name]
-      %a{:class => 'select_package action_link', :href => url_for(:action => 
'select_package', :id => params[:id], :package => pkg[:name], :repository => 
pkg[:repository_id])}
-        Select
diff --git a/src/app/views/templates/_platform.haml 
b/src/app/views/templates/_platform.haml
deleted file mode 100644
index a74c812..0000000
--- a/src/app/views/templates/_platform.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-#clear
-  %h3 Platform
-  %ul
-    %li
-      %label Operating System
-      = select_tag("xml[platform]", 
@image_descriptor.xml.platforms.map{|repid, rep| "<option value=\"#{repid}\" 
selected=\"#{repid == @image_descriptor.xml.platform ? 'selected' : 
''}\">#{rep['name']}</option>"}.join.html_safe)
-    %li
-      %label H/W Profile
-      = select_tag("xml[hw_profile]", 
options_for_select(@hardware_profiles.collect{|p| [ p.name, p.id ]}), 
{:included_blank => :true})
-    %li
-      %label Locale
-      =select_tag("xml[locale]", options_for_select(I18n.available_locales, 
I18n.locale.to_sym))
diff --git a/src/app/views/templates/_scripting.haml 
b/src/app/views/templates/_scripting.haml
deleted file mode 100644
index f58c556..0000000
--- a/src/app/views/templates/_scripting.haml
+++ /dev/null
@@ -1,10 +0,0 @@
-#clear
-  %h3 Configuration Scripting
-  %ul
-    %li
-      =check_box_tag("choose_file")
-      =text_field_tag("choose_file","Choose a file")
-      =submit_tag("Browse", :disabled =>true)
-    %li
-      =check_box_tag("puppet")
-      %label Use Puppet
diff --git a/src/app/views/templates/_services.haml 
b/src/app/views/templates/_services.haml
deleted file mode 100644
index 90ba092..0000000
--- a/src/app/views/templates/_services.haml
+++ /dev/null
@@ -1,23 +0,0 @@
-#clear
-  %h3 Cloud Provider Services
-  %ul
-    %li
-      %label S3-Compatible Storage
-      = check_box_tag 'xml[services][amazon3_storage]', '1', 
@image_descriptor.xml.services.include?('amazon3_storage')
-      = label_tag 'xml[services][amazon3_storage]', 'Enable Amazon S3 
storage', :class => "plain"
-    %li
-      %label Inter-node Messaging
-      = check_box_tag 'xml[services][inter_node_messaging]', '1', 
@image_descriptor.xml.services.include?('inter_node_messaging')
-      = label_tag 'xml[services][inter_node_messaging]', 'Enable inter-node 
messaging', :class => "plain"
-    %li
-      %label High Availability
-      = check_box_tag 'xml[services][availability]', '1', 
@image_descriptor.xml.services.include?('availability')
-      = label_tag 'xml[services][availability]', 'Enable high availability 
services', :class => "plain"
-    %li
-      %label JBoss
-      = check_box_tag 'xml[services][jboss]', '1', 
@image_descriptor.xml.services.include?('jboss')
-      = label_tag 'xml[services][jboss]', 'Enable JBoss infrastructure', 
:class => "plain"
-    %li
-      %label Cooling Tower
-      = check_box_tag 'xml[services][cooling_tower]', '1', 
@image_descriptor.xml.services.include?('cooling_tower')
-      = label_tag 'xml[services][cooling_tower]', 'Enable Cooling Tower', 
:class => "plain"
diff --git a/src/app/views/templates/_software.haml 
b/src/app/views/templates/_software.haml
deleted file mode 100644
index 5f94341..0000000
--- a/src/app/views/templates/_software.haml
+++ /dev/null
@@ -1,85 +0,0 @@
-- content_for :scripts do
-  :javascript
-    $(document).ready(function() {
-      // FIXME: don't know, how to disable first ajax load.
-      // On ajax load, new data are only appended to existing content
-      // workaround is to delete existing content before load
-      $(".groups_to_select").remove();
-      $("#dashboard-tabs").tabs({
-        spinner: "Loading...",
-        load: function(event, ui) {
-          $("a.select_group").click(function(ev) {
-            $("#selected_packages").load($(ev.target).attr('href'), 
loadCallback);
-            return false;
-          });
-          $("a.select_package").click(function(ev) {
-            $("#selected_packages").load($(ev.target).attr('href'), 
loadCallback);
-            return false;
-          });
-        }
-      });
-      // when JS is enabled, hide the Dashboard content -- it'll be loaded
-      // by jquery UI tab using ajax
-      $("#dashboard-content").hide();
-      loadCallback();
-    });
-    function loadCallback() {
-      $("a.remove_group").click(function(ev) {
-        $("#selected_packages").load($(ev.target).attr('href'), loadCallback);
-        return false;
-      });
-      createTree();
-    };
-    function createTree() {
-      $("li.group").each(function() {
-        var group = $(this);
-        group.addClass("closed_folder");
-        $(".groupname", group).toggle(
-          function() {
-            group.removeClass("closed_folder");
-            group.addClass("opened_folder");
-            $("ul > li", group).removeClass("hidden");
-          }, function() {
-            group.removeClass("opened_folder");
-            group.addClass("closed_folder");
-            $("ul > li", group).addClass("hidden");
-          }
-        );
-      })
-      $("li.group > ul > li").addClass("hidden");
-    };
-    function get_repository(ev) {
-      var rep = $(ev.target).val();
-      $("#dashboard-tabs > ul > li > a").each(function(index) {
-        var link = $(this).data('load.tabs');
-        if (link.search(/repository=[^$&]*/) == -1) {
-          link = link + "&repository=" + rep;
-        } else {
-          link = link.replace(/repository=[^$&]*/, "repository="+rep);
-        }
-        $("#dashboard-tabs").tabs('url', index, link);
-      });
-      $("#dashboard-tabs").tabs('load', $("#dashboard-tabs").tabs('option', 
'selected'));
-    };
-
-- menu = [ { :text => "Groups", :tab => "groups" }, |
-  { :text => "Packages", :tab => "packages" }, ] |
-#clear
-  %h3 Software
-  = hidden_field_tag 'xml[set_packages]', true
-  .pkglist_wrapper
-    .pkglist
-      #dashboard-tabs{ :class => "ui-tabs ui-widget ui-widget-content 
ui-corner-all" }
-        %ul{ :class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header" }
-          - menu.each do |item|
-            - selection_style = "ui-tabs-selected ui-state-active" if 
item[:tab] == @selected_tab
-            %li{ :class => "#{selection_style} ui-state-default 
ui-corner-top", :style => 'clear: none' }
-              = "<a href=\"#{url_for(:action => "software", :id => 
@image_descriptor, :tab => item[:tab])}\"><span>#{item[:text]}</span></a>"
-          %li{ :class => "select_repository"}
-            = select_tag("repository", (["<option value='all' 
selected='selected'>All</option>"] + @repository_manager.repositories.map{|rep| 
"<option value=\"#{rep.id}\">#{rep.name}</option>"}).join.html_safe, {:onchange 
=> "get_repository(event)"})
-        - unless request.xhr?
-          = render :partial => @selected_tab
-    .pkglist{:style => "margin-left: 30px", :class => "left-pkglist"}
-      %div{:class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
ui-helper-reset ui-helper-clearfix ui-widget-header"}
-        Selected packages
-      = render :partial => 'selected_packages'
diff --git a/src/app/views/templates/_targets.haml 
b/src/app/views/templates/_targets.haml
deleted file mode 100644
index ba8f7f1..0000000
--- a/src/app/views/templates/_targets.haml
+++ /dev/null
@@ -1,18 +0,0 @@
-#image_target_list{:class => 'target_list'}
-  - if @image_descriptor.images.empty?
-    .empty No images have been created yet.
-  -else
-    %ul
-      - @image_descriptor.images.each do |image|
-        %li
-          %span{:class => 'actions'}
-            &nbsp;
-            - if Image::ACTIVE_STATES.include?(image.status)
-              = link_to 'Cancel', {:controller => 'image', :action => 
'cancel', :id => image, :template_id => @image_descriptor}
-          %span{:class => 'status'}
-            = image.status
-          = @all_targets[image.target]['name']
-          %p
-            = image.created_at
-          //%span{:style => 'float:right'}
-          //  Cancel
diff --git a/src/app/views/templates/_templates.haml 
b/src/app/views/templates/_templates.haml
index e075c2e..af24874 100644
--- a/src/app/views/templates/_templates.haml
+++ b/src/app/views/templates/_templates.haml
@@ -1,18 +1,29 @@
-- columns = [                                                               |
-  {:id => 'id', :header => ''},                                             |
-  {:id => 'name', :header => 'Name', :sortable => true},                    |
-]                                                                           |
+- template_columns = [                                            |
+  {:name => '', :sortable => false},                              |
+  {:name => 'NAME', :sort_attr => 'name'},                        |
+  {:name => 'OS', :sort_attr => 'platform'},                      |
+  {:name => 'VERSION', :sort_attr => 'platform_version'},         |
+  {:name => 'BOOTABLE', :sortable => false},                      |
+  {:name => 'ARCH', :sort_attr => 'architecture'},                |
+  {:name => 'TIMES USED', :sort_attr => 'images_count'},          |
+]                                                                 |
 
-- opts = { :order => @order,
-  :order_dir => @order_dir,
-  :title => 'list of templates',
-  :check_all => 'id',
-  :header => defined?(header) ? header : nil,
-  :footer => defined?(footer) ? footer : nil,
-  :single_select => @single_select || false }
-
-= paginated_table('templates_table', columns, @templates, opts) do |rec|
-  %tr{:class => "#{cycle('even', 'odd')}"}
-    %td= check_box_tag 'ids[]', rec.id
-    %td{:class => 'template_name'}= rec.name
-    /%td= rec.instances.count
+%table
+  = sortable_table_header(template_columns)
+  %tbody
+    - if @templates.empty?
+      %tr
+        %td{:colspan => 7} No Templates
+    - else
+      - @templates.each do |tpl|
+        %tr
+          %td= check_box_tag 'id[]', tpl.id
+          %td
+            %img{:src => '', :alt => tpl.platform}
+            = tpl.name
+          %td= tpl.platform
+          %td= tpl.platform_version
+          %td
+            %img{:src => '', :alt => 'yes'}
+          %td= tpl.architecture
+          %td= tpl.images.size
diff --git a/src/app/views/templates/build_form.haml 
b/src/app/views/templates/build_form.haml
new file mode 100644
index 0000000..5cd66e1
--- /dev/null
+++ b/src/app/views/templates/build_form.haml
@@ -0,0 +1,27 @@
+%h2 BUILD REQUEST
+- form_for @image, :url => { :action => "build" } do
+  = hidden_field :image, :template_id
+  %h4 DEPLOYMENT DEFINITION
+  = label_tag :deploy_name, 'Deployment Definition Name'
+  = text_field_tag 'deploy_name', 'Deployment Name', :disabled => true
+  = text_field_tag 'deploy_description', 'Deployment Description', :disabled 
=> true
+  %br
+  = check_box_tag 'use_for_machine', 1, true, :disabled => true
+  = label_tag 'use_for_machine', 'Use for Machine Definition Name and 
Description'
+  %h4 DEPLOYMENT OPTIONS
+  %hr
+  %b OS:
+  = @image.template.platform
+  %b OS Version:
+  = @image.template.platform_version
+  %h4 BUILD OPTIONS
+  %hr
+  %b Choose Provider Format:
+  %ul
+    - @all_targets.each do |target_id, target|
+      %li
+      = check_box_tag 'targets[]', target_id, false
+      = label_tag 'targets[]', target['name']
+
+  = submit_tag "Submit to Build", :name => "build"
+  = submit_tag "Cancel", :name => "cancel"
diff --git a/src/app/views/templates/builds.haml 
b/src/app/views/templates/builds.haml
index 1cab588..27e62c7 100644
--- a/src/app/views/templates/builds.haml
+++ b/src/app/views/templates/builds.haml
@@ -1 +1,43 @@
-Insert page 4200 implementation.
+- columns = [                                                              |
+  {:name => 'NAME', :sort_attr => 'template.name'},                        |
+  {:name => 'OS', :sort_attr => 'template.platform'},                      |
+  {:name => 'VERSION', :sort_attr => 'template.platform_version'},         |
+  {:name => 'ARCH', :sort_attr => 'template.architecture'},                |
+  {:name => 'STATUS', :sortable => false},                                 |
+]                                                                          |
+
+- form_tag :action => "" do
+  %h4 RUNNING
+  %hr
+  %table
+    = sortable_table_header(columns)
+    %tbody
+      - if @running_images.empty?
+        %tr
+          %td{:colspan => 5} No Images
+      - else
+        - @running_images.each do |img|
+          %tr
+            %td= img.template.name
+            %td= img.template.platform
+            %td= img.template.platform_version
+            %td= img.template.architecture
+            %td OK
+
+
+  %h4 COMPLETED
+  %hr
+  %table
+    = sortable_table_header(columns)
+    %tbody
+      - if @completed_images.empty?
+        %tr
+          %td{:colspan => 5} No Images
+      - else
+        - @completed_images.each do |img|
+          %tr
+            %td= img.template.name
+            %td= img.template.platform
+            %td= img.template.platform_version
+            %td= img.template.architecture
+            %td OK
diff --git a/src/app/views/templates/index.haml 
b/src/app/views/templates/index.haml
index 22d8a31..3e2346a 100644
--- a/src/app/views/templates/index.haml
+++ b/src/app/views/templates/index.haml
@@ -1 +1,26 @@
-Insert page 4100 implementation.
+%h2 MANAGE TEMPLATES
+- form_tag(:action => 'action') do
+  %ul
+    %li ACTIONS
+    %li VIEW
+    %li
+      = check_box_tag 'views[]', 'templates', true, :disabled => true
+      = label_tag 'views[]', 'Templates'
+    %li MANAGE
+    %li= submit_tag "Edit", :name => "edit"
+    %li= submit_tag "Delete", :name => "delete"
+    %li= submit_tag "Rename", :name => "rename"
+    %li= submit_tag "Copy", :name => "copy"
+    %li BUILD
+    %li= submit_tag "Build", :name => "build"
+    %li= submit_tag "CREATE NEW", :name => "new"
+
+    %h4 TEMPLATES
+    = render :partial => 'templates'
+
+    %h4 ASSEMBLY
+    %table
+    = render :partial => 'templates'
+
+    %h4 DEPLOYMENT DEFINITIONS
+    = render :partial => 'templates'
diff --git a/src/app/views/templates/new.haml b/src/app/views/templates/new.haml
index 6114b11..ea942b4 100644
--- a/src/app/views/templates/new.haml
+++ b/src/app/views/templates/new.haml
@@ -1,11 +1,39 @@
-#image_descriptor_form{:class => 'dcloud_form'}
-  %h2 Template Builder - Basic Template
-  = error_messages_for 'image_descriptor'
-  -form_for @image_descriptor, :url =>{:action => controller.action_name, :id 
=> @image_descriptor} do
-    = render :partial => "basics"
-    = render :partial => "platform"
-    = render :partial => "services"
-    = render :partial => "software"
-    = render :partial => "scripting"
-    = render :partial => "image_formats"
-    = render :partial => "build_images"
+%h2 TEMPLATE
+- form_for @tpl, :url => { :action => "create" } do
+  = error_messages_for 'tpl'
+  = hidden_field :tpl, :id
+  %div{:style => 'float: right'}
+    = render :partial => 'content_selection'
+  = render :partial => 'basics'
+  %p
+    %h4 LOCAL CONTENT TO BUNDLE
+    %hr
+    = label_tag :local_bundle_name, 'Local'
+    %br
+    = text_field_tag 'local_bundle_name[]', 'Bundle Name', :disabled => true
+    %button{:type => 'button', :disabled => 'disabled'} Browse
+    %button{:type => 'button', :disabled => 'disabled'} Config
+    %button{:type => 'button', :disabled => 'disabled'} Metadata
+    %a (Remove)
+    %br
+    = text_field_tag 'local_bundle_name[]', 'Bundle Name', :disabled => true
+    %button{:type => 'button', :disabled => 'disabled'} Browse
+    %button{:type => 'button', :disabled => 'disabled'} Config
+    %button{:type => 'button', :disabled => 'disabled'} Metadata
+    %a (Add New)
+  %p
+    = render :partial => 'managed_content'
+  %p
+    %h4 PREBOOT CONFIGURATION
+    %hr
+    = radio_button_tag :configure_via_script, 'no', :disabled => true
+    = label_tag :configure_via_script, 'Configure Via Script'
+    = file_field_tag 'script_file', :disabled => true
+    %br
+    = radio_button_tag :configure_via_script, 'no', :disabled => true
+    = label_tag :configure_via_script, 'Configure Via Script'
+    = file_field_tag 'script_file', :disabled => true
+
+  %p
+    = submit_tag "Cancel", :name => "cancel"
+    = submit_tag "Save", :name => "save"
diff --git a/src/app/views/templates/packages.haml 
b/src/app/views/templates/packages.haml
deleted file mode 100644
index 1c84e08..0000000
--- a/src/app/views/templates/packages.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-Packages:
-%br/
-- if @packages
-  - @packages.each do |package|
-    = package
-- else
-  no packages found
-  %br/
diff --git a/src/app/views/templates/services.haml 
b/src/app/views/templates/services.haml
deleted file mode 100644
index 81eed29..0000000
--- a/src/app/views/templates/services.haml
+++ /dev/null
@@ -1,38 +0,0 @@
-= render :partial => "nav"
-
-#image_descriptor_form{:class => 'dcloud_form'}
-  = error_messages_for 'image_descriptor'
-
-  - form_for @image_descriptor, :url => {:action => controller.action_name, 
:id => @image_descriptor} do
-    = hidden_field :image_descriptor, :id
-    = hidden_field_tag 'xml[set_services]', true
-    %ul
-      %li
-        %label Storage
-        = check_box_tag 'xml[services][amazon3_storage]', '1', 
@image_descriptor.xml.services.include?('amazon3_storage')
-        = label_tag 'xml[services][amazon3_storage]', 'Enable Amazon S3 
storage', :class => "plain"
-        .description Provides cloud aware table storage for both user-data and 
guest-images and snapshots compatible with Amazon S3, for any (internal &amp; 
external)cloud deployment
-      %li
-        %label Inter-node Messaging
-        = check_box_tag 'xml[services][inter_node_messaging]', '1', 
@image_descriptor.xml.services.include?('inter_node_messaging')
-        = label_tag 'xml[services][inter_node_messaging]', 'Enable inter-node 
messaging', :class => "plain"
-        .description Provides cloud aware messaging to facilitate 
instance-to-instance and instance-to-external communication compatible with 
Amazon SQS, for any (internal &amp; external)cloud deployment
-      %li
-        %label Availability
-        = check_box_tag 'xml[services][availability]', '1', 
@image_descriptor.xml.services.include?('availability')
-        = label_tag 'xml[services][availability]', 'Enable high availability 
services', :class => "plain"
-        .description Provides REST API's that allow applications and 
administrators to inspect instances and know the active state and 
configuration. Choose high availability to actively maintain and manage 
application availability when run in cloud
-      %li
-        %label JBoss
-        = check_box_tag 'xml[services][jboss]', '1', 
@image_descriptor.xml.services.include?('jboss')
-        = label_tag 'xml[services][jboss]', 'Enable JBoss infrastructure', 
:class => "plain"
-        .description Provides cloud ready JBoss infrastructure to be run in 
public and internal clouds
-      %li
-        %label Cooling Tower
-        = check_box_tag 'xml[services][cooling_tower]', '1', 
@image_descriptor.xml.services.include?('cooling_tower')
-        = label_tag 'xml[services][cooling_tower]', 'Enable Cooling Tower', 
:class => "plain"
-        .description Provides multi-tenant, lightweight container for managing 
many cloud ready PaaS services inside a single instance
-    .submit
-      = submit_tag "Cancel", :name => "cancel"
-      = submit_tag "Back", :name => "back"
-      = submit_tag "Next", :name => "next"
diff --git a/src/app/views/templates/software.haml 
b/src/app/views/templates/software.haml
deleted file mode 100644
index 9d11b5e..0000000
--- a/src/app/views/templates/software.haml
+++ /dev/null
@@ -1,95 +0,0 @@
-- content_for :scripts do
-  :javascript
-    $(document).ready(function() {
-      // FIXME: don't know, how to disable first ajax load.
-      // On ajax load, new data are only appended to existing content
-      // workaround is to delete existing content before load
-      $(".groups_to_select").remove();
-      $("#dashboard-tabs").tabs({
-        spinner: "Loading...",
-        load: function(event, ui) {
-          $("a.select_group").click(function(ev) {
-            $("#selected_packages").load($(ev.target).attr('href'), 
loadCallback);
-            return false;
-          });
-          $("a.select_package").click(function(ev) {
-            $("#selected_packages").load($(ev.target).attr('href'), 
loadCallback);
-            return false;
-          });
-        }
-      });
-      // when JS is enabled, hide the Dashboard content -- it'll be loaded
-      // by jquery UI tab using ajax
-      $("#dashboard-content").hide();
-      loadCallback();
-    });
-    function loadCallback() {
-      $("a.remove_group").click(function(ev) {
-        $("#selected_packages").load($(ev.target).attr('href'), loadCallback);
-        return false;
-      });
-      createTree();
-    };
-    function createTree() {
-      $("li.group").each(function() {
-        var group = $(this);
-        group.addClass("closed_folder");
-        $(".groupname", group).toggle(
-          function() {
-            group.removeClass("closed_folder");
-            group.addClass("opened_folder");
-            $("ul > li", group).removeClass("hidden");
-          }, function() {
-            group.removeClass("opened_folder");
-            group.addClass("closed_folder");
-            $("ul > li", group).addClass("hidden");
-          }
-        );
-      })
-      $("li.group > ul > li").addClass("hidden");
-    };
-    function get_repository(ev) {
-      var rep = $(ev.target).val();
-      $("#dashboard-tabs > ul > li > a").each(function(index) {
-        var link = $(this).data('load.tabs');
-        if (link.search(/repository=[^$&]*/) == -1) {
-          link = link + "&repository=" + rep;
-        } else {
-          link = link.replace(/repository=[^$&]*/, "repository="+rep);
-        }
-        $("#dashboard-tabs").tabs('url', index, link);
-      });
-      $("#dashboard-tabs").tabs('load', $("#dashboard-tabs").tabs('option', 
'selected'));
-    };
-
-
-- menu = [ { :text => "Groups", :tab => "groups" }, |
-  { :text => "Packages", :tab => "packages" }, ] |
-
-= render :partial => "nav"
-
-#image_descriptor_form{:class => 'dcloud_form'}
-  = error_messages_for 'image_descriptor'
-
-  - form_for @image_descriptor, :url => {:action => controller.action_name, 
:id => @image_descriptor} do
-    = hidden_field_tag 'xml[set_packages]', true
-    .pkglist_wrapper
-      .pkglist
-        #dashboard-tabs{ :class => "ui-tabs ui-widget ui-widget-content 
ui-corner-all" }
-          %ul{ :class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header" }
-            - menu.each do |item|
-              - selection_style = "ui-tabs-selected ui-state-active" if 
item[:tab] == @selected_tab
-              %li{ :class => "#{selection_style} ui-state-default 
ui-corner-top", :style => 'clear: none' }
-                = "<a href=\"#{url_for(:action => "software", :id => 
@image_descriptor, :tab => item[:tab])}\"><span>#{item[:text]}</span></a>"
-            %li{ :class => "select_repository"}
-              = select_tag("repository", ["<option value='all' 
selected='selected'>All</option>"] + @repository_manager.repositories.map{|rep| 
"<option value=\"#{rep.id}\">#{rep.name}</option>"}, {:onchange => 
"get_repository(event)"})
-          - unless request.xhr?
-            = render :partial => @selected_tab
-      .pkglist{:style => "margin-left: 30px", :class => "left-pkglist"}
-        %div{:class => "ui-tabs ui-widget ui-widget-content ui-corner-all 
ui-helper-reset ui-helper-clearfix ui-widget-header"}
-          Selected packages
-        = render :partial => 'selected_packages'
-    .submit
-      = submit_tag "Cancel", :name => "cancel"
-      = submit_tag "Back", :name => "back"
-      = submit_tag "Next", :name => "next"
diff --git a/src/app/views/templates/summary.haml 
b/src/app/views/templates/summary.haml
deleted file mode 100644
index 2134f61..0000000
--- a/src/app/views/templates/summary.haml
+++ /dev/null
@@ -1,61 +0,0 @@
-- content_for :scripts do
-  :javascript
-    $(document).ready(function() {
-      var refreshId = setInterval(function() {
-        $('#image_target_list').load('#{url_for :controller => 'templates', 
:action => 'targets', :id => @image_descriptor}');
-      }, 10000);
-      $(".expand_target_list_button").css('display', 'block');
-      $("#image_build_form").css('display', 'none');
-      $(".expand_target_list_button").toggle(
-        function(ev) {
-          $("#image_build_form").css('display', 'block');
-          $(this).val('Cancel');
-        }, function(ev) {
-          $("#image_build_form").css('display', 'none');
-          $(this).val('Build Images');
-        }
-      );
-    });
-
-#image_descriptor_form{:class => 'dcloud_form'}
-  = error_messages_for 'image_descriptor'
-
-  - form_for @image_descriptor, :url => {:action => controller.action_name, 
:id => @image_descriptor} do
-    .summary_panel
-      %ul{:class => 'side_panel'}
-        %li
-          BASICS
-          %label
-            = @image_descriptor.xml.name
-          %label
-            = @image_descriptor.xml.platform
-          %label
-            = @image_descriptor.xml.description
-        %li
-          SERVICES
-          - @image_descriptor.xml.services.each do |service|
-            %label
-              = service
-        //FIXME: software could take realy long space
-        //%li
-        //  SOFTWARE
-
-      %ul{:class => 'main_panel'}
-        .image_build_panel
-          #image_build_form
-            %ul
-              %li
-                %label Image formats
-                %ul
-                  - @all_targets.each do |target_id, target|
-                    %li
-                    = check_box_tag 'targets[]', target_id, false
-                    %span
-                      = target['name']
-            = submit_tag "Build", :name => "build"
-        = render :partial => 'targets'
-
-    .submit
-      = submit_tag "Cancel", :name => "cancel"
-      = submit_tag "Back", :name => "back"
-      = submit_tag "Done", :name => "done"
diff --git a/src/app/views/templates/targets.haml 
b/src/app/views/templates/targets.haml
deleted file mode 100644
index b4351d5..0000000
--- a/src/app/views/templates/targets.haml
+++ /dev/null
@@ -1 +0,0 @@
-= render :partial => 'targets'
diff --git a/src/config/image_descriptor_platform_repositories.yml 
b/src/config/image_descriptor_platform_repositories.yml
index 7169209..0a90329 100644
--- a/src/config/image_descriptor_platform_repositories.yml
+++ b/src/config/image_descriptor_platform_repositories.yml
@@ -1,7 +1,11 @@
 fedora:
   name: Fedora
+  version: 11
+  architecture: 64-bit
   baseurl: 
http://download.fedoraproject.org/pub/fedora/linux/releases/11/Everything/x86_64/os/
 rhel:
   name: RHEL
+  version: 5
+  architecture: 64-bit
   # this should be ignored, it's defined just to be showned in selection tag
   baseurl: 
http://download.fedoraproject.org/pub/fedora/linux/releases/11/Everything/x86_64/os/
diff --git a/src/config/image_descriptor_targets.yml 
b/src/config/image_descriptor_targets.yml
index 669ea53..e859560 100644
--- a/src/config/image_descriptor_targets.yml
+++ b/src/config/image_descriptor_targets.yml
@@ -1,11 +1,11 @@
-rhevm:
-  name: RHEV-M
+#rhevm:
+#  name: RHEV-M
 
 ec2:
   name: Amazon EC2
 
-rackspace:
-  name: RackSpace
+#rackspace:
+#  name: RackSpace
 
 #gogrid:
 #  name: GoGrid
-- 
1.7.2.2

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

Reply via email to