taste_tester 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
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