chef-zero 1.7.3 → 2.0.0

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: 8d38cb11a3fe7092a692d98004814e30cc020125
4
- data.tar.gz: 013c513df87cc911756effd9972f4bc4c7481b21
3
+ metadata.gz: d2731ca89a7a17e4eddfe989bd8dc57c361105ed
4
+ data.tar.gz: f81dabcb437d9e327d547b6723273a7bb1c760c7
5
5
  SHA512:
6
- metadata.gz: fafcc37dcd06536619c82c2789add5bb0ff2616c0a5d06e17d8c3aae3a8285a75d9ad76e5bda6d58b17ddcca31d3d8beb9256a76430f1164db69cdafea028fa0
7
- data.tar.gz: 9fa9d3a2560709fd418e70d25a02aca905b159a3d0491efe3ccb9269eb731c29225cad048421eec302ed20688d364484e969678385e958f5f0ea5c427383f499
6
+ metadata.gz: c87db48733d2add9a6de265fddfc99f028051feaf9c2aaef7b849bdde3f02c9d17966ca88fc3df6fc8d44572262a33392aeccc321ce12fff2da25a6831dbacf0
7
+ data.tar.gz: bbb68d646e14d774987d46d13e3541b20d1f93813d8a0112525569ef22f1e8b00940e057242ce39f7f773e2ae363751da10dd8152f85ce8814b0d18e8139671e
data/bin/chef-zero CHANGED
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # Trap interrupts to quit cleanly.
4
+ Signal.trap('INT') { exit 1 }
5
+
3
6
  require 'rubygems'
4
7
  $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "lib")))
5
8
 
@@ -20,10 +23,6 @@ OptionParser.new do |opts|
20
23
  options[:port] = value
21
24
  end
22
25
 
23
- opts.on("--socket PATH", String, "Unix socket path to listen on") do |value|
24
- options[:socket] = value
25
- end
26
-
27
26
  opts.on("--[no-]generate-keys", "Whether to generate actual keys or fake it (faster). Default: false.") do |value|
28
27
  options[:generate_real_keys] = value
29
28
  end
@@ -50,12 +49,12 @@ end.parse!
50
49
  server = ChefZero::Server.new(options)
51
50
 
52
51
  if options[:daemon]
53
- unless Process.respond_to?('daemon')
54
- abort 'Process.deamon requires Ruby >= 1.9'
55
- else
52
+ if Process.respond_to?(:daemon)
56
53
  Process.daemon(true)
57
- server.start(:publish => true)
54
+ server.start(true)
55
+ else
56
+ abort 'Process.daemon requires Ruby >= 1.9'
58
57
  end
59
58
  else
60
- server.start(:publish => true)
59
+ server.start(true)
61
60
  end
@@ -73,8 +73,8 @@ module ChefZero
73
73
  end
74
74
  end
75
75
 
76
- def from_json(json)
77
- self.merge!(JSON.parse(json))
76
+ def from_json(filepath)
77
+ self.merge!(JSON.parse(File.read(filepath)))
78
78
  end
79
79
 
80
80
  private
@@ -17,10 +17,13 @@
17
17
  #
18
18
 
19
19
  require 'openssl'
20
+ require 'open-uri'
20
21
  require 'rubygems'
21
22
  require 'timeout'
22
23
  require 'stringio'
23
- require 'webrick/version'
24
+
25
+ require 'rack'
26
+ require 'webrick'
24
27
 
25
28
  require 'chef_zero'
26
29
  require 'chef_zero/cookbook_data'
@@ -61,138 +64,155 @@ module ChefZero
61
64
  DEFAULT_OPTIONS = {
62
65
  :host => '127.0.0.1',
63
66
  :port => 8889,
64
- :socket => nil,
65
67
  :log_level => :info,
66
68
  :generate_real_keys => true
67
69
  }.freeze
68
70
 
69
71
  def initialize(options = {})
70
- options = DEFAULT_OPTIONS.merge(options)
71
- @options = options
72
- uri_safe_host = options[:host].include?(":") ? "[#{options[:host]}]" : options[:host]
73
- @url = "http://#{uri_safe_host}:#{options[:port]}"
74
- @generate_real_keys = options[:generate_real_keys]
75
-
76
- ChefZero::Log.level = options[:log_level].to_sym
77
-
78
- begin
79
- require 'puma'
80
- @server = Puma::Server.new(make_app, Puma::Events.new(STDERR, STDOUT))
81
- if options[:socket]
82
- @server.add_unix_listener(options[:socket])
83
- else
84
- @server.add_tcp_listener(options[:host], options[:port])
85
- end
86
- @server_type = :puma
87
- rescue LoadError
88
- require 'rack'
89
- @server_type = :webrick
90
- end
72
+ @options = DEFAULT_OPTIONS.merge(options)
73
+ @options[:host] = "[#{@options[:host]}]" if @options[:host].include?(':')
74
+ @options.freeze
91
75
 
