From 4cedb2cf7827c059e48ff9112a78bb6413f0fe1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andres=20Keskk=C3=BCla?= Date: Tue, 11 Nov 2014 17:00:41 +0200 Subject: [PATCH] Basic delayed job implementation --- Gemfile | 5 ++++ Gemfile.lock | 8 +++++ .../concerns/domain_version_observer.rb | 30 +++++++++++++++++++ app/models/domain_version.rb | 1 + app/models/whois_domain.rb | 3 ++ app/models/whois_server.rb | 4 +++ bin/delayed_job | 5 ++++ config/database-example.yml | 6 ++++ .../20141111105931_create_delayed_jobs.rb | 22 ++++++++++++++ db/schema.rb | 18 ++++++++++- db/seeds.rb | 2 ++ doc/whois.rm | 23 ++++++++++++++ 12 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 app/models/concerns/domain_version_observer.rb create mode 100644 app/models/whois_domain.rb create mode 100644 app/models/whois_server.rb create mode 100755 bin/delayed_job create mode 100644 db/migrate/20141111105931_create_delayed_jobs.rb create mode 100644 doc/whois.rm diff --git a/Gemfile b/Gemfile index 57b6ab9c9..9721cafc5 100644 --- a/Gemfile +++ b/Gemfile @@ -74,6 +74,11 @@ gem 'rails-settings-cached', '0.4.1' gem 'net-ssh' gem 'net-scp' +# delayed job +gem 'delayed_job_active_record', '~> 4.0.2' +# to process delayed jobs +gem 'daemons' + group :development, :test do gem 'capybara', '~> 2.4.1' # For feature testing diff --git a/Gemfile.lock b/Gemfile.lock index bcf4aedcb..acc513d72 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -78,8 +78,14 @@ GEM coffee-script-source execjs coffee-script-source (1.8.0) + daemons (1.1.9) database_cleaner (1.3.0) debug_inspector (0.0.2) + delayed_job (4.0.4) + activesupport (>= 3.0, < 4.2) + delayed_job_active_record (4.0.2) + activerecord (>= 3.0, < 4.2) + delayed_job (>= 3.0, < 4.1) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) devise (3.3.0) @@ -362,7 +368,9 @@ DEPENDENCIES cancan (~> 1.6.10) capybara (~> 2.4.1) coffee-rails (~> 4.0.0) + daemons database_cleaner (~> 1.3.0) + delayed_job_active_record (~> 4.0.2) devise (~> 3.3.0) epp (~> 1.4.0) epp-xml (~> 0.7.0) diff --git a/app/models/concerns/domain_version_observer.rb b/app/models/concerns/domain_version_observer.rb new file mode 100644 index 000000000..e3d37ee3e --- /dev/null +++ b/app/models/concerns/domain_version_observer.rb @@ -0,0 +1,30 @@ +module DomainVersionObserver + extend ActiveSupport::Concern + + included do + after_save :delayed_whois_update + end + + private + + def delayed_whois_update + name = domain_name + return unless name + body = snapshot + delay.update_whois(name, body) + end + + # not sure we need to pass in the params since i don't know if delayed job has access to + # all the regular attributes and stuff + def update_whois(domain_name, body) + wd = WhoisDomain.find_or_initialize_by(name: domain_name) + wd.body = body + wd.save! + end + + def domain_name + name = reify.try(:name) + name = load_snapshot[:domain][:name] if event == 'create' + return name if name + end +end diff --git a/app/models/domain_version.rb b/app/models/domain_version.rb index 2c1581e5c..bafb37318 100644 --- a/app/models/domain_version.rb +++ b/app/models/domain_version.rb @@ -1,5 +1,6 @@ class DomainVersion < PaperTrail::Version include UserEvents + include DomainVersionObserver if Setting.whois_enabled # unless Setting.whois_enabled scope :deleted, -> { where(event: 'destroy') } diff --git a/app/models/whois_domain.rb b/app/models/whois_domain.rb new file mode 100644 index 000000000..3a38465bd --- /dev/null +++ b/app/models/whois_domain.rb @@ -0,0 +1,3 @@ +class WhoisDomain < WhoisServer + self.table_name = 'domains' +end diff --git a/app/models/whois_server.rb b/app/models/whois_server.rb new file mode 100644 index 000000000..5892f7891 --- /dev/null +++ b/app/models/whois_server.rb @@ -0,0 +1,4 @@ +class WhoisServer < ActiveRecord::Base + self.abstract_class = true + establish_connection :"#{Rails.env}_whois" +end diff --git a/bin/delayed_job b/bin/delayed_job new file mode 100755 index 000000000..edf195985 --- /dev/null +++ b/bin/delayed_job @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby + +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) +require 'delayed/command' +Delayed::Command.new(ARGV).daemonize diff --git a/config/database-example.yml b/config/database-example.yml index 37e52ad97..f19b20c42 100644 --- a/config/database-example.yml +++ b/config/database-example.yml @@ -17,3 +17,9 @@ test: production: <<: *default database: registry_production + +development_whois: + database: whois_development + +test_whois: + database: test_whois diff --git a/db/migrate/20141111105931_create_delayed_jobs.rb b/db/migrate/20141111105931_create_delayed_jobs.rb new file mode 100644 index 000000000..f7de70bdc --- /dev/null +++ b/db/migrate/20141111105931_create_delayed_jobs.rb @@ -0,0 +1,22 @@ +class CreateDelayedJobs < ActiveRecord::Migration + def self.up + create_table :delayed_jobs, :force => true do |table| + table.integer :priority, :default => 0, :null => false # Allows some jobs to jump to the front of the queue + table.integer :attempts, :default => 0, :null => false # Provides for retries, but still fail eventually. + table.text :handler, :null => false # YAML-encoded string of the object that will do work + table.text :last_error # reason for last failure (See Note below) + table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. + table.datetime :locked_at # Set when a client is working on this object + table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) + table.string :locked_by # Who is working on this object (if locked) + table.string :queue # The name of the queue this job is in + table.timestamps + end + + add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority' + end + + def self.down + drop_table :delayed_jobs + end +end diff --git a/db/schema.rb b/db/schema.rb index c436862b9..63fbc9a07 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20141105150721) do +ActiveRecord::Schema.define(version: 20141111105931) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -91,6 +91,22 @@ ActiveRecord::Schema.define(version: 20141105150721) do t.datetime "updated_at" end + create_table "delayed_jobs", force: true do |t| + t.integer "priority", default: 0, null: false + t.integer "attempts", default: 0, null: false + t.text "handler", null: false + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.string "queue" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree + create_table "delegation_signers", force: true do |t| t.integer "domain_id" t.string "key_tag" diff --git a/db/seeds.rb b/db/seeds.rb index e16c5ad19..c64299fab 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -77,3 +77,5 @@ Setting.ns_min_count = 2 Setting.ns_max_count = 11 Setting.transfer_wait_time = 0 + +Setting.whois_enabled = true diff --git a/doc/whois.rm b/doc/whois.rm new file mode 100644 index 000000000..f04702f6a --- /dev/null +++ b/doc/whois.rm @@ -0,0 +1,23 @@ +Connection with whois +------------------------------------ + +The easiest way to get started without whois is to change Settings.whois_enabled to false. But like expected, +that disables whois (effects should fully be loaded after restarting the app) +What whois_enabled=false does is that the whois callback does not get included. +Delayed jobs migration and everything else will still be installed tho. + +If you wish to use the whois module, tho, you need a whois database looking something like this + +```ruby + create_table :domains do |t| + t.string :name + t.text :body + t.timestamps + end +``` + +NB! Migration with rake tasks is available in whois app repo. + +For development, delayed_job queue can be handled by rake task +`rake jobs:work` or if you wish to be fancy you can use a daemon with `bin/delayed_job start` + ``