pd-blender 0.5 → 0.6

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: 184f4e1009b13d2f60b78a000f41a8216b5a9c8e
4
- data.tar.gz: ef34cccbaca40a15a455e83b91a910cbe725e39e
3
+ metadata.gz: e24f3ed1968a3e52c672544856b6997422682aff
4
+ data.tar.gz: 91c94a245676a3d615b7432b2d46bfde8fdfba23
5
5
  SHA512:
6
- metadata.gz: 5b4c27d394fbb4a9dff23af968a1e37781b85707e38df77b0cee6b41635543d09708f361c2f8508a55f89d7a0357cce9124292fd57df1d30d494272dc5e7fc10
7
- data.tar.gz: 099a03a58909a2e0b93aa37c88521017ef789721d283d1c7edb0049b5e239b32d38aced5335b93685fdb0ac1121db46f78bd85ae36ea3ce81e0fa91032d0f47b
6
+ metadata.gz: 38714485f27b733feeba33298f640409b85cf2290233b7394b7486d8c360669ceddb08e9b967acddfd836b03cebaf2f013dead4d3ef6d14de3a2213ca23cabd8
7
+ data.tar.gz: 48a894c2bc264ff10dbeb55f10886e14d30cceca812708422908ac74f91d2a30e65fdbd3cddd58e089d7fd4d1f98737af808024f2b30685160e5be30cd16ab62
data/README.md CHANGED
@@ -138,6 +138,18 @@ can execute `ssh_task`s. Blender core ships with following tasks and drivers:
138
138
  end
