chef-zero 14.0.11 → 15.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -6
  3. data/Rakefile +9 -1
  4. data/bin/chef-zero +3 -2
  5. data/chef-zero.gemspec +5 -8
  6. data/lib/chef_zero.rb +1 -1
  7. data/lib/chef_zero/chef_data/cookbook_data.rb +1 -1
  8. data/lib/chef_zero/chef_data/data_normalizer.rb +9 -7
  9. data/lib/chef_zero/chef_data/default_creator.rb +22 -19
  10. data/lib/chef_zero/data_store/data_already_exists_error.rb +1 -1
  11. data/lib/chef_zero/data_store/data_error.rb +1 -1
  12. data/lib/chef_zero/data_store/data_not_found_error.rb +1 -1
  13. data/lib/chef_zero/data_store/default_facade.rb +4 -4
  14. data/lib/chef_zero/data_store/interface_v2.rb +1 -1
  15. data/lib/chef_zero/data_store/memory_store.rb +3 -3
  16. data/lib/chef_zero/data_store/memory_store_v2.rb +22 -14
  17. data/lib/chef_zero/data_store/raw_file_store.rb +7 -5
  18. data/lib/chef_zero/data_store/v1_to_v2_adapter.rb +11 -1
  19. data/lib/chef_zero/data_store/v2_to_v1_adapter.rb +1 -1
  20. data/lib/chef_zero/dist.rb +9 -0
  21. data/lib/chef_zero/endpoints/acl_endpoint.rb +4 -3
  22. data/lib/chef_zero/endpoints/acls_endpoint.rb +6 -5
  23. data/lib/chef_zero/endpoints/actor_default_key_endpoint.rb +2 -1
  24. data/lib/chef_zero/endpoints/actor_endpoint.rb +4 -4
  25. data/lib/chef_zero/endpoints/actor_key_endpoint.rb +1 -1
  26. data/lib/chef_zero/endpoints/actor_keys_endpoint.rb +3 -2
  27. data/lib/chef_zero/endpoints/actors_endpoint.rb +2 -2
  28. data/lib/chef_zero/endpoints/authenticate_user_endpoint.rb +3 -2
  29. data/lib/chef_zero/endpoints/container_endpoint.rb +3 -3
  30. data/lib/chef_zero/endpoints/containers_endpoint.rb +3 -3
  31. data/lib/chef_zero/endpoints/controls_endpoint.rb +3 -2
  32. data/lib/chef_zero/endpoints/cookbook_artifact_endpoint.rb +1 -1
  33. data/lib/chef_zero/endpoints/cookbook_artifact_identifier_endpoint.rb +3 -3
  34. data/lib/chef_zero/endpoints/cookbook_artifacts_endpoint.rb +7 -7
  35. data/lib/chef_zero/endpoints/cookbook_endpoint.rb +1 -1
  36. data/lib/chef_zero/endpoints/cookbook_version_endpoint.rb +8 -6
  37. data/lib/chef_zero/endpoints/cookbooks_base.rb +6 -4
  38. data/lib/chef_zero/endpoints/cookbooks_endpoint.rb +1 -1
  39. data/lib/chef_zero/endpoints/data_bag_endpoint.rb +4 -4
  40. data/lib/chef_zero/endpoints/data_bag_item_endpoint.rb +4 -4
  41. data/lib/chef_zero/endpoints/data_bags_endpoint.rb +3 -3
  42. data/lib/chef_zero/endpoints/environment_cookbook_endpoint.rb +2 -2
  43. data/lib/chef_zero/endpoints/environment_cookbook_versions_endpoint.rb +14 -11
  44. data/lib/chef_zero/endpoints/environment_cookbooks_endpoint.rb +2 -2
  45. data/lib/chef_zero/endpoints/environment_endpoint.rb +3 -3
  46. data/lib/chef_zero/endpoints/environment_nodes_endpoint.rb +2 -2
  47. data/lib/chef_zero/endpoints/environment_recipes_endpoint.rb +2 -2
  48. data/lib/chef_zero/endpoints/environment_role_endpoint.rb +2 -2
  49. data/lib/chef_zero/endpoints/file_store_file_endpoint.rb +1 -1
  50. data/lib/chef_zero/endpoints/group_endpoint.rb +3 -3
  51. data/lib/chef_zero/endpoints/groups_endpoint.rb +2 -2
  52. data/lib/chef_zero/endpoints/license_endpoint.rb +2 -2
  53. data/lib/chef_zero/endpoints/node_endpoint.rb +3 -3
  54. data/lib/chef_zero/endpoints/node_identifiers_endpoint.rb +2 -2
  55. data/lib/chef_zero/endpoints/nodes_endpoint.rb +3 -3
  56. data/lib/chef_zero/endpoints/not_found_endpoint.rb +2 -2
  57. data/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +3 -2
  58. data/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +2 -2
  59. data/lib/chef_zero/endpoints/organization_authenticate_user_endpoint.rb +2 -2
  60. data/lib/chef_zero/endpoints/organization_endpoint.rb +4 -3
  61. data/lib/chef_zero/endpoints/organization_user_base.rb +2 -2
  62. data/lib/chef_zero/endpoints/organization_user_default_key_endpoint.rb +1 -1
  63. data/lib/chef_zero/endpoints/organization_user_endpoint.rb +2 -2
  64. data/lib/chef_zero/endpoints/organization_user_key_endpoint.rb +2 -2
  65. data/lib/chef_zero/endpoints/organization_user_keys_endpoint.rb +1 -1
  66. data/lib/chef_zero/endpoints/organization_users_endpoint.rb +3 -3
  67. data/lib/chef_zero/endpoints/organization_validator_key_endpoint.rb +2 -2
  68. data/lib/chef_zero/endpoints/organizations_endpoint.rb +2 -2
  69. data/lib/chef_zero/endpoints/policies_endpoint.rb +1 -1
  70. data/lib/chef_zero/endpoints/policy_endpoint.rb +1 -1
  71. data/lib/chef_zero/endpoints/policy_group_endpoint.rb +3 -3
  72. data/lib/chef_zero/endpoints/policy_group_policy_endpoint.rb +4 -4
  73. data/lib/chef_zero/endpoints/policy_groups_endpoint.rb +3 -3
  74. data/lib/chef_zero/endpoints/policy_revision_endpoint.rb +1 -1
  75. data/lib/chef_zero/endpoints/policy_revisions_endpoint.rb +1 -1
  76. data/lib/chef_zero/endpoints/principal_endpoint.rb +3 -3
  77. data/lib/chef_zero/endpoints/rest_list_endpoint.rb +3 -3
  78. data/lib/chef_zero/endpoints/rest_object_endpoint.rb +4 -3
  79. data/lib/chef_zero/endpoints/role_endpoint.rb +3 -3
  80. data/lib/chef_zero/endpoints/role_environments_endpoint.rb +2 -2
  81. data/lib/chef_zero/endpoints/sandbox_endpoint.rb +4 -4
  82. data/lib/chef_zero/endpoints/sandboxes_endpoint.rb +2 -2
  83. data/lib/chef_zero/endpoints/search_endpoint.rb +9 -9
  84. data/lib/chef_zero/endpoints/searches_endpoint.rb +1 -1
  85. data/lib/chef_zero/endpoints/server_api_version_endpoint.rb +1 -1
  86. data/lib/chef_zero/endpoints/system_recovery_endpoint.rb +4 -4
  87. data/lib/chef_zero/endpoints/universe_endpoint.rb +3 -3
  88. data/lib/chef_zero/endpoints/user_association_request_endpoint.rb +3 -2
  89. data/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb +2 -2
  90. data/lib/chef_zero/endpoints/user_association_requests_endpoint.rb +2 -2
  91. data/lib/chef_zero/endpoints/user_organizations_endpoint.rb +2 -2
  92. data/lib/chef_zero/endpoints/version_endpoint.rb +3 -2
  93. data/lib/chef_zero/rest_base.rb +20 -16
  94. data/lib/chef_zero/rest_request.rb +10 -6
  95. data/lib/chef_zero/rest_router.rb +3 -3
  96. data/lib/chef_zero/rspec.rb +6 -5
  97. data/lib/chef_zero/server.rb +98 -93
  98. data/lib/chef_zero/socketless_server_map.rb +4 -2
  99. data/lib/chef_zero/solr/query/phrase.rb +2 -2
  100. data/lib/chef_zero/solr/query/range_query.rb +3 -3
  101. data/lib/chef_zero/solr/query/term.rb +1 -1
  102. data/lib/chef_zero/solr/solr_parser.rb +12 -10
  103. data/lib/chef_zero/version.rb +1 -1
  104. data/spec/run_oc_pedant.rb +5 -3
  105. data/spec/search_spec.rb +2 -2
  106. data/spec/socketless_server_map_spec.rb +1 -1
  107. data/spec/support/oc_pedant.rb +1 -1
  108. metadata +17 -39
