chef-zero 0.9.11 → 0.9.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,145 @@
1
+ Chef Zero
2
+ =========
3
+
4
+ Description
5
+ -----------
6
+ Chef Zero is a simple, easy-install, in-memory Chef server that can be useful
7
+ for Chef Client testing and chef-solo-like tasks that require a full Chef
8
+ Cerver. It IS intended to be simple, Chef 11 compliant, easy to run and fast
9
+ to start. It is NOT intended to be secure, scalable, performant or persistent.
10
+ It does NO input validation, authentication or authorization (it will not
11
+ throw a 400, 401 or 403). It does not save data, and will start up empty each
12
+ time you start it.
13
+
14
+ Because Chef Zero runs in memory, it's super fast and lightweight. This makes
15
+ it perfect for testing against a "real" Chef Server without mocking the
16
+ entire Internet.
17
+
18
+
19
+ Installation
20
+ ------------
21
+ This server can be installed as a Ruby Gem.
22
+
23
+ $ gem install chef-zero
24
+
25
+ If you're using bundler, add `chef-zero` as a development dependency:
26
+
27
+ ```ruby
28
+ group :development do
29
+ gem 'chef-zero'
30
+ end
31
+ ```
32
+
33
+ Or in a `.gemspec`
34
+
35
+ ```ruby
36
+ s.add_development_dependency 'chef-zero'
37
+ ```
38
+
39
+ You can also clone the source repository and install it using `rake install`.
40
+
41
+ Usage
42
+ -----
43
+ One of chef-zero's primary uses is as a small test server for people writing and
44
+ testing clients. Here's a simple example of starting it up:
45
+
46
+ ```ruby
47
+ require 'chef_zero/server'
48
+ server = ChefZero::Server.new(port: 4000)
49
+ server.start
50
+ ```
51
+
52
+ This will create a server instance in the foreground. To stop the server:
53
+
54
+ ```ruby
55
+ server.stop
56
+ ```
57
+
58
+ This is great for debugging and logging requests, but you'll probably want
59
+ to run this in the background so you have full control of your thread.
60
+
61
+ To run Chef Zero in the background, simply issue the `start_background` command:
62
+
63
+ ```ruby
64
+ require 'chef_zero/server'
65
+ server = ChefZero::Server.new(port: 4000)
66
+ server.start_background
67
+ ```
68
+
69
+ You can stop the server the same way:
70
+
71
+ ```ruby
72
+ server.stop
73
+ ```
74
+
75
+ ### Valid Options
76
+ You may currently pass the following options to the initializer:
77
+
78
+ - `host` - the host to run on (Default: '127.0.0.1')
79
+ - `port` - the port to run on (Default: 8889)
80
+ - `debug` - run in debug mode to see all requests and responses (Default: false)
81
+
82
+
83
+ CLI (Comand Line)
84
+ -----------------
85
+ If you don't want to use Chef Zero as a library, you can simply start an instance
86
+ with the included `chef-zero` executable:
87
+
88
+ $ chef-zero
89
+
90
+ Note, this will run in the foreground.
91
+
92
+ You now have a fully functional (empty) Chef Server running.
93
+
94
+ To try it out, go into the `chef-zero/playground` directory and run `knife`. It
95
+ will behave the same as a normal Chef Server, and all normal knife commands will
96
+ work (show, list, delete, from file, upload, download, diff ...). For example,
97
+ with +knife-essentials+ (or Chef 11) you can upload everything in the repo:
98
+
99
+ chef-zero/playground> knife upload .
100
+ Created remote/cookbooks/blah
101
+ Created remote/cookbooks/blork
102
+ Created remote/data_bags/foo/
103
+ Created remote/data_bags/foo/bar.json
104
+ Created remote/data_bags/foo/baz.json
105
+ Created remote/data_bags/foo/blarghle.json
106
+ Created remote/data_bags/foom/
107
+ Created remote/data_bags/foom/x.json
108
+ Created remote/data_bags/widdle/
109
+ Created remote/data_bags/widdle/blank.json
110
+ Created remote/data_bags/widdle/wow.json
111
+ Created remote/environments/desert.json
112
+ Created remote/environments/rainforest.json
113
+ Created remote/environments/semi_arid_plains.json
114
+
115
+ chef-zero/playground> knife environment list
116
+ _default
117
+ desert
118
+ rainforest
119
+ semi_arid_plains
120
+
121
+ To use it in your own repository, create a `knife.rb` like so:
122
+
123
+ chef_server_url 'http://127.0.0.1:8889'
124
+ node_name 'stickywicket'
125
+ client_key 'path_to_any_pem_file.pem'
126
+
127
+ And use knife like you normally would.
128
+
129
+ Since Chef Zero does no authentication, any `.pem` file will do. The client just
130
+ needs something to sign requests with (which will be ignored on the server). Even
131
+ though it's ignored, the `.pem` must still be a valid format.
132
+
133
+ Now, stop the Chef Zero server and all the data is gone!
134
+
135
+ Run `chef-zero --help` to see a list of the supported flags and options:
136
+
137
+ ```text
138
+ Usage: chef-zero [ARGS]
139
+ -H, --host HOST Host to bind to (default: 127.0.0.1)
140
+ -p, --port PORT Port to listen on
141
+ --[no-]generate-keys Whether to generate actual keys or fake it (faster). Default: false.
142
+ -d, --debug Show requests and debugging output
143
+ -h, --help Show this message
144
+ --version Show version
145
+ ```
data/Rakefile CHANGED
@@ -1,19 +1,8 @@
1
1
  require 'bundler'
