chef-api 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 897751a69516ca8d1e12eaa9dcb521b32aaea046
4
- data.tar.gz: 054568ad2efe5331ed9f752bd7ff6eab4127cd3a
3
+ metadata.gz: 75862fce6679a723c8a852797401ffba16d1797f
4
+ data.tar.gz: 062d62a2b686c86bb693195cbc109be922feeb3d
5
5
  SHA512:
6
- metadata.gz: 49db17dfafabca27646fc677a2e3067ce165bb04982c51cfcbd7d999251495dab9c2b264dd56efa8c2aa06b3ab7e5a61b1a20de75fdbee9e80c4b06bdd5cef11
7
- data.tar.gz: deb8bcb861d3d3dc352f1c554de34eb9fc8d6064d4a4e5aa9e32f4032341e1e37bd29c4f8af0cba49c138ff8cc4b9e610f0f0f3efc58447da79fd9d2a388048e
6
+ metadata.gz: 48bbfa255c2e75e154ab1fb89f8417c57fa7b495390d31241ef3f68dc5ca21970a6d9914dbef7627ad8ce786b740154819fa413209a110d702531949ad7cfefe
7
+ data.tar.gz: 3896eaa411e4a10307ee45d503c82da4b55eff89c85f356bfcdc3050f725a18a5f8485e88658e6ce45c42d356140eabb4b12880a31667714ef67cafe063d411f
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ tmp
18
18
  bin
19
19
  .rspec
20
20
  .ruby-version
21
+ vendor/
@@ -1,7 +1,10 @@
1
+ sudo: false
2
+
1
3
  rvm:
2
- - 1.9.3
3
- - 2.0.0
4
+ - 2.0
4
5
  - 2.1
6
+ - 2.2
7
+ - 2.3.1
5
8
 
6
9
  # Don't install local development gems on Travis, use parallel gem downloads
7
10
  bundler_args: --without development --jobs 7
@@ -1,32 +1,41 @@
1
- ChefAPI Changelog
2
- =================
1
+ # ChefAPI Changelog
2
+
3
+ ## v0.6.0 (2016-05-05)
4
+
5
+ - Remove support for Ruby 1.9
6
+ - Add the ability to disable signing on a request
7
+ - Always send JSON when authenticating a user
8
+ - Fix to_json method contract
9
+ - Add config file support. See the readme for an example
10
+ - Add required fields to role schema
11
+ - Do not symbolize keys in the config
12
+ - Fix boolean logic in determining if SSL should be verified
13
+
14
+ ## v0.5.0 (2014-07-10)
3
15
 
4
- v0.5.0 (2014-07-10)
5
- -------------------
6
16
  - Relax the dependency on mime-types
7
17
  - When searching for the file object of a multipart filepart, find the first IO that not a StringIO
8
18
  - Rewind IO objects after digesting them
9
19
 
10
- v0.4.1 (2014-07-07)
11
- -------------------
20
+ ## v0.4.1 (2014-07-07)
21
+
12
22
  - Remove dependency on mixlib-authentication
13
23
  - Fix a bug where Content-Type headers were not sent properly
14
24
  - Switch to rake for test running
15
25
  - Improve test coverage with fixtures
16
26
 
17
- v0.4.0 (2014-07-05)
18
- -------------------
27
+ ## v0.4.0 (2014-07-05)
28
+
19
29
  - Support multipart POST
20
30
 
21
- v0.3.0 (2014-06-18)
22
- -------------------
31
+ ## v0.3.0 (2014-06-18)
32
+
23
33
  - Add search functionality
24
34
  - Add partial search
25
35
  - Update testing harness
26
36
 
37
+ ## v0.2.1 (2014-04-17)
27
38
 
28
- v0.2.1 (2014-04-17)
29
- -------------------
30
39
  - Fix a series of typographical errors
31
40
  - Improved documentation for loading resources from disk
32
41
  - Improved spec coverage
data/README.md CHANGED
@@ -2,11 +2,9 @@ ChefAPI Client
2
2
  ==============
