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