2
- require 'rubygems'
3
- require 'rubygems/package_task'
4
- require 'rdoc/task'
2
+ require 'bundler/gem_tasks'
5
3
 
6
- Bundler::GemHelper.install_tasks
4
+ require 'chef_zero/version'
7
5
 
8
- gem_spec = eval(File.read("chef-zero.gemspec"))
9
-
10
- RDoc::Task.new do |rdoc|
11
- rdoc.rdoc_dir = 'rdoc'
12
- rdoc.title = "chef-zero #{gem_spec.version}"
13
- rdoc.rdoc_files.include('README*')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
16
-
17
- task :test do
18
- sh "cd test && ruby run-pedant.rb"
6
+ task :spec do
7
+ sh 'ruby spec/run.rb'
19
8
  end
@@ -7,11 +7,8 @@ require 'chef_zero/version'
7
7
  require 'chef_zero/server'
8
8
  require 'optparse'
9
9
 
10
- options = {
11
- :host => '127.0.0.1',
12
- :port => 8889,
13
- :generate_real_keys => false
14
- }
10
+ options = {}
11
+
15
12
  OptionParser.new do |opts|
16
13
  opts.banner = "Usage: chef-zero [ARGS]"
17
14
 
@@ -27,8 +24,8 @@ OptionParser.new do |opts|
27
24
  options[:generate_real_keys] = value
28
25
  end
29
26
 
30
- opts.on("-d", "--debug", "Show requests and debugging output") do |value|
31
- options[:debug] = true
27
+ opts.on("-l", "--log-level LEVEL", "Set the output log level") do |value|
28
+ options[:log_level] = value
32
29
  end
33
30
 
34
31
  opts.on_tail("-h", "--help", "Show this message") do
@@ -43,4 +40,4 @@ OptionParser.new do |opts|
43
40
  end.parse!
44
41
 
45
42
  server = ChefZero::Server.new(options)
46
- server.start
43
+ server.start(:publish => true)
@@ -1,7 +1,6 @@
1
- require 'chef_zero/core_ext'
2
-
3
1
  module ChefZero
4
- autoload :Log, 'chef_zero/log'
2
+ require 'chef_zero/core_ext'
3
+ require 'chef_zero/log'
5
4
 
