taste_tester 0.0.13 → 0.0.14
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 +5 -5
- data/README.md +33 -7
- data/bin/taste-tester +50 -11
- data/lib/taste_tester/client.rb +117 -17
- data/lib/taste_tester/commands.rb +200 -12
- data/lib/taste_tester/config.rb +17 -4
- data/lib/taste_tester/exceptions.rb +7 -0
- data/lib/taste_tester/hooks.rb +15 -0
- data/lib/taste_tester/host.rb +131 -75
- data/lib/taste_tester/locallink.rb +6 -2
- data/lib/taste_tester/logging.rb +4 -3
- data/lib/taste_tester/noop.rb +6 -2
- data/lib/taste_tester/server.rb +23 -5
- data/lib/taste_tester/ssh.rb +12 -10
- data/lib/taste_tester/state.rb +22 -3
- data/lib/taste_tester/tunnel.rb +5 -5
- data/lib/taste_tester/windows.rb +1 -0
- metadata +37 -9
data/lib/taste_tester/noop.rb
CHANGED
@@ -22,7 +22,7 @@ module TasteTester
|
|
22
22
|
include TasteTester::Logging
|
23
23
|
include BetweenMeals::Util
|
24
24
|
|
25
|
-
attr_reader :output
|
25
|
+
attr_reader :output, :status
|
26
26
|
|
27
27
|
def initialize
|
28
28
|
print_noop_warning
|
@@ -48,7 +48,7 @@ module TasteTester
|
|
48
48
|
alias << add
|
49
49
|
|
50
50
|
def run
|
51
|
-
run!
|
51
|
+
@status, @output = run!
|
52
52
|
end
|
53
53
|
|
54
54
|
def run!
|
@@ -56,6 +56,10 @@ module TasteTester
|
|
56
56
|
[0, "# TasteTester by #{@user}"]
|
57
57
|
end
|
58
58
|
|
59
|
+
def error!
|
60
|
+
# never fails, but interface requires a definition
|
61
|
+
end
|
62
|
+
|
59
63
|
private
|
60
64
|
|
61
65
|
def cmd
|
data/lib/taste_tester/server.rb
CHANGED
@@ -30,13 +30,14 @@ module TasteTester
|
|
30
30
|
include TasteTester::Logging
|
31
31
|
extend ::BetweenMeals::Util
|
32
32
|
|
33
|
-
attr_accessor :user, :host
|
33
|
+
attr_accessor :user, :host, :bundle_dir
|
34
34
|
|
35
35
|
def initialize
|
36
36
|
@state = TasteTester::State.new
|
37
37
|
@ref_file = TasteTester::Config.ref_file
|
38
38
|
ref_dir = File.dirname(File.expand_path(@ref_file))
|
39
|
-
@log_file =
|
39
|
+
@log_file = File.join(ref_dir, 'chef-zero.log')
|
40
|
+
@fsroot = File.join(ref_dir, 'root')
|
40
41
|
@zero_path = TasteTester::Config.chef_zero_path
|
41
42
|
unless File.directory?(ref_dir)
|
42
43
|
begin
|
@@ -46,6 +47,10 @@ module TasteTester
|
|
46
47
|
logger.warn(e)
|
47
48
|
end
|
48
49
|
end
|
50
|
+
if TasteTester::Config.bundle
|
51
|
+
@bundle_dir = File.join(@fsroot, 'organizations/chef/file_store')
|
52
|
+
FileUtils.mkpath(@bundle_dir)
|
53
|
+
end
|
49
54
|
|
50
55
|
@user = ENV['USER']
|
51
56
|
|
@@ -53,7 +58,8 @@ module TasteTester
|
|
53
58
|
# determines if we listen only on localhost or not
|
54
59
|
@need_restart = @state.ssl != TasteTester::Config.use_ssl ||
|
55
60
|
@state.logging != TasteTester::Config.chef_zero_logging ||
|
56
|
-
@state.ssh != TasteTester::Config.use_ssh_tunnels
|
61
|
+
@state.ssh != TasteTester::Config.use_ssh_tunnels ||
|
62
|
+
@state.bundle != TasteTester::Config.bundle
|
57
63
|
|
58
64
|
# If we are using SSH tunneling listen on localhost, otherwise listen
|
59
65
|
# on all addresses - both v4 and v6. Note that on localhost, ::1 is
|
@@ -121,10 +127,20 @@ module TasteTester
|
|
121
127
|
@state.ref = ref
|
122
128
|
end
|
123
129
|
|
130
|
+
def last_upload_time
|
131
|
+
@state.last_upload_time
|
132
|
+
end
|
133
|
+
|
134
|
+
def last_upload_time=(time)
|
135
|
+
@state.last_upload_time = time
|
136
|
+
end
|
137
|
+
|
124
138
|
def self.running?
|
125
139
|
if TasteTester::State.port
|
126
|
-
return
|
140
|
+
return chef_zero_running?(TasteTester::State.port,
|
141
|
+
TasteTester::Config.use_ssl)
|
127
142
|
end
|
143
|
+
|
128
144
|
false
|
129
145
|
end
|
130
146
|
|
@@ -152,18 +168,20 @@ module TasteTester
|
|
152
168
|
:ssl => TasteTester::Config.use_ssl,
|
153
169
|
:ssh => TasteTester::Config.use_ssh_tunnels,
|
154
170
|
:logging => TasteTester::Config.chef_zero_logging,
|
171
|
+
:bundle => TasteTester::Config.bundle,
|
155
172
|
})
|
156
173
|
logger.info("Starting chef-zero of port #{@state.port}")
|
157
174
|
if windows?
|
158
175
|
extend ::TasteTester::Windows
|
159
176
|
start_win_chef_zero_server
|
160
177
|
else
|
161
|
-
cmd = "#{chef_zero_path} --host #{@addr} --port #{@state.port} -d"
|
178
|
+
cmd = +"#{chef_zero_path} --host #{@addr} --port #{@state.port} -d"
|
162
179
|
if TasteTester::Config.chef_zero_logging
|
163
180
|
cmd << " --log-file #{@log_file}" +
|
164
181
|
' --log-level debug'
|
165
182
|
end
|
166
183
|
cmd << ' --ssl' if TasteTester::Config.use_ssl
|
184
|
+
cmd << " --file-store #{@fsroot}" if TasteTester::Config.bundle
|
167
185
|
Mixlib::ShellOut.new(cmd).run_command.error!
|
168
186
|
end
|
169
187
|
end
|
data/lib/taste_tester/ssh.rb
CHANGED
@@ -22,11 +22,10 @@ module TasteTester
|
|
22
22
|
include TasteTester::Logging
|
23
23
|
include BetweenMeals::Util
|
24
24
|
|
25
|
-
attr_reader :output
|
25
|
+
attr_reader :output, :status
|
26
26
|
|
27
|
-
def initialize(host,
|
27
|
+
def initialize(host, tunnel = false)
|
28
28
|
@host = host
|
29
|
-
@timeout = timeout
|
30
29
|
@tunnel = tunnel
|
31
30
|
@cmds = []
|
32
31
|
end
|
@@ -44,18 +43,20 @@ module TasteTester
|
|
44
43
|
def run!
|
45
44
|
@status, @output = exec!(cmd, logger)
|
46
45
|
rescue StandardError => e
|
47
|
-
|
48
|
-
error
|
46
|
+
logger.error(e.message)
|
47
|
+
error!
|
48
|
+
end
|
49
|
+
|
50
|
+
def error!
|
51
|
+
error = <<-ERRORMESSAGE
|
49
52
|
SSH returned error while connecting to #{TasteTester::Config.user}@#{@host}
|
50
53
|
The host might be broken or your SSH access is not working properly
|
51
54
|
Try doing
|
52
55
|
#{TasteTester::Config.ssh_command} -v #{TasteTester::Config.user}@#{@host}
|
53
56
|
and come back once that works
|
54
|
-
|
55
|
-
# rubocop:enable LineLength
|
57
|
+
ERRORMESSAGE
|
56
58
|
error.lines.each { |x| logger.error x.strip }
|
57
|
-
|
58
|
-
raise TasteTester::Exceptions::SshError
|
59
|
+
fail TasteTester::Exceptions::SshError
|
59
60
|
end
|
60
61
|
|
61
62
|
private
|
@@ -66,7 +67,8 @@ MSG
|
|
66
67
|
end
|
67
68
|
cmds = @cmds.join(' && ')
|
68
69
|
cmd = "#{TasteTester::Config.ssh_command} " +
|
69
|
-
|
70
|
+
'-T -o BatchMode=yes ' +
|
71
|
+
"-o ConnectTimeout=#{TasteTester::Config.ssh_connect_timeout} " +
|
70
72
|
"#{TasteTester::Config.user}@#{@host} "
|
71
73
|
if TasteTester::Config.user != 'root'
|
72
74
|
cc = Base64.encode64(cmds).delete("\n")
|
data/lib/taste_tester/state.rb
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
require 'fileutils'
|
18
18
|
require 'socket'
|
19
19
|
require 'timeout'
|
20
|
+
require 'chef/mash'
|
20
21
|
|
21
22
|
require 'between_meals/util'
|
22
23
|
require 'taste_tester/config'
|
@@ -29,9 +30,7 @@ module TasteTester
|
|
29
30
|
include ::BetweenMeals::Util
|
30
31
|
|
31
32
|
def initialize
|
32
|
-
ref_dir = File.dirname(
|
33
|
-
File.expand_path(TasteTester::Config.ref_file),
|
34
|
-
)
|
33
|
+
ref_dir = File.dirname(File.expand_path(TasteTester::Config.ref_file))
|
35
34
|
unless File.directory?(ref_dir)
|
36
35
|
begin
|
37
36
|
FileUtils.mkpath(ref_dir)
|
@@ -83,6 +82,22 @@ module TasteTester
|
|
83
82
|
write(:ref, ref)
|
84
83
|
end
|
85
84
|
|
85
|
+
def last_upload_time
|
86
|
+
TasteTester::State.read(:last_upload_time)
|
87
|
+
end
|
88
|
+
|
89
|
+
def last_upload_time=(time)
|
90
|
+
write(:last_upload_time, time)
|
91
|
+
end
|
92
|
+
|
93
|
+
def bundle
|
94
|
+
TasteTester::State.read(:bundle)
|
95
|
+
end
|
96
|
+
|
97
|
+
def bundle=(bundle)
|
98
|
+
write(:bundle, bundle)
|
99
|
+
end
|
100
|
+
|
86
101
|
def update(vals)
|
87
102
|
merge(vals)
|
88
103
|
end
|
@@ -120,6 +135,10 @@ module TasteTester
|
|
120
135
|
end
|
121
136
|
|
122
137
|
def merge(vals)
|
138
|
+
# we generally use symbols for the keys, but to/from JSON will
|
139
|
+
# give us strings, and thus duplicate keys, which is bad. So
|
140
|
+
# use a Mash
|
141
|
+
state = Mash.new
|
123
142
|
begin
|
124
143
|
state = JSON.parse(File.read(TasteTester::Config.ref_file))
|
125
144
|
rescue StandardError
|
data/lib/taste_tester/tunnel.rb
CHANGED
@@ -22,10 +22,9 @@ module TasteTester
|
|
22
22
|
|
23
23
|
attr_reader :port
|
24
24
|
|
25
|
-
def initialize(host, server
|
25
|
+
def initialize(host, server)
|
26
26
|
@host = host
|
27
27
|
@server = server
|
28
|
-
@timeout = timeout
|
29
28
|
if TasteTester::Config.testing_until
|
30
29
|
@delta_secs = TasteTester::Config.testing_until.strftime('%s').to_i -
|
31
30
|
Time.now.strftime('%s').to_i
|
@@ -38,8 +37,8 @@ module TasteTester
|
|
38
37
|
@port = TasteTester::Config.tunnel_port
|
39
38
|
logger.info("Setting up tunnel on port #{@port}")
|
40
39
|
@status, @output = exec!(cmd, logger)
|
41
|
-
rescue StandardError
|
42
|
-
logger.error
|
40
|
+
rescue StandardError => e
|
41
|
+
logger.error "Failed bringing up ssh tunnel: #{e}"
|
43
42
|
exit(1)
|
44
43
|
end
|
45
44
|
|
@@ -58,7 +57,8 @@ module TasteTester
|
|
58
57
|
# in a way that port was still open, but subsequent requests were hanging.
|
59
58
|
# This is reproducible and should be looked into.
|
60
59
|
cmd = "#{TasteTester::Config.ssh_command} " +
|
61
|
-
"-
|
60
|
+
"-o ConnectTimeout=#{TasteTester::Config.ssh_connect_timeout} " +
|
61
|
+
'-T -o BatchMode=yes ' +
|
62
62
|
'-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' +
|
63
63
|
"-o ServerAliveInterval=10 -o ServerAliveCountMax=#{@max_ping} " +
|
64
64
|
"-f -R #{@port}:localhost:#{@server.port} "
|
data/lib/taste_tester/windows.rb
CHANGED
@@ -40,6 +40,7 @@ module TasteTester
|
|
40
40
|
cmd << " --log-file #{@log_file} --log-level debug"
|
41
41
|
end
|
42
42
|
cmd << ' --ssl' if TasteTester::Config.use_ssl
|
43
|
+
cmd << " --file-store #{@fsroot}" if TasteTester::Config.bundle
|
43
44
|
|
44
45
|
# Mixlib::Shellout will always wait for a process to finish before
|
45
46
|
# returning, so we use `spawn` instead.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taste_tester
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Dibowitz
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-08-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: between_meals
|
@@ -26,21 +26,21 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 0.0.6
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: json
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 2.0.0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 2.0.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: mixlib-config
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
@@ -54,13 +54,13 @@ dependencies:
|
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: colorize
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
|
-
type: :
|
63
|
+
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
@@ -95,6 +95,34 @@ dependencies:
|
|
95
95
|
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: minitar
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.6.1
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 0.6.1
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rubocop
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.49.1
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.49.1
|
98
126
|
description: Utility for testing Chef changes using chef-zero
|
99
127
|
email:
|
100
128
|
executables:
|
@@ -142,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
170
|
version: '0'
|
143
171
|
requirements: []
|
144
172
|
rubyforge_project:
|
145
|
-
rubygems_version: 2.6.
|
173
|
+
rubygems_version: 2.7.6.2
|
146
174
|
signing_key:
|
147
175
|
specification_version: 4
|
148
176
|
summary: Taste Tester
|