webapp/app/controllers/scripts_controller.rb in cloud-toaster-1.1.5 vs webapp/app/controllers/scripts_controller.rb in cloud-toaster-1.1.6
- old
+ new
@@ -1,8 +1,9 @@
class ScriptsController < ApplicationController
- require "toaster/model/automation"
+ require "toaster/model/automation"
+ require "toaster/model/key_value_pair"
require "toaster/model/automation_attribute"
require "toaster/chef/chef_util"
skip_before_action :verify_authenticity_token
@@ -12,41 +13,48 @@
def edit
if request.post? || request.patch?
if params[:add_param]
auto = cur_auto
+ set_auto_values(auto)
auto.automation_attributes << Toaster::AutomationAttribute.new(
:key => "", :value => "")
elsif params[:del_param]
+ set_auto_values(auto)
params[:auto][:attr].each do |index,attr|
if params[:del_param][index]
to_delete = cur_auto.automation_attributes[index.to_i - 1]
cur_auto.automation_attributes.destroy(to_delete) if to_delete
break
end
end
elsif params[:add_ignoreprop]
auto = cur_auto
+ set_auto_values(auto)
auto.ignore_properties << Toaster::IgnoreProperty.new(
:key => "", :value => "")
elsif params[:del_ignoreprop]
+ set_auto_values(auto)
params[:auto][:ignoreprop].each do |index,attr|
if params[:del_ignoreprop][index]
to_delete = cur_auto.ignore_properties[index.to_i - 1]
cur_auto.ignore_properties.destroy(to_delete) if to_delete
break
end
end
elsif params[:add_additionalprop]
auto = cur_auto
+ set_auto_values(auto)
auto.additional_properties << Toaster::AdditionalProperty.new(
:key => "", :value => "")
elsif params[:del_additionalprop]
+ auto = cur_auto
+ set_auto_values(auto)
params[:auto][:additionalprop].each do |index,attr|
if params[:del_additionalprop][index]
- to_delete = cur_auto.additional_properties[index.to_i - 1]
- cur_auto.additional_properties.destroy(to_delete) if to_delete
+ to_delete = auto.additional_properties[index.to_i - 1]
+ auto.additional_properties.destroy(to_delete) if to_delete
break
end
end
elsif params[:save]
id = params[:auto_id]
@@ -55,44 +63,48 @@
auto = Toaster::Automation.new(
:uuid => Toaster::Util.generate_short_uid)
else
auto = cur_auto
end
- auto.name = params[:auto][:name]
- auto.language = params[:auto][:language]
- auto.visibility = params[:auto][:visibility]
- auto.user = current_user
- auto.script = params[:auto][:script]
- if params[:auto][:attr]
- params[:auto][:attr].each do |index,attr|
- auto.automation_attributes[index.to_i - 1].key = attr["key"]
- auto.automation_attributes[index.to_i - 1].value = attr["value"]
- end
- end
- if params[:auto][:ignoreprop]
- params[:auto][:ignoreprop].each do |index,prop|
- auto.ignore_properties[index.to_i - 1].key = prop["key"]
- end
- end
- if params[:auto][:additionalprop]
- params[:auto][:additionalprop].each do |index,prop|
- auto.additional_properties[index.to_i - 1].key = prop["key"]
- end
- end
+ set_auto_values(auto)
auto.save
redirect_to scripts_url()
end
else
# TODO
end
end
+ def set_auto_values(auto)
+ auto.name = params[:auto][:name]
+ auto.language = params[:auto][:language]
+ auto.visibility = params[:auto][:visibility]
+ auto.user = current_user
+ auto.script = params[:auto][:script]
+ if params[:auto][:attr]
+ params[:auto][:attr].each do |index,attr|
+ auto.automation_attributes[index.to_i - 1].key = attr["key"]
+ auto.automation_attributes[index.to_i - 1].value = attr["value"]
+ end
+ end
+ if params[:auto][:ignoreprop]
+ params[:auto][:ignoreprop].each do |index,prop|
+ auto.ignore_properties[index.to_i - 1].key = prop["key"]
+ end
+ end
+ if params[:auto][:additionalprop]
+ params[:auto][:additionalprop].each do |index,prop|
+ auto.additional_properties[index.to_i - 1].key = prop["key"]
+ end
+ end
+ end
+
def delete
id = params[:auto_id]
a = Toaster::Automation.find(id)
if a
- a.delete
+ a.destroy
end
redirect_to scripts_url()
end
def import_chef
@@ -105,47 +117,74 @@
:cookbook_version => params[:cookbook_version],
:recipes => params[:recipes],
:user => current_user,
:script => script_file
)
- #puts "params[:recipes].split(/[\s,;]+/) #{params[:recipes].split(/[\s,;]+/)}"
+ # get recipes
params[:recipes].split(/[\s,;]+/).each do |rec|
- recipe_info = ChefUtil.parse_resources(
- params[:cookbook], rec, params[:cookbook_version])[params[:cookbook]][rec]
- recipe_info["resources"].each do |line,code|
- action = "__action__"
- resource = "__resource__"
- if recipe_info["resource_objs"][line]
- action = recipe_info["resource_objs"][line].action
- action = action.join(" , ") if action.kind_of?(Array)
- resource = recipe_info["resource_objs"][line].resource_name
- end
- task = Task.new(
- :automation => a,
- :sourceline => line,
- :sourcecode => code,
- :sourcefile => recipe_info["file"],
- :resource => resource,
- :action => action
- )
- task.save
- a.tasks << task
- end
- end
- a.save
- redirect_to scripts_url()
+ begin
+ recipe_info = ChefUtil.parse_resources(
+ params[:cookbook], rec, params[:cookbook_version])[params[:cookbook]][rec]
+ # get recipe parameters
+ insp = ChefNodeInspector.new { |level, msg|
+ if flash[:notice]
+ flash[:notice].concat(msg)
+ else
+ flash[:notice] = [msg]
+ end
+ }
+ attr_hash = insp.get_defaults(params[:cookbook], rec)
+ a.automation_attributes.concat(
+ KeyValuePair.flat_attributes_from_hash(
+ attr_hash, AutomationAttribute))
+
+ recipe_info["resources"].each do |line,code|
+ action = "__action__"
+ resource = "__resource__"
+ if recipe_info["resource_objs"][line]
+ action = recipe_info["resource_objs"][line].action
+ action = action.join(" , ") if action.kind_of?(Array)
+ resource = recipe_info["resource_objs"][line].to_s
+ end
+ task = Task.new(
+ :automation => a,
+ :sourceline => line,
+ :sourcecode => code,
+ :sourcefile => recipe_info["file"],
+ :resource => resource,
+ :action => action
+ )
+ # get task parameters
+ task.task_parameters = ResourceInspector.get_accessed_parameters(task)
+ # save
+ task.save
+ a.tasks << task
+ end
+ # save
+ a.save
+ rescue Object => ex
+ msg = "WARN: Unable to import Chef cookbook '#{params[:cookbook]}', " +
+ "version '#{params[:cookbook_version]}', recipe '#{rec}': #{ex}"
+ flash[:alert] = msg
+ puts msg
+ puts ex.backtrace.join("\n")
+ end
+ end
+ redirect_to scripts_url()
end
end
def cur_auto_reset()
- session[:auto_cur] = nil
+ session[:auto_cur] = nil
end
def cur_auto()
ScriptsController.cur_auto(session, params)
end
def self.cur_auto(session, params)
- if !session[:auto_cur] || "#{session[:auto_cur].id}" != params[:auto_id]
+ if !session[:auto_cur] || (
+ session[:auto_cur].id && "#{session[:auto_cur].id}" != params[:auto_id])
+
session[:auto_cur] = nil
if params[:auto_id] == "0"
session[:auto_cur] = Toaster::Automation.new(
:uuid => Toaster::Util.generate_short_uid)
elsif params[:auto_id]