pd-blender 0.4 → 0.5

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: 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