chef-api 0.8.0 → 0.10.7
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 +4 -4
- data/lib/chef-api.rb +19 -20
- data/lib/chef-api/aclable.rb +35 -0
- data/lib/chef-api/authentication.rb +23 -25
- data/lib/chef-api/configurable.rb +14 -14
- data/lib/chef-api/connection.rb +68 -67
- data/lib/chef-api/defaults.rb +25 -24
- data/lib/chef-api/error_collection.rb +1 -1
- data/lib/chef-api/errors.rb +3 -3
- data/lib/chef-api/log.rb +7 -0
- data/lib/chef-api/multipart.rb +17 -17
- data/lib/chef-api/resource.rb +17 -15
- data/lib/chef-api/resources/base.rb +22 -22
- data/lib/chef-api/resources/client.rb +5 -3
- data/lib/chef-api/resources/collection_proxy.rb +4 -3
- data/lib/chef-api/resources/cookbook.rb +2 -2
- data/lib/chef-api/resources/cookbook_version.rb +1 -1
- data/lib/chef-api/resources/data_bag.rb +4 -4
- data/lib/chef-api/resources/data_bag_item.rb +2 -3
- data/lib/chef-api/resources/environment.rb +1 -1
- data/lib/chef-api/resources/group.rb +15 -0
- data/lib/chef-api/resources/node.rb +11 -8
- data/lib/chef-api/resources/organization.rb +2 -2
- data/lib/chef-api/resources/partial_search.rb +4 -4
- data/lib/chef-api/resources/principal.rb +1 -1
- data/lib/chef-api/resources/role.rb +2 -1
- data/lib/chef-api/resources/search.rb +6 -6
- data/lib/chef-api/resources/user.rb +3 -3
- data/lib/chef-api/util.rb +8 -8
- data/lib/chef-api/validator.rb +3 -3
- data/lib/chef-api/validators/base.rb +3 -3
- data/lib/chef-api/validators/required.rb +1 -1
- data/lib/chef-api/validators/type.rb +1 -1
- data/lib/chef-api/version.rb +1 -1
- metadata +25 -58
- data/.gitignore +0 -21
- data/.travis.yml +0 -18
- data/CHANGELOG.md +0 -63
- data/Gemfile +0 -12
- data/README.md +0 -352
- data/Rakefile +0 -11
- data/chef-api.gemspec +0 -25
- data/spec/integration/resources/client_spec.rb +0 -62
- data/spec/integration/resources/environment_spec.rb +0 -8
- data/spec/integration/resources/node_spec.rb +0 -8
- data/spec/integration/resources/partial_search_spec.rb +0 -23
- data/spec/integration/resources/role_spec.rb +0 -8
- data/spec/integration/resources/search_spec.rb +0 -21
- data/spec/integration/resources/user_spec.rb +0 -8
- data/spec/spec_helper.rb +0 -32
- data/spec/support/chef_server.rb +0 -198
- data/spec/support/cookbook.tar.gz +0 -0
- data/spec/support/shared/chef_api_resource.rb +0 -91
- data/spec/support/user.pem +0 -27
- data/spec/unit/authentication_spec.rb +0 -70
- data/spec/unit/defaults_spec.rb +0 -60
- data/spec/unit/errors_spec.rb +0 -294
- data/spec/unit/resources/base_spec.rb +0 -49
- data/spec/unit/resources/client_spec.rb +0 -53
- data/spec/unit/resources/connection_spec.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d924ca79422311f6742cb0c5a247faec5384e9dce483e09137011053edcd0e0b
|
4
|
+
data.tar.gz: b712903d1f9081794bb836ce4d2109a903fa53ea1ff99b337b91192cef9a16cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a16fd64fa33993a05a5e2e28dbfa98558103417ba2ea2d6f75743d4ed3bc1e4d6d626ba9b130ecf655d3142185da45a420e126152f44f67c8477dd1c412f998a
|
7
|
+
data.tar.gz: 5c2f16382bb8086d9998f3f20edcac97df9600459b4c18f06e74b82c003c161f4c980875a8f3be9c098f4794779d5a571e32041acac6f65b891ba9061f784af8
|
data/lib/chef-api.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
|
1
|
+
require "json"
|
2
|
+
require "pathname"
|
3
|
+
require_relative "chef-api/log"
|
4
|
+
require_relative "chef-api/version"
|
5
5
|
|
6
6
|
module ChefAPI
|
7
|
-
autoload :Authentication,
|
8
|
-
autoload :Boolean,
|
9
|
-
autoload :Configurable,
|
10
|
-
autoload :Connection,
|
11
|
-
autoload :Defaults,
|
12
|
-
autoload :Error,
|
13
|
-
autoload :ErrorCollection,
|
14
|
-
autoload :Multipart,
|
15
|
-
autoload :Resource,
|
16
|
-
autoload :Schema,
|
17
|
-
autoload :Util,
|
18
|
-
autoload :Validator,
|
7
|
+
autoload :Authentication, "chef-api/authentication"
|
8
|
+
autoload :Boolean, "chef-api/boolean"
|
9
|
+
autoload :Configurable, "chef-api/configurable"
|
10
|
+
autoload :Connection, "chef-api/connection"
|
11
|
+
autoload :Defaults, "chef-api/defaults"
|
12
|
+
autoload :Error, "chef-api/errors"
|
13
|
+
autoload :ErrorCollection, "chef-api/error_collection"
|
14
|
+
autoload :Multipart, "chef-api/multipart"
|
15
|
+
autoload :Resource, "chef-api/resource"
|
16
|
+
autoload :Schema, "chef-api/schema"
|
17
|
+
autoload :Util, "chef-api/util"
|
18
|
+
autoload :Validator, "chef-api/validator"
|
19
19
|
|
20
20
|
#
|
21
21
|
# @todo Document this and why it's important
|
@@ -35,7 +35,7 @@ module ChefAPI
|
|
35
35
|
# the log level to set
|
36
36
|
#
|
37
37
|
def log_level=(level)
|
38
|
-
|
38
|
+
ChefAPI::Log.level = level
|
39
39
|
end
|
40
40
|
|
41
41
|
#
|
@@ -44,7 +44,7 @@ module ChefAPI
|
|
44
44
|
# @return [Symbol]
|
45
45
|
#
|
46
46
|
def log_level
|
47
|
-
|
47
|
+
ChefAPI::Log.level
|
48
48
|
end
|
49
49
|
|
50
50
|
#
|
@@ -54,7 +54,7 @@ module ChefAPI
|
|
54
54
|
# @return [Pathname]
|
55
55
|
#
|
56
56
|
def root
|
57
|
-
@root ||= Pathname.new(File.expand_path(
|
57
|
+
@root ||= Pathname.new(File.expand_path("../../", __FILE__))
|
58
58
|
end
|
59
59
|
|
60
60
|
#
|
@@ -93,4 +93,3 @@ end
|
|
93
93
|
|
94
94
|
# Load the initial default values
|
95
95
|
ChefAPI.setup
|
96
|
-
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ChefAPI
|
2
|
+
module AclAble
|
3
|
+
def acl_path
|
4
|
+
resource_path + "/_acl"
|
5
|
+
end
|
6
|
+
|
7
|
+
def load_acl
|
8
|
+
data = self.class.connection.get(acl_path)
|
9
|
+
# make deep copy
|
10
|
+
@orig_acl_data = Marshal.load(Marshal.dump(data))
|
11
|
+
data.freeze
|
12
|
+
@acl = data
|
13
|
+
end
|
14
|
+
|
15
|
+
def acl
|
16
|
+
unless @acl
|
17
|
+
load_acl
|
18
|
+
end
|
19
|
+
@acl
|
20
|
+
end
|
21
|
+
|
22
|
+
def save!
|
23
|
+
super
|
24
|
+
if @acl != @orig_acl_data
|
25
|
+
%w{create update grant read delete}.each { |action|
|
26
|
+
if @acl[action] != @orig_acl_data[action]
|
27
|
+
url = "#{acl_path}/#{action}"
|
28
|
+
self.class.connection.put(url, { action => @acl[action] }.to_json)
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "base64"
|
2
|
+
require "digest"
|
3
|
+
require "openssl"
|
4
|
+
require "time"
|
5
5
|
|
6
6
|
#
|
7
7
|
# DEBUG steps:
|
@@ -11,20 +11,19 @@ require 'time'
|
|
11
11
|
|
12
12
|
module ChefAPI
|
13
13
|
class Authentication
|
14
|
-
include Logify
|
15
14
|
|
16
15
|
# @todo: Enable this in the future when Mixlib::Authentication supports
|
17
16
|
# signing the full request body instead of just the uploaded file parameter.
|
18
17
|
SIGN_FULL_BODY = false
|
19
18
|
|
20
|
-
SIGNATURE =
|
19
|
+
SIGNATURE = "algorithm=sha1;version=1.0;".freeze
|
21
20
|
|
22
21
|
# Headers
|
23
|
-
X_OPS_SIGN =
|
24
|
-
X_OPS_USERID =
|
25
|
-
X_OPS_TIMESTAMP =
|
26
|
-
X_OPS_CONTENT_HASH =
|
27
|
-
X_OPS_AUTHORIZATION =
|
22
|
+
X_OPS_SIGN = "X-Ops-Sign".freeze
|
23
|
+
X_OPS_USERID = "X-Ops-Userid".freeze
|
24
|
+
X_OPS_TIMESTAMP = "X-Ops-Timestamp".freeze
|
25
|
+
X_OPS_CONTENT_HASH = "X-Ops-Content-Hash".freeze
|
26
|
+
X_OPS_AUTHORIZATION = "X-Ops-Authorization".freeze
|
28
27
|
|
29
28
|
class << self
|
30
29
|
#
|
@@ -96,9 +95,9 @@ module ChefAPI
|
|
96
95
|
#
|
97
96
|
def headers
|
98
97
|
{
|
99
|
-
X_OPS_SIGN
|
100
|
-
X_OPS_USERID
|
101
|
-
X_OPS_TIMESTAMP
|
98
|
+
X_OPS_SIGN => SIGNATURE,
|
99
|
+
X_OPS_USERID => @user,
|
100
|
+
X_OPS_TIMESTAMP => canonical_timestamp,
|
102
101
|
X_OPS_CONTENT_HASH => content_hash,
|
103
102
|
}.merge(signature_lines)
|
104
103
|
end
|
@@ -114,7 +113,7 @@ module ChefAPI
|
|
114
113
|
return @content_hash if @content_hash
|
115
114
|
|
116
115
|
if SIGN_FULL_BODY
|
117
|
-
@content_hash = hash(@body ||
|
116
|
+
@content_hash = hash(@body || "").chomp
|
118
117
|
else
|
119
118
|
if @body.is_a?(Multipart::MultiIO)
|
120
119
|
filepart = @body.ios.find { |io| io.is_a?(Multipart::MultiIO) }
|
@@ -122,7 +121,7 @@ module ChefAPI
|
|
122
121
|
|
123
122
|
@content_hash = hash(file).chomp
|
124
123
|
else
|
125
|
-
@content_hash = hash(@body ||
|
124
|
+
@content_hash = hash(@body || "").chomp
|
126
125
|
end
|
127
126
|
end
|
128
127
|
|
@@ -148,29 +147,28 @@ module ChefAPI
|
|
148
147
|
def canonical_key
|
149
148
|
return @canonical_key if @canonical_key
|
150
149
|
|
151
|
-
|
150
|
+
ChefAPI::Log.info "Parsing private key..."
|
152
151
|
|
153
152
|
if @key.nil?
|
154
|
-
|
155
|
-
raise
|
153
|
+
ChefAPI::Log.warn "No private key given!"
|
154
|
+
raise "No private key given!"
|
156
155
|
end
|
157
156
|
|
158
157
|
if @key.is_a?(OpenSSL::PKey::RSA)
|
159
|
-
|
158
|
+
ChefAPI::Log.debug "Detected private key is an OpenSSL Ruby object"
|
160
159
|
@canonical_key = @key
|
161
|
-
elsif @key =~ /(.+)\.pem$/ || File.
|
162
|
-
|
160
|
+
elsif @key =~ /(.+)\.pem$/ || File.exist?(File.expand_path(@key))
|
161
|
+
ChefAPI::Log.debug "Detected private key is the path to a file"
|
163
162
|
contents = File.read(File.expand_path(@key))
|
164
163
|
@canonical_key = OpenSSL::PKey::RSA.new(contents)
|
165
164
|
else
|
166
|
-
|
165
|
+
ChefAPI::Log.debug "Detected private key was the literal string key"
|
167
166
|
@canonical_key = OpenSSL::PKey::RSA.new(@key)
|
168
167
|
end
|
169
168
|
|
170
169
|
@canonical_key
|
171
170
|
end
|
172
171
|
|
173
|
-
|
174
172
|
#
|
175
173
|
# The canonical path, with duplicate and trailing slashes removed. This
|
176
174
|
# value is then hashed.
|
@@ -181,7 +179,7 @@ module ChefAPI
|
|
181
179
|
# @return [String]
|
182
180
|
#
|
183
181
|
def canonical_path
|
184
|
-
@canonical_path ||= hash(@path.squeeze(
|
182
|
+
@canonical_path ||= hash(@path.squeeze("/").gsub(%r{(/)+$}, "")).chomp
|
185
183
|
end
|
186
184
|
|
187
185
|
#
|
@@ -11,20 +11,20 @@ module ChefAPI
|
|
11
11
|
# @return [Array<Symbol>]
|
12
12
|
#
|
13
13
|
def keys
|
14
|
-
@keys ||=
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
14
|
+
@keys ||= %i{
|
15
|
+
endpoint
|
16
|
+
flavor
|
17
|
+
client
|
18
|
+
key
|
19
|
+
proxy_address
|
20
|
+
proxy_password
|
21
|
+
proxy_port
|
22
|
+
proxy_username
|
23
|
+
ssl_pem_file
|
24
|
+
ssl_verify
|
25
|
+
user_agent
|
26
|
+
read_timeout
|
27
|
+
}
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
data/lib/chef-api/connection.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "net/http"
|
2
|
+
require "net/https"
|
3
|
+
require "openssl"
|
4
|
+
require "uri"
|
5
5
|
|
6
6
|
module ChefAPI
|
7
7
|
#
|
@@ -34,20 +34,21 @@ module ChefAPI
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
include Logify
|
38
37
|
include ChefAPI::Configurable
|
39
38
|
|
40
|
-
proxy :clients,
|
41
|
-
proxy :cookbooks,
|
42
|
-
proxy :data_bags,
|
43
|
-
proxy :
|
44
|
-
proxy :
|
45
|
-
proxy :
|
46
|
-
proxy :
|
47
|
-
proxy :
|
48
|
-
proxy :
|
49
|
-
proxy :
|
50
|
-
proxy :
|
39
|
+
proxy :clients, "Resource::Client"
|
40
|
+
proxy :cookbooks, "Resource::Cookbook"
|
41
|
+
proxy :data_bags, "Resource::DataBag"
|
42
|
+
proxy :data_bag_item, "Resource::DataBagItem"
|
43
|
+
proxy :environments, "Resource::Environment"
|
44
|
+
proxy :groups, "Resource::Group"
|
45
|
+
proxy :nodes, "Resource::Node"
|
46
|
+
proxy :partial_search, "Resource::PartialSearch"
|
47
|
+
proxy :principals, "Resource::Principal"
|
48
|
+
proxy :roles, "Resource::Role"
|
49
|
+
proxy :search, "Resource::Search"
|
50
|
+
proxy :users, "Resource::User"
|
51
|
+
proxy :organizations, "Resource::Organization"
|
51
52
|
|
52
53
|
#
|
53
54
|
# Create a new ChefAPI Connection with the given options. Any options
|
@@ -73,9 +74,9 @@ module ChefAPI
|
|
73
74
|
# Use any options given, but fall back to the defaults set on the module
|
74
75
|
ChefAPI::Configurable.keys.each do |key|
|
75
76
|
value = if options[key].nil?
|
76
|
-
|
77
|
-
|
78
|
-
|
77
|
+
ChefAPI.instance_variable_get(:"@#{key}")
|
78
|
+
else
|
79
|
+
options[key]
|
79
80
|
end
|
80
81
|
|
81
82
|
instance_variable_set(:"@#{key}", value)
|
@@ -196,11 +197,11 @@ module ChefAPI
|
|
196
197
|
# the response body
|
197
198
|
#
|
198
199
|
def request(verb, path, data = {}, params = {}, request_options = {})
|
199
|
-
|
200
|
-
|
200
|
+
ChefAPI::Log.info "#{verb.to_s.upcase} #{path}..."
|
201
|
+
ChefAPI::Log.debug "Chef flavor: #{flavor.inspect}"
|
201
202
|
|
202
203
|
# Build the URI and request object from the given information
|
203
|
-
if
|
204
|
+
if %i{delete get}.include?(verb)
|
204
205
|
uri = build_uri(verb, path, data)
|
205
206
|
else
|
206
207
|
uri = build_uri(verb, path, params)
|
@@ -211,38 +212,38 @@ module ChefAPI
|
|
211
212
|
add_request_headers(request)
|
212
213
|
|
213
214
|
# Setup PATCH/POST/PUT
|
214
|
-
if
|
215
|
+
if %i{patch post put}.include?(verb)
|
215
216
|
if data.respond_to?(:read)
|
216
|
-
|
217
|
+
ChefAPI::Log.info "Detected file/io presence"
|
217
218
|
request.body_stream = data
|
218
219
|
elsif data.is_a?(Hash)
|
219
220
|
# If any of the values in the hash are File-like, assume this is a
|
220
221
|
# multi-part post
|
221
222
|
if data.values.any? { |value| value.respond_to?(:read) }
|
222
|
-
|
223
|
+
ChefAPI::Log.info "Detected multipart body"
|
223
224
|
|
224
225
|
multipart = Multipart::Body.new(data)
|
225
226
|
|
226
|
-
|
227
|
-
|
227
|
+
ChefAPI::Log.debug "Content-Type: #{multipart.content_type}"
|
228
|
+
ChefAPI::Log.debug "Content-Length: #{multipart.content_length}"
|
228
229
|
|
229
230
|
request.content_length = multipart.content_length
|
230
231
|
request.content_type = multipart.content_type
|
231
232
|
|
232
233
|
request.body_stream = multipart.stream
|
233
234
|
else
|
234
|
-
|
235
|
+
ChefAPI::Log.info "Detected form data"
|
235
236
|
request.form_data = data
|
236
237
|
end
|
237
238
|
else
|
238
|
-
|
239
|
+
ChefAPI::Log.info "Detected regular body"
|
239
240
|
request.body = data
|
240
241
|
end
|
241
242
|
end
|
242
243
|
|
243
244
|
# Sign the request
|
244
245
|
if request_options[:sign] == false
|
245
|
-
|
246
|
+
ChefAPI::Log.info "Skipping signed header authentication (user requested)..."
|
246
247
|
else
|
247
248
|
add_signing_headers(verb, uri.path, request)
|
248
249
|
end
|
@@ -259,7 +260,7 @@ module ChefAPI
|
|
259
260
|
connection.read_timeout = read_timeout if read_timeout
|
260
261
|
|
261
262
|
# Apply SSL, if applicable
|
262
|
-
if uri.scheme ==
|
263
|
+
if uri.scheme == "https"
|
263
264
|
# Turn on SSL
|
264
265
|
connection.use_ssl = true
|
265
266
|
|
@@ -274,8 +275,8 @@ module ChefAPI
|
|
274
275
|
# Naughty, naughty, naughty! Don't blame when when someone hops in
|
275
276
|
# and executes a MITM attack!
|
276
277
|
unless ssl_verify
|
277
|
-
|
278
|
-
|
278
|
+
ChefAPI::Log.warn "Disabling SSL verification..."
|
279
|
+
ChefAPI::Log.warn "Neither ChefAPI nor the maintainers are responsible for " \
|
279
280
|
"damages incurred as a result of disabling SSL verification. " \
|
280
281
|
"Please use this with extreme caution, or consider specifying " \
|
281
282
|
"a custom certificate using `config.ssl_pem_file'."
|
@@ -288,13 +289,13 @@ module ChefAPI
|
|
288
289
|
connection.start do |http|
|
289
290
|
response = http.request(request)
|
290
291
|
|
291
|
-
|
292
|
-
|
292
|
+
ChefAPI::Log.debug "Raw response:"
|
293
|
+
ChefAPI::Log.debug response.body
|
293
294
|
|
294
295
|
case response
|
295
296
|
when Net::HTTPRedirection
|
296
|
-
redirect = URI.parse(response[
|
297
|
-
|
297
|
+
redirect = URI.parse(response["location"]).to_s
|
298
|
+
ChefAPI::Log.debug "Performing HTTP redirect to #{redirect}"
|
298
299
|
request(verb, redirect, data)
|
299
300
|
when Net::HTTPSuccess
|
300
301
|
success(response)
|
@@ -303,7 +304,7 @@ module ChefAPI
|
|
303
304
|
end
|
304
305
|
end
|
305
306
|
rescue SocketError, Errno::ECONNREFUSED, EOFError
|
306
|
-
|
307
|
+
ChefAPI::Log.warn "Unable to reach the Chef Server"
|
307
308
|
raise Error::HTTPServerUnavailable.new
|
308
309
|
end
|
309
310
|
|
@@ -326,14 +327,14 @@ module ChefAPI
|
|
326
327
|
# @return [URI]
|
327
328
|
#
|
328
329
|
def build_uri(verb, path, params = {})
|
329
|
-
|
330
|
+
ChefAPI::Log.info "Building URI..."
|
330
331
|
|
331
332
|
# Add any query string parameters
|
332
333
|
if querystring = to_query_string(params)
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
path = [path, querystring].compact.join(
|
334
|
+
ChefAPI::Log.debug "Detected verb deserves a querystring"
|
335
|
+
ChefAPI::Log.debug "Building querystring using #{params.inspect}"
|
336
|
+
ChefAPI::Log.debug "Compiled querystring is #{querystring.inspect}"
|
337
|
+
path = [path, querystring].compact.join("?")
|
337
338
|
end
|
338
339
|
|
339
340
|
# Parse the URI
|
@@ -341,8 +342,8 @@ module ChefAPI
|
|
341
342
|
|
342
343
|
# Don't merge absolute URLs
|
343
344
|
unless uri.absolute?
|
344
|
-
|
345
|
-
|
345
|
+
ChefAPI::Log.debug "Detected URI is relative"
|
346
|
+
ChefAPI::Log.debug "Appending #{path} to #{endpoint}"
|
346
347
|
uri = URI.parse(File.join(endpoint, path))
|
347
348
|
end
|
348
349
|
|
@@ -376,7 +377,7 @@ module ChefAPI
|
|
376
377
|
def to_query_string(hash)
|
377
378
|
hash.map do |key, value|
|
378
379
|
"#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}"
|
379
|
-
end.join(
|
380
|
+
end.join("&")[/.+/]
|
380
381
|
end
|
381
382
|
|
382
383
|
private
|
@@ -393,15 +394,15 @@ module ChefAPI
|
|
393
394
|
# the parsed response, as an object
|
394
395
|
#
|
395
396
|
def success(response)
|
396
|
-
|
397
|
+
ChefAPI::Log.info "Parsing response as success..."
|
397
398
|
|
398
|
-
case response[
|
399
|
+
case response["Content-Type"]
|
399
400
|
when /json/
|
400
|
-
|
401
|
-
|
401
|
+
ChefAPI::Log.debug "Detected response as JSON"
|
402
|
+
ChefAPI::Log.debug "Parsing response body as JSON"
|
402
403
|
JSON.parse(response.body)
|
403
404
|
else
|
404
|
-
|
405
|
+
ChefAPI::Log.debug "Detected response as text/plain"
|
405
406
|
response.body
|
406
407
|
end
|
407
408
|
end
|
@@ -414,15 +415,15 @@ module ChefAPI
|
|
414
415
|
# the response object from the request
|
415
416
|
#
|
416
417
|
def error(response)
|
417
|
-
|
418
|
+
ChefAPI::Log.info "Parsing response as error..."
|
418
419
|
|
419
|
-
case response[
|
420
|
+
case response["Content-Type"]
|
420
421
|
when /json/
|
421
|
-
|
422
|
-
|
422
|
+
ChefAPI::Log.debug "Detected error response as JSON"
|
423
|
+
ChefAPI::Log.debug "Parsing error response as JSON"
|
423
424
|
message = JSON.parse(response.body)
|
424
425
|
else
|
425
|
-
|
426
|
+
ChefAPI::Log.debug "Detected response as text/plain"
|
426
427
|
message = response.body
|
427
428
|
end
|
428
429
|
|
@@ -454,19 +455,19 @@ module ChefAPI
|
|
454
455
|
# @param [Net::HTTP::Request] request
|
455
456
|
#
|
456
457
|
def add_request_headers(request)
|
457
|
-
|
458
|
+
ChefAPI::Log.info "Adding request headers..."
|
458
459
|
|
459
460
|
headers = {
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
461
|
+
"Accept" => "application/json",
|
462
|
+
"Content-Type" => "application/json",
|
463
|
+
"Connection" => "keep-alive",
|
464
|
+
"Keep-Alive" => "30",
|
465
|
+
"User-Agent" => user_agent,
|
466
|
+
"X-Chef-Version" => "11.4.0",
|
466
467
|
}
|
467
468
|
|
468
469
|
headers.each do |key, value|
|
469
|
-
|
470
|
+
ChefAPI::Log.debug "#{key}: #{value}"
|
470
471
|
request[key] = value
|
471
472
|
end
|
472
473
|
end
|
@@ -482,18 +483,18 @@ module ChefAPI
|
|
482
483
|
# @param [Net::HTTP::Request] request
|
483
484
|
#
|
484
485
|
def add_signing_headers(verb, path, request)
|
485
|
-
|
486
|
+
ChefAPI::Log.info "Adding signed header authentication..."
|
486
487
|
|
487
488
|
authentication = Authentication.from_options(
|
488
489
|
user: client,
|
489
490
|
key: key,
|
490
491
|
verb: verb,
|
491
492
|
path: path,
|
492
|
-
body: request.body || request.body_stream
|
493
|
+
body: request.body || request.body_stream
|
493
494
|
)
|
494
495
|
|
495
496
|
authentication.headers.each do |key, value|
|
496
|
-
|
497
|
+
ChefAPI::Log.debug "#{key}: #{value}"
|
497
498
|
request[key] = value
|
498
499
|
end
|
499
500
|
|