chef-api 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +17 -0
- data/README.md +42 -0
- data/chef-api.gemspec +1 -1
- data/lib/chef-api/configurable.rb +3 -2
- data/lib/chef-api/connection.rb +77 -47
- data/lib/chef-api/defaults.rb +28 -8
- data/lib/chef-api/errors.rb +32 -3
- data/lib/chef-api/resource.rb +1 -0
- data/lib/chef-api/resources/base.rb +30 -21
- data/lib/chef-api/resources/client.rb +6 -8
- data/lib/chef-api/resources/collection_proxy.rb +19 -2
- data/lib/chef-api/resources/data_bag.rb +1 -1
- data/lib/chef-api/resources/organization.rb +22 -0
- data/lib/chef-api/resources/user.rb +72 -1
- data/lib/chef-api/schema.rb +59 -21
- data/lib/chef-api/version.rb +1 -1
- data/lib/chef-api.rb +26 -5
- data/spec/integration/resources/client_spec.rb +54 -0
- data/spec/integration/resources/user_spec.rb +8 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/chef_server.rb +1 -0
- data/spec/unit/errors_spec.rb +294 -0
- data/spec/unit/resources/client_spec.rb +0 -16
- data/spec/unit/resources/connection_spec.rb +51 -0
- data/templates/errors/abstract_method.erb +5 -0
- data/templates/errors/cannot_regenerate_key.erb +1 -0
- data/templates/errors/chef_api_error.erb +1 -0
- data/templates/errors/file_not_found.erb +1 -0
- data/templates/errors/http_bad_request.erb +3 -0
- data/templates/errors/http_forbidden_request.erb +3 -0
- data/templates/errors/http_gateway_timeout.erb +3 -0
- data/templates/errors/http_method_not_allowed.erb +3 -0
- data/templates/errors/http_not_acceptable.erb +3 -0
- data/templates/errors/http_not_found.erb +3 -0
- data/templates/errors/http_server_unavailable.erb +1 -0
- data/templates/errors/http_unauthorized_request.erb +3 -0
- data/templates/errors/insufficient_file_permissions.erb +1 -0
- data/templates/errors/invalid_resource.erb +1 -0
- data/templates/errors/invalid_validator.erb +1 -0
- data/templates/errors/missing_url_parameter.erb +1 -0
- data/templates/errors/not_a_directory.erb +1 -0
- data/templates/errors/resource_already_exists.erb +1 -0
- data/templates/errors/resource_not_found.erb +1 -0
- data/templates/errors/resource_not_mutable.erb +1 -0
- data/templates/errors/unknown_attribute.erb +1 -0
- metadata +43 -17
- data/lib/chef-api/logger.rb +0 -160
- data/lib/chef-api/proxy.rb +0 -72
- data/locales/en.yml +0 -89
data/lib/chef-api/logger.rb
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
|
3
|
-
module ChefAPI
|
4
|
-
module Logger
|
5
|
-
class << self
|
6
|
-
# @private
|
7
|
-
def included(base)
|
8
|
-
base.send(:extend, ClassMethods)
|
9
|
-
base.send(:include, InstanceMethods)
|
10
|
-
end
|
11
|
-
|
12
|
-
#
|
13
|
-
# Get the logger class for the given name. If a logger does not exist
|
14
|
-
# for the given name, a new one is created.
|
15
|
-
#
|
16
|
-
# @param [String] name
|
17
|
-
# the name of the logger to find
|
18
|
-
#
|
19
|
-
# @return [DefaultLogger]
|
20
|
-
# the logger for the given name
|
21
|
-
#
|
22
|
-
def logger_for(name)
|
23
|
-
loggers[name] ||= DefaultLogger.new(name, level)
|
24
|
-
end
|
25
|
-
|
26
|
-
#
|
27
|
-
# The global log level.
|
28
|
-
#
|
29
|
-
# @return [Symbol]
|
30
|
-
#
|
31
|
-
def level
|
32
|
-
@level ||= :warn
|
33
|
-
end
|
34
|
-
|
35
|
-
#
|
36
|
-
# Set the global log level.
|
37
|
-
#
|
38
|
-
# @param [String, Symbol] level
|
39
|
-
# the log level
|
40
|
-
#
|
41
|
-
# @return [Symbol]
|
42
|
-
#
|
43
|
-
def level=(level)
|
44
|
-
@level = level.to_s.downcase.to_sym
|
45
|
-
|
46
|
-
loggers.each do |_, logger|
|
47
|
-
logger.level = @level
|
48
|
-
end
|
49
|
-
|
50
|
-
@level
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def loggers
|
56
|
-
@loggers ||= {}
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
module ClassMethods
|
61
|
-
#
|
62
|
-
# Write a message to the logger for this class.
|
63
|
-
#
|
64
|
-
# @return [DefaultLogger]
|
65
|
-
#
|
66
|
-
def log
|
67
|
-
@log ||= Logger.logger_for(name)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
module InstanceMethods
|
72
|
-
#
|
73
|
-
# Write a message to the logger for this instance's class.
|
74
|
-
#
|
75
|
-
# @return [DefaultLogger]
|
76
|
-
#
|
77
|
-
def log
|
78
|
-
@log ||= Logger.logger_for(self.class.name)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
#
|
83
|
-
# The default logger for everything logged through the Chef API.
|
84
|
-
#
|
85
|
-
class DefaultLogger < ::Logger
|
86
|
-
class << self
|
87
|
-
private
|
88
|
-
|
89
|
-
#
|
90
|
-
# @macro attr_questioner
|
91
|
-
#
|
92
|
-
# @method $1?
|
93
|
-
# Determine if the current logger's level is +:$1+.
|
94
|
-
#
|
95
|
-
# @return [Boolean]
|
96
|
-
# true if the current log level is +:$1+ or lower, false otherwise
|
97
|
-
#
|
98
|
-
def attr_questioner(name)
|
99
|
-
class_eval <<-EOH, __FILE__, __LINE__ + 1
|
100
|
-
def #{name}?
|
101
|
-
level == ::Logger::Severity.const_get('#{name}'.upcase)
|
102
|
-
end
|
103
|
-
EOH
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
attr_questioner :fatal
|
108
|
-
attr_questioner :error
|
109
|
-
attr_questioner :warn
|
110
|
-
attr_questioner :info
|
111
|
-
attr_questioner :debug
|
112
|
-
|
113
|
-
#
|
114
|
-
# Create a new logger with the given name. In debug mode, the +name+ is
|
115
|
-
# used to identify the caller of the log message. In other modes, it is
|
116
|
-
# ignored entirely.
|
117
|
-
#
|
118
|
-
# @param [String] name
|
119
|
-
# the name of the class calling the logger
|
120
|
-
#
|
121
|
-
def initialize(name, level)
|
122
|
-
super($stdout)
|
123
|
-
|
124
|
-
@formatter = formatter
|
125
|
-
@progname = name
|
126
|
-
self.level = level
|
127
|
-
end
|
128
|
-
|
129
|
-
#
|
130
|
-
# Set this logger's level to the given key.
|
131
|
-
#
|
132
|
-
# @example Set the log level to +info+
|
133
|
-
# logger.level = :info
|
134
|
-
#
|
135
|
-
# @param [String, Symbol] value
|
136
|
-
# the value to set for the logger
|
137
|
-
#
|
138
|
-
def level=(value)
|
139
|
-
@level = ::Logger::Severity.const_get(value.to_s.upcase)
|
140
|
-
end
|
141
|
-
|
142
|
-
private
|
143
|
-
|
144
|
-
def formatter
|
145
|
-
Proc.new do |severity, timestamp, progname, message|
|
146
|
-
if debug?
|
147
|
-
"[#{progname}] #{message}\n"
|
148
|
-
else
|
149
|
-
message + "\n"
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
class NullLogger < DefaultLogger
|
156
|
-
def initialize(*args); end
|
157
|
-
def add(*args, &block); end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
data/lib/chef-api/proxy.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
module ChefAPI
|
2
|
-
#
|
3
|
-
# Create a proxy object, which delegates all methods to the class given in
|
4
|
-
# the initializer. This is used by the client object to filter the first
|
5
|
-
# parameter of any singleton methods to pass in the given client as the first
|
6
|
-
# argument. It's dirty, but it allows developers to write pretty code, which
|
7
|
-
# is more what I care about.
|
8
|
-
#
|
9
|
-
# @example Without a proxy object
|
10
|
-
# client = ChefAPI::Client.new('...')
|
11
|
-
# repo = ChefAPI::Resource::Repository.new(client, name: '...')
|
12
|
-
#
|
13
|
-
# @example With a proxy object
|
14
|
-
# client = ChefAPI::Client.new('...')
|
15
|
-
# repo = client.repositories.new(name: '...')
|
16
|
-
#
|
17
|
-
class Proxy < BasicObject
|
18
|
-
#
|
19
|
-
# This is quite possibly the worst thing I've ever done in my life.
|
20
|
-
# Dynamically remove all methods from this class, just we we can delegate
|
21
|
-
# *everything* to the instance class.
|
22
|
-
#
|
23
|
-
# It is presumed there is no hope...
|
24
|
-
#
|
25
|
-
instance_methods.each do |name|
|
26
|
-
unless name =~ /__|object_id|instance_eval/
|
27
|
-
undef_method name
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
#
|
32
|
-
# Create a new proxy object.
|
33
|
-
#
|
34
|
-
# @param [ChefAPI::Client] client
|
35
|
-
# the client object to use for the proxy
|
36
|
-
# @param [Class] klass
|
37
|
-
# the class to proxy to
|
38
|
-
#
|
39
|
-
def initialize(client, klass)
|
40
|
-
@client = client
|
41
|
-
@klass = klass
|
42
|
-
|
43
|
-
klass.singleton_methods.each do |name|
|
44
|
-
instance_eval <<-EOH, __FILE__, __LINE__ + 1
|
45
|
-
def #{name}(*args)
|
46
|
-
if args.last.is_a?(::Hash)
|
47
|
-
args.last[:client] = @client
|
48
|
-
else
|
49
|
-
args << { client: @client }
|
50
|
-
end
|
51
|
-
|
52
|
-
@klass.send(:#{name}, *args)
|
53
|
-
end
|
54
|
-
EOH
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# @private
|
59
|
-
def method_missing(m, *args, &block)
|
60
|
-
if @klass.respond_to?(m)
|
61
|
-
@klass.send(m, *args, &block)
|
62
|
-
else
|
63
|
-
super
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# @private
|
68
|
-
def respond_to_missing?(m, include_private = false)
|
69
|
-
@klass.respond_to?(m) || super
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/locales/en.yml
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
en:
|
2
|
-
chef_api:
|
3
|
-
errors:
|
4
|
-
abstract_method: >
|
5
|
-
`%{method}` is an abstract method. You must override this method in
|
6
|
-
your subclass with the proper implementation and logic. For more
|
7
|
-
information, please see the inline documentation for %{method}. If you
|
8
|
-
are not a developer, this is most likely a bug in the ChefAPI gem.
|
9
|
-
Please file a bug report at
|
10
|
-
https://github.com/sethvargo/chef-api/issues/new and include the
|
11
|
-
command(s) you ran to arrive at this error.
|
12
|
-
cannot_regenerate_key: >
|
13
|
-
You called `regenerate_key` on a client that does not exist on the
|
14
|
-
remote Chef Server. You can only regenerate a private key for a client
|
15
|
-
that is persisted. Try saving this record this client before
|
16
|
-
regenerating the private key.
|
17
|
-
file_not_found: >
|
18
|
-
I could not find a file at `%{path}`. Please make sure you have typed
|
19
|
-
the path correctly and that the resource at `%{path}` does actually
|
20
|
-
exist.
|
21
|
-
http_bad_request: >
|
22
|
-
The Chef Server did not understand the request because it was malformed.
|
23
|
-
The Chef Server returned this message:
|
24
|
-
|
25
|
-
%{message}
|
26
|
-
http_forbidden_request: >
|
27
|
-
The Chef Server actively refused to fulfill the request. The Chef Server
|
28
|
-
returned this message:
|
29
|
-
|
30
|
-
%{message}
|
31
|
-
http_method_not_allowed: >
|
32
|
-
That HTTP method is not allowed on this URL. The Chef Server returned
|
33
|
-
this message:
|
34
|
-
|
35
|
-
%{message}
|
36
|
-
http_not_acceptable: >
|
37
|
-
The Chef Server identified this request as unacceptable. This usually
|
38
|
-
means you have not specified the correct Accept or Content-Type headers
|
39
|
-
on the request object. The Chef Server returned this message:
|
40
|
-
|
41
|
-
%{message}
|
42
|
-
http_not_found: >
|
43
|
-
The requested URL does not exist on the Chef Server. The Chef Server
|
44
|
-
returned this message:
|
45
|
-
|
46
|
-
%{message}
|
47
|
-
http_server_unavailable: >
|
48
|
-
The Chef Server is currently unavailable or is not currently accepting
|
49
|
-
client connections. Please ensure the server is accessible via ping
|
50
|
-
or telnet on your local network. If this error persists, please contact
|
51
|
-
your network administrator.
|
52
|
-
http_unauthorized_request: >
|
53
|
-
The Chef Server requires authorization. Please ensure you have specified
|
54
|
-
the correct client name and private key. If this error continues, please
|
55
|
-
verify the given client has the proper permissions on the Chef Server.
|
56
|
-
The Chef Server returned this message:
|
57
|
-
|
58
|
-
%{message}
|
59
|
-
insufficient_file_permissions: >
|
60
|
-
I cannot read the file at `%{path}` because the permissions on the file
|
61
|
-
do not permit it. Please ensure the file has the correct permissions and
|
62
|
-
that this Ruby process is running as a user with access to `%{path}`.
|
63
|
-
invalid_resource: >
|
64
|
-
There were errors saving your resource: %{errors}
|
65
|
-
invalid_validator: >
|
66
|
-
`%{key}` is not a valid validator. Please make sure it is spelled
|
67
|
-
correctly and that the constant is properly defined. If you are using
|
68
|
-
a custom validator, please ensure the validator extends
|
69
|
-
ChefAPI::Validator::Base and is a subclass of ChefAPI::Validator.
|
70
|
-
missing_url_parameter: >
|
71
|
-
The required URL parameter `%{param}' was not present. Please specify
|
72
|
-
`%{param}' as an option, like Resource.new(id, %{param}: 'value').
|
73
|
-
not_a_directory: >
|
74
|
-
The given path `%{path}' is not a directory. Please make sure you have
|
75
|
-
passed the path to a directory on disk.
|
76
|
-
resource_already_exists: >
|
77
|
-
The %{type} `%{id}` already exists on the Chef Server. Each
|
78
|
-
%{type} must have a unique identifier and the Chef Server indicated
|
79
|
-
this %{type} already exists. If you are trying to update the %{type},
|
80
|
-
consider using the `update` method instead.
|
81
|
-
resource_not_found: >
|
82
|
-
There is no %{type} with an id of `%{id}` on the Chef Server. If you
|
83
|
-
are updating the %{type}, please make sure the %{type} exists and has
|
84
|
-
the correct Chef identifier (primary key).
|
85
|
-
resource_not_mutable: >
|
86
|
-
The %{type} `%{id}` is not mutable. It may be locked by the remote
|
87
|
-
Chef Server, or the Chef Server may not permit modifying the resource.
|
88
|
-
unknown_attribute: >
|
89
|
-
`%{attribute}` is not a valid attribute
|