@@ -1,6 +1,6 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
3
- require "chef_zero/rest_error_response"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
+ require_relative "../rest_error_response"
4
4
 
5
5
  module ChefZero
6
6
  module Endpoints
@@ -70,6 +70,7 @@ module ChefZero
70
70
  # Does this request change the value of the identity key?
71
71
  def is_rename?(request)
72
72
  return false unless (key = identity_key_value(request))
73
+
73
74
  key != request.rest_path[-1]
74
75
  end
75
76
  end
@@ -1,6 +1,6 @@
1
- require "ffi_yajl"
2
- require "chef_zero/endpoints/rest_object_endpoint"
3
- require "chef_zero/chef_data/data_normalizer"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "rest_object_endpoint"
3
+ require_relative "../chef_data/data_normalizer"
4
4
 
5
5
  module ChefZero
6
6
  module Endpoints
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -1,6 +1,6 @@
1
- require "chef_zero/rest_base"
2
- require "chef_zero/rest_error_response"
3
- require "ffi_yajl"
1
+ require_relative "../rest_base"
2
+ require_relative "../rest_error_response"
3
+ require "ffi_yajl" unless defined?(FFI_Yajl)
4
4
 
5
5
  module ChefZero
6
6
  module Endpoints
@@ -9,7 +9,7 @@ module ChefZero
9
9
  def put(request)