6
5
  CERTIFICATE = "-----BEGIN CERTIFICATE-----\nMIIDMzCCApygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFjAUBgNVBAoM\nDU9wc2NvZGUsIEluYy4xHDAaBgNVBAsME0NlcnRpZmljYXRlIFNlcnZpY2UxMjAw\nBgNVBAMMKW9wc2NvZGUuY29tL2VtYWlsQWRkcmVzcz1hdXRoQG9wc2NvZGUuY29t\nMB4XDTEyMTEyMTAwMzQyMVoXDTIyMTExOTAwMzQyMVowgZsxEDAOBgNVBAcTB1Nl\nYXR0bGUxEzARBgNVBAgTCldhc2hpbmd0b24xCzAJBgNVBAYTAlVTMRwwGgYDVQQL\nExNDZXJ0aWZpY2F0ZSBTZXJ2aWNlMRYwFAYDVQQKEw1PcHNjb2RlLCBJbmMuMS8w\nLQYDVQQDFCZVUkk6aHR0cDovL29wc2NvZGUuY29tL0dVSURTL3VzZXJfZ3VpZDCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLDmPbR71bS2esZlZh/HfC6\n0azXFjl2677wq2ovk9xrUb0Ui4ZLC66TqQ9C/RBzOjXU4TRf3hgPTqvlCgHusl0d\nIcLCrsSl6kPEhJpYWWfRoroIAwf82A9yLQekhqXZEXu5EKkwoUMqyF6m0ZCasaE1\ny8niQxdLAsk3ady/CGQlFqHTPKFfU5UASR2LRtYC1MCIvJHDFRKAp9kPJbQo9P37\nZ8IU7cDudkZFgNLmDixlWsh7C0ghX8fgAlj1P6FgsFufygam973k79GhIP54dELB\nc0S6E8ekkRSOXU9jX/IoiXuFglBvFihAdhvED58bMXzj2AwXUyeAlxItnvs+NVUC\nAwEAATANBgkqhkiG9w0BAQUFAAOBgQBkFZRbMoywK3hb0/X7MXmPYa7nlfnd5UXq\nr2n32ettzZNmEPaI2d1j+//nL5qqhOlrWPS88eKEPnBOX/jZpUWOuAAddnrvFzgw\nrp/C2H7oMT+29F+5ezeViLKbzoFYb4yECHBoi66IFXNae13yj7taMboBeUmE664G\nTB/MZpRr8g==\n-----END CERTIFICATE-----\n"
7
6
  PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0sOY9tHvVtLZ6xmVmH8d\n8LrRrNcWOXbrvvCrai+T3GtRvRSLhksLrpOpD0L9EHM6NdThNF/eGA9Oq+UKAe6y\nXR0hwsKuxKXqQ8SEmlhZZ9GiuggDB/zYD3ItB6SGpdkRe7kQqTChQyrIXqbRkJqx\noTXLyeJDF0sCyTdp3L8IZCUWodM8oV9TlQBJHYtG1gLUwIi8kcMVEoCn2Q8ltCj0\n/ftnwhTtwO52RkWA0uYOLGVayHsLSCFfx+ACWPU/oWCwW5/KBqb3veTv0aEg/nh0\nQsFzRLoTx6SRFI5dT2Nf8iiJe4WCUG8WKEB2G8QPnxsxfOPYDBdTJ4CXEi2e+z41\nVQIDAQAB\n-----END PUBLIC KEY-----\n"
@@ -1,5 +1,4 @@
1
1
  require 'chef_zero/endpoints/cookbooks_base'
2
- require 'solve'
3
2
 
4
3
  module ChefZero
5
4
  module Endpoints
@@ -32,7 +31,7 @@ module ChefZero
32
31
  end
33
32
 
34
33
  def latest_version(versions)
35
- sorted = versions.sort_by { |version| Solve::Version.new(version) }
34
+ sorted = versions.sort_by { |version| Gem::Version.new(version.dup) }
36
35
  sorted[-1]
37
36
  end
38
37
  end
@@ -2,7 +2,6 @@ require 'json'
2
2
  require 'chef_zero/endpoints/rest_object_endpoint'
3
3
  require 'chef_zero/rest_error_response'
4
4
  require 'chef_zero/data_normalizer'
5
- require 'solve'
6
5
 
7
6
  module ChefZero
8
7
  module Endpoints
@@ -99,7 +98,7 @@ module ChefZero
99
98
  end
100
99
 
101
100
  def latest_version(versions)
102
- sorted = versions.sort_by { |version| Solve::Version.new(version) }
101
+ sorted = versions.sort_by { |version| Gem::Version.new(version.dup) }
103
102
  sorted[-1]
104
103
  end
105
104
  end
@@ -1,7 +1,6 @@
1
1
  require 'json'
2
2
  require 'chef_zero/rest_base'
3
3
  require 'chef_zero/data_normalizer'
4
- require 'solve'
5
4
 
6
5
  module ChefZero
7
6
  module Endpoints
@@ -26,11 +25,11 @@ module ChefZero
26
25
 
27
26
  def filter_cookbooks(cookbooks_list, constraints = {}, num_versions = nil)
28
27
  cookbooks_list.keys.sort.each do |name|
29
- constraint = Solve::Constraint.new(constraints[name])
28
+ constraint = Gem::Requirement.new(constraints[name])
30
29
  versions = []
31
- cookbooks_list[name].keys.sort_by { |version| Solve::Version.new(version) }.reverse.each do |version|
30
+ cookbooks_list[name].keys.sort_by { |version| Gem::Version.new(version.dup) }.reverse.each do |version|
32
31
  break if num_versions && versions.size >= num_versions
33
- if constraint.satisfies?(version)
32
+ if constraint.satisfied_by?(Gem::Version.new(version.dup))
34
33
  versions << version
35
34
  end
36
35
  end
@@ -1,7 +1,6 @@
1
1
  require 'json'
2
2
  require 'chef_zero/rest_base'
3
3
  require 'chef_zero/rest_error_response'
4
- require 'solve'
5
4
 
6
5
  module ChefZero
7
6
  module Endpoints
@@ -98,15 +97,15 @@ module ChefZero
98
97
  end
99
98
 
100
99
  def sort_versions(versions)
101
- result = versions.sort_by { |version| Solve::Version.new(version) }
100
+ result = versions.sort_by { |version| Gem::Version.new(version.dup) }
102
101
  result.reverse
103
102
  end
104
103
 
105
104
  def filter_by_constraint(versions, cookbook_name, constraint)
106
105
  return versions if !constraint
107
- constraint = Solve::Constraint.new(constraint)
106
+ constraint = Gem::Requirement.new(constraint)
108
107
  new_versions = versions[cookbook_name]
109
- new_versions = new_versions.select { |version| constraint.satisfies?(version) }
108
+ new_versions = new_versions.select { |version| constraint.satisfied_by?(Gem::Version.new(version)) }
110
109
  result = versions.clone
111
110
  result[cookbook_name] = new_versions
112
111
  result
@@ -29,7 +29,6 @@ module ChefZero
29
29
  before :each do
30
30
  unless ChefZero::RSpec.server
31
31
  # Set up configuration so that clients will point to the server
32
- Thin::Logging.silent = true
33
32
  ChefZero::RSpec.server = ChefZero::Server.new(:port => 8889, :signals => false, :log_requests => true)
34
33
  ChefZero::RSpec.client_key = Tempfile.new(['chef_zero_client_key', '.pem'])
35
34
  ChefZero::RSpec.client_key.write(ChefZero::PRIVATE_KEY)
@@ -16,13 +16,15 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'rubygems'
20
- require 'thin'
21
19
  require 'openssl'
22
- require 'chef_zero'
23
- require 'chef_zero/rest_router'
20
+ require 'puma'
21
+ require 'rubygems'
24
22
  require 'timeout'
23
+
24
+ require 'chef_zero'
25
25
  require 'chef_zero/cookbook_data'
26
+ require 'chef_zero/rest_router'
27
+ require 'chef_zero/version'
26
28
 
27
29
  require 'chef_zero/endpoints/authenticate_user_endpoint'
28
30
  require 'chef_zero/endpoints/actors_endpoint'
@@ -54,69 +56,86 @@ require 'chef_zero/endpoints/not_found_endpoint'
54
56
 
55
57
  module ChefZero
56
58
  class Server
59
+ DEFAULT_OPTIONS = {
60
+ :host => '127.0.0.1',
61
+ :port => 8889,
62
+ :log_level => :info,
63
+ :generate_real_keys => true
64
+ }.freeze
65
+
57
66
  def initialize(options = {})
58
- @options = options
59
- options[:host] ||= '127.0.0.1'
60
- options[:port] ||= 80
61
- options[:generate_real_keys] = true if !options.has_key?(:generate_real_keys)
62
- ChefZero::Log.level = :debug if options.has_key?(:debug)
63
- thin_options = {}
64
- thin_options[:signals] = options[:signals] if options.has_key?(:signals)
65
- @server = Thin::Server.new(options[:host], options[:port], make_app, thin_options)
67
+ options = DEFAULT_OPTIONS.merge(options)
68
+ @url = "http://#{options[:host]}:#{options[:port]}"
66
69
  @generate_real_keys = options[:generate_real_keys]
70
+
71
+ ChefZero::Log.level = options[:log_level].to_sym
72
+
73
+ @server = Puma::Server.new(make_app, Puma::Events.new(STDERR, STDOUT))
74
+ @server.add_tcp_listener(options[:host], options[:port])
75
+
67
76
  clear_data
68
77
  end
69
78
 
70
79
  attr_reader :server
71
80
  attr_reader :data
72
- attr_reader :options
73
- attr_reader :generate_real_keys
81
+ attr_reader :url
74
82
 
75
83
  include ChefZero::Endpoints
76
84
 