92
- @data_store = options[:data_store] || DataStore::MemoryStore.new
76
+ ChefZero::Log.level = @options[:log_level].to_sym
93
77
  end
94
78
 
79
+ # @return [Hash]
95
80
  attr_reader :options
81
+
82
+ # @return [WEBrick::HTTPServer]
96
83
  attr_reader :server
97
- attr_reader :data_store
98
- attr_reader :url
99
84
 
100
85
  include ChefZero::Endpoints
101
86
 
102
- def start(start_options = {})
103
- if start_options[:publish]
104
- puts ">> Starting Chef Zero (v#{ChefZero::VERSION})..."
105
- case @server_type
106
- when :puma
107
- puts ">> Puma (v#{Puma::Const::PUMA_VERSION}) is listening at #{url}"
108
- when :webrick
109
- puts ">> WEBrick (v#{WEBrick::VERSION}) on Rack (v#{Rack.release}) is listening at #{url}"
110
- end
111
- puts ">> Press CTRL+C to stop"
87
+ #
88
+ # The URL for this Chef Zero server.
89
+ #
90
+ # @return [String]
91
+ #
92
+ def url
93
+ "http://#{@options[:host]}:#{@options[:port]}"
94
+ end
95
+
96
+ #
97
+ # The data store for this server (default is in-memory).
98
+ #
99
+ # @return [~ChefZero::DataStore]
100
+ #
101
+ def data_store
102
+ @data_store ||= @options[:data_store] || DataStore::MemoryStore.new
103
+ end
104
+
105
+ #
106
+ # Boolean method to determine if real Public/Private keys should be
107
+ # generated.
108
+ #
109
+ # @return [Boolean]
110
+ # true if real keys should be created, false otherwise
111
+ #
112
+ def generate_real_keys?
113
+ !!@options[:generate_real_keys]
114
+ end
115
+
116
+ #
117
+ # Start a Chef Zero server in the current thread. You can stop this server
118
+ # by canceling the current thread.
119
+ #
120
+ # @param [Boolean] publish
121
+ # publish the server information to STDOUT
122
+ #
123
+ # @return [nil]
124
+ # this method will block the main thread until interrupted
125
+ #
126
+ def start(publish = true)
127
+ publish = publish[:publish] if publish.is_a?(Hash) # Legacy API
128
+
129
+ if publish
130
+ puts <<-EOH.gsub(/^ {10}/, '')
131
+ >> Starting Chef Zero (v#{ChefZero::VERSION})...
132
+ >> WEBrick (v#{WEBrick::VERSION}) on Rack (v#{Rack.release}) is listening at #{url}
133
+ >> Press CTRL+C to stop
134
+
135
+ EOH
112
136
  end
113
137
 
114
- begin
115
- case @server_type
116
- when :puma
117
- server.run.join
118
- when :webrick
119
- Rack::Handler::WEBrick.run(
120
- make_app,
121
- :BindAddress => @options[:host],
122
- :Port => @options[:port],
123
- :AccessLog => [],
124
- :Logger => WEBrick::Log::new(StringIO.new, 7)
125
- ) do |server|
126
- @server = server
127
- end
128
- end
129
- rescue Object, Interrupt
130
- if running?
131
- puts "\n>> Stopping Chef Zero ..."
132
- case @server_type
133
- when :puma
134
- server.stop(true)
135
- when :webrick
136
- server.shutdown
137
- end
138
- end
139
- ensure
140
- case @server_type
141
- when :webrick
142
- @server = nil
143
- else
138
+ thread = start_background
139
+
140
+ %w[INT TERM].each do |signal|
141
+ Signal.trap(signal) do
142
+ puts "\n>> Stopping Chef Zero..."
143
+ @server.shutdown
144
144
  end
145
145
  end
146
- end
147
146
 
148
- def start_background(wait = 5)
149
- @thread = Thread.new {
150
- begin
151
- start
152
- rescue
153
- @server_error = $!
154
- ChefZero::Log.error("#{$!.message}\n#{$!.backtrace.join("\n")}")
155
- end
156
- }
147
+ # Move the background process to the main thread
148
+ thread.join
149
+ end
157
150
 
158
- # Wait x seconds to make sure the server actually started
159
- Timeout::timeout(wait) {
160
- sleep(0.01) until running? || @server_error
161
- raise @server_error if @server_error
162
- }
163
151
 
164
- # Give the user the thread, just in case they want it
152
+ #
153
+ # Start a Chef Zero server in a forked process. This method returns the PID
154
+ # to the forked process.
155
+ #
156
+ # @param [Fixnum] wait
157
+ # the number of seconds to wait for the server to start
158
+ #
159
+ # @return [Thread]
160
+ # the thread the background process is running in
161
+ #
162
+ def start_background(wait = 5)
163
+ @server = WEBrick::HTTPServer.new(
164
+ :BindAddress => @options[:host],
165
+ :Port => @options[:port],
166
+ :AccessLog => [],
167
+ :Logger => WEBrick::Log.new(StringIO.new, 7)
168
+ )
169
+ @server.mount('/', Rack::Handler::WEBrick, app)
170
+
171
+ @thread = Thread.new { @server.start }
172
+ @thread.abort_on_exception = true
165
173
  @thread
166
174
  end
167
175
 
176
+ #
177
+ # Boolean method to determine if the server is currently ready to accept
178
+ # requests. This method will attempt to make an HTTP request against the
179
+ # server. If this method returns true, you are safe to make a request.
180
+ #
181
+ # @return [Boolean]
182
+ # true if the server is accepting requests, false otherwise
183
+ #
168
184
  def running?
169
- case @server_type
170
- when :puma
171
- !!server.running
172
- when :webrick
173
- !!(server && server.status == :Running)
185
+ if @server.nil? || @server.status != :Running
186
+ return false
174
187
  end
188
+
189
+ uri = URI.join(url, 'cookbooks')
190
+ headers = { 'Accept' => 'application/json' }
191
+
192
+ Timeout.timeout(0.1) { !open(uri, headers).nil? }
193
+ rescue SocketError, Errno::ECONNREFUSED, Timeout::Error
194
+ false
175
195
  end
176
196
 
197
+ #
198
+ # Gracefully stop the Chef Zero server.
199
+ #
200
+ # @param [Fixnum] wait
201
+ # the number of seconds to wait before raising force-terminating the
202
+ # server
203
+ #
177
204
  def stop(wait = 5)
178
- case @server_type
179
- when :puma
180
- server.stop(true)
181
- when :webrick
182
- server.shutdown
183
- @server
205
+ Timeout.timeout(wait) do
206
+ @server.shutdown
207
+ @thread.join(wait) if @thread
184
208
  end
209
+ rescue Timeout::Error
185
210
  if @thread
186
- begin
187
- @thread.join(wait) if @thread
188
- rescue
189
- if @thread
190
- ChefZero::Log.error "Server did not stop within #{wait} seconds. Killing..."
191
- @thread.kill
192
- end
193
- end
211
+ ChefZero::Log.error("Chef Zero did not stop within #{wait} seconds! Killing...")
212
+ @thread.kill
194
213
  end
195
214
  ensure
215
+ @server = nil
196
216
  @thread = nil
197
217
  end
198
218
 
@@ -283,9 +303,17 @@ module ChefZero
283
303
  @request_handler = block
284
304
  end
285
305
 
306
+ def to_s
307
+ "#<#{self.class} #{url}>"
308
+ end
309
+
310
+ def inspect
311
+ "#<#{self.class} @url=#{url.inspect}>"
312
+ end
313
+
286
314
  private
287
315
 
288
- def make_app
316
+ def app
289
317
  router = RestRouter.new([
290
318
  [ '/authenticate_user', AuthenticateUserEndpoint.new(self) ],
291
319
  [ '/clients', ActorsEndpoint.new(self) ],
@@ -365,9 +393,5 @@ module ChefZero
365
393
  end
366
394
  value
367
395
  end
368
-
369
- def generate_real_keys?
370
- !!@generate_real_keys
371
- end
372
396
  end
373
397
  end
@@ -1,3 +1,3 @@
1
1
  module ChefZero
2
- VERSION = '1.7.3'
2
+ VERSION = '2.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Keiser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-22 00:00:00.000000000 Z
11
+ date: 2013-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-log
@@ -119,8 +119,6 @@ files:
119
119
  - LICENSE
120
120
  - README.md
121
121
  - Rakefile
122
- - bin/chef-zero
123
- - lib/chef_zero.rb
124
122
  - lib/chef_zero/cookbook_data.rb
125
123
  - lib/chef_zero/data_normalizer.rb
126
124
  - lib/chef_zero/data_store/data_already_exists_error.rb
@@ -173,10 +171,12 @@ files:
173
171
  - lib/chef_zero/solr/solr_doc.rb
174
172
  - lib/chef_zero/solr/solr_parser.rb
175
173
  - lib/chef_zero/version.rb
174
+ - lib/chef_zero.rb
176
175
  - spec/run.rb
177
176
  - spec/search_spec.rb
178
177
  - spec/support/pedant.rb
179
178
  - spec/support/stickywicket.pem
179
+ - bin/chef-zero
180
180
  homepage: http://www.opscode.com
181
181
  licenses:
182
182
  - Apache 2.0
@@ -197,10 +197,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
197
  version: '0'
198
198
  requirements: []
199
199
  rubyforge_project:
200
- rubygems_version: 2.2.1
200
+ rubygems_version: 2.1.11
201
201
  signing_key:
202
202
  specification_version: 4
203
203
  summary: Self-contained, easy-setup, fast-start in-memory Chef server for testing
204
204
  and solo setup purposes
205
205
  test_files: []
206
- has_rdoc: