From: Jan Provaznik <jprovazn(a)redhat.com>
Delayed_job is used for running background tasks (for now copying ssh key to
running instance). Because it runs as separate process we need to start it when
starting appliance.
Delayed_job package version 2.0.6 should be added to our rpm and can be
downloaded from koji:
http://koji.fedoraproject.org/koji/taskinfo?taskID=2863673
---
aeolus-conductor.spec.in | 6 ++
conf/conductor-delayed_job | 72 ++++++++++++++++++++
src/Rakefile | 7 ++
src/config/environment.rb | 1 +
src/config/initializers/delayed_job.rb | 2 +
.../migrate/20110124103216_create_delayed_jobs.rb | 21 ++++++
src/script/delayed_job | 5 ++
7 files changed, 114 insertions(+), 0 deletions(-)
create mode 100755 conf/conductor-delayed_job
create mode 100644 src/config/initializers/delayed_job.rb
create mode 100644 src/db/migrate/20110124103216_create_delayed_jobs.rb
create mode 100755 src/script/delayed_job
diff --git a/aeolus-conductor.spec.in b/aeolus-conductor.spec.in
index cb0cec8..322db06 100644
--- a/aeolus-conductor.spec.in
+++ b/aeolus-conductor.spec.in
@@ -33,6 +33,7 @@ Requires: rubygem(deltacloud-image-builder-agent)
Requires: rubygem(imagebuilder-console)
Requires: rubygem(rack-restful_submit)
Requires: rubygem(sunspot_rails)
+Requires: rubygem(delayed_job)
Requires: postgresql
Requires: postgresql-server
Requires: ruby-postgres
@@ -123,6 +124,7 @@ mv %{buildroot}/%{app_root}/doc %{buildroot}/%{app_root}/test
%{buildroot}/%{doc
%{__cp} conf/conductor-dbomatic %{buildroot}%{_initrddir}
%{__cp} conf/conductor-condor_refreshd %{buildroot}%{_initrddir}
%{__cp} conf/conductor-image_builder_service %{buildroot}%{_initrddir}
+%{__cp} conf/conductor-delayed_job %{buildroot}%{_initrddir}
%{__cp} conf/aeolus-conductor-httpd.conf
%{buildroot}%{_sysconfdir}/httpd/conf.d/aeolus-conductor.conf
%{__cp} conf/aeolus-conductor.logrotate
%{buildroot}%{_sysconfdir}/logrotate.d/aeolus-conductor
%{__cp} conf/aeolus-conductor.sysconf
%{buildroot}%{_sysconfdir}/sysconfig/aeolus-conductor
@@ -189,6 +191,7 @@ getent passwd aeolus >/dev/null || \
/sbin/chkconfig --add conductor-dbomatic
/sbin/chkconfig --add conductor-condor_refreshd
/sbin/chkconfig --add conductor-image_builder_service
+/sbin/chkconfig --add conductor-delayed_job
%preun daemons
if [ $1 = 0 ]; then
@@ -200,6 +203,8 @@ if [ $1 = 0 ]; then
/sbin/chkconfig --del conductor-condor_refreshd
/sbin/service conductor-image_builder_service stop > /dev/null 2>&1
/sbin/chkconfig --del conductor-image_builder_service
+/sbin/service conductor-delayed_job stop > /dev/null 2>&1
+/sbin/chkconfig --del conductor-delayed_job
fi
%files
@@ -220,6 +225,7 @@ fi
%{_initrddir}/conductor-dbomatic
%{_initrddir}/conductor-condor_refreshd
%{_initrddir}/conductor-image_builder_service
+%{_initrddir}/conductor-delayed_job
%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
%config(noreplace) %{_sysconfdir}/sysconfig/aeolus-conductor
%config(noreplace) %{_sysconfdir}/sysconfig/conductor-rails
diff --git a/conf/conductor-delayed_job b/conf/conductor-delayed_job
new file mode 100755
index 0000000..b0fdc2f
--- /dev/null
+++ b/conf/conductor-delayed_job
@@ -0,0 +1,72 @@
+#!/bin/bash
+#
+#
+# conductor-delayed_job startup script for conductor-delayed_job
+#
+# chkconfig: - 99 01
+# description: conductor-delayed_job is service for running conductor
+# background jobs
+
+[ -r /etc/sysconfig/conductor-rails ] && . /etc/sysconfig/conductor-rails
+
+[ -r /etc/sysconfig/aeolus-conductor ] && . /etc/sysconfig/aeolus-conductor
+
+RAILS_ENV="${RAILS_ENV:-production}"
+CONDUCTOR_DIR="${CONDUCTOR_DIR:-/usr/share/aeolus-conductor}"
+AEOLUS_USER="${AEOLUS_USER:-aeolus}"
+DJOB_LOCKFILE="${DJOB_LOCKFILE:-/var/lock/subsys/conductor-delayed_job}"
+DJOB_PIDFILE="${DJOB_PIDFILE:-/var/run/aeolus-conductor/}"
+
+DJOB_PATH=$CONDUCTOR_DIR/script/
+DJOB_PROG=delayed_job
+
+. /etc/init.d/functions
+
+start() {
+ echo -n "Starting conductor-delayed_job: "
+
+ daemon --user=$AEOLUS_USER $DJOB_PATH/$DJOB_PROG start --pid-dir=$DJOB_PIDFILE
+ RETVAL=$?
+ if [ $RETVAL -eq 0 ] && touch $DJOB_LOCKFILE ; then
+ echo_success
+ echo
+ else
+ echo_failure
+ echo
+ fi
+}
+
+stop() {
+ echo -n "Shutting down conductor-delayed_job: "
+ $DJOB_PATH/$DJOB_PROG stop --pid-dir=$DJOB_PIDFILE
+ RETVAL=$?
+ if [ $RETVAL -eq 0 ] && rm -f $DJOB_LOCKFILE ; then
+ echo_success
+ echo
+ else
+ echo_failure
+ echo
+ fi
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ force-reload)
+ restart
+ ;;
+ *)
+ echo "Usage: conductor-delayed_job {start|stop|restart}"
+ exit 1
+ ;;
+esac
+
+exit $RETVAL
diff --git a/src/Rakefile b/src/Rakefile
index f2d8d21..ad7f788 100644
--- a/src/Rakefile
+++ b/src/Rakefile
@@ -12,4 +12,11 @@ begin
rescue LoadError
end
+begin
+ #gem 'delayed_job', :version => '~>2.0.4'
+ require 'delayed/tasks'
+rescue LoadError
+ STDERR.puts "Run `rake gems:install` to install delayed_job"
+end
+
require 'tasks/rails'
diff --git a/src/config/environment.rb b/src/config/environment.rb
index 986cfe4..cedcb32 100644
--- a/src/config/environment.rb
+++ b/src/config/environment.rb
@@ -54,6 +54,7 @@ Rails::Initializer.run do |config|
config.gem "rb-inotify"
config.gem 'rack-restful_submit', :version => '1.1.2'
config.gem 'sunspot_rails', :lib => 'sunspot/rails'
+ config.gem 'delayed_job', :version => '~>2.0.4'
config.middleware.swap Rack::MethodOverride, 'Rack::RestfulSubmit'
diff --git a/src/config/initializers/delayed_job.rb
b/src/config/initializers/delayed_job.rb
new file mode 100644
index 0000000..a8684b4
--- /dev/null
+++ b/src/config/initializers/delayed_job.rb
@@ -0,0 +1,2 @@
+Delayed::Worker.backend = :active_record
+Delayed::Worker.max_attempts = 1
diff --git a/src/db/migrate/20110124103216_create_delayed_jobs.rb
b/src/db/migrate/20110124103216_create_delayed_jobs.rb
new file mode 100644
index 0000000..943ff9b
--- /dev/null
+++ b/src/db/migrate/20110124103216_create_delayed_jobs.rb
@@ -0,0 +1,21 @@
+class CreateDelayedJobs < ActiveRecord::Migration
+ def self.up
+ create_table :delayed_jobs, :force => true do |table|
+ table.integer :priority, :default => 0 # Allows some jobs to jump to the
front of the queue
+ table.integer :attempts, :default => 0 # Provides for retries, but still
fail eventually.
+ table.text :handler # 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.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/src/script/delayed_job b/src/script/delayed_job
new file mode 100755
index 0000000..edf1959
--- /dev/null
+++ b/src/script/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
--
1.7.4