77
- def url
78
- "http://#{options[:host]}:#{options[:port]}"
79
- end
85
+ def start(options = {})
86
+ if options[:publish]
87
+ puts ">> Starting Chef Zero (v#{ChefZero::VERSION})..."
88
+ puts ">> Puma (v#{Puma::Const::PUMA_VERSION}) is listening at #{url}"
89
+ puts ">> Press CTRL+C to stop"
90
+ end
80
91
 
81
- def start
82
- server.start
92
+ begin
93
+ thread = server.run.join
94
+ rescue Object, Interrupt
95
+ puts "\n>> Stopping Puma..."
96
+ server.stop(true) if running?
97
+ end
83
98
  end
84
99
 
85
- def start_background(timeout = 5)
86
- @thread = Thread.new do
100
+ def start_background(wait = 5)
101
+ @thread = Thread.new {
87
102
  begin
88
- server.start
103
+ start
89
104
  rescue
90
105
  @server_error = $!
91
106
  ChefZero::Log.error("#{$!.message}\n#{$!.backtrace.join("\n")}")
92
107
  end
93
- end
94
- Timeout::timeout(timeout) do
95
- until server.running? || @server_error
96
- sleep(0.01)
97
- end
108
+ }
109
+
110
+ # Wait x seconds to make sure the server actually started
111
+ Timeout::timeout(wait) {
112
+ sleep(0.01) until running? || @server_error
98
113
  raise @server_error if @server_error
99
- end
114
+ }
115
+
116
+ # Give the user the thread, just in case they want it
117
+ @thread
100
118
  end
101
119
 
102
120
  def running?
103
- server.running?
121
+ !!server.running
104
122
  end
105
123
 
106
- def stop(timeout = 5)
107
- begin
108
- server.stop
109
- @thread.join(timeout)
110
- @thread = nil
111
- rescue
112
- ChefZero::Log.error("Server did not stop within #{timeout}s. Killing.")
113
- @thread.kill if @thread
114
- @thread = nil
124
+ def stop(wait = 5)
125
+ if @thread
126
+ @thread.join(wait)
127
+ else
128
+ server.stop(true)
115
129
  end
130
+ rescue
131
+ ChefZero::Log.error "Server did not stop within #{wait} seconds. Killing..."
132
+ @thread.kill if @thread
133
+ ensure
134
+ @thread = nil
116
135
  end
117
136
 
118
137
  def gen_key_pair
119
- if generate_real_keys
138
+ if generate_real_keys?
120
139
  private_key = OpenSSL::PKey::RSA.new(2048)
121
140
  public_key = private_key.public_key.to_s
122
141
  public_key.sub!(/^-----BEGIN RSA PUBLIC KEY-----/, '-----BEGIN PUBLIC KEY-----')
@@ -270,6 +289,12 @@ module ChefZero
270
289
  if @on_response_proc
271
290
  @on_response_proc.call(request, response)
272
291
  end
292
+
293
+ # Puma expects the response to be an array (chunked responses). Since
294
+ # we are statically generating data, we won't ever have said chunked
295
+ # response, so fake it.
296
+ response[-1] = Array(response[-1])
297
+
273
298
  response
274
299
  end
275
300
  end
@@ -289,5 +314,9 @@ module ChefZero
289
314
  end
290
315
  value
291
316
  end
317
+
318
+ def generate_real_keys?
319
+ !!@generate_real_keys
320
+ end
292
321
  end
293
322
  end
@@ -1,3 +1,3 @@
1
1
  module ChefZero
2
- VERSION = '0.9.11'
2
+ VERSION = '0.9.12'
3
3
  end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ require 'bundler'
