pd-blender 0.5 → 0.6

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