loom-core 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +31 -0
- data/Gemfile.lock +19 -1
- data/Rakefile +2 -0
- data/bin/loom +3 -0
- data/docs/architecture.jpg +0 -0
- data/gentags.sh +2 -0
- data/lib/loom/all.rb +1 -1
- data/lib/loom/config.rb +1 -1
- data/lib/loom/mods/mod_loader.rb +7 -2
- data/lib/loom/pattern/all.rb +1 -0
- data/lib/loom/pattern/definition_context.rb +4 -4
- data/lib/loom/pattern/dsl.rb +176 -119
- data/lib/loom/pattern/expanding_reference.rb +88 -6
- data/lib/loom/pattern/loader.rb +1 -17
- data/lib/loom/pattern/pattern.rb +52 -0
- data/lib/loom/pattern/reference.rb +17 -13
- data/lib/loom/pattern/reference_set.rb +71 -50
- data/lib/loom/runner.rb +46 -33
- data/lib/loom/runner/all.rb +2 -0
- data/lib/loom/runner/execution_context.rb +9 -0
- data/lib/loom/{dsl.rb → runner/sshkit_connector.rb} +5 -7
- data/lib/loom/shell.rb +4 -2
- data/lib/loom/shell/core.rb +16 -16
- data/lib/loom/version.rb +1 -1
- data/lib/loomext/coremods/exec.rb +1 -0
- data/loom.TAGS +797 -0
- data/loom.gemspec +1 -0
- data/spec/.loom/error_handling.loom +1 -0
- data/spec/.loom/fail.loom +27 -13
- data/spec/.loom/files.loom +1 -0
- data/spec/.loom/inventory.yml +3 -0
- data/spec/.loom/net.loom +1 -0
- data/spec/.loom/pattern_context.loom +1 -0
- data/spec/.loom/pkg.loom +1 -0
- data/spec/.loom/shell.loom +1 -0
- data/spec/.loom/test.loom +17 -4
- data/spec/.loom/user.loom +1 -0
- data/spec/.loom/vms.loom +1 -0
- data/spec/loom/pattern/dsl_spec.rb +3 -2
- data/spec/shared/loom_internals_helper.rb +1 -1
- data/spec/test_loom_spec.rb +102 -42
- data/test +15 -0
- metadata +25 -3
data/loom.gemspec
CHANGED
data/spec/.loom/fail.loom
CHANGED
@@ -1,20 +1,34 @@
|
|
1
1
|
# All patterns are expected to fail
|
2
|
+
# $ bx rspec spec/test_loom_spec.rb -f d -t file:fail.loom
|
3
|
+
module ExpectedFailures
|
4
|
+
include Loom::Pattern
|
2
5
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
6
|
+
before do
|
7
|
+
Loom.log.warn <<EOS
|
8
|
+
|
9
|
+
!!!
|
10
|
+
!!! The next case is expected to fail !!!
|
11
|
+
!!!
|
12
|
+
EOS
|
7
13
|
end
|
8
|
-
end
|
9
14
|
|
10
|
-
desc "Always fails due to a hard failure"
|
11
|
-
pattern :fail_hard do |loom, facts|
|
12
|
-
loom.fail "Fail big or not at all"
|
13
|
-
end
|
14
15
|
|
15
|
-
desc "
|
16
|
-
pattern :
|
17
|
-
|
18
|
-
|
16
|
+
desc "Always fails due to return code."
|
17
|
+
pattern :fail_soft do |loom, facts|
|
18
|
+
unless loom.x :false
|
19
|
+
loom.x :echo, "i fail soft, because ALL examples are expected to succeed"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Expect `loom.fail` to throw and error out"
|
24
|
+
pattern :fail_hard do |loom, facts|
|
25
|
+
loom.fail "`loom.fail`: Fail big or not at all"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Expected to fail: Check timeout commands"
|
29
|
+
pattern :timeout_fail do |loom, facts|
|
30
|
+
loom.timeout(:timeout => 1) do
|
31
|
+
loom.x :sleep, 2
|
32
|
+
end
|
19
33
|
end
|
20
34
|
end
|
data/spec/.loom/files.loom
CHANGED
data/spec/.loom/net.loom
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Tests patterns nested at deeper module levels with contextual let, before, and
|
2
2
|
# after hooks. Verifies hook order and contexts are set correctly.
|
3
|
+
# $ bx rspec spec/test_loom_spec.rb -f d -t file:pattern_context.loom
|
3
4
|
module PatternContext
|
4
5
|
module Parent
|
5
6
|
include Loom::Pattern
|
data/spec/.loom/pkg.loom
CHANGED
data/spec/.loom/shell.loom
CHANGED
data/spec/.loom/test.loom
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
# TODO: add in test verifications that these tests are actually doing what
|
2
2
|
# they're supposed to do.
|
3
|
+
# $ bx rspec spec/test_loom_spec.rb -f d -t file:test.loom
|
4
|
+
weave :smoke, [
|
5
|
+
:"test:*",
|
6
|
+
]
|
3
7
|
|
4
|
-
module
|
8
|
+
module Test
|
5
9
|
include Loom::Pattern
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
|
11
|
+
with_facts { |f| f.merge a_fact: :or_fiction? }
|
12
|
+
let(:a_fact_len) { |f| f[:a_fact].size }
|
13
|
+
|
14
|
+
desc "inspects the facts"
|
15
|
+
report :the_facts do |loom, facts|
|
16
|
+
loom.fail "this should not happen: #{a_fact_len}" unless a_fact_len == 11
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "expects cli provided :param_facts"
|
20
|
+
pattern :param_facts do |loom, facts|
|
21
|
+
loom.fail "expected :param_facts" unless facts[:param_facts] == "from args"
|
10
22
|
end
|
11
23
|
|
12
24
|
desc "Reports `uptime` status"
|
@@ -28,6 +40,7 @@ module Smoke
|
|
28
40
|
pattern :wrap_returns do |loom, facts|
|
29
41
|
# using loom.time as a proxy for Shell::Core#wrap here
|
30
42
|
loom.time do
|
43
|
+
# TODO: this should be loom.fail
|
31
44
|
raise "wrapped true is not true" unless loom.test :true
|
32
45
|
raise "wrapped false is not false" if loom.test :false
|
33
46
|
end
|
data/spec/.loom/user.loom
CHANGED
data/spec/.loom/vms.loom
CHANGED
@@ -3,6 +3,7 @@ require "loom/pattern"
|
|
3
3
|
require "loom/shell"
|
4
4
|
|
5
5
|
describe Loom::Pattern::DSL do
|
6
|
+
extend LoomSpec::LoomInternalsHelper
|
6
7
|
|
7
8
|
# Fake API for tests. This object should raise an error on any command
|
8
9
|
# execution.
|
@@ -18,8 +19,8 @@ describe Loom::Pattern::DSL do
|
|
18
19
|
config.log_device = @logger_io
|
19
20
|
end
|
20
21
|
|
21
|
-
@reference_set =
|
22
|
-
.
|
22
|
+
@reference_set =
|
23
|
+
Loom::Pattern::ReferenceSet.builder(loom_file, ':loom_file').build
|
23
24
|
end
|
24
25
|
|
25
26
|
let(:pattern_under_test) { @reference_set['pattern_under_test'] }
|
@@ -15,7 +15,7 @@ module LoomSpec
|
|
15
15
|
|
16
16
|
def create_reference_set(loom_file_src=nil, path: 'loom/file/path')
|
17
17
|
loom_file_src ||= File.read(path)
|
18
|
-
Loom::Pattern::ReferenceSet::
|
18
|
+
Loom::Pattern::ReferenceSet::builder(loom_file_src, path).build
|
19
19
|
end
|
20
20
|
|
21
21
|
def capture_logs_to_io
|
data/spec/test_loom_spec.rb
CHANGED
@@ -15,6 +15,10 @@ describe "spec .loom files" do
|
|
15
15
|
}
|
16
16
|
|
17
17
|
EXPECTED_EXIT_CODE = {
|
18
|
+
# 100 to indicate failing patterns
|
19
|
+
# + 3 failed patterns
|
20
|
+
# ---
|
21
|
+
# 103 expected exit code
|
18
22
|
"fail.loom" => 103
|
19
23
|
}
|
20
24
|
|
@@ -25,53 +29,109 @@ describe "spec .loom files" do
|
|
25
29
|
|
26
30
|
let(:host) { "rp0" }
|
27
31
|
let(:patterns) { ref_set.slugs }
|
28
|
-
let(:command) {
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
context "
|
42
|
-
let(:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
it "should
|
48
|
-
|
49
|
-
|
50
|
-
|
32
|
+
let(:command) { nil }
|
33
|
+
|
34
|
+
let(:executor) { lambda do |*cmd_parts|
|
35
|
+
cmd_exec = cmd_parts.join ' '
|
36
|
+
output = `#{cmd_exec} 2>&1`
|
37
|
+
OpenStruct.new({
|
38
|
+
cmd_exec: cmd_exec,
|
39
|
+
stdout: output,
|
40
|
+
rc: $?.exitstatus,
|
41
|
+
})
|
42
|
+
end }
|
43
|
+
let(:exec_result) { executor.call(*command) }
|
44
|
+
|
45
|
+
context "$ loom inventory", smoke: true do
|
46
|
+
let(:command) {[
|
47
|
+
"bin/loom inventory",
|
48
|
+
"-X loom_search_paths=./spec/.loom"
|
49
|
+
]}
|
50
|
+
|
51
|
+
it "should list all hosts in inventory.yml" do
|
52
|
+
result = exec_result
|
53
|
+
|
54
|
+
["a.host.to.check", "my.other.host"].each do |h|
|
55
|
+
expect(result.stdout).to match(/#{h}/), result.to_yaml
|
56
|
+
end
|
57
|
+
expect(result.rc).to eql 0
|
51
58
|
end
|
52
59
|
end
|
53
60
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
61
|
+
context "$ loom pattern", smoke: true do
|
62
|
+
let(:command) {[
|
63
|
+
"bin/loom patterns",
|
64
|
+
"-l #{LOOM_FILES.join ','}"
|
65
|
+
]}
|
66
|
+
|
67
|
+
it "should list all patterns to stdout" do
|
68
|
+
result = exec_result
|
69
|
+
|
70
|
+
# some expected pattern slug namespaces
|
71
|
+
["pkg", "shell", "expectedfailures", "test"].each do |ns|
|
72
|
+
expect(result.stdout).to match(/^\s*#{ns}:.+/), result.to_yaml
|
73
|
+
end
|
74
|
+
expect(result.rc).to eql 0
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "$ loom weave" do
|
79
|
+
|
80
|
+
# Tests important command line flags
|
81
|
+
let(:command) {[
|
82
|
+
"bin/loom weave #{patterns.join " "}",
|
83
|
+
"-t",
|
84
|
+
"-l #{loom_file}",
|
85
|
+
"-X log_level=info",
|
86
|
+
"-H #{host}",
|
87
|
+
"-V",
|
88
|
+
"-X sshkit_log_level=warn",
|
89
|
+
"-X log_device=stderr",
|
90
|
+
"-X run_failure_strategy=cowboy",
|
91
|
+
"-F param_facts='from args'"
|
92
|
+
]}
|
93
|
+
|
94
|
+
# bundle exec rspec --tag smoke
|
95
|
+
context "test.loom" do
|
96
|
+
let(:loom_file) { LOOM_FILES.select { |p| p.match?(/#{subject}/) }.first }
|
58
97
|
let(:ref_set) { create_reference_set(path: loom_file) }
|
98
|
+
let(:patterns) { [:smoke] }
|
99
|
+
let(:host) { "localhost" }
|
100
|
+
|
101
|
+
it "should pass the smoke tests quickly", :smoke => true do
|
102
|
+
result = exec_result
|
103
|
+
unless result.rc == 0
|
104
|
+
puts "loom output:\n#{output}"
|
105
|
+
end
|
106
|
+
expect(result.rc).to eq 0
|
107
|
+
end
|
108
|
+
end
|
59
109
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
110
|
+
# bundle exec rspec --tag integration
|
111
|
+
LOOM_FILES.each do |loom_file|
|
112
|
+
context File.basename loom_file do
|
113
|
+
let(:loom_file) { loom_file }
|
114
|
+
let(:ref_set) { create_reference_set(path: loom_file) }
|
115
|
+
|
116
|
+
if XFILE_SET[File.basename(loom_file)]
|
117
|
+
xit "should pass all the tests",
|
118
|
+
SPEC_TAGS.merge(:file => File.basename(loom_file)) {}
|
119
|
+
else
|
120
|
+
it "should pass all tests",
|
121
|
+
SPEC_TAGS.merge(:file => File.basename(loom_file)) do
|
122
|
+
exec = command.join(' ')
|
123
|
+
puts <<EOS
|
124
|
+
executing command:
|
125
|
+
$ #{exec}
|
126
|
+
EOS
|
127
|
+
# TODO pattern match the commands on STDOUT (see comment in
|
128
|
+
# .loom/test.loom)
|
129
|
+
output = `#{exec}`
|
130
|
+
|
131
|
+
basename = File.basename(loom_file)
|
132
|
+
expected_exit_code = EXPECTED_EXIT_CODE[basename] || 0
|
133
|
+
expect($?.exitstatus).to eq expected_exit_code
|
134
|
+
end
|
75
135
|
end
|
76
136
|
end
|
77
137
|
end
|
data/test
CHANGED
@@ -1,2 +1,17 @@
|
|
1
1
|
#!/bin/sh
|
2
|
+
echo "running unit and smoke tests"
|
2
3
|
bundle exec rspec --tag ~integration
|
4
|
+
rc=$?
|
5
|
+
if [ $rc -ne 0 ]; then
|
6
|
+
exit $rc
|
7
|
+
fi
|
8
|
+
|
9
|
+
y_or_Y="${1}"
|
10
|
+
if [ "${y_or_Y}" == "" ];then
|
11
|
+
read -p "run integration tests (y/n)?" y_or_Y
|
12
|
+
fi
|
13
|
+
|
14
|
+
case "$y_or_Y" in
|
15
|
+
y|Y ) bundle exec rspec --tag integration;;
|
16
|
+
* ) exit $rc;;
|
17
|
+
esac
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loom-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erick Johnson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sshkit
|
@@ -190,6 +190,20 @@ dependencies:
|
|
190
190
|
- - ">="
|
191
191
|
- !ruby/object:Gem::Version
|
192
192
|
version: '0'
|
193
|
+
- !ruby/object:Gem::Dependency
|
194
|
+
name: rubocop
|
195
|
+
requirement: !ruby/object:Gem::Requirement
|
196
|
+
requirements:
|
197
|
+
- - ">="
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
type: :development
|
201
|
+
prerelease: false
|
202
|
+
version_requirements: !ruby/object:Gem::Requirement
|
203
|
+
requirements:
|
204
|
+
- - ">="
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
version: '0'
|
193
207
|
description: Repeatable management of remote hosts over SSH
|
194
208
|
email: ejohnson82@gmail.com
|
195
209
|
executables:
|
@@ -199,17 +213,19 @@ extra_rdoc_files: []
|
|
199
213
|
files:
|
200
214
|
- ".gitignore"
|
201
215
|
- ".rspec"
|
216
|
+
- ".rubocop.yml"
|
202
217
|
- Gemfile
|
203
218
|
- Gemfile.lock
|
204
219
|
- Guardfile
|
205
220
|
- Rakefile
|
206
221
|
- bin/loom
|
222
|
+
- docs/architecture.jpg
|
223
|
+
- gentags.sh
|
207
224
|
- lib/env/development.rb
|
208
225
|
- lib/loom.rb
|
209
226
|
- lib/loom/all.rb
|
210
227
|
- lib/loom/config.rb
|
211
228
|
- lib/loom/core_ext.rb
|
212
|
-
- lib/loom/dsl.rb
|
213
229
|
- lib/loom/facts.rb
|
214
230
|
- lib/loom/facts/all.rb
|
215
231
|
- lib/loom/facts/fact_file_provider.rb
|
@@ -231,10 +247,14 @@ files:
|
|
231
247
|
- lib/loom/pattern/expanding_reference.rb
|
232
248
|
- lib/loom/pattern/hook.rb
|
233
249
|
- lib/loom/pattern/loader.rb
|
250
|
+
- lib/loom/pattern/pattern.rb
|
234
251
|
- lib/loom/pattern/reference.rb
|
235
252
|
- lib/loom/pattern/reference_set.rb
|
236
253
|
- lib/loom/pattern/result_reporter.rb
|
237
254
|
- lib/loom/runner.rb
|
255
|
+
- lib/loom/runner/all.rb
|
256
|
+
- lib/loom/runner/execution_context.rb
|
257
|
+
- lib/loom/runner/sshkit_connector.rb
|
238
258
|
- lib/loom/shell.rb
|
239
259
|
- lib/loom/shell/all.rb
|
240
260
|
- lib/loom/shell/api.rb
|
@@ -268,12 +288,14 @@ files:
|
|
268
288
|
- lib/loomext/coremods/vm.rb
|
269
289
|
- lib/loomext/coremods/vm/all.rb
|
270
290
|
- lib/loomext/coremods/vm/vbox.rb
|
291
|
+
- loom.TAGS
|
271
292
|
- loom.gemspec
|
272
293
|
- loom/inventory.yml
|
273
294
|
- scripts/harness.sh
|
274
295
|
- spec/.loom/error_handling.loom
|
275
296
|
- spec/.loom/fail.loom
|
276
297
|
- spec/.loom/files.loom
|
298
|
+
- spec/.loom/inventory.yml
|
277
299
|
- spec/.loom/net.loom
|
278
300
|
- spec/.loom/pattern_context.loom
|
279
301
|
- spec/.loom/pkg.loom
|