10
10
  existing_sandbox = FFI_Yajl::Parser.parse(get_data(request))
11
11
  existing_sandbox["checksums"].each do |checksum|
12
- if !exists_data?(request, request.rest_path[0..1] + ["file_store", "checksums", checksum])
12
+ unless exists_data?(request, request.rest_path[0..1] + ["file_store", "checksums", checksum])
13
13
  raise RestErrorResponse.new(503, "Checksum not uploaded: #{checksum}")
14
14
  end
15
15
  end
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -1,9 +1,9 @@
1
- require "ffi_yajl"
2
- require "chef_zero/endpoints/rest_object_endpoint"
3
- require "chef_zero/chef_data/data_normalizer"
4
- require "chef_zero/rest_error_response"
5
- require "chef_zero/solr/solr_parser"
6
- require "chef_zero/solr/solr_doc"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "rest_object_endpoint"
3
+ require_relative "../chef_data/data_normalizer"
4
+ require_relative "../rest_error_response"
5
+ require_relative "../solr/solr_parser"
6
+ require_relative "../solr/solr_doc"
7
7
 
8
8
  module ChefZero
9
9
  module Endpoints
@@ -30,7 +30,7 @@ module ChefZero
30
30
  if path.size > 0
31
31
  value = search_value
32
32
  path.each do |path_part|
33
- value = value[path_part] if !value.nil?
33
+ value = value[path_part] unless value.nil?
34
34
  end
35
35
  data[key] = value
36
36
  else
@@ -180,7 +180,7 @@ module ChefZero
180
180
  dest
181
181
  when Hash
182
182
  source.each do |src_key, src_value|
183
- if dest.kind_of?(Hash)
183
+ if dest.is_a?(Hash)
184
184
  if dest[src_key]
185
185
  dest[src_key] = deep_merge!(src_value, dest[src_key])
186
186
  else # dest[src_key] doesn't exist so we take whatever source has
@@ -191,7 +191,7 @@ module ChefZero
191
191
  end
192
192
  end
193
193
  when Array
194
- if dest.kind_of?(Array)
194
+ if dest.is_a?(Array)
195
195
  dest |= source
196
196
  else
197
197
  dest = source
@@ -1,4 +1,4 @@
1
- require "chef_zero/rest_base"
1
+ require_relative "../rest_base"
2
2
 
3
3
  module ChefZero
4
4
  module Endpoints
@@ -1,4 +1,4 @@
1
- require "chef_zero/rest_base"
1
+ require_relative "../rest_base"
2
2
 
3
3
  module ChefZero
4
4
  module Endpoints
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -10,13 +10,13 @@ module ChefZero
10
10
  name = request_json["username"]
11
11
  password = request_json["password"]
12
12
  user = get_data(request, request.rest_path[0..-2] + ["users", name], :nil)
13
- if !user
13
+ unless user
14
14
  raise RestErrorResponse.new(403, "Nonexistent user")
15
15
  end
16
16
 
17
17
  user = FFI_Yajl::Parser.parse(user)
18
18
  user = ChefData::DataNormalizer.normalize_user(user, name, [ "username" ], server.options[:osc_compat])
19
- if !user["recovery_authentication_enabled"]
19
+ unless user["recovery_authentication_enabled"]
20
20
  raise RestErrorResponse.new(403, "Only users with recovery_authentication_enabled=true may use /system_recovery to log in")
21
21
  end
22
22
  if user["password"] != password
@@ -1,6 +1,6 @@
1
- require "ffi_yajl"
2
- require "chef_zero/endpoints/rest_object_endpoint"
3
- require "chef_zero/chef_data/data_normalizer"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "rest_object_endpoint"
3
+ require_relative "../chef_data/data_normalizer"
4
4
 
5
5
  module ChefZero
6
6
  module Endpoints
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -11,6 +11,7 @@ module ChefZero
11
11
  if id !~ /^#{username}-(.+)/
12
12
  raise RestErrorResponse.new(400, "Association request #{id} is invalid. Must be #{username}-orgname.")
13
13
  end
14
+
14
15
  orgname = $1
15
16
 
