puppet 0.22.4 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (266) hide show
  1. data/CHANGELOG +156 -0
  2. data/README +2 -2
  3. data/Rakefile +6 -6
  4. data/bin/filebucket +212 -0
  5. data/bin/puppet +2 -0
  6. data/bin/puppetca +2 -4
  7. data/bin/puppetd +16 -15
  8. data/bin/puppetdoc +46 -496
  9. data/bin/puppetmasterd +3 -5
  10. data/bin/puppetrun +8 -3
  11. data/bin/ralsh +271 -0
  12. data/conf/redhat/client.init +1 -1
  13. data/conf/redhat/puppet.spec +13 -2
  14. data/conf/solaris/pkginfo +1 -1
  15. data/ext/puppet-test +374 -0
  16. data/install.rb +40 -31
  17. data/lib/puppet.rb +39 -4
  18. data/lib/puppet/config_stores/rest.rb +60 -0
  19. data/lib/puppet/configuration.rb +312 -17
  20. data/lib/puppet/external/event-loop/event-loop.rb +4 -0
  21. data/lib/puppet/external/gratr/rdot.rb +1 -1
  22. data/lib/puppet/fact_stores/yaml.rb +42 -0
  23. data/lib/puppet/feature/base.rb +4 -1
  24. data/lib/puppet/metatype/attributes.rb +20 -43
  25. data/lib/puppet/metatype/container.rb +1 -36
  26. data/lib/puppet/metatype/evaluation.rb +48 -19
  27. data/lib/puppet/metatype/instances.rb +35 -1
  28. data/lib/puppet/metatype/metaparams.rb +23 -19
  29. data/lib/puppet/metatype/providers.rb +25 -38
  30. data/lib/puppet/network/client/ca.rb +8 -5
  31. data/lib/puppet/network/client/master.rb +59 -17
  32. data/lib/puppet/network/handler.rb +18 -1
  33. data/lib/puppet/network/handler/ca.rb +9 -3
  34. data/lib/puppet/network/handler/facts.rb +70 -0
  35. data/lib/puppet/network/handler/filebucket.rb +4 -1
  36. data/lib/puppet/network/handler/fileserver.rb +65 -21
  37. data/lib/puppet/network/handler/master.rb +6 -3
  38. data/lib/puppet/network/handler/report.rb +12 -26
  39. data/lib/puppet/network/handler/resource.rb +14 -2
  40. data/lib/puppet/network/handler/runner.rb +5 -1
  41. data/lib/puppet/network/handler/status.rb +5 -1
  42. data/lib/puppet/network/server/mongrel.rb +4 -4
  43. data/lib/puppet/network/server/webrick.rb +14 -3
  44. data/lib/puppet/parameter.rb +30 -25
  45. data/lib/puppet/parser/ast.rb +1 -6
  46. data/lib/puppet/parser/ast/component.rb +23 -20
  47. data/lib/puppet/parser/ast/hostclass.rb +7 -11
  48. data/lib/puppet/parser/ast/leaf.rb +4 -1
  49. data/lib/puppet/parser/ast/node.rb +6 -8
  50. data/lib/puppet/parser/functions.rb +7 -4
  51. data/lib/puppet/parser/interpreter.rb +155 -205
  52. data/lib/puppet/parser/lexer.rb +35 -2
  53. data/lib/puppet/parser/parser.rb +705 -612
  54. data/lib/puppet/parser/resource.rb +91 -48
  55. data/lib/puppet/parser/resource/param.rb +52 -29
  56. data/lib/puppet/parser/scope.rb +28 -23
  57. data/lib/puppet/pgraph.rb +26 -21
  58. data/lib/puppet/propertychange.rb +12 -12
  59. data/lib/puppet/provider.rb +102 -31
  60. data/lib/puppet/provider/cron/crontab.rb +7 -8
  61. data/lib/puppet/provider/group/groupadd.rb +4 -4
  62. data/lib/puppet/provider/group/pw.rb +3 -3
  63. data/lib/puppet/provider/mount.rb +8 -8
  64. data/lib/puppet/provider/mount/netinfo.rb +5 -5
  65. data/lib/puppet/provider/mount/parsed.rb +2 -2
  66. data/lib/puppet/provider/nameservice.rb +19 -31
  67. data/lib/puppet/provider/nameservice/netinfo.rb +14 -14
  68. data/lib/puppet/provider/nameservice/objectadd.rb +4 -4
  69. data/lib/puppet/provider/nameservice/pw.rb +4 -4
  70. data/lib/puppet/provider/package.rb +31 -0
  71. data/lib/puppet/provider/package/appdmg.rb +118 -0
  72. data/lib/puppet/provider/package/apple.rb +18 -16
  73. data/lib/puppet/provider/package/apt.rb +13 -15
  74. data/lib/puppet/provider/package/aptitude.rb +5 -3
  75. data/lib/puppet/provider/package/aptrpm.rb +9 -11
  76. data/lib/puppet/provider/package/blastwave.rb +9 -9
  77. data/lib/puppet/provider/package/darwinport.rb +12 -11
  78. data/lib/puppet/provider/package/dpkg.rb +20 -12
  79. data/lib/puppet/provider/package/fink.rb +87 -0
  80. data/lib/puppet/provider/package/freebsd.rb +10 -11
  81. data/lib/puppet/provider/package/gem.rb +15 -15
  82. data/lib/puppet/provider/package/openbsd.rb +12 -17
  83. data/lib/puppet/provider/package/pkgdmg.rb +90 -16
  84. data/lib/puppet/provider/package/portage.rb +20 -14
  85. data/lib/puppet/provider/package/ports.rb +15 -13
  86. data/lib/puppet/provider/package/rpm.rb +20 -23
  87. data/lib/puppet/provider/package/rug.rb +6 -8
  88. data/lib/puppet/provider/package/sun.rb +20 -18
  89. data/lib/puppet/provider/package/sunfreeware.rb +2 -2
  90. data/lib/puppet/provider/package/up2date.rb +6 -10
  91. data/lib/puppet/provider/package/urpmi.rb +51 -0
  92. data/lib/puppet/provider/package/yum.rb +15 -13
  93. data/lib/puppet/provider/parsedfile.rb +53 -63
  94. data/lib/puppet/provider/service/base.rb +13 -15
  95. data/lib/puppet/provider/service/debian.rb +4 -4
  96. data/lib/puppet/provider/service/gentoo.rb +4 -4
  97. data/lib/puppet/provider/service/init.rb +22 -15
  98. data/lib/puppet/provider/service/redhat.rb +6 -6
  99. data/lib/puppet/provider/service/smf.rb +6 -6
  100. data/lib/puppet/provider/user/netinfo.rb +5 -5
  101. data/lib/puppet/provider/user/pw.rb +10 -5
  102. data/lib/puppet/provider/user/useradd.rb +9 -14
  103. data/lib/puppet/provider/zone/solaris.rb +80 -45
  104. data/lib/puppet/rails.rb +3 -34
  105. data/lib/puppet/rails/database/schema.rb +45 -24
  106. data/lib/puppet/rails/fact_value.rb +1 -0
  107. data/lib/puppet/rails/host.rb +69 -40
  108. data/lib/puppet/rails/param_name.rb +3 -8
  109. data/lib/puppet/rails/param_value.rb +2 -1
  110. data/lib/puppet/rails/puppet_class.rb +0 -2
  111. data/lib/puppet/rails/puppet_tag.rb +5 -0
  112. data/lib/puppet/rails/resource.rb +41 -17
  113. data/lib/puppet/rails/resource_tag.rb +4 -0
  114. data/lib/puppet/reference/configuration.rb +149 -0
  115. data/lib/puppet/reference/function.rb +13 -0
  116. data/lib/puppet/reference/network.rb +37 -0
  117. data/lib/puppet/reference/providers.rb +118 -0
  118. data/lib/puppet/reference/report.rb +21 -0
  119. data/lib/puppet/reference/type.rb +152 -0
  120. data/lib/puppet/reports/rrdgraph.rb +21 -7
  121. data/lib/puppet/reports/tagmail.rb +4 -1
  122. data/lib/puppet/sslcertificates.rb +1 -49
  123. data/lib/puppet/sslcertificates/ca.rb +2 -79
  124. data/lib/puppet/sslcertificates/inventory.rb +0 -10
  125. data/lib/puppet/transaction.rb +24 -41
  126. data/lib/puppet/transaction/report.rb +27 -1
  127. data/lib/puppet/type.rb +7 -43
  128. data/lib/puppet/type/component.rb +198 -124
  129. data/lib/puppet/type/cron.rb +51 -42
  130. data/lib/puppet/type/exec.rb +20 -19
  131. data/lib/puppet/type/group.rb +6 -55
  132. data/lib/puppet/type/host.rb +16 -37
  133. data/lib/puppet/type/mount.rb +30 -17
  134. data/lib/puppet/type/notify.rb +7 -8
  135. data/lib/puppet/type/package.rb +44 -80
  136. data/lib/puppet/type/pfile.rb +50 -41
  137. data/lib/puppet/type/pfile/checksum.rb +82 -95
  138. data/lib/puppet/type/pfile/content.rb +21 -25
  139. data/lib/puppet/type/pfile/ensure.rb +32 -30
  140. data/lib/puppet/type/pfile/group.rb +21 -26
  141. data/lib/puppet/type/pfile/mode.rb +25 -32
  142. data/lib/puppet/type/pfile/owner.rb +23 -27
  143. data/lib/puppet/type/pfile/source.rb +42 -33
  144. data/lib/puppet/type/pfile/target.rb +20 -18
  145. data/lib/puppet/type/pfile/type.rb +6 -7
  146. data/lib/puppet/type/pfilebucket.rb +3 -3
  147. data/lib/puppet/type/port.rb +5 -7
  148. data/lib/puppet/type/property.rb +58 -61
  149. data/lib/puppet/type/resources.rb +12 -8
  150. data/lib/puppet/type/schedule.rb +8 -8
  151. data/lib/puppet/type/service.rb +26 -33
  152. data/lib/puppet/type/sshkey.rb +6 -7
  153. data/lib/puppet/type/tidy.rb +41 -35
  154. data/lib/puppet/type/user.rb +34 -67
  155. data/lib/puppet/type/yumrepo.rb +27 -12
  156. data/lib/puppet/type/zone.rb +71 -110
  157. data/lib/puppet/util.rb +46 -61
  158. data/lib/puppet/util/autoload.rb +59 -47
  159. data/lib/puppet/util/config.rb +160 -18
  160. data/lib/puppet/util/config_store.rb +61 -0
  161. data/lib/puppet/util/fact_store.rb +60 -0
  162. data/lib/puppet/util/instance_loader.rb +74 -0
  163. data/lib/puppet/util/loadedfile.rb +5 -8
  164. data/lib/puppet/util/metric.rb +17 -25
  165. data/lib/puppet/util/posix.rb +39 -7
  166. data/lib/puppet/util/provider_features.rb +9 -1
  167. data/lib/puppet/util/rails/collection_merger.rb +16 -1
  168. data/lib/puppet/util/reference.rb +189 -0
  169. data/lib/puppet/util/storage.rb +2 -2
  170. data/lib/puppet/util/subclass_loader.rb +9 -2
  171. data/test/language/ast.rb +4 -148
  172. data/test/language/ast/component.rb +10 -1
  173. data/test/language/collector.rb +1 -191
  174. data/test/language/interpreter.rb +284 -327
  175. data/test/language/lexer.rb +13 -1
  176. data/test/language/node.rb +1 -1
  177. data/test/language/parser.rb +17 -4
  178. data/test/language/resource.rb +67 -101
  179. data/test/language/scope.rb +18 -3
  180. data/test/language/snippets.rb +114 -151
  181. data/test/lib/puppettest.rb +13 -0
  182. data/test/lib/puppettest/exetest.rb +7 -0
  183. data/test/lib/puppettest/fakes.rb +39 -28
  184. data/test/lib/puppettest/railstesting.rb +1 -1
  185. data/test/lib/puppettest/support/assertions.rb +2 -2
  186. data/test/lib/puppettest/support/collection.rb +30 -0
  187. data/test/network/client/ca.rb +27 -1
  188. data/test/network/client/client.rb +3 -3
  189. data/test/network/client/master.rb +102 -1
  190. data/test/network/handler/ca.rb +35 -1
  191. data/test/network/handler/facts.rb +112 -0
  192. data/test/network/handler/fileserver.rb +25 -1
  193. data/test/network/handler/handler.rb +2 -2
  194. data/test/network/handler/master.rb +2 -49
  195. data/test/network/handler/resource.rb +5 -6
  196. data/test/network/server/mongrel_test.rb +65 -0
  197. data/test/network/server/webrick.rb +2 -2
  198. data/test/network/xmlrpc/client.rb +2 -1
  199. data/test/network/xmlrpc/processor.rb +2 -1
  200. data/test/other/pgraph.rb +6 -5
  201. data/test/other/propertychange.rb +11 -12
  202. data/test/other/report.rb +44 -27
  203. data/test/other/transactions.rb +17 -16
  204. data/test/puppet/tc_suidmanager.rb +2 -2
  205. data/test/rails/ast.rb +74 -0
  206. data/test/rails/collection.rb +214 -0
  207. data/test/rails/host.rb +49 -24
  208. data/test/rails/interpreter.rb +91 -0
  209. data/test/rails/railsparameter.rb +22 -11
  210. data/test/rails/railsresource.rb +140 -7
  211. data/test/ral/manager/attributes.rb +37 -13
  212. data/test/ral/manager/instances.rb +82 -0
  213. data/test/ral/manager/provider.rb +60 -22
  214. data/test/ral/manager/type.rb +9 -6
  215. data/test/ral/providers/cron/crontab.rb +59 -7
  216. data/test/ral/providers/group.rb +7 -7
  217. data/test/ral/providers/host/netinfo.rb +5 -6
  218. data/test/ral/providers/host/parsed.rb +4 -4
  219. data/test/ral/providers/mount/parsed.rb +11 -6
  220. data/test/ral/providers/nameservice.rb +2 -2
  221. data/test/ral/providers/package.rb +39 -14
  222. data/test/ral/providers/package/apt.rb +72 -3
  223. data/test/ral/providers/package/aptitude.rb +15 -12
  224. data/test/ral/providers/package/aptrpm.rb +3 -3
  225. data/test/ral/providers/package/dpkg.rb +2 -2
  226. data/test/ral/providers/parsedfile.rb +114 -88
  227. data/test/ral/providers/{parsedport.rb → port/parsed.rb} +1 -1
  228. data/test/ral/providers/provider.rb +93 -13
  229. data/test/ral/providers/service.rb +52 -26
  230. data/test/ral/providers/sshkey/parsed.rb +3 -3
  231. data/test/ral/providers/user.rb +19 -20
  232. data/test/ral/providers/user/useradd.rb +1 -5
  233. data/test/ral/types/cron.rb +49 -36
  234. data/test/ral/types/file.rb +38 -35
  235. data/test/ral/types/file/target.rb +4 -4
  236. data/test/ral/types/filesources.rb +24 -22
  237. data/test/ral/types/group.rb +4 -2
  238. data/test/ral/types/host.rb +17 -10
  239. data/test/ral/types/mount.rb +40 -23
  240. data/test/ral/types/package.rb +62 -5
  241. data/test/ral/types/parameter.rb +2 -2
  242. data/test/ral/types/property.rb +27 -20
  243. data/test/ral/types/resources.rb +4 -16
  244. data/test/ral/types/schedule.rb +2 -2
  245. data/test/ral/types/service.rb +2 -3
  246. data/test/ral/types/sshkey.rb +3 -3
  247. data/test/ral/types/tidy.rb +6 -15
  248. data/test/ral/types/user.rb +17 -17
  249. data/test/ral/types/yumrepo.rb +2 -2
  250. data/test/ral/types/zone.rb +71 -87
  251. data/test/util/autoload.rb +6 -21
  252. data/test/util/config.rb +201 -101
  253. data/test/util/fact_store.rb +67 -0
  254. data/test/util/features.rb +9 -6
  255. data/test/util/instance_loader.rb +53 -0
  256. data/test/util/loadedfile.rb +17 -1
  257. data/test/util/metrics.rb +54 -57
  258. data/test/util/posixtest.rb +8 -11
  259. data/test/util/utiltest.rb +31 -2
  260. metadata +520 -492
  261. data/TODO +0 -4
  262. data/lib/puppet/network/client/logger.rb +0 -6
  263. data/lib/puppet/network/handler/logger.rb +0 -52
  264. data/lib/puppet/rails/database/001_add_indexes.rb +0 -38
  265. data/lib/puppet/type/parsedtype.rb +0 -219
  266. data/test/network/handler/logger.rb +0 -183
