chef-zero 0.9.4 → 0.9.5
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.
- data/lib/chef_zero/endpoints/data_bags_endpoint.rb +3 -1
- data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
- data/lib/chef_zero/endpoints/rest_list_endpoint.rb +3 -1
- data/lib/chef_zero/rest_base.rb +5 -6
- data/lib/chef_zero/rest_request.rb +14 -0
- data/lib/chef_zero/{router.rb → rest_router.rb} +6 -6
- data/lib/chef_zero/rspec.rb +12 -1
- data/lib/chef_zero/server.rb +22 -3
- data/lib/chef_zero/version.rb +1 -1
- metadata +3 -3
| @@ -9,7 +9,9 @@ module ChefZero | |
| 9 9 | 
             
                    container = get_data(request)
         | 
| 10 10 | 
             
                    contents = request.body
         | 
| 11 11 | 
             
                    name = JSON.parse(contents, :create_additions => false)[identity_key]
         | 
| 12 | 
            -
                    if  | 
| 12 | 
            +
                    if name.nil?
         | 
| 13 | 
            +
                      error(400, "Must specify '#{identity_key}' in JSON")
         | 
| 14 | 
            +
                    elsif container[name]
         | 
| 13 15 | 
             
                      error(409, "Object already exists")
         | 
| 14 16 | 
             
                    else
         | 
| 15 17 | 
             
                      container[name] = {}
         | 
| @@ -1,8 +1,8 @@ | |
| 1 1 | 
             
            module ChefZero
         | 
| 2 2 | 
             
              module Endpoints
         | 
| 3 3 | 
             
                class NotFoundEndpoint
         | 
