require 'json' require 'logger' require "base64" require "prepare-environment" require "trace-runner" class HelperRun def initialize (_raw) @basePath = "#{Pathname.new(Canzea::config[:catalog_location]).realpath}" @log = Logger.new(Canzea::config[:logging_root] + '/plans.log') @raw = _raw end def runPlan (plans) plans.each { | plan | puts "Running #{plan[:action]}" self.run plan[:solution], plan[:action], JSON.generate(plan[:parameters]) } end def enrich (params) # If there is context information, then merge them into the parameters before calling the helper if (ENV.has_key?('WORK_DIR') and File.exists?ENV['WORK_DIR'] + "/context.json") context = JSON.parse(File.read(ENV['WORK_DIR'] + "/context.json")) result = JSON.parse(params).merge(context) return JSON.generate(result) end return params end def run (solution, action, parameters, status = false) type = "ruby" parameters = self.enrich(parameters) envPush = PrepareEnvironment.new @raw begin root = "#{@basePath}/helpers/#{solution}" if File.exist?("#{@basePath}/blocks/#{solution}/#{action}") root = "#{@basePath}/blocks/#{solution}/#{action}" end envScript = "#{root}/environment.json" if File.exist?(envScript) @log.info("Adding environment variables...") envPush.addToEnv "#{envScript}" end if File.exist?("#{root}/#{action}.sh") type = "shell" elsif File.exist?("#{root}/#{action}.py") type = "python" end r = RunnerWorker.new @raw ENV['CATALOG_LOCATION'] = "#{@basePath}"; ENV['ES_SOLUTION'] = solution; ENV['ES_ACTION'] = action; parameters = Template.new.processString(parameters, {}) if (type == "ruby") cmd = "ruby #{root}/#{action}.rb '#{parameters}'" elsif (type == "python") cmd = "python #{root}/#{action}.py '#{parameters}'" else argList = [] args = JSON.parse(parameters) args.each do | k | argList.push('--' + k[0]) argList.push('"' + k[1] + '"') end cmd = "#{root}/#{action}.sh #{argList.join(' ')}" end r.run cmd, 1, 1, status rescue => exception @log.error(cmd) @log.error(exception.to_s) @log.error(exception.backtrace) abort() end end end