16
17
  json = FFI_Yajl::Parser.parse(request.body)
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -1,5 +1,5 @@
1
- require "ffi_yajl"
2
- require "chef_zero/rest_base"
1
+ require "ffi_yajl" unless defined?(FFI_Yajl)
2
+ require_relative "../rest_base"
3
3
 
4
4
  module ChefZero
5
5
  module Endpoints
@@ -1,11 +1,12 @@
1
- require "chef_zero/rest_base"
1
+ require_relative "../rest_base"
2
+ require_relative "../dist"
2
3
 
3
4
  module ChefZero
4
5
  module Endpoints
5
6
  # /version
6
7
  class VersionEndpoint < RestBase
7
8
  def get(request)
8
- text_response(200, "chef-zero #{ChefZero::VERSION}\n")
9
+ text_response(200, "#{ChefZero::Dist::CLIENT} #{ChefZero::VERSION}\n")
9
10
  end
10
11
  end
11
12
  end
@@ -1,7 +1,7 @@
1
- require "chef_zero/rest_request"
2
- require "chef_zero/rest_error_response"
3
- require "chef_zero/data_store/data_not_found_error"
4
- require "chef_zero/chef_data/acl_path"
1
+ require_relative "rest_request"
2
+ require_relative "rest_error_response"
3
+ require_relative "data_store/data_not_found_error"
4
+ require_relative "chef_data/acl_path"
5
5
 
6
6
  module ChefZero
7
7
  class RestBase
@@ -30,15 +30,13 @@ module ChefZero
30
30
  }
31
31
 
32
32
  return json_response(406,
33
- response,
34
- request_version: version, response_version: -1
35
- )
33
+ response,
34
+ request_version: version, response_version: -1)
36
35
  end
37
36
  rescue ArgumentError
38
37
  json_response(406,
39
- { "username" => request.requestor },
40
- request_version: -1, response_version: -1
41
- )
38
+ { "username" => request.requestor },
39
+ request_version: -1, response_version: -1)
42
40
  end
43
41
 
44
42
  def call(request)
@@ -46,14 +44,15 @@ module ChefZero
46
44
  return response unless response.nil?
47
45
 
48
46
  method = request.method.downcase.to_sym
49
- if !respond_to?(method)
50
- accept_methods = [:get, :put, :post, :delete].select { |m| respond_to?(m) }
47
+ unless respond_to?(method)
48
+ accept_methods = %i{get put post delete}.select { |m| respond_to?(m) }
51
49
  accept_methods_str = accept_methods.map { |m| m.to_s.upcase }.join(", ")
52
- return [405, { "Content-Type" => "text/plain", "Allow" => accept_methods_str }, "Bad request method for '#{request.env['REQUEST_PATH']}': #{request.env['REQUEST_METHOD']}"]
50
+ return [405, { "Content-Type" => "text/plain", "Allow" => accept_methods_str }, "Bad request method for '#{request.env["REQUEST_PATH"]}': #{request.env["REQUEST_METHOD"]}"]
53
51
  end
54
52
  if json_only && !accepts?(request, "application", "json")
55
53
  return [406, { "Content-Type" => "text/plain" }, "Must accept application/json"]
56
54
  end
55
+
57
56
  # Dispatch to get()/post()/put()/delete()
58
57
  begin
59
58
  send(method, request)
@@ -70,14 +69,15 @@ module ChefZero
70
69
  def accepts?(request, category, type)
71
70
  # If HTTP_ACCEPT is not sent at all, assume it accepts anything
72
71
  # This parses as per http://tools.ietf.org/html/rfc7231#section-5.3
73
- return true if !request.env["HTTP_ACCEPT"]
72
+ return true unless request.env["HTTP_ACCEPT"]
73
+
74
74
  accepts = request.env["HTTP_ACCEPT"].split(/,\s*/).map { |x| x.split(";", 2)[0].strip }
75
75
  accepts.include?("#{category}/#{type}") || accepts.include?("#{category}/*") || accepts.include?("*/*")
76
76
  end
77
77
 
78
78
  def get_data(request, rest_path = nil, *options)
79
79
  rest_path ||= request.rest_path
80
- rest_path = rest_path.map { |v| URI.decode(v) }
80
+ rest_path = rest_path.map { |v| self.class.rfc2396_parser.unescape(v) }
81
81
  begin
82
82
  data_store.get(rest_path, request)
83
83
  rescue DataStore::DataNotFoundError
@@ -284,7 +284,7 @@ module ChefZero
284
284
  end
285
285
 
286
286
  def self.build_uri(base_uri, rest_path)
287
- "#{base_uri}/#{rest_path.map { |v| URI.escape(v) }.join('/')}"
287
+ "#{base_uri}/#{rest_path.map { |v| rfc2396_parser.escape(v) }.join("/")}"
288
288
  end
289
289
 