| 4 | 
            -
                  def call( | 
| 5 | 
            -
                    return [404, {"Content-Type" => "application/json"}, "Object not found: #{env['REQUEST_PATH']}"]
         | 
| 4 | 
            +
                  def call(request)
         | 
| 5 | 
            +
                    return [404, {"Content-Type" => "application/json"}, "Object not found: #{request.env['REQUEST_PATH']}"]
         | 
| 6 6 | 
             
                  end
         | 
| 7 7 | 
             
                end
         | 
| 8 8 | 
             
              end
         | 
| @@ -25,7 +25,9 @@ module ChefZero | |
| 25 25 | 
             
                    container = get_data(request)
         | 
| 26 26 | 
             
                    contents = request.body
         | 
| 27 27 | 
             
                    key = get_key(contents)
         | 
| 28 | 
            -
                    if  | 
| 28 | 
            +
                    if key.nil?
         | 
| 29 | 
            +
                      error(400, "Must specify '#{identity_key}' in JSON")
         | 
| 30 | 
            +
                    elsif container[key]
         | 
| 29 31 | 
             
                      error(409, 'Object already exists')
         | 
| 30 32 | 
             
                    else
         | 
| 31 33 | 
             
                      container[key] = contents
         | 
    
        data/lib/chef_zero/rest_base.rb
    CHANGED
    
    | @@ -14,20 +14,19 @@ module ChefZero | |
| 14 14 | 
             
                  server.data
         | 
| 15 15 | 
             
                end
         | 
| 16 16 |  | 
| 17 | 
            -
                def call( | 
| 18 | 
            -
                   | 
| 19 | 
            -
                  method = env['REQUEST_METHOD'].downcase.to_sym
         | 
| 17 | 
            +
                def call(request)
         | 
| 18 | 
            +
                  method = request.method.downcase.to_sym
         | 
| 20 19 | 
             
                  if !self.respond_to?(method)
         | 
| 21 20 | 
             
                    accept_methods = [:get, :put, :post, :delete].select { |m| self.respond_to?(m) }
         | 
| 22 21 | 
             
                    accept_methods_str = accept_methods.map { |m| m.to_s.upcase }.join(', ')
         | 
| 23 | 
            -
                    return [405, {"Content-Type" => "text/plain", "Allow" => accept_methods_str}, "Bad request method for '#{env['REQUEST_PATH']}': #{env['REQUEST_METHOD']}"]
         | 
| 22 | 
            +
                    return [405, {"Content-Type" => "text/plain", "Allow" => accept_methods_str}, "Bad request method for '#{request.env['REQUEST_PATH']}': #{request.env['REQUEST_METHOD']}"]
         | 
| 24 23 | 
             
                  end
         | 
| 25 | 
            -
                  if json_only && !env['HTTP_ACCEPT'].split(';').include?('application/json')
         | 
| 24 | 
            +
                  if json_only && !request.env['HTTP_ACCEPT'].split(';').include?('application/json')
         | 
| 26 25 | 
             
                    return [406, {"Content-Type" => "text/plain"}, "Must accept application/json"]
         | 
| 27 26 | 
             
                  end
         | 
| 28 27 | 
             
                  # Dispatch to get()/post()/put()/delete()
         | 
| 29 28 | 
             
                  begin
         | 
| 30 | 
            -
                    self.send(method,  | 
| 29 | 
            +
                    self.send(method, request)
         | 
| 31 30 | 
             
                  rescue RestErrorResponse => e
         | 
| 32 31 | 
             
                    error(e.response_code, e.error)
         | 
| 33 32 | 
             
                  end
         | 
| @@ -37,6 +37,20 @@ module ChefZero | |
| 37 37 | 
             
                    params
         | 
| 38 38 | 
             
                  end
         | 
| 39 39 | 
             
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def to_s
         | 
| 42 | 
            +
                  result = "#{method} #{rest_path.join('/')}"
         | 
| 43 | 
            +
                  if query_params.size > 0
         | 
| 44 | 
            +
                    result << "?#{query_params.map { |k,v| "#{k}=#{v}" }.join('&') }"
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                  if body.chomp != ''
         | 
| 47 | 
            +
                    result << "\n--- #{method} BODY ---\n"
         | 
| 48 | 
            +
                    result << body
         | 
| 49 | 
            +
                    result << "\n" if !body.end_with?("\n")
         | 
| 50 | 
            +
                    result << "--- END #{method} BODY ---"
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                  result
         | 
| 53 | 
            +
                end
         | 
| 40 54 | 
             
              end
         | 
| 41 55 | 
             
            end
         | 
| 42 56 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require 'chef/log'
         | 
| 2 2 |  | 
| 3 3 | 
             
            module ChefZero
         | 
| 4 | 
            -
              class  | 
| 4 | 
            +
              class RestRouter
         | 
| 5 5 | 
             
                def initialize(routes)
         | 
| 6 6 | 
             
                  @routes = routes.map do |route, endpoint|
         | 
| 7 7 | 
             
                    pattern = Regexp.new("^#{route.gsub('*', '[^/]*')}$")
         | 
| @@ -12,16 +12,16 @@ module ChefZero | |
| 12 12 | 
             
                attr_reader :routes
         | 
| 13 13 | 
             
                attr_accessor :not_found
         | 
| 14 14 |  | 
| 15 | 
            -
                def call( | 
| 15 | 
            +
                def call(request)
         | 
| 16 16 | 
             
                  begin
         | 
| 17 | 
            -
                    Chef::Log.debug " | 
| 18 | 
            -
                    clean_path = "/" +  | 
| 17 | 
            +
                    Chef::Log.debug "Request: #{request}"
         | 
| 18 | 
            +
                    clean_path = "/" + request.rest_path.join("/")
         | 
| 19 19 | 
             
                    routes.each do |route, endpoint|
         | 
| 20 20 | 
             
                      if route.match(clean_path)
         | 
| 21 | 
            -
                        return endpoint.call( | 
| 21 | 
            +
                        return endpoint.call(request)
         | 
| 22 22 | 
             
                      end
         | 
| 23 23 | 
             
                    end
         | 
| 24 | 
            -
                    not_found.call( | 
| 24 | 
            +
                    not_found.call(request)
         | 
| 25 25 | 
             
                  rescue
         | 
| 26 26 | 
             
                    Chef::Log.error("#{$!.inspect}\n#{$!.backtrace.join("\n")}")
         | 
| 27 27 | 
             
                    [500, {"Content-Type" => "text/plain"}, "Exception raised!  #{$!.inspect}\n#{$!.backtrace.join("\n")}"]
         | 
    
        data/lib/chef_zero/rspec.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require 'thin'
         | 
| 2 2 | 
             
            require 'tempfile'
         | 
| 3 3 | 
             
            require 'chef_zero/server'
         | 
| 4 | 
            +
            require 'chef_zero/rest_request'
         | 
| 4 5 | 
             
            require 'chef/config'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module ChefZero
         | 
| @@ -17,6 +18,12 @@ module ChefZero | |
| 17 18 | 
             
                def self.client_key=(value)
         | 
| 18 19 | 
             
                  @client_key = value
         | 
| 19 20 | 
             
                end
         | 
| 21 | 
            +
                def self.request_log
         | 
| 22 | 
            +
                  @request_log ||= []
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
                def self.clear_request_log
         | 
| 25 | 
            +
                  @request_log = []
         | 
| 26 | 
            +
                end
         | 
| 20 27 |  | 
| 21 28 | 
             
                def when_the_chef_server(description, *tags, &block)
         | 
| 22 29 | 
             
                  context "When the Chef server #{description}", *tags do
         | 
| @@ -24,15 +31,19 @@ module ChefZero | |
| 24 31 | 
             
                      unless ChefZero::RSpec.server
         | 
| 25 32 | 
             
                        # Set up configuration so that clients will point to the server
         | 
| 26 33 | 
             
                        Thin::Logging.silent = true
         | 
| 27 | 
            -
                        ChefZero::RSpec.server = ChefZero::Server.new(:port => 8889, :signals => false)
         | 
| 34 | 
            +
                        ChefZero::RSpec.server = ChefZero::Server.new(:port => 8889, :signals => false, :log_requests => true)
         | 
| 28 35 | 
             
                        ChefZero::RSpec.client_key = Tempfile.new(['chef_zero_client_key', '.pem'])
         | 
| 29 36 | 
             
                        ChefZero::RSpec.client_key.write(ChefZero::PRIVATE_KEY)
         | 
| 30 37 | 
             
                        ChefZero::RSpec.client_key.close
         | 
| 31 38 | 
             
                        # Start the server
         | 
| 32 39 | 
             
                        ChefZero::RSpec.server.start_background
         | 
| 40 | 
            +
                        ChefZero::RSpec.server.on_response do |request, response|
         | 
| 41 | 
            +
                          ChefZero::RSpec.request_log << [ request, response ]
         | 
| 42 | 
            +
                        end
         | 
| 33 43 | 
             
                      else
         | 
| 34 44 | 
             
                        ChefZero::RSpec.server.clear_data
         | 
| 35 45 | 
             
                      end
         | 
| 46 | 
            +
                      ChefZero::RSpec.clear_request_log
         | 
| 36 47 |  | 
| 37 48 | 
             
                      @old_chef_server_url = Chef::Config.chef_server_url
         | 
| 38 49 | 
             
                      @old_node_name = Chef::Config.node_name
         | 
    
        data/lib/chef_zero/server.rb
    CHANGED
    
    | @@ -20,7 +20,7 @@ require 'rubygems' | |
| 20 20 | 
             
            require 'thin'
         | 
| 21 21 | 
             
            require 'openssl'
         | 
| 22 22 | 
             
            require 'chef_zero'
         | 
| 23 | 
            -
            require 'chef_zero/ | 
| 23 | 
            +
            require 'chef_zero/rest_router'
         | 
| 24 24 | 
             
            require 'timeout'
         | 
| 25 25 | 
             
            require 'chef_zero/cookbook_data'
         | 
| 26 26 |  | 
| @@ -125,6 +125,14 @@ module ChefZero | |
| 125 125 | 
             
                  end
         | 
| 126 126 | 
             
                end
         | 
| 127 127 |  | 
| 128 | 
            +
                def on_request(&block)
         | 
| 129 | 
            +
                  @on_request_proc = block
         | 
| 130 | 
            +
                end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                def on_response(&block)
         | 
| 133 | 
            +
                  @on_response_proc = block
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
             | 
| 128 136 | 
             
                # Load data in a nice, friendly form:
         | 
| 129 137 | 
             
                # {
         | 
| 130 138 | 
             
                #   'roles' => {
         | 
| @@ -205,7 +213,7 @@ module ChefZero | |
| 205 213 | 
             
                private
         | 
| 206 214 |  | 
| 207 215 | 
             
                def make_app
         | 
| 208 | 
            -
                  router =  | 
| 216 | 
            +
                  router = RestRouter.new([
         | 
| 209 217 | 
             
                    [ '/authenticate_user', AuthenticateUserEndpoint.new(self) ],
         | 
| 210 218 | 
             
                    [ '/clients', ActorsEndpoint.new(self) ],
         | 
| 211 219 | 
             
                    [ '/clients/*', ActorEndpoint.new(self) ],
         | 
| @@ -240,7 +248,18 @@ module ChefZero | |
| 240 248 | 
             
                    [ '/file_store/*', FileStoreFileEndpoint.new(self) ],
         | 
| 241 249 | 
             
                  ])
         | 
| 242 250 | 
             
                  router.not_found = NotFoundEndpoint.new
         | 
| 243 | 
            -
             | 
| 251 | 
            +
             | 
| 252 | 
            +
                  return proc do |env|
         | 
| 253 | 
            +
                    request = RestRequest.new(env)
         | 
| 254 | 
            +
                    if @on_request_proc
         | 
| 255 | 
            +
                      @on_request_proc.call(request)
         | 
| 256 | 
            +
                    end
         | 
| 257 | 
            +
                    response = router.call(request)
         | 
| 258 | 
            +
                    if @on_response_proc
         | 
| 259 | 
            +
                      @on_response_proc.call(request, response)
         | 
| 260 | 
            +
                    end
         | 
| 261 | 
            +
                    response
         | 
| 262 | 
            +
                  end
         | 
| 244 263 | 
             
                end
         | 
| 245 264 |  | 
| 246 265 | 
             
                def dejsonize_children(hash)
         | 
    
        data/lib/chef_zero/version.rb
    CHANGED
    
    
    
        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. | 
| 4 | 
            +
              version: 0.9.5
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-01- | 
| 12 | 
            +
            date: 2013-01-21 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: chef
         | 
| @@ -90,7 +90,7 @@ files: | |
| 90 90 | 
             
            - lib/chef_zero/rest_base.rb
         | 
| 91 91 | 
             
            - lib/chef_zero/rest_error_response.rb
         | 
| 92 92 | 
             
            - lib/chef_zero/rest_request.rb
         | 
| 93 | 
            -
            - lib/chef_zero/ | 
| 93 | 
            +
            - lib/chef_zero/rest_router.rb
         | 
| 94 94 | 
             
            - lib/chef_zero/rspec.rb
         | 
| 95 95 | 
             
            - lib/chef_zero/server.rb
         | 
| 96 96 | 
             
            - lib/chef_zero/solr/query/binary_operator.rb
         |