3
+ require 'bundler/setup'
4
+
5
+ require 'chef_zero/server'
6
+ require 'rspec/core'
7
+
8
+ require 'pedant'
9
+ require 'pedant/opensource'
10
+
11
+ server = ChefZero::Server.new(:port => 8889)
12
+ server.start_background
13
+
14
+ Pedant.config.suite = 'api'
15
+ Pedant.config[:config_file] = 'spec/support/pedant.rb'
16
+ Pedant.setup([
17
+ '--skip-validation',
18
+ '--skip-authentication',
19
+ '--skip-authorization'
20
+ ])
21
+
22
+ result = RSpec::Core::Runner.run(Pedant.config.rspec_args)
23
+
24
+ server.stop
25
+ exit(result)
@@ -0,0 +1,117 @@
1
+ # Copyright: Copyright (c) 2012 Opscode, Inc.
2
+ # License: Apache License, Version 2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ # This annotated Pedant configuration file details the various
17
+ # configuration settings available to you. It is separate from the
18
+ # actual Pedant::Config class because not all settings have sane
19
+ # defaults, and not all settings are appropriate in all settings.
20
+
21
+ ################################################################################
22
+ # You MUST specify the address of the server the API requests will be
23
+ # sent to. Only specify protocol, hostname, and port.
24
+ chef_server 'http://127.0.0.1:8889'
25
+
26
+ # If you are doing development testing, you can specify the address of
27
+ # the Solr server. The presence of this parameter will enable tests
28
+ # to force commits to Solr, greatly decreasing the amout of time
29
+ # needed for testing the search endpoint. This is only an
30
+ # optimization for development! If you are testing a "live" Chef
31
+ # Server, or otherwise do not have access to the Solr server from your
32
+ # testing location, you should not specify a value for this parameter.
33
+ # The tests will still run, albeit slower, as they will now need to
34
+ # poll for a period to ensure they are querying committed results.
35
+ #search_server "http://localhost:8983"
36
+
37
+ # Related to the 'search_server' parameter, this specifies the maximum
38
+ # amout of time (in seconds) that search endpoint requests should be
39
+ # retried before giving up. If not explicitly set, it will default to
40
+ # 65 seconds; only set it if you know that your Solr commit interval
41
+ # differs significantly from this.
42
+ maximum_search_time 0
43
+
44
+ # We're starting to break tests up into groups based on different
45
+ # criteria. The proper API tests (the results of which are viewable
46
+ # to OPC customers) should be the only ones run by Pedant embedded in
47
+ # OPC installs. There are other specs that help us keep track of API
48
+ # cruft that we want to come back and fix later; these shouldn't be
49
+ # viewable to customers, but we should be able to run them in
50
+ # development and CI environments. If this parameter is missing or
51
+ # explicitly `false` only the customer-friendly tests will be run.
52
+ #
53
+ # This is mainly here for documentation purposes, since the
54
+ # command-line `opscode-pedant` utility ultimately determines this
55
+ # value.
56
+ include_internal false
57
+
58
+ # Test users. The five users specified below are required; their
59
+ # names (:user, :non_org_user, etc.) are indicative of their role
60
+ # within the tests. All users must have a ':name' key. If they have
61
+ # a ':create_me' key, Pedant will create these users for you. If you
62
+ # are using pre-existing users, you must supply a ':key_file' key,
63
+ # which should be the fully-qualified path /on the machine Pedant is
64
+ # running on/ to a private key for that user.
65
+ key = 'spec/support/stickywicket.pem'
66
+ superuser_name 'admin'
67
+ superuser_key key
68
+ webui_key key
69
+
70
+ # Set the platform_class
71
+ platform_class Pedant::OpenSourcePlatform
72
+
73
+ requestors({
74
+ :clients => {
75
+ # The the admin user, for the purposes of getting things rolling
76
+ :admin => {
77
+ :name => "pedant_admin_client",
78
+ :create_me => true,
79
+ :create_knife => true,
80
+ :admin => true
81
+ },
82
+ :non_admin => {
83
+ :name => 'pedant_client',
84
+ :create_me => true,
85
+ :create_knife => true
86
+ },
87
+ :bad => {
88
+ :name => 'bad_client',
89
+ :bogus => true
90
+ }
91
+ },
92
+ :users => {
93
+ :admin => {
94
+ :name => "admin",
95
+ :key_file => key,
96
+ :create_me => false,
97
+ :create_knife => false,
98
+ :admin => true
99
+ },
100
+ :non_admin => {
101
+ :name => "pedant_non_admin_user",
102
+ :create_me => true,
103
+ :create_knife => true,
104
+ :admin => false
105
+ },
106
+ # A user for Knife tests. A knife.rb and key files will be set up
107
+ # for this user
108
+ :knife_user => {
109
+ :name => "knifey",
110
+ :create_me => true,
111
+ :create_knife => true
112
+ }
113
+ }
114
+ })
115
+
116
+ self[:tags] = [:validation, :authentication, :authorization]
117
+ verify_error_messages false
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEApNCkX2k+lFGDWRVhX4uClaVQrumG9XXvk6X7M2izrIg7RzMP
3
+ Dk4thhZkpx5gr22By7PZQdMEjWC/Zo8MBjtoJ0GV0jw8npefbU1MGKs2dtpYgo0N
4
+ Fq8fX8MdFPu4h2W3g0dMEdhT8icc2H4EjhZmdeUhUn3RIEt2duCgp3YDYnUUZx3j
5
+ N7MHcTIdzD58ikr6zQrZzHOv+OOI86Xk9EpyEEQizOLoQxkICNrhqN7ElQDuvXaX
6
+ BSBrYDRKH2umBMMcXzvsR/SvkmqxoEESSpIlW8zeKAWQ+znNjDC0tmTg7jZmgSP7
7
+ siKrwo4t4ebjcmjpIoi/JKww/nGN3Uhz1ZOZuwIDAQABAoIBAQCaJQD2s0nyEeKU
8
+ uKhfYe155Cl3zbWJcQnmv4AXbr9MiAVY6+oS6Q8ur1bn7kNjDzoruENjiuZhC7E3
9
+ TGZklb8tp+tluyy+7vQOmBKpp8fClSfewekR5CultqhGbb8B8yIVR+NfdUHd4rLZ
10
+ z9KWyWB+txPZQQ8L80gSmrfmpzs3IuT7oPvmtBU1Wq9QapC4n/rUohHUpUV1du4G
11
+ 0wCIF4zQTg6cbYW2YXozwVQvw+P7P3RVEqZt+aZlbVcy0fNr6jNao0hi1KFC9OH2
12
+ VjjU+PioreoA/NU3aZPIUzmJpWtsu31yuOZxXmytAkYooCZgiEQNEHnJlNPv0RmC
13
+ 6BPMzVoBAoGBAM7yZoSNJpzdP/q1/4+H3zyy7o4I0VTW9u/GqUzhnbjm5poK30X9
14
+ YXh/7WOVV0OoVqdO6ljRKygP3Oggf41ZEbi1C6bbsO57pksBWgx9bD9V35XscZ0J
15
+ F1ERe//kMHwVQy74R8/cIuRwm75haLSBj5/fwGbLeeVDglJkCVqPjtuBAoGBAMvh
16
+ qsAGG5k9u6voTcXlFwS+B5YjULhK4NSxdJ2BnOxzYzxQ3IYQZMlb2xt8yZYx/ZZK
17
+ wjkr9rcAPEQIQZ2A6NUbGq6qCD7sSmg6UAi0CgiqTokQ/Wtag0UDvFMzwerdg/On
18
+ 37uxffpxpte8z1jYi/MxRaoTYueuc1UVnqofVIM7AoGBALZJzwPzUY/bVAADUJmd
19
+ lYZiFsAGBF42/E05MOgH1GaK/ZWy/fkouDLsfK67XaK7JZk6ajLSDLG9R1kxRym6
20
+ y2FoGFtiKPfo8xIenrNhx3gCrG/jVjB9UYyXWiKNXifukr9M8/SkdBfFGWsZYqGd
21
+ fmXVMiVaFoVcce8hLxwWWEABAoGBAKcyhKX/HEj6YFqlIoqkydDAylXs1jicZ27l
22
+ rF2yum8KXZpMMdzbutuKsdAD8Ql0K6NB4a+jByuiTMn5/11cJxUEqkgM9sArZQW+
23
+ tH2+r+/VQpyTS0/rpXVGj/2nl2K1kI2T4R36e/aTl6CanWweAf9JK/lC9rxKyxg+
24
+ p6SaFuObAoGACP6TKCkp2oymXlKgdUUgPrnsaz2VAw8jD5QHtx10U4wty0C8gxsk
25
+ MLe00h09iLPyFmvJpD+MgbxV/r6RrZeVdsKdU/5LG52YgiVSTaizyy+ciEfW7xoQ
26
+ CL5EtZd8Cn5OKinBEzzFpELqunlqepIKCIDOcLKz/cjR+3a+E6Zx5Wo=
27
+ -----END RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-zero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.11
4
+ version: 0.9.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,84 +9,82 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-19 00:00:00.000000000 Z
12
+ date: 2013-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: thin
15
+ name: puma
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: '2.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: '2.0'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: mixlib-log
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ! '>='
35
+ - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 1.3.0
37
+ version: '1.3'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ! '>='
43
+ - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 1.3.0
45
+ version: '1.3'
46
46
  - !ruby/object:Gem::Dependency