3
3
  [![Gem Version](http://img.shields.io/gem/v/chef-api.svg)][gem]
4
4
  [![Build Status](http://img.shields.io/travis/sethvargo/chef-api.svg)][travis]
5
- [![Gittip](http://img.shields.io/gittip/sethvargo.svg)][gittip]
6
5
 
7
6
  [gem]: https://rubygems.org/gems/chef-api
8
7
  [travis]: http://travis-ci.org/sethvargo/chef-api
9
- [gittip]: https://www.gittip.com/sethvargo
10
8
 
11
9
  **ChefAPI is currently in rapid development!** You should not consider this API stable until the official 1.0.0 release.
12
10
 
@@ -104,6 +102,16 @@ export CHEF_API_CLIENT=bacon
104
102
  export CHEF_API_KEY=~/.chef/bacon.pem
105
103
  ```
106
104
 
105
+ In addition, you can configure the environment variables in a JSON-formatted config file either placed in ~/.chef-api or placed in a location configured via the environment variable `CHEF_API_CONFIG`. For example:
106
+
107
+ ```json
108
+ {
109
+ "CHEF_API_ENDPOINT": "https://api.opscode.com/organizations/meats",
110
+ "CHEF_API_CLIENT": "bacon",
111
+ "CHEF_API_KEY": "~/.chef/bacon.pem"
112
+ }
113
+ ```
114
+
107
115
  If you prefer a more object-oriented approach (or if you want to support multiple simultaneous connections), you can create a raw `ChefAPI::Connection` object. All of the options that are available on the `ChefAPI` object are also available on a raw connection:
108
116
 
109
117
  ```ruby
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = 'https://github.com/sethvargo/chef-api'
14
14
  spec.license = 'Apache 2.0'
15
15
 
16
- spec.required_ruby_version = '>= 1.9'
16
+ spec.required_ruby_version = '>= 2.0'
17
17
 
18
18
  spec.files = `git ls-files`.split($/)
19
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -227,7 +227,7 @@ module ChefAPI
227
227
  # @return [String]
228
228
  #
229
229
  def encrypted_request
230
- canonical_key.private_encrypt(canonical_request).chomp
230
+ canonical_key.private_encrypt(canonical_request)
231
231
  end
232
232
 
233
233
  #
@@ -98,11 +98,12 @@ module ChefAPI
98
98
  # @param path (see Connection#request)
99
99
  # @param [Hash] params
100
100
  # the list of query params
101
+ # @param request_options (see Connection#request)
101
102
  #
102
103
  # @raise (see Connection#request)
103
104
  # @return (see Connection#request)
104
105
  #
105
- def get(path, params = {})
106
+ def get(path, params = {}, request_options = {})
106
107
  request(:get, path, params)
107
108
  end
108
109
 
@@ -114,11 +115,12 @@ module ChefAPI
114
115
  # the body to use for the request
115
116
  # @param [Hash] params
116
117
  # the list of query params
118
+ # @param request_options (see Connection#request)
117
119
  #
118
120
  # @raise (see Connection#request)
119
121
  # @return (see Connection#request)
120
122
  #
121
- def post(path, data, params = {})
123
+ def post(path, data, params = {}, request_options = {})
122
124
  request(:post, path, data, params)
123
125
  end
124
126
 
@@ -128,11 +130,12 @@ module ChefAPI
128
130
  # @param path (see Connection#request)
129
131
  # @param data (see Connection#post)
130
132
  # @param params (see Connection#post)
133
+ # @param request_options (see Connection#request)
131
134
  #
132
135
  # @raise (see Connection#request)
133
136
  # @return (see Connection#request)
134
137
  #
135
- def put(path, data, params = {})
138
+ def put(path, data, params = {}, request_options = {})
136
139
  request(:put, path, data, params)
137
140
  end
138
141
 
@@ -142,11 +145,12 @@ module ChefAPI
142
145
  # @param path (see Connection#request)
143
146
  # @param data (see Connection#post)
144
147
  # @param params (see Connection#post)
148
+ # @param request_options (see Connection#request)
145
149
  #
146
150
  # @raise (see Connection#request)
147
151
  # @return (see Connection#request)
148
152
  #
149
- def patch(path, data, params = {})
153
+ def patch(path, data, params = {}, request_options = {})
150
154
  request(:patch, path, data, params)
151
155
  end
152
156
 
@@ -155,11 +159,12 @@ module ChefAPI
155
159
  #
156
160
  # @param path (see Connection#request)
157
161
  # @param params (see Connection#get)
162
+ # @param request_options (see Connection#request)
158
163
  #
159
164
  # @raise (see Connection#request)
160
165
  # @return (see Connection#request)
161
166
  #
162
- def delete(path, params = {})
167
+ def delete(path, params = {}, request_options = {})
163
168
  request(:delete, path, params)
164
169
  end
165
170
 
@@ -180,11 +185,16 @@ module ChefAPI
180
185
  # the data to use (varies based on the +verb+)
181
186
  # @param [Hash] params
182
187
  # the params to use for :patch, :post, :put
188
+ # @param [Hash] request_options
189
+ # the list of options/configurables for the actual request
190
+ #
191
+ # @option request_options [true, false] :sign (default: +true+)
192
+ # whether to sign the request using mixlib authentication headers
183
193
  #
184
194
  # @return [String, Hash]
185
195
  # the response body
186
196
  #
187
- def request(verb, path, data = {}, params = {})
197
+ def request(verb, path, data = {}, params = {}, request_options = {})
188
198
  log.info "#{verb.to_s.upcase} #{path}..."
189
199
  log.debug "Chef flavor: #{flavor.inspect}"
190
200
 
@@ -230,7 +240,11 @@ module ChefAPI
230
240
  end
231
241
 
232
242
  # Sign the request
233
- add_signing_headers(verb, uri.path, request)
243
+ if request_options[:sign] == false
244
+ log.info "Skipping signed header authentication (user requested)..."
245
+ else
246
+ add_signing_headers(verb, uri.path, request)
247
+ end
234
248
 
235
249
  # Create the HTTP connection object - since the proxy information defaults
236
250
  # to +nil+, we can just pass it to the initializer method instead of doing
@@ -256,7 +270,7 @@ module ChefAPI
256
270
  unless ssl_verify
257
271
  log.warn "Disabling SSL verification..."
258
272
  log.warn "Neither ChefAPI nor the maintainers are responsible for " \
259
- "damanges incurred as a result of disabling SSL verification. " \
273
+ "damages incurred as a result of disabling SSL verification. " \
260
274
  "Please use this with extreme caution, or consider specifying " \
261
275
  "a custom certificate using `config.ssl_pem_file'."
262
276
  connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
@@ -1,4 +1,5 @@
1
1
  require 'chef-api/version'
2
+ require 'json'
2
3
 
3
4
  module ChefAPI
4
5
  module Defaults
@@ -18,6 +19,15 @@ module ChefAPI
18
19
  Hash[Configurable.keys.map { |key| [key, send(key)] }]
19
20
  end
20
21
 
22
+ #
23
+ # The Chef API configuration
24
+ #
25
+ # @return [Hash]
26
+ def config
27
+ path = File.expand_path(ENV['CHEF_API_CONFIG'] || '~/.chef-api')
28
+ @config ||= File.exist?(path) ? JSON.parse(File.read(path)) : {}
29
+ end
30
+
21
31
  #
22
32
  # The endpoint where the Chef Server lives. This is equivalent to the
23
33
  # +chef_server_url+ in Chef terminology. If you are using Enterprise
@@ -35,7 +45,7 @@ module ChefAPI
35
45
  # @return [String] (default: +https://api.opscode.com/+)
36
46
  #
37
47
  def endpoint
38
- ENV['CHEF_API_ENDPOINT'] || ENDPOINT
48
+ ENV['CHEF_API_ENDPOINT'] || config['CHEF_API_ENDPOINT'] || ENDPOINT
39
49
  end
40
50
 
41
51
  #
@@ -52,6 +62,8 @@ module ChefAPI
52
62
  def flavor
53
63
  if ENV['CHEF_API_FLAVOR']
54
64
  ENV['CHEF_API_FLAVOR'].to_sym
65
+ elsif config['CHEF_API_FLAVOR']
66
+ config['CHEF_API_FLAVOR']
55
67
  else
56
68
  endpoint.include?('/organizations') ? :enterprise : :open_source
57
69
  end
@@ -63,7 +75,7 @@ module ChefAPI
63
75
  # @return [String]
64
76
  #
65
77
  def user_agent
66
- ENV['CHEF_API_USER_AGENT'] || USER_AGENT
78
+ ENV['CHEF_API_USER_AGENT'] || config['CHEF_API_USER_AGENT'] || USER_AGENT
67
79
  end
68
80
 
69
81
  #
@@ -74,7 +86,7 @@ module ChefAPI
74
86
  # @return [String, nil]
75
87
  #
76
88
  def client
77
- ENV['CHEF_API_CLIENT']
89
+ ENV['CHEF_API_CLIENT'] || config['CHEF_API_CLIENT']
78
90
  end
79
91
 
80
92
  #
@@ -85,7 +97,7 @@ module ChefAPI
85
97
  # @return [String, nil]
86
98
  #
87
99
  def key
88
- ENV['CHEF_API_KEY']
100
+ ENV['CHEF_API_KEY'] || config['CHEF_API_KEY']
89
101
  end
90
102
  #
91
103
  # The HTTP Proxy server address as a string
@@ -93,7 +105,7 @@ module ChefAPI
93
105
  # @return [String, nil]
94
106
  #
95
107
  def proxy_address
96
- ENV['CHEF_API_PROXY_ADDRESS']
108
+ ENV['CHEF_API_PROXY_ADDRESS'] || config['CHEF_API_PROXY_ADDRESS']
97
109
  end
98
110
 
99
111
  #
@@ -102,7 +114,7 @@ module ChefAPI
102
114
  # @return [String, nil]
103
115
  #
104
116
  def proxy_password
105
- ENV['CHEF_API_PROXY_PASSWORD']
117
+ ENV['CHEF_API_PROXY_PASSWORD'] || config['CHEF_API_PROXY_PASSWORD']
106
118
  end
107
119
 
108
120
  #
@@ -111,7 +123,7 @@ module ChefAPI
111
123
  # @return [String, nil]
112
124
  #
113
125
  def proxy_port
114
- ENV['CHEF_API_PROXY_PORT']
126
+ ENV['CHEF_API_PROXY_PORT'] || config['CHEF_API_PROXY_PORT']
115
127
  end
116
128
 
117
129
  #
@@ -120,7 +132,7 @@ module ChefAPI
120
132
  # @return [String, nil]
121
133
  #
122
134
  def proxy_username
123
- ENV['CHEF_API_PROXY_USERNAME']
135
+ ENV['CHEF_API_PROXY_USERNAME'] || config['CHEF_API_PROXY_USERNAME']
124
136
  end
125
137
 
126
138
  #
@@ -129,7 +141,7 @@ module ChefAPI
129
141
  # @return [String, nil]
130
142
  #
131
143
  def ssl_pem_file
132
- ENV['CHEF_API_SSL_PEM_FILE']
144
+ ENV['CHEF_API_SSL_PEM_FILE'] || config['CHEF_API_SSL_PEM_FILE']
133
145
  end
134
146
 
135
147
  #
@@ -138,13 +150,12 @@ module ChefAPI
138
150
  # @return [true, false]
139
151
  #
140
152
  def ssl_verify
141
- if ENV['CHEF_API_SSL_VERIFY'].nil?
153
+ if ENV['CHEF_API_SSL_VERIFY'].nil? && config['CHEF_API_SSL_VERIFY'].nil?
142
154
  true
143
155
  else
144
- %w[t y].include?(ENV['CHEF_API_SSL_VERIFY'].downcase[0])
156
+ %w[t y].include?(ENV['CHEF_API_SSL_VERIFY'].downcase[0]) || config['CHEF_API_SSL_VERIFY']
145
157
  end
146
158
  end
147
-
148
159
  end
149
160
  end
150
161
  end
@@ -927,7 +927,7 @@ module ChefAPI
927
927
  #
928
928
  # @return [String]
929
929
  #
930
- def to_json
930
+ def to_json(*)
931
931
  JSON.fast_generate(to_hash)
932
932
  end
933
933
 
@@ -4,6 +4,7 @@ module ChefAPI
4
4
 
5
5
  schema do
6
6
  attribute :name, type: String, primary: true, required: true
7
+ attribute :json_class, type: String, default: "Chef::Role"
7
8
  attribute :description, type: String
8
9
  attribute :default_attributes, type: Hash, default: {}
9
10
  attribute :override_attributes, type: Hash, default: {}
@@ -75,7 +75,7 @@ module ChefAPI
75
75
  # the parsed JSON response from the server
76
76
  #
77
77
  def authenticate(options = {})
78
- connection.post('/authenticate_user', options)
78
+ connection.post('/authenticate_user', options.to_json)
79
79
  end
80
80
  end
81
81
  end
@@ -1,3 +1,3 @@
1
1
  module ChefAPI
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module ChefAPI
4
+ describe Defaults do
5
+ context 'without a config file' do
6
+ before(:each) do
7
+ allow(subject).to receive(:config).and_return(Hash.new)
8
+ end
9
+
10
+ it 'returns the default endpoint' do
11
+ expect(subject.endpoint).to eq subject::ENDPOINT
12
+ end
13
+
14
+ it 'returns the default user agent' do
15
+ expect(subject.user_agent).to eq subject::USER_AGENT
16
+ end
17
+ end
18
+
19
+ context 'with a config file' do
20
+ before(:each) do
21
+ subject.instance_variable_set(:@config, nil)
22
+ allow(File).to receive(:exist?).with(anything()).and_return(true)
23
+ allow(File).to receive(:read).and_return("{\n"\
24
+ "\"CHEF_API_ENDPOINT\": \"test_endpoint\",\n" \
25
+ "\"CHEF_API_USER_AGENT\": \"test_user_agent\"\n" \
26
+ "}"
27
+ )
28
+ end
29
+
30
+ it 'returns the overridden value for endpoint' do
31
+ expect(subject.endpoint).to eq 'test_endpoint'
32
+ end
33
+
34
+ it 'returns the overridden value for user agent' do
35
+ expect(subject.user_agent).to eq 'test_user_agent'
36
+ end
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seth Vargo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-10 00:00:00.000000000 Z
11
+ date: 2016-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logify
@@ -98,6 +98,7 @@ files:
98
98
  - spec/support/shared/chef_api_resource.rb
99
99
  - spec/support/user.pem
100
100
  - spec/unit/authentication_spec.rb
101
+ - spec/unit/defaults_spec.rb
101
102
  - spec/unit/errors_spec.rb
102
103
  - spec/unit/resources/base_spec.rb
103
104
  - spec/unit/resources/client_spec.rb
@@ -135,7 +136,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
136
  requirements:
136
137
  - - ">="
137
138
  - !ruby/object:Gem::Version
138
- version: '1.9'
139
+ version: '2.0'
139
140
  required_rubygems_version: !ruby/object:Gem::Requirement
140
141
  requirements:
141
142
  - - ">="
@@ -143,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
144
  version: '0'
144
145
  requirements: []
145
146
  rubyforge_project:
146
- rubygems_version: 2.3.0
147
+ rubygems_version: 2.6.3
147
148
  signing_key:
148
149
  specification_version: 4
149
150
  summary: A Chef API client in Ruby
@@ -161,6 +162,7 @@ test_files:
161
162
  - spec/support/shared/chef_api_resource.rb
162
163
  - spec/support/user.pem
163
164
  - spec/unit/authentication_spec.rb
165
+ - spec/unit/defaults_spec.rb
164
166
  - spec/unit/errors_spec.rb
165
167
  - spec/unit/resources/base_spec.rb
166
168
  - spec/unit/resources/client_spec.rb