@@ -4,35 +4,30 @@ Puppet::Type.type(:zone).provide(:solaris) do
4
4
  commands :adm => "/usr/sbin/zoneadm", :cfg => "/usr/sbin/zonecfg"
5
5
  defaultfor :operatingsystem => :solaris
6
6
 
7
+ mk_resource_methods
8
+
7
9
  # Convert the output of a list into a hash
8
10
  def self.line2hash(line)
9
11
  fields = [:id, :name, :ensure, :path]
10
12
 
11
- hash = {}
13
+ properties = {}
12
14
  line.split(":").each_with_index { |value, index|
13
- hash[fields[index]] = value
15
+ properties[fields[index]] = value
14
16
  }
15
17
 
16
18
  # Configured but not installed zones do not have IDs
17
- if hash[:id] == "-"
18
- hash.delete(:id)
19
+ if properties[:id] == "-"
20
+ properties.delete(:id)
19
21
  end
20
22
 
21
- return hash
23
+ properties[:ensure] = symbolize(properties[:ensure])
24
+
25
+ return properties
22
26
  end
23
27
 
24
- def self.list
28
+ def self.instances
25
29
  adm(:list, "-cp").split("\n").collect do |line|
26
- hash = line2hash(line)
27
-
28
- obj = nil
29
- unless obj = @model[hash[:name]]
30
- obj = @model.create(:name => hash[:name])
31
- end
32
-
33
- obj.setstatus(hash)
34
-
35
- obj
30
+ new(line2hash(line))
36
31
  end
