loom-core 0.0.6 → 0.0.7
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/.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
|