290
290
  def populate_defaults(request, response)
@@ -324,5 +324,9 @@ module ChefZero
324
324
  name.size > 255 ||
325
325
  name =~ /[+ !]/
326
326
  end
327
+
328
+ def self.rfc2396_parser
329
+ @parser ||= URI::RFC2396_Parser.new
330
+ end
327
331
  end
328
332
  end
@@ -1,8 +1,8 @@
1
1
  require "rack/request"
2
+ require "cgi"
2
3
 
3
4
  module ChefZero
4
5
  class RestRequest
5
-
6
6
  def initialize(env, rest_base_prefix = [])
7
7
  @env = env
8
8
  @rest_base_prefix = rest_base_prefix
@@ -18,7 +18,7 @@ module ChefZero
18
18
  else
19
19
  scheme = env["rack.url_scheme"]
20
20
  end
21
- @base_uri ||= "#{scheme}://#{env['HTTP_HOST']}#{env['SCRIPT_NAME']}"
21
+ @base_uri ||= "#{scheme}://#{env["HTTP_HOST"]}#{env["SCRIPT_NAME"]}"
22
22
  end
23
23
 
24
24
  def base_uri=(value)
@@ -61,24 +61,28 @@ module ChefZero
61
61
  @query_params ||= begin
62
62
  params = Rack::Request.new(env).GET
63
63
  params.keys.each do |key|
64
- params[key] = URI.unescape(params[key])
64
+ params[key] = self.class.rfc2396_parser.unescape(params[key])
65
65
  end
66
66
  params
67
67
  end
68
68
  end
69
69
 
70
70
  def to_s
71
- result = "#{method} #{rest_path.join('/')}"
71
+ result = "#{method} #{rest_path.join("/")}"
72
72
  if query_params.size > 0
73
- result << "?#{query_params.map { |k, v| "#{k}=#{v}" }.join('&')}"
73
+ result << "?#{query_params.map { |k, v| "#{k}=#{v}" }.join("&")}"
74
74
  end
75
75
  if body.chomp != ""
76
76
  result << "\n--- #{method} BODY ---\n"
77
77
  result << body
78
- result << "\n" if !body.end_with?("\n")
78
+ result << "\n" unless body.end_with?("\n")
79
79
  result << "--- END #{method} BODY ---"
80
80
  end
81
81
  result
82
82
  end
83
+
84
+ def self.rfc2396_parser
85
+ @parser ||= URI::RFC2396_Parser.new
86
+ end
83
87
  end
84
88
  end
@@ -1,13 +1,13 @@
1
- require "pp"
1
+ require "pp" unless defined?(PP)
2
2
 
3
3
  module ChefZero
4
4
  class RestRouter
5
5
  def initialize(routes)
6
6
  @routes = routes.map do |route, endpoint|
7
7
  if route =~ /\*\*$/
8
- pattern = Regexp.new("^#{route[0..-3].gsub('*', '[^/]*')}")
8
+ pattern = Regexp.new("^#{route[0..-3].gsub("*", "[^/]*")}")
9
9
  else
10
- pattern = Regexp.new("^#{route.gsub('*', '[^/]*')}$")
10
+ pattern = Regexp.new("^#{route.gsub("*", "[^/]*")}$")
11
11
  end
12
12
  [ pattern, endpoint ]
13
13
  end
@@ -1,6 +1,6 @@
1
- require "tempfile"
2
- require "chef_zero/server"
3
- require "chef_zero/rest_request"
1
+ require "tempfile" unless defined?(Tempfile)
2
+ require_relative "server"
3
+ require_relative "rest_request"
4
4
 
5
5
  module ChefZero
6
6
  module RSpec
@@ -42,7 +42,7 @@ module ChefZero
42
42
  extend RSpecClassMethods
43
43
 
44
44
  def when_the_chef_server(description, *tags, &block)
45
- context "When the Chef server #{description}", *tags do
45
+ context "When the #{ChefZero::Dist::PRODUCT} server #{description}", *tags do
46
46
  extend WhenTheChefServerClassMethods
47
47
  include WhenTheChefServerInstanceMethods
48
48
 
@@ -69,7 +69,8 @@ module ChefZero
69
69
  if chef_server_options[:server_scope] != self.class.chef_server_options[:server_scope]
70
70
  raise "server_scope: #{chef_server_options[:server_scope]} will not be honored: it can only be set on when_the_chef_server!"
71
71
  end
72
- Log.info("Starting Chef server with options #{chef_server_options}")
72
+
73
+ Log.info("Starting #{ChefZero::Dist::PRODUCT} server with options #{chef_server_options}")
73
74
 
74
75
  ChefZero::RSpec.set_server_options(chef_server_options)
75
76
 
@@ -16,96 +16,97 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require "openssl"
19
+ require "openssl" unless defined?(OpenSSL)
20
20
  require "open-uri"