37
32
  end
38
33
 
@@ -41,12 +36,12 @@ Puppet::Type.type(:zone).provide(:solaris) do
41
36
  # If the thing is entirely absent, then we need to create the config.
42
37
  str = %{create -b
43
38
  set zonepath=%s
44
- } % @model[:path]
39
+ } % @resource[:path]
45
40
 
46
41
  # Then perform all of our configuration steps. It's annoying
47
- # that we need this much internal info on the model.
48
- @model.send(:properties).each do |property|
49
- if property.is_a? ZoneConfigProperty and ! property.insync?
42
+ # that we need this much internal info on the resource.
43
+ @resource.send(:properties).each do |property|
44
+ if property.is_a? ZoneConfigProperty and ! property.insync?(properties[property.name])
50
45
  str += property.configtext + "\n"
51
46
  end
52
47
  end
@@ -59,14 +54,39 @@ set zonepath=%s
59
54
  zonecfg :delete, "-F"
60
55
  end
61
56
 
57
+ def exists?
58
+ properties[:ensure] != :absent
59
+ end
60
+
61
+ # Clear out the cached values.
62
+ def flush
63
+ @property_hash.clear
64
+ end
65
+
62
66
  def install
63
67
  zoneadm :install
64
68
  end
65
69
 
70
+ # Look up the current status.
71
+ def properties
72
+ if @property_hash.empty?
73
+ @property_hash = status || {}
74
+ if @property_hash.empty?
75
+ @property_hash[:ensure] = :absent
76
+ else
77
+ @resource.class.validproperties.each do |name|
78
+ @property_hash[name] ||= :absent
79
+ end
80
+ end
81
+
82
+ end
83
+ @property_hash.dup
84
+ end
85
+
66
86
  # We need a way to test whether a zone is in process. Our 'ensure'
