puppet-resource_api 1.0.3 → 1.1.0
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/CHANGELOG.md +18 -0
- data/Gemfile +1 -1
- data/README.md +5 -4
- data/appveyor.yml +0 -11
- data/lib/puppet/resource_api.rb +135 -42
- data/lib/puppet/resource_api/version.rb +1 -1
- data/puppet-resource_api.gemspec +9 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1470bc0d22d986fc0eccd0580a072ea54f6482b3c830f994b2d83f230ba95b22
|
4
|
+
data.tar.gz: 1346ed773c82d9478dbbcd243f5fe4b1260c487b7b17f971268801bd772c7f83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f521be6aa211b933e12f712be3af9226af5d5d9df4a8bec2ca075e0faedd5898c7a9d1150024784c8e71c27bcbd996c34b010ecd656e15cf314e40014bb86ed
|
7
|
+
data.tar.gz: 6a473b6d9eb96158008dfc4622da547026f01c3fbe492689fb9478179f645338b8b264b693fdfd6451491fd432d025b05026a5c245db374078222e668241f0cc
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,24 @@
|
|
3
3
|
All significant changes to this repo will be summarized in this file.
|
4
4
|
|
5
5
|
|
6
|
+
## [v1.1.0](https://github.com/puppetlabs/puppet-resource_api/tree/v1.1.0) (2018-04-12)
|
7
|
+
[Full Changelog](https://github.com/puppetlabs/puppet-resource_api/compare/v1.0.3...v1.1.0)
|
8
|
+
|
9
|
+
**Implemented enhancements:**
|
10
|
+
|
11
|
+
- \(PDK-895\) basic array support [\#59](https://github.com/puppetlabs/puppet-resource_api/pull/59) ([DavidS](https://github.com/DavidS))
|
12
|
+
|
13
|
+
**Fixed bugs:**
|
14
|
+
|
15
|
+
- \(PDK-919\) Workaround PUP-2368 "using booleans result in unmanaged pro… [\#62](https://github.com/puppetlabs/puppet-resource_api/pull/62) ([DavidS](https://github.com/DavidS))
|
16
|
+
|
17
|
+
**Merged pull requests:**
|
18
|
+
|
19
|
+
- \(PDK-526\) do not rely on git when building the gem on jenkins [\#61](https://github.com/puppetlabs/puppet-resource_api/pull/61) ([DavidS](https://github.com/DavidS))
|
20
|
+
- \(PDK-896\) Advanced Array tests [\#60](https://github.com/puppetlabs/puppet-resource_api/pull/60) ([DavidS](https://github.com/DavidS))
|
21
|
+
- Update puppetlabs\_spec\_helper to fixed master version [\#58](https://github.com/puppetlabs/puppet-resource_api/pull/58) ([DavidS](https://github.com/DavidS))
|
22
|
+
- Release prep for v1.0.3 [\#57](https://github.com/puppetlabs/puppet-resource_api/pull/57) ([DavidS](https://github.com/DavidS))
|
23
|
+
|
6
24
|
## [v1.0.3](https://github.com/puppetlabs/puppet-resource_api/tree/v1.0.3) (2018-04-06)
|
7
25
|
[Full Changelog](https://github.com/puppetlabs/puppet-resource_api/compare/v1.0.2...v1.0.3)
|
8
26
|
|
data/Gemfile
CHANGED
@@ -16,7 +16,7 @@ group :tests do
|
|
16
16
|
gem 'rubocop'
|
17
17
|
gem 'simplecov-console'
|
18
18
|
# the test gems required for module testing
|
19
|
-
gem 'puppetlabs_spec_helper',
|
19
|
+
gem 'puppetlabs_spec_helper', '~> 2.7'
|
20
20
|
gem 'rspec-puppet'
|
21
21
|
end
|
22
22
|
|
data/README.md
CHANGED
@@ -191,11 +191,12 @@ This gem is still under heavy development. This section is a living document of
|
|
191
191
|
Currently working:
|
192
192
|
* Basic type and provider definition, using `name`, `desc`, and `attributes`.
|
193
193
|
* Scalar puppet 4 [data types](https://puppet.com/docs/puppet/5.3/lang_data_type.html#core-data-types):
|
194
|
-
* String
|
194
|
+
* String, Enum, Pattern
|
195
195
|
* Integer, Float, Numeric
|
196
196
|
* Boolean
|
197
|
-
*
|
198
|
-
*
|
197
|
+
* Array
|
198
|
+
* Optional
|
199
|
+
* Variant
|
199
200
|
* The `canonicalize`, `simple_get_filter`, and `remote_resource` features.
|
200
201
|
* All the logging facilities.
|
201
202
|
* Executing the new provider under the following commands:
|
@@ -205,7 +206,7 @@ Currently working:
|
|
205
206
|
* `puppet device` (if applicable)
|
206
207
|
|
207
208
|
There are still a few notable gaps between the implementation and the specification:
|
208
|
-
* Complex data types, like
|
209
|
+
* Complex data types, like Hash, Tuple or Struct are not yet implemented.
|
209
210
|
* Only a single runtime environment (the Puppet commands) is currently implemented.
|
210
211
|
|
211
212
|
Restrictions of running under puppet:
|
data/appveyor.yml
CHANGED
@@ -9,17 +9,6 @@ install:
|
|
9
9
|
- set PATH=C:\Ruby%RUBY_VERSION%\bin;C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;%PATH%
|
10
10
|
- SET LOG_SPEC_ORDER=true
|
11
11
|
- SET COVERAGE=yes
|
12
|
-
# Due to a bug in the version of OpenSSL shipped with Ruby 2.4.1 on Windows
|
13
|
-
# (https://bugs.ruby-lang.org/issues/11033). Errors are ignored because the
|
14
|
-
# mingw gem calls out to pacman to install OpenSSL which is already
|
15
|
-
# installed, causing gem to raise a warning that powershell determines to be
|
16
|
-
# a fatal error.
|
17
|
-
- ps: |
|
18
|
-
$ErrorActionPreference = "SilentlyContinue"
|
19
|
-
if($env:RUBY_VERSION -eq "24-x64") {
|
20
|
-
gem install openssl "~> 2.0.4" --no-rdoc --no-ri -- --with-openssl-dir=C:\msys64\mingw64
|
21
|
-
}
|
22
|
-
$host.SetShouldExit(0)
|
23
12
|
- bundle install --jobs 4 --retry 2 --without development
|
24
13
|
|
25
14
|
build: off
|
data/lib/puppet/resource_api.rb
CHANGED
@@ -145,26 +145,46 @@ module Puppet::ResourceApi
|
|
145
145
|
end
|
146
146
|
|
147
147
|
type = Puppet::Pops::Types::TypeParser.singleton.parse(options[:type])
|
148
|
-
|
149
|
-
|
150
|
-
|
148
|
+
if param_or_property == :newproperty
|
149
|
+
define_method(:should) do
|
150
|
+
if type.is_a? Puppet::Pops::Types::PBooleanType
|
151
|
+
# work around https://tickets.puppetlabs.com/browse/PUP-2368
|
152
|
+
rs_value ? :true : :false # rubocop:disable Lint/BooleanSymbol
|
153
|
+
else
|
154
|
+
rs_value
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
define_method(:should=) do |value|
|
159
|
+
@shouldorig = value
|
160
|
+
# Puppet requires the @should value to always be stored as an array. We do not use this
|
161
|
+
# for anything else
|
162
|
+
# @see Puppet::Property.should=(value)
|
163
|
+
@should = [Puppet::ResourceApi.mungify(type, value, "#{definition[:name]}.#{name}")]
|
151
164
|
end
|
152
165
|
|
153
|
-
|
166
|
+
# used internally
|
167
|
+
# @returns the final mungified value of this property
|
168
|
+
define_method(:rs_value) do
|
169
|
+
@should ? @should.first : @should
|
170
|
+
end
|
171
|
+
else
|
172
|
+
define_method(:value) do
|
173
|
+
@value
|
174
|
+
end
|
154
175
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
when %r{^-?\d+$}, Puppet::Pops::Patterns::NUMERIC
|
159
|
-
value = Puppet::Pops::Utils.to_n(value)
|
160
|
-
when %r{\Atrue|false\Z}
|
161
|
-
value = value == 'true'
|
176
|
+
define_method(:value=) do |value|
|
177
|
+
if options[:behaviour] == :read_only
|
178
|
+
raise Puppet::ResourceError, "Attempting to set `#{name}` read_only attribute value to `#{value}`"
|
162
179
|
end
|
163
|
-
return true if type.instance?(value)
|
164
180
|
|
165
|
-
|
166
|
-
|
167
|
-
|
181
|
+
@value = Puppet::ResourceApi.mungify(type, value, "#{definition[:name]}.#{name}")
|
182
|
+
end
|
183
|
+
|
184
|
+
# used internally
|
185
|
+
# @returns the final mungified value of this parameter
|
186
|
+
define_method(:rs_value) do
|
187
|
+
@value
|
168
188
|
end
|
169
189
|
end
|
170
190
|
|
@@ -172,49 +192,40 @@ module Puppet::ResourceApi
|
|
172
192
|
type = type.type
|
173
193
|
end
|
174
194
|
|
175
|
-
#
|
195
|
+
# puppet symbolizes some values through puppet/parameter/value.rb (see .convert()), but (especially) Enums
|
196
|
+
# are strings. specifying a munge block here skips the value_collection fallback in puppet/parameter.rb's
|
197
|
+
# default .unsafe_munge() implementation.
|
198
|
+
munge { |v| v }
|
199
|
+
|
200
|
+
# provide hints to `puppet type generate` for better parsing
|
176
201
|
case type
|
177
202
|
when Puppet::Pops::Types::PStringType
|
178
203
|
# require any string value
|
179
204
|
Puppet::ResourceApi.def_newvalues(self, param_or_property, %r{})
|
180
|
-
# rubocop:disable Lint/BooleanSymbol
|
181
205
|
when Puppet::Pops::Types::PBooleanType
|
182
206
|
Puppet::ResourceApi.def_newvalues(self, param_or_property, 'true', 'false')
|
207
|
+
# rubocop:disable Lint/BooleanSymbol
|
183
208
|
aliasvalue true, 'true'
|
184
209
|
aliasvalue false, 'false'
|
185
210
|
aliasvalue :true, 'true'
|
186
211
|
aliasvalue :false, 'false'
|
187
|
-
|
188
|
-
munge do |v|
|
189
|
-
case v
|
190
|
-
when 'true', :true
|
191
|
-
true
|
192
|
-
when 'false', :false
|
193
|
-
false
|
194
|
-
else
|
195
|
-
v
|
196
|
-
end
|
197
|
-
end
|
198
|
-
# rubocop:enable Lint/BooleanSymbol
|
212
|
+
# rubocop:enable Lint/BooleanSymbol
|
199
213
|
when Puppet::Pops::Types::PIntegerType
|
200
214
|
Puppet::ResourceApi.def_newvalues(self, param_or_property, %r{^-?\d+$})
|
201
|
-
munge do |v|
|
202
|
-
Puppet::Pops::Utils.to_n(v)
|
203
|
-
end
|
204
215
|
when Puppet::Pops::Types::PFloatType, Puppet::Pops::Types::PNumericType
|
205
216
|
Puppet::ResourceApi.def_newvalues(self, param_or_property, Puppet::Pops::Patterns::NUMERIC)
|
206
|
-
|
207
|
-
|
208
|
-
|
217
|
+
end
|
218
|
+
|
219
|
+
if param_or_property == :newproperty
|
220
|
+
# stop puppet from trying to call into the provider when
|
221
|
+
# no pre-defined values have been specified
|
222
|
+
# "This is not the provider you are looking for." -- Obi-Wan Kaniesobi.
|
223
|
+
def call_provider(value); end
|
209
224
|
end
|
210
225
|
|
211
226
|
case options[:type]
|
212
227
|
when 'Enum[present, absent]'
|
213
228
|
Puppet::ResourceApi.def_newvalues(self, param_or_property, 'absent', 'present')
|
214
|
-
# puppet symbolizes these values through puppet/paramter/value.rb (see .convert()), but Enums are strings
|
215
|
-
# specifying a munge block here skips the value_collection fallback in puppet/parameter.rb's
|
216
|
-
# default .unsafe_munge() implementation
|
217
|
-
munge { |v| v }
|
218
229
|
end
|
219
230
|
end
|
220
231
|
end
|
@@ -266,9 +277,8 @@ module Puppet::ResourceApi
|
|
266
277
|
|
267
278
|
define_method(:flush) do
|
268
279
|
# puts 'flush'
|
269
|
-
|
270
|
-
|
271
|
-
target_state.delete(:loglevel)
|
280
|
+
# skip puppet's injected metaparams
|
281
|
+
target_state = Hash[@parameters.reject { |k, _v| [:loglevel, :noop].include? k }.map { |k, v| [k, v.rs_value] }]
|
272
282
|
target_state = my_provider.canonicalize(context, [target_state]).first if feature_support?('canonicalize')
|
273
283
|
|
274
284
|
retrieve unless @rapi_current_state
|
@@ -385,4 +395,87 @@ MESSAGE
|
|
385
395
|
end
|
386
396
|
end
|
387
397
|
end
|
398
|
+
|
399
|
+
# Validates and munges values coming from puppet into a shape palatable to the provider.
|
400
|
+
# This includes parsing values from strings, e.g. when running in `puppet resource`.
|
401
|
+
# @param type[Puppet::Pops::Types::TypedModelObject] the type to check/clean against
|
402
|
+
# @param value the value to clean
|
403
|
+
# @param error_msg_prefix[String] a prefix for the error messages
|
404
|
+
# @return [type] the cleaned value
|
405
|
+
# @raise [Puppet::ResourceError] if `value` could not be parsed into `type`
|
406
|
+
def self.mungify(type, value, error_msg_prefix)
|
407
|
+
cleaned_value, error = try_mungify(type, value, error_msg_prefix)
|
408
|
+
|
409
|
+
raise Puppet::ResourceError, error if error
|
410
|
+
|
411
|
+
cleaned_value
|
412
|
+
end
|
413
|
+
|
414
|
+
# Recursive implementation part of #mungify. Uses a multi-valued return value to avoid excessive
|
415
|
+
# exception throwing for regular usage
|
416
|
+
# @return [Array] if the mungify worked, the first element is the cleaned value, and the second
|
417
|
+
# element is nil. If the mungify failed, the first element is nil, and the second element is an error
|
418
|
+
# message
|
419
|
+
# @private
|
420
|
+
def self.try_mungify(type, value, error_msg_prefix)
|
421
|
+
case type
|
422
|
+
when Puppet::Pops::Types::PArrayType
|
423
|
+
if value.is_a? Array
|
424
|
+
conversions = value.map do |v|
|
425
|
+
try_mungify(type.element_type, v, error_msg_prefix)
|
426
|
+
end
|
427
|
+
# only convert the values if none failed. otherwise fall through and rely on puppet to render a proper error
|
428
|
+
if conversions.all? { |c| c[1].nil? }
|
429
|
+
value = conversions.map { |c| c[0] }
|
430
|
+
end
|
431
|
+
end
|
432
|
+
when Puppet::Pops::Types::PBooleanType
|
433
|
+
value = case value
|
434
|
+
when 'true', :true # rubocop:disable Lint/BooleanSymbol
|
435
|
+
true
|
436
|
+
when 'false', :false # rubocop:disable Lint/BooleanSymbol
|
437
|
+
false
|
438
|
+
else
|
439
|
+
value
|
440
|
+
end
|
441
|
+
when Puppet::Pops::Types::PIntegerType, Puppet::Pops::Types::PFloatType, Puppet::Pops::Types::PNumericType
|
442
|
+
if value =~ %r{^-?\d+$} || value =~ Puppet::Pops::Patterns::NUMERIC
|
443
|
+
value = Puppet::Pops::Utils.to_n(value)
|
444
|
+
end
|
445
|
+
when Puppet::Pops::Types::PEnumType, Puppet::Pops::Types::PStringType, Puppet::Pops::Types::PPatternType
|
446
|
+
if value.is_a? Symbol
|
447
|
+
value = value.to_s
|
448
|
+
end
|
449
|
+
when Puppet::Pops::Types::POptionalType
|
450
|
+
return value.nil? ? [nil, nil] : try_mungify(type.type, value, error_msg_prefix)
|
451
|
+
when Puppet::Pops::Types::PVariantType
|
452
|
+
# try converting to anything except string first
|
453
|
+
string_type = type.types.find { |t| t.is_a? Puppet::Pops::Types::PStringType }
|
454
|
+
conversion_results = (type.types - [string_type]).map do |t|
|
455
|
+
try_mungify(t, value, error_msg_prefix)
|
456
|
+
end
|
457
|
+
|
458
|
+
# only consider valid results
|
459
|
+
conversion_results = conversion_results.select { |r| r[1].nil? }.to_a
|
460
|
+
|
461
|
+
# use the conversion result if unambiguous
|
462
|
+
return conversion_results[0] if conversion_results.length == 1
|
463
|
+
|
464
|
+
# return an error if ambiguous
|
465
|
+
return [nil, "#{error_msg_prefix} #{value.inspect} is not unabiguously convertable to #{type}"] if conversion_results.length > 1
|
466
|
+
|
467
|
+
# try to interpret as string
|
468
|
+
return try_mungify(string_type, value, error_msg_prefix) if string_type
|
469
|
+
|
470
|
+
# fall through to default handling
|
471
|
+
end
|
472
|
+
|
473
|
+
# a match!
|
474
|
+
return [value, nil] if type.instance?(value)
|
475
|
+
|
476
|
+
# an error :-(
|
477
|
+
inferred_type = Puppet::Pops::Types::TypeCalculator.infer_set(value)
|
478
|
+
error_msg = Puppet::Pops::Types::TypeMismatchDescriber.new.describe_mismatch(error_msg_prefix, type, inferred_type)
|
479
|
+
return [nil, error_msg] # the entire function is using returns for clarity # rubocop:disable Style/RedundantReturn
|
480
|
+
end
|
388
481
|
end
|
data/puppet-resource_api.gemspec
CHANGED
@@ -11,9 +11,15 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.summary = 'This library provides a simple way to write new native resources for puppet.'
|
12
12
|
spec.homepage = 'https://github.com/puppetlabs/puppet-resource_api'
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
# on out internal jenkins, there is no `.git` directory, but since it is a clean machine, we don't need to worry about anything else
|
15
|
+
spec.files = if Dir.exist?('.git')
|
16
|
+
`git ls-files -z`.split("\x0")
|
17
|
+
else
|
18
|
+
Dir.glob('**/*')
|
19
|
+
end.reject do |f|
|
20
|
+
f.match(%r{^(test|spec|features)/})
|
21
|
+
end
|
22
|
+
|
17
23
|
spec.bindir = 'exe'
|
18
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
25
|
spec.require_paths = ['lib']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-resource_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Schmitt
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hocon
|