diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-05-13 18:27:22 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-05-13 18:27:22 +0000 |
commit | 9e9ef1acc6231254e52b96257ed1e81475d2d1bc (patch) | |
tree | db3fec56ad53ee8741c1c07e56e4f965e1f24320 | |
parent | 8ed666a7c202420d4bc59cea77f3bd0bec95cc11 (diff) | |
download | puppet-9e9ef1acc6231254e52b96257ed1e81475d2d1bc.tar.gz puppet-9e9ef1acc6231254e52b96257ed1e81475d2d1bc.tar.xz puppet-9e9ef1acc6231254e52b96257ed1e81475d2d1bc.zip |
The "collectable" syntax now works end-to-end -- the parser correctly recognizes it, the AST objects retain the settings, the scopes do the right conversion, the interpreter stores them all in the database, and then it strips the collectable objects out before sending the object list to the client
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1189 980ebf18-57e1-0310-9a29-db15c13687c0
-rw-r--r-- | lib/puppet/parser/ast/objectdef.rb | 7 | ||||
-rw-r--r-- | lib/puppet/parser/grammar.ra | 22 | ||||
-rw-r--r-- | lib/puppet/parser/interpreter.rb | 10 | ||||
-rw-r--r-- | lib/puppet/parser/lexer.rb | 3 | ||||
-rw-r--r-- | lib/puppet/parser/parser.rb | 799 | ||||
-rw-r--r-- | lib/puppet/parser/scope.rb | 120 | ||||
-rw-r--r-- | lib/puppet/rails.rb | 44 | ||||
-rw-r--r-- | lib/puppet/rails/host.rb | 2 | ||||
-rw-r--r-- | lib/puppet/rails/rails_object.rb | 8 | ||||
-rw-r--r-- | lib/puppet/transportable.rb | 30 | ||||
-rwxr-xr-x | test/language/interpreter.rb | 8 | ||||
-rw-r--r-- | test/language/lexer.rb | 35 | ||||
-rw-r--r-- | test/language/parser.rb | 34 | ||||
-rwxr-xr-x | test/language/rails.rb | 38 | ||||
-rwxr-xr-x | test/language/scope.rb | 55 | ||||
-rwxr-xr-x | test/language/transportable.rb | 88 | ||||
-rw-r--r-- | test/puppettest.rb | 61 |
17 files changed, 809 insertions, 555 deletions
diff --git a/lib/puppet/parser/ast/objectdef.rb b/lib/puppet/parser/ast/objectdef.rb index 9acf56b49..f15a082e2 100644 --- a/lib/puppet/parser/ast/objectdef.rb +++ b/lib/puppet/parser/ast/objectdef.rb @@ -2,7 +2,7 @@ class Puppet::Parser::AST # Any normal puppet object declaration. Can result in a class or a # component, in addition to builtin types. class ObjectDef < AST::Branch - attr_accessor :name, :type + attr_accessor :name, :type, :collectable attr_reader :params # probably not used at all @@ -93,6 +93,11 @@ class Puppet::Parser::AST :file => @file, :line => @line ) + + # Retain our collectable marking + if self.collectable + obj.collectable = true + end rescue Puppet::ParseError => except except.line = self.line except.file = self.file diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra index c3b694534..b10999bbd 100644 --- a/lib/puppet/parser/grammar.ra +++ b/lib/puppet/parser/grammar.ra @@ -7,7 +7,7 @@ class Puppet::Parser::Parser token LBRACK DQTEXT SQTEXT RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE FALSE EQUALS token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN LESSEQUAL NOTEQUAL token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN DOT COLON TYPE -token NAME SEMIC CASE DEFAULT INCLUDE TAG FUNCTION +token NAME SEMIC CASE DEFAULT FUNCTION AT # We have 2 shift/reduce conflicts expect 2 @@ -40,6 +40,7 @@ statements: statement # The main list of valid statements statement: object + | collectable | assignment | casestatement | import @@ -148,6 +149,25 @@ object: name LBRACE objectinstances endsemi RBRACE { ) } +# Collectable objects; these get stored in the database, instead of +# being passed to the client. +collectable: AT object { + if val[1].is_a? AST::TypeDefaults + raise Puppet::ParseError, "Defaults are not collectable" + end + + # Just mark our objects as collectable and pass them through. + if val[1].instance_of?(AST::ASTArray) + val[1].each do |obj| + obj.collectable = true + end + else + val[1].collectable = true + end + + result = val[1] +} + objectinst: objectname COLON params endcomma { result = AST::ObjectInst.new( :line => @lexer.line, diff --git a/lib/puppet/parser/interpreter.rb b/lib/puppet/parser/interpreter.rb index a11e870ab..5ddd82829 100644 --- a/lib/puppet/parser/interpreter.rb +++ b/lib/puppet/parser/interpreter.rb @@ -246,13 +246,21 @@ module Puppet raise LoadError, "storeconfigs is enabled but rails is unavailable" end - Puppet::Rails.init end + + Puppet::Rails.init + + # We store all of the objects, even the collectable ones Puppet::Rails::Host.store( :objects => objects, :host => client, :facts => facts ) + + # Now that we've stored everything, we need to strip out + # the collectable objects so that they are not sent on + # to the host + objects.collectstrip! end return objects diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb index e3fc9ded7..65a513624 100644 --- a/lib/puppet/parser/lexer.rb +++ b/lib/puppet/parser/lexer.rb @@ -34,6 +34,9 @@ module Puppet %r{,} => :COMMA, %r{\.} => :DOT, %r{:} => :COLON, + %r{@} => :AT, + %r{<\|} => :LCOLLECT, + %r{\|>} => :RCOLLECT, %r{;} => :SEMIC, %r{\?} => :QMARK, %r{\\} => :BACKSLASH, diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb index 7a5fd7c55..5b3495a8c 100644 --- a/lib/puppet/parser/parser.rb +++ b/lib/puppet/parser/parser.rb @@ -29,7 +29,7 @@ module Puppet class Parser < Racc::Parser -module_eval <<'..end grammar.ra modeval..id81e5fd5119', 'grammar.ra', 737 +module_eval <<'..end grammar.ra modeval..id4642cdeefd', 'grammar.ra', 757 require 'puppet/parser/functions' attr_reader :file @@ -155,52 +155,54 @@ end # $Id$ -..end grammar.ra modeval..id81e5fd5119 +..end grammar.ra modeval..id4642cdeefd ##### racc 1.4.4 generates ### racc_reduce_table = [ 0, 0, :racc_error, - 1, 44, :_reduce_1, + 1, 43, :_reduce_1, + 1, 44, :_reduce_none, + 2, 44, :_reduce_3, 1, 45, :_reduce_none, - 2, 45, :_reduce_3, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 1, 46, :_reduce_none, - 4, 51, :_reduce_12, - 2, 51, :_reduce_13, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 1, 45, :_reduce_none, + 4, 51, :_reduce_13, + 2, 51, :_reduce_14, 1, 55, :_reduce_none, - 3, 55, :_reduce_15, + 3, 55, :_reduce_16, 1, 56, :_reduce_none, 1, 56, :_reduce_none, - 5, 47, :_reduce_18, - 5, 47, :_reduce_19, - 5, 47, :_reduce_20, - 4, 64, :_reduce_21, + 5, 46, :_reduce_19, + 5, 46, :_reduce_20, + 5, 46, :_reduce_21, + 2, 47, :_reduce_22, + 4, 64, :_reduce_23, 1, 59, :_reduce_none, - 3, 59, :_reduce_23, + 3, 59, :_reduce_25, 0, 60, :_reduce_none, 1, 60, :_reduce_none, - 1, 57, :_reduce_26, - 1, 63, :_reduce_27, + 1, 57, :_reduce_28, + 1, 63, :_reduce_29, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, 1, 65, :_reduce_none, - 3, 48, :_reduce_34, - 0, 61, :_reduce_35, - 1, 61, :_reduce_36, - 3, 61, :_reduce_37, - 3, 70, :_reduce_38, + 3, 48, :_reduce_36, + 0, 61, :_reduce_37, + 1, 61, :_reduce_38, + 3, 61, :_reduce_39, + 3, 70, :_reduce_40, 1, 71, :_reduce_none, - 3, 71, :_reduce_40, + 3, 71, :_reduce_42, 1, 69, :_reduce_none, 1, 69, :_reduce_none, 1, 69, :_reduce_none, @@ -211,258 +213,268 @@ racc_reduce_table = [ 1, 69, :_reduce_none, 1, 69, :_reduce_none, 1, 69, :_reduce_none, - 4, 75, :_reduce_51, - 1, 66, :_reduce_52, - 1, 66, :_reduce_53, - 1, 73, :_reduce_54, - 4, 74, :_reduce_55, - 5, 49, :_reduce_56, + 4, 75, :_reduce_53, + 1, 66, :_reduce_54, + 1, 66, :_reduce_55, + 1, 73, :_reduce_56, + 4, 74, :_reduce_57, + 5, 49, :_reduce_58, 1, 76, :_reduce_none, - 2, 76, :_reduce_58, - 5, 77, :_reduce_59, - 4, 77, :_reduce_60, + 2, 76, :_reduce_60, + 5, 77, :_reduce_61, + 4, 77, :_reduce_62, 1, 78, :_reduce_none, - 3, 78, :_reduce_62, - 3, 67, :_reduce_63, + 3, 78, :_reduce_64, + 3, 67, :_reduce_65, 1, 80, :_reduce_none, - 3, 80, :_reduce_65, + 3, 80, :_reduce_67, 1, 82, :_reduce_none, - 3, 82, :_reduce_67, - 3, 81, :_reduce_68, + 3, 82, :_reduce_69, + 3, 81, :_reduce_70, 1, 79, :_reduce_none, 1, 79, :_reduce_none, 1, 79, :_reduce_none, 1, 79, :_reduce_none, 1, 79, :_reduce_none, 1, 79, :_reduce_none, - 1, 79, :_reduce_75, - 2, 50, :_reduce_76, - 6, 52, :_reduce_77, - 5, 52, :_reduce_78, - 6, 53, :_reduce_79, - 5, 53, :_reduce_80, - 6, 54, :_reduce_81, - 5, 54, :_reduce_82, + 1, 79, :_reduce_77, + 2, 50, :_reduce_78, + 6, 52, :_reduce_79, + 5, 52, :_reduce_80, + 6, 53, :_reduce_81, + 5, 53, :_reduce_82, + 6, 54, :_reduce_83, + 5, 54, :_reduce_84, 1, 85, :_reduce_none, - 2, 85, :_reduce_84, - 1, 86, :_reduce_85, - 1, 86, :_reduce_86, - 0, 87, :_reduce_87, + 2, 85, :_reduce_86, + 1, 86, :_reduce_87, + 1, 86, :_reduce_88, + 0, 87, :_reduce_89, 1, 83, :_reduce_none, - 3, 83, :_reduce_89, - 3, 83, :_reduce_90, + 3, 83, :_reduce_91, + 3, 83, :_reduce_92, 1, 88, :_reduce_none, - 3, 88, :_reduce_92, - 3, 89, :_reduce_93, - 1, 89, :_reduce_94, + 3, 88, :_reduce_94, + 3, 89, :_reduce_95, + 1, 89, :_reduce_96, 1, 84, :_reduce_none, - 2, 84, :_reduce_96, - 1, 58, :_reduce_97, - 3, 68, :_reduce_98, + 2, 84, :_reduce_98, + 1, 58, :_reduce_99, + 3, 68, :_reduce_100, 1, 72, :_reduce_none, 1, 72, :_reduce_none, 0, 62, :_reduce_none, - 1, 62, :_reduce_102 ] + 1, 62, :_reduce_104 ] -racc_reduce_n = 103 +racc_reduce_n = 105 -racc_shift_n = 170 +racc_shift_n = 173 racc_action_table = [ - 32, 27, 28, 146, 51, 32, 27, 28, 58, 91, - 161, 87, 106, 107, 91, 149, 80, 32, 27, 28, - 25, 39, 32, 27, 28, 87, 39, 145, -69, 7, - 46, 39, 85, 3, 7, 46, 50, 40, 3, 7, - 44, 51, 40, 39, 7, 44, 122, 46, 39, 123, - 3, 7, 46, 39, 40, 3, 7, 44, 39, 40, - 93, 7, 44, 32, 27, 28, 7, 85, 32, 27, - 28, 39, 135, 50, 97, 49, 27, 28, 134, 7, - 32, 27, 28, -70, 91, 32, 27, 28, 125, 39, - 127, 98, -70, 46, 39, -73, 3, 7, 46, 82, - 40, 3, 65, 44, 130, 40, 39, 131, 44, 87, - 46, 39, 103, 3, 7, 46, 97, 40, 3, 7, - 44, 136, 40, 137, 94, 44, 32, 27, 28, -74, - 104, 32, 27, 28, 106, 107, -72, 81, 144, 93, - 79, -72, -71, 152, 27, 28, 74, 97, 7, 27, - 28, 59, 39, 148, 49, 48, 46, 39, -69, 3, - 7, 46, 162, 40, 3, 7, 44, 47, 40, 39, - 29, 44, -71, 46, 39, 25, 3, 7, 46, 23, - 40, 3, 7, 44, 141, 40, 27, 28, 44, nil, - nil, 27, 28, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 27, 28, nil, 114, nil, 27, 28, - nil, 39, nil, nil, nil, 46, 39, nil, 3, 7, - 46, nil, 40, 3, 7, 44, nil, 40, 39, nil, - 44, 169, 46, 39, nil, 3, 7, 46, nil, 40, - 3, 7, 44, nil, 40, nil, 151, 44, nil, 6, - 9, nil, 13, 15, nil, 19, nil, nil, nil, 3, - 7, 158, 11, nil, 6, 9, 20, 13, 15, nil, - 19, nil, nil, nil, 3, 7, 164, 11, nil, 6, - 9, 20, 13, 15, nil, 19, nil, nil, nil, 3, - 7, 165, 11, nil, 6, 9, 20, 13, 15, nil, - 19, nil, nil, nil, 3, 7, 168, 11, nil, 6, - 9, 20, 13, 15, nil, 19, nil, nil, nil, 3, - 7, 139, 11, nil, 6, 9, 20, 13, 15, nil, - 19, nil, nil, nil, 3, 7, 154, 11, nil, 6, - 9, 20, 13, 15, nil, 19, nil, nil, nil, 3, - 7, nil, 11, nil, 6, 9, 20, 13, 15, nil, - 19, nil, nil, nil, 3, 7, nil, 11, nil, 6, - 9, 20, 13, 15, nil, 19, nil, nil, nil, 3, - 7, nil, 11, nil, 6, 9, 20, 13, 15, nil, - 19, nil, nil, nil, 3, 7, nil, 11, nil, nil, - nil, 20 ] + 33, 28, 29, 58, 149, 40, 33, 28, 29, 140, + 58, 56, 40, 7, -76, 33, 28, 29, 89, -72, + 7, 33, 28, 29, 128, 138, 40, 84, 148, 87, + 47, 137, 40, 3, 7, 57, 47, 41, 42, 3, + 7, 40, 57, 41, 42, 47, -74, 40, 3, 67, + 54, 47, 41, 42, 3, 7, 40, 100, 41, 42, + 33, 28, 29, 40, 7, 107, 33, 28, 29, 109, + 110, 7, 89, 28, 29, 33, 28, 29, 152, 3, + 7, 33, 28, 29, 125, 164, 40, 109, 110, 126, + 47, 97, 40, 3, 7, 96, 47, 41, 42, 3, + 7, 40, 96, 41, 42, 47, 100, 40, 3, 7, + 130, 47, 41, 42, 3, 7, 83, -74, 41, 42, + 33, 28, 29, 133, 134, 91, 33, 28, 29, 82, + 91, -71, 139, 26, -72, 81, 28, 29, -73, 144, + 76, -71, 28, 29, 147, -73, 40, 61, 95, 91, + 47, 155, 40, 3, 7, 56, 47, 41, 42, 3, + 7, 40, 100, 41, 42, 47, 7, 40, 3, 7, + 106, 47, 41, 42, 3, 7, 28, 29, 41, 42, + 151, 89, 28, 29, 49, 7, 165, 48, 30, 101, + 26, 28, 29, 87, -75, nil, nil, 28, 29, nil, + 117, 40, nil, nil, nil, 47, nil, 40, 3, 7, + nil, 47, 41, 42, 3, 7, 40, 157, 41, 42, + 47, nil, 40, 3, 7, nil, 47, 41, 42, 3, + 7, nil, nil, 41, 42, 6, 9, 142, 13, 15, + nil, 21, nil, nil, nil, 3, 7, nil, 11, nil, + 16, 18, nil, nil, 161, 6, 9, nil, 13, 15, + nil, 21, nil, nil, nil, 3, 7, nil, 11, nil, + 16, 18, 6, 9, 167, 13, 15, nil, 21, nil, + nil, nil, 3, 7, nil, 11, nil, 16, 18, nil, + nil, 168, 6, 9, nil, 13, 15, nil, 21, nil, + nil, nil, 3, 7, nil, 11, nil, 16, 18, 6, + 9, 171, 13, 15, nil, 21, nil, nil, nil, 3, + 7, nil, 11, nil, 16, 18, nil, nil, 154, 6, + 9, nil, 13, 15, nil, 21, nil, nil, nil, 3, + 7, nil, 11, nil, 16, 18, 6, 9, 172, 13, + 15, nil, 21, nil, nil, nil, 3, 7, nil, 11, + nil, 16, 18, nil, nil, nil, 6, 9, nil, 13, + 15, nil, 21, nil, nil, nil, 3, 7, nil, 11, + nil, 16, 18, 6, 9, nil, 13, 15, nil, 21, + nil, nil, nil, 3, 7, nil, 11, nil, 16, 18, + 6, 9, nil, 13, 15, nil, 21, nil, nil, nil, + 3, 7, nil, 11, nil, 16, 18 ] racc_action_check = [ - 47, 47, 47, 118, 19, 105, 105, 105, 20, 121, - 143, 98, 143, 143, 54, 121, 35, 80, 80, 80, - 35, 20, 32, 32, 32, 49, 47, 118, 35, 20, - 47, 105, 48, 47, 47, 105, 19, 47, 105, 105, - 47, 52, 105, 80, 74, 105, 84, 80, 32, 85, - 80, 80, 32, 91, 80, 32, 32, 80, 82, 32, - 87, 91, 32, 94, 94, 94, 82, 52, 25, 25, - 25, 58, 99, 52, 88, 43, 6, 6, 99, 58, - 11, 11, 11, 43, 92, 136, 136, 136, 89, 94, - 92, 73, 70, 94, 25, 45, 94, 94, 25, 44, - 94, 25, 25, 94, 95, 25, 11, 96, 25, 97, - 11, 136, 75, 11, 11, 136, 68, 11, 136, 136, - 11, 101, 136, 102, 67, 136, 93, 93, 93, 41, - 78, 141, 141, 141, 78, 78, 37, 36, 116, 65, - 33, 64, 30, 124, 81, 81, 29, 133, 135, 120, - 120, 23, 93, 120, 17, 15, 93, 141, 63, 93, - 93, 141, 145, 93, 141, 141, 93, 13, 141, 81, - 9, 141, 60, 81, 120, 4, 81, 81, 120, 1, - 81, 120, 120, 81, 110, 120, 146, 146, 120, nil, - nil, 114, 114, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 79, 79, nil, 79, nil, 160, 160, - nil, 146, nil, nil, nil, 146, 114, nil, 146, 146, - 114, nil, 146, 114, 114, 146, nil, 114, 79, nil, - 114, 167, 79, 160, nil, 79, 79, 160, nil, 79, - 160, 160, 79, nil, 160, nil, 122, 160, nil, 167, - 167, nil, 167, 167, nil, 167, nil, nil, nil, 167, - 167, 138, 167, nil, 122, 122, 167, 122, 122, nil, - 122, nil, nil, nil, 122, 122, 150, 122, nil, 138, - 138, 122, 138, 138, nil, 138, nil, nil, nil, 138, - 138, 153, 138, nil, 150, 150, 138, 150, 150, nil, - 150, nil, nil, nil, 150, 150, 162, 150, nil, 153, - 153, 150, 153, 153, nil, 153, nil, nil, nil, 153, - 153, 103, 153, nil, 162, 162, 153, 162, 162, nil, - 162, nil, nil, nil, 162, 162, 125, 162, nil, 103, - 103, 162, 103, 103, nil, 103, nil, nil, nil, 103, - 103, nil, 103, nil, 125, 125, 103, 125, 125, nil, - 125, nil, nil, nil, 125, 125, nil, 125, nil, 2, - 2, 125, 2, 2, nil, 2, nil, nil, nil, 2, - 2, nil, 2, nil, 0, 0, 2, 0, 0, nil, - 0, nil, nil, nil, 0, 0, nil, 0, nil, nil, - nil, 0 ] + 48, 48, 48, 59, 121, 54, 82, 82, 82, 105, + 21, 45, 84, 54, 43, 26, 26, 26, 90, 45, + 84, 108, 108, 108, 90, 102, 48, 42, 121, 59, + 48, 102, 82, 48, 48, 59, 82, 48, 48, 82, + 82, 26, 21, 82, 82, 26, 39, 108, 26, 26, + 16, 108, 26, 26, 108, 108, 89, 70, 108, 108, + 96, 96, 96, 16, 89, 80, 11, 11, 11, 80, + 80, 16, 124, 6, 6, 33, 33, 33, 124, 18, + 18, 139, 139, 139, 86, 146, 96, 146, 146, 87, + 96, 69, 11, 96, 96, 67, 11, 96, 96, 11, + 11, 33, 91, 11, 11, 33, 92, 139, 33, 33, + 93, 139, 33, 33, 139, 139, 38, 66, 139, 139, + 97, 97, 97, 98, 99, 100, 144, 144, 144, 37, + 101, 65, 104, 37, 72, 34, 149, 149, 31, 113, + 30, 37, 83, 83, 119, 62, 97, 24, 61, 56, + 97, 129, 144, 97, 97, 19, 144, 97, 97, 144, + 144, 149, 136, 144, 144, 149, 138, 83, 149, 149, + 77, 83, 149, 149, 83, 83, 123, 123, 83, 83, + 123, 50, 163, 163, 15, 76, 148, 13, 9, 75, + 4, 117, 117, 49, 46, nil, nil, 81, 81, nil, + 81, 123, nil, nil, nil, 123, nil, 163, 123, 123, + nil, 163, 123, 123, 163, 163, 117, 130, 163, 163, + 117, nil, 81, 117, 117, nil, 81, 117, 117, 81, + 81, nil, nil, 81, 81, 130, 130, 106, 130, 130, + nil, 130, nil, nil, nil, 130, 130, nil, 130, nil, + 130, 130, nil, nil, 141, 106, 106, nil, 106, 106, + nil, 106, nil, nil, nil, 106, 106, nil, 106, nil, + 106, 106, 141, 141, 153, 141, 141, nil, 141, nil, + nil, nil, 141, 141, nil, 141, nil, 141, 141, nil, + nil, 156, 153, 153, nil, 153, 153, nil, 153, nil, + nil, nil, 153, 153, nil, 153, nil, 153, 153, 156, + 156, 165, 156, 156, nil, 156, nil, nil, nil, 156, + 156, nil, 156, nil, 156, 156, nil, nil, 125, 165, + 165, nil, 165, 165, nil, 165, nil, nil, nil, 165, + 165, nil, 165, nil, 165, 165, 125, 125, 170, 125, + 125, nil, 125, nil, nil, nil, 125, 125, nil, 125, + nil, 125, 125, nil, nil, nil, 170, 170, nil, 170, + 170, nil, 170, nil, nil, nil, 170, 170, nil, 170, + nil, 170, 170, 0, 0, nil, 0, 0, nil, 0, + nil, nil, nil, 0, 0, nil, 0, nil, 0, 0, + 1, 1, nil, 1, 1, nil, 1, nil, nil, nil, + 1, 1, nil, 1, nil, 1, 1 ] racc_action_pointer = [ - 359, 179, 344, nil, 169, nil, 73, nil, nil, 134, - nil, 78, nil, 154, nil, 119, nil, 148, nil, 0, - -7, nil, nil, 151, nil, 66, nil, nil, nil, 131, - 128, nil, 20, 126, nil, 14, 131, 122, nil, nil, - nil, 115, nil, 69, 84, 81, nil, -2, 2, -11, - nil, nil, 37, nil, 4, nil, nil, nil, 43, nil, - 158, nil, nil, 144, 127, 130, nil, 87, 106, nil, - 78, nil, nil, 57, 8, 106, nil, nil, 125, 200, - 15, 141, 30, nil, 40, 13, nil, 51, 64, 82, - nil, 25, 74, 124, 61, 97, 100, 73, -25, 62, - nil, 108, 107, 314, nil, 3, nil, nil, nil, nil, - 175, nil, nil, nil, 188, nil, 133, nil, -7, nil, - 146, -1, 239, nil, 136, 329, nil, nil, nil, nil, - nil, nil, nil, 137, nil, 112, 83, nil, 254, nil, - nil, 129, nil, 3, nil, 156, 183, nil, nil, nil, - 269, nil, nil, 284, nil, nil, nil, nil, nil, nil, - 205, nil, 299, nil, nil, nil, nil, 224, nil, nil ] + 358, 375, nil, nil, 184, nil, 70, nil, nil, 152, + nil, 64, nil, 174, nil, 148, 35, nil, 44, 149, + nil, 6, nil, nil, 147, nil, 13, nil, nil, nil, + 125, 124, nil, 73, 121, nil, nil, 127, 110, 32, + nil, nil, 12, 0, nil, 5, 180, nil, -2, 163, + 171, nil, nil, nil, -23, nil, 113, nil, nil, -1, + nil, 148, 131, nil, nil, 117, 103, 86, nil, 54, + 47, nil, 120, nil, nil, 155, 149, 164, nil, nil, + 60, 194, 4, 139, -16, nil, 78, 53, nil, 28, + 8, 93, 96, 104, nil, nil, 58, 118, 116, 117, + 89, 94, 15, nil, 119, -7, 230, nil, 19, nil, + nil, nil, nil, 130, nil, nil, nil, 188, nil, 139, + nil, -6, nil, 173, 62, 321, nil, nil, nil, 144, + 210, nil, nil, nil, nil, nil, 152, nil, 130, 79, + nil, 247, nil, nil, 124, nil, 78, nil, 180, 133, + nil, nil, nil, 267, nil, nil, 284, nil, nil, nil, + nil, nil, nil, 179, nil, 304, nil, nil, nil, nil, + 341, nil, nil ] racc_action_default = [ - -103, -103, -1, -27, -103, -2, -103, -26, -4, -103, - -5, -103, -6, -103, -7, -103, -8, -103, -9, -103, - -103, -10, -11, -103, -3, -35, -76, -52, -53, -87, - -41, -45, -103, -103, -48, -42, -103, -47, -46, -97, - -75, -44, -49, -43, -103, -50, -54, -103, -87, -35, - -85, -86, -87, -83, -13, -14, -16, -17, -103, 170, - -28, -31, -33, -29, -32, -26, -36, -24, -101, -74, - -30, -73, -22, -103, -87, -103, -88, -39, -103, -103, - -103, -103, -103, -34, -103, -103, -95, -103, -101, -103, - -84, -103, -103, -103, -25, -103, -103, -102, -35, -103, - -91, -94, -103, -103, -98, -103, -99, -100, -71, -69, - -103, -72, -63, -64, -103, -70, -103, -57, -103, -61, - -103, -103, -103, -96, -103, -103, -15, -12, -38, -23, - -18, -19, -37, -101, -90, -103, -103, -89, -103, -78, - -40, -103, -66, -103, -55, -103, -103, -58, -56, -51, - -103, -80, -20, -103, -82, -21, -92, -93, -77, -68, - -103, -65, -103, -62, -79, -81, -67, -103, -60, -59 ] + -105, -1, -2, -29, -105, -4, -105, -28, -5, -105, + -6, -105, -7, -105, -8, -105, -105, -9, -105, -105, + -10, -105, -11, -12, -105, -3, -37, -78, -54, -55, + -89, -43, -47, -105, -105, -50, -48, -44, -105, -49, + -99, -77, -105, -46, -51, -45, -52, -56, -105, -89, + -14, -15, -17, -18, -105, -22, -37, -87, -88, -89, + -85, -105, -30, -33, -35, -31, -34, -28, -38, -26, + -103, -76, -32, -75, -24, -105, -89, -105, -90, -41, + -105, -105, -105, -105, -105, -36, -105, -105, -97, -105, + -105, -105, -103, -105, -86, 173, -105, -27, -105, -105, + -104, -37, -105, -93, -96, -105, -105, -100, -105, -101, + -102, -73, -71, -105, -74, -65, -66, -105, -72, -105, + -59, -105, -63, -105, -105, -105, -98, -16, -13, -105, + -105, -40, -25, -19, -20, -39, -103, -92, -105, -105, + -91, -105, -80, -42, -105, -68, -105, -57, -105, -105, + -60, -58, -53, -105, -82, -21, -105, -84, -23, -94, + -95, -79, -70, -105, -67, -105, -64, -81, -83, -69, + -105, -62, -61 ] racc_goto_table = [ - 24, 2, 26, 35, 105, 96, 68, 113, 76, 132, - 117, 53, 56, 110, 78, 119, 112, 63, 61, 54, - 38, 60, 71, 72, 35, 124, 62, 84, 120, 143, - 88, 89, 100, 75, 95, 52, 67, 126, 99, 35, - 1, 38, 142, nil, 90, nil, nil, nil, 110, 147, - 56, nil, nil, 102, 119, nil, 38, 92, nil, nil, - 57, nil, nil, nil, nil, 64, 101, nil, nil, 160, - 155, 109, 35, 109, 56, 108, 71, 108, 71, 133, - 163, 121, nil, 56, nil, 35, 63, 61, 166, 38, - 60, 71, 129, 156, 110, 62, nil, 35, 57, 43, - nil, nil, 38, nil, 138, nil, 109, nil, nil, nil, - 108, 71, 109, 70, 38, nil, 108, 71, 69, 111, - 43, 111, 57, 150, nil, nil, 153, 101, 35, nil, - nil, 57, nil, 35, 64, 43, 24, 36, 109, nil, - nil, nil, 108, 71, nil, 38, nil, nil, 24, nil, - 38, 24, 109, nil, 111, nil, 108, 71, 77, nil, - 111, nil, nil, 167, nil, 24, nil, 115, 43, 115, - nil, nil, 69, 83, 69, nil, nil, nil, nil, nil, - nil, 43, 70, nil, nil, nil, 111, 69, nil, nil, - nil, nil, nil, 43, nil, nil, nil, nil, nil, nil, - 111, nil, 115, nil, nil, nil, 116, 69, 115, nil, - nil, nil, nil, 69, nil, nil, nil, nil, nil, 128, - nil, nil, nil, nil, 43, nil, nil, nil, nil, 43, - nil, 140, nil, nil, 115, nil, nil, nil, nil, 69, - nil, nil, nil, nil, nil, nil, nil, nil, 115, nil, - nil, nil, nil, 69, nil, nil, nil, nil, nil, nil, - nil, nil, 157, nil, nil, nil, nil, 159 ] + 25, 1, 27, 63, 74, 50, 116, 78, 103, 120, + 86, 37, 60, 135, 80, 45, 52, 70, 115, 64, + 93, 123, 62, 73, 146, 108, 65, 113, 77, 122, + 72, 98, 59, 37, 69, 127, 99, 45, 102, 24, + nil, nil, 145, 90, nil, nil, nil, 92, 37, 150, + 94, nil, 45, 105, 52, nil, nil, nil, 129, nil, + nil, nil, nil, 113, nil, nil, nil, nil, nil, 122, + 159, nil, nil, 124, 63, 132, 104, 111, 73, 111, + 73, 112, 37, 112, 52, 118, 45, 118, 169, 52, + 64, 163, 136, 62, 73, 166, 37, 65, nil, nil, + 45, 72, 158, nil, nil, nil, nil, 141, 37, 113, + nil, nil, 45, 111, 73, nil, 71, 112, 53, 111, + 73, 118, nil, 112, nil, nil, 153, 118, 66, nil, + nil, 156, nil, nil, nil, 36, nil, nil, 104, 37, + 25, nil, 55, 45, 37, 111, 73, nil, 45, 112, + nil, nil, 25, 118, nil, 25, 53, 36, 38, 111, + 73, nil, nil, 112, nil, nil, 170, 118, nil, 25, + nil, 71, 36, 71, nil, nil, nil, nil, nil, nil, + 79, nil, nil, 114, nil, 114, 53, 71, nil, nil, + nil, 53, nil, nil, nil, 85, nil, nil, nil, 66, + nil, nil, nil, nil, nil, nil, 36, 71, nil, nil, + nil, nil, nil, 71, nil, nil, nil, nil, nil, 114, + 36, nil, nil, nil, nil, 114, nil, nil, nil, 119, + nil, nil, 36, nil, nil, nil, nil, nil, nil, 71, + nil, nil, nil, 131, nil, nil, nil, nil, nil, nil, + nil, 114, nil, 71, nil, 143, nil, nil, nil, nil, + nil, nil, nil, 36, nil, 114, nil, nil, 36, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 160, nil, nil, nil, + nil, 162 ] racc_goto_check = [ - 3, 2, 23, 14, 29, 19, 18, 38, 44, 27, - 34, 43, 14, 36, 28, 36, 37, 14, 24, 12, - 4, 23, 32, 21, 14, 19, 25, 41, 33, 39, - 18, 41, 46, 40, 17, 42, 16, 13, 45, 14, - 1, 4, 38, nil, 43, nil, nil, nil, 36, 34, - 14, nil, nil, 44, 36, nil, 4, 12, nil, nil, - 15, nil, nil, nil, nil, 15, 14, nil, nil, 29, - 19, 14, 14, 14, 14, 23, 32, 23, 32, 18, - 36, 12, nil, 14, nil, 14, 14, 24, 38, 4, - 23, 32, 21, 46, 36, 25, nil, 14, 15, 20, - nil, nil, 4, nil, 2, nil, 14, nil, nil, nil, - 23, 32, 14, 20, 4, nil, 23, 32, 30, 15, - 20, 15, 15, 2, nil, nil, 2, 14, 14, nil, - nil, 15, nil, 14, 15, 20, 3, 26, 14, nil, - nil, nil, 23, 32, nil, 4, nil, nil, 3, nil, - 4, 3, 14, nil, 15, nil, 23, 32, 26, nil, - 15, nil, nil, 2, nil, 3, nil, 20, 20, 20, - nil, nil, 30, 26, 30, nil, nil, nil, nil, nil, - nil, 20, 20, nil, nil, nil, 15, 30, nil, nil, - nil, nil, nil, 20, nil, nil, nil, nil, nil, nil, - 15, nil, 20, nil, nil, nil, 26, 30, 20, nil, - nil, nil, nil, 30, nil, nil, nil, nil, nil, 26, - nil, nil, nil, nil, 20, nil, nil, nil, nil, 20, - nil, 26, nil, nil, 20, nil, nil, nil, nil, 30, - nil, nil, nil, nil, nil, nil, nil, nil, 20, nil, - nil, nil, nil, 30, nil, nil, nil, nil, nil, nil, - nil, nil, 26, nil, nil, nil, nil, 26 ] + 3, 2, 24, 25, 22, 13, 39, 45, 47, 35, + 42, 15, 44, 28, 29, 21, 15, 19, 38, 26, + 42, 34, 24, 33, 40, 30, 15, 37, 41, 37, + 21, 18, 43, 15, 17, 14, 20, 21, 46, 1, + nil, nil, 39, 13, nil, nil, nil, 19, 15, 35, + 44, nil, 21, 45, 15, nil, nil, nil, 20, nil, + nil, nil, nil, 37, nil, nil, nil, nil, nil, 37, + 47, nil, nil, 13, 25, 22, 15, 24, 33, 24, + 33, 15, 15, 15, 15, 21, 21, 21, 39, 15, + 26, 30, 19, 24, 33, 37, 15, 15, nil, nil, + 21, 21, 20, nil, nil, nil, nil, 2, 15, 37, + nil, nil, 21, 24, 33, nil, 31, 15, 16, 24, + 33, 21, nil, 15, nil, nil, 2, 21, 16, nil, + nil, 2, nil, nil, nil, 4, nil, nil, 15, 15, + 3, nil, 4, 21, 15, 24, 33, nil, 21, 15, + nil, nil, 3, 21, nil, 3, 16, 4, 27, 24, + 33, nil, nil, 15, nil, nil, 2, 21, nil, 3, + nil, 31, 4, 31, nil, nil, nil, nil, nil, nil, + 27, nil, nil, 16, nil, 16, 16, 31, nil, nil, + nil, 16, nil, nil, nil, 27, nil, nil, nil, 16, + nil, nil, nil, nil, nil, nil, 4, 31, nil, nil, + nil, nil, nil, 31, nil, nil, nil, nil, nil, 16, + 4, nil, nil, nil, nil, 16, nil, nil, nil, 27, + nil, nil, 4, nil, nil, nil, nil, nil, nil, 31, + nil, nil, nil, 27, nil, nil, nil, nil, nil, nil, + nil, 16, nil, 31, nil, 27, nil, nil, nil, nil, + nil, nil, nil, 4, nil, 16, nil, nil, 4, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 27, nil, nil, nil, + nil, 27 ] racc_goto_pointer = [ - nil, 40, 1, -2, 9, nil, nil, nil, nil, nil, - nil, nil, -1, -54, -8, 40, 11, -33, -19, -63, - 88, -2, nil, -4, -7, 1, 126, -88, -18, -74, - 93, nil, -3, -53, -71, nil, -66, -63, -72, -85, - 4, -21, 16, -8, -21, -36, -42 ] + nil, 39, 1, -1, 124, nil, nil, nil, nil, nil, + nil, nil, nil, -11, -54, 0, 102, 8, -38, -9, + -34, 4, -22, nil, -4, -23, -7, 147, -87, -19, + -55, 90, nil, -3, -62, -74, nil, -54, -63, -75, + -93, -2, -39, 11, -9, -23, -38, -68 ] racc_goto_default = [ - nil, nil, nil, 5, 8, 10, 12, 14, 16, 18, - 21, 22, nil, 55, 4, 37, nil, nil, nil, nil, - 17, nil, 73, 30, 31, 34, nil, 66, nil, nil, - 41, 42, 45, nil, nil, 118, 33, nil, nil, nil, - nil, nil, nil, nil, 86, nil, nil ] + nil, nil, nil, 2, 5, 8, 10, 12, 14, 17, + 20, 22, 23, nil, 51, 4, 39, nil, nil, nil, + nil, 19, nil, 75, 31, 32, 35, nil, 68, nil, + nil, 43, 44, 46, nil, nil, 121, 34, nil, nil, + nil, nil, nil, nil, nil, 88, nil, nil ] racc_token_table = { false => 0, @@ -505,13 +517,12 @@ racc_token_table = { :SEMIC => 37, :CASE => 38, :DEFAULT => 39, - :INCLUDE => 40, - :TAG => 41, - :FUNCTION => 42 } + :FUNCTION => 40, + :AT => 41 } racc_use_result_var = true -racc_nt_base = 43 +racc_nt_base = 42 Racc_arg = [ racc_action_table, @@ -570,14 +581,14 @@ Racc_token_to_s_table = [ 'SEMIC', 'CASE', 'DEFAULT', -'INCLUDE', -'TAG', 'FUNCTION', +'AT', '$start', 'program', 'statements', 'statement', 'object', +'collectable', 'assignment', 'casestatement', 'import', @@ -675,8 +686,10 @@ module_eval <<'.,.,', 'grammar.ra', 39 # reduce 11 omitted -module_eval <<'.,.,', 'grammar.ra', 60 - def _reduce_12( val, _values, result ) + # reduce 12 omitted + +module_eval <<'.,.,', 'grammar.ra', 61 + def _reduce_13( val, _values, result ) args = aryfy(val[2]) result = AST::Function.new( :line => @lexer.line, @@ -689,8 +702,8 @@ module_eval <<'.,.,', 'grammar.ra', 60 end .,., -module_eval <<'.,.,', 'grammar.ra', 70 - def _reduce_13( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 71 + def _reduce_14( val, _values, result ) args = aryfy(val[1]) result = AST::Function.new( :line => @lexer.line, @@ -703,10 +716,10 @@ module_eval <<'.,.,', 'grammar.ra', 70 end .,., - # reduce 14 omitted + # reduce 15 omitted -module_eval <<'.,.,', 'grammar.ra', 89 - def _reduce_15( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 90 + def _reduce_16( val, _values, result ) result = aryfy(val[0], val[2]) result.line = @lexer.line result.file = @lexer.file @@ -714,12 +727,12 @@ module_eval <<'.,.,', 'grammar.ra', 89 end .,., - # reduce 16 omitted - # reduce 17 omitted -module_eval <<'.,.,', 'grammar.ra', 123 - def _reduce_18( val, _values, result ) + # reduce 18 omitted + +module_eval <<'.,.,', 'grammar.ra', 124 + def _reduce_19( val, _values, result ) if val[0].instance_of?(AST::ASTArray) raise Puppet::ParseError, "Invalid name" end @@ -751,8 +764,8 @@ module_eval <<'.,.,', 'grammar.ra', 123 end .,., -module_eval <<'.,.,', 'grammar.ra', 137 - def _reduce_19( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 138 + def _reduce_20( val, _values, result ) if val[0].instance_of?(AST::ASTArray) Puppet.notice "invalid name" raise Puppet::ParseError, "Invalid name" @@ -770,8 +783,8 @@ module_eval <<'.,.,', 'grammar.ra', 137 end .,., -module_eval <<'.,.,', 'grammar.ra', 149 - def _reduce_20( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 150 + def _reduce_21( val, _values, result ) # a template setting for a type if val[0].instance_of?(AST::ASTArray) raise Puppet::ParseError, "Invalid type" @@ -787,8 +800,28 @@ module_eval <<'.,.,', 'grammar.ra', 149 end .,., -module_eval <<'.,.,', 'grammar.ra', 157 - def _reduce_21( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 169 + def _reduce_22( val, _values, result ) + if val[1].is_a? AST::TypeDefaults + raise Puppet::ParseError, "Defaults are not collectable" + end + + # Just mark our objects as collectable and pass them through. + if val[1].instance_of?(AST::ASTArray) + val[1].each do |obj| + obj.collectable = true + end + else + val[1].collectable = true + end + + result = val[1] + result + end +.,., + +module_eval <<'.,.,', 'grammar.ra', 177 + def _reduce_23( val, _values, result ) result = AST::ObjectInst.new( :line => @lexer.line, :file => @lexer.file, @@ -798,10 +831,10 @@ module_eval <<'.,.,', 'grammar.ra', 157 end .,., - # reduce 22 omitted + # reduce 24 omitted -module_eval <<'.,.,', 'grammar.ra', 171 - def _reduce_23( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 191 + def _reduce_25( val, _values, result ) if val[0].instance_of?(AST::ObjectInst) result = AST::ASTArray.new( :line => @lexer.line, @@ -816,12 +849,12 @@ module_eval <<'.,.,', 'grammar.ra', 171 end .,., - # reduce 24 omitted + # reduce 26 omitted - # reduce 25 omitted + # reduce 27 omitted -module_eval <<'.,.,', 'grammar.ra', 182 - def _reduce_26( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 202 + def _reduce_28( val, _values, result ) result = AST::Name.new( :line => @lexer.line, :file => @lexer.file, @@ -831,8 +864,8 @@ module_eval <<'.,.,', 'grammar.ra', 182 end .,., -module_eval <<'.,.,', 'grammar.ra', 190 - def _reduce_27( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 210 + def _reduce_29( val, _values, result ) result = AST::Type.new( :line => @lexer.line, :file => @lexer.file, @@ -842,10 +875,6 @@ module_eval <<'.,.,', 'grammar.ra', 190 end .,., - # reduce 28 omitted - - # reduce 29 omitted - # reduce 30 omitted # reduce 31 omitted @@ -854,8 +883,12 @@ module_eval <<'.,.,', 'grammar.ra', 190 # reduce 33 omitted -module_eval <<'.,.,', 'grammar.ra', 213 - def _reduce_34( val, _values, result ) + # reduce 34 omitted + + # reduce 35 omitted + +module_eval <<'.,.,', 'grammar.ra', 233 + def _reduce_36( val, _values, result ) # this is distinct from referencing a variable variable = AST::Name.new( :line => @lexer.line, @@ -873,8 +906,8 @@ module_eval <<'.,.,', 'grammar.ra', 213 end .,., -module_eval <<'.,.,', 'grammar.ra', 222 - def _reduce_35( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 242 + def _reduce_37( val, _values, result ) result = AST::ASTArray.new( :line => @lexer.line, :file => @lexer.file, @@ -884,15 +917,15 @@ module_eval <<'.,.,', 'grammar.ra', 222 end .,., -module_eval <<'.,.,', 'grammar.ra', 222 - def _reduce_36( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 242 + def _reduce_38( val, _values, result ) result = val[0] result end .,., -module_eval <<'.,.,', 'grammar.ra', 235 - def _reduce_37( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 255 + def _reduce_39( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) result = val[0] @@ -907,8 +940,8 @@ module_eval <<'.,.,', 'grammar.ra', 235 end .,., -module_eval <<'.,.,', 'grammar.ra', 250 - def _reduce_38( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 270 + def _reduce_40( val, _values, result ) leaf = AST::String.new( :line => @lexer.line, :file => @lexer.file, @@ -925,10 +958,10 @@ module_eval <<'.,.,', 'grammar.ra', 250 end .,., - # reduce 39 omitted + # reduce 41 omitted -module_eval <<'.,.,', 'grammar.ra', 263 - def _reduce_40( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 283 + def _reduce_42( val, _values, result ) if val[0].instance_of?(AST::ASTArray) result = val[0].push(val[2]) else @@ -942,10 +975,6 @@ module_eval <<'.,.,', 'grammar.ra', 263 end .,., - # reduce 41 omitted - - # reduce 42 omitted - # reduce 43 omitted # reduce 44 omitted @@ -962,8 +991,12 @@ module_eval <<'.,.,', 'grammar.ra', 263 # reduce 50 omitted -module_eval <<'.,.,', 'grammar.ra', 286 - def _reduce_51( val, _values, result ) + # reduce 51 omitted + + # reduce 52 omitted + +module_eval <<'.,.,', 'grammar.ra', 306 + def _reduce_53( val, _values, result ) args = aryfy(val[2]) result = AST::Function.new( :line => @lexer.line, @@ -976,8 +1009,8 @@ module_eval <<'.,.,', 'grammar.ra', 286 end .,., -module_eval <<'.,.,', 'grammar.ra', 294 - def _reduce_52( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 314 + def _reduce_54( val, _values, result ) result = AST::String.new( :line => @lexer.line, :file => @lexer.file, @@ -987,8 +1020,8 @@ module_eval <<'.,.,', 'grammar.ra', 294 end .,., -module_eval <<'.,.,', 'grammar.ra', 300 - def _reduce_53( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 320 + def _reduce_55( val, _values, result ) result = AST::FlatString.new( :line => @lexer.line, :file => @lexer.file, @@ -998,8 +1031,8 @@ module_eval <<'.,.,', 'grammar.ra', 300 end .,., -module_eval <<'.,.,', 'grammar.ra', 308 - def _reduce_54( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 328 + def _reduce_56( val, _values, result ) result = AST::Boolean.new( :line => @lexer.line, :file => @lexer.file, @@ -1009,8 +1042,8 @@ module_eval <<'.,.,', 'grammar.ra', 308 end .,., -module_eval <<'.,.,', 'grammar.ra', 318 - def _reduce_55( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 338 + def _reduce_57( val, _values, result ) result = AST::ObjectRef.new( :pin => '[]', :line => @lexer.line, @@ -1022,8 +1055,8 @@ module_eval <<'.,.,', 'grammar.ra', 318 end .,., -module_eval <<'.,.,', 'grammar.ra', 335 - def _reduce_56( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 355 + def _reduce_58( val, _values, result ) options = val[3] unless options.instance_of?(AST::ASTArray) options = AST::ASTArray.new( @@ -1042,10 +1075,10 @@ module_eval <<'.,.,', 'grammar.ra', 335 end .,., - # reduce 57 omitted + # reduce 59 omitted -module_eval <<'.,.,', 'grammar.ra', 349 - def _reduce_58( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 369 + def _reduce_60( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push val[1] result = val[0] @@ -1060,8 +1093,8 @@ module_eval <<'.,.,', 'grammar.ra', 349 end .,., -module_eval <<'.,.,', 'grammar.ra', 359 - def _reduce_59( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 379 + def _reduce_61( val, _values, result ) result = AST::CaseOpt.new( :pin => ":", :value => val[0], @@ -1073,8 +1106,8 @@ module_eval <<'.,.,', 'grammar.ra', 359 end .,., -module_eval <<'.,.,', 'grammar.ra', 371 - def _reduce_60( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 391 + def _reduce_62( val, _values, result ) result = AST::CaseOpt.new( :pin => ":", :value => val[0], @@ -1090,10 +1123,10 @@ module_eval <<'.,.,', 'grammar.ra', 371 end .,., - # reduce 61 omitted + # reduce 63 omitted -module_eval <<'.,.,', 'grammar.ra', 385 - def _reduce_62( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 405 + def _reduce_64( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) result = val[0] @@ -1108,8 +1141,8 @@ module_eval <<'.,.,', 'grammar.ra', 385 end .,., -module_eval <<'.,.,', 'grammar.ra', 395 - def _reduce_63( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 415 + def _reduce_65( val, _values, result ) result = AST::Selector.new( :pin => "?", :line => @lexer.line, @@ -1121,19 +1154,19 @@ module_eval <<'.,.,', 'grammar.ra', 395 end .,., - # reduce 64 omitted + # reduce 66 omitted -module_eval <<'.,.,', 'grammar.ra', 397 - def _reduce_65( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 417 + def _reduce_67( val, _values, result ) result = val[1] result end .,., - # reduce 66 omitted + # reduce 68 omitted -module_eval <<'.,.,', 'grammar.ra', 412 - def _reduce_67( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 432 + def _reduce_69( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) result = val[0] @@ -1148,8 +1181,8 @@ module_eval <<'.,.,', 'grammar.ra', 412 end .,., -module_eval <<'.,.,', 'grammar.ra', 422 - def _reduce_68( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 442 + def _reduce_70( val, _values, result ) result = AST::ObjectParam.new( :pin => "=>", :line => @lexer.line, @@ -1161,10 +1194,6 @@ module_eval <<'.,.,', 'grammar.ra', 422 end .,., - # reduce 69 omitted - - # reduce 70 omitted - # reduce 71 omitted # reduce 72 omitted @@ -1173,8 +1202,12 @@ module_eval <<'.,.,', 'grammar.ra', 422 # reduce 74 omitted -module_eval <<'.,.,', 'grammar.ra', 436 - def _reduce_75( val, _values, result ) + # reduce 75 omitted + + # reduce 76 omitted + +module_eval <<'.,.,', 'grammar.ra', 456 + def _reduce_77( val, _values, result ) result = AST::Default.new( :line => @lexer.line, :file => @lexer.file, @@ -1184,8 +1217,8 @@ module_eval <<'.,.,', 'grammar.ra', 436 end .,., -module_eval <<'.,.,', 'grammar.ra', 498 - def _reduce_76( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 518 + def _reduce_78( val, _values, result ) # importing files # yuk, i hate keywords # we'll probably have to have some kind of search path eventually @@ -1249,8 +1282,8 @@ module_eval <<'.,.,', 'grammar.ra', 498 end .,., -module_eval <<'.,.,', 'grammar.ra', 509 - def _reduce_77( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 529 + def _reduce_79( val, _values, result ) result = AST::CompDef.new( :type => AST::Name.new(:value => val[1], :line => @lexer.line), :args => val[2], @@ -1263,8 +1296,8 @@ module_eval <<'.,.,', 'grammar.ra', 509 end .,., -module_eval <<'.,.,', 'grammar.ra', 522 - def _reduce_78( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 542 + def _reduce_80( val, _values, result ) result = AST::CompDef.new( :type => AST::Name.new(:value => val[1], :line => @lexer.line), :args => val[2], @@ -1281,8 +1314,8 @@ module_eval <<'.,.,', 'grammar.ra', 522 end .,., -module_eval <<'.,.,', 'grammar.ra', 539 - def _reduce_79( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 559 + def _reduce_81( val, _values, result ) #:args => val[2], args = { :type => AST::Name.new(:value => val[1], :line => @lexer.line), @@ -1300,8 +1333,8 @@ module_eval <<'.,.,', 'grammar.ra', 539 end .,., -module_eval <<'.,.,', 'grammar.ra', 556 - def _reduce_80( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 576 + def _reduce_82( val, _values, result ) args = { :type => AST::Name.new(:value => val[1], :line => @lexer.line), :file => @lexer.file, @@ -1322,8 +1355,8 @@ module_eval <<'.,.,', 'grammar.ra', 556 end .,., -module_eval <<'.,.,', 'grammar.ra', 577 - def _reduce_81( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 597 + def _reduce_83( val, _values, result ) unless val[1].instance_of?(AST::ASTArray) val[1] = AST::ASTArray.new( :line => val[1].line, @@ -1346,8 +1379,8 @@ module_eval <<'.,.,', 'grammar.ra', 577 end .,., -module_eval <<'.,.,', 'grammar.ra', 600 - def _reduce_82( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 620 + def _reduce_84( val, _values, result ) unless val[1].instance_of?(AST::ASTArray) val[1] = AST::ASTArray.new( :line => val[1].line, @@ -1374,10 +1407,10 @@ module_eval <<'.,.,', 'grammar.ra', 600 end .,., - # reduce 83 omitted + # reduce 85 omitted -module_eval <<'.,.,', 'grammar.ra', 614 - def _reduce_84( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 634 + def _reduce_86( val, _values, result ) if val[0].instance_of?(AST::ASTArray) result = val[0] result.push val[1] @@ -1392,8 +1425,8 @@ module_eval <<'.,.,', 'grammar.ra', 614 end .,., -module_eval <<'.,.,', 'grammar.ra', 622 - def _reduce_85( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 642 + def _reduce_87( val, _values, result ) result = AST::HostName.new( :line => @lexer.line, :file => @lexer.file, @@ -1403,8 +1436,8 @@ module_eval <<'.,.,', 'grammar.ra', 622 end .,., -module_eval <<'.,.,', 'grammar.ra', 628 - def _reduce_86( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 648 + def _reduce_88( val, _values, result ) result = AST::HostName.new( :line => @lexer.line, :file => @lexer.file, @@ -1414,8 +1447,8 @@ module_eval <<'.,.,', 'grammar.ra', 628 end .,., -module_eval <<'.,.,', 'grammar.ra', 636 - def _reduce_87( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 656 + def _reduce_89( val, _values, result ) result = AST::ASTArray.new( :line => @lexer.line, :file => @lexer.file, @@ -1425,17 +1458,17 @@ module_eval <<'.,.,', 'grammar.ra', 636 end .,., - # reduce 88 omitted + # reduce 90 omitted -module_eval <<'.,.,', 'grammar.ra', 641 - def _reduce_89( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 661 + def _reduce_91( val, _values, result ) result = val[1] result end .,., -module_eval <<'.,.,', 'grammar.ra', 652 - def _reduce_90( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 672 + def _reduce_92( val, _values, result ) if val[1].instance_of?(AST::ASTArray) result = val[1] else @@ -1449,10 +1482,10 @@ module_eval <<'.,.,', 'grammar.ra', 652 end .,., - # reduce 91 omitted + # reduce 93 omitted -module_eval <<'.,.,', 'grammar.ra', 666 - def _reduce_92( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 686 + def _reduce_94( val, _values, result ) if val[0].instance_of?(AST::ASTArray) val[0].push(val[2]) result = val[0] @@ -1467,8 +1500,8 @@ module_eval <<'.,.,', 'grammar.ra', 666 end .,., -module_eval <<'.,.,', 'grammar.ra', 674 - def _reduce_93( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 694 + def _reduce_95( val, _values, result ) result = AST::CompArgument.new( :line => @lexer.line, :file => @lexer.file, @@ -1478,8 +1511,8 @@ module_eval <<'.,.,', 'grammar.ra', 674 end .,., -module_eval <<'.,.,', 'grammar.ra', 681 - def _reduce_94( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 701 + def _reduce_96( val, _values, result ) result = AST::CompArgument.new( :line => @lexer.line, :file => @lexer.file, @@ -1489,10 +1522,10 @@ module_eval <<'.,.,', 'grammar.ra', 681 end .,., - # reduce 95 omitted + # reduce 97 omitted -module_eval <<'.,.,', 'grammar.ra', 690 - def _reduce_96( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 710 + def _reduce_98( val, _values, result ) result = AST::Name.new( :value => val[1], :file => @lexer.file, @@ -1502,8 +1535,8 @@ module_eval <<'.,.,', 'grammar.ra', 690 end .,., -module_eval <<'.,.,', 'grammar.ra', 699 - def _reduce_97( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 719 + def _reduce_99( val, _values, result ) name = val[0].sub(/^\$/,'') result = AST::Variable.new( :line => @lexer.line, @@ -1514,8 +1547,8 @@ module_eval <<'.,.,', 'grammar.ra', 699 end .,., -module_eval <<'.,.,', 'grammar.ra', 711 - def _reduce_98( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 731 + def _reduce_100( val, _values, result ) if val[1].instance_of?(AST::ASTArray) result = val[1] else @@ -1529,14 +1562,14 @@ module_eval <<'.,.,', 'grammar.ra', 711 end .,., - # reduce 99 omitted + # reduce 101 omitted - # reduce 100 omitted + # reduce 102 omitted - # reduce 101 omitted + # reduce 103 omitted -module_eval <<'.,.,', 'grammar.ra', 716 - def _reduce_102( val, _values, result ) +module_eval <<'.,.,', 'grammar.ra', 736 + def _reduce_104( val, _values, result ) result = nil result end diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb index f7dde32c8..54f0f42ad 100644 --- a/lib/puppet/parser/scope.rb +++ b/lib/puppet/parser/scope.rb @@ -855,6 +855,7 @@ module Puppet::Parser # Builtin types should be passed out as they are, but defined # types need to be evaluated. We have to wait until this # point so that subclass overrides can happen. + # Wait until the last minute to set tags, although this # probably should not matter child.tags = self.tags @@ -870,15 +871,30 @@ module Puppet::Parser # Now that all that is done, check to see what kind of object # it is. if objecttype = lookuptype(child.type) - # It's a defined type, so evaluate it + # It's a defined type, so evaluate it. Retain whether + # the object is collectable. result = objecttype.safeevaluate( :name => child.name, :type => child.type, :arguments => child.to_hash, - :scope => self + :scope => self, + :collectable => child.collectable ) + + # If the child is collectable, then mark all of the + # results as collectable. This is how we retain + # collectability through components and such. + if child.collectable + result.delve do |object| + if object.is_a? Puppet::TransObject + debug "Collecting %s[%s]" % + [object.type, object.name] + object.collectable = true + end + end + end else - # It's a builtin type, so just chunk it on in + # It's a builtin type, so just return it directly result = child end else @@ -940,104 +956,6 @@ module Puppet::Parser end end - # Convert our scope to a list of Transportable objects. - def oldto_trans - results = [] - - # Iterate across our child scopes and call to_trans on them - @children.each { |child| - if child.is_a?(Scope) - cresult = child.to_trans - - # Scopes normally result in a TransBucket, but they could - # also result in a normal array; if that happens, get rid - # of the array. - unless cresult.is_a?(Puppet::TransBucket) - cresult.each { |result| - results.push(result) - } - else - unless cresult.empty? - # Otherwise, just add it to our list of results. - results.push(cresult) - end - end - elsif child.is_a?(Puppet::TransObject) - if child.empty? - next - end - # Wait until the last minute to set tags, although this - # probably should not matter - child.tags = self.tags - - # Add any defaults. - self.adddefaults(child) - - # Then make sure this child's tags are stored in the - # central table. This should maybe be in the evaluate - # methods, but, eh. - @topscope.addtags(child) - results.push(child) - else - raise Puppet::DevError, - "Puppet::Parse::Scope cannot handle objects of type %s" % - child.class - end - } - - # Get rid of any nil objects. - results = results.reject { |child| - child.nil? - } - - # If we have a name and type, then make a TransBucket, which - # becomes a component. - # Else, just stack all of the objects into the current bucket. - if @type - bucket = Puppet::TransBucket.new - - if defined? @name and @name - bucket.name = @name - end - - # it'd be nice not to have to do this... - results.each { |result| - #Puppet.warning "Result type is %s" % result.class - bucket.push(result) - } - if defined? @type - bucket.type = @type - else - raise Puppet::ParseError, - "No type for scope %s" % @name - end - - if defined? @keyword - bucket.keyword = @keyword - end - #Puppet.debug( - # "TransBucket with name %s and type %s in scope %s" % - # [@name,@type,self.object_id] - #) - - # now find metaparams - @symtable.each { |var,value| - if Puppet::Type.metaparam?(var.intern) - #Puppet.debug("Adding metaparam %s" % var) - bucket.param(var,value) - else - #Puppet.debug("%s is not a metaparam" % var) - end - } - #Puppet.debug "Returning bucket %s from scope %s" % - # [bucket.name,self.object_id] - return bucket - else - Puppet.debug "nameless scope; just returning a list" - return results - end - end - protected # This method abstracts recursive searching. It accepts the type diff --git a/lib/puppet/rails.rb b/lib/puppet/rails.rb index e9eeeaed5..2a5b31408 100644 --- a/lib/puppet/rails.rb +++ b/lib/puppet/rails.rb @@ -43,32 +43,34 @@ module Puppet::Rails } ) - def self.setupdb - - end - + # Set up our database connection. It'd be nice to have a "use" system + # that could make callbacks. def self.init - Puppet.config.use(:puppet) - Puppet.config.use(:puppetmaster) + unless defined? @inited and @inited + Puppet.config.use(:puppet) + Puppet.config.use(:puppetmaster) - ActiveRecord::Base.logger = Logger.new(Puppet[:railslog]) - args = {:adapter => Puppet[:dbadapter]} + ActiveRecord::Base.logger = Logger.new(Puppet[:railslog]) + args = {:adapter => Puppet[:dbadapter]} - case Puppet[:dbadapter] - when "sqlite3": - args[:database] = Puppet[:dblocation] - when "mysql": - args[:host] = Puppet[:dbserver] - args[:username] = Puppet[:dbuser] - args[:password] = Puppet[:dbpassword] - args[:database] = Puppet[:dbname] - end + case Puppet[:dbadapter] + when "sqlite3": + args[:database] = Puppet[:dblocation] + when "mysql": + args[:host] = Puppet[:dbserver] + args[:username] = Puppet[:dbuser] + args[:password] = Puppet[:dbpassword] + args[:database] = Puppet[:dbname] + end + + ActiveRecord::Base.establish_connection(args) - ActiveRecord::Base.establish_connection(args) + unless FileTest.exists?(args[:database]) + require 'puppet/rails/database' + Puppet::Rails::Database.up + end - unless FileTest.exists?(args[:database]) - require 'puppet/rails/database' - Puppet::Rails::Database.up + @inited = true end end end diff --git a/lib/puppet/rails/host.rb b/lib/puppet/rails/host.rb index 0cfb3ec44..3736c407d 100644 --- a/lib/puppet/rails/host.rb +++ b/lib/puppet/rails/host.rb @@ -63,7 +63,7 @@ class Puppet::Rails::Host < ActiveRecord::Base tobj.each do |p,v| params[p] = v end args = {:ptype => tobj.type, :name => tobj.name} - [:tags, :file, :line].each do |param| + [:tags, :file, :line, :collectable].each do |param| if val = tobj.send(param) args[param] = val end diff --git a/lib/puppet/rails/rails_object.rb b/lib/puppet/rails/rails_object.rb index 819706957..8aa72451b 100644 --- a/lib/puppet/rails/rails_object.rb +++ b/lib/puppet/rails/rails_object.rb @@ -20,7 +20,9 @@ class Puppet::Rails::RailsObject < ActiveRecord::Base end end - # Convert our object to a trans_object + # Convert our object to a trans_object. Do not retain whether the object + # is collectable, though, since that would cause it to get stripped + # from the configuration. def to_trans obj = Puppet::TransObject.new(name(), ptype()) @@ -29,8 +31,8 @@ class Puppet::Rails::RailsObject < ActiveRecord::Base obj.send(method.to_s + "=", val) end end - params.each do |name, value| - obj[name] = value + rails_parameters.each do |param| + obj[param.name] = param.value end return obj diff --git a/lib/puppet/transportable.rb b/lib/puppet/transportable.rb index 9921aecef..bca2e688c 100644 --- a/lib/puppet/transportable.rb +++ b/lib/puppet/transportable.rb @@ -8,7 +8,7 @@ module Puppet # YAML. class TransObject include Enumerable - attr_accessor :type, :name, :file, :line + attr_accessor :type, :name, :file, :line, :collectable attr_writer :tags @@ -25,8 +25,8 @@ module Puppet def initialize(name,type) @type = type @name = name + @collectable = false @params = {} - #self.class.add(self) @tags = [] end @@ -102,6 +102,32 @@ module Puppet end } + # Remove all collectable objects from our tree, since the client + # should not see them. + def collectstrip! + @children.dup.each do |child| + if child.is_a? self.class + child.collectstrip! + else + if child.collectable + @children.delete(child) + end + end + end + end + + # Recursively yield everything. + def delve(&block) + @children.each do |obj| + block.call(obj) + if obj.is_a? self.class + obj.delve(&block) + else + obj + end + end + end + def each @children.each { |c| yield c } end diff --git a/test/language/interpreter.rb b/test/language/interpreter.rb index 4b1852682..509f004a4 100755 --- a/test/language/interpreter.rb +++ b/test/language/interpreter.rb @@ -12,6 +12,7 @@ require 'puppet' require 'puppet/parser/interpreter' require 'puppet/parser/parser' require 'puppet/client' +require 'puppet/rails' require 'test/unit' require 'puppettest' @@ -101,6 +102,13 @@ class TestInterpreter < Test::Unit::TestCase assert(obj, "Could not find host object") end + if defined? ActiveRecord + def test_collectstorage + end + else + $stderr.puts "Install Rails for configuration storage testing" + end + if Facter["domain"].value == "madstop.com" begin require 'ldap' diff --git a/test/language/lexer.rb b/test/language/lexer.rb index 083342cc7..8b578a3fd 100644 --- a/test/language/lexer.rb +++ b/test/language/lexer.rb @@ -69,7 +69,6 @@ class TestLexer < Test::Unit::TestCase def test_errors strings = %w{ ^ - @ } strings.each { |str| @lexer.string = str @@ -122,6 +121,40 @@ class TestLexer < Test::Unit::TestCase assert_nothing_raised { @lexer.string = bit } + + assert_nothing_raised { + @lexer.fullscan + } + end + + def test_collectlexing + {"@" => :AT, "<|" => :LCOLLECT, "|>" => :RCOLLECT}.each do |string, token| + assert_nothing_raised { + @lexer.string = string + } + + ret = nil + assert_nothing_raised { + ret = @lexer.fullscan + } + + assert_equal([[token, string],[false, false]], ret) + end + end + + def test_collectabletype + string = "@type {" + + assert_nothing_raised { + @lexer.string = string + } + + ret = nil + assert_nothing_raised { + ret = @lexer.fullscan + } + + assert_equal([[:AT, "@"], [:NAME, "type"], [:LBRACE, "{"], [false,false]],ret) end end diff --git a/test/language/parser.rb b/test/language/parser.rb index 81d3c21cf..e1b6598d4 100644 --- a/test/language/parser.rb +++ b/test/language/parser.rb @@ -301,6 +301,40 @@ class TestParser < Test::Unit::TestCase parser.parse } end + + # Verify that collectable objects are marked that way. + def test_collectable + ["@port { ssh: protocols => tcp, number => 22 }", + "@port { ssh: protocols => tcp, number => 22; + smtp: protocols => tcp, number => 25 }"].each do |text| + parser = Puppet::Parser::Parser.new + parser.string = text + + ret = nil + assert_nothing_raised { + ret = parser.parse + } + + assert_instance_of(AST::ASTArray, ret) + + ret.each do |obj| + assert_instance_of(AST::ObjectDef, obj) + assert(obj.collectable, "Object was not marked collectable") + end + end + end + + # Defaults are purely syntactical, so it doesn't make sense to be able to + # collect them. + def test_uncollectabledefaults + string = "@Port { protocols => tcp }" + parser = Puppet::Parser::Parser.new + parser.string = string + + assert_raise(Puppet::ParseError) { + parser.parse + } + end end # $Id$ diff --git a/test/language/rails.rb b/test/language/rails.rb index 144faece2..e85652620 100755 --- a/test/language/rails.rb +++ b/test/language/rails.rb @@ -7,6 +7,7 @@ if __FILE__ == $0 end require 'puppet' +require 'puppet/rails' require 'puppet/parser/interpreter' require 'puppet/parser/parser' require 'puppet/client' @@ -26,13 +27,12 @@ class TestRails < Test::Unit::TestCase if defined? ActiveRecord::Base def test_hostcache # First make some objects - object = Puppet::TransObject.new("/tmp", "file") - object.tags = %w{testing puppet} - object[:mode] = "1777" - object[:owner] = "root" - - bucket = Puppet::TransBucket.new - bucket.push object + bucket = mk_transtree do |object, depth, width| + # and mark some of them collectable + if width % 2 == 1 + object.collectable = true + end + end # Now collect our facts facts = {} @@ -54,15 +54,29 @@ class TestRails < Test::Unit::TestCase assert(host, "Did not create host") - obj = nil + host = nil assert_nothing_raised { - obj = Puppet::Rails::Host.find_by_name(facts["hostname"]) + host = Puppet::Rails::Host.find_by_name(facts["hostname"]) } - assert(obj, "Could not find host object") + assert(host, "Could not find host object") + + assert(host.rails_objects, "No objects on host") + + collectable = host.rails_objects.find_all do |obj| obj.collectable end + + assert(collectable.length > 0, "Found no collectable objects") - assert(obj.rails_objects, "No objects on host") + collectable.each do |obj| + trans = nil + assert_nothing_raised { + trans = obj.to_trans + } + # Make sure that the objects do not retain their collectable + # nature. + assert(!trans.collectable, "Object from db was collectable") + end - assert_equal(facts["hostname"], obj.facts["hostname"], + assert_equal(facts["hostname"], host.facts["hostname"], "Did not retrieve facts") end diff --git a/test/language/scope.rb b/test/language/scope.rb index 01e752d39..aeac1f20b 100755 --- a/test/language/scope.rb +++ b/test/language/scope.rb @@ -664,4 +664,59 @@ class TestScope < Test::Unit::TestCase end + + # Verify that we recursively mark as collectable the results of collectable + # components. + def test_collectablecomponents + children = [] + + args = AST::ASTArray.new( + :file => tempfile(), + :line => rand(100), + :children => [nameobj("arg")] + ) + # Create a top-level component + children << compobj("one", :args => args) + + # And a component that calls it + children << compobj("two", :args => args, :code => AST::ASTArray.new( + :children => [ + objectdef("one", "ptest", {"arg" => "parentfoo"}) + ] + )) + + # And then a third component that calls the second + children << compobj("three", :args => args, :code => AST::ASTArray.new( + :children => [ + objectdef("two", "yay", {"arg" => "parentfoo"}) + ] + )) + + # lastly, create an object that calls our third component + obj = objectdef("three", "boo", {"arg" => "parentfoo"}) + + # And mark it as collectable + obj.collectable = true + + children << obj + + top = nil + assert_nothing_raised("Could not create top object") { + top = AST::ASTArray.new( + :children => children + ) + } + + trans = nil + scope = nil + assert_nothing_raised { + scope = Puppet::Parser::Scope.new() + trans = scope.evaluate(:ast => top) + } + + trans.flatten.each do |obj| + assert(obj.collectable, "Object %s[%s] is not collectable" % + [obj.type, obj.name]) + end + end end diff --git a/test/language/transportable.rb b/test/language/transportable.rb index 0e04774a5..0b7ce2560 100755 --- a/test/language/transportable.rb +++ b/test/language/transportable.rb @@ -13,34 +13,10 @@ require 'puppettest' require 'yaml' class TestTransportable < Test::Unit::TestCase - include TestPuppet - - def mkobj(file = "/etc/passwd") - obj = nil - assert_nothing_raised { - obj = Puppet::TransObject.new("file", file) - obj["owner"] = "root" - obj["mode"] = "644" - } - - return obj - end - - def mkbucket(*objects) - bucket = nil - assert_nothing_raised { - bucket = Puppet::TransBucket.new - bucket.name = "yayname" - bucket.type = "yaytype" - } - - objects.each { |o| bucket << o } - - return bucket - end + include ParserTesting def test_yamldumpobject - obj = mkobj + obj = mk_transobject obj.to_yaml_properties str = nil assert_nothing_raised { @@ -58,9 +34,9 @@ class TestTransportable < Test::Unit::TestCase def test_yamldumpbucket objects = %w{/etc/passwd /etc /tmp /var /dev}.collect { |d| - mkobj(d) + mk_transobject(d) } - bucket = mkbucket(*objects) + bucket = mk_transbucket(*objects) str = nil assert_nothing_raised { str = YAML.dump(bucket) @@ -74,4 +50,60 @@ class TestTransportable < Test::Unit::TestCase assert(newobj.name, "Bucket has no name") assert(newobj.type, "Bucket has no type") end + + # Verify that we correctly strip out collectable objects, since they should + # not be sent to the client. + def test_collectstrip + top = mk_transtree do |object, depth, width| + if width % 2 == 1 + object.collectable = true + end + end + + assert(top.flatten.find_all { |o| o.collectable }.length > 0, + "Could not find any collectable objects") + + # Now strip out the collectable objects + top.collectstrip! + + # And make sure they're actually gone + assert_equal(0, top.flatten.find_all { |o| o.collectable }.length, + "Still found collectable objects") + end + + # Make sure our 'delve' command is working + def test_delve + top = mk_transtree do |object, depth, width| + if width % 2 == 1 + object.collectable = true + end + end + + objects = [] + buckets = [] + collectable = [] + + count = 0 + assert_nothing_raised { + top.delve do |object| + count += 1 + if object.is_a? Puppet::TransBucket + buckets << object + else + objects << object + if object.collectable + collectable << object + end + end + end + } + + top.flatten.each do |obj| + assert(objects.include?(obj), "Missing obj %s[%s]" % [obj.type, obj.name]) + end + + assert_equal(collectable.length, + top.flatten.find_all { |o| o.collectable }.length, + "Found incorrect number of collectable objects") + end end diff --git a/test/puppettest.rb b/test/puppettest.rb index f9014245a..53e747fd1 100644 --- a/test/puppettest.rb +++ b/test/puppettest.rb @@ -980,6 +980,67 @@ module ParserTesting assert_apply(comp) end + + def mk_transobject(file = "/etc/passwd") + obj = nil + assert_nothing_raised { + obj = Puppet::TransObject.new("file", file) + obj["owner"] = "root" + obj["mode"] = "644" + } + + return obj + end + + def mk_transbucket(*objects) + bucket = nil + assert_nothing_raised { + bucket = Puppet::TransBucket.new + bucket.name = "yayname" + bucket.type = "yaytype" + } + + objects.each { |o| bucket << o } + + return bucket + end + + # Make a tree of objects, yielding if desired + def mk_transtree(depth = 4, width = 2) + top = nil + assert_nothing_raised { + top = Puppet::TransBucket.new + top.name = "top" + top.type = "bucket" + } + + bucket = top + + file = tempfile() + depth.times do |i| + objects = [] + width.times do |j| + path = tempfile + i.to_s + obj = Puppet::TransObject.new("file", file) + obj["owner"] = "root" + obj["mode"] = "644" + + # Yield, if they want + if block_given? + yield(obj, i, j) + end + + objects << obj + end + + newbucket = mk_transbucket(*objects) + + bucket.push newbucket + bucket = newbucket + end + + return top + end end class PuppetTestSuite |