pd-blender 0.4 → 0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a647ec91e708fdc7ffa2d7275fa03d7ce99a236
4
- data.tar.gz: aecd89dd6ce1a6a2473da673717521217fb8a0d6
3
+ metadata.gz: 184f4e1009b13d2f60b78a000f41a8216b5a9c8e
4
+ data.tar.gz: ef34cccbaca40a15a455e83b91a910cbe725e39e
5
5
  SHA512:
6
- metadata.gz: 4886449ccf296a01d265b24352d22bbfacbf1e096c058cdb2969c38221e18b96264e4190902daa5fd158d622b5e54b106cd8285de73edd2a16c5d8dfab4752e0
7
- data.tar.gz: 99949f26259eb2bbeacadf3747d443b6a855f6e4f7792fbe53f3943c8db953670f63b296001ee21c81ce0fd0bb5c1edc63b22f2ad48c04ca0d9ef3c0da06fa97
6
+ metadata.gz: 5b4c27d394fbb4a9dff23af968a1e37781b85707e38df77b0cee6b41635543d09708f361c2f8508a55f89d7a0357cce9124292fd57df1d30d494272dc5e7fc10
7
+ data.tar.gz: 099a03a58909a2e0b93aa37c88521017ef789721d283d1c7edb0049b5e239b32d38aced5335b93685fdb0ac1121db46f78bd85ae36ea3ce81e0fa91032d0f47b
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in blender.gemspec
4
4
  gemspec
5
-
6
- gem 'ruby-prof'
data/blender.gemspec CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'net-ssh-multi'
28
28
  spec.add_dependency 'net-scp'
29
29
  spec.add_dependency 'rufus-scheduler'
30
+ spec.add_dependency 'thread_safe'
30
31
 
31
32
  spec.add_development_dependency 'bundler'
32
33
  spec.add_development_dependency 'rake'
data/lib/blender.rb CHANGED
@@ -20,7 +20,6 @@ require 'blender/scheduler'
20
20
  require 'blender/log'
21
21
  require 'blender/drivers/shellout'
22
22
  require 'json'
23
- require 'blender/configuration'
24
23
 
25
24
  # Top level module that holds all blender related libraries under this namespace
26
25
  module Blender
@@ -35,7 +34,7 @@ module Blender
35
34
  def self.blend(name, options = {})
36
35
  config_file = options.delete(:config_file)
37
36
  scheduler = Scheduler.new(name, [], options)
38
- configure(config_file) if config_file
37
+ configure(scheduler, config_file) if config_file
39
38
  if block_given?
40
39
  yield scheduler
41
40
  else
@@ -45,7 +44,7 @@ module Blender
45
44
  scheduler
46
45
  end
47
46
 
48
- def self.configure(file)
47
+ def self.configure(scheduler, file)
49
48
  data = JSON.parse(File.read(file))
50
49
 
51
50
  Blender::Log.level = data['log_level'].to_sym if data['log_level']
@@ -58,7 +57,7 @@ module Blender
58
57
  end
59
58
  if data['scheduler']
60
59
  data['scheduler'].each do |key, value|
61
- Blender::Configuration[key.to_sym] = value
60
+ scheduler.update_config(key.to_sym, value)
62
61
  end
63
62
  end
64
63
  end
data/lib/blender/cli.rb CHANGED
@@ -55,8 +55,7 @@ module Blender
55
55
  banner: 'Quiet mode. Disable printing running job details'
56
56
 
57
57
  def from_file(*args)
58
- Configuration[:noop] = options[:noop]
59
- Configuration[:arguments] = args
58
+ noop_mode = options[:noop]
60
59
  des = File.read(options[:file])
61
60
  $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(options[:file]), 'lib')))
62
61
  scheduler_options = {
@@ -64,6 +63,8 @@ module Blender
64
63
  no_doc: options[:quiet]
65
64
  }
66
65
  Blender.blend(options[:file], scheduler_options) do |sch|
66
+ sch.update_config(:noop, noop_mode)
67
+ sch.update_config(:arguments, args)
67
68
  sch.instance_eval(des, __FILE__, __LINE__)
68
69
  end
69
70
  end
@@ -16,7 +16,6 @@
16
16
  # limitations under the License.
17
17
 
18
18
  require 'blender/utils/refinements'
