puppet 3.7.0 → 3.7.1
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.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/lib/puppet/defaults.rb +0 -7
- data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
- data/lib/puppet/network/http/compression.rb +5 -1
- data/lib/puppet/pops/loader/loader_paths.rb +1 -1
- data/lib/puppet/pops/loader/module_loaders.rb +22 -8
- data/lib/puppet/pops/loaders.rb +2 -11
- data/lib/puppet/provider/service/windows.rb +5 -5
- data/lib/puppet/resource.rb +6 -4
- data/lib/puppet/settings.rb +44 -16
- data/lib/puppet/ssl/validator/default_validator.rb +32 -11
- data/lib/puppet/transaction.rb +1 -0
- data/lib/puppet/version.rb +1 -1
- data/spec/integration/defaults_spec.rb +0 -6
- data/spec/integration/environments/default_manifest_spec.rb +0 -11
- data/spec/integration/environments/settings_interpolation_spec.rb +165 -0
- data/spec/integration/provider/service/windows_spec.rb +48 -0
- data/spec/integration/util/windows/security_spec.rb +2 -2
- data/spec/lib/puppet_spec/matchers.rb +5 -0
- data/spec/unit/functions/epp_spec.rb +0 -1
- data/spec/unit/network/http/compression_spec.rb +2 -2
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +15 -10
- data/spec/unit/pops/loaders/loader_paths_spec.rb +30 -42
- data/spec/unit/pops/loaders/module_loaders_spec.rb +3 -3
- data/spec/unit/provider/service/windows_spec.rb +48 -0
- data/spec/unit/resource_spec.rb +6 -0
- data/spec/unit/settings_spec.rb +20 -0
- data/spec/unit/ssl/validator_spec.rb +71 -5
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ea3672054a05a924114683d9215953d9496f114
|
4
|
+
data.tar.gz: 2c77a98c45f81a93784470a9fa2cc5d651450d95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92100261cecedb4f92da829c8c89eb06a47081dfccf6f4b344965dd80e3050f77ba70f77f966e1b1a5c51eb27a3342377b3bffdc6255c82f832c39f73c0b89dc
|
7
|
+
data.tar.gz: fc29427dcb59aed1054883f5f776ca4db72b40ba81394a0c9afb4943a8b2f1e0d0062737ce83bbca9f1f210ae1a613f78ae7f65caf918d2ca51509789cecddf2
|
data/Gemfile
CHANGED
@@ -23,7 +23,9 @@ platforms :ruby do
|
|
23
23
|
#gem 'ruby-augeas', :group => :development
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
if !ENV['PUPPET_LOADED']
|
27
|
+
gem "puppet", :path => File.dirname(__FILE__), :require => false
|
28
|
+
end
|
27
29
|
gem "facter", *location_for(ENV['FACTER_LOCATION'] || ['> 1.6', '< 3'])
|
28
30
|
gem "hiera", *location_for(ENV['HIERA_LOCATION'] || '~> 1.0')
|
29
31
|
gem "rake", "10.1.1", :require => false
|
data/lib/puppet/defaults.rb
CHANGED
@@ -1056,13 +1056,6 @@ EOT
|
|
1056
1056
|
|
1057
1057
|
In either case, the path can point to a single file or to a directory of
|
1058
1058
|
manifests to be evaluated in alphabetical order.",
|
1059
|
-
:hook => proc do |value|
|
1060
|
-
uninterpolated_value = self.value(true)
|
1061
|
-
if uninterpolated_value =~ /\$environment/ || value =~ /\$environment/ then
|
1062
|
-
raise(Puppet::Settings::ValidationError,
|
1063
|
-
"You cannot interpolate '$environment' within the 'default_manifest' setting.")
|
1064
|
-
end
|
1065
|
-
end
|
1066
1059
|
},
|
1067
1060
|
:disable_per_environment_manifest => {
|
1068
1061
|
:default => false,
|
@@ -46,7 +46,7 @@ module Puppet::ModuleTool
|
|
46
46
|
tmpdirpath = Pathname.new tmpdir
|
47
47
|
|
48
48
|
symlinks.each do |s|
|
49
|
-
Puppet.warning "Symlinks in modules are unsupported. Please investigate symlink #{s.relative_path_from tmpdirpath}->#{s
|
49
|
+
Puppet.warning "Symlinks in modules are unsupported. Please investigate symlink #{s.relative_path_from tmpdirpath}->#{Puppet::FileSystem.readlink(s)}."
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -46,7 +46,11 @@ module Puppet::Network::HTTP::Compression
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def add_accept_encoding(headers={})
|
49
|
-
|
49
|
+
if Puppet.settings[:http_compression]
|
50
|
+
headers['accept-encoding'] = 'gzip; q=1.0, deflate; q=1.0; identity'
|
51
|
+
else
|
52
|
+
headers['accept-encoding'] = 'identity'
|
53
|
+
end
|
50
54
|
headers
|
51
55
|
end
|
52
56
|
|
@@ -20,6 +20,28 @@
|
|
20
20
|
# @api private
|
21
21
|
#
|
22
22
|
module Puppet::Pops::Loader::ModuleLoaders
|
23
|
+
def self.system_loader_from(parent_loader, loaders)
|
24
|
+
# Puppet system may be installed in a fixed location via RPM, installed as a Gem, via source etc.
|
25
|
+
# The only way to find this across the different ways puppet can be installed is
|
26
|
+
# to search up the path from this source file's __FILE__ location until it finds the base of
|
27
|
+
# puppet.
|
28
|
+
#
|
29
|
+
puppet_lib = File.join(File.dirname(__FILE__), '../../..')
|
30
|
+
Puppet::Pops::Loader::ModuleLoaders::FileBased.new(parent_loader,
|
31
|
+
loaders,
|
32
|
+
nil,
|
33
|
+
puppet_lib,
|
34
|
+
'puppet_system')
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.module_loader_from(parent_loader, loaders, module_name, module_path)
|
38
|
+
Puppet::Pops::Loader::ModuleLoaders::FileBased.new(parent_loader,
|
39
|
+
loaders,
|
40
|
+
module_name,
|
41
|
+
File.join(module_path, 'lib'),
|
42
|
+
module_name)
|
43
|
+
end
|
44
|
+
|
23
45
|
class AbstractPathBasedModuleLoader < Puppet::Pops::Loader::BaseLoader
|
24
46
|
|
25
47
|
# The name of the module, or nil, if this is a global "component"
|
@@ -47,11 +69,6 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
47
69
|
def initialize(parent_loader, loaders, module_name, path, loader_name)
|
48
70
|
super parent_loader, loader_name
|
49
71
|
|
50
|
-
# Irrespective of the path referencing a directory or file, the path must exist.
|
51
|
-
unless Puppet::FileSystem.exist?(path)
|
52
|
-
raise ArgumentError, "The given path '#{path}' does not exist!"
|
53
|
-
end
|
54
|
-
|
55
72
|
@module_name = module_name
|
56
73
|
@path = path
|
57
74
|
@smart_paths = Puppet::Pops::Loader::LoaderPaths::SmartPaths.new(self)
|
@@ -178,9 +195,6 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
178
195
|
#
|
179
196
|
def initialize(parent_loader, loaders, module_name, path, loader_name)
|
180
197
|
super
|
181
|
-
unless Puppet::FileSystem.directory?(path)
|
182
|
-
raise ArgumentError, "The given module root path '#{path}' is not a directory (required for file system based module path entry)"
|
183
|
-
end
|
184
198
|
@path_index = Set.new()
|
185
199
|
end
|
186
200
|
|
data/lib/puppet/pops/loaders.rb
CHANGED
@@ -64,16 +64,7 @@ class Puppet::Pops::Loaders
|
|
64
64
|
private
|
65
65
|
|
66
66
|
def create_puppet_system_loader()
|
67
|
-
|
68
|
-
loader_name = 'puppet_system'
|
69
|
-
|
70
|
-
# Puppet system may be installed in a fixed location via RPM, installed as a Gem, via source etc.
|
71
|
-
# The only way to find this across the different ways puppet can be installed is
|
72
|
-
# to search up the path from this source file's __FILE__ location until it finds the parent of
|
73
|
-
# lib/puppet... e.g.. dirname(__FILE__)/../../.. (i.e. <somewhere>/lib/puppet/pops/loaders.rb).
|
74
|
-
#
|
75
|
-
puppet_lib = File.join(File.dirname(__FILE__), '../../..')
|
76
|
-
Puppet::Pops::Loader::ModuleLoaders::FileBased.new(static_loader, self, module_name, puppet_lib, loader_name)
|
67
|
+
Puppet::Pops::Loader::ModuleLoaders.system_loader_from(static_loader, self)
|
77
68
|
end
|
78
69
|
|
79
70
|
def create_environment_loader(environment)
|
@@ -121,7 +112,7 @@ class Puppet::Pops::Loaders
|
|
121
112
|
# Create data about this module
|
122
113
|
md = LoaderModuleData.new(puppet_module)
|
123
114
|
mr[puppet_module.name] = md
|
124
|
-
md.public_loader = Puppet::Pops::Loader::ModuleLoaders
|
115
|
+
md.public_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(parent_loader, self, md.name, md.path)
|
125
116
|
end
|
126
117
|
# NOTE: Do not resolve all modules here - this is wasteful if only a subset of modules / functions are used
|
127
118
|
# The resolution is triggered by asking for a module's private loader, since this means there is interest
|
@@ -21,21 +21,21 @@ Puppet::Type.type(:service).provide :windows, :parent => :service do
|
|
21
21
|
def enable
|
22
22
|
w32ss = Win32::Service.configure( 'service_name' => @resource[:name], 'start_type' => Win32::Service::SERVICE_AUTO_START )
|
23
23
|
raise Puppet::Error.new("Win32 service enable of #{@resource[:name]} failed" ) if( w32ss.nil? )
|
24
|
-
rescue
|
24
|
+
rescue => detail
|
25
25
|
raise Puppet::Error.new("Cannot enable #{@resource[:name]}, error was: #{detail}", detail )
|
26
26
|
end
|
27
27
|
|
28
28
|
def disable
|
29
29
|
w32ss = Win32::Service.configure( 'service_name' => @resource[:name], 'start_type' => Win32::Service::SERVICE_DISABLED )
|
30
30
|
raise Puppet::Error.new("Win32 service disable of #{@resource[:name]} failed" ) if( w32ss.nil? )
|
31
|
-
rescue
|
31
|
+
rescue => detail
|
32
32
|
raise Puppet::Error.new("Cannot disable #{@resource[:name]}, error was: #{detail}", detail )
|
33
33
|
end
|
34
34
|
|
35
35
|
def manual_start
|
36
36
|
w32ss = Win32::Service.configure( 'service_name' => @resource[:name], 'start_type' => Win32::Service::SERVICE_DEMAND_START )
|
37
37
|
raise Puppet::Error.new("Win32 service manual enable of #{@resource[:name]} failed" ) if( w32ss.nil? )
|
38
|
-
rescue
|
38
|
+
rescue => detail
|
39
39
|
raise Puppet::Error.new("Cannot enable #{@resource[:name]} for manual start, error was: #{detail}", detail )
|
40
40
|
end
|
41
41
|
|
@@ -55,7 +55,7 @@ Puppet::Type.type(:service).provide :windows, :parent => :service do
|
|
55
55
|
else
|
56
56
|
raise Puppet::Error.new("Unknown start type: #{w32ss.start_type}")
|
57
57
|
end
|
58
|
-
rescue
|
58
|
+
rescue => detail
|
59
59
|
raise Puppet::Error.new("Cannot get start type for #{@resource[:name]}, error was: #{detail}", detail )
|
60
60
|
end
|
61
61
|
|
@@ -95,7 +95,7 @@ Puppet::Type.type(:service).provide :windows, :parent => :service do
|
|
95
95
|
end
|
96
96
|
debug("Service #{@resource[:name]} is #{w32ss.current_state}")
|
97
97
|
return state
|
98
|
-
rescue
|
98
|
+
rescue => detail
|
99
99
|
raise Puppet::Error.new("Cannot get status of #{@resource[:name]}, error was: #{detail}", detail )
|
100
100
|
end
|
101
101
|
|
data/lib/puppet/resource.rb
CHANGED
@@ -551,10 +551,12 @@ class Puppet::Resource
|
|
551
551
|
end
|
552
552
|
|
553
553
|
def extract_type_and_title(argtype, argtitle)
|
554
|
-
if (
|
555
|
-
|
556
|
-
elsif
|
557
|
-
elsif argtype
|
554
|
+
if (argtype.nil? || argtype == :component || argtype == :whit) &&
|
555
|
+
argtitle =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
|
556
|
+
elsif argtitle.nil? && argtype =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
|
557
|
+
elsif argtitle then [ argtype, argtitle ]
|
558
|
+
elsif argtype.is_a?(Puppet::Type) then [ argtype.class.name, argtype.title ]
|
559
|
+
elsif argtype.is_a?(Hash) then
|
558
560
|
raise ArgumentError, "Puppet::Resource.new does not take a hash as the first argument. "+
|
559
561
|
"Did you mean (#{(argtype[:type] || argtype["type"]).inspect}, #{(argtype[:title] || argtype["title"]).inspect }) ?"
|
560
562
|
else raise ArgumentError, "No title provided and #{argtype.inspect} is not a valid resource reference"
|
data/lib/puppet/settings.rb
CHANGED
@@ -887,8 +887,8 @@ class Puppet::Settings
|
|
887
887
|
sections = nil if sections.empty?
|
888
888
|
|
889
889
|
catalog = Puppet::Resource::Catalog.new("Settings", Puppet::Node::Environment::NONE)
|
890
|
-
|
891
890
|
@config.keys.find_all { |key| @config[key].is_a?(FileSetting) }.each do |key|
|
891
|
+
next if (key == :manifestdir && should_skip_manifestdir?())
|
892
892
|
file = @config[key]
|
893
893
|
next unless (sections.nil? or sections.include?(file.section))
|
894
894
|
next unless resource = file.to_resource
|
@@ -905,6 +905,13 @@ class Puppet::Settings
|
|
905
905
|
catalog
|
906
906
|
end
|
907
907
|
|
908
|
+
def should_skip_manifestdir?()
|
909
|
+
setting = @config[:environmentpath]
|
910
|
+
!(setting.nil? || setting.value.nil? || setting.value.empty?)
|
911
|
+
end
|
912
|
+
|
913
|
+
private :should_skip_manifestdir?
|
914
|
+
|
908
915
|
# Convert our list of config settings into a configuration file.
|
909
916
|
def to_config
|
910
917
|
str = %{The configuration file for #{Puppet.run_mode.name}. Note that this file
|
@@ -1130,11 +1137,13 @@ Generated on #{Time.now}.
|
|
1130
1137
|
configured_environment = self[:environment]
|
1131
1138
|
if configured_environment == "production" && envdir && Puppet::FileSystem.exist?(envdir)
|
1132
1139
|
configured_environment_path = File.join(envdir, configured_environment)
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1140
|
+
if !Puppet::FileSystem.symlink?(configured_environment_path)
|
1141
|
+
catalog.add_resource(
|
1142
|
+
Puppet::Resource.new(:file,
|
1143
|
+
configured_environment_path,
|
1144
|
+
:parameters => { :ensure => 'directory' })
|
1145
|
+
)
|
1146
|
+
end
|
1138
1147
|
end
|
1139
1148
|
end
|
1140
1149
|
|
@@ -1232,6 +1241,7 @@ Generated on #{Time.now}.
|
|
1232
1241
|
# @api public
|
1233
1242
|
class ChainedValues
|
1234
1243
|
ENVIRONMENT_SETTING = "environment".freeze
|
1244
|
+
ENVIRONMENT_INTERPOLATION_ALLOWED = ['config_version'].freeze
|
1235
1245
|
|
1236
1246
|
# @see Puppet::Settings.values
|
1237
1247
|
# @api private
|
@@ -1280,7 +1290,7 @@ Generated on #{Time.now}.
|
|
1280
1290
|
else
|
1281
1291
|
# Convert it if necessary
|
1282
1292
|
begin
|
1283
|
-
val = convert(val)
|
1293
|
+
val = convert(val, name)
|
1284
1294
|
rescue InterpolationError => err
|
1285
1295
|
# This happens because we don't have access to the param name when the
|
1286
1296
|
# exception is originally raised, but we want it in the message
|
@@ -1296,27 +1306,45 @@ Generated on #{Time.now}.
|
|
1296
1306
|
|
1297
1307
|
private
|
1298
1308
|
|
1299
|
-
def convert(value)
|
1309
|
+
def convert(value, setting_name)
|
1300
1310
|
case value
|
1301
1311
|
when nil
|
1302
1312
|
nil
|
1303
1313
|
when String
|
1304
|
-
|
1314
|
+
failed_environment_interpolation = false
|
1315
|
+
interpolated_value = value.gsub(/\$(\w+)|\$\{(\w+)\}/) do |expression|
|
1305
1316
|
varname = $2 || $1
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1317
|
+
interpolated_expression =
|
1318
|
+
if varname != ENVIRONMENT_SETTING || ok_to_interpolate_environment(setting_name)
|
1319
|
+
if varname == ENVIRONMENT_SETTING && @environment
|
1320
|
+
@environment
|
1321
|
+
elsif varname == "run_mode"
|
1322
|
+
@mode
|
1323
|
+
elsif !(pval = interpolate(varname.to_sym)).nil?
|
1324
|
+
pval
|
1325
|
+
else
|
1326
|
+
raise InterpolationError, "Could not find value for #{expression}"
|
1327
|
+
end
|
1312
1328
|
else
|
1313
|
-
|
1329
|
+
failed_environment_interpolation = true
|
1330
|
+
expression
|
1314
1331
|
end
|
1332
|
+
interpolated_expression
|
1315
1333
|
end
|
1334
|
+
if failed_environment_interpolation
|
1335
|
+
Puppet.warning("You cannot interpolate $environment within '#{setting_name}' when using directory environments. Its value will remain #{interpolated_value}.")
|
1336
|
+
end
|
1337
|
+
interpolated_value
|
1316
1338
|
else
|
1317
1339
|
value
|
1318
1340
|
end
|
1319
1341
|
end
|
1342
|
+
|
1343
|
+
def ok_to_interpolate_environment(setting_name)
|
1344
|
+
return true if Puppet.settings.value(:environmentpath, nil, true).empty?
|
1345
|
+
|
1346
|
+
ENVIRONMENT_INTERPOLATION_ALLOWED.include?(setting_name.to_s)
|
1347
|
+
end
|
1320
1348
|
end
|
1321
1349
|
|
1322
1350
|
class Values
|
@@ -11,6 +11,8 @@ class Puppet::SSL::Validator::DefaultValidator #< class Puppet::SSL::Validator
|
|
11
11
|
attr_reader :verify_errors
|
12
12
|
attr_reader :ssl_configuration
|
13
13
|
|
14
|
+
FIVE_MINUTES_AS_SECONDS = 5 * 60
|
15
|
+
|
14
16
|
# Creates a new DefaultValidator, optionally with an SSL Configuration and SSL Host.
|
15
17
|
#
|
16
18
|
# @param ssl_configuration [Puppet::SSL::Configuration] (a default configuration) ssl_configuration the SSL configuration to use
|
@@ -52,7 +54,7 @@ class Puppet::SSL::Validator::DefaultValidator #< class Puppet::SSL::Validator
|
|
52
54
|
# SSL_VERIFY_PEER flag is set. It must be supplied by the application and
|
53
55
|
# receives two arguments: preverify_ok indicates, whether the verification of
|
54
56
|
# the certificate in question was passed (preverify_ok=1) or not
|
55
|
-
# (preverify_ok=0).
|
57
|
+
# (preverify_ok=0). x509_store_ctx is a pointer to the complete context used for
|
56
58
|
# the certificate chain verification.
|
57
59
|
#
|
58
60
|
# See {Puppet::Network::HTTP::Connection} for more information and where this
|
@@ -60,28 +62,47 @@ class Puppet::SSL::Validator::DefaultValidator #< class Puppet::SSL::Validator
|
|
60
62
|
#
|
61
63
|
# @param [Boolean] preverify_ok indicates whether the verification of the
|
62
64
|
# certificate in question was passed (preverify_ok=true)
|
63
|
-
# @param [OpenSSL::
|
64
|
-
# chain being verified.
|
65
|
+
# @param [OpenSSL::X509::StoreContext] store_context holds the X509 store context
|
66
|
+
# for the chain being verified.
|
65
67
|
#
|
66
68
|
# @return [Boolean] false if the peer is invalid, true otherwise.
|
67
69
|
#
|
68
70
|
# @api private
|
69
71
|
#
|
70
|
-
def call(preverify_ok,
|
71
|
-
# We must make a copy since the scope of the
|
72
|
+
def call(preverify_ok, store_context)
|
73
|
+
# We must make a copy since the scope of the store_context will be lost
|
72
74
|
# across invocations of this method.
|
73
|
-
current_cert = ssl_context.current_cert
|
74
|
-
@peer_certs << Puppet::SSL::Certificate.from_instance(current_cert)
|
75
|
-
|
76
75
|
if preverify_ok
|
76
|
+
current_cert = store_context.current_cert
|
77
|
+
@peer_certs << Puppet::SSL::Certificate.from_instance(current_cert)
|
78
|
+
|
77
79
|
# If we've copied all of the certs in the chain out of the SSL library
|
78
|
-
if @peer_certs.length ==
|
80
|
+
if @peer_certs.length == store_context.chain.length
|
79
81
|
# (#20027) The peer cert must be issued by a specific authority
|
80
82
|
preverify_ok = valid_peer?
|
81
83
|
end
|
82
84
|
else
|
83
|
-
|
84
|
-
|
85
|
+
error = store_context.error || 0
|
86
|
+
error_string = store_context.error_string || "OpenSSL error #{error}"
|
87
|
+
|
88
|
+
case error
|
89
|
+
when OpenSSL::X509::V_ERR_CRL_NOT_YET_VALID
|
90
|
+
# current_crl can be nil
|
91
|
+
# https://github.com/ruby/ruby/blob/ruby_1_9_3/ext/openssl/ossl_x509store.c#L501-L510
|
92
|
+
crl = store_context.current_crl
|
93
|
+
if crl
|
94
|
+
if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS
|
95
|
+
Puppet.debug("Ignoring CRL not yet valid, current time #{Time.now.utc}, CRL last updated #{crl.last_update.utc}")
|
96
|
+
preverify_ok = true
|
97
|
+
else
|
98
|
+
@verify_errors << "#{error_string} for #{crl.issuer}"
|
99
|
+
end
|
100
|
+
else
|
101
|
+
@verify_errors << error_string
|
102
|
+
end
|
103
|
+
else
|
104
|
+
current_cert = store_context.current_cert
|
105
|
+
@verify_errors << "#{error_string} for #{current_cert.subject}"
|
85
106
|
end
|
86
107
|
end
|
87
108
|
preverify_ok
|
data/lib/puppet/transaction.rb
CHANGED
@@ -105,6 +105,7 @@ class Puppet::Transaction
|
|
105
105
|
overly_deferred_resource_handler = lambda do |resource|
|
106
106
|
# We don't automatically assign unsuitable providers, so if there
|
107
107
|
# is one, it must have been selected by the user.
|
108
|
+
return if missing_tags?(resource)
|
108
109
|
if resource.provider
|
109
110
|
resource.err "Provider #{resource.provider.class.name} is not functional on this host"
|
110
111
|
else
|
data/lib/puppet/version.rb
CHANGED
@@ -10,12 +10,6 @@ describe "Puppet defaults" do
|
|
10
10
|
it "returns ./manifests by default" do
|
11
11
|
expect(Puppet[:default_manifest]).to eq('./manifests')
|
12
12
|
end
|
13
|
-
|
14
|
-
it "errors when $environment is part of the value" do
|
15
|
-
expect {
|
16
|
-
Puppet[:default_manifest] = '/$environment/manifest.pp'
|
17
|
-
}.to raise_error Puppet::Settings::ValidationError, /cannot interpolate.*\$environment/
|
18
|
-
end
|
19
13
|
end
|
20
14
|
|
21
15
|
describe "when disable_per_environment_manifest is set" do
|
@@ -2,7 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module EnvironmentsDefaultManifestsSpec
|
4
4
|
describe "default manifests" do
|
5
|
-
FS = Puppet::FileSystem
|
6
5
|
|
7
6
|
shared_examples_for "puppet with default_manifest settings" do
|
8
7
|
let(:confdir) { Puppet[:confdir] }
|
@@ -113,16 +112,6 @@ describe "default manifests" do
|
|
113
112
|
)
|
114
113
|
end
|
115
114
|
|
116
|
-
it "raises an exception if default_manifest has $environment in it" do
|
117
|
-
File.open(File.join(confdir, "puppet.conf"), "w") do |f|
|
118
|
-
f.puts(<<-EOF)
|
119
|
-
environmentpath=#{environmentpath}
|
120
|
-
default_manifest=/foo/$environment
|
121
|
-
EOF
|
122
|
-
end
|
123
|
-
|
124
|
-
expect { Puppet.initialize_settings }.to raise_error(Puppet::Settings::ValidationError, /cannot interpolate.*\$environment.*in.*default_manifest/)
|
125
|
-
end
|
126
115
|
end
|
127
116
|
|
128
117
|
context "with disable_per_environment_manifest true" do
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'pp'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
module SettingsInterpolationSpec
|
5
|
+
describe "interpolating $environment" do
|
6
|
+
let(:confdir) { Puppet[:confdir] }
|
7
|
+
let(:cmdline_args) { ['--confdir', confdir, '--vardir', Puppet[:vardir], '--hiera_config', Puppet[:hiera_config]] }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
FileUtils.mkdir_p(confdir)
|
11
|
+
end
|
12
|
+
|
13
|
+
shared_examples_for "a setting that does not interpolate $environment" do
|
14
|
+
|
15
|
+
before(:each) do
|
16
|
+
set_puppet_conf(confdir, <<-EOF)
|
17
|
+
environmentpath=$confdir/environments
|
18
|
+
#{setting}=#{value}
|
19
|
+
EOF
|
20
|
+
end
|
21
|
+
|
22
|
+
it "does not interpolate $environment" do
|
23
|
+
Puppet.initialize_settings(cmdline_args)
|
24
|
+
expect(Puppet[:environmentpath]).to eq("#{confdir}/environments")
|
25
|
+
expect(Puppet[setting.intern]).to eq(expected)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "displays the interpolated value in the warning" do
|
29
|
+
Puppet.initialize_settings(cmdline_args)
|
30
|
+
Puppet[setting.intern]
|
31
|
+
expect(@logs).to have_matching_log(/cannot interpolate \$environment within '#{setting}'.*Its value will remain #{Regexp.escape(expected)}/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when environmentpath is set" do
|
36
|
+
|
37
|
+
describe "config_version" do
|
38
|
+
it "interpolates $environment" do
|
39
|
+
envname = 'testing'
|
40
|
+
setting = 'config_version'
|
41
|
+
value = '/some/script $environment'
|
42
|
+
expected = "#{File.expand_path('/some/script')} testing"
|
43
|
+
|
44
|
+
set_puppet_conf(confdir, <<-EOF)
|
45
|
+
environmentpath=$confdir/environments
|
46
|
+
environment=#{envname}
|
47
|
+
EOF
|
48
|
+
|
49
|
+
set_environment_conf("#{confdir}/environments", envname, <<-EOF)
|
50
|
+
#{setting}=#{value}
|
51
|
+
EOF
|
52
|
+
|
53
|
+
Puppet.initialize_settings(cmdline_args)
|
54
|
+
expect(Puppet[:environmentpath]).to eq("#{confdir}/environments")
|
55
|
+
environment = Puppet.lookup(:environments).get(envname)
|
56
|
+
expect(environment.config_version).to eq(expected)
|
57
|
+
expect(@logs).to be_empty
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "basemodulepath" do
|
62
|
+
let(:setting) { "basemodulepath" }
|
63
|
+
let(:value) { "$confdir/environments/$environment/modules:$confdir/environments/$environment/other_modules" }
|
64
|
+
let(:expected) { "#{confdir}/environments/$environment/modules:#{confdir}/environments/$environment/other_modules" }
|
65
|
+
|
66
|
+
it_behaves_like "a setting that does not interpolate $environment"
|
67
|
+
|
68
|
+
it "logs a single warning for multiple instaces of $environment in the setting" do
|
69
|
+
set_puppet_conf(confdir, <<-EOF)
|
70
|
+
environmentpath=$confdir/environments
|
71
|
+
#{setting}=#{value}
|
72
|
+
EOF
|
73
|
+
|
74
|
+
Puppet.initialize_settings(cmdline_args)
|
75
|
+
expect(@logs.map(&:to_s).grep(/cannot interpolate \$environment within '#{setting}'/).count).to eq(1)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "environment" do
|
80
|
+
let(:setting) { "environment" }
|
81
|
+
let(:value) { "whatareyouthinking$environment" }
|
82
|
+
let(:expected) { value }
|
83
|
+
|
84
|
+
it_behaves_like "a setting that does not interpolate $environment"
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "the default_manifest" do
|
88
|
+
let(:setting) { "default_manifest" }
|
89
|
+
let(:value) { "$confdir/manifests/$environment" }
|
90
|
+
let(:expected) { "#{confdir}/manifests/$environment" }
|
91
|
+
|
92
|
+
it_behaves_like "a setting that does not interpolate $environment"
|
93
|
+
end
|
94
|
+
|
95
|
+
it "does not interpolate $environment and logs a warning when interpolating environmentpath" do
|
96
|
+
setting = 'environmentpath'
|
97
|
+
value = "$confdir/environments/$environment"
|
98
|
+
expected = "#{confdir}/environments/$environment"
|
99
|
+
|
100
|
+
set_puppet_conf(confdir, <<-EOF)
|
101
|
+
#{setting}=#{value}
|
102
|
+
EOF
|
103
|
+
|
104
|
+
Puppet.initialize_settings(cmdline_args)
|
105
|
+
expect(Puppet[setting.intern]).to eq(expected)
|
106
|
+
expect(@logs).to have_matching_log(/cannot interpolate \$environment within '#{setting}'/)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def assert_does_interpolate_environment(setting, value, expected_interpolation)
|
111
|
+
set_puppet_conf(confdir, <<-EOF)
|
112
|
+
#{setting}=#{value}
|
113
|
+
EOF
|
114
|
+
|
115
|
+
Puppet.initialize_settings(cmdline_args)
|
116
|
+
expect(Puppet[:environmentpath]).to be_empty
|
117
|
+
expect(Puppet[setting.intern]).to eq(expected_interpolation)
|
118
|
+
expect(@logs).to_not have_matching_log(/cannot interpolate \$environment within '#{setting}'/)
|
119
|
+
end
|
120
|
+
|
121
|
+
context "when environmentpath is not set" do
|
122
|
+
it "does interpolate $environment in config_version" do
|
123
|
+
value = "/some/script $environment"
|
124
|
+
expect = "/some/script production"
|
125
|
+
assert_does_interpolate_environment("config_version", value, expect)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "does interpolate $environment in basemodulepath" do
|
129
|
+
value = "$confdir/environments/$environment/modules:$confdir/environments/$environment/other_modules"
|
130
|
+
expected = "#{confdir}/environments/production/modules:#{confdir}/environments/production/other_modules"
|
131
|
+
assert_does_interpolate_environment("basemodulepath", value, expected)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "does interpolate $environment in default_manifest, which is fine, because this setting isn't used" do
|
135
|
+
value = "$confdir/manifests/$environment"
|
136
|
+
expected = "#{confdir}/manifests/production"
|
137
|
+
|
138
|
+
assert_does_interpolate_environment("default_manifest", value, expected)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "raises something" do
|
142
|
+
value = expected = "whatareyouthinking$environment"
|
143
|
+
expect {
|
144
|
+
assert_does_interpolate_environment("environment", value, expected)
|
145
|
+
}.to raise_error(SystemStackError, /stack level too deep/)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def set_puppet_conf(confdir, settings)
|
150
|
+
write_file(File.join(confdir, "puppet.conf"), settings)
|
151
|
+
end
|
152
|
+
|
153
|
+
def set_environment_conf(environmentpath, environment, settings)
|
154
|
+
envdir = File.join(environmentpath, environment)
|
155
|
+
FileUtils.mkdir_p(envdir)
|
156
|
+
write_file(File.join(envdir, 'environment.conf'), settings)
|
157
|
+
end
|
158
|
+
|
159
|
+
def write_file(file, contents)
|
160
|
+
File.open(file, "w") do |f|
|
161
|
+
f.puts(contents)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Puppet::Type.type(:service).provider(:windows), '(integration)',
|
5
|
+
:if => Puppet.features.microsoft_windows? do
|
6
|
+
|
7
|
+
require 'puppet/util/windows'
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
Puppet::Type.type(:service).stubs(:defaultprovider).returns described_class
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'should fail querying services that do not exist' do
|
14
|
+
let(:service) do
|
15
|
+
Puppet::Type.type(:service).new(:name => 'foobarservice1234')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "with a Puppet::Error when querying enabled?" do
|
19
|
+
expect { service.provider.enabled? }.to raise_error(Puppet::Error)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "with a Puppet::Error when querying status" do
|
23
|
+
expect { service.provider.status }.to raise_error(Puppet::Error)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'should return valid values when querying a service that does exist' do
|
28
|
+
let(:service) do
|
29
|
+
Puppet::Type.type(:service).new(:name => 'lmhosts')
|
30
|
+
end
|
31
|
+
|
32
|
+
it "with a valid boolean when asked if enabled" do
|
33
|
+
expect([:true, :false]).to include(service.provider.enabled?)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "with a valid status when asked about status" do
|
37
|
+
expect([
|
38
|
+
:running,
|
39
|
+
:'continue pending',
|
40
|
+
:'pause pending',
|
41
|
+
:paused,
|
42
|
+
:running,
|
43
|
+
:'start pending',
|
44
|
+
:'stop pending',
|
45
|
+
:stopped]).to include(service.provider.status)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -447,7 +447,7 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
|
|
447
447
|
describe "when the sid refers to a deleted trustee" do
|
448
448
|
it "should retrieve the user sid" do
|
449
449
|
sid = nil
|
450
|
-
user = Puppet::Util::Windows::ADSI::User.create("
|
450
|
+
user = Puppet::Util::Windows::ADSI::User.create("puppet#{rand(10000)}")
|
451
451
|
user.commit
|
452
452
|
begin
|
453
453
|
sid = Puppet::Util::Windows::ADSI::User.new(user.name).sid.to_s
|
@@ -463,7 +463,7 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
|
|
463
463
|
|
464
464
|
it "should retrieve the group sid" do
|
465
465
|
sid = nil
|
466
|
-
group = Puppet::Util::Windows::ADSI::Group.create("
|
466
|
+
group = Puppet::Util::Windows::ADSI::Group.create("puppet#{rand(10000)}")
|
467
467
|
group.commit
|
468
468
|
begin
|
469
469
|
sid = Puppet::Util::Windows::ADSI::Group.new(group.name).sid.to_s
|
@@ -21,6 +21,11 @@ RSpec::Matchers.define :have_matching_element do |expected|
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
RSpec::Matchers.define :have_matching_log do |expected|
|
25
|
+
match do |actual|
|
26
|
+
actual.map(&:to_s).any? { |item| item =~ expected }
|
27
|
+
end
|
28
|
+
end
|
24
29
|
|
25
30
|
RSpec::Matchers.define :exit_with do |expected|
|
26
31
|
actual = nil
|
@@ -61,9 +61,9 @@ describe "http compression" do
|
|
61
61
|
headers['accept-encoding'].should =~ /identity/
|
62
62
|
end
|
63
63
|
|
64
|
-
it "should
|
64
|
+
it "should add an Accept-Encoding 'identity' header if http compression is disabled" do
|
65
65
|
Puppet[:http_compression] = false
|
66
|
-
@uncompressor.add_accept_encoding({}).should == {}
|
66
|
+
@uncompressor.add_accept_encoding({}).should == {'accept-encoding' => 'identity'}
|
67
67
|
end
|
68
68
|
|
69
69
|
describe "when uncompressing response body" do
|
@@ -16,10 +16,10 @@ describe 'dependency loader' do
|
|
16
16
|
'foo.rb' => 'Puppet::Functions.create_function("foo") { def foo; end; }'
|
17
17
|
}}}}})
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
loader = loader_for('testmodule', module_dir)
|
20
|
+
|
21
21
|
expect do
|
22
|
-
|
22
|
+
loader.load_typed(typed_name(:function, 'testmodule::foo')).value
|
23
23
|
end.to raise_error(ArgumentError, /produced mis-matched name, expected 'testmodule::foo', got foo/)
|
24
24
|
end
|
25
25
|
|
@@ -28,10 +28,10 @@ describe 'dependency loader' do
|
|
28
28
|
'lib' => { 'puppet' => { 'functions' => { 'testmodule' => {
|
29
29
|
'foo.rb' => 'Puppet::Functions.create_function("testmodule::foo") { def foo; end; }'
|
30
30
|
}}}}})
|
31
|
-
module_loader = Puppet::Pops::Loader::ModuleLoaders::FileBased.new(static_loader, loaders, 'testmodule', module_dir, 'test1')
|
32
|
-
dep_loader = Puppet::Pops::Loader::DependencyLoader.new(static_loader, 'test-dep', [module_loader])
|
33
31
|
|
34
|
-
|
32
|
+
loader = loader_for('testmodule', module_dir)
|
33
|
+
|
34
|
+
function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
|
35
35
|
|
36
36
|
expect(function.class.name).to eq('testmodule::foo')
|
37
37
|
expect(function.is_a?(Puppet::Functions::Function)).to eq(true)
|
@@ -42,19 +42,24 @@ describe 'dependency loader' do
|
|
42
42
|
'lib' => { 'puppet' => { 'functions' => { 'testmodule' => {
|
43
43
|
'foo.rb' => 'Puppet::Functions.create_function("testmodule::foo") { def foo; end; }'
|
44
44
|
}}}}})
|
45
|
-
module_loader = Puppet::Pops::Loader::ModuleLoaders::FileBased.new(static_loader, loaders, 'testmodule', module_dir, 'test1')
|
46
|
-
dep_loader = Puppet::Pops::Loader::DependencyLoader.new(static_loader, 'test-dep', [module_loader])
|
47
45
|
|
48
|
-
|
46
|
+
loader = loader_for('testmodule', module_dir)
|
47
|
+
|
48
|
+
function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
|
49
49
|
expect(function.class.name).to eq('testmodule::foo')
|
50
50
|
expect(function.is_a?(Puppet::Functions::Function)).to eq(true)
|
51
51
|
|
52
|
-
function =
|
52
|
+
function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
|
53
53
|
expect(function.class.name).to eq('testmodule::foo')
|
54
54
|
expect(function.is_a?(Puppet::Functions::Function)).to eq(true)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
+
def loader_for(name, dir)
|
59
|
+
module_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(static_loader, loaders, name, dir)
|
60
|
+
Puppet::Pops::Loader::DependencyLoader.new(static_loader, 'test-dep', [module_loader])
|
61
|
+
end
|
62
|
+
|
58
63
|
def typed_name(type, name)
|
59
64
|
Puppet::Pops::Loader::Loader::TypedName.new(type, name)
|
60
65
|
end
|
@@ -9,47 +9,35 @@ describe 'loader paths' do
|
|
9
9
|
let(:static_loader) { Puppet::Pops::Loader::StaticLoader.new() }
|
10
10
|
let(:unused_loaders) { nil }
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
'
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
'puppet' => {
|
43
|
-
'functions' => {'foo4x.rb' => 'ignored in this test'},
|
44
|
-
}}})
|
45
|
-
module_loader = Puppet::Pops::Loader::ModuleLoaders::FileBased.new(static_loader, unused_loaders, 'testmodule', module_dir, 'test1')
|
46
|
-
|
47
|
-
effective_paths = module_loader.smart_paths.effective_paths(:function)
|
48
|
-
|
49
|
-
expect(effective_paths.size).to eq(1)
|
50
|
-
expect(module_loader.path_index.size).to eq(1)
|
51
|
-
path_index = module_loader.path_index
|
52
|
-
expect(path_index).to include(File.join(module_dir, 'lib', 'puppet', 'functions', 'foo4x.rb'))
|
53
|
-
end
|
12
|
+
it 'module loader has smart-paths that prunes unavailable paths' do
|
13
|
+
module_dir = dir_containing('testmodule', {'lib' => {'puppet' => {'functions' =>
|
14
|
+
{'foo.rb' =>
|
15
|
+
'Puppet::Functions.create_function("testmodule::foo") {
|
16
|
+
def foo; end;
|
17
|
+
}'
|
18
|
+
}
|
19
|
+
}}})
|
20
|
+
module_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(static_loader, unused_loaders, 'testmodule', module_dir)
|
21
|
+
|
22
|
+
effective_paths = module_loader.smart_paths.effective_paths(:function)
|
23
|
+
|
24
|
+
expect(effective_paths.size).to be_eql(1)
|
25
|
+
expect(effective_paths[0].generic_path).to be_eql(File.join(module_dir, 'lib', 'puppet', 'functions'))
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'all function smart-paths produces entries if they exist' do
|
29
|
+
module_dir = dir_containing('testmodule', {
|
30
|
+
'lib' => {
|
31
|
+
'puppet' => {
|
32
|
+
'functions' => {'foo4x.rb' => 'ignored in this test'},
|
33
|
+
}}})
|
34
|
+
module_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(static_loader, unused_loaders, 'testmodule', module_dir)
|
35
|
+
|
36
|
+
effective_paths = module_loader.smart_paths.effective_paths(:function)
|
37
|
+
|
38
|
+
expect(effective_paths.size).to eq(1)
|
39
|
+
expect(module_loader.path_index.size).to eq(1)
|
40
|
+
path_index = module_loader.path_index
|
41
|
+
expect(path_index).to include(File.join(module_dir, 'lib', 'puppet', 'functions', 'foo4x.rb'))
|
54
42
|
end
|
55
43
|
end
|
@@ -26,7 +26,7 @@ describe 'FileBased module loader' do
|
|
26
26
|
}
|
27
27
|
})
|
28
28
|
|
29
|
-
module_loader = Puppet::Pops::Loader::ModuleLoaders
|
29
|
+
module_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(static_loader, loaders, 'testmodule', module_dir)
|
30
30
|
function = module_loader.load_typed(typed_name(:function, 'foo4x')).value
|
31
31
|
|
32
32
|
expect(function.class.name).to eq('foo4x')
|
@@ -51,7 +51,7 @@ describe 'FileBased module loader' do
|
|
51
51
|
}
|
52
52
|
}})
|
53
53
|
|
54
|
-
module_loader = Puppet::Pops::Loader::ModuleLoaders
|
54
|
+
module_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(static_loader, loaders, 'testmodule', module_dir)
|
55
55
|
function = module_loader.load_typed(typed_name(:function, 'testmodule::foo4x')).value
|
56
56
|
expect(function.class.name).to eq('testmodule::foo4x')
|
57
57
|
expect(function.is_a?(Puppet::Functions::Function)).to eq(true)
|
@@ -68,7 +68,7 @@ describe 'FileBased module loader' do
|
|
68
68
|
end
|
69
69
|
CODE
|
70
70
|
}}}}})
|
71
|
-
module_loader = Puppet::Pops::Loader::ModuleLoaders
|
71
|
+
module_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(static_loader, loaders, 'testmodule', module_dir)
|
72
72
|
|
73
73
|
module_dir2 = dir_containing('testmodule2', {
|
74
74
|
'lib' => { 'puppet' => { 'functions' => { 'testmodule2' => {
|
@@ -51,6 +51,14 @@ describe Puppet::Type.type(:service).provider(:windows), :if => Puppet.features.
|
|
51
51
|
}.to raise_error(Puppet::Error, /Cannot start #{name}, error was: The service name is invalid./)
|
52
52
|
end
|
53
53
|
|
54
|
+
it "raises an error if the service doesn't exist" do
|
55
|
+
Win32::Service.expects(:config_info).with(name).raises(SystemCallError, 'OpenService')
|
56
|
+
|
57
|
+
expect {
|
58
|
+
provider.start
|
59
|
+
}.to raise_error(Puppet::Error, /Cannot get start type for #{name}/)
|
60
|
+
end
|
61
|
+
|
54
62
|
describe "when the service is disabled" do
|
55
63
|
before :each do
|
56
64
|
config.start_type = Win32::Service.get_start_type(Win32::Service::SERVICE_DISABLED)
|
@@ -112,6 +120,14 @@ describe Puppet::Type.type(:service).provider(:windows), :if => Puppet.features.
|
|
112
120
|
provider.status.should == :running
|
113
121
|
end
|
114
122
|
end
|
123
|
+
|
124
|
+
it "raises an error if the service doesn't exist" do
|
125
|
+
Win32::Service.expects(:status).with(name).raises(SystemCallError, 'OpenService')
|
126
|
+
|
127
|
+
expect {
|
128
|
+
provider.status
|
129
|
+
}.to raise_error(Puppet::Error, /Cannot get status of #{name}/)
|
130
|
+
end
|
115
131
|
end
|
116
132
|
|
117
133
|
describe "#restart" do
|
@@ -146,6 +162,14 @@ describe Puppet::Type.type(:service).provider(:windows), :if => Puppet.features.
|
|
146
162
|
provider.enabled?.should == :false
|
147
163
|
end
|
148
164
|
|
165
|
+
it "raises an error if the service doesn't exist" do
|
166
|
+
Win32::Service.expects(:config_info).with(name).raises(SystemCallError, 'OpenService')
|
167
|
+
|
168
|
+
expect {
|
169
|
+
provider.enabled?
|
170
|
+
}.to raise_error(Puppet::Error, /Cannot get start type for #{name}/)
|
171
|
+
end
|
172
|
+
|
149
173
|
# We need to guard this section explicitly since rspec will always
|
150
174
|
# construct all examples, even if it isn't going to run them.
|
151
175
|
if Puppet.features.microsoft_windows?
|
@@ -165,6 +189,14 @@ describe Puppet::Type.type(:service).provider(:windows), :if => Puppet.features.
|
|
165
189
|
Win32::Service.expects(:configure).with('service_name' => name, 'start_type' => Win32::Service::SERVICE_AUTO_START).returns(Win32::Service)
|
166
190
|
provider.enable
|
167
191
|
end
|
192
|
+
|
193
|
+
it "raises an error if the service doesn't exist" do
|
194
|
+
Win32::Service.expects(:configure).with(has_entry('service_name' => name)).raises(SystemCallError, 'OpenService')
|
195
|
+
|
196
|
+
expect {
|
197
|
+
provider.enable
|
198
|
+
}.to raise_error(Puppet::Error, /Cannot enable #{name}/)
|
199
|
+
end
|
168
200
|
end
|
169
201
|
|
170
202
|
describe "#disable" do
|
@@ -172,6 +204,14 @@ describe Puppet::Type.type(:service).provider(:windows), :if => Puppet.features.
|
|
172
204
|
Win32::Service.expects(:configure).with('service_name' => name, 'start_type' => Win32::Service::SERVICE_DISABLED).returns(Win32::Service)
|
173
205
|
provider.disable
|
174
206
|
end
|
207
|
+
|
208
|
+
it "raises an error if the service doesn't exist" do
|
209
|
+
Win32::Service.expects(:configure).with(has_entry('service_name' => name)).raises(SystemCallError, 'OpenService')
|
210
|
+
|
211
|
+
expect {
|
212
|
+
provider.disable
|
213
|
+
}.to raise_error(Puppet::Error, /Cannot disable #{name}/)
|
214
|
+
end
|
175
215
|
end
|
176
216
|
|
177
217
|
describe "#manual_start" do
|
@@ -179,5 +219,13 @@ describe Puppet::Type.type(:service).provider(:windows), :if => Puppet.features.
|
|
179
219
|
Win32::Service.expects(:configure).with('service_name' => name, 'start_type' => Win32::Service::SERVICE_DEMAND_START).returns(Win32::Service)
|
180
220
|
provider.manual_start
|
181
221
|
end
|
222
|
+
|
223
|
+
it "raises an error if the service doesn't exist" do
|
224
|
+
Win32::Service.expects(:configure).with(has_entry('service_name' => name)).raises(SystemCallError, 'OpenService')
|
225
|
+
|
226
|
+
expect {
|
227
|
+
provider.manual_start
|
228
|
+
}.to raise_error(Puppet::Error, /Cannot enable #{name}/)
|
229
|
+
end
|
182
230
|
end
|
183
231
|
end
|
data/spec/unit/resource_spec.rb
CHANGED
@@ -85,6 +85,12 @@ describe Puppet::Resource do
|
|
85
85
|
ref.title.should =="baz"
|
86
86
|
end
|
87
87
|
|
88
|
+
it "should not interpret the title as a reference if the type is a non component or whit reference" do
|
89
|
+
ref = Puppet::Resource.new("Notify", "foo::bar[baz]")
|
90
|
+
ref.type.should == "Notify"
|
91
|
+
ref.title.should =="foo::bar[baz]"
|
92
|
+
end
|
93
|
+
|
88
94
|
it "should be able to extract its information from a Puppet::Type instance" do
|
89
95
|
ral = Puppet::Type.type(:file).new :path => basepath+"/foo"
|
90
96
|
ref = Puppet::Resource.new(ral)
|
data/spec/unit/settings_spec.rb
CHANGED
@@ -2,9 +2,12 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'ostruct'
|
4
4
|
require 'puppet/settings/errors'
|
5
|
+
require 'puppet_spec/files'
|
6
|
+
require 'matchers/resource'
|
5
7
|
|
6
8
|
describe Puppet::Settings do
|
7
9
|
include PuppetSpec::Files
|
10
|
+
include Matchers::Resource
|
8
11
|
|
9
12
|
let(:main_config_file_default_location) do
|
10
13
|
File.join(Puppet::Util::RunMode[:master].conf_dir, "puppet.conf")
|
@@ -1338,6 +1341,16 @@ describe Puppet::Settings do
|
|
1338
1341
|
@settings.to_catalog
|
1339
1342
|
end
|
1340
1343
|
|
1344
|
+
it "should ignore manifestdir if environmentpath is set" do
|
1345
|
+
@settings.define_settings :main,
|
1346
|
+
:manifestdir => { :type => :directory, :default => @prefix+"/manifestdir", :desc => "a" },
|
1347
|
+
:environmentpath => { :type => :path, :default => @prefix+"/envs", :desc => "a" }
|
1348
|
+
|
1349
|
+
catalog = @settings.to_catalog(:main)
|
1350
|
+
|
1351
|
+
expect(catalog).to_not have_resource("File[#{@prefix}/manifestdir]")
|
1352
|
+
end
|
1353
|
+
|
1341
1354
|
describe "on Microsoft Windows" do
|
1342
1355
|
before :each do
|
1343
1356
|
Puppet.features.stubs(:root?).returns true
|
@@ -1395,6 +1408,13 @@ describe Puppet::Settings do
|
|
1395
1408
|
catalog = @settings.to_catalog
|
1396
1409
|
expect(catalog.resource_keys).to include(["File", "#{default_path}/production"])
|
1397
1410
|
end
|
1411
|
+
|
1412
|
+
it "does not add if the path to the default directory environment exists as a symlink", :if => Puppet.features.manages_symlinks? do
|
1413
|
+
Dir.mkdir(default_path)
|
1414
|
+
Puppet::FileSystem.symlink("#{tmpenv}/nowhere", File.join(default_path, 'production'))
|
1415
|
+
catalog = @settings.to_catalog
|
1416
|
+
expect(catalog.resource_keys).to_not include(["File", "#{default_path}/production"])
|
1417
|
+
end
|
1398
1418
|
end
|
1399
1419
|
|
1400
1420
|
describe "when adding users and groups to the catalog" do
|
@@ -39,14 +39,80 @@ describe Puppet::SSL::Validator::DefaultValidator do
|
|
39
39
|
|
40
40
|
context 'When pre-verification is not OK' do
|
41
41
|
context 'and the ssl_context is in an error state' do
|
42
|
-
|
43
|
-
|
42
|
+
let(:root_subject) { OpenSSL::X509::Certificate.new(root_ca).subject.to_s }
|
43
|
+
let(:code) { OpenSSL::X509::V_ERR_INVALID_CA }
|
44
|
+
|
45
|
+
it 'rejects the connection' do
|
46
|
+
ssl_context.stubs(:error_string).returns("Something went wrong")
|
47
|
+
ssl_context.stubs(:error).returns(code)
|
48
|
+
|
49
|
+
expect(subject.call(false, ssl_context)).to eq(false)
|
44
50
|
end
|
45
51
|
|
46
52
|
it 'makes the error available via #verify_errors' do
|
53
|
+
ssl_context.stubs(:error_string).returns("Something went wrong")
|
54
|
+
ssl_context.stubs(:error).returns(code)
|
55
|
+
|
56
|
+
subject.call(false, ssl_context)
|
57
|
+
expect(subject.verify_errors).to eq(["Something went wrong for #{root_subject}"])
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'uses a generic message if error_string is nil' do
|
61
|
+
ssl_context.stubs(:error_string).returns(nil)
|
62
|
+
ssl_context.stubs(:error).returns(code)
|
63
|
+
|
47
64
|
subject.call(false, ssl_context)
|
48
|
-
|
49
|
-
|
65
|
+
expect(subject.verify_errors).to eq(["OpenSSL error #{code} for #{root_subject}"])
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'uses 0 for nil error codes' do
|
69
|
+
ssl_context.stubs(:error_string).returns("Something went wrong")
|
70
|
+
ssl_context.stubs(:error).returns(nil)
|
71
|
+
|
72
|
+
subject.call(false, ssl_context)
|
73
|
+
expect(subject.verify_errors).to eq(["Something went wrong for #{root_subject}"])
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when CRL is not yet valid" do
|
77
|
+
before :each do
|
78
|
+
ssl_context.stubs(:error_string).returns("CRL is not yet valid")
|
79
|
+
ssl_context.stubs(:error).returns(OpenSSL::X509::V_ERR_CRL_NOT_YET_VALID)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'rejects nil CRL' do
|
83
|
+
ssl_context.stubs(:current_crl).returns(nil)
|
84
|
+
|
85
|
+
expect(subject.call(false, ssl_context)).to eq(false)
|
86
|
+
expect(subject.verify_errors).to eq(["CRL is not yet valid"])
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'includes the CRL issuer in the verify error message' do
|
90
|
+
crl = OpenSSL::X509::CRL.new
|
91
|
+
crl.issuer = OpenSSL::X509::Name.new([['CN','Puppet CA: puppetmaster.example.com']])
|
92
|
+
crl.last_update = Time.now + 24 * 60 * 60
|
93
|
+
ssl_context.stubs(:current_crl).returns(crl)
|
94
|
+
|
95
|
+
subject.call(false, ssl_context)
|
96
|
+
expect(subject.verify_errors).to eq(["CRL is not yet valid for /CN=Puppet CA: puppetmaster.example.com"])
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'rejects CRLs whose last_update time is more than 5 minutes in the future' do
|
100
|
+
crl = OpenSSL::X509::CRL.new
|
101
|
+
crl.issuer = OpenSSL::X509::Name.new([['CN','Puppet CA: puppetmaster.example.com']])
|
102
|
+
crl.last_update = Time.now + 24 * 60 * 60
|
103
|
+
ssl_context.stubs(:current_crl).returns(crl)
|
104
|
+
|
105
|
+
expect(subject.call(false, ssl_context)).to eq(false)
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'accepts CRLs whose last_update time is 10 seconds in the future' do
|
109
|
+
crl = OpenSSL::X509::CRL.new
|
110
|
+
crl.issuer = OpenSSL::X509::Name.new([['CN','Puppet CA: puppetmaster.example.com']])
|
111
|
+
crl.last_update = Time.now + 10
|
112
|
+
ssl_context.stubs(:current_crl).returns(crl)
|
113
|
+
|
114
|
+
expect(subject.call(false, ssl_context)).to eq(true)
|
115
|
+
end
|
50
116
|
end
|
51
117
|
end
|
52
118
|
end
|
@@ -54,7 +120,7 @@ describe Puppet::SSL::Validator::DefaultValidator do
|
|
54
120
|
context 'When pre-verification is OK' do
|
55
121
|
context 'and the ssl_context is in an error state' do
|
56
122
|
before :each do
|
57
|
-
ssl_context.stubs(:error_string).returns("Something went wrong
|
123
|
+
ssl_context.stubs(:error_string).returns("Something went wrong")
|
58
124
|
end
|
59
125
|
|
60
126
|
it 'does not make the error available via #verify_errors' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.7.
|
4
|
+
version: 3.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facter
|
@@ -1731,6 +1731,7 @@ files:
|
|
1731
1731
|
- spec/integration/defaults_spec.rb
|
1732
1732
|
- spec/integration/directory_environments_spec.rb
|
1733
1733
|
- spec/integration/environments/default_manifest_spec.rb
|
1734
|
+
- spec/integration/environments/settings_interpolation_spec.rb
|
1734
1735
|
- spec/integration/faces/ca_spec.rb
|
1735
1736
|
- spec/integration/faces/documentation_spec.rb
|
1736
1737
|
- spec/integration/faces/plugin_spec.rb
|
@@ -1770,6 +1771,7 @@ files:
|
|
1770
1771
|
- spec/integration/provider/package_spec.rb
|
1771
1772
|
- spec/integration/provider/service/init_spec.rb
|
1772
1773
|
- spec/integration/provider/service/systemd_spec.rb
|
1774
|
+
- spec/integration/provider/service/windows_spec.rb
|
1773
1775
|
- spec/integration/provider/ssh_authorized_key_spec.rb
|
1774
1776
|
- spec/integration/reference/providers_spec.rb
|
1775
1777
|
- spec/integration/reports_spec.rb
|
@@ -2808,6 +2810,7 @@ test_files:
|
|
2808
2810
|
- spec/integration/defaults_spec.rb
|
2809
2811
|
- spec/integration/directory_environments_spec.rb
|
2810
2812
|
- spec/integration/environments/default_manifest_spec.rb
|
2813
|
+
- spec/integration/environments/settings_interpolation_spec.rb
|
2811
2814
|
- spec/integration/faces/ca_spec.rb
|
2812
2815
|
- spec/integration/faces/documentation_spec.rb
|
2813
2816
|
- spec/integration/faces/plugin_spec.rb
|
@@ -2847,6 +2850,7 @@ test_files:
|
|
2847
2850
|
- spec/integration/provider/package_spec.rb
|
2848
2851
|
- spec/integration/provider/service/init_spec.rb
|
2849
2852
|
- spec/integration/provider/service/systemd_spec.rb
|
2853
|
+
- spec/integration/provider/service/windows_spec.rb
|
2850
2854
|
- spec/integration/provider/ssh_authorized_key_spec.rb
|
2851
2855
|
- spec/integration/reference/providers_spec.rb
|
2852
2856
|
- spec/integration/reports_spec.rb
|