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 +4 -4
- data/README.md +12 -0
- data/lib/blender/drivers/blend.rb +53 -0
- data/lib/blender/scheduler/dsl.rb +11 -0
- data/lib/blender/tasks/blend.rb +69 -0
- data/lib/blender/version.rb +1 -1
- data/spec/blender/drivers/blend_spec.rb +25 -0
- data/spec/blender/tasks/blend_spec.rb +41 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e24f3ed1968a3e52c672544856b6997422682aff
|
4
|
+
data.tar.gz: 91c94a245676a3d615b7432b2d46bfde8fdfba23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/blender/version.rb
CHANGED
@@ -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.
|
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-
|
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
|