67
87
  # property models the static states, but we need to handle the temporary ones.
68
88
  def processing?
69
- if hash = statushash()
89
+ if hash = status()
70
90
  case hash[:ensure]
71
91
  when "incomplete", "ready", "shutting_down"
72
92
  true
@@ -92,7 +112,6 @@ set zonepath=%s
92
112
  current = nil # reset it
93
113
  when /^(\S+):\s*(.+)$/:
94
114
  hash[$1.intern] = $2
95
- #self.is = [$1.intern, $2]
96
115
  when /^\s+(\S+):\s*(.+)$/:
97
116
  if name
98
117
  unless hash.include? name
@@ -111,27 +130,15 @@ set zonepath=%s
111
130
  debug "Ignoring zone output '%s'" % line
112
131
  end
113
132
  end
114
- return hash
115
- end
116
133
 
117
- def retrieve
118
- if hash = statushash()
119
- setstatus(hash)
120
-
121
- # Now retrieve the configuration itself and set appropriately.
122
- getconfig()
123
- else
124
- @properties.each do |name, property|
125
- property.is = :absent
126
- end
127
- end
134
+ return hash
128
135
  end
129
136
 
130
137
  # Execute a configuration string. Can't be private because it's called
131
138
  # by the properties.
132
139
  def setconfig(str)
