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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e725a9ee1acb9deed55ffbe08277f781058ddf3f
4
- data.tar.gz: 6f2025f7cebc82628987b9c5210814f42faaf6fe
3
+ metadata.gz: b43e9bbdc0fa2bccc9c0bca3f4c749d6c0b4f356
4
+ data.tar.gz: 941177bd83e37b1830ca0f24add48768261541e9
5
5
  SHA512:
6
- metadata.gz: a7230c46a3dcaefef98fe5c4cd27baba4892d2cc58551ef545c954871b73c4c61d1c808579842eb3bc11ab5f3dbd540f180012637a26b6702b4b96a83ce5ce36
7
- data.tar.gz: ad0932f6ece6d46580b2781de4a01f1aa85b79fe128a86ea8729200734a6fd037d82a7abe8e2804308483864338c6daea03aec6c9e763934b68e10af3d7f864f
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
@@ -95,8 +95,14 @@ module TasteTester
95
95
  end
96
96
 
97
97
  def self.chef_port
98
- range = chef_port_range.first.to_i..chef_port_range.last.to_i
99
- range.to_a.shuffle.each do |port|
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.strftime('%y%m%d%H%M.%S')
117
+ TasteTester::Config.testing_until
112
118
  else
113
- (Time.now + TasteTester::Config.testing_time).strftime('%y%m%d%H%M.%S')
119
+ Time.now + TasteTester::Config.testing_time
114
120
  end
115
121
  end
116
122
  end
@@ -62,7 +62,7 @@ module TasteTester
62
62
  logger.error('Plugin file not found')
63
63
  exit(1)
64
64
  end
65
- class_eval(File.read(path), __FILE__, __LINE__)
65
+ class_eval(File.read(path), path, 1)
66
66
  end
67
67
  end
68
68
  end
@@ -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 << "touch -t #{TasteTester::Config.testing_end_time}" +
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 << "touch -t #{TasteTester::Config.testing_end_time}" +
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
@@ -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
- cmd = "#{chef_zero_path} --host #{@addr} --port #{@state.port} -d"
156
- cmd << " --log-file #{@log_file}" +
157
- ' --log-level debug' if TasteTester::Config.chef_zero_logging
158
- cmd << ' --ssl' if TasteTester::Config.use_ssl
159
- Mixlib::ShellOut.new(cmd).run_command.error!
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
- logger.info('Killing your chef-zero instances')
164
- s = Mixlib::ShellOut.new("pkill -9 -u #{ENV['USER']} -f bin/chef-zero")
165
- s.run_command
166
- # You have to give it a moment to stop or the stat fails
167
- sleep(1)
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
- '/opt/chef/bin/chef-zero',
177
- '/opt/chef/embedded/bin/chef-zero',
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
@@ -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.11
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-09-26 00:00:00.000000000 Z
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
- - lib/taste_tester/logging.rb
110
- - lib/taste_tester/server.rb
111
- - lib/taste_tester/tunnel.rb
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/state.rb
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
- - bin/taste-tester
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.0.14
144
+ rubygems_version: 2.5.1
144
145
  signing_key:
145
146
  specification_version: 4
146
147
  summary: Taste Tester