139
139
  ```
140
140
 
141
+ - **blend_task**: invoke a blender script as a task (nesting)
142
+
143
+ ```ruby
144
+ members ['host1', 'host2', 'host3']
145
+ blend_task 'test-task' do
146
+ file '/path/to/remote/file'
147
+ concurrency 10
148
+ strategy :per_host
149
+ end
150
+ ```
151
+
152
+
141
153
  As mentioned earlier tasks are executed using drivers. Tasks can declare their preferred driver or
142
154
  Blender will assign a driver to them automatically. Blender will reuse the global driver if its
143
155
  compatible, else it will create one. By default the ```global_driver``` is a ```shell_out``` driver.
@@ -0,0 +1,53 @@
1
+ #
2
+ # Author:: Ranjib Dey (<ranjib@pagerduty.com>)
3
+ # Copyright:: Copyright (c) 2015 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 'blender/drivers/base'
19
+
20
+ module Blender
21
+ module Driver
22
+ class Blend < Base
23
+ def execute(tasks, hosts)
24
+ tasks.each do |task|
25
+ cmd = run_command(task.command, hosts)
26
+ if cmd.exitstatus != 0 and !task.metadata[:ignore_failure]
27
+ raise ExecutionFailed, cmd.stderr
28
+ end
29
+ end
30
+ end
31
+
32
+ def run_command(command, hosts)
33
+ exit_status = 0
34
+ err = ''
35
+ begin
36
+ Blender.blend(command.file, command.options) do |sched|
37
+ sched.strategy(command.strategy)
38
+ sched.members(hosts)
39
+ sched.concurrency(command.concurrency)
40
+ command.config_store.keys.each do |key|
41
+ sched.config(key, command.config_store[key])
42
+ end
43
+ sched.instance_eval(File.read(command.file))
44
+ end
45
+ rescue StandardError => e
46
+ err = e.message + "\nBacktrace:" + e.backtrace.join("\n")
47
+ exit_status = -1
48
+ end
49
+ ExecOutput.new(exit_status, '', err)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -22,6 +22,7 @@ require 'blender/tasks/ruby'
22
22
  require 'blender/tasks/ssh'
23
23
  require 'blender/tasks/shell_out'
24
24
  require 'blender/tasks/scp'
25
+ require 'blender/tasks/blend'
25
26
  require 'highline'
26
27
  require 'blender/utils/refinements'
27
28
  require 'blender/drivers/ssh'
@@ -30,6 +31,7 @@ require 'blender/drivers/ssh_multi'
30
31
  require 'blender/drivers/shellout'
31
32
  require 'blender/drivers/ruby'
32
33
  require 'blender/drivers/scp'
34
+ require 'blender/drivers/blend'
33
35
  require 'blender/discovery'
34
36
  require 'blender/handlers/base'
35
37
  require 'blender/lock/flock'
@@ -136,6 +138,15 @@ module Blender
136
138
  append_task(:scp, task, blender_config(:ssh))
137
139
  end
138
140
 
141
+ def blend_task(name, &block)
142
+ task = build_task(name, :blend)
143
+ task.instance_eval(&block) if block_given?
144
+ task.command.pass_configs.each do |key|
145
+ task.command.config_store[key] = blender_config(key).dup
146
+ end
147
+ append_task(:blend, task)
148
+ end
149
+
139
150
  def strategy(strategy)
140
151
  klass_name = camelcase(strategy.to_s).to_sym
141
152
  begin
@@ -0,0 +1,69 @@
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 'blender/tasks/base'
19
+
20
+ module Blender
21
+ module Task
22
+ class Blend < Base
23
+ attr_reader :blender_strategy
24
+
25
+ def initialize(name, metadata = {})
26
+ super
27
+ @command = Struct.new(
28
+ :file,
29
+ :strategy,
30
+ :pass_configs,
31
+ :config_store,
32
+ :concurrency,
33
+ :options
34
+ ).new
35
+ @command.strategy = :default
36
+ @command.concurrency = 1
37
+ @command.pass_configs = []
38
+ @command.config_store = ThreadSafe::Cache.new
39
+ @command.options = ThreadSafe::Hash.new
40
+ end
41
+
42
+ def strategy(st)
43
+ @command.strategy = st
44
+ end
45
+
46
+ def execute(f)
47
+ @command.file = f
48
+ end
49
+
50
+ alias file execute
51
+
52
+ def concurrency(n)
53
+ @command.concurrency = n
54
+ end
55
+
56
+ def pass_configs(*keys)
57
+ @command.pass_configs += keys unless keys.empty?
58
+ end
59
+
60
+ def config(key, opts = {})
61
+ @command.config_store[key] = opts
62
+ end
63
+
64
+ def options(hash)
65
+ @command.options.merge!(hash)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -16,5 +16,5 @@
16
16
  # limitations under the License.
17
17
 
18
18
  module Blender
19
- VERSION = '0.5'
19
+ VERSION = '0.6'
20
20
  end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Blender do
4
+ let(:scp_config) do
5
+ { user: 'test-user', password: 'test-password' }
6
+ end
7
+ let!(:sched) do
8
+ blender_file = File.expand_path('../../../data/example.rb', __FILE__)
9
+ sched = Blender.blend('sub blend', no_doc: true) do |sched|
10
+ sched.config(:scp, scp_config)
11
+ sched.members(['1.2.3.4'])
12
+ sched.blend_task 'foo' do
13
+ file blender_file
14
+ strategy :per_task
15
+ pass_configs :scp
16
+ concurrency 3
17
+ end
18
+ end
19
+ end
20
+
21
+ it 'passes apropriate config options from parent blender script' do
22
+ blend_task = sched.tasks.first
23
+ expect(blend_task.command.config_store[:scp]).to eq(scp_config)
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Blender::Task::Blend do
4
+ let(:task) do
5
+ described_class.new('blend-test')
6
+ end
7
+
8
+ it 'setup task name accordingly' do
9
+ expect(task.name).to eq('blend-test')
10
+ end
11
+
12
+ it 'setup blender file accordingly' do
13
+ task.execute '/foo/bar'
14
+ expect(task.command.file).to eq('/foo/bar')
15
+ end
16
+
17
+ it 'setup strategy for the blender job accordingly' do
18
+ task.strategy :foo
19
+ expect(task.command.strategy).to eq(:foo)
20
+ end
21
+
22
+ it 'setup concurrency correctly' do
23
+ task.concurrency(10)
24
+ expect(task.command.concurrency).to eq(10)
25
+ end
26
+
27
+ it 'setup explicit config accordingly' do
28
+ task.config(:foo, bar: 'baz')
29
+ expect(task.command.config_store[:foo]).to eq(bar: 'baz')
30
+ end
31
+
32
+ it 'has empty config by default' do
33
+ expect(task.command.config_store).to be_empty
34
+ end
35
+
36
+ it 'specifies the list of configs copied correctly' do
37
+ task.pass_configs :foo, :bar, :baz
38
+ expect(task.command.pass_configs).to eq([:foo, :bar, :baz])
39
+ expect(task.command.config_store).to be_empty
40
+ end
41
+ 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.5'
4
+ version: '0.6'
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-28 00:00:00.000000000 Z
11
+ date: 2015-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -255,6 +255,7 @@ files:
255
255
  - lib/blender/cli.rb
256
256
  - lib/blender/discovery.rb
257
257
  - lib/blender/drivers/base.rb
258
+ - lib/blender/drivers/blend.rb
258
259
  - lib/blender/drivers/compound.rb
259
260
  - lib/blender/drivers/ruby.rb
260
261
  - lib/blender/drivers/scp.rb
@@ -279,6 +280,7 @@ files:
279
280
  - lib/blender/scheduling_strategies/per_host.rb
280
281
  - lib/blender/scheduling_strategies/per_task.rb
281
282
  - lib/blender/tasks/base.rb
283
+ - lib/blender/tasks/blend.rb
282
284
  - lib/blender/tasks/ruby.rb
283
285
  - lib/blender/tasks/scp.rb
284
286
  - lib/blender/tasks/shell_out.rb
@@ -290,6 +292,7 @@ files:
290
292
  - lib/blender/version.rb
291
293
  - spec/blender/blender_rspec.rb
292
294
  - spec/blender/discovery_spec.rb
295
+ - spec/blender/drivers/blend_spec.rb
293
296
  - spec/blender/drivers/scp_spec.rb
294
297
  - spec/blender/drivers/ssh_multi_spec.rb
295
298
  - spec/blender/drivers/ssh_spec.rb
@@ -300,6 +303,7 @@ files:
300
303
  - spec/blender/scheduled_job_spec.rb
301
304
  - spec/blender/scheduler_spec.rb
302
305
  - spec/blender/scheduling_strategies/default_spec.rb
306
+ - spec/blender/tasks/blend_spec.rb
303
307
  - spec/blender/tasks/scp_spec.rb
304
308
  - spec/blender/utils/refinements_spec.rb
305
309
  - spec/blender/utils/thread_pool_spec.rb
@@ -333,6 +337,7 @@ summary: A modular orchestration engine
333
337
  test_files:
334
338
  - spec/blender/blender_rspec.rb
335
339
  - spec/blender/discovery_spec.rb
340
+ - spec/blender/drivers/blend_spec.rb
336
341
  - spec/blender/drivers/scp_spec.rb
337
342
  - spec/blender/drivers/ssh_multi_spec.rb
338
343
  - spec/blender/drivers/ssh_spec.rb
@@ -343,6 +348,7 @@ test_files:
343
348
  - spec/blender/scheduled_job_spec.rb
344
349
  - spec/blender/scheduler_spec.rb
345
350
  - spec/blender/scheduling_strategies/default_spec.rb
351
+ - spec/blender/tasks/blend_spec.rb
346
352
  - spec/blender/tasks/scp_spec.rb
347
353
  - spec/blender/utils/refinements_spec.rb
348
354
  - spec/blender/utils/thread_pool_spec.rb