taste_tester 0.0.10 → 0.0.11
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/bin/taste-tester +42 -25
- data/lib/taste_tester/client.rb +2 -1
- data/lib/taste_tester/commands.rb +14 -10
- data/lib/taste_tester/config.rb +5 -2
- data/lib/taste_tester/exceptions.rb +24 -0
- data/lib/taste_tester/host.rb +58 -39
- data/lib/taste_tester/locallink.rb +65 -0
- data/lib/taste_tester/server.rb +3 -2
- data/lib/taste_tester/ssh.rb +5 -3
- data/lib/taste_tester/state.rb +9 -9
- data/lib/taste_tester/tunnel.rb +1 -1
- metadata +102 -120
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e725a9ee1acb9deed55ffbe08277f781058ddf3f
|
4
|
+
data.tar.gz: 6f2025f7cebc82628987b9c5210814f42faaf6fe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a7230c46a3dcaefef98fe5c4cd27baba4892d2cc58551ef545c954871b73c4c61d1c808579842eb3bc11ab5f3dbd540f180012637a26b6702b4b96a83ce5ce36
|
7
|
+
data.tar.gz: ad0932f6ece6d46580b2781de4a01f1aa85b79fe128a86ea8729200734a6fd037d82a7abe8e2804308483864338c6daea03aec6c9e763934b68e10af3d7f864f
|
data/bin/taste-tester
CHANGED
@@ -28,6 +28,7 @@ require 'taste_tester/logging'
|
|
28
28
|
require 'taste_tester/config'
|
29
29
|
require 'taste_tester/commands'
|
30
30
|
require 'taste_tester/hooks'
|
31
|
+
require 'taste_tester/exceptions'
|
31
32
|
|
32
33
|
include TasteTester::Logging
|
33
34
|
|
@@ -44,7 +45,7 @@ module TasteTester
|
|
44
45
|
# that if people override chef_client_command the help message is correct.
|
45
46
|
if File.exists?(File.expand_path(TasteTester::Config.config_file))
|
46
47
|
TasteTester::Config.from_file(
|
47
|
-
File.expand_path(TasteTester::Config.config_file)
|
48
|
+
File.expand_path(TasteTester::Config.config_file),
|
48
49
|
)
|
49
50
|
end
|
50
51
|
|
@@ -114,7 +115,7 @@ MODES:
|
|
114
115
|
should be no need to do this manually.
|
115
116
|
EOF
|
116
117
|
|
117
|
-
mode = ARGV.shift unless ARGV.
|
118
|
+
mode = ARGV.shift unless !ARGV.empty? && ARGV[0].start_with?('-')
|
118
119
|
|
119
120
|
unless mode
|
120
121
|
mode = 'help'
|
@@ -205,12 +206,24 @@ MODES:
|
|
205
206
|
options[:user_tunnel_port] = port
|
206
207
|
end
|
207
208
|
|
209
|
+
opts.on(
|
210
|
+
'-m', '--my-hostname HOSTNAME', String, 'Hostname for local chef server'
|
211
|
+
) do |hostname|
|
212
|
+
options[:my_hostname] = hostname
|
213
|
+
end
|
214
|
+
|
208
215
|
opts.on(
|
209
216
|
'-l', '--linkonly', 'Only setup the remote server, skip uploading.'
|
210
217
|
) do
|
211
218
|
options[:linkonly] = true
|
212
219
|
end
|
213
220
|
|
221
|
+
opts.on(
|
222
|
+
'-L', '--locallink', 'Configure the local chef client without ssh.'
|
223
|
+
) do
|
224
|
+
options[:locallink] = true
|
225
|
+
end
|
226
|
+
|
214
227
|
opts.on(
|
215
228
|
'-t', '--testing-timestamp TIME',
|
216
229
|
'Until when should the host remain in testing.' +
|
@@ -254,7 +267,7 @@ MODES:
|
|
254
267
|
|
255
268
|
opts.on(
|
256
269
|
'--repo-type TYPE',
|
257
|
-
'Override repo type, default is auto.'
|
270
|
+
'Override repo type, default is auto.',
|
258
271
|
) do |type|
|
259
272
|
options[:repo_type] = type
|
260
273
|
end
|
@@ -362,28 +375,32 @@ MODES:
|
|
362
375
|
TasteTester::Hooks.get(path)
|
363
376
|
end
|
364
377
|
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
378
|
+
begin
|
379
|
+
case mode.to_sym
|
380
|
+
when :start
|
381
|
+
TasteTester::Commands.start
|
382
|
+
when :stop
|
383
|
+
TasteTester::Commands.stop
|
384
|
+
when :restart
|
385
|
+
TasteTester::Commands.restart
|
386
|
+
when :keeptesting
|
387
|
+
TasteTester::Commands.keeptesting
|
388
|
+
when :status
|
389
|
+
TasteTester::Commands.status
|
390
|
+
when :test
|
391
|
+
TasteTester::Commands.test
|
392
|
+
when :untest
|
393
|
+
TasteTester::Commands.untest
|
394
|
+
when :run
|
395
|
+
TasteTester::Commands.runchef
|
396
|
+
when :upload
|
397
|
+
TasteTester::Commands.upload
|
398
|
+
else
|
399
|
+
logger.error("Invalid mode: #{mode}")
|
400
|
+
puts parser
|
401
|
+
exit(1)
|
402
|
+
end
|
403
|
+
rescue TasteTester::Exceptions::SshError
|
387
404
|
exit(1)
|
388
405
|
end
|
389
406
|
end
|
data/lib/taste_tester/client.rb
CHANGED
@@ -43,6 +43,7 @@ module TasteTester
|
|
43
43
|
:cookbook_dirs => TasteTester::Config.cookbooks,
|
44
44
|
:databag_dir => TasteTester::Config.databags,
|
45
45
|
:checksum_dir => TasteTester::Config.checksum_dir,
|
46
|
+
:role_type => TasteTester::Config.role_type,
|
46
47
|
)
|
47
48
|
@knife.write_user_config
|
48
49
|
@repo = BetweenMeals::Repo.get(
|
@@ -51,7 +52,7 @@ module TasteTester
|
|
51
52
|
logger,
|
52
53
|
)
|
53
54
|
unless @repo.exists?
|
54
|
-
|
55
|
+
raise "Could not open repo from #{TasteTester::Config.repo}"
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -77,15 +77,18 @@ module TasteTester
|
|
77
77
|
upload
|
78
78
|
end
|
79
79
|
server = TasteTester::Server.new
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
80
|
+
unless TasteTester::Config.linkonly
|
81
|
+
repo = BetweenMeals::Repo.get(
|
82
|
+
TasteTester::Config.repo_type,
|
83
|
+
TasteTester::Config.repo,
|
84
|
+
logger,
|
85
|
+
)
|
86
|
+
unless repo.exists?
|
87
|
+
raise "Could not open repo from #{TasteTester::Config.repo}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
unless TasteTester::Config.skip_pre_test_hook ||
|
91
|
+
TasteTester::Config.linkonly
|
89
92
|
TasteTester::Hooks.pre_test(TasteTester::Config.dryrun, repo, hosts)
|
90
93
|
end
|
91
94
|
tested_hosts = []
|
@@ -99,7 +102,8 @@ module TasteTester
|
|
99
102
|
tested_hosts << hostname
|
100
103
|
end
|
101
104
|
end
|
102
|
-
unless TasteTester::Config.skip_post_test_hook
|
105
|
+
unless TasteTester::Config.skip_post_test_hook ||
|
106
|
+
TasteTester::Config.linkonly
|
103
107
|
TasteTester::Hooks.post_test(TasteTester::Config.dryrun, repo,
|
104
108
|
tested_hosts)
|
105
109
|
end
|
data/lib/taste_tester/config.rb
CHANGED
@@ -33,6 +33,7 @@ module TasteTester
|
|
33
33
|
cookbook_dirs ['cookbooks']
|
34
34
|
role_dir 'roles'
|
35
35
|
databag_dir 'databags'
|
36
|
+
role_type 'rb'
|
36
37
|
config_file '/etc/taste-tester-config.rb'
|
37
38
|
plugin_path nil
|
38
39
|
chef_zero_path nil
|
@@ -52,6 +53,8 @@ module TasteTester
|
|
52
53
|
use_ssl true
|
53
54
|
chef_zero_logging true
|
54
55
|
chef_config_path '/etc/chef'
|
56
|
+
chef_config 'client.rb'
|
57
|
+
my_hostname nil
|
55
58
|
|
56
59
|
skip_pre_upload_hook false
|
57
60
|
skip_post_upload_hook false
|
@@ -67,7 +70,7 @@ module TasteTester
|
|
67
70
|
|
68
71
|
def self.relative_cookbook_dirs
|
69
72
|
cookbook_dirs.map do |x|
|
70
|
-
|
73
|
+
base_dir && !base_dir.empty? ? File.join(base_dir, x) : x
|
71
74
|
end
|
72
75
|
end
|
73
76
|
|
@@ -76,7 +79,7 @@ module TasteTester
|
|
76
79
|
end
|
77
80
|
|
78
81
|
def self.relative_role_dir
|
79
|
-
|
82
|
+
base_dir && !base_dir.empty? ? File.join(base_dir, role_dir) : role_dir
|
80
83
|
end
|
81
84
|
|
82
85
|
def self.databags
|
@@ -0,0 +1,24 @@
|
|
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 Exceptions
|
19
|
+
class SshError < StandardError
|
20
|
+
end
|
21
|
+
class LocalLinkError < StandardError
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/taste_tester/host.rb
CHANGED
@@ -20,6 +20,7 @@ require 'open3'
|
|
20
20
|
require 'colorize'
|
21
21
|
|
22
22
|
require 'taste_tester/ssh'
|
23
|
+
require 'taste_tester/locallink'
|
23
24
|
require 'taste_tester/tunnel'
|
24
25
|
|
25
26
|
module TasteTester
|
@@ -44,13 +45,13 @@ module TasteTester
|
|
44
45
|
cmd = "#{TasteTester::Config.ssh_command} " +
|
45
46
|
"#{TasteTester::Config.user}@#{@name} "
|
46
47
|
if TasteTester::Config.user != 'root'
|
47
|
-
cc = Base64.encode64(cmds).
|
48
|
+
cc = Base64.encode64(cmds).delete("\n")
|
48
49
|
cmd += "\"echo '#{cc}' | base64 --decode | sudo bash -x\""
|
49
50
|
else
|
50
51
|
cmd += "\"#{cmds}\""
|
51
52
|
end
|
52
53
|
status = IO.popen(
|
53
|
-
cmd
|
54
|
+
cmd,
|
54
55
|
) do |io|
|
55
56
|
# rubocop:disable AssignmentInCondition
|
56
57
|
while line = io.gets
|
@@ -62,7 +63,7 @@ module TasteTester
|
|
62
63
|
end
|
63
64
|
logger.warn("Finished #{TasteTester::Config.chef_client_command}" +
|
64
65
|
" on #{@name} with status #{status}")
|
65
|
-
if status
|
66
|
+
if status.zero?
|
66
67
|
msg = "#{TasteTester::Config.chef_client_command} was successful" +
|
67
68
|
' - please log to the host and confirm all the intended' +
|
68
69
|
' changes were made'
|
@@ -70,6 +71,15 @@ module TasteTester
|
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
74
|
+
def get_transport
|
75
|
+
if TasteTester::Config.locallink
|
76
|
+
transport = TasteTester::LocalLink.new
|
77
|
+
else
|
78
|
+
transport = TasteTester::SSH.new(@name)
|
79
|
+
end
|
80
|
+
transport
|
81
|
+
end
|
82
|
+
|
73
83
|
def test
|
74
84
|
logger.warn("Taste-testing on #{@name}")
|
75
85
|
|
@@ -81,63 +91,69 @@ module TasteTester
|
|
81
91
|
@tunnel.run
|
82
92
|
end
|
83
93
|
|
84
|
-
@serialized_config = Base64.encode64(config).
|
94
|
+
@serialized_config = Base64.encode64(config).delete("\n")
|
85
95
|
|
86
96
|
# Then setup the testing
|
87
|
-
|
88
|
-
|
97
|
+
transport = get_transport
|
98
|
+
|
99
|
+
transport << 'logger -t taste-tester Moving server into taste-tester' +
|
89
100
|
" for #{@user}"
|
90
|
-
|
101
|
+
transport << "touch -t #{TasteTester::Config.testing_end_time}" +
|
91
102
|
" #{TasteTester::Config.timestamp_file}"
|
92
|
-
|
103
|
+
transport << "echo -n '#{@serialized_config}' | base64 --decode" +
|
93
104
|
" > #{TasteTester::Config.chef_config_path}/client-taste-tester.rb"
|
94
|
-
|
95
|
-
|
105
|
+
transport << "rm -vf #{TasteTester::Config.chef_config_path}/" +
|
106
|
+
TasteTester::Config.chef_config
|
107
|
+
transport << "( ln -vs #{TasteTester::Config.chef_config_path}" +
|
96
108
|
"/client-taste-tester.rb #{TasteTester::Config.chef_config_path}/" +
|
97
|
-
|
98
|
-
|
109
|
+
"#{TasteTester::Config.chef_config}; true )"
|
110
|
+
transport.run!
|
99
111
|
|
100
112
|
# Then run any other stuff they wanted
|
101
113
|
cmds = TasteTester::Hooks.test_remote_cmds(
|
102
114
|
TasteTester::Config.dryrun,
|
103
|
-
@name
|
115
|
+
@name,
|
104
116
|
)
|
105
117
|
|
106
118
|
if cmds && cmds.any?
|
107
|
-
|
108
|
-
cmds.each { |c|
|
109
|
-
|
119
|
+
transport = get_transport
|
120
|
+
cmds.each { |c| transport << c }
|
121
|
+
transport.run!
|
110
122
|
end
|
111
123
|
end
|
112
124
|
|
113
125
|
def untest
|
114
126
|
logger.warn("Removing #{@name} from taste-tester")
|
115
|
-
|
127
|
+
transport = get_transport
|
116
128
|
if TasteTester::Config.use_ssh_tunnels
|
117
129
|
TasteTester::Tunnel.kill(@name)
|
118
130
|
end
|
131
|
+
config_prod = TasteTester::Config.chef_config.split('.').join('-prod.')
|
119
132
|
[
|
120
|
-
"rm -vf #{TasteTester::Config.chef_config_path}/
|
133
|
+
"rm -vf #{TasteTester::Config.chef_config_path}/" +
|
134
|
+
TasteTester::Config.chef_config,
|
121
135
|
"rm -vf #{TasteTester::Config.chef_config_path}/client-taste-tester.rb",
|
122
|
-
"ln -vs #{TasteTester::Config.chef_config_path}
|
123
|
-
"#{TasteTester::Config.chef_config_path}/
|
136
|
+
"ln -vs #{TasteTester::Config.chef_config_path}/#{config_prod} " +
|
137
|
+
"#{TasteTester::Config.chef_config_path}/" +
|
138
|
+
TasteTester::Config.chef_config,
|
124
139
|
"rm -vf #{TasteTester::Config.chef_config_path}/client.pem",
|
125
140
|
"ln -vs #{TasteTester::Config.chef_config_path}/client-prod.pem " +
|
126
141
|
"#{TasteTester::Config.chef_config_path}/client.pem",
|
127
142
|
"rm -vf #{TasteTester::Config.timestamp_file}",
|
128
143
|
'logger -t taste-tester Returning server to production',
|
129
144
|
].each do |cmd|
|
130
|
-
|
145
|
+
transport << cmd
|
131
146
|
end
|
132
|
-
|
147
|
+
transport.run!
|
133
148
|
end
|
134
149
|
|
135
150
|
def who_is_testing
|
136
|
-
|
137
|
-
|
138
|
-
" #{TasteTester::Config.chef_config_path}/
|
139
|
-
|
140
|
-
|
151
|
+
transport = get_transport
|
152
|
+
transport << 'grep "^# TasteTester by"' +
|
153
|
+
" #{TasteTester::Config.chef_config_path}/" +
|
154
|
+
TasteTester::Config.chef_config
|
155
|
+
output = transport.run
|
156
|
+
if output.first.zero?
|
141
157
|
user = output.last.match(/# TasteTester by (.*)$/)
|
142
158
|
if user
|
143
159
|
return user[1]
|
@@ -145,10 +161,11 @@ module TasteTester
|
|
145
161
|
end
|
146
162
|
|
147
163
|
# Legacy FB stuff, remove after migration. Safe for everyone else.
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
164
|
+
transport = get_transport
|
165
|
+
transport << "file #{TasteTester::Config.chef_config_path}/" +
|
166
|
+
TasteTester::Config.chef_config
|
167
|
+
output = transport.run
|
168
|
+
if output.first.zero?
|
152
169
|
user = output.last.match(/client-(.*)-(taste-tester|test).rb/)
|
153
170
|
if user
|
154
171
|
return user[1]
|
@@ -159,9 +176,10 @@ module TasteTester
|
|
159
176
|
end
|
160
177
|
|
161
178
|
def in_test?
|
162
|
-
|
163
|
-
|
164
|
-
if
|
179
|
+
transport = get_transport
|
180
|
+
transport << "test -f #{TasteTester::Config.timestamp_file}"
|
181
|
+
if transport.run.first.zero? && who_is_testing &&
|
182
|
+
who_is_testing != ENV['USER']
|
165
183
|
true
|
166
184
|
else
|
167
185
|
false
|
@@ -176,10 +194,10 @@ module TasteTester
|
|
176
194
|
@tunnel = TasteTester::Tunnel.new(@name, @server)
|
177
195
|
@tunnel.run
|
178
196
|
else
|
179
|
-
|
180
|
-
|
197
|
+
transport = get_transport
|
198
|
+
transport << "touch -t #{TasteTester::Config.testing_end_time}" +
|
181
199
|
" #{TasteTester::Config.timestamp_file}"
|
182
|
-
|
200
|
+
transport.run!
|
183
201
|
end
|
184
202
|
end
|
185
203
|
|
@@ -190,7 +208,8 @@ module TasteTester
|
|
190
208
|
if TasteTester::Config.use_ssh_tunnels
|
191
209
|
url = "#{scheme}://localhost:#{@tunnel.port}"
|
192
210
|
else
|
193
|
-
url = "#{scheme}://#{@server.host}
|
211
|
+
url = "#{scheme}://#{@server.host}"
|
212
|
+
url << ":#{TasteTester::State.port}" if TasteTester::State.port
|
194
213
|
end
|
195
214
|
# rubocop:disable Metrics/LineLength
|
196
215
|
ttconfig = <<-eos
|
@@ -205,7 +224,7 @@ log_level :info
|
|
205
224
|
log_location STDOUT
|
206
225
|
chef_server_url '#{url}'
|
207
226
|
ssl_verify_mode :verify_none
|
208
|
-
|
227
|
+
ohai.plugin_path << '#{TasteTester::Config.chef_config_path}/ohai_plugins'
|
209
228
|
|
210
229
|
eos
|
211
230
|
# rubocop:enable Metrics/LineLength
|
@@ -0,0 +1,65 @@
|
|
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
|
+
require 'taste_tester/exceptions'
|
18
|
+
|
19
|
+
module TasteTester
|
20
|
+
# Wrapper for running commands on local system
|
21
|
+
class LocalLink
|
22
|
+
include TasteTester::Logging
|
23
|
+
include BetweenMeals::Util
|
24
|
+
|
25
|
+
attr_reader :output
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
@host = 'localhost'
|
29
|
+
@cmds = []
|
30
|
+
end
|
31
|
+
|
32
|
+
def add(string)
|
33
|
+
@cmds << string
|
34
|
+
end
|
35
|
+
|
36
|
+
alias << add
|
37
|
+
|
38
|
+
def run
|
39
|
+
@status, @output = exec(cmd, logger)
|
40
|
+
end
|
41
|
+
|
42
|
+
def run!
|
43
|
+
@status, @output = exec!(cmd, logger)
|
44
|
+
rescue => e
|
45
|
+
logger.error(e.message)
|
46
|
+
raise TasteTester::Exceptions::LocalLinkError
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def cmd
|
52
|
+
@cmds.each do |cmd|
|
53
|
+
logger.info("Will run: '#{cmd}' on #{@host}")
|
54
|
+
end
|
55
|
+
cmds = @cmds.join(' && ')
|
56
|
+
if TasteTester::Config.user != 'root'
|
57
|
+
cc = Base64.encode64(cmds).delete("\n")
|
58
|
+
cmd = "echo '#{cc}' | base64 --decode | sudo bash -x"
|
59
|
+
else
|
60
|
+
cmd = cmds.to_s
|
61
|
+
end
|
62
|
+
cmd
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/taste_tester/server.rb
CHANGED
@@ -63,7 +63,7 @@ module TasteTester
|
|
63
63
|
else
|
64
64
|
@addr = '::'
|
65
65
|
begin
|
66
|
-
@host = Socket.gethostname
|
66
|
+
@host = TasteTester::Config.my_hostname || Socket.gethostname
|
67
67
|
rescue
|
68
68
|
logger.error('Unable to find fqdn')
|
69
69
|
exit 1
|
@@ -153,7 +153,8 @@ module TasteTester
|
|
153
153
|
})
|
154
154
|
logger.info("Starting chef-zero of port #{@state.port}")
|
155
155
|
cmd = "#{chef_zero_path} --host #{@addr} --port #{@state.port} -d"
|
156
|
-
cmd << " --log-file #{@log_file}"
|
156
|
+
cmd << " --log-file #{@log_file}" +
|
157
|
+
' --log-level debug' if TasteTester::Config.chef_zero_logging
|
157
158
|
cmd << ' --ssl' if TasteTester::Config.use_ssl
|
158
159
|
Mixlib::ShellOut.new(cmd).run_command.error!
|
159
160
|
end
|
data/lib/taste_tester/ssh.rb
CHANGED
@@ -14,6 +14,8 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
+
require 'taste_tester/exceptions'
|
18
|
+
|
17
19
|
module TasteTester
|
18
20
|
# Thin ssh wrapper
|
19
21
|
class SSH
|
@@ -33,7 +35,7 @@ module TasteTester
|
|
33
35
|
@cmds << string
|
34
36
|
end
|
35
37
|
|
36
|
-
|
38
|
+
alias << add
|
37
39
|
|
38
40
|
def run
|
39
41
|
@status, @output = exec(cmd, logger)
|
@@ -53,7 +55,7 @@ MSG
|
|
53
55
|
# rubocop:enable LineLength
|
54
56
|
error.lines.each { |x| logger.error x.strip }
|
55
57
|
logger.error(e.message)
|
56
|
-
|
58
|
+
raise TasteTester::Exceptions::SshError
|
57
59
|
end
|
58
60
|
|
59
61
|
private
|
@@ -67,7 +69,7 @@ MSG
|
|
67
69
|
"-T -o BatchMode=yes -o ConnectTimeout=#{@timeout} " +
|
68
70
|
"#{TasteTester::Config.user}@#{@host} "
|
69
71
|
if TasteTester::Config.user != 'root'
|
70
|
-
cc = Base64.encode64(cmds).
|
72
|
+
cc = Base64.encode64(cmds).delete("\n")
|
71
73
|
cmd += "\"echo '#{cc}' | base64 --decode | sudo bash -x\""
|
72
74
|
else
|
73
75
|
cmd += "\'#{cmds}\'"
|
data/lib/taste_tester/state.rb
CHANGED
@@ -30,7 +30,7 @@ module TasteTester
|
|
30
30
|
|
31
31
|
def initialize
|
32
32
|
ref_dir = File.dirname(File.expand_path(
|
33
|
-
TasteTester::Config.ref_file
|
33
|
+
TasteTester::Config.ref_file,
|
34
34
|
))
|
35
35
|
unless File.directory?(ref_dir)
|
36
36
|
begin
|
@@ -98,6 +98,13 @@ module TasteTester
|
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
+
def self.read(key)
|
102
|
+
JSON.parse(File.read(TasteTester::Config.ref_file))[key.to_s]
|
103
|
+
rescue => e
|
104
|
+
logger.debug(e)
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
|
101
108
|
private
|
102
109
|
|
103
110
|
def write(key, val)
|
@@ -113,7 +120,7 @@ module TasteTester
|
|
113
120
|
state.merge!(vals)
|
114
121
|
ff = File.open(
|
115
122
|
TasteTester::Config.ref_file,
|
116
|
-
'w'
|
123
|
+
'w',
|
117
124
|
)
|
118
125
|
ff.write(state.to_json)
|
119
126
|
ff.close
|
@@ -122,12 +129,5 @@ module TasteTester
|
|
122
129
|
logger.debug(e)
|
123
130
|
exit 0
|
124
131
|
end
|
125
|
-
|
126
|
-
def self.read(key)
|
127
|
-
JSON.parse(File.read(TasteTester::Config.ref_file))[key.to_s]
|
128
|
-
rescue => e
|
129
|
-
logger.debug(e)
|
130
|
-
nil
|
131
|
-
end
|
132
132
|
end
|
133
133
|
end
|
data/lib/taste_tester/tunnel.rb
CHANGED
@@ -65,7 +65,7 @@ module TasteTester
|
|
65
65
|
'-o ServerAliveInterval=10 -o ServerAliveCountMax=6 ' +
|
66
66
|
"-f -R #{@port}:localhost:#{@server.port} "
|
67
67
|
if TasteTester::Config.user != 'root'
|
68
|
-
cc = Base64.encode64(cmds).
|
68
|
+
cc = Base64.encode64(cmds).delete("\n")
|
69
69
|
cmd += "#{TasteTester::Config.user}@#{@host} \"echo '#{cc}' | base64" +
|
70
70
|
' --decode | sudo bash -x"'
|
71
71
|
else
|
metadata
CHANGED
@@ -1,165 +1,147 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: taste_tester
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 10
|
10
|
-
version: 0.0.10
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.11
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Phil Dibowitz
|
14
8
|
- Marcin Sawicki
|
15
9
|
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2016-09-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: between_meals
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 19
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 0
|
33
|
-
- 6
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '>='
|
19
|
+
- !ruby/object:Gem::Version
|
34
20
|
version: 0.0.6
|
35
21
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: mixlib-config
|
39
22
|
prerelease: false
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.0.6
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: mixlib-config
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
49
35
|
type: :runtime
|
50
|
-
version_requirements: *id002
|
51
|
-
- !ruby/object:Gem::Dependency
|
52
|
-
name: colorize
|
53
36
|
prerelease: false
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: colorize
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
63
49
|
type: :runtime
|
64
|
-
version_requirements: *id003
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: rubocop
|
67
50
|
prerelease: false
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rubocop
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
77
63
|
type: :development
|
78
|
-
version_requirements: *id004
|
79
|
-
- !ruby/object:Gem::Dependency
|
80
|
-
name: chef-zero
|
81
64
|
prerelease: false
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: chef-zero
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
91
77
|
type: :development
|
92
|
-
version_requirements: *id005
|
93
|
-
- !ruby/object:Gem::Dependency
|
94
|
-
name: knife-solo
|
95
78
|
prerelease: false
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: knife-solo
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
105
91
|
type: :development
|
106
|
-
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
107
98
|
description: Utility for testing Chef changes using chef-zero
|
108
99
|
email:
|
109
|
-
executables:
|
100
|
+
executables:
|
110
101
|
- taste-tester
|
111
102
|
extensions: []
|
112
|
-
|
113
|
-
extra_rdoc_files:
|
103
|
+
extra_rdoc_files:
|
114
104
|
- README.md
|
115
105
|
- LICENSE
|
116
|
-
files:
|
106
|
+
files:
|
117
107
|
- README.md
|
118
108
|
- LICENSE
|
109
|
+
- lib/taste_tester/logging.rb
|
110
|
+
- lib/taste_tester/server.rb
|
111
|
+
- lib/taste_tester/tunnel.rb
|
112
|
+
- lib/taste_tester/commands.rb
|
119
113
|
- lib/taste_tester/host.rb
|
114
|
+
- lib/taste_tester/config.rb
|
115
|
+
- lib/taste_tester/locallink.rb
|
120
116
|
- lib/taste_tester/client.rb
|
121
117
|
- lib/taste_tester/hooks.rb
|
122
|
-
- lib/taste_tester/
|
118
|
+
- lib/taste_tester/exceptions.rb
|
123
119
|
- lib/taste_tester/state.rb
|
124
120
|
- lib/taste_tester/ssh.rb
|
125
|
-
- lib/taste_tester/server.rb
|
126
|
-
- lib/taste_tester/tunnel.rb
|
127
|
-
- lib/taste_tester/logging.rb
|
128
|
-
- lib/taste_tester/config.rb
|
129
121
|
- bin/taste-tester
|
130
122
|
- scripts/taste-untester
|
131
123
|
homepage: https://github.com/facebook/taste-tester
|
132
|
-
licenses:
|
124
|
+
licenses:
|
133
125
|
- Apache
|
126
|
+
metadata: {}
|
134
127
|
post_install_message:
|
135
128
|
rdoc_options: []
|
136
|
-
|
137
|
-
require_paths:
|
129
|
+
require_paths:
|
138
130
|
- lib
|
139
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
none: false
|
150
|
-
requirements:
|
151
|
-
- - ">="
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
hash: 3
|
154
|
-
segments:
|
155
|
-
- 0
|
156
|
-
version: "0"
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - '>='
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
157
141
|
requirements: []
|
158
|
-
|
159
142
|
rubyforge_project:
|
160
|
-
rubygems_version:
|
143
|
+
rubygems_version: 2.0.14
|
161
144
|
signing_key:
|
162
|
-
specification_version:
|
145
|
+
specification_version: 4
|
163
146
|
summary: Taste Tester
|
164
147
|
test_files: []
|
165
|
-
|