47
- name: solve
47
+ name: hashie
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - ! '>='
51
+ - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 0.4.3
53
+ version: '2.0'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ! '>='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 0.4.3
61
+ version: '2.0'
62
62
  - !ruby/object:Gem::Dependency
63
- name: hashie
63
+ name: rake
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
67
  - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
- version: 2.0.4
70
- type: :runtime
69
+ version: '0'
70
+ type: :development
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
- version: 2.0.4
77
+ version: '0'
78
78
  description: Self-contained, easy-setup, fast-start in-memory Chef server for testing
79
79
  and solo setup purposes
80
80
  email: jkeiser@opscode.com
81
81
  executables:
82
82
  - chef-zero
83
83
  extensions: []
84
- extra_rdoc_files:
85
- - README.rdoc
86
- - LICENSE
84
+ extra_rdoc_files: []
87
85
  files:
88
86
  - LICENSE
89
- - README.rdoc
87
+ - README.md
90
88
  - Rakefile
91
89
  - lib/chef_zero/cookbook_data.rb
92
90
  - lib/chef_zero/core_ext/hash.rb
@@ -139,6 +137,9 @@ files:
139
137
  - lib/chef_zero/solr/solr_parser.rb
140
138
  - lib/chef_zero/version.rb
141
139
  - lib/chef_zero.rb