19
- require 'blender/configuration'
20
19
 
21
20
  module Blender
22
21
  module Discovery
@@ -24,7 +23,7 @@ module Blender
24
23
 
25
24
  def build_discovery(type, opts = {})
26
25
  disco_klass = Blender::Discovery.const_get(camelcase(type.to_s).to_sym)
27
- disco_opts = Blender::Configuration[type].merge(opts)
26
+ disco_opts = blender_config(type).merge(opts)
28
27
  disco_klass.new(symbolize(disco_opts))
29
28
  end
30
29
 
@@ -16,7 +16,6 @@
16
16
  # limitations under the License.
17
17
 
18
18
  require 'blender/utils/ui'
19
- require 'blender/configuration'
20
19
 
21
20
  module Blender
22
21
  module Handlers
@@ -32,7 +31,9 @@ module Blender
32
31
  @task_id = 0
33
32
  @job_id = 1
34
33
  ui.puts_green("Run[#{scheduler.name}] started")
35
- ui.puts_green('Running in No-Op mode, driver execution will be skipped') if Configuration[:noop]
34
+ if scheduler.blender_config(:noop)
35
+ ui.puts_green('Running in No-Op mode, driver execution will be skipped')
36
+ end
36
37
  end
37
38
 
38
39
  def run_finished(scheduler)
data/lib/blender/job.rb CHANGED
@@ -17,7 +17,6 @@
17
17
 
18
18
  require 'blender/exceptions'
19
19
  require 'blender/log'
20
- require 'blender/configuration'
21
20
 
22
21
  module Blender
23
22
  # A job represent encapsulates an array of tasks to be performed
@@ -40,7 +39,7 @@ module Blender
40
39
  end
41
40
 
42
41
  def run
43
- driver.execute(tasks, hosts) unless Configuration[:noop]
42
+ driver.execute(tasks, hosts)
44
43
  end
45
44
 
46
45
  def to_s
data/lib/blender/rspec.rb CHANGED
@@ -52,10 +52,10 @@ module Blender
52
52
  end
53
53
 
54
54
  def noop_scheduler_from_file(file)
55
- Blender::Configuration[:noop] = true
56
55
  des = File.read(file)
57
56
  $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(file), 'lib')))
58
57
  Blender.blend(file) do |sch|
58
+ sch.update_config(:noop, true)
59
59
  sch.lock_options(nil)
60
60
  sch.instance_eval(des, __FILE__, __LINE__)
61
61
  end
@@ -16,7 +16,6 @@
16
16
  # limitations under the License.
17
17
 
18
18
  require 'blender/log'
19
- require 'blender/configuration'
20
19
  require 'blender/utils/thread_pool'
21
20
  require 'blender/exceptions'
22
21
  require 'blender/scheduling_strategies/default'
@@ -27,6 +26,7 @@ require 'blender/scheduler/dsl'
27
26
  require 'blender/event_dispatcher'
28
27
  require 'blender/handlers/doc'
29
28
  require 'blender/tasks/base'
29
+ require 'thread_safe'
30
30
 
31
31
  module Blender
32
32
  class Scheduler
@@ -38,10 +38,17 @@ module Blender
38
38
  attr_reader :events, :tasks
39
39
  attr_reader :lock_properties
40
40
 
41
- def initialize(name, tasks = [], options = {})
41
+ # options
42
+ # noop: true/false - No-Op mode, dont invoke job.run
43
+ # arguments: array or any stock data
44
+ # rest everything gets merged as metadata
45
+ def initialize(name, tasks = ThreadSafe::Array.new, options = {})
42
46
  @name = name
43
47
  @tasks = tasks
44
48
  @events = Blender::EventDispatcher.new
49
+ @config = ThreadSafe::Hash.new{ ThreadSafe::Hash.new }
50
+ @config[:noop] = options[:noop] || false
51
+ @config[:arguments] = options[:arguments] || []
45
52
  unless options.delete(:no_doc)
46
53
  events.register(Blender::Handlers::Doc.new)
47
54
  end
@@ -92,7 +99,9 @@ module Blender
92
99
  def run_job(job)
93
100
  events.job_started(job)
94
101
  Log.debug("Running job #{job.name}")
95
- job.run
102
+ unless blender_config(:noop)
103
+ job.run
104
+ end
96
105
  events.job_finished(job)