21
- require "rubygems"
22
- require "timeout"
23
- require "stringio"
21
+ require "rubygems" unless defined?(Gem)
22
+ require "timeout" unless defined?(Timeout)
23
+ require "stringio" unless defined?(StringIO)
24
24
 
25
- require "rack"
26
- require "webrick"
25
+ require "rack" unless defined?(Rack)
26
+ require "webrick" unless defined?(WEBrick)
27
27
  require "webrick/https"
28
28
 
29
- require "chef_zero"
30
- require "chef_zero/socketless_server_map"
31
- require "chef_zero/chef_data/cookbook_data"
32
- require "chef_zero/chef_data/acl_path"
33
- require "chef_zero/rest_router"
34
- require "chef_zero/data_store/memory_store_v2"
35
- require "chef_zero/data_store/v1_to_v2_adapter"
36
- require "chef_zero/data_store/default_facade"
37
- require "chef_zero/version"
38
-
39
- require "chef_zero/endpoints/rest_list_endpoint"
40
- require "chef_zero/endpoints/authenticate_user_endpoint"
41
- require "chef_zero/endpoints/acls_endpoint"
42
- require "chef_zero/endpoints/acl_endpoint"
43
- require "chef_zero/endpoints/actor_endpoint"
44
- require "chef_zero/endpoints/actors_endpoint"
45
- require "chef_zero/endpoints/actor_key_endpoint"
46
- require "chef_zero/endpoints/organization_user_key_endpoint"
47
- require "chef_zero/endpoints/organization_user_default_key_endpoint"
48
- require "chef_zero/endpoints/organization_user_keys_endpoint"
49
- require "chef_zero/endpoints/actor_default_key_endpoint"
50
- require "chef_zero/endpoints/actor_keys_endpoint"
51
- require "chef_zero/endpoints/cookbooks_endpoint"
52
- require "chef_zero/endpoints/cookbook_endpoint"
53
- require "chef_zero/endpoints/cookbook_version_endpoint"
54
- require "chef_zero/endpoints/cookbook_artifacts_endpoint"
55
- require "chef_zero/endpoints/cookbook_artifact_endpoint"
56
- require "chef_zero/endpoints/cookbook_artifact_identifier_endpoint"
57
- require "chef_zero/endpoints/containers_endpoint"
58
- require "chef_zero/endpoints/container_endpoint"
59
- require "chef_zero/endpoints/controls_endpoint"
60
- require "chef_zero/endpoints/dummy_endpoint"
61
- require "chef_zero/endpoints/data_bags_endpoint"
62
- require "chef_zero/endpoints/data_bag_endpoint"
63
- require "chef_zero/endpoints/data_bag_item_endpoint"
64
- require "chef_zero/endpoints/groups_endpoint"
65
- require "chef_zero/endpoints/group_endpoint"
66
- require "chef_zero/endpoints/environment_endpoint"
67
- require "chef_zero/endpoints/environment_cookbooks_endpoint"
68
- require "chef_zero/endpoints/environment_cookbook_endpoint"
69
- require "chef_zero/endpoints/environment_cookbook_versions_endpoint"
70
- require "chef_zero/endpoints/environment_nodes_endpoint"
71
- require "chef_zero/endpoints/environment_recipes_endpoint"
72
- require "chef_zero/endpoints/environment_role_endpoint"
73
- require "chef_zero/endpoints/license_endpoint"
74
- require "chef_zero/endpoints/node_endpoint"
75
- require "chef_zero/endpoints/nodes_endpoint"
76
- require "chef_zero/endpoints/node_identifiers_endpoint"
77
- require "chef_zero/endpoints/organizations_endpoint"
78
- require "chef_zero/endpoints/organization_endpoint"
79
- require "chef_zero/endpoints/organization_association_requests_endpoint"
80
- require "chef_zero/endpoints/organization_association_request_endpoint"
81
- require "chef_zero/endpoints/organization_authenticate_user_endpoint"
82
- require "chef_zero/endpoints/organization_users_endpoint"
83
- require "chef_zero/endpoints/organization_user_endpoint"
84
- require "chef_zero/endpoints/organization_validator_key_endpoint"
85
- require "chef_zero/endpoints/policies_endpoint"
86
- require "chef_zero/endpoints/policy_endpoint"
87
- require "chef_zero/endpoints/policy_revisions_endpoint"
88
- require "chef_zero/endpoints/policy_revision_endpoint"
89
- require "chef_zero/endpoints/policy_groups_endpoint"
90
- require "chef_zero/endpoints/policy_group_endpoint"
91
- require "chef_zero/endpoints/policy_group_policy_endpoint"
92
- require "chef_zero/endpoints/principal_endpoint"
93
- require "chef_zero/endpoints/role_endpoint"
94
- require "chef_zero/endpoints/role_environments_endpoint"
95
- require "chef_zero/endpoints/sandboxes_endpoint"
96
- require "chef_zero/endpoints/sandbox_endpoint"
97
- require "chef_zero/endpoints/searches_endpoint"
98
- require "chef_zero/endpoints/search_endpoint"
99
- require "chef_zero/endpoints/system_recovery_endpoint"
100
- require "chef_zero/endpoints/user_association_requests_endpoint"
101
- require "chef_zero/endpoints/user_association_requests_count_endpoint"
102
- require "chef_zero/endpoints/user_association_request_endpoint"
103
- require "chef_zero/endpoints/user_organizations_endpoint"
104
- require "chef_zero/endpoints/file_store_file_endpoint"
105
- require "chef_zero/endpoints/not_found_endpoint"
106
- require "chef_zero/endpoints/version_endpoint"
107
- require "chef_zero/endpoints/server_api_version_endpoint"
108
- require "chef_zero/endpoints/universe_endpoint"
29
+ require_relative "../chef_zero"
30
+ require_relative "socketless_server_map"
31
+ require_relative "chef_data/cookbook_data"
32
+ require_relative "chef_data/acl_path"
33
+ require_relative "rest_router"
34
+ require_relative "data_store/memory_store_v2"
35
+ require_relative "data_store/v1_to_v2_adapter"
36
+ require_relative "data_store/default_facade"
37
+ require_relative "version"
38
+ require "chef_zero/dist.rb"
39
+
40
+ require_relative "endpoints/rest_list_endpoint"
41
+ require_relative "endpoints/authenticate_user_endpoint"
42
+ require_relative "endpoints/acls_endpoint"
43
+ require_relative "endpoints/acl_endpoint"
44
+ require_relative "endpoints/actor_endpoint"
45
+ require_relative "endpoints/actors_endpoint"
46
+ require_relative "endpoints/actor_key_endpoint"
47
+ require_relative "endpoints/organization_user_key_endpoint"
48
+ require_relative "endpoints/organization_user_default_key_endpoint"
49
+ require_relative "endpoints/organization_user_keys_endpoint"
50
+ require_relative "endpoints/actor_default_key_endpoint"
51
+ require_relative "endpoints/actor_keys_endpoint"
52
+ require_relative "endpoints/cookbooks_endpoint"
53
+ require_relative "endpoints/cookbook_endpoint"
54
+ require_relative "endpoints/cookbook_version_endpoint"
55
+ require_relative "endpoints/cookbook_artifacts_endpoint"
56
+ require_relative "endpoints/cookbook_artifact_endpoint"
57
+ require_relative "endpoints/cookbook_artifact_identifier_endpoint"
58
+ require_relative "endpoints/containers_endpoint"
59
+ require_relative "endpoints/container_endpoint"
60
+ require_relative "endpoints/controls_endpoint"
61
+ require_relative "endpoints/dummy_endpoint"
62
+ require_relative "endpoints/data_bags_endpoint"
63
+ require_relative "endpoints/data_bag_endpoint"
64
+ require_relative "endpoints/data_bag_item_endpoint"
65
+ require_relative "endpoints/groups_endpoint"
66
+ require_relative "endpoints/group_endpoint"
67
+ require_relative "endpoints/environment_endpoint"
68
+ require_relative "endpoints/environment_cookbooks_endpoint"
69
+ require_relative "endpoints/environment_cookbook_endpoint"
70
+ require_relative "endpoints/environment_cookbook_versions_endpoint"
71
+ require_relative "endpoints/environment_nodes_endpoint"
72
+ require_relative "endpoints/environment_recipes_endpoint"
73
+ require_relative "endpoints/environment_role_endpoint"
74
+ require_relative "endpoints/license_endpoint"
75
+ require_relative "endpoints/node_endpoint"
76
+ require_relative "endpoints/nodes_endpoint"
77
+ require_relative "endpoints/node_identifiers_endpoint"
78
+ require_relative "endpoints/organizations_endpoint"
79
+ require_relative "endpoints/organization_endpoint"
80
+ require_relative "endpoints/organization_association_requests_endpoint"
81
+ require_relative "endpoints/organization_association_request_endpoint"
82
+ require_relative "endpoints/organization_authenticate_user_endpoint"
83
+ require_relative "endpoints/organization_users_endpoint"
84
+ require_relative "endpoints/organization_user_endpoint"
85
+ require_relative "endpoints/organization_validator_key_endpoint"
86
+ require_relative "endpoints/policies_endpoint"
87
+ require_relative "endpoints/policy_endpoint"
88
+ require_relative "endpoints/policy_revisions_endpoint"
89
+ require_relative "endpoints/policy_revision_endpoint"
90
+ require_relative "endpoints/policy_groups_endpoint"
91
+ require_relative "endpoints/policy_group_endpoint"
92
+ require_relative "endpoints/policy_group_policy_endpoint"
93
+ require_relative "endpoints/principal_endpoint"
94
+ require_relative "endpoints/role_endpoint"
95
+ require_relative "endpoints/role_environments_endpoint"
96
+ require_relative "endpoints/sandboxes_endpoint"
97
+ require_relative "endpoints/sandbox_endpoint"
98
+ require_relative "endpoints/searches_endpoint"
99
+ require_relative "endpoints/search_endpoint"
100
+ require_relative "endpoints/system_recovery_endpoint"
101
+ require_relative "endpoints/user_association_requests_endpoint"
102
+ require_relative "endpoints/user_association_requests_count_endpoint"
103
+ require_relative "endpoints/user_association_request_endpoint"
104
+ require_relative "endpoints/user_organizations_endpoint"
105
+ require_relative "endpoints/file_store_file_endpoint"
106
+ require_relative "endpoints/not_found_endpoint"
107
+ require_relative "endpoints/version_endpoint"
108
+ require_relative "endpoints/server_api_version_endpoint"
109
+ require_relative "endpoints/universe_endpoint"
109
110
 
