puppet 4.4.2 → 4.5.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CONTRIBUTING.md +5 -5
- data/Gemfile +2 -2
- data/LICENSE +2 -2
- data/README.md +5 -0
- data/ext/project_data.yaml +2 -0
- data/lib/hiera_puppet.rb +6 -14
- data/lib/puppet/application/agent.rb +2 -3
- data/lib/puppet/data_providers/hiera_config.rb +2 -4
- data/lib/puppet/data_providers/hiera_interpolate.rb +12 -154
- data/lib/puppet/data_providers/json_data_provider_factory.rb +0 -7
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -8
- data/lib/puppet/defaults.rb +70 -7
- data/lib/puppet/functions.rb +69 -0
- data/lib/puppet/functions/dig.rb +39 -0
- data/lib/puppet/functions/lest.rb +53 -0
- data/lib/puppet/functions/lookup.rb +40 -27
- data/lib/puppet/functions/new.rb +502 -0
- data/lib/puppet/functions/regsubst.rb +11 -10
- data/lib/puppet/functions/then.rb +74 -0
- data/lib/puppet/functions/type.rb +4 -4
- data/lib/puppet/functions/with.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +2 -0
- data/lib/puppet/indirector/resource_type/parser.rb +5 -0
- data/lib/puppet/indirector/rest.rb +5 -1
- data/lib/puppet/loaders.rb +2 -0
- data/lib/puppet/metatype/manager.rb +19 -2
- data/lib/puppet/module_tool/applications/application.rb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +6 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
- data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +6 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +20 -3
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +24 -2
- data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
- data/lib/puppet/parser/environment_compiler.rb +2 -2
- data/lib/puppet/parser/resource.rb +14 -5
- data/lib/puppet/parser/scope.rb +18 -15
- data/lib/puppet/plugins/data_providers/data_provider.rb +19 -8
- data/lib/puppet/pops.rb +6 -0
- data/lib/puppet/pops/adapters.rb +5 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +52 -14
- data/lib/puppet/pops/evaluator/compare_operator.rb +34 -4
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +75 -22
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +7 -6
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +13 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +14 -4
- data/lib/puppet/pops/functions/dispatcher.rb +1 -1
- data/lib/puppet/pops/issues.rb +18 -2
- data/lib/puppet/pops/loader/base_loader.rb +48 -7
- data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
- data/lib/puppet/pops/loader/loader.rb +12 -0
- data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
- data/lib/puppet/pops/loader/static_loader.rb +92 -5
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +25 -3
- data/lib/puppet/pops/loaders.rb +84 -14
- data/lib/puppet/pops/lookup/explainer.rb +38 -1
- data/lib/puppet/pops/lookup/interpolation.rb +115 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
- data/lib/puppet/pops/model/ast_transformer.rb +8 -1
- data/lib/puppet/pops/model/factory.rb +31 -8
- data/lib/puppet/pops/model/model.rb +8 -0
- data/lib/puppet/pops/model/model_label_provider.rb +1 -0
- data/lib/puppet/pops/model/model_meta.rb +7 -1
- data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
- data/lib/puppet/pops/parser/egrammar.ra +24 -7
- data/lib/puppet/pops/parser/eparser.rb +863 -798
- data/lib/puppet/pops/parser/evaluating_parser.rb +4 -0
- data/lib/puppet/pops/parser/locator.rb +8 -4
- data/lib/puppet/pops/pcore.rb +30 -0
- data/lib/puppet/pops/types/class_loader.rb +2 -4
- data/lib/puppet/pops/types/implementation_registry.rb +146 -0
- data/lib/puppet/pops/types/iterable.rb +4 -4
- data/lib/puppet/pops/types/p_object_type.rb +846 -0
- data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
- data/lib/puppet/pops/types/puppet_object.rb +21 -0
- data/lib/puppet/pops/types/ruby_generator.rb +258 -0
- data/lib/puppet/pops/types/string_converter.rb +922 -0
- data/lib/puppet/pops/types/type_calculator.rb +29 -5
- data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
- data/lib/puppet/pops/types/type_factory.rb +49 -16
- data/lib/puppet/pops/types/type_formatter.rb +335 -112
- data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -29
- data/lib/puppet/pops/types/type_parser.rb +205 -197
- data/lib/puppet/pops/types/types.rb +481 -103
- data/lib/puppet/pops/validation.rb +1 -1
- data/lib/puppet/pops/validation/checker4_0.rb +66 -4
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/pops/visitor.rb +3 -1
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +64 -20
- data/lib/puppet/provider/package/rpm.rb +112 -0
- data/lib/puppet/provider/package/yum.rb +7 -68
- data/lib/puppet/provider/service/daemontools.rb +3 -3
- data/lib/puppet/provider/service/init.rb +4 -2
- data/lib/puppet/provider/service/runit.rb +3 -3
- data/lib/puppet/provider/service/smf.rb +6 -3
- data/lib/puppet/provider/service/systemd.rb +59 -73
- data/lib/puppet/reference/providers.rb +1 -2
- data/lib/puppet/resource.rb +54 -37
- data/lib/puppet/resource/catalog.rb +31 -29
- data/lib/puppet/resource/type_collection.rb +23 -8
- data/lib/puppet/settings.rb +4 -2
- data/lib/puppet/settings/base_setting.rb +9 -3
- data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
- data/lib/puppet/test/test_helper.rb +0 -1
- data/lib/puppet/type.rb +9 -3
- data/lib/puppet/type/exec.rb +17 -17
- data/lib/puppet/type/file.rb +12 -0
- data/lib/puppet/type/file/content.rb +6 -6
- data/lib/puppet/type/file/ensure.rb +4 -4
- data/lib/puppet/type/file/source.rb +4 -4
- data/lib/puppet/type/file/target.rb +2 -2
- data/lib/puppet/type/mount.rb +18 -1
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/type/schedule.rb +4 -4
- data/lib/puppet/type/service.rb +15 -0
- data/lib/puppet/type/sshkey.rb +5 -3
- data/lib/puppet/type/tidy.rb +3 -3
- data/lib/puppet/type/zone.rb +5 -5
- data/lib/puppet/util/feature.rb +1 -1
- data/lib/puppet/util/monkey_patches.rb +8 -0
- data/lib/puppet/util/network_device/cisco/device.rb +16 -6
- data/lib/puppet/util/network_device/cisco/interface.rb +5 -6
- data/lib/puppet/util/plist.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +13 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -0
- data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
- data/spec/integration/module_tool/tar/mini_spec.rb +27 -27
- data/spec/integration/parser/catalog_spec.rb +14 -2
- data/spec/integration/parser/compiler_spec.rb +94 -3
- data/spec/integration/parser/resource_expressions_spec.rb +1 -1
- data/spec/integration/resource/type_collection_spec.rb +8 -0
- data/spec/lib/puppet_spec/compiler.rb +11 -4
- data/spec/shared_contexts/types_setup.rb +4 -0
- data/spec/unit/application/lookup_spec.rb +91 -9
- data/spec/unit/appmgmt_spec.rb +44 -35
- data/spec/unit/capability_spec.rb +33 -53
- data/spec/unit/data_providers/function_data_provider_spec.rb +19 -1
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +18 -0
- data/spec/unit/functions/assert_type_spec.rb +1 -1
- data/spec/unit/functions/dig_spec.rb +58 -0
- data/spec/unit/functions/lest_spec.rb +34 -0
- data/spec/unit/functions/lookup_spec.rb +108 -2
- data/spec/unit/functions/new_spec.rb +543 -0
- data/spec/unit/functions/regsubst_spec.rb +8 -0
- data/spec/unit/functions/then_spec.rb +40 -0
- data/spec/unit/functions4_spec.rb +78 -10
- data/spec/unit/hiera_puppet_spec.rb +49 -8
- data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
- data/spec/unit/indirector/rest_spec.rb +12 -0
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
- data/spec/unit/node/environment_spec.rb +10 -0
- data/spec/unit/parser/compiler_spec.rb +20 -1
- data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
- data/spec/unit/parser/functions/shared.rb +1 -1
- data/spec/unit/parser/resource_spec.rb +8 -1
- data/spec/unit/parser/scope_spec.rb +45 -0
- data/spec/unit/pops/evaluator/access_ops_spec.rb +14 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +13 -5
- data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
- data/spec/unit/{data_providers/hiera_interpolation_spec.rb → pops/lookup/interpolation_spec.rb} +7 -5
- data/spec/unit/pops/parser/lexer2_spec.rb +2 -9
- data/spec/unit/pops/parser/parse_application_spec.rb +3 -8
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +19 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +3 -10
- data/spec/unit/pops/parser/parse_site_spec.rb +19 -10
- data/spec/unit/pops/parser/parser_rspec_helper.rb +0 -4
- data/spec/unit/pops/types/enumeration_spec.rb +13 -12
- data/spec/unit/pops/types/iterable_spec.rb +2 -2
- data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +19 -17
- data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
- data/spec/unit/pops/types/string_converter_spec.rb +904 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +430 -406
- data/spec/unit/pops/types/type_factory_spec.rb +119 -104
- data/spec/unit/pops/types/type_formatter_spec.rb +73 -6
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
- data/spec/unit/pops/types/type_parser_spec.rb +54 -15
- data/spec/unit/pops/types/types_spec.rb +113 -8
- data/spec/unit/pops/validator/validator_spec.rb +84 -10
- data/spec/unit/provider/package/pip3_spec.rb +9 -270
- data/spec/unit/provider/package/pip_spec.rb +85 -30
- data/spec/unit/provider/package/rpm_spec.rb +160 -3
- data/spec/unit/provider/package/yum_spec.rb +23 -134
- data/spec/unit/provider/service/smf_spec.rb +14 -2
- data/spec/unit/provider/service/systemd_spec.rb +33 -41
- data/spec/unit/resource/capability_finder_spec.rb +10 -2
- data/spec/unit/settings/file_setting_spec.rb +6 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +80 -65
- data/spec/unit/type/mount_spec.rb +51 -10
- data/spec/unit/type/service_spec.rb +16 -0
- data/spec/unit/type_spec.rb +14 -0
- data/spec/unit/util/feature_spec.rb +1 -1
- data/spec/unit/util/monkey_patches_spec.rb +60 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
- metadata +63 -11
- data/lib/puppet/pops/types/types_meta.rb +0 -0
- data/spec/integration/provider/package_spec.rb +0 -35
@@ -114,7 +114,7 @@ describe "Puppet resource expressions" do
|
|
114
114
|
|
115
115
|
fails( "define a::b { notify { testing: } } 'a::b' { title: }" => /Illegal Resource Type expression.*got String/)
|
116
116
|
|
117
|
-
fails( "Does::Not::Exist { title: }" => /
|
117
|
+
fails( "Does::Not::Exist { title: }" => /Resource type not found: Does::Not::Exist/)
|
118
118
|
end
|
119
119
|
|
120
120
|
context "local defaults" do
|
@@ -12,6 +12,14 @@ describe Puppet::Resource::TypeCollection do
|
|
12
12
|
@dir = tmpfile("autoload_testing")
|
13
13
|
FileUtils.mkdir_p @dir
|
14
14
|
|
15
|
+
loader = Object.new
|
16
|
+
loader.stubs(:load).returns nil
|
17
|
+
loader.stubs(:set_entry)
|
18
|
+
|
19
|
+
loaders = Object.new
|
20
|
+
loaders.expects(:runtime3_type_loader).at_most_once.returns loader
|
21
|
+
Puppet::Pops::Loaders.expects(:loaders).at_most_once.returns loaders
|
22
|
+
|
15
23
|
environment = Puppet::Node::Environment.create(:env, [@dir])
|
16
24
|
@code = environment.known_resource_types
|
17
25
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module PuppetSpec::Compiler
|
2
2
|
module_function
|
3
3
|
|
4
|
-
def compile_to_catalog(string, node = Puppet::Node.new('
|
4
|
+
def compile_to_catalog(string, node = Puppet::Node.new('test'))
|
5
5
|
Puppet[:code] = string
|
6
6
|
# see lib/puppet/indirector/catalog/compiler.rb#filter
|
7
7
|
Puppet::Parser::Compiler.compile(node).filter { |r| r.virtual? }
|
8
8
|
end
|
9
9
|
|
10
|
-
def compile_to_ral(manifest)
|
11
|
-
catalog = compile_to_catalog(manifest)
|
10
|
+
def compile_to_ral(manifest, node = Puppet::Node.new('test'))
|
11
|
+
catalog = compile_to_catalog(manifest, node)
|
12
12
|
ral = catalog.to_ral
|
13
13
|
ral.finalize
|
14
14
|
ral
|
@@ -60,7 +60,14 @@ module PuppetSpec::Compiler
|
|
60
60
|
|
61
61
|
def eval_and_collect_notices(code, node = Puppet::Node.new('foonode'))
|
62
62
|
collect_notices(code, node) do |compiler|
|
63
|
-
|
63
|
+
if block_given?
|
64
|
+
compiler.compile do |catalog|
|
65
|
+
yield(compiler.topscope, catalog)
|
66
|
+
catalog
|
67
|
+
end
|
68
|
+
else
|
69
|
+
compiler.compile
|
70
|
+
end
|
64
71
|
end
|
65
72
|
end
|
66
73
|
end
|
@@ -32,6 +32,8 @@ shared_context 'types_setup' do
|
|
32
32
|
Puppet::Pops::Types::PDefaultType,
|
33
33
|
Puppet::Pops::Types::PTypeReferenceType,
|
34
34
|
Puppet::Pops::Types::PTypeAliasType,
|
35
|
+
Puppet::Pops::Types::PSemVerType,
|
36
|
+
Puppet::Pops::Types::PSemVerRangeType,
|
35
37
|
]
|
36
38
|
end
|
37
39
|
|
@@ -47,6 +49,8 @@ shared_context 'types_setup' do
|
|
47
49
|
Puppet::Pops::Types::PBooleanType,
|
48
50
|
Puppet::Pops::Types::PPatternType,
|
49
51
|
Puppet::Pops::Types::PEnumType,
|
52
|
+
Puppet::Pops::Types::PSemVerType,
|
53
|
+
Puppet::Pops::Types::PSemVerRangeType,
|
50
54
|
]
|
51
55
|
end
|
52
56
|
|
@@ -166,7 +166,8 @@ describe Puppet::Application::Lookup do
|
|
166
166
|
lookup.options[:node] = node
|
167
167
|
lookup.options[:explain] = true
|
168
168
|
lookup.command_line.stubs(:args).returns(['a'])
|
169
|
-
|
169
|
+
begin
|
170
|
+
expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
|
170
171
|
Merge strategy first
|
171
172
|
Data Binding "hiera"
|
172
173
|
No such key: "a"
|
@@ -177,13 +178,17 @@ Merge strategy first
|
|
177
178
|
Original path: "common"
|
178
179
|
Found key: "a" value: "This is A"
|
179
180
|
Merged result: "This is A"
|
180
|
-
|
181
|
+
EXPLANATION
|
182
|
+
rescue SystemExit => e
|
183
|
+
expect(e.status).to eq(0)
|
184
|
+
end
|
181
185
|
end
|
182
186
|
|
183
187
|
it '--explain produces human readable text of a hash merge when using --explain-options' do
|
184
188
|
lookup.options[:node] = node
|
185
189
|
lookup.options[:explain_options] = true
|
186
|
-
|
190
|
+
begin
|
191
|
+
expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
|
187
192
|
Merge strategy hash
|
188
193
|
Data Binding "hiera"
|
189
194
|
No such key: "lookup_options"
|
@@ -198,7 +203,10 @@ Merge strategy hash
|
|
198
203
|
Merged result: {
|
199
204
|
"a" => "first"
|
200
205
|
}
|
201
|
-
|
206
|
+
EXPLANATION
|
207
|
+
rescue SystemExit => e
|
208
|
+
expect(e.status).to eq(0)
|
209
|
+
end
|
202
210
|
end
|
203
211
|
|
204
212
|
it '--explain produces human readable text of a hash merge when using both --explain and --explain-options' do
|
@@ -206,7 +214,8 @@ Merge strategy hash
|
|
206
214
|
lookup.options[:explain] = true
|
207
215
|
lookup.options[:explain_options] = true
|
208
216
|
lookup.command_line.stubs(:args).returns(['a'])
|
209
|
-
|
217
|
+
begin
|
218
|
+
expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
|
210
219
|
Searching for "lookup_options"
|
211
220
|
Merge strategy hash
|
212
221
|
Data Binding "hiera"
|
@@ -233,7 +242,10 @@ Searching for "a"
|
|
233
242
|
Original path: "common"
|
234
243
|
Found key: "a" value: "This is A"
|
235
244
|
Merged result: "This is A"
|
236
|
-
|
245
|
+
EXPLANATION
|
246
|
+
rescue SystemExit => e
|
247
|
+
expect(e.status).to eq(0)
|
248
|
+
end
|
237
249
|
end
|
238
250
|
|
239
251
|
it 'can produce a yaml explanation' do
|
@@ -247,6 +259,8 @@ Searching for "a"
|
|
247
259
|
$stdout = StringIO.new
|
248
260
|
lookup.run_command
|
249
261
|
output = $stdout.string
|
262
|
+
rescue SystemExit => e
|
263
|
+
expect(e.status).to eq(0)
|
250
264
|
ensure
|
251
265
|
$stdout = save_stdout
|
252
266
|
end
|
@@ -264,12 +278,68 @@ Searching for "a"
|
|
264
278
|
$stdout = StringIO.new
|
265
279
|
lookup.run_command
|
266
280
|
output = $stdout.string
|
281
|
+
rescue SystemExit => e
|
282
|
+
expect(e.status).to eq(0)
|
267
283
|
ensure
|
268
284
|
$stdout = save_stdout
|
269
285
|
end
|
270
286
|
expect(JSON.parse(output)).to eq(expected_json_hash)
|
271
287
|
end
|
272
288
|
|
289
|
+
it 'can access values using dotted keys' do
|
290
|
+
lookup.options[:node] = node
|
291
|
+
lookup.options[:render_as] = :json
|
292
|
+
lookup.command_line.stubs(:args).returns(['d.one.two.three'])
|
293
|
+
save_stdout = $stdout
|
294
|
+
output = nil
|
295
|
+
begin
|
296
|
+
$stdout = StringIO.new
|
297
|
+
lookup.run_command
|
298
|
+
output = $stdout.string
|
299
|
+
rescue SystemExit => e
|
300
|
+
expect(e.status).to eq(0)
|
301
|
+
ensure
|
302
|
+
$stdout = save_stdout
|
303
|
+
end
|
304
|
+
expect(JSON.parse("[#{output}]")).to eq(['the value'])
|
305
|
+
end
|
306
|
+
|
307
|
+
it 'can access values using quoted dotted keys' do
|
308
|
+
lookup.options[:node] = node
|
309
|
+
lookup.options[:render_as] = :json
|
310
|
+
lookup.command_line.stubs(:args).returns(['"e.one.two.three"'])
|
311
|
+
save_stdout = $stdout
|
312
|
+
output = nil
|
313
|
+
begin
|
314
|
+
$stdout = StringIO.new
|
315
|
+
lookup.run_command
|
316
|
+
output = $stdout.string
|
317
|
+
rescue SystemExit => e
|
318
|
+
expect(e.status).to eq(0)
|
319
|
+
ensure
|
320
|
+
$stdout = save_stdout
|
321
|
+
end
|
322
|
+
expect(JSON.parse("[#{output}]")).to eq(['the value'])
|
323
|
+
end
|
324
|
+
|
325
|
+
it 'can access values using mix of dotted keys and quoted dotted keys' do
|
326
|
+
lookup.options[:node] = node
|
327
|
+
lookup.options[:render_as] = :json
|
328
|
+
lookup.command_line.stubs(:args).returns(['"f.one"."two.three".1'])
|
329
|
+
save_stdout = $stdout
|
330
|
+
output = nil
|
331
|
+
begin
|
332
|
+
$stdout = StringIO.new
|
333
|
+
lookup.run_command
|
334
|
+
output = $stdout.string
|
335
|
+
rescue SystemExit => e
|
336
|
+
expect(e.status).to eq(0)
|
337
|
+
ensure
|
338
|
+
$stdout = save_stdout
|
339
|
+
end
|
340
|
+
expect(JSON.parse("[#{output}]")).to eq(['second value'])
|
341
|
+
end
|
342
|
+
|
273
343
|
context 'the global scope' do
|
274
344
|
it "is unaffected by global variables unless '--compile' is used" do
|
275
345
|
lookup.options[:node] = node
|
@@ -281,7 +351,11 @@ Searching for "a"
|
|
281
351
|
lookup.options[:node] = node
|
282
352
|
lookup.options[:compile] = true
|
283
353
|
lookup.command_line.stubs(:args).returns(['c'])
|
284
|
-
|
354
|
+
begin
|
355
|
+
expect { lookup.run_command }.to output("--- This is C from site.pp\n...\n").to_stdout
|
356
|
+
rescue SystemExit => e
|
357
|
+
expect(e.status).to eq(0)
|
358
|
+
end
|
285
359
|
end
|
286
360
|
end
|
287
361
|
|
@@ -291,14 +365,22 @@ Searching for "a"
|
|
291
365
|
it "works OK in the absense of '--compile'" do
|
292
366
|
lookup.options[:node] = node
|
293
367
|
lookup.command_line.stubs(:args).returns(['c'])
|
294
|
-
|
368
|
+
begin
|
369
|
+
expect { lookup.run_command }.to output("--- This is C from data.pp\n...\n").to_stdout
|
370
|
+
rescue SystemExit => e
|
371
|
+
expect(e.status).to eq(0)
|
372
|
+
end
|
295
373
|
end
|
296
374
|
|
297
375
|
it "global scope is affected by global variables when '--compile' is used" do
|
298
376
|
lookup.options[:node] = node
|
299
377
|
lookup.options[:compile] = true
|
300
378
|
lookup.command_line.stubs(:args).returns(['c'])
|
301
|
-
|
379
|
+
begin
|
380
|
+
expect { lookup.run_command }.to output("--- This is C from site.pp\n...\n").to_stdout
|
381
|
+
rescue SystemExit => e
|
382
|
+
expect(e.status).to eq(0)
|
383
|
+
end
|
302
384
|
end
|
303
385
|
end
|
304
386
|
end
|
data/spec/unit/appmgmt_spec.rb
CHANGED
@@ -1,34 +1,33 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'puppet_spec/compiler'
|
4
|
-
require_relative 'pops/parser/parser_rspec_helper'
|
5
4
|
require 'puppet/parser/environment_compiler'
|
6
5
|
|
7
6
|
describe "Application instantiation" do
|
8
7
|
include PuppetSpec::Compiler
|
9
|
-
# We pull this in because we need access to with_app_management; and
|
10
|
-
# since that has to root around in the guts of the Pops parser, there's
|
11
|
-
# no really elegant way to do this
|
12
|
-
include ParserRspecHelper
|
13
8
|
|
14
|
-
|
9
|
+
let(:env) { Puppet::Node::Environment.create(:testing, []) }
|
10
|
+
let(:node) { Puppet::Node.new('test', :environment => env) }
|
11
|
+
let(:loaders) { Puppet::Pops::Loaders.new(env) }
|
12
|
+
|
13
|
+
def compile_to_env_catalog(string, code_id=nil)
|
15
14
|
Puppet[:code] = string
|
16
|
-
|
17
|
-
Puppet::Parser::EnvironmentCompiler.compile(env).filter { |r| r.virtual? }
|
15
|
+
Puppet::Parser::EnvironmentCompiler.compile(env, code_id).filter { |r| r.virtual? }
|
18
16
|
end
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Puppet::
|
24
|
-
|
25
|
-
|
18
|
+
around :each do |example|
|
19
|
+
Puppet[:app_management] = true
|
20
|
+
Puppet::Parser::Compiler.any_instance.stubs(:loaders).returns(loaders)
|
21
|
+
Puppet::Parser::EnvironmentCompiler.any_instance.stubs(:loaders).returns(loaders)
|
22
|
+
Puppet.override(:loaders => loaders, :current_environment => env) do
|
23
|
+
Puppet::Type.newtype :cap, :is_capability => true do
|
24
|
+
newparam :name
|
25
|
+
newparam :host
|
26
|
+
end
|
27
|
+
example.run
|
28
|
+
Puppet::Type.rmtype(:cap)
|
26
29
|
end
|
27
|
-
|
28
|
-
|
29
|
-
after :each do
|
30
|
-
Puppet::Type.rmtype(:cap)
|
31
|
-
with_app_management(false)
|
30
|
+
Puppet[:app_management] = false
|
32
31
|
end
|
33
32
|
|
34
33
|
MANIFEST = <<-EOS
|
@@ -318,29 +317,29 @@ MANIFEST_WITH_CLASS = <<-EOS
|
|
318
317
|
EOS
|
319
318
|
|
320
319
|
|
321
|
-
|
320
|
+
context 'a node catalog' do
|
322
321
|
it "is unaffected for a non-participating node" do
|
323
|
-
catalog = compile_to_catalog(MANIFEST, Puppet::Node.new('other'))
|
322
|
+
catalog = compile_to_catalog(MANIFEST, Puppet::Node.new('other', :environment => env))
|
324
323
|
types = catalog.resource_keys.map { |type, _| type }.uniq.sort
|
325
324
|
expect(types).to eq(["Class", "Stage"])
|
326
325
|
end
|
327
326
|
|
328
327
|
it "an application instance must be contained in a site" do
|
329
|
-
expect { compile_to_catalog(FAULTY_MANIFEST, Puppet::Node.new('first'))
|
328
|
+
expect { compile_to_catalog(FAULTY_MANIFEST, Puppet::Node.new('first', :environment => env))
|
330
329
|
}.to raise_error(/Application instances .* can only be contained within a Site/)
|
331
330
|
end
|
332
331
|
|
333
332
|
it "does not raise an error when node mappings are not provided" do
|
334
|
-
expect { compile_to_catalog(MANIFEST_WO_NODE) }.to_not raise_error
|
333
|
+
expect { compile_to_catalog(MANIFEST_WO_NODE, node) }.to_not raise_error
|
335
334
|
end
|
336
335
|
|
337
336
|
it "raises an error if node mapping is a string" do
|
338
|
-
expect { compile_to_catalog(MANIFEST_WITH_STRING_NODES)
|
337
|
+
expect { compile_to_catalog(MANIFEST_WITH_STRING_NODES, node)
|
339
338
|
}.to raise_error(/Invalid node mapping in .*: Mapping must be a hash/)
|
340
339
|
end
|
341
340
|
|
342
341
|
it "raises an error if node mapping is false" do
|
343
|
-
expect { compile_to_catalog(MANIFEST_WITH_FALSE_NODES)
|
342
|
+
expect { compile_to_catalog(MANIFEST_WITH_FALSE_NODES, node)
|
344
343
|
}.to raise_error(/Invalid node mapping in .*: Mapping must be a hash/)
|
345
344
|
end
|
346
345
|
|
@@ -360,7 +359,7 @@ EOS
|
|
360
359
|
end
|
361
360
|
|
362
361
|
context "for producing node" do
|
363
|
-
let(:compiled_node) { Puppet::Node.new('first') }
|
362
|
+
let(:compiled_node) { Puppet::Node.new('first', :environment => env) }
|
364
363
|
let(:compiled_catalog) { compile_to_catalog(MANIFEST, compiled_node)}
|
365
364
|
|
366
365
|
{ "App[anapp]" => 'application instance',
|
@@ -379,7 +378,7 @@ EOS
|
|
379
378
|
end
|
380
379
|
|
381
380
|
context "for consuming node" do
|
382
|
-
let(:compiled_node) { Puppet::Node.new('second') }
|
381
|
+
let(:compiled_node) { Puppet::Node.new('second', :environment => env) }
|
383
382
|
let(:compiled_catalog) { compile_to_catalog(MANIFEST, compiled_node)}
|
384
383
|
let(:cap) {
|
385
384
|
the_cap = Puppet::Resource.new("Cap", "cap")
|
@@ -407,7 +406,7 @@ EOS
|
|
407
406
|
end
|
408
407
|
|
409
408
|
context "for node with class producer" do
|
410
|
-
let(:compiled_node) { Puppet::Node.new('first') }
|
409
|
+
let(:compiled_node) { Puppet::Node.new('first', :environment => env) }
|
411
410
|
let(:compiled_catalog) { compile_to_catalog(MANIFEST_WITH_CLASS, compiled_node)}
|
412
411
|
|
413
412
|
{ "App[anapp]" => 'application instance',
|
@@ -427,7 +426,7 @@ EOS
|
|
427
426
|
end
|
428
427
|
|
429
428
|
context "for node with class consumer" do
|
430
|
-
let(:compiled_node) { Puppet::Node.new('second') }
|
429
|
+
let(:compiled_node) { Puppet::Node.new('second', :environment => env) }
|
431
430
|
let(:compiled_catalog) { compile_to_catalog(MANIFEST_WITH_CLASS, compiled_node)}
|
432
431
|
let(:cap) {
|
433
432
|
the_cap = Puppet::Resource.new("Cap", "cap")
|
@@ -460,7 +459,7 @@ EOS
|
|
460
459
|
# that are used to instantiate an application. The application instances are needed.
|
461
460
|
#
|
462
461
|
it "the node expressions is evaluated" do
|
463
|
-
catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other'))
|
462
|
+
catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other', :environment => env))
|
464
463
|
types = catalog.resource_keys.map { |type, _| type }.uniq.sort
|
465
464
|
expect(types).to eq(["Class", "Node", "Notify", "Stage"])
|
466
465
|
expect(catalog.resource("Notify[on a node]")).to_not be_nil
|
@@ -471,7 +470,7 @@ EOS
|
|
471
470
|
|
472
471
|
context "when using a site expression" do
|
473
472
|
it "the site expression is not evaluated in a node compilation" do
|
474
|
-
catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other'))
|
473
|
+
catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other', :environment => env))
|
475
474
|
types = catalog.resource_keys.map { |type, _| type }.uniq.sort
|
476
475
|
expect(types).to eq(["Class", "Node", "Notify", "Stage"])
|
477
476
|
expect(catalog.resource("Notify[on a node]")).to_not be_nil
|
@@ -574,12 +573,22 @@ EOS
|
|
574
573
|
}.to raise_error(/Only application components can appear inside a site - Notify\[fail me\] is not allowed at line 20/)
|
575
574
|
end
|
576
575
|
end
|
576
|
+
|
577
|
+
it "includes code_id if specified" do
|
578
|
+
catalog = compile_to_env_catalog(MANIFEST_WITH_SITE, "12345")
|
579
|
+
expect(catalog.code_id).to eq("12345")
|
580
|
+
end
|
581
|
+
|
582
|
+
it "omits code_id if unspecified" do
|
583
|
+
catalog = compile_to_env_catalog(MANIFEST_WITH_SITE)
|
584
|
+
expect(catalog.code_id).to be_nil
|
585
|
+
end
|
577
586
|
end
|
578
587
|
|
579
588
|
|
580
589
|
describe "when validation of nodes" do
|
581
590
|
it 'validates that the key of a node mapping is a Node' do
|
582
|
-
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other'))
|
591
|
+
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other', :environment => env))
|
583
592
|
application app {
|
584
593
|
}
|
585
594
|
|
@@ -595,7 +604,7 @@ EOS
|
|
595
604
|
end
|
596
605
|
|
597
606
|
it 'validates that the value of a node mapping is a resource' do
|
598
|
-
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other'))
|
607
|
+
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other', :environment => env))
|
599
608
|
application app {
|
600
609
|
}
|
601
610
|
|
@@ -611,7 +620,7 @@ EOS
|
|
611
620
|
end
|
612
621
|
|
613
622
|
it 'validates that the value can be an array or resources' do
|
614
|
-
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other'))
|
623
|
+
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other', :environment => env))
|
615
624
|
define p {
|
616
625
|
notify {$title:}
|
617
626
|
}
|
@@ -633,7 +642,7 @@ EOS
|
|
633
642
|
end
|
634
643
|
|
635
644
|
it 'validates that the is bound to exactly one node' do
|
636
|
-
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('first'))
|
645
|
+
expect { compile_to_catalog(<<-EOS, Puppet::Node.new('first', :environment => env))
|
637
646
|
define p {
|
638
647
|
notify {$title:}
|
639
648
|
}
|
@@ -1,33 +1,30 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'puppet_spec/compiler'
|
4
|
-
require_relative 'pops/parser/parser_rspec_helper'
|
5
4
|
|
6
|
-
describe
|
5
|
+
describe 'Capability types' do
|
7
6
|
include PuppetSpec::Compiler
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
Puppet::
|
15
|
-
|
16
|
-
|
7
|
+
let(:env) { Puppet::Node::Environment.create(:testing, []) }
|
8
|
+
let(:node) { Puppet::Node.new('test', :environment => env) }
|
9
|
+
let(:loaders) { Puppet::Pops::Loaders.new(env) }
|
10
|
+
|
11
|
+
around :each do |example|
|
12
|
+
Puppet[:app_management] = true
|
13
|
+
Puppet::Parser::Compiler.any_instance.stubs(:loaders).returns(loaders)
|
14
|
+
Puppet.override(:loaders => loaders, :current_environment => env) do
|
15
|
+
Puppet::Type.newtype :cap, :is_capability => true do
|
16
|
+
newparam :name
|
17
|
+
newparam :host
|
18
|
+
end
|
19
|
+
example.run
|
20
|
+
Puppet::Type.rmtype(:cap)
|
17
21
|
end
|
22
|
+
Puppet[:app_management] = false
|
18
23
|
end
|
19
24
|
|
20
|
-
|
21
|
-
with_app_management(true)
|
22
|
-
end
|
23
|
-
|
24
|
-
after :each do
|
25
|
-
with_app_management(false)
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "annotations" do
|
25
|
+
context 'annotations' do
|
29
26
|
it "adds a blueprint for a produced resource" do
|
30
|
-
catalog = compile_to_catalog(<<-MANIFEST)
|
27
|
+
catalog = compile_to_catalog(<<-MANIFEST, node)
|
31
28
|
define test($hostname) {
|
32
29
|
notify { "hostname ${hostname}":}
|
33
30
|
}
|
@@ -49,7 +46,7 @@ describe "Capability types" do
|
|
49
46
|
end
|
50
47
|
|
51
48
|
it "adds a blueprint for a consumed resource" do
|
52
|
-
catalog = compile_to_catalog(<<-MANIFEST)
|
49
|
+
catalog = compile_to_catalog(<<-MANIFEST, node)
|
53
50
|
define test($hostname) {
|
54
51
|
notify { "hostname ${hostname}":}
|
55
52
|
}
|
@@ -136,7 +133,7 @@ describe "Capability types" do
|
|
136
133
|
end
|
137
134
|
it "does not allow operator '+>' in a mapping" do
|
138
135
|
expect do
|
139
|
-
compile_to_catalog(<<-MANIFEST)
|
136
|
+
compile_to_catalog(<<-MANIFEST, node)
|
140
137
|
define test($hostname) {
|
141
138
|
notify { "hostname ${hostname}":}
|
142
139
|
}
|
@@ -150,7 +147,7 @@ describe "Capability types" do
|
|
150
147
|
|
151
148
|
it "does not allow operator '*=>' in a mapping" do
|
152
149
|
expect do
|
153
|
-
compile_to_catalog(<<-MANIFEST)
|
150
|
+
compile_to_catalog(<<-MANIFEST, node)
|
154
151
|
define test($hostname) {
|
155
152
|
notify { "hostname ${hostname}":}
|
156
153
|
}
|
@@ -163,9 +160,8 @@ describe "Capability types" do
|
|
163
160
|
end
|
164
161
|
|
165
162
|
it "does not allow 'before' relationship to capability mapping" do
|
166
|
-
make_cap_type
|
167
163
|
expect do
|
168
|
-
compile_to_catalog(<<-MANIFEST)
|
164
|
+
compile_to_catalog(<<-MANIFEST, node)
|
169
165
|
define test() {
|
170
166
|
notify { "hello":}
|
171
167
|
}
|
@@ -186,22 +182,14 @@ describe "Capability types" do
|
|
186
182
|
MANIFEST
|
187
183
|
|
188
184
|
expect {
|
189
|
-
compile_to_catalog(manifest)
|
185
|
+
compile_to_catalog(manifest, node)
|
190
186
|
}.to raise_error(Puppet::Error,
|
191
187
|
/#{kw} clause references nonexistent type Test/)
|
192
188
|
end
|
193
189
|
end
|
194
190
|
end
|
195
191
|
|
196
|
-
|
197
|
-
before(:each) do
|
198
|
-
make_cap_type
|
199
|
-
end
|
200
|
-
|
201
|
-
after :each do
|
202
|
-
Puppet::Type.rmtype(:cap)
|
203
|
-
end
|
204
|
-
|
192
|
+
context 'exporting a capability' do
|
205
193
|
it "does not add produced resources that are not exported" do
|
206
194
|
manifest = <<-MANIFEST
|
207
195
|
define test($hostname) {
|
@@ -214,7 +202,7 @@ Test produces Cap {
|
|
214
202
|
|
215
203
|
test { one: hostname => "ahost" }
|
216
204
|
MANIFEST
|
217
|
-
catalog = compile_to_catalog(manifest)
|
205
|
+
catalog = compile_to_catalog(manifest, node)
|
218
206
|
expect(catalog.resource("Test[one]")).to be_instance_of(Puppet::Resource)
|
219
207
|
expect(catalog.resource_keys.find { |type, _| type == "Cap" }).to be_nil
|
220
208
|
end
|
@@ -236,7 +224,7 @@ Test produces Cap {
|
|
236
224
|
|
237
225
|
test { one: hostname => "ahost", export => Cap[two] }
|
238
226
|
MANIFEST
|
239
|
-
catalog = compile_to_catalog(manifest)
|
227
|
+
catalog = compile_to_catalog(manifest, node)
|
240
228
|
expect(catalog.resource("Test[one]")).to be_instance_of(Puppet::Resource)
|
241
229
|
|
242
230
|
caps = catalog.resource_keys.select { |type, _| type == "Cap" }
|
@@ -247,19 +235,11 @@ test { one: hostname => "ahost", export => Cap[two] }
|
|
247
235
|
expect(cap["require"]).to eq("Test[one]")
|
248
236
|
expect(cap["host"]).to eq("ahost")
|
249
237
|
expect(cap.resource_type).to eq(Puppet::Type::Cap)
|
250
|
-
expect(cap.tags.any? { |t| t ==
|
238
|
+
expect(cap.tags.any? { |t| t == 'producer:testing' }).to eq(true)
|
251
239
|
end
|
252
240
|
end
|
253
241
|
|
254
|
-
|
255
|
-
before(:each) do
|
256
|
-
make_cap_type
|
257
|
-
end
|
258
|
-
|
259
|
-
after :each do
|
260
|
-
Puppet::Type.rmtype(:cap)
|
261
|
-
end
|
262
|
-
|
242
|
+
context 'consuming a capability' do
|
263
243
|
def make_catalog(instance)
|
264
244
|
manifest = <<-MANIFEST
|
265
245
|
define test($hostname = nohost) {
|
@@ -270,7 +250,7 @@ test { one: hostname => "ahost", export => Cap[two] }
|
|
270
250
|
hostname => $host
|
271
251
|
}
|
272
252
|
MANIFEST
|
273
|
-
compile_to_catalog(manifest + instance)
|
253
|
+
compile_to_catalog(manifest + instance, node)
|
274
254
|
end
|
275
255
|
|
276
256
|
def mock_cap_finding
|
@@ -322,10 +302,10 @@ test { one: hostname => "ahost", export => Cap[two] }
|
|
322
302
|
end
|
323
303
|
end
|
324
304
|
|
325
|
-
|
305
|
+
context 'producing/consuming resources' do
|
326
306
|
|
327
307
|
let(:ral) do
|
328
|
-
compile_to_ral(<<-MANIFEST)
|
308
|
+
compile_to_ral(<<-MANIFEST, node)
|
329
309
|
define producer() {
|
330
310
|
notify { "producer":}
|
331
311
|
}
|
@@ -365,10 +345,10 @@ test { one: hostname => "ahost", export => Cap[two] }
|
|
365
345
|
end
|
366
346
|
end
|
367
347
|
|
368
|
-
|
348
|
+
context 'producing/consuming resources to/from classes' do
|
369
349
|
|
370
350
|
let(:ral) do
|
371
|
-
compile_to_ral(<<-MANIFEST)
|
351
|
+
compile_to_ral(<<-MANIFEST, node)
|
372
352
|
define test($hostname) {
|
373
353
|
notify { $hostname:}
|
374
354
|
}
|