97
106
  rescue StandardError => e
98
107
  events.job_failed(job, e)
@@ -103,13 +112,22 @@ module Blender
103
112
  end
104
113
  end
105
114
 
115
+ def blender_config(key)
116
+ @config[key]
117
+ end
118
+
119
+ def update_config(key, value)
120
+ @config[key] = value
121
+ @config
122
+ end
123
+
106
124
  def default_metadata
107
- {
108
- ignore_failure: false,
109
- concurrency: 0,
110
- handlers: [],
111
- members: []
112
- }
125
+ temp = ThreadSafe::Hash.new
126
+ temp[:ignore_failure] = false
127
+ temp[:concurrency] = 0
128
+ temp[:handlers] = ThreadSafe::Array.new
129
+ temp[:members] = ThreadSafe::Array.new
130
+ temp
113
131
  end
114
132
  end
115
133
  end
@@ -40,7 +40,7 @@ module Blender
40
40
  include Blender::Discovery
41
41
 
42
42
  def config(type, opts = {})
43
- blender_config(type).merge!(opts)
43
+ update_config(type, opts)
44
44
  end
45
45
 
46
46
  alias :init :config
@@ -176,11 +176,5 @@ module Blender
176
176
  end
177
177
 
178
178
  alias_method :task, :shell_task
179
-
180
- private
181
-
182
- def blender_config(key)
183
- Blender::Configuration[key]
184
- end
185
179
  end
186
180
  end
@@ -26,7 +26,7 @@ module Blender
26
26
  job_id = 0
27
27
  jobs = pairs.map do |task, host|
28
28
  Log.debug("Creating job (#{host}|#{task.name})")
29
- job_id += 1
29
+ job_id = job_id + 1
30
30
  Job.new(job_id, task.driver, [task], [host])
31
31
  end
32
32
  Log.debug("Total jobs : #{jobs.size}")
@@ -26,8 +26,9 @@ module Blender
26
26
  if hosts_list.size != 1
27
27
  raise UnsupportedFeature, 'PerHost strategy does not support scheduling tasks with different memebers'
28
28
  end
29
- job_id = 1
29
+ job_id = 0
30
30
  jobs = hosts_list.first.map do |host|
31
+ job_id = job_id + 1
31
32
  Job.new(job_id, Blender::Driver::Compound.new, tasks, [host])
32
33
  end
33
34
  Log.debug("Total jobs : #{jobs.size}")
@@ -16,5 +16,5 @@
16
16
  # limitations under the License.
17
17
 
18
18
  module Blender
19
- VERSION = '0.4'
19
+ VERSION = '0.5'
20
20
  end
@@ -2,9 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe Blender::Lock do
4
4
  context 'File based locking' do
5
- it 'should not allow two blender run with same lockfile to run at the same time' do
5
+ it 'not allow two blender run with same lockfile to run at the same time', fork: true do
6
6
  pid1 = fork do
7
- Blender.blend('test-1') do |sched|
7
+ STDOUT.reopen(File::NULL)
8
+ STDERR.reopen(File::NULL)
9
+ Blender.blend('test-1', no_doc: true) do |sched|
8
10
  sched.lock_options('flock')
9
11
  sched.members(['localhost'])
10
12
  sched.ruby_task('date') do
@@ -17,8 +19,9 @@ describe Blender::Lock do
17
19
  end
18
20
 
19
21
  pid2 = fork do
22
+ STDOUT.reopen(File::NULL)
20
23
  STDERR.reopen(File::NULL)
21
- Blender.blend('test-1') do |sched|
24
+ Blender.blend('test-1', no_doc: true) do |sched|
22
25
  sched.lock_options('flock')
23
26
  sched.members(['localhost'])
24
27
  sched.ruby_task('date') do
@@ -35,7 +38,7 @@ describe Blender::Lock do
35
38
  expect(status2.last.exitstatus).to_not eq(0)
36
39
  end
37
40
 
38
- it 'should allow two blender run with different lock file to run at the same time' do
41
+ it 'allow two blender run with different lock file to run at the same time', fork: true do
39
42
  pid1 = fork do
40
43
  Blender.blend('test-1') do |sched|
41
44
  sched.lock_options('flock')
@@ -50,7 +53,7 @@ describe Blender::Lock do
50
53
  end
