elecksee 1.0.22 → 1.1.0
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 +7 -0
- data/CHANGELOG.md +10 -0
- data/CONTRIBUTING.md +25 -0
- data/README.md +43 -6
- data/elecksee.gemspec +3 -3
- data/lib/elecksee/clone.rb +47 -16
- data/lib/elecksee/ephemeral.rb +65 -15
- data/lib/elecksee/helpers/copies.rb +36 -5
- data/lib/elecksee/helpers/options.rb +29 -3
- data/lib/elecksee/{helpers/base.rb → helpers.rb} +115 -56
- data/lib/elecksee/lxc.rb +204 -82
- data/lib/elecksee/lxc_file_config.rb +26 -0
- data/lib/elecksee/storage/overlay_directory.rb +68 -37
- data/lib/elecksee/storage/overlay_mount.rb +80 -45
- data/lib/elecksee/storage/virtual_device.rb +104 -60
- data/lib/elecksee/storage.rb +13 -0
- data/lib/elecksee/version.rb +2 -1
- data/lib/elecksee.rb +13 -0
- metadata +26 -33
- data/Gemfile +0 -5
- data/Gemfile.lock +0 -22
- data/lib/elecksee/knife/config.rb +0 -37
@@ -1,63 +1,29 @@
|
|
1
|
-
require '
|
1
|
+
require 'elecksee'
|
2
2
|
|
3
3
|
class Lxc
|
4
|
-
|
5
|
-
attr_accessor :original, :result
|
6
|
-
def initialize(orig, result=nil)
|
7
|
-
@original = orig
|
8
|
-
@result = result
|
9
|
-
super(orig.to_s)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Timeout < CommandFailed
|
14
|
-
end
|
15
|
-
|
16
|
-
class CommandResult
|
17
|
-
attr_reader :original, :stdout, :stderr
|
18
|
-
def initialize(result)
|
19
|
-
@original = result
|
20
|
-
if(result.class.ancestors.map(&:to_s).include?('ChildProcess::AbstractProcess'))
|
21
|
-
extract_childprocess
|
22
|
-
elsif(result.class.to_s == 'Mixlib::ShellOut')
|
23
|
-
extract_shellout
|
24
|
-
else
|
25
|
-
raise TypeError.new("Unknown process result type received: #{result.class}")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def extract_childprocess
|
30
|
-
original.io.stdout.rewind
|
31
|
-
original.io.stderr.rewind
|
32
|
-
@stdout = original.io.stdout.read
|
33
|
-
@stderr = original.io.stderr.read
|
34
|
-
original.io.stdout.delete
|
35
|
-
original.io.stderr.delete
|
36
|
-
end
|
37
|
-
|
38
|
-
def extract_shellout
|
39
|
-
@stdout = original.stdout
|
40
|
-
@stderr = original.stderr
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
4
|
+
# Helper modules
|
44
5
|
module Helpers
|
45
6
|
|
7
|
+
autoload :Copies, 'elecksee/helpers/copies'
|
8
|
+
autoload :Options, 'elecksee/helpers/options'
|
9
|
+
|
10
|
+
# @return [String] sudo command string
|
46
11
|
def sudo
|
47
12
|
Lxc.sudo
|
48
13
|
end
|
49
14
|
|
50
|
-
#
|
15
|
+
# Shellout wrapper
|
16
|
+
#
|
17
|
+
# @param cmd [String]
|
18
|
+
# @param args [Hash]
|
19
|
+
# @option args [Integer] :allow_failure_retry number of retries
|
20
|
+
# @option args [Numeric] :timeout max execution time
|
21
|
+
# @option args [TrueClass, FalseClass] :sudo use sudo
|
22
|
+
# @option args [TrueClass, FalseClass] :allow_failure don't raise on error
|
23
|
+
# @return [CommandResult]
|
51
24
|
def run_command(cmd, args={})
|
52
25
|
result = nil
|
53
|
-
cmd_type =
|
54
|
-
unless(cmd_type)
|
55
|
-
if(defined?(ChildProcess))
|
56
|
-
cmd_type = :childprocess
|
57
|
-
else
|
58
|
-
cmd_type = :mixlib_shellout
|
59
|
-
end
|
60
|
-
end
|
26
|
+
cmd_type = :childprocess
|
61
27
|
com_block = nil
|
62
28
|
case cmd_type
|
63
29
|
when :childprocess
|
@@ -73,6 +39,15 @@ class Lxc
|
|
73
39
|
result == false ? false : CommandResult.new(result)
|
74
40
|
end
|
75
41
|
|
42
|
+
# Shellout using childprocess
|
43
|
+
#
|
44
|
+
# @param cmd [String]
|
45
|
+
# @param args [Hash]
|
46
|
+
# @option args [Integer] :allow_failure_retry number of retries
|
47
|
+
# @option args [Numeric] :timeout max execution time
|
48
|
+
# @option args [TrueClass, FalseClass] :sudo use sudo
|
49
|
+
# @option args [TrueClass, FalseClass] :allow_failure don't raise on error
|
50
|
+
# @return [ChildProcess::AbstractProcess]
|
76
51
|
def child_process_command(cmd, args)
|
77
52
|
retries = args[:allow_failure_retry].to_i
|
78
53
|
cmd = [sudo, cmd].join(' ') if args[:sudo]
|
@@ -109,6 +84,15 @@ class Lxc
|
|
109
84
|
end
|
110
85
|
end
|
111
86
|
|
87
|
+
# Shellout using mixlib shellout
|
88
|
+
#
|
89
|
+
# @param cmd [String]
|
90
|
+
# @param args [Hash]
|
91
|
+
# @option args [Integer] :allow_failure_retry number of retries
|
92
|
+
# @option args [Numeric] :timeout max execution time
|
93
|
+
# @option args [TrueClass, FalseClass] :sudo use sudo
|
94
|
+
# @option args [TrueClass, FalseClass] :allow_failure don't raise on error
|
95
|
+
# @return [Mixlib::ShellOut]
|
112
96
|
def mixlib_shellout_command(cmd, args)
|
113
97
|
retries = args[:allow_failure_retry].to_i
|
114
98
|
cmd = [sudo, cmd].join(' ') if args[:sudo]
|
@@ -137,11 +121,9 @@ class Lxc
|
|
137
121
|
end
|
138
122
|
end
|
139
123
|
end
|
124
|
+
alias_method :command, :run_command
|
140
125
|
|
141
|
-
|
142
|
-
run_command(*args)
|
143
|
-
end
|
144
|
-
|
126
|
+
# @return [Logger] logger instance
|
145
127
|
def log
|
146
128
|
if(defined?(Chef))
|
147
129
|
Chef::Log
|
@@ -154,8 +136,11 @@ class Lxc
|
|
154
136
|
end
|
155
137
|
end
|
156
138
|
|
157
|
-
# Detect HOME environment variable
|
158
|
-
#
|
139
|
+
# Detect HOME if environment variable is not set
|
140
|
+
#
|
141
|
+
# @param set_if_missing [TrueClass, FalseClass] set environment variable if missing
|
142
|
+
# @return [String] value detected
|
143
|
+
# @note if detection fails, first writeable path is used from /root or /tmp
|
159
144
|
def detect_home(set_if_missing=false)
|
160
145
|
if(ENV['HOME'] && Pathname.new(ENV['HOME']).absolute?)
|
161
146
|
ENV['HOME']
|
@@ -167,5 +152,79 @@ class Lxc
|
|
167
152
|
home
|
168
153
|
end
|
169
154
|
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
# Command failure class
|
159
|
+
class CommandFailed < StandardError
|
160
|
+
|
161
|
+
# @return [StandardError] original exception
|
162
|
+
attr_accessor :original
|
163
|
+
# @return [Object] command result
|
164
|
+
attr_accessor :result
|
165
|
+
|
166
|
+
# Create new instance
|
167
|
+
#
|
168
|
+
# @param orig [StandardError] original exception
|
169
|
+
# @param result [Object] command result
|
170
|
+
def initialize(orig, result=nil)
|
171
|
+
@original = orig
|
172
|
+
@result = result
|
173
|
+
super(orig.to_s)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# Command exceeded timeout
|
178
|
+
class Timeout < CommandFailed
|
179
|
+
end
|
180
|
+
|
181
|
+
# Result of command
|
182
|
+
class CommandResult
|
183
|
+
|
184
|
+
# @return [Object] original result
|
185
|
+
attr_reader :original
|
186
|
+
# @return [IO] stdout of command
|
187
|
+
attr_reader :stdout
|
188
|
+
# @return [IO] stderr of command
|
189
|
+
attr_reader :stderr
|
190
|
+
|
191
|
+
# Create new instance
|
192
|
+
#
|
193
|
+
# @param result [Object] result of command
|
194
|
+
def initialize(result)
|
195
|
+
@original = result
|
196
|
+
if(result.class.ancestors.map(&:to_s).include?('ChildProcess::AbstractProcess'))
|
197
|
+
extract_childprocess
|
198
|
+
elsif(result.class.to_s == 'Mixlib::ShellOut')
|
199
|
+
extract_shellout
|
200
|
+
elsif(result.class.to_s == 'Rye::Err' || result.class.to_s == 'Rye::Rap')
|
201
|
+
extract_rye
|
202
|
+
else
|
203
|
+
raise TypeError.new("Unknown process result type received: #{result.class}")
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# Extract information from childprocess result
|
208
|
+
def extract_childprocess
|
209
|
+
original.io.stdout.rewind
|
210
|
+
original.io.stderr.rewind
|
211
|
+
@stdout = original.io.stdout.read
|
212
|
+
@stderr = original.io.stderr.read
|
213
|
+
original.io.stdout.delete
|
214
|
+
original.io.stderr.delete
|
215
|
+
end
|
216
|
+
|
217
|
+
# Extract information from mixlib shellout result
|
218
|
+
def extract_shellout
|
219
|
+
@stdout = original.stdout
|
220
|
+
@stderr = original.stderr
|
221
|
+
end
|
222
|
+
|
223
|
+
# Extract information from rye result
|
224
|
+
def extract_rye
|
225
|
+
@stdout = original.stdout.map(&:to_s).join("\n")
|
226
|
+
@stderr = original.stderr.map(&:to_s).join("\n")
|
227
|
+
end
|
228
|
+
|
170
229
|
end
|
171
230
|
end
|