inprovise 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +4 -0
- data/.travis.yml +28 -0
- data/Gemfile +9 -0
- data/LICENSE +8 -0
- data/README.md +197 -0
- data/Rakefile.rb +9 -0
- data/bin/rig +5 -0
- data/inprovise.gemspec +22 -0
- data/lib/inprovise/channel/ssh.rb +202 -0
- data/lib/inprovise/cli/group.rb +86 -0
- data/lib/inprovise/cli/node.rb +95 -0
- data/lib/inprovise/cli/provision.rb +84 -0
- data/lib/inprovise/cli.rb +105 -0
- data/lib/inprovise/cmd_channel.rb +100 -0
- data/lib/inprovise/cmd_helper.rb +150 -0
- data/lib/inprovise/control.rb +326 -0
- data/lib/inprovise/execution_context.rb +277 -0
- data/lib/inprovise/group.rb +67 -0
- data/lib/inprovise/helper/cygwin.rb +43 -0
- data/lib/inprovise/helper/linux.rb +181 -0
- data/lib/inprovise/helper/windows.rb +123 -0
- data/lib/inprovise/infra.rb +122 -0
- data/lib/inprovise/local_file.rb +120 -0
- data/lib/inprovise/logger.rb +79 -0
- data/lib/inprovise/node.rb +271 -0
- data/lib/inprovise/remote_file.rb +128 -0
- data/lib/inprovise/resolver.rb +36 -0
- data/lib/inprovise/script.rb +175 -0
- data/lib/inprovise/script_index.rb +46 -0
- data/lib/inprovise/script_runner.rb +110 -0
- data/lib/inprovise/sniff.rb +46 -0
- data/lib/inprovise/sniffer/linux.rb +64 -0
- data/lib/inprovise/sniffer/platform.rb +46 -0
- data/lib/inprovise/sniffer/unknown.rb +11 -0
- data/lib/inprovise/sniffer/windows.rb +32 -0
- data/lib/inprovise/template/inprovise.rb.erb +92 -0
- data/lib/inprovise/template.rb +38 -0
- data/lib/inprovise/trigger_runner.rb +36 -0
- data/lib/inprovise/version.rb +10 -0
- data/lib/inprovise.rb +145 -0
- data/test/cli_test.rb +314 -0
- data/test/cli_test_helper.rb +19 -0
- data/test/dsl_test.rb +43 -0
- data/test/fixtures/example.txt +1 -0
- data/test/fixtures/include.rb +4 -0
- data/test/fixtures/inprovise.rb +1 -0
- data/test/fixtures/myscheme.rb +1 -0
- data/test/infra_test.rb +189 -0
- data/test/local_file_test.rb +64 -0
- data/test/remote_file_test.rb +106 -0
- data/test/resolver_test.rb +66 -0
- data/test/script_index_test.rb +53 -0
- data/test/script_test.rb +56 -0
- data/test/test_helper.rb +237 -0
- metadata +182 -0
data/test/cli_test.rb
ADDED
@@ -0,0 +1,314 @@
|
|
1
|
+
# CLI tests for Inprovise
|
2
|
+
#
|
3
|
+
# Author:: Martin Corino
|
4
|
+
# License:: Distributes under the same license as Ruby
|
5
|
+
|
6
|
+
require_relative 'cli_test_helper'
|
7
|
+
|
8
|
+
describe Inprovise::Cli do
|
9
|
+
describe "'node' commands" do
|
10
|
+
after :each do
|
11
|
+
reset_infrastructure!
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'adds a node to the infrastructure' do
|
15
|
+
Inprovise::Cli.run(%w{node add -a host.address --no-sniff MyHost})
|
16
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
17
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
18
|
+
tgt.name.must_equal 'MyHost'
|
19
|
+
tgt.host.must_equal 'host.address'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'adds a node with implicit host address' do
|
23
|
+
Inprovise::Cli.run(%w{node add --no-sniff my.host.addr})
|
24
|
+
tgt = Inprovise::Infrastructure.find('my.host.addr')
|
25
|
+
tgt.name.must_equal 'my.host.addr'
|
26
|
+
tgt.host.must_equal tgt.name
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'adds a node with custom config' do
|
30
|
+
Inprovise::Cli.run(%w{node add -a host.address -c config1=value1 -c config2=123 -c config3=Time.now --no-sniff MyHost})
|
31
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
32
|
+
tgt.config[:config1].must_equal 'value1'
|
33
|
+
tgt.config[:config2].must_equal 123
|
34
|
+
tgt.config[:config3].must_be_instance_of Time
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'removes a node from the infrastructure' do
|
38
|
+
Inprovise::Cli.run(%w{node add -a host.address --no-sniff MyHost})
|
39
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
40
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
41
|
+
tgt.name.must_equal 'MyHost'
|
42
|
+
Inprovise::Cli.run(%w{node remove MyHost})
|
43
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
44
|
+
tgt.must_be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'updates a node from the infrastructure' do
|
48
|
+
Inprovise::Cli.run(%w{node add -a host.address --no-sniff MyHost})
|
49
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
50
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
51
|
+
tgt.name.must_equal 'MyHost'
|
52
|
+
tgt.config[:config1].must_be_nil
|
53
|
+
Inprovise::Cli.run(%w{node update -c config1=value1 --no-sniff MyHost})
|
54
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
55
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
56
|
+
tgt.name.must_equal 'MyHost'
|
57
|
+
tgt.config[:config1].must_equal 'value1'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "'group' commands" do
|
62
|
+
after :each do
|
63
|
+
reset_infrastructure!
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'adds a group to the infrastructure' do
|
67
|
+
Inprovise::Cli.run(%w{group add MyGroup})
|
68
|
+
tgt = Inprovise::Infrastructure.find('MyGroup')
|
69
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Group
|
70
|
+
tgt.name.must_equal 'MyGroup'
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'removes a group from the infrastructure' do
|
74
|
+
Inprovise::Cli.run(%w{group add MyGroup})
|
75
|
+
tgt = Inprovise::Infrastructure.find('MyGroup')
|
76
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Group
|
77
|
+
tgt.name.must_equal 'MyGroup'
|
78
|
+
Inprovise::Cli.run(%w{group remove MyGroup})
|
79
|
+
tgt = Inprovise::Infrastructure.find('MyGroup')
|
80
|
+
tgt.must_be_nil
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'adds a group with custom config' do
|
84
|
+
Inprovise::Cli.run(%w{group add -c config1=value1 -c config2=123 -c config3=Time.now MyGroup})
|
85
|
+
tgt = Inprovise::Infrastructure.find('MyGroup')
|
86
|
+
tgt.config[:config1].must_equal 'value1'
|
87
|
+
tgt.config[:config2].must_equal 123
|
88
|
+
tgt.config[:config3].must_be_instance_of Time
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'adds a node to a group' do
|
92
|
+
Inprovise::Cli.run(%w{group add MyGroup})
|
93
|
+
grp = Inprovise::Infrastructure.find('MyGroup')
|
94
|
+
grp.must_be_instance_of Inprovise::Infrastructure::Group
|
95
|
+
grp.name.must_equal 'MyGroup'
|
96
|
+
Inprovise::Cli.run(%w{node add -g MyGroup --no-sniff MyHost})
|
97
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
98
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
99
|
+
tgt.name.must_equal 'MyHost'
|
100
|
+
grp.targets.must_equal [tgt]
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'adds a group including a node' do
|
104
|
+
Inprovise::Cli.run(%w{node add --no-sniff MyHost})
|
105
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
106
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
107
|
+
tgt.name.must_equal 'MyHost'
|
108
|
+
Inprovise::Cli.run(%w{group add -t MyHost MyGroup})
|
109
|
+
grp = Inprovise::Infrastructure.find('MyGroup')
|
110
|
+
grp.must_be_instance_of Inprovise::Infrastructure::Group
|
111
|
+
grp.name.must_equal 'MyGroup'
|
112
|
+
grp.targets.must_equal [tgt]
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'updates a group with a node' do
|
116
|
+
Inprovise::Cli.run(%w{node add --no-sniff MyHost})
|
117
|
+
tgt = Inprovise::Infrastructure.find('MyHost')
|
118
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Node
|
119
|
+
tgt.name.must_equal 'MyHost'
|
120
|
+
Inprovise::Cli.run(%w{group add MyGroup})
|
121
|
+
grp = Inprovise::Infrastructure.find('MyGroup')
|
122
|
+
grp.must_be_instance_of Inprovise::Infrastructure::Group
|
123
|
+
grp.name.must_equal 'MyGroup'
|
124
|
+
Inprovise::Cli.run(%w{group update -t MyHost MyGroup})
|
125
|
+
grp.targets.must_equal [tgt]
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'updates a group with custom config' do
|
129
|
+
Inprovise::Cli.run(%w{group add MyGroup})
|
130
|
+
tgt = Inprovise::Infrastructure.find('MyGroup')
|
131
|
+
tgt.must_be_instance_of Inprovise::Infrastructure::Group
|
132
|
+
tgt.name.must_equal 'MyGroup'
|
133
|
+
tgt.config[:config1].must_be_nil
|
134
|
+
Inprovise::Cli.run(%w{group update -c config1='value1' MyGroup})
|
135
|
+
tgt.config[:config1].must_equal 'value1'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "'apply' command" do
|
140
|
+
|
141
|
+
it 'invokes the Inprovise::Controller#run appropriately' do
|
142
|
+
ctl = Inprovise::Controller.new
|
143
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
144
|
+
cmd.must_equal :apply
|
145
|
+
tgt.must_equal 'script'
|
146
|
+
args.shift.must_equal 'node'
|
147
|
+
end
|
148
|
+
Inprovise::Controller.stub(:new, ctl) do
|
149
|
+
Inprovise::Cli.run(%w{apply script node})
|
150
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'invokes the Inprovise::Controller#run with custom scheme' do
|
155
|
+
ctl = Inprovise::Controller.new
|
156
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
157
|
+
cmd.must_equal :apply
|
158
|
+
tgt.must_equal 'script'
|
159
|
+
args.shift.must_equal 'node'
|
160
|
+
end
|
161
|
+
Inprovise::Controller.stub(:new, ctl) do
|
162
|
+
Inprovise::Cli.run(%w{apply -s myscheme.rb script node})
|
163
|
+
Inprovise.loaded?('myscheme.rb').must_equal true
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'invokes the Inprovise::Controller#run with custom config' do
|
168
|
+
ctl = Inprovise::Controller.new
|
169
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
170
|
+
cmd.must_equal :apply
|
171
|
+
opts[:config1] = 'value1'
|
172
|
+
tgt.must_equal 'script'
|
173
|
+
args.shift.must_equal 'node'
|
174
|
+
end
|
175
|
+
Inprovise::Controller.stub(:new, ctl) do
|
176
|
+
Inprovise::Cli.run(%w{apply -c config1=value1 script node})
|
177
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "'revert' command" do
|
184
|
+
|
185
|
+
it 'invokes the Inprovise::Controller#run appropriately' do
|
186
|
+
ctl = Inprovise::Controller.new
|
187
|
+
ctl.expects(:run_provisioning_command).with() do |cmd, tgt, opts,*args|
|
188
|
+
cmd.must_equal :revert
|
189
|
+
tgt.must_equal 'script'
|
190
|
+
args.shift.must_equal 'node'
|
191
|
+
end
|
192
|
+
Inprovise::Controller.stub(:new, ctl) do
|
193
|
+
Inprovise::Cli.run(%w{revert script node})
|
194
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'invokes the Inprovise::Controller#run with custom scheme' do
|
199
|
+
ctl = Inprovise::Controller.new
|
200
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
201
|
+
cmd.must_equal :revert
|
202
|
+
tgt.must_equal 'script'
|
203
|
+
args.shift.must_equal 'node'
|
204
|
+
end
|
205
|
+
Inprovise::Controller.stub(:new, ctl) do
|
206
|
+
Inprovise::Cli.run(%w{revert -s myscheme.rb script node})
|
207
|
+
Inprovise.loaded?('myscheme.rb').must_equal true
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'invokes the Inprovise::Controller#run with custom config' do
|
212
|
+
ctl = Inprovise::Controller.new
|
213
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
214
|
+
cmd.must_equal :revert
|
215
|
+
opts[:config1] = 'value1'
|
216
|
+
tgt.must_equal 'script'
|
217
|
+
args.shift.must_equal 'node'
|
218
|
+
end
|
219
|
+
Inprovise::Controller.stub(:new, ctl) do
|
220
|
+
Inprovise::Cli.run(%w{revert -c config1=value1 script node})
|
221
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|
227
|
+
describe "'validate' command" do
|
228
|
+
|
229
|
+
it 'invokes the Inprovise::Controller#run appropriately' do
|
230
|
+
ctl = Inprovise::Controller.new
|
231
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
232
|
+
cmd.must_equal :validate
|
233
|
+
tgt.must_equal 'script'
|
234
|
+
args.shift.must_equal 'node'
|
235
|
+
end
|
236
|
+
Inprovise::Controller.stub(:new, ctl) do
|
237
|
+
Inprovise::Cli.run(%w{validate script node})
|
238
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'invokes the Inprovise::Controller#run with custom scheme' do
|
243
|
+
ctl = Inprovise::Controller.new
|
244
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
245
|
+
cmd.must_equal :validate
|
246
|
+
tgt.must_equal 'script'
|
247
|
+
args.shift.must_equal 'node'
|
248
|
+
end
|
249
|
+
Inprovise::Controller.stub(:new, ctl) do
|
250
|
+
Inprovise::Cli.run(%w{validate -s myscheme.rb script node})
|
251
|
+
Inprovise.loaded?('myscheme.rb').must_equal true
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'invokes the Inprovise::Controller#run with custom config' do
|
256
|
+
ctl = Inprovise::Controller.new
|
257
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
258
|
+
cmd.must_equal :validate
|
259
|
+
opts[:config1] = 'value1'
|
260
|
+
tgt.must_equal 'script'
|
261
|
+
args.shift.must_equal 'node'
|
262
|
+
end
|
263
|
+
Inprovise::Controller.stub(:new, ctl) do
|
264
|
+
Inprovise::Cli.run(%w{validate -c config1=value1 script node})
|
265
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
end
|
270
|
+
|
271
|
+
describe "'trigger' command" do
|
272
|
+
|
273
|
+
it 'invokes the Inprovise::Controller#run appropriately' do
|
274
|
+
ctl = Inprovise::Controller.new
|
275
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
276
|
+
cmd.must_equal :trigger
|
277
|
+
tgt.must_equal 'script:action'
|
278
|
+
args.shift.must_equal 'node'
|
279
|
+
end
|
280
|
+
Inprovise::Controller.stub(:new, ctl) do
|
281
|
+
Inprovise::Cli.run(%w{trigger script:action node})
|
282
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'invokes the Inprovise::Controller#run with custom scheme' do
|
287
|
+
ctl = Inprovise::Controller.new
|
288
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
289
|
+
cmd.must_equal :trigger
|
290
|
+
tgt.must_equal 'script:action'
|
291
|
+
args.shift.must_equal 'node'
|
292
|
+
end
|
293
|
+
Inprovise::Controller.stub(:new, ctl) do
|
294
|
+
Inprovise::Cli.run(%w{trigger -s myscheme.rb script:action node})
|
295
|
+
Inprovise.loaded?('myscheme.rb').must_equal true
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'invokes the Inprovise::Controller#run with custom config' do
|
300
|
+
ctl = Inprovise::Controller.new
|
301
|
+
ctl.expects(:run_provisioning_command).with() do |cmd,tgt,opts,*args|
|
302
|
+
cmd.must_equal :trigger
|
303
|
+
opts[:config1] = 'value1'
|
304
|
+
tgt.must_equal 'script:action'
|
305
|
+
args.shift.must_equal 'node'
|
306
|
+
end
|
307
|
+
Inprovise::Controller.stub(:new, ctl) do
|
308
|
+
Inprovise::Cli.run(%w{trigger -c config1=value1 script:action node})
|
309
|
+
Inprovise.loaded?('inprovise.rb').must_equal true
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
end
|
314
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# CLI-test helper for Inprovise
|
2
|
+
#
|
3
|
+
# Author:: Martin Corino
|
4
|
+
# License:: Distributes under the same license as Ruby
|
5
|
+
|
6
|
+
require_relative './test_helper'
|
7
|
+
|
8
|
+
# prevent CLI error handling from exiting
|
9
|
+
class Inprovise::Cli
|
10
|
+
on_error do |exception|
|
11
|
+
# Error logic here
|
12
|
+
# return false to skip default error handling
|
13
|
+
$stderr.puts "ERROR: #{exception.message}".red
|
14
|
+
if Inprovise.verbosity > 0
|
15
|
+
$stderr.puts "#{exception}\n#{exception.backtrace.join("\n")}"
|
16
|
+
end
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
data/test/dsl_test.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# DSL tests for Inprovise
|
2
|
+
#
|
3
|
+
# Author:: Martin Corino
|
4
|
+
# License:: Distributes under the same license as Ruby
|
5
|
+
|
6
|
+
require_relative 'test_helper'
|
7
|
+
|
8
|
+
describe Inprovise::DSL do
|
9
|
+
describe "'script' command" do
|
10
|
+
after :each do
|
11
|
+
reset_script_index!
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'adds a script to the index' do
|
15
|
+
Inprovise::DSL.script('my-script') { nil }
|
16
|
+
Inprovise::ScriptIndex.default.get('my-script').must_be_instance_of Inprovise::Script
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'creates a new script based on the supplied name' do
|
20
|
+
Inprovise::DSL.script('my-script') { nil }
|
21
|
+
script = Inprovise::ScriptIndex.default.get('my-script')
|
22
|
+
script.name.must_equal 'my-script'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'executes the given definition block in the script context' do
|
26
|
+
Inprovise::DSL.script('my-script') { depends_on 'other-script' }
|
27
|
+
script = Inprovise::ScriptIndex.default.get('my-script')
|
28
|
+
script.dependencies.must_equal ['other-script']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "'include' command" do
|
33
|
+
after :each do
|
34
|
+
reset_script_index!
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'includes a provisioning scheme' do
|
38
|
+
Inprovise::DSL.include(File.join(File.dirname(__FILE__), 'fixtures', 'include.rb'))
|
39
|
+
script = Inprovise::ScriptIndex.default.get('included')
|
40
|
+
script.name.must_equal 'included'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
example
|
@@ -0,0 +1 @@
|
|
1
|
+
# default test scheme
|
@@ -0,0 +1 @@
|
|
1
|
+
# custom test scheme
|
data/test/infra_test.rb
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
# Infrastructure tests for Inprovise
|
2
|
+
#
|
3
|
+
# Author:: Martin Corino
|
4
|
+
# License:: Distributes under the same license as Ruby
|
5
|
+
|
6
|
+
require_relative 'test_helper'
|
7
|
+
|
8
|
+
describe Inprovise::Infrastructure do
|
9
|
+
after :each do
|
10
|
+
reset_infrastructure!
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#new' do
|
14
|
+
it 'creates a new node from parameters' do
|
15
|
+
node = Inprovise::Infrastructure::Node.new('myNode')
|
16
|
+
node.must_equal Inprovise::Infrastructure.find('myNode')
|
17
|
+
node.host.must_equal 'myNode'
|
18
|
+
node.user.must_equal 'root'
|
19
|
+
node = Inprovise::Infrastructure::Node.new('myNode2', host: 'my.node2.addr', user: 'me')
|
20
|
+
node.must_equal Inprovise::Infrastructure.find('myNode2')
|
21
|
+
node.host.must_equal 'my.node2.addr'
|
22
|
+
node.user.must_equal 'me'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'creates a new group from parameters' do
|
26
|
+
grp = Inprovise::Infrastructure::Group.new('myGroup')
|
27
|
+
grp.must_equal Inprovise::Infrastructure.find('myGroup')
|
28
|
+
grp = Inprovise::Infrastructure::Group.new('myGroup2', myval: 'value')
|
29
|
+
grp.must_equal Inprovise::Infrastructure.find('myGroup2')
|
30
|
+
grp.config[:myval].must_equal 'value'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#get/#set' do
|
35
|
+
|
36
|
+
before :each do
|
37
|
+
Inprovise::Infrastructure::Node.new('myNode')
|
38
|
+
Inprovise::Infrastructure::Node.new('myNode2', host: 'my.node2.addr', user: 'me')
|
39
|
+
Inprovise::Infrastructure::Group.new('myGroup')
|
40
|
+
Inprovise::Infrastructure::Group.new('myGroup2', myval: 'value')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'sets a property value' do
|
44
|
+
node = Inprovise::Infrastructure.find('myNode')
|
45
|
+
node.set(:setting1, 5)
|
46
|
+
node.config[:setting1].must_equal 5
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'gets a property value' do
|
50
|
+
grp = Inprovise::Infrastructure.find('myGroup2')
|
51
|
+
grp.get(:myval).must_equal 'value'
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#add_to/#remove_from' do
|
57
|
+
|
58
|
+
before :each do
|
59
|
+
Inprovise::Infrastructure::Node.new('myNode')
|
60
|
+
Inprovise::Infrastructure::Node.new('myNode2', host: 'my.node2.addr', user: 'me')
|
61
|
+
Inprovise::Infrastructure::Group.new('myGroup')
|
62
|
+
Inprovise::Infrastructure::Group.new('myGroup2', myval: 'value')
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'adds a node to a group' do
|
66
|
+
node = Inprovise::Infrastructure.find('myNode')
|
67
|
+
node.add_to(Inprovise::Infrastructure.find('myGroup'))
|
68
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
69
|
+
assert grp.includes?('myNode')
|
70
|
+
assert grp.includes?(node)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'adds a group to a group' do
|
74
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
75
|
+
grp.add_to(Inprovise::Infrastructure.find('myGroup2'))
|
76
|
+
grp2 = Inprovise::Infrastructure.find('myGroup2')
|
77
|
+
assert grp2.includes?('myGroup')
|
78
|
+
assert grp2.includes?(grp)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'allows overlapping inclusion' do
|
82
|
+
node = Inprovise::Infrastructure.find('myNode')
|
83
|
+
node.add_to(Inprovise::Infrastructure.find('myGroup'))
|
84
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
85
|
+
grp.add_to(Inprovise::Infrastructure.find('myGroup2'))
|
86
|
+
node.add_to(Inprovise::Infrastructure.find('myGroup2'))
|
87
|
+
grp2 = Inprovise::Infrastructure.find('myGroup2')
|
88
|
+
assert grp.includes?('myNode')
|
89
|
+
assert grp.includes?(node)
|
90
|
+
assert grp2.includes?('myNode')
|
91
|
+
assert grp2.includes?(node)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'resolves inclusion recursively' do
|
95
|
+
node = Inprovise::Infrastructure.find('myNode')
|
96
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
97
|
+
node.add_to(grp)
|
98
|
+
grp.add_to(Inprovise::Infrastructure.find('myGroup2'))
|
99
|
+
grp2 = Inprovise::Infrastructure.find('myGroup2')
|
100
|
+
assert grp2.includes?('myGroup')
|
101
|
+
assert grp2.includes?(grp)
|
102
|
+
assert grp2.includes?('myNode')
|
103
|
+
assert grp2.includes?(node)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'removes targets non-recursively' do
|
107
|
+
node = Inprovise::Infrastructure.find('myNode')
|
108
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
109
|
+
node.add_to(grp)
|
110
|
+
grp.add_to(Inprovise::Infrastructure.find('myGroup2'))
|
111
|
+
grp2 = Inprovise::Infrastructure.find('myGroup2')
|
112
|
+
assert grp2.includes?('myGroup')
|
113
|
+
assert grp2.includes?(grp)
|
114
|
+
assert grp2.includes?('myNode')
|
115
|
+
assert grp2.includes?(node)
|
116
|
+
node.remove_from(grp2)
|
117
|
+
assert grp2.includes?(node)
|
118
|
+
node.remove_from(grp)
|
119
|
+
assert !grp2.includes?(node)
|
120
|
+
assert grp2.includes?(grp)
|
121
|
+
grp.remove_from(grp2)
|
122
|
+
assert !grp2.includes?(grp)
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
describe '#targets' do
|
128
|
+
|
129
|
+
before :each do
|
130
|
+
n = Inprovise::Infrastructure::Node.new('myNode')
|
131
|
+
n2 = Inprovise::Infrastructure::Node.new('myNode2', host: 'my.node2.addr', user: 'me')
|
132
|
+
g = Inprovise::Infrastructure::Group.new('myGroup')
|
133
|
+
g2 = Inprovise::Infrastructure::Group.new('myGroup2', myval: 'value')
|
134
|
+
n.add_to(g)
|
135
|
+
n.add_to(g2)
|
136
|
+
n2.add_to(g2)
|
137
|
+
g.add_to(g2)
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
it 'resolves included (device) targets' do
|
142
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
143
|
+
grp.targets.size.must_equal 1
|
144
|
+
grp.targets.must_include Inprovise::Infrastructure.find('myNode')
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'resolves (device) targets recursively and uniquely' do
|
148
|
+
grp2 = Inprovise::Infrastructure.find('myGroup2')
|
149
|
+
grp2.targets.size.must_equal 2
|
150
|
+
grp2.targets.must_include Inprovise::Infrastructure.find('myNode')
|
151
|
+
grp2.targets.must_include Inprovise::Infrastructure.find('myNode2')
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '#targets_with_config' do
|
157
|
+
|
158
|
+
before :each do
|
159
|
+
n = Inprovise::Infrastructure::Node.new('myNode', nodeval: 666)
|
160
|
+
n2 = Inprovise::Infrastructure::Node.new('myNode2', host: 'my.node2.addr', user: 'me')
|
161
|
+
g = Inprovise::Infrastructure::Group.new('myGroup', myval: 'value')
|
162
|
+
g2 = Inprovise::Infrastructure::Group.new('myGroup2', myval2: 'value2')
|
163
|
+
n.add_to(g)
|
164
|
+
n.add_to(g2)
|
165
|
+
n2.add_to(g2)
|
166
|
+
g.add_to(g2)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'resolves (device) targets and config recursively and uniquely' do
|
170
|
+
grp = Inprovise::Infrastructure.find('myGroup')
|
171
|
+
grp.targets_with_config.size.must_equal 1
|
172
|
+
grp.targets_with_config.must_include Inprovise::Infrastructure.find('myNode')
|
173
|
+
grp.targets_with_config[Inprovise::Infrastructure.find('myNode')][:nodeval].must_equal 666
|
174
|
+
grp.targets_with_config[Inprovise::Infrastructure.find('myNode')][:myval].must_equal 'value'
|
175
|
+
grp.targets_with_config[Inprovise::Infrastructure.find('myNode')][:myval2].must_be_nil
|
176
|
+
grp2 = Inprovise::Infrastructure.find('myGroup2')
|
177
|
+
grp2.targets_with_config.size.must_equal 2
|
178
|
+
grp2.targets_with_config.must_include Inprovise::Infrastructure.find('myNode')
|
179
|
+
grp2.targets_with_config[Inprovise::Infrastructure.find('myNode')][:nodeval].must_equal 666
|
180
|
+
grp2.targets_with_config[Inprovise::Infrastructure.find('myNode')][:myval].must_equal 'value'
|
181
|
+
grp2.targets_with_config[Inprovise::Infrastructure.find('myNode')][:myval2].must_equal 'value2'
|
182
|
+
grp2.targets_with_config.must_include Inprovise::Infrastructure.find('myNode2')
|
183
|
+
grp2.targets_with_config[Inprovise::Infrastructure.find('myNode2')][:nodeval].must_be_nil
|
184
|
+
grp2.targets_with_config[Inprovise::Infrastructure.find('myNode2')][:myval].must_be_nil
|
185
|
+
grp2.targets_with_config[Inprovise::Infrastructure.find('myNode2')][:myval2].must_equal 'value2'
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# Local file tests for Inprovise
|
2
|
+
#
|
3
|
+
# Author:: Martin Corino
|
4
|
+
# License:: Distributes under the same license as Ruby
|
5
|
+
|
6
|
+
require_relative 'test_helper'
|
7
|
+
|
8
|
+
describe Inprovise::LocalFile do
|
9
|
+
before :each do
|
10
|
+
@local_file_path = File.join(File.dirname(__FILE__), 'fixtures', 'example.txt')
|
11
|
+
@local_file = Inprovise::LocalFile.new(@local_file_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'path' do
|
15
|
+
it 'returns the absolute path of a local file' do
|
16
|
+
@local_file.path.must_equal @local_file_path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'hash' do
|
21
|
+
it 'returns the sha1 of a local file' do
|
22
|
+
@local_file.hash.must_equal 'c3499c2729730a7f807efb8676a92dcb6f8a3f8f'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'matches' do
|
27
|
+
it 'returns true if the passed file has a matching hash' do
|
28
|
+
@local_file.matches?(@local_file).must_equal true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'exists?' do
|
33
|
+
it 'checks if a file exists' do
|
34
|
+
@local_file.exists?.must_equal true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'copy_to' do
|
39
|
+
before(:each) { @destination = Inprovise::LocalFile.new("/tmp/example-#{Time.now.to_i}.txt") }
|
40
|
+
after(:each) { @destination.delete! }
|
41
|
+
|
42
|
+
it 'copies a file to another local location' do
|
43
|
+
@destination.exists?.must_equal false
|
44
|
+
@local_file.copy_to(@destination).must_equal @destination
|
45
|
+
@destination.exists?.must_equal true
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'copies a file to a remote location by uploading it' do
|
49
|
+
@remote_destination_context = mock()
|
50
|
+
@remote_destination = Inprovise::RemoteFile.new(@remote_destination_context, '/tmp/example-dest.txt')
|
51
|
+
@remote_destination_context.expects(:upload).with(@local_file.path, @remote_destination.path)
|
52
|
+
@local_file.copy_to(@remote_destination).must_equal @remote_destination
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'set_permissions' do
|
57
|
+
it 'sets permissions on the file based on a mask' do
|
58
|
+
@local_file.set_permissions(0664).must_equal @local_file
|
59
|
+
@local_file.permissions.must_equal 0664
|
60
|
+
@local_file.set_permissions(0644).must_equal @local_file
|
61
|
+
@local_file.permissions.must_equal 0644
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|