140
+ - spec/run.rb
141
+ - spec/support/pedant.rb
142
+ - spec/support/stickywicket.pem
142
143
  - !binary |-
143
144
  YmluL2NoZWYtemVybw==
144
145
  homepage: http://www.opscode.com
@@ -167,4 +168,4 @@ specification_version: 3
167
168
  summary: Self-contained, easy-setup, fast-start in-memory Chef server for testing
168
169
  and solo setup purposes
169
170
  test_files: []
170
- has_rdoc: true
171
+ has_rdoc:
@@ -1,79 +0,0 @@
1
- == Chef Zero
2
-
3
- = DESCRIPTION:
4
-
5
- chef-zero is a simple, easy-install, in-memory Chef server that can be useful
6
- for Chef client testing and chef-solo-like tasks that require a full Chef
7
- server. It IS intended to be simple, Chef 11 compliant, easy to run and fast
8
- to start. It is NOT intended to be secure, scalable, performant or persistent.
9
- It does NO input validation, authentication or authorization (it will not
10
- throw a 400, 401 or 403). It does not save data, and will start up empty each
11
- time you start it.
12
-
13
- = INSTALLATION:
14
-
15
- This server can be installed as a Ruby Gem.
16
-
17
- gem install chef-zero
18
-
19
- You can also copy the source repository and install it using +rake install+.
20
-
21
- = TEST SERVER USAGE:
22
-
23
- One of chef-zero's primary uses is as a small test server for people writing and
24
- testing clients. To bring it up, simply do:
25
-
26
- require 'chef_zero/server'
27
- server = ChefZero::Server.new(:port => 8889)
28
- server.start
29
-
30
- To bring it up in the background, do:
31
-
32
- thread = Thread.new { server.start }
33
-
34
- To kill the background server, do:
35
-
36
- thread.stop
37
-
38
- = COMMAND LINE USAGE:
39
-
40
- To simply run the server, you can just type +chef-zero+ after installing and you
41
- will have a fully functional (empty) Chef Server running.
42
-
43
- To try it out, go into the +chef-zero/playground+ directory and run knife. It
44
- will behave the same as a normal Chef server, and all normal knife commands will
45
- work (show, list, delete, from file, upload, download, diff ...). For example,
46
- with +knife-essentials+ (or Chef 11) you can upload everything in the repo:
47
-
48
- chef-zero/playground> knife upload .
49
- Created remote/cookbooks/blah
50
- Created remote/cookbooks/blork
51
- Created remote/data_bags/foo/
52
- Created remote/data_bags/foo/bar.json
53
- Created remote/data_bags/foo/baz.json
54
- Created remote/data_bags/foo/blarghle.json
55
- Created remote/data_bags/foom/
56
- Created remote/data_bags/foom/x.json
57
- Created remote/data_bags/widdle/
58
- Created remote/data_bags/widdle/blank.json
59
- Created remote/data_bags/widdle/wow.json
60
- Created remote/environments/desert.json
61
- Created remote/environments/rainforest.json
62
- Created remote/environments/semi_arid_plains.json
63
-
64
- chef-zero/playground> knife environment list
65
- _default
66
- desert
67
- rainforest
68
- semi_arid_plains
69
-
70
- To use it in your own repository, create a +knife.rb+ like so:
71
-
72
- chef_server_url "http://127.0.0.1:8889"
73
- node_name "stickywicket"
74
- client_key "path_to_any_pem_file.pem"
75
-
76
- And use knife like you normally would.
77
-
78
- Since Chef Zero does no authentication, any .pem file will do. The client just
79
- needs something to sign requests with (which will be ignored on the server).