51
54
 
52
55
  pid2 = fork do
53
- Blender.blend('test-2') do |sched|
56
+ Blender.blend('test-2', no_doc: true) do |sched|
54
57
  sched.lock_options('flock')
55
58
  sched.members(['localhost'])
56
59
  sched.ruby_task('date') do
@@ -66,7 +69,7 @@ describe Blender::Lock do
66
69
  expect(status2.last.exitstatus).to eq(0)
67
70
  end
68
71
 
69
- it 'should raise lock acquisition error when times out' do
72
+ it 'raise lock acquisition error when times out', fork: true do
70
73
  pid1 = fork do
71
74
  Blender.blend('test-1') do |sched|
72
75
  sched.lock_options('flock')
@@ -98,7 +101,7 @@ describe Blender::Lock do
98
101
  expect(status2.last.exitstatus).to_not eq(0)
99
102
  end
100
103
 
101
- it 'should not raise lock acquisition error when able to acquire lock within timeout period' do
104
+ it 'not raise lock acquisition error when able to acquire lock within timeout period', fork: true do
102
105
  pid1 = fork do
103
106
  Blender.blend('test-1') do |sched|
104
107
  sched.lock_options('flock')
@@ -29,13 +29,13 @@ describe Blender::Scheduler do
29
29
  before do
30
30
  scheduler.task('whoa')
31
31
  end
32
- it 'should belong to base class' do
32
+ it 'belong to base class' do
33
33
  expect(task).to be_kind_of(Blender::Task::Base)
34
34
  end
35
- it 'should use shellout driver' do
35
+ it 'use shellout driver' do
36
36
  expect(task.driver).to be_kind_of(Blender::Driver::ShellOut)
37
37
  end
38
- it 'should contain only one task' do
38
+ it 'contain only one task' do
39
39
  expect(scheduler.tasks.size).to eq(1)
40
40
  end
41
41
  end
@@ -46,21 +46,21 @@ describe Blender::Scheduler do
46
46
  execute('ls -l')
47
47
  end
48
48
  end
49
- it 'should have correct hosts list' do
49
+ it 'have correct hosts list' do
50
50
  expect(task.hosts).to eq(['a'])
51
51
  end
52
- it 'should have correct command' do
52
+ it 'have correct command' do
53
53
  expect(task.command).to eq('ls -l')
54
54
  end
55
- it 'should use ssh task subclass' do
55
+ it 'use ssh task subclass' do
56
56
  expect(task).to be_kind_of(Blender::Task::Ssh)
57
57
  end
58
- it 'should use the ssh driver' do
58
+ it 'use the ssh driver' do
59
59
  expect(task.driver).to be_kind_of(Blender::Driver::Ssh)
60
60
  end
61
61
  end
62
62
  describe '#on' do
63
- it 'should invoke custom block on specific events' do
63
+ it 'invoke custom block on specific events', fork: true do
64
64
  test = 1
65
65
  Blender.blend('do it') do |sched|
66
66
  sched.on :run_finished do |x|
@@ -49,6 +49,11 @@ describe Blender::SchedulingStrategy do
49
49
  it 'all jobs should have all task' do
50
50
  expect(jobs.map(&:tasks).map(&:size).uniq).to eq([tasks.size])
51
51
  end
52
+ it 'assigns correct job id' do
53
+ hosts.size.times do |n|
54
+ expect(jobs[n].id).to eq(n+1)
55
+ end
56
+ end
52
57
  end
53
58
  describe Blender::SchedulingStrategy::PerTask do
54
59
  before do
data/spec/blender_spec.rb CHANGED
@@ -20,12 +20,12 @@ require 'blender/cli'
20
20
 
21
21
  describe Blender do
22
22
  describe '#blend' do
23
- it 'should invoke a local command is no block is given' do
23
+ it 'invoke a local command is no block is given' do
24
24
  cmd = double(Mixlib::ShellOut, exitstatus: 0).as_null_object
25
25
  expect(Mixlib::ShellOut).to receive(:new).with('foo', {}).and_return(cmd)
26
26
  described_class.blend('foo')
27
27
  end
28
- it 'should yield a scheduler object when block passed' do
28
+ it 'yield a scheduler object when block passed' do
29
29
  x = 1
