Page MenuHomeGRNET

No OneTemporary

File Metadata

Created
Sat, Mar 21, 11:34 AM
diff --git a/app/models/job.rb b/app/models/job.rb
index f333e19..723e18a 100644
--- a/app/models/job.rb
+++ b/app/models/job.rb
@@ -1,124 +1,131 @@
class Job < ActiveRecord::Base
belongs_to :domain
scope :pending, -> { where(status: 0) }
+ scope :failed, -> { where(status: 2) }
scope :completed, -> { where(status: [1, 2]) }
def failed?
status == 2
end
def done?
status == 1
end
def pending?
status == 0
end
def arguments
JSON.parse(args)
end
+ def zone
+ return domain.name if domain
+
+ arguments['zone']
+ end
+
def run_event!
args = arguments
raise 'Not an event!' unless args['event']
Domain
.find_by_name(args['zone'])
.fire_state_event(args['event'])
self.status = 1
self.save!
end
class << self
def add_domain(domain)
ActiveRecord::Base.transaction do
jobs_for_domain(domain, :add_domain)
trigger_event(domain, :installed)
end
end
def shutdown_domain(domain)
ActiveRecord::Base.transaction do
job_for_domain(domain, :remove_domain)
job_for_domain(domain, :opendnssec_remove) if domain.dnssec?
trigger_event(domain, :cleaned_up)
end
end
def dnssec_sign(domain)
ActiveRecord::Base.transaction do
job_for_domain(domain, :opendnssec_add, policy: domain.dnssec_policy.name)
job_for_domain(domain, :bind_convert_to_dnssec)
trigger_event(domain, :signed)
end
end
def wait_for_ready(domain)
jobs_for_domain(domain,
:wait_for_ready_to_push_ds)
end
def dnssec_push_ds(domain, dss)
opts = Hash[:dnssec_parent, domain.dnssec_parent,
:dnssec_parent_authority, domain.dnssec_parent_authority,
:dss, dss]
keytag = dss.map { |ds| ds.split.first }.first # Both records should have the same keytag
ActiveRecord::Base.transaction do
job_for_domain(domain, :publish_ds, opts)
job_for_domain(domain, :wait_for_active, keytag: keytag)
trigger_event(domain, :converted)
end
end
def dnssec_rollover_ds(domain, dss)
opts = Hash[:dnssec_parent, domain.dnssec_parent,
:dnssec_parent_authority, domain.dnssec_parent_authority,
:dss, dss]
keytag = dss.map { |ds| ds.split.first }.first # Both records should have the same keytag
ActiveRecord::Base.transaction do
job_for_domain(domain, :publish_ds, opts)
job_for_domain(domain, :wait_for_active, keytag: keytag)
trigger_event(domain, :complete_rollover)
end
end
def convert_to_plain(domain)
ActiveRecord::Base.transaction do
jobs_for_domain(domain,
:remove_domain,
:add_domain,
:opendnssec_remove)
trigger_event(domain, :converted)
end
end
private
def trigger_event(domain, event)
job_for_domain(domain, :trigger_event, event: event)
end
def jobs_for_domain(domain, *job_names)
job_names.each { |job_name| job_for_domain(domain, job_name) }
end
def job_for_domain(domain, job_name, args = {})
args = { zone: domain.name }.merge!(args)
create!(domain: domain, job_type: job_name, args: args.to_json)
end
end
end
diff --git a/lib/tasks/checks.rake b/lib/tasks/checks.rake
new file mode 100644
index 0000000..28889aa
--- /dev/null
+++ b/lib/tasks/checks.rake
@@ -0,0 +1,16 @@
+namespace :check do
+ desc "Find Failing jobs"
+ task failed_jobs: :environment do
+ failed = Job.failed.order('id asc').to_a
+
+ if failed.any?
+ domains = failed.map { |j|
+ j.domain ? "#{j.domain_id}:#{j.zone}" : "nodb:#{j.zone}"
+ }
+ domains = domains[0,3].join(', ') # Output only the first 3 domains
+ puts "1 FailedJobs - WARN - #{failed.size} failed jobs on #{domains.size} domains (#{domains}...)"
+ else
+ puts "0 FailedJobs - OK - 0 failed jobs"
+ end
+ end
+end

Event Timeline