110
111
  module ChefZero
111
112
 
@@ -175,7 +176,8 @@ module ChefZero
175
176
  end
176
177
 
177
178
  def local_mode_url
178
- raise "Port not yet set, cannot generate URL" unless port.kind_of?(Integer)
179
+ raise "Port not yet set, cannot generate URL" unless port.is_a?(Integer)
180
+
179
181
  "chefzero://localhost:#{port}"
180
182
  end
181
183
 
@@ -231,7 +233,7 @@ module ChefZero
231
233
  if publish
232
234
  output = publish.respond_to?(:puts) ? publish : STDOUT
233
235
  output.puts <<-EOH.gsub(/^ {10}/, "")
234
- >> Starting Chef Zero (v#{ChefZero::VERSION})...
236
+ >> Starting #{ChefZero::Dist::PRODUCT} (v#{ChefZero::VERSION})...
235
237
  EOH
236
238
  end
237
239
 
@@ -248,7 +250,7 @@ module ChefZero
248
250
 
249
251
  %w{INT TERM}.each do |signal|
250
252
  Signal.trap(signal) do
251
- puts "\n>> Stopping Chef Zero..."
253
+ puts "\n>> Stopping #{ChefZero::Dist::PRODUCT}..."
252
254
  @server.shutdown
253
255
  end
254
256
  end
@@ -274,7 +276,7 @@ module ChefZero
274
276
  true
275
277
  rescue Errno::EADDRINUSE
276
278
  ChefZero::Log.warn("Port #{port} not available")
277
- @server.listeners.each { |l| l.close }
279
+ @server.listeners.each(&:close)
278
280
  @server.listeners.clear
279
281
  false
280
282
  end
@@ -304,7 +306,7 @@ module ChefZero
304
306
  break
305
307
  end
306
308
  end
307
- if !@port
309
+ unless @port
308
310
  raise Errno::EADDRINUSE,
309
311
  "No port in :port range #{options[:port]} is available"
310
312
  end
@@ -362,7 +364,7 @@ module ChefZero
362
364
  end
363
365
  rescue Timeout::Error
364
366
  if @thread
365
- ChefZero::Log.error("Chef Zero did not stop within #{wait} seconds! Killing...")
367
+ ChefZero::Log.error("#{ChefZero::Dist::PRODUCT} did not stop within #{wait} seconds! Killing...")
366
368
  @thread.kill
367
369
  SocketlessServerMap.deregister(port)
368
370
  end
@@ -500,11 +502,13 @@ module ChefZero
500
502
  else
501
503
  cookbook_data = ChefData::CookbookData.to_hash(cookbook, name_version)
502
504
  end
503
- raise "No version specified" if !cookbook_data[:version]
505
+ raise "No version specified" unless cookbook_data[:version]
506
+
504
507
  data_store.create_dir(["organizations", org_name, cookbook_type], cookbook_data[:cookbook_name], :recursive)
505
508
  data_store.set(["organizations", org_name, cookbook_type, cookbook_data[:cookbook_name], cookbook_data[:version]], FFI_Yajl::Encoder.encode(cookbook_data, pretty: true), :create)
506
509
  cookbook_data.values.each do |files|
507
510
  next unless files.is_a? Array
511
+
508
512
  files.each do |file|
509
513
  data_store.set(["organizations", org_name, "file_store", "checksums", file[:checksum]], get_file(cookbook, file[:path]), :create)
510
514
  end
@@ -641,6 +645,7 @@ module ChefZero
641
645
 
642
646
  def app
643
647
  return @app if @app
648
+
644
649
  router = RestRouter.new(endpoints)
645
650
  router.not_found = NotFoundEndpoint.new
646
651