133
- command = "#{command(:cfg)} -z %s -f -" % @model[:name]
134
- debug "Executing '%s' in zone %s with '%s'" % [command, @model[:name], str]
140
+ command = "#{command(:cfg)} -z %s -f -" % @resource[:name]
141
+ debug "Executing '%s' in zone %s with '%s'" % [command, @resource[:name], str]
135
142
  IO.popen(command, "w") do |pipe|
136
143
  pipe.puts str
137
144
  end
@@ -143,8 +150,8 @@ set zonepath=%s
143
150
 
144
151
  def start
145
152
  # Check the sysidcfg stuff
146
- if cfg = @model[:sysidcfg]
147
- path = File.join(@model[:path], "root", "etc", "sysidcfg")
153
+ if cfg = @resource[:sysidcfg]
154
+ path = File.join(@resource[:path], "root", "etc", "sysidcfg")
148
155
 
149
156
  unless File.exists?(path)
150
157
  begin
@@ -164,14 +171,21 @@ set zonepath=%s
164
171
  end
165
172
 
166
173
  # Return a hash of the current status of this zone.
167
- def statushash
174
+ def status
168
175
  begin
169
- output = adm "-z", @model[:name], :list, "-p"
176
+ output = adm "-z", @resource[:name], :list, "-p"
170
177
  rescue Puppet::ExecutionFailure
171
178
  return nil
172
179
  end
173
180
 
174
- return self.class.line2hash(output.chomp)
181
+ main = self.class.line2hash(output.chomp)
182
+
183
+ # Now add in the configuration information
184
+ config_status.each do |name, value|
185
+ main[name] = value
186
+ end
187
+
188
+ main
175
189
  end
176
190
 
177
191
  def stop
@@ -188,21 +202,42 @@ set zonepath=%s
188
202
 
189
203
  private
190
204
 
205
+ # Turn the results of getconfig into status information.
206
+ def config_status
207
+ config = getconfig()
208
+ result = {}
209
+
210
+ result[:autoboot] = config[:autoboot] ? config[:autoboot].intern : :absent
211
+ result[:pool] = config[:pool]
212
+ result[:shares] = config[:shares]
213
+ if dir = config["inherit-pkg-dir"]
214
+ result[:inherit] = dir.collect { |dirs| dirs[:dir] }
215
+ end
216
+ if net = config["net"]
217
+ result[:ip] = net.collect { |params| "%s:%s" % [params[:physical], params[:address]] }
218
+ end
219
+
220
+ result
221
+ end
222
+
191
223
  def zoneadm(*cmd)
192
224
  begin
193
- adm("-z", @model[:name], *cmd)
225
+ adm("-z", @resource[:name], *cmd)
194
226
  rescue Puppet::ExecutionFailure => detail
195
227
  self.fail "Could not %s zone: %s" % [cmd[0], detail]
196
228
  end
197
229
  end
198
230
 
199
231
  def zonecfg(*cmd)
232
+ # You apparently can't get the configuration of the global zone
233
+ return "" if self.name == "global"
234
+
200
235
  begin
201
- cfg("-z", @model[:name], *cmd)
236
+ cfg("-z", self.name, *cmd)
202
237
  rescue Puppet::ExecutionFailure => detail
203
238
  self.fail "Could not %s zone: %s" % [cmd[0], detail]
204
239
  end
205
240
  end
206
241
  end
207
242
 
208
- # $Id: solaris.rb 2169 2007-02-07 06:47:10Z luke $
243
+ # $Id: solaris.rb 2577 2007-06-14 03:39:23Z luke $
@@ -4,36 +4,12 @@ require 'facter'
4
4
  require 'puppet'
5
5
 
6
6
  module Puppet::Rails
