taste_tester 0.0.11 → 0.0.12
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/bin/taste-tester +2 -0
- data/lib/taste_tester/config.rb +10 -4
- data/lib/taste_tester/hooks.rb +1 -1
- data/lib/taste_tester/host.rb +14 -5
- data/lib/taste_tester/server.rb +30 -15
- data/lib/taste_tester/state.rb +8 -0
- data/lib/taste_tester/windows.rb +82 -0
- metadata +28 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b43e9bbdc0fa2bccc9c0bca3f4c749d6c0b4f356
|
4
|
+
data.tar.gz: 941177bd83e37b1830ca0f24add48768261541e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7446d6bef3d9f68860d2747a1a67141dcb3eb9fbbb9751713811afed02da87e192db4b4e473d11433fb908b4eafd14960ef610de052fbd3e8e3c82c5ccb037f2
|
7
|
+
data.tar.gz: db111fd123f9faff1a37b40f128e2e8a2041b27ad5be234dd62e2cf99bede17218cbbb5450543c1b999f5eed001fce18f1f8150309155e8bf250b208081d2f73
|
data/bin/taste-tester
CHANGED
@@ -123,6 +123,7 @@ MODES:
|
|
123
123
|
end
|
124
124
|
|
125
125
|
options = { :config_file => TasteTester::Config.config_file }
|
126
|
+
# rubocop:disable Metrics/BlockLength
|
126
127
|
parser = OptionParser.new do |opts|
|
127
128
|
opts.banner = description
|
128
129
|
|
@@ -351,6 +352,7 @@ MODES:
|
|
351
352
|
options[:skip_post_test_hook] = true
|
352
353
|
end
|
353
354
|
end
|
355
|
+
# rubocop:enable Metrics/BlockLength
|
354
356
|
|
355
357
|
if mode == 'help'
|
356
358
|
puts parser
|
data/lib/taste_tester/config.rb
CHANGED
@@ -95,8 +95,14 @@ module TasteTester
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def self.chef_port
|
98
|
-
|
99
|
-
|
98
|
+
require 'taste_tester/state'
|
99
|
+
port_range = (
|
100
|
+
chef_port_range.first.to_i..chef_port_range.last.to_i
|
101
|
+
).to_a.shuffle
|
102
|
+
if TasteTester::State.port
|
103
|
+
port_range.unshift(TasteTester::State.port)
|
104
|
+
end
|
105
|
+
port_range.each do |port|
|
100
106
|
unless port_open?(port)
|
101
107
|
return port
|
102
108
|
end
|
@@ -108,9 +114,9 @@ module TasteTester
|
|
108
114
|
|
109
115
|
def self.testing_end_time
|
110
116
|
if TasteTester::Config.testing_until
|
111
|
-
TasteTester::Config.testing_until
|
117
|
+
TasteTester::Config.testing_until
|
112
118
|
else
|
113
|
-
|
119
|
+
Time.now + TasteTester::Config.testing_time
|
114
120
|
end
|
115
121
|
end
|
116
122
|
end
|
data/lib/taste_tester/hooks.rb
CHANGED
data/lib/taste_tester/host.rb
CHANGED
@@ -98,8 +98,7 @@ module TasteTester
|
|
98
98
|
|
99
99
|
transport << 'logger -t taste-tester Moving server into taste-tester' +
|
100
100
|
" for #{@user}"
|
101
|
-
transport <<
|
102
|
-
" #{TasteTester::Config.timestamp_file}"
|
101
|
+
transport << touchcmd
|
103
102
|
transport << "echo -n '#{@serialized_config}' | base64 --decode" +
|
104
103
|
" > #{TasteTester::Config.chef_config_path}/client-taste-tester.rb"
|
105
104
|
transport << "rm -vf #{TasteTester::Config.chef_config_path}/" +
|
@@ -188,21 +187,31 @@ module TasteTester
|
|
188
187
|
|
189
188
|
def keeptesting
|
190
189
|
logger.warn("Renewing taste-tester on #{@name} until" +
|
191
|
-
" #{TasteTester::Config.testing_end_time}")
|
190
|
+
" #{TasteTester::Config.testing_end_time.strftime('%y%m%d%H%M.%S')}")
|
192
191
|
if TasteTester::Config.use_ssh_tunnels
|
193
192
|
TasteTester::Tunnel.kill(@name)
|
194
193
|
@tunnel = TasteTester::Tunnel.new(@name, @server)
|
195
194
|
@tunnel.run
|
196
195
|
else
|
197
196
|
transport = get_transport
|
198
|
-
transport <<
|
199
|
-
" #{TasteTester::Config.timestamp_file}"
|
197
|
+
transport << touchcmd
|
200
198
|
transport.run!
|
201
199
|
end
|
202
200
|
end
|
203
201
|
|
204
202
|
private
|
205
203
|
|
204
|
+
def touchcmd
|
205
|
+
touch = Base64.encode64(
|
206
|
+
"if [ 'Darwin' = $(uname) ]; then touch -t \"$(date -r " +
|
207
|
+
"#{TasteTester::Config.testing_end_time.to_i} +'%Y%m%d%H%M.%S')\" " +
|
208
|
+
"#{TasteTester::Config.timestamp_file}; else touch --date \"$(date " +
|
209
|
+
"-d @#{TasteTester::Config.testing_end_time.to_i} +'%Y-%m-%d %T')\" " +
|
210
|
+
"#{TasteTester::Config.timestamp_file}; fi",
|
211
|
+
).delete("\n")
|
212
|
+
"echo -n '#{touch}' | base64 --decode | bash"
|
213
|
+
end
|
214
|
+
|
206
215
|
def config
|
207
216
|
scheme = TasteTester::Config.use_ssl ? 'https' : 'http'
|
208
217
|
if TasteTester::Config.use_ssh_tunnels
|
data/lib/taste_tester/server.rb
CHANGED
@@ -21,6 +21,7 @@ require 'timeout'
|
|
21
21
|
require 'between_meals/util'
|
22
22
|
require 'taste_tester/config'
|
23
23
|
require 'taste_tester/state'
|
24
|
+
require 'taste_tester/windows'
|
24
25
|
|
25
26
|
module TasteTester
|
26
27
|
# Stateless chef-zero server management
|
@@ -152,19 +153,31 @@ module TasteTester
|
|
152
153
|
:logging => TasteTester::Config.chef_zero_logging,
|
153
154
|
})
|
154
155
|
logger.info("Starting chef-zero of port #{@state.port}")
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
156
|
+
if windows?
|
157
|
+
extend ::TasteTester::Windows
|
158
|
+
start_win_chef_zero_server
|
159
|
+
else
|
160
|
+
cmd = "#{chef_zero_path} --host #{@addr} --port #{@state.port} -d"
|
161
|
+
if TasteTester::Config.chef_zero_logging
|
162
|
+
cmd << " --log-file #{@log_file}" +
|
163
|
+
' --log-level debug'
|
164
|
+
end
|
165
|
+
cmd << ' --ssl' if TasteTester::Config.use_ssl
|
166
|
+
Mixlib::ShellOut.new(cmd).run_command.error!
|
167
|
+
end
|
160
168
|
end
|
161
169
|
|
162
170
|
def stop_chef_zero
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
171
|
+
if windows?
|
172
|
+
extend ::TasteTester::Windows
|
173
|
+
nuke_all_cz_pids
|
174
|
+
else
|
175
|
+
logger.info('Killing your chef-zero instances')
|
176
|
+
s = Mixlib::ShellOut.new("pkill -9 -u #{ENV['USER']} -f bin/chef-zero")
|
177
|
+
s.run_command
|
178
|
+
# You have to give it a moment to stop or the stat fails
|
179
|
+
sleep(1)
|
180
|
+
end
|
168
181
|
end
|
169
182
|
|
170
183
|
def chef_zero_path
|
@@ -172,14 +185,16 @@ module TasteTester
|
|
172
185
|
return TasteTester::Config.chef_zero_path
|
173
186
|
end
|
174
187
|
|
175
|
-
[
|
176
|
-
|
177
|
-
|
178
|
-
].each do |path|
|
179
|
-
return path if File.exist?(path)
|
188
|
+
ENV['PATH'].split(':').each do |path|
|
189
|
+
zero = "#{path}/chef-zero"
|
190
|
+
return zero if File.exist?(zero)
|
180
191
|
end
|
181
192
|
logger.error('chef-zero not found')
|
182
193
|
exit(1)
|
183
194
|
end
|
195
|
+
|
196
|
+
def windows?
|
197
|
+
Gem.win_platform?
|
198
|
+
end
|
184
199
|
end
|
185
200
|
end
|
data/lib/taste_tester/state.rb
CHANGED
@@ -92,6 +92,14 @@ module TasteTester
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def wipe
|
95
|
+
# Save port between restarts. It might not be free when we restart, but
|
96
|
+
# at least we'll try to keep the same
|
97
|
+
port = self.port
|
98
|
+
real_wipe
|
99
|
+
write(:port, port)
|
100
|
+
end
|
101
|
+
|
102
|
+
def real_wipe
|
95
103
|
if TasteTester::Config.ref_file &&
|
96
104
|
File.exists?(TasteTester::Config.ref_file)
|
97
105
|
File.delete(TasteTester::Config.ref_file)
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
|
2
|
+
|
3
|
+
# Copyright 2013-present Facebook
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module TasteTester
|
18
|
+
module Windows
|
19
|
+
# We use START to spawn a subprocess of chef-zero since if you were to do
|
20
|
+
# this directly within a terminal session it will collide with the running
|
21
|
+
# chef-zero process when the user tries to input commands leading to many
|
22
|
+
# keystrokes being lost :(
|
23
|
+
def start_win_chef_zero_server
|
24
|
+
# `START` needs quotes around one of the arguments to function correctly.
|
25
|
+
# rubocop:disable Lint/PercentStringArray
|
26
|
+
cmd = %W{
|
27
|
+
START "taste-tester"
|
28
|
+
/MIN
|
29
|
+
#{TasteTester::Config.chef_zero_path}
|
30
|
+
--port #{@state.port}
|
31
|
+
}.join(' ')
|
32
|
+
# rubocop:enable Lint/PercentStringArray
|
33
|
+
|
34
|
+
if TasteTester::Config.my_hostname
|
35
|
+
cmd << " --host #{TasteTester::Config.my_hostname}"
|
36
|
+
else
|
37
|
+
cmd << " --host #{@addr}"
|
38
|
+
end
|
39
|
+
if TasteTester::Config.chef_zero_logging
|
40
|
+
cmd << " --log-file #{@log_file} --log-level debug"
|
41
|
+
end
|
42
|
+
cmd << ' --ssl' if TasteTester::Config.use_ssl
|
43
|
+
|
44
|
+
# Mixlib::Shellout will always wait for a process to finish before
|
45
|
+
# returning, so we use `spawn` instead.
|
46
|
+
spawn(cmd)
|
47
|
+
sleep(2)
|
48
|
+
end
|
49
|
+
|
50
|
+
# `START` will also create a parent process for `cmd.exe` when `ruby.exe` is
|
51
|
+
# created, so we also need to make sure that we find those and kill them
|
52
|
+
# after the ruby process is terminated. Otherwise many orphaned `cmd.exe`
|
53
|
+
# windows could be left open in the aftermath.
|
54
|
+
def find_cz_pids
|
55
|
+
require 'wmi-lite'
|
56
|
+
wmi = WmiLite::Wmi.new
|
57
|
+
cz_process_query = %{
|
58
|
+
SELECT
|
59
|
+
ProcessID,
|
60
|
+
ParentProcessID
|
61
|
+
FROM
|
62
|
+
Win32_Process
|
63
|
+
WHERE
|
64
|
+
CommandLine LIKE "%chef-zero%"
|
65
|
+
AND
|
66
|
+
Name = "ruby.exe"
|
67
|
+
}
|
68
|
+
wmi.query(cz_process_query).map do |process|
|
69
|
+
[process['processid'], process['parentprocessid']]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# It is possible to have multiple chef-zero processes running which may
|
74
|
+
# mess up taste-tester's state. So... nuke 'em all.
|
75
|
+
def nuke_all_cz_pids
|
76
|
+
find_cz_pids.each do |pid, parentpid|
|
77
|
+
::Mixlib::ShellOut.new("taskkill /F /PID #{pid}").run_command
|
78
|
+
::Mixlib::ShellOut.new("taskkill /F /PID #{parentpid}").run_command
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
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.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Dibowitz
|
@@ -9,90 +9,90 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: between_meals
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 0.0.6
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 0.0.6
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: mixlib-config
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '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
41
|
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: colorize
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rubocop
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: chef-zero
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- -
|
81
|
+
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: knife-solo
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- -
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '0'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- -
|
95
|
+
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
98
|
description: Utility for testing Chef changes using chef-zero
|
@@ -104,21 +104,22 @@ extra_rdoc_files:
|
|
104
104
|
- README.md
|
105
105
|
- LICENSE
|
106
106
|
files:
|
107
|
-
- README.md
|
108
107
|
- LICENSE
|
109
|
-
-
|
110
|
-
-
|
111
|
-
- lib/taste_tester/
|
108
|
+
- README.md
|
109
|
+
- bin/taste-tester
|
110
|
+
- lib/taste_tester/client.rb
|
112
111
|
- lib/taste_tester/commands.rb
|
113
|
-
- lib/taste_tester/host.rb
|
114
112
|
- lib/taste_tester/config.rb
|
115
|
-
- lib/taste_tester/locallink.rb
|
116
|
-
- lib/taste_tester/client.rb
|
117
|
-
- lib/taste_tester/hooks.rb
|
118
113
|
- lib/taste_tester/exceptions.rb
|
119
|
-
- lib/taste_tester/
|
114
|
+
- lib/taste_tester/hooks.rb
|
115
|
+
- lib/taste_tester/host.rb
|
116
|
+
- lib/taste_tester/locallink.rb
|
117
|
+
- lib/taste_tester/logging.rb
|
118
|
+
- lib/taste_tester/server.rb
|
120
119
|
- lib/taste_tester/ssh.rb
|
121
|
-
-
|
120
|
+
- lib/taste_tester/state.rb
|
121
|
+
- lib/taste_tester/tunnel.rb
|
122
|
+
- lib/taste_tester/windows.rb
|
122
123
|
- scripts/taste-untester
|
123
124
|
homepage: https://github.com/facebook/taste-tester
|
124
125
|
licenses:
|
@@ -130,17 +131,17 @@ require_paths:
|
|
130
131
|
- lib
|
131
132
|
required_ruby_version: !ruby/object:Gem::Requirement
|
132
133
|
requirements:
|
133
|
-
- -
|
134
|
+
- - ">="
|
134
135
|
- !ruby/object:Gem::Version
|
135
136
|
version: '0'
|
136
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
138
|
requirements:
|
138
|
-
- -
|
139
|
+
- - ">="
|
139
140
|
- !ruby/object:Gem::Version
|
140
141
|
version: '0'
|
141
142
|
requirements: []
|
142
143
|
rubyforge_project:
|
143
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.5.1
|
144
145
|
signing_key:
|
145
146
|
specification_version: 4
|
146
147
|
summary: Taste Tester
|