class RailsCloudTasks::Scheduler
Attributes
credentials[R]
logger[R]
Public Class Methods
new( credentials: RailsCloudTasks::Credentials.new, logger: RailsCloudTasks.logger )
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 9 def initialize( credentials: RailsCloudTasks::Credentials.new, logger: RailsCloudTasks.logger ) @credentials = credentials @logger = logger end
Public Instance Methods
client()
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 27 def client configure = lambda { |client| client.configure.credentials = credentials.generate(service_account_email) } @client ||= Google::Cloud::Scheduler.cloud_scheduler.tap(&configure) end
upsert()
click to toggle source
Create & Update scheduler job on Google Cloud TODO: Support to delete scheduled jobs
# File lib/rails_cloud_tasks/scheduler.rb, line 19 def upsert result = { success: [], failure: [] } scheduler_jobs.each do |job| upsert_job(job) ? (result[:success] << job[:name]) : (result[:failure] << job[:name]) end log_output(result) end
Protected Instance Methods
build_job(job)
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 44 def build_job(job) { name: "#{location_path}/jobs/#{scheduler_prefix_name}--#{job[:name]}", schedule: job[:schedule], description: job[:description], time_zone: job[:time_zone], http_target: { uri: "#{host}#{tasks_path}/#{job[:class_name]}", http_method: 'POST', body: job[:args].to_json }.merge(auth) } end
location_path()
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 36 def location_path @location_path ||= client.location_path project: project_id, location: location_id end
log(desc, prefix, tasks)
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 78 def log(desc, prefix, tasks) logger.info(desc) logger.info(prefix + tasks.join("\n #{prefix}")) end
log_output(result)
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 65 def log_output(result) parse_task_name = ->(task) { task.split("#{scheduler_prefix_name}--")[1] } success = result[:success].map(&parse_task_name) failure = result[:failure].map(&parse_task_name) if success.count.positive? log("Successfuly scheduled #{success.count} tasks", '- [✓] ', success) end log("Failed to schedule #{failure.count} tasks", '- [𐄂] ', failure) if failure.count.positive? end
parse_jobs_from_file()
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 58 def parse_jobs_from_file settings = File.read(File.expand_path(scheduler_file_path)) YAML.safe_load(ERB.new(settings).result).map(&:deep_symbolize_keys) rescue Errno::ENOENT [] end
scheduler_jobs()
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 40 def scheduler_jobs parse_jobs_from_file.map(&method(:build_job)) end
Private Instance Methods
upsert_job(job)
click to toggle source
# File lib/rails_cloud_tasks/scheduler.rb, line 85 def upsert_job(job) success = true begin client.create_job parent: location_path, job: job rescue Google::Cloud::AlreadyExistsError client.update_job job: job rescue StandardError => e logger.error(e) success = false end success end