puppet 3.7.1 → 3.7.2
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/ext/build_defaults.yaml +3 -3
- data/ext/debian/control +2 -0
- data/ext/project_data.yaml +2 -2
- data/lib/puppet/application.rb +1 -4
- data/lib/puppet/configurer.rb +6 -4
- data/lib/puppet/environments.rb +47 -3
- data/lib/puppet/indirector/node/exec.rb +1 -1
- data/lib/puppet/indirector/request.rb +1 -2
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module_tool.rb +1 -1
- data/lib/puppet/network/http/webrick.rb +17 -7
- data/lib/puppet/node.rb +2 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +1 -11
- data/lib/puppet/parser/compiler.rb +1 -2
- data/lib/puppet/parser/resource.rb +1 -3
- data/lib/puppet/parser/resource/param.rb +1 -1
- data/lib/puppet/parser/type_loader.rb +1 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +3 -11
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +30 -4
- data/lib/puppet/pops/model/factory.rb +16 -1
- data/lib/puppet/pops/parser/egrammar.ra +1 -1
- data/lib/puppet/pops/parser/eparser.rb +1 -1
- data/lib/puppet/pops/parser/parser_support.rb +19 -1
- data/lib/puppet/pops/types/type_calculator.rb +19 -14
- data/lib/puppet/provider/package/pkg.rb +12 -1
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +15 -16
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +16 -0
- data/lib/puppet/resource.rb +1 -8
- data/lib/puppet/settings.rb +17 -0
- data/lib/puppet/type/user.rb +11 -1
- data/lib/puppet/util/autoload.rb +10 -6
- data/lib/puppet/util/monkey_patches.rb +2 -2
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/unit/provider/package/pkg/dummy_solaris11.certificate_warning +2 -0
- data/spec/fixtures/unit/type/user/authorized_keys +1 -0
- data/spec/integration/application/apply_spec.rb +29 -23
- data/spec/integration/parser/future_compiler_spec.rb +56 -0
- data/spec/integration/type/user_spec.rb +22 -1
- data/spec/lib/puppet_spec/files.rb +1 -0
- data/spec/unit/environments_spec.rb +99 -0
- data/spec/unit/network/http/webrick_spec.rb +21 -2
- data/spec/unit/parser/compiler_spec.rb +19 -1
- data/spec/unit/parser/functions/lookup_spec.rb +13 -12
- data/spec/unit/parser/resource/param_spec.rb +10 -22
- data/spec/unit/parser/resource_spec.rb +0 -4
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +30 -5
- data/spec/unit/pops/parser/parse_calls_spec.rb +20 -5
- data/spec/unit/pops/types/type_calculator_spec.rb +61 -0
- data/spec/unit/provider/package/pkg_spec.rb +4 -0
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +47 -14
- data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +15 -0
- data/spec/unit/type/user_spec.rb +5 -0
- data/spec/unit/util/autoload_spec.rb +33 -14
- data/spec/unit/util/monkey_patches_spec.rb +12 -0
- data/tasks/memwalk.rake +195 -0
- metadata +3216 -3205
- checksums.yaml +0 -7
@@ -1,19 +1,13 @@
|
|
1
|
-
#! /usr/bin/env ruby
|
2
1
|
require 'spec_helper'
|
3
2
|
|
4
3
|
describe Puppet::Parser::Resource::Param do
|
5
|
-
it "
|
6
|
-
Puppet::Parser::Resource::Param.new(:name => 'myparam', :value => 'foo')
|
7
|
-
end
|
8
|
-
|
9
|
-
it "stores the source file" do
|
10
|
-
param = Puppet::Parser::Resource::Param.new(:name => 'myparam', :value => 'foo', :file => 'foo.pp')
|
11
|
-
param.file.should == 'foo.pp'
|
12
|
-
end
|
4
|
+
it "has readers for all of the attributes" do
|
5
|
+
param = Puppet::Parser::Resource::Param.new(:name => 'myparam', :value => 'foo', :file => 'foo.pp', :line => 42)
|
13
6
|
|
14
|
-
|
15
|
-
param
|
16
|
-
param.
|
7
|
+
expect(param.name).to eq(:myparam)
|
8
|
+
expect(param.value).to eq('foo')
|
9
|
+
expect(param.file).to eq('foo.pp')
|
10
|
+
expect(param.line).to eq(42)
|
17
11
|
end
|
18
12
|
|
19
13
|
context "parameter validation" do
|
@@ -23,21 +17,15 @@ describe Puppet::Parser::Resource::Param do
|
|
23
17
|
}.to raise_error(Puppet::Error, /name is a required option/)
|
24
18
|
end
|
25
19
|
|
26
|
-
it "
|
27
|
-
|
28
|
-
Puppet::Parser::Resource::Param.new(:name => 'myparam')
|
29
|
-
}.to raise_error(Puppet::Error, /value is a required option/)
|
30
|
-
end
|
20
|
+
it "does not require a value" do
|
21
|
+
param = Puppet::Parser::Resource::Param.new(:name => 'myparam')
|
31
22
|
|
32
|
-
|
33
|
-
expect {
|
34
|
-
Puppet::Parser::Resource::Param.new(:name => 'myparam', :value => nil)
|
35
|
-
}.to raise_error(Puppet::Error, /value is a required option/)
|
23
|
+
expect(param.value).to be_nil
|
36
24
|
end
|
37
25
|
|
38
26
|
it "includes file/line context in errors" do
|
39
27
|
expect {
|
40
|
-
Puppet::Parser::Resource::Param.new(:
|
28
|
+
Puppet::Parser::Resource::Param.new(:file => 'foo.pp', :line => 42)
|
41
29
|
}.to raise_error(Puppet::Error, /foo.pp:42/)
|
42
30
|
end
|
43
31
|
end
|
@@ -561,10 +561,6 @@ describe Puppet::Parser::Resource do
|
|
561
561
|
@resource["foo"].should == "bar"
|
562
562
|
end
|
563
563
|
|
564
|
-
it "should fail when provided a parameter name but no value" do
|
565
|
-
expect { @resource.set_parameter("myparam") }.to raise_error(ArgumentError)
|
566
|
-
end
|
567
|
-
|
568
564
|
it "should allow parameters to be set to 'false'" do
|
569
565
|
@resource.set_parameter("myparam", false)
|
570
566
|
@resource["myparam"].should be_false
|
@@ -680,12 +680,12 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
|
|
680
680
|
"'abc'[x]" => "The value 'x' cannot be converted to Numeric",
|
681
681
|
"'abc'[1.0]" => "A String[] cannot use Float where Integer is expected",
|
682
682
|
"'abc'[1,2,3]" => "String supports [] with one or two arguments. Got 3",
|
683
|
-
"Resource[0]" => 'First argument to Resource[] must be a resource type or a String. Got
|
684
|
-
"Resource[a, 0]" => 'Error creating type specialization of a Resource-Type, Cannot use
|
685
|
-
"File[0]" => 'Error creating type specialization of a File-Type, Cannot use
|
683
|
+
"Resource[0]" => 'First argument to Resource[] must be a resource type or a String. Got Integer',
|
684
|
+
"Resource[a, 0]" => 'Error creating type specialization of a Resource-Type, Cannot use Integer where a resource title String is expected',
|
685
|
+
"File[0]" => 'Error creating type specialization of a File-Type, Cannot use Integer where a resource title String is expected',
|
686
686
|
"String[a]" => "A Type's size constraint arguments must be a single Integer type, or 1-2 integers (or default). Got a String",
|
687
|
-
"Pattern[0]" => 'Error creating type specialization of a Pattern-Type, Cannot use
|
688
|
-
"Regexp[0]" => 'Error creating type specialization of a Regexp-Type, Cannot use
|
687
|
+
"Pattern[0]" => 'Error creating type specialization of a Pattern-Type, Cannot use Integer where String or Regexp or Pattern-Type or Regexp-Type is expected',
|
688
|
+
"Regexp[0]" => 'Error creating type specialization of a Regexp-Type, Cannot use Integer where String or Regexp is expected',
|
689
689
|
"Regexp[a,b]" => 'A Regexp-Type[] accepts 1 argument. Got 2',
|
690
690
|
"true[0]" => "Operator '[]' is not applicable to a Boolean",
|
691
691
|
"1[0]" => "Operator '[]' is not applicable to an Integer",
|
@@ -963,6 +963,31 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
|
|
963
963
|
expect{parser.evaluate_string(scope, "assert_no_undef({undef => 1})")}.to_not raise_error()
|
964
964
|
expect{parser.evaluate_string(scope, "assert_no_undef({1 => undef})")}.to_not raise_error()
|
965
965
|
end
|
966
|
+
|
967
|
+
context 'using the 3x function api' do
|
968
|
+
it 'can call a 3x function' do
|
969
|
+
Puppet::Parser::Functions.newfunction("bazinga", :type => :rvalue) { |args| args[0] }
|
970
|
+
parser.evaluate_string(scope, "bazinga(42)", __FILE__).should == 42
|
971
|
+
end
|
972
|
+
|
973
|
+
it 'maps :undef to empty string' do
|
974
|
+
Puppet::Parser::Functions.newfunction("bazinga", :type => :rvalue) { |args| args[0] }
|
975
|
+
parser.evaluate_string(scope, "$a = {} bazinga($a[nope])", __FILE__).should == ''
|
976
|
+
parser.evaluate_string(scope, "bazinga(undef)", __FILE__).should == ''
|
977
|
+
end
|
978
|
+
|
979
|
+
it 'does not map :undef to empty string in arrays' do
|
980
|
+
Puppet::Parser::Functions.newfunction("bazinga", :type => :rvalue) { |args| args[0][0] }
|
981
|
+
parser.evaluate_string(scope, "$a = {} $b = [$a[nope]] bazinga($b)", __FILE__).should == :undef
|
982
|
+
parser.evaluate_string(scope, "bazinga([undef])", __FILE__).should == :undef
|
983
|
+
end
|
984
|
+
|
985
|
+
it 'does not map :undef to empty string in hashes' do
|
986
|
+
Puppet::Parser::Functions.newfunction("bazinga", :type => :rvalue) { |args| args[0]['a'] }
|
987
|
+
parser.evaluate_string(scope, "$a = {} $b = {a => $a[nope]} bazinga($b)", __FILE__).should == :undef
|
988
|
+
parser.evaluate_string(scope, "bazinga({a => undef})", __FILE__).should == :undef
|
989
|
+
end
|
990
|
+
end
|
966
991
|
end
|
967
992
|
|
968
993
|
context "When evaluator performs string interpolation" do
|
@@ -59,11 +59,6 @@ describe "egrammar parsing function calls" do
|
|
59
59
|
dump(parse("$a = foo()")).should == "(= $a (call foo))"
|
60
60
|
end
|
61
61
|
|
62
|
-
# # For regular grammar where a bare word can not be a "statement"
|
63
|
-
# it "$a = foo bar # illegal, must have parentheses" do
|
64
|
-
# expect { dump(parse("$a = foo bar"))}.to raise_error(Puppet::ParseError)
|
65
|
-
# end
|
66
|
-
|
67
62
|
# For egrammar where a bare word can be a "statement"
|
68
63
|
it "$a = foo bar # illegal, must have parentheses" do
|
69
64
|
dump(parse("$a = foo bar")).should == "(block\n (= $a foo)\n bar\n)"
|
@@ -101,4 +96,24 @@ describe "egrammar parsing function calls" do
|
|
101
96
|
].join("\n")
|
102
97
|
end
|
103
98
|
end
|
99
|
+
|
100
|
+
context "When parsing an illegal argument list" do
|
101
|
+
it "raises an error if argument list is not for a call" do
|
102
|
+
expect do
|
103
|
+
parse("$a = 10, 3")
|
104
|
+
end.to raise_error(/illegal comma/)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "raises an error if argument list is for a potential call not allowed without parentheses" do
|
108
|
+
expect do
|
109
|
+
parse("foo 10, 3")
|
110
|
+
end.to raise_error(/attempt to pass argument list to the function 'foo' which cannot be called without parentheses/)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "does no raise an error for an argument list to an allowed call" do
|
114
|
+
expect do
|
115
|
+
parse("notice 10, 3")
|
116
|
+
end.to_not raise_error()
|
117
|
+
end
|
118
|
+
end
|
104
119
|
end
|
@@ -10,6 +10,9 @@ describe 'The type calculator' do
|
|
10
10
|
t.to = to
|
11
11
|
t
|
12
12
|
end
|
13
|
+
def constrained_t(t, from, to)
|
14
|
+
Puppet::Pops::Types::TypeFactory.constrain_size(t, from, to)
|
15
|
+
end
|
13
16
|
|
14
17
|
def pattern_t(*patterns)
|
15
18
|
Puppet::Pops::Types::TypeFactory.pattern(*patterns)
|
@@ -827,6 +830,21 @@ describe 'The type calculator' do
|
|
827
830
|
calculator.assignable?(pattern, variant_t(string_t('a'), string_t('b'))).should == true
|
828
831
|
end
|
829
832
|
|
833
|
+
it 'pattern representing all patterns should accept any pattern' do
|
834
|
+
calculator.assignable?(pattern_t(), pattern_t('a')).should == true
|
835
|
+
calculator.assignable?(pattern_t(), pattern_t()).should == true
|
836
|
+
end
|
837
|
+
|
838
|
+
it 'pattern representing all patterns should accept any enum' do
|
839
|
+
calculator.assignable?(pattern_t(), enum_t('a')).should == true
|
840
|
+
calculator.assignable?(pattern_t(), enum_t()).should == true
|
841
|
+
end
|
842
|
+
|
843
|
+
it 'pattern representing all patterns should accept any string' do
|
844
|
+
calculator.assignable?(pattern_t(), string_t('a')).should == true
|
845
|
+
calculator.assignable?(pattern_t(), string_t()).should == true
|
846
|
+
end
|
847
|
+
|
830
848
|
end
|
831
849
|
|
832
850
|
context 'when dealing with enums' do
|
@@ -842,12 +860,51 @@ describe 'The type calculator' do
|
|
842
860
|
calculator.assignable?(enum_t('a', 'b'), enum_t('c')).should == false
|
843
861
|
end
|
844
862
|
|
863
|
+
it 'non parameterized enum accepts any other enum but not the reverse' do
|
864
|
+
calculator.assignable?(enum_t(), enum_t('a')).should == true
|
865
|
+
calculator.assignable?(enum_t('a'), enum_t()).should == false
|
866
|
+
end
|
867
|
+
|
845
868
|
it 'enum should accept a variant where all variants are acceptable' do
|
846
869
|
enum = enum_t('a', 'b')
|
847
870
|
calculator.assignable?(enum, variant_t(string_t('a'), string_t('b'))).should == true
|
848
871
|
end
|
849
872
|
end
|
850
873
|
|
874
|
+
context 'when dealing with string and enum combinations' do
|
875
|
+
it 'should accept assigning any enum to unrestricted string' do
|
876
|
+
calculator.assignable?(string_t(), enum_t('blue')).should == true
|
877
|
+
calculator.assignable?(string_t(), enum_t('blue', 'red')).should == true
|
878
|
+
end
|
879
|
+
|
880
|
+
it 'should not accept assigning longer enum value to size restricted string' do
|
881
|
+
calculator.assignable?(constrained_t(string_t(),2,2), enum_t('a','blue')).should == false
|
882
|
+
end
|
883
|
+
|
884
|
+
it 'should accept assigning any string to empty enum' do
|
885
|
+
calculator.assignable?(enum_t(), string_t()).should == true
|
886
|
+
end
|
887
|
+
|
888
|
+
it 'should accept assigning empty enum to any string' do
|
889
|
+
calculator.assignable?(string_t(), enum_t()).should == true
|
890
|
+
end
|
891
|
+
|
892
|
+
it 'should not accept assigning empty enum to size constrained string' do
|
893
|
+
calculator.assignable?(constrained_t(string_t(),2,2), enum_t()).should == false
|
894
|
+
end
|
895
|
+
end
|
896
|
+
|
897
|
+
context 'when dealing with string/pattern/enum combinations' do
|
898
|
+
it 'any string is equal to any enum is equal to any pattern' do
|
899
|
+
calculator.assignable?(string_t(), enum_t()).should == true
|
900
|
+
calculator.assignable?(string_t(), pattern_t()).should == true
|
901
|
+
calculator.assignable?(enum_t(), string_t()).should == true
|
902
|
+
calculator.assignable?(enum_t(), pattern_t()).should == true
|
903
|
+
calculator.assignable?(pattern_t(), string_t()).should == true
|
904
|
+
calculator.assignable?(pattern_t(), enum_t()).should == true
|
905
|
+
end
|
906
|
+
end
|
907
|
+
|
851
908
|
context 'when dealing with tuples' do
|
852
909
|
it 'matches empty tuples' do
|
853
910
|
tuple1 = tuple_t()
|
@@ -1057,6 +1114,10 @@ describe 'The type calculator' do
|
|
1057
1114
|
calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:runtime => :ruby, :runtime_type_name => 'Symbol'), :undef).should == true
|
1058
1115
|
end
|
1059
1116
|
|
1117
|
+
it "should consider :undef to be instance of an Optional type" do
|
1118
|
+
calculator.instance?(Puppet::Pops::Types::POptionalType.new(), :undef).should == true
|
1119
|
+
end
|
1120
|
+
|
1060
1121
|
it 'should not consider undef to be an instance of any other type than Any, NilType and Data' do
|
1061
1122
|
types_to_test = all_types - [
|
1062
1123
|
Puppet::Pops::Types::PAnyType,
|
@@ -70,6 +70,10 @@ describe Puppet::Type.type(:package).provider(:pkg) do
|
|
70
70
|
described_class.expects(:pkg).with(:list,'-Hn','dummy').returns File.read(my_fixture('dummy_solaris11.installed'))
|
71
71
|
provider.latest.should == "1.0.6-0.175.0.0.0.2.537"
|
72
72
|
end
|
73
|
+
it "should work correctly for ensure latest on solaris 11 in the presence of a certificate expiration warning" do
|
74
|
+
described_class.expects(:pkg).with(:list,'-Hn','dummy').returns File.read(my_fixture('dummy_solaris11.certificate_warning'))
|
75
|
+
provider.latest.should == "1.0.6-0.175.0.0.0.2.537"
|
76
|
+
end
|
73
77
|
it "should work correctly for ensure latest on solaris 11(known UFOXI)" do
|
74
78
|
Puppet::Util::Execution.expects(:execute).with(['/bin/pkg', 'update', '-n', 'dummy'], {:failonfail => false, :combine => true}).returns ''
|
75
79
|
$CHILD_STATUS.stubs(:exitstatus).returns 0
|
@@ -142,14 +142,14 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
142
142
|
'type' => { 'days_interval' => 2 },
|
143
143
|
})
|
144
144
|
|
145
|
-
resource.provider.trigger.should == {
|
145
|
+
resource.provider.trigger.should == [{
|
146
146
|
'start_date' => '2011-9-12',
|
147
147
|
'start_time' => '13:20',
|
148
148
|
'schedule' => 'daily',
|
149
149
|
'every' => '2',
|
150
150
|
'enabled' => true,
|
151
151
|
'index' => 0,
|
152
|
-
}
|
152
|
+
}]
|
153
153
|
end
|
154
154
|
|
155
155
|
it 'should handle a single weekly trigger' do
|
@@ -171,7 +171,7 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
171
171
|
}
|
172
172
|
})
|
173
173
|
|
174
|
-
resource.provider.trigger.should == {
|
174
|
+
resource.provider.trigger.should == [{
|
175
175
|
'start_date' => '2011-9-12',
|
176
176
|
'start_time' => '13:20',
|
177
177
|
'schedule' => 'weekly',
|
@@ -179,7 +179,7 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
179
179
|
'on' => ['sun', 'mon', 'wed', 'fri'],
|
180
180
|
'enabled' => true,
|
181
181
|
'index' => 0,
|
182
|
-
}
|
182
|
+
}]
|
183
183
|
end
|
184
184
|
|
185
185
|
it 'should handle a single monthly date-based trigger' do
|
@@ -204,7 +204,7 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
204
204
|
}
|
205
205
|
})
|
206
206
|
|
207
|
-
resource.provider.trigger.should == {
|
207
|
+
resource.provider.trigger.should == [{
|
208
208
|
'start_date' => '2011-9-12',
|
209
209
|
'start_time' => '13:20',
|
210
210
|
'schedule' => 'monthly',
|
@@ -212,7 +212,7 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
212
212
|
'on' => [1, 3, 5, 15, 'last'],
|
213
213
|
'enabled' => true,
|
214
214
|
'index' => 0,
|
215
|
-
}
|
215
|
+
}]
|
216
216
|
end
|
217
217
|
|
218
218
|
it 'should handle a single monthly day-of-week-based trigger' do
|
@@ -240,7 +240,7 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
240
240
|
}
|
241
241
|
})
|
242
242
|
|
243
|
-
resource.provider.trigger.should == {
|
243
|
+
resource.provider.trigger.should == [{
|
244
244
|
'start_date' => '2011-9-12',
|
245
245
|
'start_time' => '13:20',
|
246
246
|
'schedule' => 'monthly',
|
@@ -249,7 +249,7 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
249
249
|
'day_of_week' => ['sun', 'mon', 'wed', 'fri'],
|
250
250
|
'enabled' => true,
|
251
251
|
'index' => 0,
|
252
|
-
}
|
252
|
+
}]
|
253
253
|
end
|
254
254
|
|
255
255
|
it 'should handle a single one-time trigger' do
|
@@ -263,13 +263,13 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
263
263
|
'flags' => 0,
|
264
264
|
})
|
265
265
|
|
266
|
-
resource.provider.trigger.should == {
|
266
|
+
resource.provider.trigger.should == [{
|
267
267
|
'start_date' => '2011-9-12',
|
268
268
|
'start_time' => '13:20',
|
269
269
|
'schedule' => 'once',
|
270
270
|
'enabled' => true,
|
271
271
|
'index' => 0,
|
272
|
-
}
|
272
|
+
}]
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
@@ -536,18 +536,18 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
536
536
|
'index' => 0,
|
537
537
|
}
|
538
538
|
|
539
|
-
resource.provider.trigger.should == mock_task_trigger
|
540
|
-
resource.provider.trigger.should == mock_task_trigger
|
539
|
+
resource.provider.trigger.should == [mock_task_trigger]
|
540
|
+
resource.provider.trigger.should == [mock_task_trigger]
|
541
541
|
|
542
542
|
resource.provider.clear_task
|
543
543
|
|
544
|
-
resource.provider.trigger.should == {
|
544
|
+
resource.provider.trigger.should == [{
|
545
545
|
'start_date' => '2012-11-14',
|
546
546
|
'start_time' => '15:22',
|
547
547
|
'schedule' => 'once',
|
548
548
|
'enabled' => true,
|
549
549
|
'index' => 0,
|
550
|
-
}
|
550
|
+
}]
|
551
551
|
end
|
552
552
|
end
|
553
553
|
|
@@ -635,6 +635,30 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
635
635
|
describe '#triggers_same?' do
|
636
636
|
let(:provider) { described_class.new(:name => 'foobar', :command => 'C:\Windows\System32\notepad.exe') }
|
637
637
|
|
638
|
+
it "should not mutate triggers" do
|
639
|
+
current = {'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
640
|
+
current.freeze
|
641
|
+
|
642
|
+
desired = {'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30'}
|
643
|
+
desired.freeze
|
644
|
+
|
645
|
+
expect(provider).to be_triggers_same(current, desired)
|
646
|
+
end
|
647
|
+
|
648
|
+
it "ignores 'index' in current trigger" do
|
649
|
+
current = {'index' => 0, 'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
650
|
+
desired = {'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
651
|
+
|
652
|
+
expect(provider).to be_triggers_same(current, desired)
|
653
|
+
end
|
654
|
+
|
655
|
+
it "ignores 'enabled' in current triggger" do
|
656
|
+
current = {'enabled' => true, 'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
657
|
+
desired = {'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
658
|
+
|
659
|
+
expect(provider).to be_triggers_same(current, desired)
|
660
|
+
end
|
661
|
+
|
638
662
|
it "should not consider a disabled 'current' trigger to be the same" do
|
639
663
|
current = {'schedule' => 'once', 'enabled' => false}
|
640
664
|
desired = {'schedule' => 'once'}
|
@@ -649,6 +673,15 @@ describe Puppet::Type.type(:scheduled_task).provider(:win32_taskscheduler), :if
|
|
649
673
|
provider.should_not be_triggers_same(current, desired)
|
650
674
|
end
|
651
675
|
|
676
|
+
describe 'start_date' do
|
677
|
+
it "considers triggers to be equal when start_date is not specified in the 'desired' trigger" do
|
678
|
+
current = {'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
679
|
+
desired = {'schedule' => 'daily', 'start_time' => '15:30', 'every' => 3}
|
680
|
+
|
681
|
+
provider.should be_triggers_same(current, desired)
|
682
|
+
end
|
683
|
+
end
|
684
|
+
|
652
685
|
describe 'comparing daily triggers' do
|
653
686
|
it "should consider 'desired' triggers not specifying 'every' to have the same value as the 'current' trigger" do
|
654
687
|
current = {'schedule' => 'daily', 'start_date' => '2011-09-12', 'start_time' => '15:30', 'every' => 3}
|
@@ -136,6 +136,21 @@ describe provider_class, :unless => Puppet.features.microsoft_windows? do
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
+
describe "prefetch_hook" do
|
140
|
+
let(:path) { '/path/to/keyfile' }
|
141
|
+
let(:input) do
|
142
|
+
{ :type => 'rsa',
|
143
|
+
:key => 'KEYDATA',
|
144
|
+
:name => '',
|
145
|
+
:record_type => :parsed,
|
146
|
+
:target => path,
|
147
|
+
}
|
148
|
+
end
|
149
|
+
it "adds an indexed name to unnamed resources" do
|
150
|
+
@provider_class.prefetch_hook([input])[0][:name].should =~ /^#{path}:unnamed-\d+/
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
139
154
|
end
|
140
155
|
|
141
156
|
describe provider_class, :unless => Puppet.features.microsoft_windows? do
|
data/spec/unit/type/user_spec.rb
CHANGED
@@ -501,6 +501,11 @@ describe Puppet::Type.type(:user) do
|
|
501
501
|
names = resources.collect { |res| res.name }
|
502
502
|
names.should_not include("keyname3")
|
503
503
|
end
|
504
|
+
it "should generate names for unnamed keys" do
|
505
|
+
names = resources.collect { |res| res.name }
|
506
|
+
fixture_path = File.join(my_fixture_dir, 'authorized_keys')
|
507
|
+
names.should include("#{fixture_path}:unnamed-1")
|
508
|
+
end
|
504
509
|
it "should each have a value for the user property" do
|
505
510
|
resources.map { |res|
|
506
511
|
res[:user]
|
@@ -5,10 +5,10 @@ require 'puppet/util/autoload'
|
|
5
5
|
|
6
6
|
describe Puppet::Util::Autoload do
|
7
7
|
include PuppetSpec::Files
|
8
|
+
|
8
9
|
before do
|
9
10
|
@autoload = Puppet::Util::Autoload.new("foo", "tmp")
|
10
11
|
|
11
|
-
@autoload.stubs(:eachdir).yields make_absolute("/my/dir")
|
12
12
|
@loaded = {}
|
13
13
|
@autoload.class.stubs(:loaded).returns(@loaded)
|
14
14
|
end
|
@@ -17,25 +17,44 @@ describe Puppet::Util::Autoload do
|
|
17
17
|
before :each do
|
18
18
|
## modulepath/libdir can't be used until after app settings are initialized, so we need to simulate that:
|
19
19
|
Puppet.settings.expects(:app_defaults_initialized?).returns(true).at_least_once
|
20
|
-
|
21
|
-
@dira = File.expand_path('/a')
|
22
|
-
@dirb = File.expand_path('/b')
|
23
|
-
@dirc = File.expand_path('/c')
|
24
20
|
end
|
25
21
|
|
26
22
|
it "should collect all of the lib directories that exist in the current environment's module path" do
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
dira = dir_containing('dir_a', {
|
24
|
+
"one" => {},
|
25
|
+
"two" => { "lib" => {} }
|
26
|
+
})
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
dirb = dir_containing('dir_a', {
|
29
|
+
"one" => {},
|
30
|
+
"two" => { "lib" => {} }
|
31
|
+
})
|
34
32
|
|
35
|
-
|
36
|
-
|
33
|
+
environment = Puppet::Node::Environment.create(:foo, [dira, dirb])
|
34
|
+
|
35
|
+
@autoload.class.module_directories(environment).should == ["#{dira}/two/lib", "#{dirb}/two/lib"]
|
36
|
+
end
|
37
|
+
|
38
|
+
it "ignores missing module directories" do
|
39
|
+
environment = Puppet::Node::Environment.create(:foo, [File.expand_path('does/not/exist')])
|
40
|
+
|
41
|
+
@autoload.class.module_directories(environment).should be_empty
|
42
|
+
end
|
37
43
|
|
38
|
-
|
44
|
+
it "ignores the configured environment when it doesn't exist" do
|
45
|
+
Puppet[:environment] = 'nonexistent'
|
46
|
+
|
47
|
+
Puppet.override({ :environments => Puppet::Environments::Static.new() }) do
|
48
|
+
@autoload.class.module_directories(nil).should be_empty
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it "uses the configured environment when no environment is given" do
|
53
|
+
Puppet[:environment] = 'nonexistent'
|
54
|
+
|
55
|
+
Puppet.override({ :environments => Puppet::Environments::Static.new() }) do
|
56
|
+
@autoload.class.module_directories(nil).should be_empty
|
57
|
+
end
|
39
58
|
end
|
40
59
|
|
41
60
|
it "should include the module directories, the Puppet libdir, and all of the Ruby load directories" do
|