7
- Puppet.config.setdefaults(:puppetmaster,
8
- :dblocation => { :default => "$statedir/clientconfigs.sqlite3",
9
- :mode => 0660,
10
- :owner => "$user",
11
- :group => "$group",
12
- :desc => "The database cache for client configurations. Used for
13
- querying within the language."
14
- },
15
- :dbadapter => [ "sqlite3", "The type of database to use." ],
16
- :dbmigrate => [ false, "Whether to automatically migrate the database." ],
17
- :dbname => [ "puppet", "The name of the database to use." ],
18
- :dbserver => [ "localhost", "The database server for Client caching. Only
19
- used when networked databases are used."],
20
- :dbuser => [ "puppet", "The database user for Client caching. Only
21
- used when networked databases are used."],
22
- :dbpassword => [ "puppet", "The database password for Client caching. Only
23
- used when networked databases are used."],
24
- :railslog => {:default => "$logdir/rails.log",
25
- :mode => 0600,
26
- :owner => "$user",
27
- :group => "$group",
28
- :desc => "Where Rails-specific logs are sent"
29
- }
30
- )
31
7
 
32
8
  def self.connect
33
9
  # This global init does not work for testing, because we remove
34
10
  # the state dir on every test.
35
11
  unless ActiveRecord::Base.connected?
36
- Puppet.config.use(:puppet)
12
+ Puppet.config.use(:main, :rails, :puppetmasterd)
37
13
 
38
14
  ActiveRecord::Base.logger = Logger.new(Puppet[:railslog])
39
15
  ActiveRecord::Base.allow_concurrency = true
@@ -85,13 +61,6 @@ module Puppet::Rails
85
61
  if Puppet[:dbmigrate]
86
62
  migrate()
87
63
  end
88
-
89
- # For now, we have to use :puppet, too, since non-puppetmasterd processes
90
- # (including testing) put the logdir in :puppet, not in :puppetmasterd.
91
- Puppet.config.use(:puppetmaster, :puppet)
92
-
93
- # This has to come after we create the logdir with the :use above.
94
- ActiveRecord::Base.logger = Logger.new(Puppet[:railslog])
95
64
  end
96
65
 
97
66
  # Migrate to the latest db schema.
@@ -127,7 +96,7 @@ module Puppet::Rails
127
96
  raise Puppet::DevError, "No activerecord, cannot init Puppet::Rails"
128
97
  end
129
98
 
130
- Puppet.config.use(:puppetmaster)
99
+ Puppet.config.use(:puppetmasterd, :rails)
131
100
 
132
101
  begin
133
102
  ActiveRecord::Base.establish_connection(database_arguments())
@@ -148,4 +117,4 @@ if Puppet.features.rails?
148
117
  require 'puppet/rails/host'
149
118
  end
150
119
 
151
- # $Id: rails.rb 2342 2007-03-21 22:12:25Z luke $
120
+ # $Id: rails.rb 2609 2007-06-18 18:46:00Z luke $
@@ -7,7 +7,7 @@ class Puppet::Rails::Schema
7
7
  $stdout = File.open("/dev/null", "w")
8
8
  ActiveRecord::Schema.define do
9
9
  create_table :resources do |t|
10
- t.column :title, :string, :null => false
10
+ t.column :title, :text, :null => false
11
11
  t.column :restype, :string, :null => false
12
12
  t.column :host_id, :integer
13
13
  t.column :source_file_id, :integer
@@ -15,19 +15,40 @@ class Puppet::Rails::Schema
15
15
  t.column :line, :integer
16
16
  t.column :updated_at, :datetime
17
17
  end
18
+ add_index :resources, :id, :integer => true
19
+ add_index :resources, :host_id, :integer => true
20
+ add_index :resources, :source_file_id, :integer => true
21
+
22
+ # Thanks, mysql! MySQL requires a length on indexes in text fields.
23
+ # So, we provide them for mysql and handle everything else specially.
24
+ if Puppet[:dbadapter] == "mysql"
25
+ execute "CREATE INDEX typentitle ON resources (restype,title(50));"
26
+ else
27
+ add_index :resources, [:title, :restype]
28
+ end
18
29
 
19
30
  create_table :source_files do |t|
20
31
  t.column :filename, :string
21
32
  t.column :path, :string
22
33
  t.column :updated_at, :datetime
23
34
  end
35
+ add_index :source_files, :id, :integer => true
36
+ add_index :source_files, :filename
37
+
38
+ create_table :resource_tags do |t|
39
+ t.column :resource_id, :integer
40
+ t.column :puppet_tag_id, :integer
41
+ t.column :updated_at, :datetime
42
+ end
43
+ add_index :resource_tags, :id, :integer => true
44
+ add_index :resource_tags, :resource_id, :integer => true
45
+ add_index :resource_tags, :puppet_tag_id, :integer => true
24
46
 
25
- create_table :puppet_classes do |t|
47
+ create_table :puppet_tags do |t|
26
48
  t.column :name, :string
27
- t.column :host_id, :integer
28
- t.column :source_file_id, :integer
29
49
  t.column :updated_at, :datetime
30
50
  end
51
+ add_index :puppet_tags, :id, :integer => true
31
52
 
32
53
  create_table :hosts do |t|
33
54
  t.column :name, :string, :null => false
@@ -39,51 +60,51 @@ class Puppet::Rails::Schema
39
60
  t.column :updated_at, :datetime
40
61
  t.column :source_file_id, :integer
41
62
  end
63
+ add_index :hosts, :id, :integer => true
64
+ add_index :hosts, :source_file_id, :integer => true
65
+ add_index :hosts, :name
42
66
 
43
67
  create_table :fact_names do |t|
44
68
  t.column :name, :string, :null => false
45
- t.column :host_id, :integer, :null => false
46
69
  t.column :updated_at, :datetime
47
70
  end
71
+ add_index :fact_names, :id, :integer => true
72
+ add_index :fact_names, :name
48
73
 
49
74
  create_table :fact_values do |t|
50
75
  t.column :value, :text, :null => false
51
76
  t.column :fact_name_id, :integer, :null => false
77
+ t.column :host_id, :integer, :null => false
52
78
  t.column :updated_at, :datetime
53
79
  end
80
+ add_index :fact_values, :id, :integer => true
81
+ add_index :fact_values, :fact_name_id, :integer => true
82
+ add_index :fact_values, :host_id, :integer => true
54
83
 
55
84
  create_table :param_values do |t|
56
85
  t.column :value, :text, :null => false
57
86
  t.column :param_name_id, :integer, :null => false
87
+ t.column :line, :integer
88
+ t.column :resource_id, :integer
58
89
  t.column :updated_at, :datetime
59
90
  end
91
+ add_index :param_values, :id, :integer => true
92
+ add_index :param_values, :param_name_id, :integer => true
93
+ add_index :param_values, :resource_id, :integer => true
60
94
 
61
95
  create_table :param_names do |t|
62
96
  t.column :name, :string, :null => false
63
- t.column :resource_id, :integer
64
- t.column :line, :integer
65
97
  t.column :updated_at, :datetime
66
98
  end
67
-
68
- create_table :tags do |t|
69
- t.column :name, :string
70
- t.column :updated_at, :datetime
71
- end
72
-
73
- create_table :taggings do |t|
74
- t.column :tag_id, :integer
75
- t.column :taggable_id, :integer
76
- t.column :taggable_type, :string
77
- t.column :updated_at, :datetime
78
- end
79
- end
80
- $stdout.close
81
- $stdout = oldout
82
- oldout = nil
99
+ add_index :param_names, :id, :integer => true
100
+ add_index :param_names, :name
101
+ end
83
102
  end
84
103
  ensure
104
+ $stdout.close
85
105
  $stdout = oldout if oldout
106
+ oldout = nil
86
107
  end
87
108
  end
88
109
 
89
- # $Id: schema.rb 2209 2007-02-17 02:06:46Z shadoi $
110
+ # $Id: schema.rb 2590 2007-06-15 19:30:20Z luke $
@@ -1,5 +1,6 @@
1
1
  class Puppet::Rails::FactValue < ActiveRecord::Base
2
2
  belongs_to :fact_name
3
+ belongs_to :host
3
4
  end
4
5
 
5
6
  # $Id: fact_value.rb 1952 2006-12-19 05:47:57Z luke $
@@ -9,16 +9,14 @@ class Puppet::Rails::Host < ActiveRecord::Base
9
9
  include Puppet::Util
10
10
  include Puppet::Util::CollectionMerger
11
11
 
12
- has_many :fact_values, :through => :fact_names
13
- has_many :fact_names, :dependent => :destroy
12
+ has_many :fact_values, :dependent => :destroy
13
+ has_many :fact_names, :through => :fact_values
14
14
  belongs_to :puppet_classes
15
15
  has_many :source_files
16
16
  has_many :resources,
17
- :include => [ :param_names, :param_values ],
17
+ :include => :param_values,
18
18
  :dependent => :destroy
19
19
 
20
- acts_as_taggable
21
-
22
20
  # If the host already exists, get rid of its objects
23
21
  def self.clean(host)
24
22
  if obj = self.find_by_name(host)
@@ -41,9 +39,7 @@ class Puppet::Rails::Host < ActiveRecord::Base
41
39
  transaction do
42
40
  #unless host = find_by_name(name)
43
41
  seconds = Benchmark.realtime {
44
- #unless host = find_by_name(name, :include => {:resources => {:param_names => :param_values}, :fact_names => :fact_values})
45
- unless host = find_by_name(name, :include => {:fact_names => :fact_values})
46
- #unless host = find_by_name(name)
42
+ unless host = find_by_name(name)
47
43
  host = new(:name => name)
48
44
  end
49
45
  }
@@ -59,7 +55,6 @@ class Puppet::Rails::Host < ActiveRecord::Base
59
55
  raise ArgumentError, "You must pass resources"
60
56
  end
61
57
 
62
-
63
58
  seconds = Benchmark.realtime {
64
59
  host.setresources(hash[:resources])
65
60
  }
@@ -73,54 +68,88 @@ class Puppet::Rails::Host < ActiveRecord::Base
73
68
  return host
74
69
  end
75
70
 
76
- def tags=(tags)
77
- tags.each do |tag|
78
- self.tag_with tag
79
- end
80
- end
81
-
82
71
  # Return the value of a fact.
83
72
  def fact(name)
84
- if fv = self.fact_values.find(:first, :conditions => "fact_names.name = '#{name}'")
85
- return fv.value
73
+ if fv = self.fact_values.find(:all, :include => :fact_name,
74
+ :conditions => "fact_names.name = '#{name}'")
75
+ return fv
86
76
  else
87
77
  return nil
88
78
  end
89
79
  end
80
+
81
+ # returns a hash of fact_names.name => [ fact_values ] for this host.
82
+ def get_facts_hash
83
+ fact_values = self.fact_values.find(:all, :include => :fact_name)
84
+ return fact_values.inject({}) do | hash, value |
85
+ hash[value.fact_name.name] ||= []
86
+ hash[value.fact_name.name] << value
87
+ hash
88
+ end
89
+ end
90
+
90
91
 
91
92
  def setfacts(facts)
92
93
  facts = facts.dup
93
- remove = []
94
-
95
- collection_merge :fact_names, :updates => facts, :modify => Proc.new { |fn, name, value|
96
- fn.fact_values.each do |fv|
97
- unless value == fv.value
98
- fv.value = value
99
- end
100
- break
101
- end
102
- }, :create => Proc.new { |name, value|
103
- fn = fact_names.build(:name => name)
104
- fn.fact_values = [fn.fact_values.build(:value => value)]
105
- }
94
+
95
+ ar_hash_merge(get_facts_hash(), facts,
96
+ :create => Proc.new { |name, values|
97
+ fact_name = Puppet::Rails::FactName.find_or_create_by_name(name)
98
+ values = [values] unless values.is_a?(Array)
99
+ values.each do |value|
100
+ fact_values.build(:value => value,
101
+ :fact_name => fact_name)
102
+ end
103
+ }, :delete => Proc.new { |values|
104
+ values.each { |value| self.fact_values.delete(value) }
105
+ }, :modify => Proc.new { |db, mem|
106
+ mem = [mem].flatten
107
+ fact_name = db[0].fact_name
108
+ db_values = db.collect { |fact_value| fact_value.value }
109
+ (db_values - (db_values & mem)).each do |value|
110
+ db.find_all { |fact_value|
111
+ fact_value.value == value
112
+ }.each { |fact_value|
113
+ fact_values.delete(fact_value)
114
+ }
115
+ end
116
+ (mem - (db_values & mem)).each do |value|
117
+ fact_values.build(:value => value,
118
+ :fact_name => fact_name)
119
+ end
120
+ })
106
121
  end
107
122
 
108
123
  # Set our resources.
109
124
  def setresources(list)
110
- compiled = {}
111
- remove = []
112
125
  existing = nil
113
126
  seconds = Benchmark.realtime {
114
- #existing = resources.find(:all)
115
- existing = resources.find(:all, :include => {:param_names => :param_values})
116
- #existing = resources
127
+
128
+ # Preload the parameters with the resource query, but not the tags, since doing so makes the query take about 10x longer.
129
+ # I've left the other queries in so that it's straightforward to switch between them for testing, if we so desire.
130
+ #existing = resources.find(:all, :include => [{:param_values => :param_name, :resource_tags => :puppet_tag}, :source_file]).inject({}) do | hash, resource |
131
+ #existing = resources.find(:all, :include => [{:resource_tags => :puppet_tag}, :source_file]).inject({}) do | hash, resource |
132
+ existing = resources.find(:all, :include => [{:param_values => :param_name}, :source_file]).inject({}) do | hash, resource |
133
+ hash[resource.ref] = resource
134
+ hash
135
+ end
117
136
  }
137
+
118
138
  Puppet.notice("Searched for resources in %0.2f seconds" % seconds) if defined?(Puppet::TIME_DEBUG)
119
- list.each do |resource|
120
- compiled[resource.ref] = resource
121
- end
122
139
 
123
- collection_merge :resources, :existing => existing, :updates => compiled
140
+ compiled = list.inject({}) do |hash, resource|
141
+ hash[resource.ref] = resource
142
+ hash
143
+ end
144
+
145
+ ar_hash_merge(existing, compiled,
146
+ :create => Proc.new { |ref, resource|
147
+ resource.to_rails(self)
148
+ }, :delete => Proc.new { |resource|
149
+ self.resources.delete(resource)
150
+ }, :modify => Proc.new { |db, mem|
151
+ mem.modify_rails(db)
152
+ })
124
153
  end
125
154
 
126
155
  def update_connect_time
@@ -129,4 +158,4 @@ class Puppet::Rails::Host < ActiveRecord::Base
129
158
  end
130
159
  end
131
160
 
132
- # $Id: host.rb 2350 2007-03-24 21:24:29Z luke $
161
+ # $Id: host.rb 2616 2007-06-18 21:03:18Z luke $