loom-core 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +12 -10
- data/lib/loom/facts/fact_set.rb +4 -2
- data/lib/loom/facts/provider.rb +4 -0
- data/lib/loom/pattern/all.rb +1 -0
- data/lib/loom/pattern/definition_context.rb +6 -0
- data/lib/loom/pattern/dsl.rb +32 -1
- data/lib/loom/pattern/expanding_reference.rb +16 -0
- data/lib/loom/pattern/loader.rb +22 -1
- data/lib/loom/pattern/reference.rb +4 -0
- data/lib/loom/pattern/reference_set.rb +29 -5
- data/lib/loom/runner.rb +12 -12
- data/lib/loom/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d528b08eb52c1ed7fca596af8d47b5e1869c5bd98d1bbeba9cb66c27dad3043
|
4
|
+
data.tar.gz: 1445b6f3d508a9be19d32f2aa9253e3e6f7b7eb9b771b73ea482b9b3ca07a846
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93499a20ce6ba74bcf96dc84d6fbf2c1b1c3fd38901dd9f4c06e8f3ce04d6d44dde3176f1aa88b8becbda43b72b5e93767d7e088d8d4fb1c52e40e3b07212f9e
|
7
|
+
data.tar.gz: f3e2c5a3699f76c3e6d83d41286b421158c9ed2380714dbe2e54658c51c3a466832967f29d1e12601c63beaf2f59d8e83b0b03938cff43459d906e59018d4eec
|
data/Gemfile.lock
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
loom-core (0.0.
|
5
|
-
bcrypt_pbkdf (
|
4
|
+
loom-core (0.0.3)
|
5
|
+
bcrypt_pbkdf (>= 1.0, < 2.0)
|
6
6
|
commander (~> 4.4)
|
7
|
-
|
7
|
+
ed25519 (>= 1.0, < 2.0)
|
8
|
+
net-ssh (>= 5)
|
8
9
|
rbnacl-libsodium (= 1.0.10)
|
9
10
|
sshkit (~> 1.11)
|
10
11
|
|
11
12
|
GEM
|
12
13
|
remote: https://rubygems.org/
|
13
14
|
specs:
|
14
|
-
bcrypt_pbkdf (1.0.0
|
15
|
+
bcrypt_pbkdf (1.0.0)
|
15
16
|
byebug (9.0.6)
|
16
17
|
coderay (1.1.1)
|
17
|
-
commander (4.4.
|
18
|
+
commander (4.4.6)
|
18
19
|
highline (~> 1.7.2)
|
19
20
|
diff-lcs (1.2.5)
|
21
|
+
ed25519 (1.2.4)
|
20
22
|
ffi (1.9.14)
|
21
23
|
formatador (0.2.5)
|
22
24
|
guard (2.14.0)
|
@@ -33,7 +35,7 @@ GEM
|
|
33
35
|
guard (~> 2.1)
|
34
36
|
guard-compat (~> 1.1)
|
35
37
|
rspec (>= 2.99.0, < 4.0)
|
36
|
-
highline (1.7.
|
38
|
+
highline (1.7.10)
|
37
39
|
listen (3.1.5)
|
38
40
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
39
41
|
rb-inotify (~> 0.9, >= 0.9.7)
|
@@ -43,7 +45,7 @@ GEM
|
|
43
45
|
nenv (0.3.0)
|
44
46
|
net-scp (1.2.1)
|
45
47
|
net-ssh (>= 2.6.5)
|
46
|
-
net-ssh (
|
48
|
+
net-ssh (5.0.2)
|
47
49
|
notiffany (0.1.1)
|
48
50
|
nenv (~> 0.1)
|
49
51
|
shellany (~> 0.0)
|
@@ -58,7 +60,7 @@ GEM
|
|
58
60
|
rb-fsevent (0.9.8)
|
59
61
|
rb-inotify (0.9.7)
|
60
62
|
ffi (>= 0.5.0)
|
61
|
-
rbnacl (
|
63
|
+
rbnacl (5.0.0)
|
62
64
|
ffi
|
63
65
|
rbnacl-libsodium (1.0.10)
|
64
66
|
rbnacl (>= 3.0.1)
|
@@ -78,7 +80,7 @@ GEM
|
|
78
80
|
ruby_dep (1.5.0)
|
79
81
|
shellany (0.0.1)
|
80
82
|
slop (3.6.0)
|
81
|
-
sshkit (1.
|
83
|
+
sshkit (1.17.0)
|
82
84
|
net-scp (>= 1.1.2)
|
83
85
|
net-ssh (>= 2.8.0)
|
84
86
|
thor (0.19.1)
|
@@ -96,4 +98,4 @@ DEPENDENCIES
|
|
96
98
|
rspec (~> 3.5)
|
97
99
|
|
98
100
|
BUNDLED WITH
|
99
|
-
1.
|
101
|
+
1.16.2
|
data/lib/loom/facts/fact_set.rb
CHANGED
@@ -83,8 +83,10 @@ module Loom::Facts
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def get(fact_name)
|
86
|
-
|
87
|
-
|
86
|
+
v = @fact_map[fact_name.to_sym]
|
87
|
+
dup = v.dup rescue v
|
88
|
+
dup = FactSet.new(@host_spec, {}) if dup.nil?
|
89
|
+
dup.is_a?(Hash) ? FactSet.new(@host_spec, dup) : dup
|
88
90
|
end
|
89
91
|
alias_method :[], :get
|
90
92
|
|
data/lib/loom/facts/provider.rb
CHANGED
@@ -4,6 +4,10 @@ module Loom::Facts
|
|
4
4
|
# TODO: add documentation re: use of namespace in fact_set.rb
|
5
5
|
attr_reader :fact_map, :namespace
|
6
6
|
|
7
|
+
# TODO: add a mechanism to check for prerequisites to enabling a fact provider, currently
|
8
|
+
# FacterProvider does this manually. At a minimum binaries required by the fact provider to
|
9
|
+
# collect info should be checked to be available.
|
10
|
+
|
7
11
|
class << self
|
8
12
|
def disable_for_host(host_spec, klass)
|
9
13
|
Loom.log.warn "disabling fact provider => #{klass} on #{host_spec.hostname}"
|
data/lib/loom/pattern/all.rb
CHANGED
@@ -49,6 +49,8 @@ module Loom::Pattern
|
|
49
49
|
Hook.after_hooks merged_hooks.reverse
|
50
50
|
end
|
51
51
|
|
52
|
+
# Helper methods for flattening all parent definition contexts for running a
|
53
|
+
# pattern ref.
|
52
54
|
private
|
53
55
|
def merged_fact_map
|
54
56
|
merged_contexts.map(&:fact_map).reduce({}) do |merged_map, next_map|
|
@@ -62,6 +64,10 @@ module Loom::Pattern
|
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
67
|
+
##
|
68
|
+
# Flattens the list of hooks from all parent modules so that executing the
|
69
|
+
# pattern reference executes all expected hooks in the correct order, w/o
|
70
|
+
# needing to recurse.
|
65
71
|
def merged_hooks
|
66
72
|
return hooks if @parent_context.nil?
|
67
73
|
merged_contexts.map(&:hooks).flatten
|
data/lib/loom/pattern/dsl.rb
CHANGED
@@ -98,6 +98,13 @@ Loom::Facts::FactSet as parameters.
|
|
98
98
|
|
99
99
|
=end
|
100
100
|
module Loom::Pattern
|
101
|
+
|
102
|
+
# TODO: clarify this DSL to only export:
|
103
|
+
# - description
|
104
|
+
# - pattern
|
105
|
+
# - let
|
106
|
+
# - after/before
|
107
|
+
# other methods are utility methods used to process and run patterns.
|
101
108
|
module DSL
|
102
109
|
|
103
110
|
loom_accessor :namespace
|
@@ -120,7 +127,23 @@ module Loom::Pattern
|
|
120
127
|
end
|
121
128
|
|
122
129
|
def pattern(name, &block)
|
123
|
-
Loom.log.
|
130
|
+
Loom.log.debug1(self) { "defining pattern => #{name}" }
|
131
|
+
define_pattern_internal(name, &block)
|
132
|
+
end
|
133
|
+
|
134
|
+
def weave(name, pattern_slugs)
|
135
|
+
Loom.log.debug1(self) { "defining weave => #{name}" }
|
136
|
+
@weave_slugs ||= {}
|
137
|
+
@weave_slugs[name.to_sym] = pattern_slugs.map { |s| s.to_s }
|
138
|
+
|
139
|
+
unless @next_description
|
140
|
+
@next_description = "Weave runs patterns: %s" % pattern_slugs.join(", ")
|
141
|
+
end
|
142
|
+
|
143
|
+
define_pattern_internal(name) { |_, _| true }
|
144
|
+
end
|
145
|
+
|
146
|
+
def define_pattern_internal(name, &block)
|
124
147
|
@pattern_methods ||= []
|
125
148
|
@pattern_method_map ||= {}
|
126
149
|
@pattern_descriptions ||= {}
|
@@ -148,6 +171,14 @@ module Loom::Pattern
|
|
148
171
|
hook :after, &block
|
149
172
|
end
|
150
173
|
|
174
|
+
def weave_slugs
|
175
|
+
@weave_slugs || {}
|
176
|
+
end
|
177
|
+
|
178
|
+
def is_weave?(name)
|
179
|
+
!!weave_slugs[name]
|
180
|
+
end
|
181
|
+
|
151
182
|
def pattern_methods
|
152
183
|
@pattern_methods || []
|
153
184
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Loom::Pattern
|
2
|
+
class ExpandingReference
|
3
|
+
|
4
|
+
attr_reader :slug, :reference_slugs, :source_file, :desc
|
5
|
+
|
6
|
+
def initialize(slug, reference_slugs, source_file, description)
|
7
|
+
@slug = slug
|
8
|
+
@reference_slugs = reference_slugs
|
9
|
+
@desc = description
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_expanding?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/loom/pattern/loader.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Loom::Pattern
|
2
2
|
|
3
3
|
SiteFileNotFound = Class.new Loom::LoomError
|
4
|
+
RecursiveExpansionError = Class.new Loom::LoomError
|
4
5
|
|
5
6
|
class Loader
|
6
7
|
class << self
|
@@ -24,7 +25,8 @@ module Loom::Pattern
|
|
24
25
|
if slugs.nil?
|
25
26
|
@reference_set.pattern_refs
|
26
27
|
else
|
27
|
-
slugs.map { |slug| get_pattern_ref(slug) }
|
28
|
+
refs = slugs.map { |slug| get_pattern_ref(slug) }
|
29
|
+
expand_refs(refs)
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -44,5 +46,24 @@ module Loom::Pattern
|
|
44
46
|
def load_pattern_file(f)
|
45
47
|
@reference_set.merge! ReferenceSet.load_from_file(f)
|
46
48
|
end
|
49
|
+
|
50
|
+
def expand_refs(refs)
|
51
|
+
refs.flat_map do |ref|
|
52
|
+
if ref.is_expanding?
|
53
|
+
expanded_refs = ref.reference_slugs.map { |s| get_pattern_ref(s) }
|
54
|
+
expanded_refs.each do |exp_ref|
|
55
|
+
if exp_ref.is_expanding?
|
56
|
+
Loom.log.error "error expanding pattern[#{exp_ref.slug}] in weave[#{ref.slug}], i.e. only patterns are allowed in weaves"
|
57
|
+
raise RecursiveExpansionError, ref.slug
|
58
|
+
end
|
59
|
+
end
|
60
|
+
Loom.log.info(
|
61
|
+
"expanded pattern #{ref.slug} to patterns: #{expanded_refs.map(&:slug).join(",")}")
|
62
|
+
expanded_refs
|
63
|
+
else
|
64
|
+
ref
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
47
68
|
end
|
48
69
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# THERE BE DRAGONS HERE
|
2
|
+
# TODO: add documentation re: how the .loom file is parsed (exec'd) and turned
|
3
|
+
# into a reference set. There's also a lot of dark magic w/ generating
|
4
|
+
# stacktraces to get the correct .loom file line (but I forget if that's done
|
5
|
+
# here or in pattern/reference.rb maybe?)
|
1
6
|
module Loom::Pattern
|
2
7
|
|
3
8
|
DuplicatePatternRef = Class.new Loom::LoomError
|
@@ -54,6 +59,8 @@ module Loom::Pattern
|
|
54
59
|
def create(ruby_code, source)
|
55
60
|
shell_module = Module.new
|
56
61
|
shell_module.include Loom::Pattern
|
62
|
+
# TODO: I think this is my black magic for capturing stacktrace
|
63
|
+
# info... I forget the details. Add documentation.
|
57
64
|
shell_module.module_eval ruby_code, source, 1
|
58
65
|
shell_module.namespace ""
|
59
66
|
|
@@ -81,18 +88,35 @@ module Loom::Pattern
|
|
81
88
|
def refs_for_mod_spec(mod_spec)
|
82
89
|
mod = mod_spec[:module]
|
83
90
|
context = context_for_mod_spec mod_spec
|
84
|
-
source = @source
|
85
91
|
|
86
92
|
mod_spec[:pattern_methods].map do |m|
|
87
|
-
method = mod.pattern_method m
|
88
|
-
desc = mod.pattern_description m
|
89
93
|
slug = compute_slug mod_spec[:namespace_list], m
|
90
94
|
|
91
|
-
|
92
|
-
|
95
|
+
if mod.is_weave?(m)
|
96
|
+
Loom.log.debug2(self) { "adding ExpandingReference for weave: #{slug}" }
|
97
|
+
build_expanding_reference(m, slug, mod)
|
98
|
+
else
|
99
|
+
Loom.log.debug2(self) { "adding Reference for pattern: #{slug}" }
|
100
|
+
build_pattern_reference(m, slug, context, mod)
|
101
|
+
end
|
93
102
|
end
|
94
103
|
end
|
95
104
|
|
105
|
+
def build_expanding_reference(weave_name, slug, mod)
|
106
|
+
desc = mod.pattern_description weave_name
|
107
|
+
Loom.log.warn "no descripiton for weave => #{slug}" unless desc
|
108
|
+
|
109
|
+
ExpandingReference.new slug, mod.weave_slugs[weave_name], @source, desc
|
110
|
+
end
|
111
|
+
|
112
|
+
def build_pattern_reference(pattern_name, slug, context, mod)
|
113
|
+
method = mod.pattern_method pattern_name
|
114
|
+
desc = mod.pattern_description pattern_name
|
115
|
+
Loom.log.warn "no descripiton for pattern => #{slug}" unless desc
|
116
|
+
|
117
|
+
Reference.new slug, method, @source, context, desc
|
118
|
+
end
|
119
|
+
|
96
120
|
def context_for_mod_spec(mod_spec)
|
97
121
|
parents = mod_spec[:parent_modules].find_all do |mod|
|
98
122
|
is_pattern_module mod
|
data/lib/loom/runner.rb
CHANGED
@@ -128,7 +128,7 @@ module Loom
|
|
128
128
|
end
|
129
129
|
|
130
130
|
Loom.log.debug "collecting facts for => #{pattern_description}"
|
131
|
-
#
|
131
|
+
# Collects facts for each pattern run on each host, this way if one
|
132
132
|
# pattern run updates would be facts, the next pattern will see the
|
133
133
|
# new fact.
|
134
134
|
fact_shell = Loom::Shell.create @mod_loader, sshkit_backend, dry_run
|
@@ -136,10 +136,8 @@ module Loom
|
|
136
136
|
.merge @other_facts
|
137
137
|
|
138
138
|
Loom.log.info "running pattern => #{pattern_description}"
|
139
|
-
#
|
140
|
-
#
|
141
|
-
# should just be a way to clear/ignore state from certain commands -
|
142
|
-
# like the fact_finding ones above).
|
139
|
+
# Creates a new shell for executing the pattern, so as not to be
|
140
|
+
# tainted by the fact finding shell above.
|
143
141
|
pattern_shell = Loom::Shell.create @mod_loader, sshkit_backend, dry_run
|
144
142
|
|
145
143
|
Loom.log.warn "dry run only => #{pattern_description}" if dry_run
|
@@ -165,9 +163,11 @@ module Loom
|
|
165
163
|
result_reporter = Loom::Pattern::ResultReporter.new(
|
166
164
|
@loom_config, pattern_ref.slug, hostname, shell_session)
|
167
165
|
|
168
|
-
# TODO: This is a crappy mechanism for tracking errors
|
169
|
-
# there should be an exception thrown inside of Shell
|
170
|
-
# execution should stop. All errors
|
166
|
+
# TODO: This is a crappy mechanism for tracking errors - hency my crappy
|
167
|
+
# error reporting :( - there should be an exception thrown inside of Shell
|
168
|
+
# when a command fails and pattern execution should stop. All errors
|
169
|
+
# should come from exceptions. This needs to be thought about wrt to the
|
170
|
+
# defined `failure_strategy`
|
171
171
|
run_failure = []
|
172
172
|
begin
|
173
173
|
pattern_ref.call(shell.shell_api, fact_set)
|
@@ -175,8 +175,8 @@ module Loom
|
|
175
175
|
Loom.log.debug e.backtrace.join "\n\t"
|
176
176
|
run_failure << e
|
177
177
|
ensure
|
178
|
-
# TODO[P0]: this prints out [Result: OK] even if an exception is
|
179
|
-
# annoying.
|
178
|
+
# TODO[P0]: this prints out [Result: OK] even if an exception is
|
179
|
+
# raised... this is really annoying.
|
180
180
|
result_reporter.write_report
|
181
181
|
|
182
182
|
# TODO: this is not the correct error condition.
|
@@ -198,10 +198,10 @@ module Loom
|
|
198
198
|
Loom.log.warn "disabling host per :run_failure_strategy => #{failure_strategy}"
|
199
199
|
@inventory_list.disable hostname
|
200
200
|
when :fail_fast
|
201
|
-
Loom.log.error "erroring out of failed
|
201
|
+
Loom.log.error "erroring out of failed pattern per :run_failure_strategy"
|
202
202
|
raise FailFastExecutionError, failure_summary
|
203
203
|
when :cowboy
|
204
|
-
Loom.log.warn "continuing on past failed
|
204
|
+
Loom.log.warn "continuing on past failed pattern per :run_failure_strategy"
|
205
205
|
else
|
206
206
|
raise ConfigError, "unknown failure_strategy: #{failure_stratgy}"
|
207
207
|
end
|
data/lib/loom/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erick Johnson
|
@@ -228,6 +228,7 @@ files:
|
|
228
228
|
- lib/loom/pattern/all.rb
|
229
229
|
- lib/loom/pattern/definition_context.rb
|
230
230
|
- lib/loom/pattern/dsl.rb
|
231
|
+
- lib/loom/pattern/expanding_reference.rb
|
231
232
|
- lib/loom/pattern/hook.rb
|
232
233
|
- lib/loom/pattern/loader.rb
|
233
234
|
- lib/loom/pattern/reference.rb
|