30
30
  described_class.blend('test') do |sched|
31
31
  sched.ruby_task 'foo' do
@@ -35,11 +35,11 @@ describe Blender do
35
35
  expect(x).to eq(100)
36
36
  end
37
37
  context 'CLI' do
38
- it 'should store additional arguments in config' do
39
- Blender::CLI.start(%w{-f spec/data/example.rb -x -y -z})
40
- expect(Blender::Configuration[:arguments]).to eq(%w{-x -y -z})
38
+ it 'store additional arguments in config', fork: true do
39
+ sched = Blender::CLI.start(%w{-q -f spec/data/example.rb -x -y -z})
40
+ expect(sched.blender_config(:arguments)).to eq(%w{-x -y -z})
41
41
  end
42
- it 'should store additional arguments in config' do
42
+ it 'store additional arguments in config', fork: true do
43
43
  expect(Blender::Handlers::Doc).to_not receive(:new)
44
44
  Blender::CLI.start(%w{-q -f spec/data/example.rb})
45
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pd-blender
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ranjib Dey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-23 00:00:00.000000000 Z
11
+ date: 2015-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: thread_safe
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: bundler
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -239,7 +253,6 @@ files:
239
253
  - blender.gemspec
240
254
  - lib/blender.rb
241
255
  - lib/blender/cli.rb
242
- - lib/blender/configuration.rb
243
256
  - lib/blender/discovery.rb
244
257
  - lib/blender/drivers/base.rb
245
258
  - lib/blender/drivers/compound.rb
@@ -276,7 +289,6 @@ files:
276
289
  - lib/blender/utils/ui.rb
277
290
  - lib/blender/version.rb
278
291
  - spec/blender/blender_rspec.rb
279
- - spec/blender/config_spec.rb
280
292
  - spec/blender/discovery_spec.rb
281
293
  - spec/blender/drivers/scp_spec.rb
282
294
  - spec/blender/drivers/ssh_multi_spec.rb
@@ -320,7 +332,6 @@ specification_version: 4
320
332
  summary: A modular orchestration engine
321
333
  test_files:
322
334
  - spec/blender/blender_rspec.rb
323
- - spec/blender/config_spec.rb
324
335
  - spec/blender/discovery_spec.rb
325
336
  - spec/blender/drivers/scp_spec.rb
326
337
  - spec/blender/drivers/ssh_multi_spec.rb
@@ -1,56 +0,0 @@
1
- #
2
- # Author:: Ranjib Dey (<ranjib@pagerduty.com>)
3
- # Copyright:: Copyright (c) 2014 PagerDuty, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'singleton'
19
- require 'thread'
20
-
21
- module Blender
22
- class Configuration
23
- include Singleton
24
-
25
- attr_reader :data, :mutex
26
-
27
- def initialize
28
- @mutex = Mutex.new
29
- reset!
30
- end
31
-
32
- def self.[]=(key, value)
33
- instance.mutex.synchronize do
34
- instance.data[key] = value
35
- end
36
- end
37
-
38
- def self.[](key)
39
- instance.mutex.synchronize do
40
- instance.data[key]
41
- end
42
- end
43
-
44
- def self.reset!
45
- instance.mutex.synchronize do
46
- instance.reset!
47
- end
48
- end
49
-
50
- def reset!
51
- @data = Hash.new{|h, k| h[k] = Hash.new}
52
- @data[:noop] = false
53
- @data[:arguments] = []
54
- end
55
- end
56
- end
@@ -1,34 +0,0 @@
1
- #
2
- # Author:: Ranjib Dey (<ranjib@pagerduty.com>)
3
- # Copyright:: Copyright (c) 2014 PagerDuty, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'spec_helper'
19
-
20
- describe Blender::Configuration do
21
- it 'should populate argments and noop key' do
22
- expect(Blender::Configuration[:noop]).to be(false)
23
- expect(Blender::Configuration[:argments]).to be_empty
24
- end
25
- it 'should set configs globally' do
26
- Blender::Configuration[:x] = 1
27
- expect(Blender::Configuration[:x]).to eq(1)
28
- end
29
- it 'should reset config' do
30
- Blender::Configuration[:x] = 1
31
- Blender::Configuration.reset!
32
- expect(Blender::Configuration[:x]).to be_empty
33
- end
34
- end