dronejob 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d88b29b5d14a2265c6995aadc9b1311a60ec75b1
4
- data.tar.gz: 098e871db099aac491e1597aa291f725426f2bd6
3
+ metadata.gz: 6cae818f5050ff58791380e627c546e63efdddca
4
+ data.tar.gz: 1131b202e4e2edf76fecfd6367003bc93d85baac
5
5
  SHA512:
6
- metadata.gz: d2e247b70efef090e89a2772360ef4acb56cb0c8a6ea1d2d504ef9af61446850bbc7e2b2ae275dc92b3726f7c2bf89c0202914e9598f65d40eea4ab625457d0f
7
- data.tar.gz: 06a0097b2444fa76547a11f2f511ef3a23f9672f706dec4518c5ed4b35fae32308eef4e50fc87edfb4a1de67308ee952ff5ca15af9bf67d588bcbd97859ca689
6
+ metadata.gz: e0c6d490e93388f63e4bf6a19e3ff87d5f711408b12902554f8a5deecb3e4bbdaeb9cf28b8e874e9ffab8c8355e71bd3886612b7c5e1dbca21a95b5d158d1b9d
7
+ data.tar.gz: 24e8e35a177f6130e02f5acefde34bfb96e530246cb25880e7d679c4ae65ce25462ceebe78862747ce877e1253603fdcb4cd7f5d596b2f752c300846cd84e1bf
data/.gitignore CHANGED
@@ -1,3 +1,3 @@
1
1
  /*.gem
2
- jobs/*
3
- workers/*
2
+ app/*
3
+ tmp/*
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem "gcloud", github: "GoogleCloudPlatform/gcloud-ruby", branch: "master"
5
+ gem "gcloud", github: "GoogleCloudPlatform/gcloud-ruby", branch: "master"
data/Gemfile.lock CHANGED
@@ -13,14 +13,11 @@ GIT
13
13
  PATH
14
14
  remote: .
15
15
  specs:
16
- dronejob (1.0.1)
16
+ dronejob (1.0.2)
17
17
  activejob (~> 4.2)
18
18
  bundler (~> 1.11)
19
19
  gcloud (~> 0.6)
20
20
  git (~> 1.2)
21
- google-api-client (~> 0.8)
22
- logging (~> 2.0)
23
- logging-google-cloud (~> 1.0)
24
21
  rake (~> 10.5)
25
22
  thor (~> 0.19)
26
23
 
@@ -79,9 +76,6 @@ GEM
79
76
  logging (2.0.0)
80
77
  little-plugger (~> 1.1)
81
78
  multi_json (~> 1.10)
82
- logging-google-cloud (1.0.2)
83
- gcloud (~> 0.6)
84
- logging (~> 2.0)
85
79
  memoist (0.14.0)
86
80
  method_source (0.8.2)
87
81
  mime-types (2.99)
data/README.md CHANGED
@@ -6,4 +6,23 @@ Scalable worker factory for ruby
6
6
 
7
7
  Install gems:
8
8
 
9
- $ bundle install
9
+ $ gem install dronejob
10
+
11
+ ## Usage
12
+
13
+
14
+ ### Logging
15
+
16
+
17
+ ```ruby
18
+ # Create stdout logger
19
+ require "logging"
20
+ Logging.color_scheme("bright", levels: { debug: :blue, info: :green, warn: :yellow, error: :red, fatal: [:white, :on_red] }, date: :blue, ndc: :blue, logger: :cyan, message: :black)
21
+ Dronejob::Base.logger = Logging::Logger.new("Dronejob").add_appenders(Logging::Appenders::Stdout.new("stdout", {layout: Logging.layouts.pattern({pattern: '[%d] %-5l %c{1} %x %m\n', color_scheme: 'bright'})}))
22
+
23
+ # Create gcl logger
24
+ require "logging"
25
+ require "logging/appenders/gcl"
26
+ Logging.init(Logging::Appenders::GoogleCloudLogging::SEVERITY_NAMES)
27
+ Dronejob::Base.logger = Logging::Logger.new("Dronejob").add_appenders(Logging::Appenders::GoogleCloudLogging.new("gcl", {project_id: "project-id", log_name: "dronejob", resource_type: "gce_instance", resource_labels: {instance_id: "instance-id", zone: "us-central1-b"}, buffer_size: '3', immediate_at: 'error, fatal'}))
28
+ ```
data/bin/dronejob CHANGED
@@ -1,17 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  $:.push("lib/")
3
- # require "pry"
4
3
  require "thor"
5
4
 
6
- # initialize activejob
7
- require "dronejob"
8
- require "active_job"
9
- require "active_job/queue_adapters/pub_sub_queue_adapter"
10
- ActiveJob::Base.queue_adapter = :pub_sub_queue
11
- ActiveJob::Base.logger = Dronejob::Logger.logger
12
-
13
5
  # initialize dronejob
14
- Dronejob::Loader.init
15
-
16
6
  require "dronejob/command"
17
7
  Dronejob::Command.start
data/dronejob.gemspec CHANGED
@@ -17,12 +17,9 @@ Gem::Specification.new do |s|
17
17
  s.add_runtime_dependency "bundler", "~> 1.11"
18
18
  s.add_runtime_dependency "rake", "~> 10.5"
19
19
  s.add_runtime_dependency "git", "~> 1.2"
20
- s.add_runtime_dependency "logging", "~> 2.0"
21
20
  s.add_runtime_dependency "thor", "~> 0.19"
22
21
  s.add_runtime_dependency "activejob", "~> 4.2"
23
- s.add_runtime_dependency "logging-google-cloud", "~> 1.0"
24
22
  s.add_runtime_dependency "gcloud", "~> 0.6"
25
- s.add_runtime_dependency "google-api-client", "~> 0.8"
26
23
  s.add_development_dependency "rspec", "~> 3.3"
27
24
  s.add_development_dependency "pry", "~> 0.10"
28
25
  s.files = `git ls-files`.split("\n")
@@ -0,0 +1,19 @@
1
+ require "gcloud"
2
+ module ActiveJob
3
+ module QueueAdapters
4
+ class DronejobQueueAdapter
5
+ class << self
6
+
7
+ def enqueue(job)
8
+ Dronejob::Base.log("info", "Enqueuing worker #{job.class.name} with job id #{job.job_id}")
9
+ Dronejob::Base.publish_job(job)
10
+ end
11
+
12
+ def enqueue_at(*)
13
+ raise NotImplementedError.new("Delayed execution is not supported on Google Cloud Pub Sub.")
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/dronejob/base.rb CHANGED
@@ -1,9 +1,11 @@
1
+ require "active_job"
1
2
  require 'dronejob/modules/attr_store'
2
3
  require 'dronejob/modules/core'
3
4
  require 'dronejob/modules/git'
4
5
  require 'dronejob/modules/log'
5
6
  require 'dronejob/modules/params'
6
7
  require 'dronejob/modules/phases'
8
+ require 'dronejob/modules/pub_sub'
7
9
  require 'dronejob/modules/workspace'
8
10
 
9
11
  module Dronejob
@@ -14,6 +16,7 @@ module Dronejob
14
16
  include Modules::Log
15
17
  include Modules::Params
16
18
  include Modules::Phases
19
+ include Modules::PubSub
17
20
  include Modules::Workspace
18
21
 
19
22
  ActiveSupport.run_load_hooks(:dronejob, self)
@@ -1,3 +1,5 @@
1
+ require "dronejob"
2
+ require "active_job"
1
3
  module Dronejob
2
4
  class Command < Thor
3
5
 
@@ -6,8 +8,9 @@ module Dronejob
6
8
 
7
9
  # Pub/Sub options
8
10
  method_option(:project_id, type: :string, required: true)
9
- method_option(:queue_topic, type: :string, required: true, default: "dronejob_queue")
10
- method_option(:status_topic, type: :string, required: true, default: "dronejob_status")
11
+ method_option(:queue_topic, type: :string, required: false)
12
+ method_option(:status_topic, type: :string, required: false)
13
+ method_option(:queue_adapter, type: :string, default: "dronejob_queue")
11
14
 
12
15
  # Worker options
13
16
  method_option(:run, aliases: "-r", type: :boolean, default: false)
@@ -15,6 +18,9 @@ module Dronejob
15
18
  method_option(:skip, aliases: "-s", type: :array, default: [])
16
19
  method_option(:from, aliases: "-f", type: :string)
17
20
  method_option(:listen, aliases: "-l", type: :boolean, default: false)
21
+ method_option(:notify, aliases: "-n", type: :boolean, default: true)
22
+ method_option(:jobs_path, type: :string)
23
+ method_option(:output_path, type: :string)
18
24
 
19
25
  # Worker options
20
26
  worker.params.each do |key, config|
@@ -22,22 +28,33 @@ module Dronejob
22
28
  end
23
29
 
24
30
  define_method(identifier) do
25
- # Set up adapter
26
- ActiveJob::QueueAdapters::PubSubQueueAdapter.project_id = options.project_id
27
- ActiveJob::QueueAdapters::PubSubQueueAdapter.queue_topic = options.queue_topic
28
- ActiveJob::QueueAdapters::PubSubQueueAdapter.status_topic = options.status_topic
31
+ ActiveJob::Base.queue_adapter = options.queue_adapter
32
+ Dronejob::Base.project_id = options.project_id
33
+ Dronejob::Base.queue_topic = options.queue_topic if options.queue_topic
34
+ Dronejob::Base.status_topic = options.status_topic if options.status_topic
35
+ Dronejob::Base.jobs_path = options.jobs_path if options.jobs_path
36
+ Dronejob::Base.output_path = options.output_path if options.output_path
29
37
 
30
38
  # Execute / queue job
31
39
  if options.run
32
- worker.perform_now(options.to_hash)
40
+ worker.perform_now(options)
33
41
  else
34
42
  job = worker.perform_later(options.to_hash)
35
43
 
36
44
  # Listen for notifications
37
45
  if options.listen
38
- ActiveJob::QueueAdapters::PubSubQueueAdapter.listen(job) do |detail|
39
- Dronejob::Logger.log("info", "status: #{detail.to_json}")
40
- abort if detail["phase"] == "complete"
46
+ if options.run or !options.notify
47
+ Dronejob::Base.log("error", "Unable to listen to a jobs that '--run' instantly, or with '--no-notify' set")
48
+ else
49
+ Dronejob::Base.subscribe(Dronejob::Base.status_topic, true) do |data|
50
+ if data["job_id"] == job.job_id
51
+ Dronejob::Base.log("info", "status: #{data["detail"].to_json}")
52
+ if data["detail"]["phase"] == "complete"
53
+ Dronejob::Base.log("info", "job completed")
54
+ Kernel.exit
55
+ end
56
+ end
57
+ end
41
58
  end
42
59
  end
43
60
 
@@ -46,17 +63,23 @@ module Dronejob
46
63
  end
47
64
 
48
65
  desc :server, "Start Dronejob Server"
66
+ method_option(:queue_adapter, type: :string, default: "dronejob_queue", enum: ["dronejob_queue"])
49
67
  method_option(:project_id, type: :string, required: true)
50
- method_option(:queue_topic, type: :string, required: true, default: "dronejob_queue")
51
- method_option(:status_topic, type: :string, required: true, default: "dronejob_status")
68
+ method_option(:queue_topic, type: :string, required: false)
69
+ method_option(:status_topic, type: :string, required: false)
70
+ method_option(:jobs_path, type: :string)
71
+ method_option(:output_path, type: :string)
52
72
  def server
53
- # Set up adapter
54
- ActiveJob::QueueAdapters::PubSubQueueAdapter.project_id = options.project_id
55
- ActiveJob::QueueAdapters::PubSubQueueAdapter.queue_topic = options.queue_topic
56
- ActiveJob::QueueAdapters::PubSubQueueAdapter.status_topic = options.status_topic
73
+ ActiveJob::Base.queue_adapter = options.queue_adapter
74
+ Dronejob::Base.project_id = options.project_id
75
+ Dronejob::Base.queue_topic = options.queue_topic if options.queue_topic
76
+ Dronejob::Base.status_topic = options.status_topic if options.status_topic
77
+ Dronejob::Base.jobs_path = options.jobs_path if options.jobs_path
78
+ Dronejob::Base.output_path = options.output_path if options.output_path
57
79
 
58
80
  # Run worker
59
- ActiveJob::QueueAdapters::PubSubQueueAdapter.run_worker!
81
+ Dronejob::Base.log("info", "Subscribing to topic #{Dronejob::Base.queue_topic} in project #{Dronejob::Base.project_id}")
82
+ Dronejob::Base.run_worker!
60
83
  end
61
84
 
62
85
  end
@@ -1,16 +1,18 @@
1
1
  module Dronejob
2
2
  module Loader
3
- @@workers = {}
3
+ @@workers = nil
4
4
 
5
- def self.init(path="workers")
5
+ def self.load
6
6
  require "active_support/all"
7
- Dir["#{path}/*.rb"].each do |file|
7
+ workers = {}
8
+ Dir["#{Dronejob::Base.jobs_path}/*.rb"].each do |file|
8
9
  require "./#{file}"
9
10
  identifier = File.basename(file).gsub(/\.rb$/, "")
10
- klassname = "Workers::#{identifier.camelcase}"
11
+ klassname = identifier.camelcase
11
12
  klass = klassname.constantize
12
- @@workers[identifier] = klass
13
+ workers[identifier] = klass
13
14
  end
15
+ workers
14
16
  end
15
17
 
16
18
  def self.identifier_for(worker)
@@ -18,7 +20,7 @@ module Dronejob
18
20
  end
19
21
 
20
22
  def self.workers
21
- @@workers
23
+ @@workers ||= load
22
24
  end
23
25
  end
24
26
  end
@@ -16,7 +16,7 @@ module Dronejob
16
16
  end
17
17
 
18
18
  def attr_stores
19
- @attr_stores
19
+ @attr_stores ||= []
20
20
  end
21
21
  end
22
22
 
@@ -19,23 +19,19 @@ module Dronejob
19
19
  begin
20
20
  phase_result = public_send(phase)
21
21
  rescue Exception => e
22
- error!(e)
22
+ error(e)
23
23
  end
24
- notify(phase_result) if config[:notify]
24
+ publish_status(phase_result) if config[:notify]
25
25
  git_commit(phase)
26
26
  end
27
27
  @phase = "complete"
28
- notify(true)
28
+ publish_status(true) if param(:notify) and !param(:run)
29
29
  end
30
30
 
31
31
  def uuid
32
32
  @uuid ||= "#{self.class.name.split('::').last.underscore}_#{SecureRandom.uuid}"
33
33
  end
34
34
 
35
- def notify(result=nil)
36
- ActiveJob::QueueAdapters::PubSubQueueAdapter.notify(self, {phase: @phase, result: result})
37
- end
38
-
39
35
  def shell
40
36
  @shell ||= Thor::Shell::Color.new
41
37
  end
@@ -46,9 +46,9 @@ module Dronejob
46
46
 
47
47
  def git_reset(commit=nil)
48
48
  if commit
49
- log("resetting to phase '#{commit}'")
49
+ info("resetting to phase '#{commit}'")
50
50
  from_index = @commits.keys.index(commit)
51
- error!("phase '#{commit}' not found!") if from_index.nil? or !@commits.keys[from_index]
51
+ error("phase '#{commit}' not found!") if from_index.nil? or !@commits.keys[from_index]
52
52
  previous = @commits.keys[from_index]
53
53
  @git.reset_hard(@commits[previous])
54
54
  else
@@ -1,22 +1,59 @@
1
+ require 'active_support/tagged_logging'
2
+ require 'active_support/logger'
1
3
  module Dronejob
2
4
  module Modules
3
5
  module Log
4
6
  extend ActiveSupport::Concern
5
-
6
- def log(message, level=:info)
7
- begin
8
- Dronejob::Logger.log(level, message)
9
- rescue Exception => e
10
- puts "LOGGING ERROR: #{e}"
11
- e.backtrace.each do |line|
12
- puts("▸ #{line}")
7
+
8
+ included do
9
+ cattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) }
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ def log(level, message, phase=:global)
15
+ if !logger.nil?
16
+ logger.send(level, message)
17
+ else
18
+ puts "#{level}: [#{phase}] #{message}"
13
19
  end
14
- abort "EXIT"
15
20
  end
16
21
  end
17
22
 
18
- def error!(message)
19
- log(message, level=:error)
23
+ def log(level, message)
24
+ self.class.log(level, message, @phase)
25
+ end
26
+
27
+ def debug(message)
28
+ log(:debug, message)
29
+ end
30
+
31
+ def info(message)
32
+ log(:info, message)
33
+ end
34
+
35
+ def notice(message)
36
+ log(:notice, message)
37
+ end
38
+
39
+ def warning(message)
40
+ log(:warning, message)
41
+ end
42
+
43
+ def error(message)
44
+ log(:error, message)
45
+ end
46
+
47
+ def critical(message)
48
+ log(:critical, message)
49
+ end
50
+
51
+ def alert(message)
52
+ log(:alert, message)
53
+ end
54
+
55
+ def emergency(message)
56
+ log(:emergency, message)
20
57
  end
21
58
 
22
59
  end
@@ -10,11 +10,12 @@ module Dronejob
10
10
  end
11
11
 
12
12
  def params
13
- @params
13
+ @params ||= {}
14
14
  end
15
15
  end
16
16
 
17
17
  def param(key)
18
+ @params ||= {}
18
19
  @params[key.to_s]
19
20
  end
20
21
 
@@ -23,15 +23,17 @@ module Dronejob
23
23
  fail "Phase not found: '#{phase}'" unless self.respond_to?(phase)
24
24
  @phase = phase
25
25
  before_phase(phase, config) if self.respond_to?(:before_phase)
26
- Logging.ndc.push("#{uuid}##{phase}")
27
- if completed_phase?(phase) and !config[:always_run]
28
- log("already completed")
29
- elsif skip_phase?(phase)
30
- log("skipping...")
31
- else
32
- block.call(phase, config)
26
+
27
+ logger.tagged(phase) do
28
+ if completed_phase?(phase) and !config[:always_run]
29
+ info("already completed")
30
+ elsif skip_phase?(phase)
31
+ info("skipping...")
32
+ else
33
+ block.call(phase, config)
34
+ end
33
35
  end
34
- Logging.ndc.pop
36
+
35
37
  after_phase(phase, config) if self.respond_to?(:after_phase)
36
38
  end
37
39
  end
@@ -0,0 +1,60 @@
1
+ require "gcloud"
2
+
3
+ module Dronejob
4
+ module Modules
5
+ module PubSub
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ cattr_accessor(:project_id) { "default" }
10
+ cattr_accessor(:queue_topic) { "dronejob_queue" }
11
+ cattr_accessor(:status_topic) { "dronejob_status" }
12
+ end
13
+
14
+ module ClassMethods
15
+
16
+ def pubsub
17
+ @pubsub ||= Gcloud.new(project_id).pubsub
18
+ end
19
+
20
+ def publish_job(job)
21
+ publish(queue_topic, job.serialize)
22
+ end
23
+
24
+ def publish_status(job, detail)
25
+ publish(status_topic, {job_id: job.job_id, detail: detail})
26
+ end
27
+
28
+ def publish(topic_name, data)
29
+ topic = pubsub.topic(topic_name)
30
+ topic.publish(data.to_json)
31
+ end
32
+
33
+ def run_worker!
34
+ subscribe(queue_topic, true) do |data|
35
+ begin
36
+ ActiveJob::Base.deserialize(data).perform_now()
37
+ rescue Exception => e
38
+ log("error", e)
39
+ end
40
+ end
41
+ end
42
+
43
+ def subscribe(topic_name, autoack=true, &block)
44
+ topic = pubsub.topic(topic_name)
45
+ subscription = topic.subscription(topic_name)
46
+ topic.subscribe(topic_name) if subscription.nil? or !subscription.exists?
47
+ subscription.listen autoack: autoack do |message|
48
+ block.call(JSON.parse(message.data))
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ def publish_status(result=nil)
55
+ self.class.publish_status(self, {phase: @phase, result: result})
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -5,10 +5,12 @@ module Dronejob
5
5
 
6
6
  included do
7
7
  attr_accessor :working_dir
8
+ cattr_accessor(:jobs_path) { "app/jobs" }
9
+ cattr_accessor(:output_path) { "tmp/jobs" }
8
10
  end
9
11
 
10
- def create_working_dir()
11
- @working_dir = File.join("jobs", uuid)
12
+ def create_working_dir
13
+ @working_dir = File.join(self.class.output_path, uuid)
12
14
  FileUtils.mkdir_p(@working_dir)
13
15
  end
14
16
 
@@ -0,0 +1,26 @@
1
+ require 'global_id/railtie'
2
+ require 'dronejob'
3
+
4
+ module Dronejob
5
+ # = Dronejob Railtie
6
+ class Railtie < Rails::Railtie
7
+ config.dronejob = ActiveSupport::OrderedOptions.new
8
+
9
+ initializer 'dronejob.logger' do
10
+ ActiveSupport.on_load(:dronejob) { self.logger = ::Rails.logger }
11
+ end
12
+
13
+ initializer "dronejob.set_configs" do |app|
14
+ options = app.config.dronejob
15
+
16
+ ActiveSupport.on_load(:dronejob) do
17
+ options.each { |k,v| send("#{k}=", v) }
18
+ end
19
+ end
20
+
21
+ rake_tasks do
22
+ load "dronejob/railties/dronejob.rake"
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ namespace :dronejob do
2
+ task :server => :environment do
3
+ Dronejob::Base.log("info", "Subscribing to topic #{Dronejob::Base.queue_topic} in project #{Dronejob::Base.project_id}")
4
+ Dronejob::Base.run_worker!
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module Dronejob
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
data/lib/dronejob.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  require "active_support"
2
+ require 'active_support/rails'
3
+ require "active_job/queue_adapters/dronejob_queue_adapter"
2
4
  require "dronejob/version"
3
5
 
6
+ require 'dronejob/railtie' if defined?(Rails)
7
+
4
8
  module Dronejob
5
9
  extend ActiveSupport::Autoload
6
10
  autoload :Base
7
11
  autoload :Loader
8
- autoload :Logger
9
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dronejob
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Strebitzer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-15 00:00:00.000000000 Z
11
+ date: 2016-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.2'
55
- - !ruby/object:Gem::Dependency
56
- name: logging
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '2.0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: '2.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: thor
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,20 +80,6 @@ dependencies:
94
80
  - - ~>
95
81
  - !ruby/object:Gem::Version
96
82
  version: '4.2'
97
- - !ruby/object:Gem::Dependency
98
- name: logging-google-cloud
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ~>
102
- - !ruby/object:Gem::Version
103
- version: '1.0'
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: '1.0'
111
83
  - !ruby/object:Gem::Dependency
112
84
  name: gcloud
113
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +94,6 @@ dependencies:
122
94
  - - ~>
123
95
  - !ruby/object:Gem::Version
124
96
  version: '0.6'
125
- - !ruby/object:Gem::Dependency
126
- name: google-api-client
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ~>
130
- - !ruby/object:Gem::Version
131
- version: '0.8'
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ~>
137
- - !ruby/object:Gem::Version
138
- version: '0.8'
139
97
  - !ruby/object:Gem::Dependency
140
98
  name: rspec
141
99
  requirement: !ruby/object:Gem::Requirement
@@ -178,19 +136,21 @@ files:
178
136
  - README.md
179
137
  - bin/dronejob
180
138
  - dronejob.gemspec
181
- - lib/active_job/queue_adapters/pub_sub_queue_adapter.rb
139
+ - lib/active_job/queue_adapters/dronejob_queue_adapter.rb
182
140
  - lib/dronejob.rb
183
141
  - lib/dronejob/base.rb
184
142
  - lib/dronejob/command.rb
185
143
  - lib/dronejob/loader.rb
186
- - lib/dronejob/logger.rb
187
144
  - lib/dronejob/modules/attr_store.rb
188
145
  - lib/dronejob/modules/core.rb
189
146
  - lib/dronejob/modules/git.rb
190
147
  - lib/dronejob/modules/log.rb
191
148
  - lib/dronejob/modules/params.rb
192
149
  - lib/dronejob/modules/phases.rb
150
+ - lib/dronejob/modules/pub_sub.rb
193
151
  - lib/dronejob/modules/workspace.rb
152
+ - lib/dronejob/railtie.rb
153
+ - lib/dronejob/railties/dronejob.rake
194
154
  - lib/dronejob/version.rb
195
155
  homepage: https://github.com/MagLoft/dronejob
196
156
  licenses:
@@ -1,76 +0,0 @@
1
- module ActiveJob
2
- module QueueAdapters
3
- class PubSubQueueAdapter
4
-
5
- def self.project_id
6
- @@project_id
7
- end
8
-
9
- def self.project_id=(project_id)
10
- @@project_id = project_id
11
- end
12
-
13
- def self.queue_topic
14
- @@queue_topic ||= "dronejob_queue"
15
- end
16
-
17
- def self.queue_topic=(queue_topic)
18
- @@queue_topic = queue_topic
19
- end
20
-
21
- def self.status_topic
22
- @@status_topic ||= "dronejob_status"
23
- end
24
-
25
- def self.status_topic=(status_topic)
26
- @@status_topic = status_topic
27
- end
28
-
29
- def self.pubsub
30
- gcloud = Gcloud.new(self.project_id)
31
- gcloud.pubsub
32
- end
33
-
34
- def self.enqueue(job)
35
- Dronejob::Logger.log("info", "Enqueuing worker #{job.class.name} with job id #{job.job_id}")
36
- topic = pubsub.topic(self.queue_topic)
37
- topic.publish(job.serialize.to_json)
38
- end
39
-
40
- def self.listen(job, &block)
41
- subscribe(self.status_topic, true) do |data|
42
- block.call(data["detail"]) if data["job_id"] == job.job_id
43
- end
44
- end
45
-
46
- def self.run_worker!
47
- subscribe(self.queue_topic, true) do |data|
48
- job = ActiveJob::Base.deserialize(data)
49
- Dronejob::Logger.log("info", "Processing worker #{job.class.name} with job id #{job.job_id}")
50
- job.perform_now()
51
- end
52
- end
53
-
54
- def self.notify(job, detail)
55
- topic = pubsub.topic(self.status_topic)
56
- data = {job_id: job.job_id, detail: detail}
57
- topic.publish(data.to_json)
58
- end
59
-
60
- private
61
-
62
- def self.subscribe(topic_name, autoack=true, &block)
63
- Dronejob::Logger.log("info", "Preparing subscription to #{topic_name}")
64
- topic = pubsub.topic(topic_name)
65
- subscription = topic.subscription(topic_name)
66
- topic.subscribe(topic_name) if subscription.nil? or !subscription.exists?
67
- Dronejob::Logger.log("info", "Subscribing to #{topic}")
68
- subscription.listen autoack: autoack do |message|
69
- data = JSON.parse(message.data)
70
- block.call(data)
71
- end
72
- end
73
-
74
- end
75
- end
76
- end
@@ -1,25 +0,0 @@
1
- require "logging"
2
- require "logging/appenders/gcl"
3
-
4
- module Dronejob
5
- module Logger
6
- @@logger = nil
7
-
8
- def self.logger
9
- if @@logger.nil?
10
- Logging.init(Logging::Appenders::GoogleCloudLogging::SEVERITY_NAMES)
11
- Logging.color_scheme("bright", levels: { debug: :blue, info: :green, warn: :yellow, error: :red, fatal: [:white, :on_red] }, date: :blue, ndc: :blue, logger: :cyan, message: :black)
12
- Logging.appenders.stdout("stdout", layout: Logging.layouts.pattern( pattern: '[%d] %-5l %c{1} %x %m\n', color_scheme: 'bright'))
13
- Logging.appenders.gcl("gcl", project_id: "typeshot-01", log_name: "dronejob", resource_type: "gce_instance", resource_labels: {instance_id: "drone-05", zone: "us-central1-b"}, buffer_size: '3', immediate_at: 'error, fatal')
14
- @@logger = Logging::Logger.new("Dronejob")
15
- @@logger.add_appenders("stdout") # gcl
16
- end
17
- @@logger
18
- end
19
-
20
- def self.log(level, message)
21
- logger.send(level, message)
22
- end
23
-
24
- end
25
- end