require 'flydata/util/file_util' require 'flydata/api_client' require 'flydata/helper/base_action' require 'rest_client' module Flydata module Helper module Action class CheckRemoteActions < BaseAction include FlydataCore::Logger MAX_ERROR_RETRY = 20 def initialize(config) super @api_client = ApiClient.instance @retry_count = 0 end def execute(opts = {}) action_position = ActionPosition.new(config[:helper]) # Get actions from flydata web server last_id = action_position.load actions = nil begin actions = @api_client.agent.actions(last_id) @retry_count = 0 rescue RestClient::Unauthorized => e log_warn "Stopping agent and helper process due to authentication error. Application was deleted. error:#{e}" yield :stop_agent, nil yield :stop_helper, nil return false rescue => e if @retry_count >= MAX_ERROR_RETRY @retry_count = 0 raise else @retry_count += 1 log_warn "Failed to get actions with error '#{e.to_s}'(#{e.class}). Wait for the next turn." actions = {'actions' => []} end end actions['actions'].each do |action| action_name = action['name'] action_id = action['id'].to_i action_info = build_action_info(action_id, action['config']) # Request action yield action_name.to_sym, action_info last_id = action_id if action_id > last_id end if last_id > 0 action_position.save(last_id) true # for debug else false # for debug end end def build_action_info(id = nil, action_config = nil) action_info = {} action_info[:id] = id if id action_info[:config] = action_config if action_config.kind_of?(Hash) action_info[:config_hash] = action_config elsif !action_config.to_s.strip.empty? action_info[:config_hash] = JSON.parse(action_config.to_s, symbolize_names: true) rescue nil end action_info end end class ActionPosition include Util::FileUtil def initialize(config) @path = config.helper_action_position_path end def save(position) write_line(@path, position.to_s) end def load read_line(@path).to_i end end end end end