class CronKubernetes::CronTab

The “table” of Kubernetes CronJobs that we manage in the cluster.

Public Instance Methods

update(schedule = nil) click to toggle source

“Apply” the new configuration

- remove from cluster any cron_jobs that are no longer in the schedule
- add new jobs
- update cron_jobs that exist (deleting a cron_job deletes the job and pod)
# File lib/cron_kubernetes/cron_tab.rb, line 10
def update(schedule = nil)
  schedule ||= CronKubernetes::Scheduler.instance.schedule
  add, change, remove = diff_schedules(schedule, current_cron_jobs)
  remove.each { |job| remove_cron_job(job) }
  add.each { |job| add_cron_job(job) }
  change.each { |job| update_cron_job(job) }
end

Private Instance Methods

add_cron_job(job) click to toggle source

Add a CronKubernetes::CronJob to the Kubernetes cluster

# File lib/cron_kubernetes/cron_tab.rb, line 54
def add_cron_job(job)
  client.create_cron_job(Kubeclient::Resource.new(job.cron_job_manifest))
end
client() click to toggle source
# File lib/cron_kubernetes/cron_tab.rb, line 20
def client
  @client ||= CronKubernetes::KubernetesClient.new.batch_beta1_client
end
current_cron_jobs() click to toggle source

Find all k8s CronJobs by our label for the identifier

# File lib/cron_kubernetes/cron_tab.rb, line 30
def current_cron_jobs
  client.get_cron_jobs(label_selector)
end
diff_schedules(new, existing) click to toggle source
# File lib/cron_kubernetes/cron_tab.rb, line 34
def diff_schedules(new, existing)
  new_index = index_cron_jobs(new)
  existing_index = index_kubernetes_cron_jobs(existing)
  add_keys    = new_index.keys - existing_index.keys
  remove_keys = existing_index.keys - new_index.keys
  change_keys = new_index.keys & existing_index.keys

  [
      new_index.values_at(*add_keys),
      new_index.values_at(*change_keys),
      existing_index.values_at(*remove_keys)
  ]
end
index_cron_jobs(jobs) click to toggle source
# File lib/cron_kubernetes/cron_tab.rb, line 62
def index_cron_jobs(jobs)
  jobs.map { |job| ["#{job.identifier}-#{job.name}", job] }.to_h
end
index_kubernetes_cron_jobs(jobs) click to toggle source
# File lib/cron_kubernetes/cron_tab.rb, line 66
def index_kubernetes_cron_jobs(jobs)
  jobs.map { |job| [job.metadata.name, job] }.to_h
end
label_selector() click to toggle source

Define a label for our jobs based on an identifier

# File lib/cron_kubernetes/cron_tab.rb, line 25
def label_selector
  {label_selector: "cron-kubernetes-identifier=#{CronKubernetes.identifier}"}
end
remove_cron_job(job) click to toggle source

Remove a Kubeclient::Resource::CronJob from the Kubernetes cluster

# File lib/cron_kubernetes/cron_tab.rb, line 49
def remove_cron_job(job)
  client.delete_cron_job(job.metadata.name, job.metadata.namespace)
end
update_cron_job(job) click to toggle source
# File lib/cron_kubernetes/cron_tab.rb, line 58
def update_cron_job(job)
  client.update_cron_job(Kubeclient::Resource.new(job.cron_job_manifest))
end