chef 0.9.18 → 0.10.0.beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. data/README.rdoc +0 -3
  2. data/distro/arch/etc/rc.d/chef-server +0 -4
  3. data/distro/arch/etc/rc.d/chef-server-webui +0 -4
  4. data/distro/arch/etc/rc.d/chef-solr +0 -4
  5. data/distro/arch/etc/rc.d/chef-solr-indexer +0 -4
  6. data/lib/chef.rb +3 -3
  7. data/lib/chef/api_client.rb +1 -1
  8. data/lib/chef/application.rb +11 -1
  9. data/lib/chef/application/client.rb +18 -22
  10. data/lib/chef/application/knife.rb +28 -29
  11. data/lib/chef/application/solo.rb +14 -12
  12. data/lib/chef/client.rb +112 -54
  13. data/lib/chef/config.rb +4 -0
  14. data/lib/chef/cookbook/chefignore.rb +66 -0
  15. data/lib/chef/cookbook/cookbook_collection.rb +6 -5
  16. data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
  17. data/lib/chef/cookbook/file_system_file_vendor.rb +10 -8
  18. data/lib/chef/cookbook/metadata.rb +200 -108
  19. data/lib/chef/cookbook_loader.rb +39 -163
  20. data/lib/chef/cookbook_uploader.rb +100 -78
  21. data/lib/chef/cookbook_version.rb +92 -47
  22. data/lib/chef/cookbook_version_selector.rb +163 -0
  23. data/lib/chef/couchdb.rb +9 -1
  24. data/lib/chef/data_bag.rb +1 -1
  25. data/lib/chef/data_bag_item.rb +1 -1
  26. data/lib/chef/encrypted_data_bag_item.rb +126 -0
  27. data/lib/chef/environment.rb +386 -0
  28. data/lib/chef/exceptions.rb +82 -1
  29. data/lib/chef/index_queue/amqp_client.rb +15 -12
  30. data/lib/chef/index_queue/indexable.rb +38 -4
  31. data/lib/chef/json_compat.rb +3 -3
  32. data/lib/chef/knife.rb +97 -202
  33. data/lib/chef/knife/bootstrap.rb +27 -61
  34. data/lib/chef/knife/bootstrap/archlinux-gems.erb +4 -2
  35. data/lib/chef/knife/bootstrap/centos5-gems.erb +6 -15
  36. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -4
  37. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  38. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -5
  39. data/lib/chef/knife/client_bulk_delete.rb +6 -3
  40. data/lib/chef/knife/client_create.rb +13 -10
  41. data/lib/chef/knife/client_delete.rb +10 -7
  42. data/lib/chef/knife/client_edit.rb +9 -6
  43. data/lib/chef/knife/client_list.rb +8 -5
  44. data/lib/chef/knife/client_reregister.rb +9 -6
  45. data/lib/chef/knife/client_show.rb +9 -6
  46. data/lib/chef/knife/configure.rb +15 -19
  47. data/lib/chef/knife/configure_client.rb +4 -4
  48. data/lib/chef/knife/cookbook_bulk_delete.rb +11 -8
  49. data/lib/chef/knife/cookbook_create.rb +120 -55
  50. data/lib/chef/knife/cookbook_delete.rb +18 -12
  51. data/lib/chef/knife/cookbook_download.rb +10 -6
  52. data/lib/chef/knife/cookbook_list.rb +15 -6
  53. data/lib/chef/knife/cookbook_metadata.rb +41 -21
  54. data/lib/chef/knife/cookbook_metadata_from_file.rb +4 -0
  55. data/lib/chef/knife/cookbook_show.rb +16 -5
  56. data/lib/chef/knife/cookbook_site_download.rb +2 -2
  57. data/lib/chef/knife/cookbook_site_share.rb +18 -13
  58. data/lib/chef/knife/cookbook_site_unshare.rb +7 -4
  59. data/lib/chef/knife/cookbook_site_vendor.rb +21 -18
  60. data/lib/chef/knife/cookbook_test.rb +14 -14
  61. data/lib/chef/knife/cookbook_upload.rb +91 -40
  62. data/lib/chef/knife/data_bag_create.rb +41 -6
  63. data/lib/chef/knife/data_bag_delete.rb +5 -3
  64. data/lib/chef/knife/data_bag_edit.rb +55 -11
  65. data/lib/chef/knife/data_bag_from_file.rb +47 -7
  66. data/lib/chef/knife/data_bag_list.rb +4 -1
  67. data/lib/chef/knife/data_bag_show.rb +44 -4
  68. data/lib/chef/knife/environment_create.rb +53 -0
  69. data/lib/chef/knife/environment_delete.rb +45 -0
  70. data/lib/chef/knife/environment_edit.rb +45 -0
  71. data/lib/chef/knife/environment_from_file.rb +39 -0
  72. data/lib/chef/knife/environment_list.rb +42 -0
  73. data/lib/chef/knife/environment_show.rb +46 -0
  74. data/lib/chef/knife/exec.rb +1 -1
  75. data/lib/chef/knife/index_rebuild.rb +8 -9
  76. data/lib/chef/knife/node_bulk_delete.rb +9 -6
  77. data/lib/chef/knife/node_create.rb +9 -6
  78. data/lib/chef/knife/node_delete.rb +10 -7
  79. data/lib/chef/knife/node_edit.rb +129 -10
  80. data/lib/chef/knife/node_from_file.rb +10 -7
  81. data/lib/chef/knife/node_list.rb +11 -6
  82. data/lib/chef/knife/node_run_list_add.rb +10 -7
  83. data/lib/chef/knife/node_run_list_remove.rb +9 -6
  84. data/lib/chef/knife/node_show.rb +15 -7
  85. data/lib/chef/knife/recipe_list.rb +4 -3
  86. data/lib/chef/knife/role_bulk_delete.rb +9 -6
  87. data/lib/chef/knife/role_create.rb +9 -6
  88. data/lib/chef/knife/role_delete.rb +10 -7
  89. data/lib/chef/knife/role_edit.rb +11 -8
  90. data/lib/chef/knife/role_from_file.rb +10 -7
  91. data/lib/chef/knife/role_list.rb +8 -5
  92. data/lib/chef/knife/role_show.rb +11 -8
  93. data/lib/chef/knife/search.rb +33 -10
  94. data/lib/chef/knife/ssh.rb +33 -61
  95. data/lib/chef/knife/status.rb +7 -4
  96. data/lib/chef/knife/subcommand_loader.rb +101 -0
  97. data/lib/chef/knife/tag_create.rb +31 -0
  98. data/lib/chef/knife/tag_delete.rb +31 -0
  99. data/lib/chef/knife/tag_list.rb +29 -0
  100. data/lib/chef/knife/ui.rb +229 -0
  101. data/lib/chef/knife/windows_bootstrap.rb +8 -5
  102. data/lib/chef/log.rb +5 -59
  103. data/lib/chef/mash.rb +211 -0
  104. data/lib/chef/mixins.rb +1 -2
  105. data/lib/chef/nil_argument.rb +3 -0
  106. data/lib/chef/node.rb +96 -34
  107. data/lib/chef/platform.rb +27 -0
  108. data/lib/chef/provider/cookbook_file.rb +21 -20
  109. data/lib/chef/provider/deploy/revision.rb +3 -0
  110. data/lib/chef/provider/file.rb +20 -11
  111. data/lib/chef/provider/git.rb +26 -26
  112. data/lib/chef/provider/group/aix.rb +70 -0
  113. data/lib/chef/provider/group/groupadd.rb +7 -4
  114. data/lib/chef/provider/group/usermod.rb +1 -1
  115. data/lib/chef/provider/package.rb +28 -28
  116. data/lib/chef/provider/package/dpkg.rb +1 -1
  117. data/lib/chef/provider/package/portage.rb +50 -39
  118. data/lib/chef/provider/package/rubygems.rb +1 -1
  119. data/lib/chef/provider/package/zypper.rb +3 -20
  120. data/lib/chef/provider/remote_directory.rb +0 -2
  121. data/lib/chef/provider/remote_file.rb +2 -3
  122. data/lib/chef/provider/service/arch.rb +28 -35
  123. data/lib/chef/provider/service/simple.rb +1 -1
  124. data/lib/chef/provider/subversion.rb +22 -22
  125. data/lib/chef/providers.rb +1 -0
  126. data/lib/chef/recipe.rb +10 -12
  127. data/lib/chef/resource.rb +49 -42
  128. data/lib/chef/resource/gem_package.rb +7 -3
  129. data/lib/chef/resource/git.rb +5 -5
  130. data/lib/chef/resource/package.rb +7 -7
  131. data/lib/chef/resource/scm.rb +2 -1
  132. data/lib/chef/resource/solaris_package.rb +0 -1
  133. data/lib/chef/resource/yum_package.rb +0 -1
  134. data/lib/chef/rest.rb +7 -16
  135. data/lib/chef/rest/rest_request.rb +0 -16
  136. data/lib/chef/role.rb +67 -13
  137. data/lib/chef/run_context.rb +37 -21
  138. data/lib/chef/run_list.rb +30 -15
  139. data/lib/chef/run_list/run_list_expansion.rb +41 -20
  140. data/lib/chef/run_list/run_list_item.rb +20 -6
  141. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  142. data/lib/chef/runner.rb +7 -15
  143. data/lib/chef/search/query.rb +12 -7
  144. data/lib/chef/shef.rb +6 -7
  145. data/lib/chef/shef/shef_session.rb +40 -35
  146. data/lib/chef/shell_out.rb +22 -201
  147. data/lib/chef/shell_out/unix.rb +224 -0
  148. data/lib/chef/shell_out/windows.rb +95 -0
  149. data/lib/chef/solr_query.rb +187 -0
  150. data/lib/chef/solr_query/lucene.treetop +145 -0
  151. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  152. data/lib/chef/solr_query/query_transform.rb +65 -0
  153. data/lib/chef/solr_query/solr_http_request.rb +118 -0
  154. data/lib/chef/version.rb +4 -2
  155. data/lib/chef/version_class.rb +70 -0
  156. data/lib/chef/version_constraint.rb +116 -0
  157. metadata +68 -37
  158. data/lib/chef/cookbook/metadata/version.rb +0 -87
  159. data/lib/chef/knife/bluebox_images_list.rb +0 -54
  160. data/lib/chef/knife/bluebox_server_create.rb +0 -157
  161. data/lib/chef/knife/bluebox_server_delete.rb +0 -63
  162. data/lib/chef/knife/bluebox_server_list.rb +0 -59
  163. data/lib/chef/knife/ec2_instance_data.rb +0 -46
  164. data/lib/chef/knife/ec2_server_create.rb +0 -218
  165. data/lib/chef/knife/ec2_server_delete.rb +0 -87
  166. data/lib/chef/knife/ec2_server_list.rb +0 -89
  167. data/lib/chef/knife/rackspace_server_create.rb +0 -184
  168. data/lib/chef/knife/rackspace_server_delete.rb +0 -57
  169. data/lib/chef/knife/rackspace_server_list.rb +0 -59
  170. data/lib/chef/knife/slicehost_images_list.rb +0 -53
  171. data/lib/chef/knife/slicehost_server_create.rb +0 -103
  172. data/lib/chef/knife/slicehost_server_delete.rb +0 -61
  173. data/lib/chef/knife/slicehost_server_list.rb +0 -64
  174. data/lib/chef/knife/terremark_server_create.rb +0 -152
  175. data/lib/chef/knife/terremark_server_delete.rb +0 -87
  176. data/lib/chef/knife/terremark_server_list.rb +0 -77
  177. data/lib/chef/mixin/find_preferred_file.rb +0 -92
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,13 +21,17 @@ require 'chef/resource/package'
21
21
  class Chef
22
22
  class Resource
23
23
  class GemPackage < Chef::Resource::Package
24
-
24
+
25
25
  def initialize(name, run_context=nil)
26
26
  super
27
27
  @resource_name = :gem_package
28
28
  @provider = Chef::Provider::Package::Rubygems
29
29
  end
30
30
 
31
+ def source(arg=nil)
32
+ set_or_return(:source, arg, :kind_of => [ String, Array ])
33
+ end
34
+
31
35
  # Sets a custom gem_binary to run for gem commands.
32
36
  def gem_binary(gem_cmd=nil)
33
37
  set_or_return(:gem_binary,gem_cmd,:kind_of => [ String ])
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,16 +21,16 @@ require "chef/resource/scm"
21
21
  class Chef
22
22
  class Resource
23
23
  class Git < Chef::Resource::Scm
24
-
24
+
25
25
  def initialize(name, run_context=nil)
26
26
  super
27
27
  @resource_name = :git
28
28
  @provider = Chef::Provider::Git
29
29
  end
30
-
30
+
31
31
  alias :branch :revision
32
32
  alias :reference :revision
33
-
33
+
34
34
  end
35
35
  end
36
36
  end
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,7 +21,7 @@ require 'chef/resource'
21
21
  class Chef
22
22
  class Resource
23
23
  class Package < Chef::Resource
24
-
24
+
25
25
  def initialize(name, run_context=nil)
26
26
  super
27
27
  @resource_name = :package
@@ -34,7 +34,7 @@ class Chef
34
34
  @options = nil
35
35
  @allowed_actions.push(:install, :upgrade, :remove, :purge)
36
36
  end
37
-
37
+
38
38
  def package_name(arg=nil)
39
39
  set_or_return(
40
40
  :package_name,
@@ -42,7 +42,7 @@ class Chef
42
42
  :kind_of => [ String ]
43
43
  )
44
44
  end
45
-
45
+
46
46
  def version(arg=nil)
47
47
  set_or_return(
48
48
  :version,
@@ -50,7 +50,7 @@ class Chef
50
50
  :kind_of => [ String ]
51
51
  )
52
52
  end
53
-
53
+
54
54
  def response_file(arg=nil)
55
55
  set_or_return(
56
56
  :response_file,
@@ -58,7 +58,7 @@ class Chef
58
58
  :kind_of => [ String ]
59
59
  )
60
60
  end
61
-
61
+
62
62
  def source(arg=nil)
63
63
  set_or_return(
64
64
  :source,
@@ -22,7 +22,7 @@ require 'chef/resource'
22
22
  class Chef
23
23
  class Resource
24
24
  class Scm < Chef::Resource
25
-
25
+
26
26
  def initialize(name, run_context=nil)
27
27
  super
28
28
  @destination = name
@@ -33,6 +33,7 @@ class Chef
33
33
  @ssh_wrapper = nil
34
34
  @depth = nil
35
35
  @allowed_actions.push(:checkout, :export, :sync, :diff, :log)
36
+ @action = [:sync]
36
37
  end
37
38
 
38
39
  def destination(arg=nil)
@@ -18,7 +18,6 @@
18
18
 
19
19
  require 'chef/resource/package'
20
20
  require 'chef/provider/package/solaris'
21
- require 'chef/json_compat'
22
21
 
23
22
  class Chef
24
23
  class Resource
@@ -18,7 +18,6 @@
18
18
 
19
19
  require 'chef/resource/package'
20
20
  require 'chef/provider/package/yum'
21
- require 'chef/json_compat'
22
21
 
23
22
  class Chef
24
23
  class Resource
@@ -298,12 +298,13 @@ class Chef
298
298
  retry
299
299
  end
300
300
  raise Timeout::Error, "Timeout connecting to #{url.host}:#{url.port} for #{rest_request.path}, giving up"
301
- rescue Net::HTTPFatalError => e
302
- if http_retry_count - http_attempts + 1 > 0
303
- sleep_time = 1 + (2 ** http_attempts) + rand(2 ** http_attempts)
304
- Chef::Log.error("Server returned error for #{url}, retrying #{http_attempts}/#{http_retry_count} in #{sleep_time}s")
305
- sleep(sleep_time)
306
- retry
301
+ rescue Net::HTTPServerException
302
+ if res.kind_of?(Net::HTTPForbidden)
303
+ if http_retry_count - http_attempts + 1 > 0
304
+ Chef::Log.error("Received 403 Forbidden against #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
305
+ sleep(http_retry_delay)
306
+ retry
307
+ end
307
308
  end
308
309
  raise
309
310
  end
@@ -358,7 +359,6 @@ class Chef
358
359
  headers["Content-Type"] = 'application/json' if json_body
359
360
  headers['Content-Length'] = json_body.bytesize.to_s if json_body
360
361
  headers.merge!(authentication_headers(method, url, json_body)) if sign_requests?
361
- headers.merge!(Chef::Config[:custom_http_headers]) if Chef::Config[:custom_http_headers]
362
362
  headers
363
363
  end
364
364
 
@@ -374,15 +374,6 @@ class Chef
374
374
  response.read_body do |chunk|
375
375
  tf.write(chunk)
376
376
  size += chunk.size
377
- if Chef::Log.verbose
378
- if size == 0
379
- Chef::Log.debug("#{url.path} done (0 length file)")
380
- elsif total == 0
381
- Chef::Log.debug("#{url.path} (zero content length or no Content-Length header)")
382
- else
383
- Chef::Log.debug("#{url.path}" + " %d%% done (%d of %d)" % [(size * 100) / total, size, total])
384
- end
385
- end
386
377
  end
387
378
  tf.close
388
379
  tf
@@ -23,26 +23,11 @@
23
23
  require 'uri'
24
24
  require 'net/http'
25
25
  require 'chef/rest/cookie_jar'
26
- require 'ohai' #used in user agent string.
27
26
  require 'chef/version'
28
27
 
29
28
  class Chef
30
29
  class REST
31
30
  class RESTRequest
32
-
33
- engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
34
-
35
- UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +http://opscode.com)"
36
- DEFAULT_UA = "Chef Client" << UA_COMMON
37
-
38
- def self.user_agent=(ua)
39
- @user_agent = ua
40
- end
41
-
42
- def self.user_agent
43
- @user_agent ||= DEFAULT_UA
44
- end
45
-
46
31
  attr_reader :method, :url, :headers, :http_client, :http_request
47
32
 
48
33
  def initialize(method, url, req_body, base_headers={})
@@ -196,7 +181,6 @@ class Chef
196
181
  @http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
197
182
  # Optionally handle HTTP Basic Authentication
198
183
  @http_request.basic_auth(url.user, url.password) if url.user
199
- @http_request['User-Agent'] = self.class.user_agent
200
184
  end
201
185
 
202
186
  end
@@ -24,7 +24,7 @@ require 'chef/mixin/from_file'
24
24
  require 'chef/couchdb'
25
25
  require 'chef/run_list'
26
26
  require 'chef/index_queue'
27
- require 'extlib'
27
+ require 'chef/mash'
28
28
  require 'chef/json_compat'
29
29
 
30
30
  class Chef
@@ -68,7 +68,7 @@ class Chef
68
68
  @description = ''
69
69
  @default_attributes = Mash.new
70
70
  @override_attributes = Mash.new
71
- @run_list = Chef::RunList.new
71
+ @env_run_lists = {"_default" => Chef::RunList.new}
72
72
  @couchdb_rev = nil
73
73
  @couchdb_id = nil
74
74
  @couchdb = couchdb || Chef::CouchDB.new
@@ -104,15 +104,42 @@ class Chef
104
104
  end
105
105
 
106
106
  def run_list(*args)
107
- (args.length > 0) ? @run_list.reset!(args) : @run_list
107
+ if (args.length > 0)
108
+ @env_run_lists["_default"].reset!(args)
109
+ end
110
+ @env_run_lists["_default"]
108
111
  end
109
112
 
110
113
  alias_method :recipes, :run_list
111
114
 
112
- # def recipes(*args)
113
- # Chef::Log.warn "Chef::Role#recipes method is deprecated. Please use Chef::Role#run_list"
114
- # run_list(*args)
115
- # end
115
+ # For run_list expansion
116
+ def run_list_for(environment)
117
+ if env_run_lists[environment].nil?
118
+ env_run_lists["_default"]
119
+ else
120
+ env_run_lists[environment]
121
+ end
122
+ end
123
+
124
+ def active_run_list_for(environment)
125
+ @env_run_lists.has_key?(environment) ? environment : '_default'
126
+ end
127
+
128
+ # Per environment run lists
129
+ def env_run_lists(env_run_lists=nil)
130
+ if (!env_run_lists.nil?)
131
+ unless env_run_lists.key?("_default")
132
+ msg = "_default key is required in env_run_lists.\n"
133
+ msg << "(env_run_lists: #{env_run_lists.inspect})"
134
+ raise Chef::Exceptions::InvalidEnvironmentRunListSpecification, msg
135
+ end
136
+ @env_run_lists.clear
137
+ env_run_lists.each { |k,v| @env_run_lists[k] = Chef::RunList.new(*Array(v))}
138
+ end
139
+ @env_run_lists
140
+ end
141
+
142
+ alias :env_run_list :env_run_lists
116
143
 
117
144
  def default_attributes(arg=nil)
118
145
  set_or_return(
@@ -131,6 +158,8 @@ class Chef
131
158
  end
132
159
 
133
160
  def to_hash
161
+ env_run_lists_without_default = @env_run_lists.dup
162
+ env_run_lists_without_default.delete("_default")
134
163
  result = {
135
164
  "name" => @name,
136
165
  "description" => @description,
@@ -138,7 +167,8 @@ class Chef
138
167
  "default_attributes" => @default_attributes,
139
168
  "override_attributes" => @override_attributes,
140
169
  "chef_type" => "role",
141
- "run_list" => @run_list.run_list
170
+ "run_list" => run_list,
171
+ "env_run_lists" => env_run_lists_without_default
142
172
  }
143
173
  result["_rev"] = couchdb_rev if couchdb_rev
144
174
  result
@@ -149,6 +179,15 @@ class Chef
149
179
  to_hash.to_json(*a)
150
180
  end
151
181
 
182
+ def update_from!(o)
183
+ description(o.description)
184
+ recipes(o.recipes) if defined?(o.recipes)
185
+ default_attributes(o.default_attributes)
186
+ override_attributes(o.override_attributes)
187
+ env_run_lists(o.env_run_lists) unless o.env_run_lists.nil?
188
+ self
189
+ end
190
+
152
191
  # Create a Chef::Role from JSON
153
192
  def self.json_create(o)
154
193
  role = new
@@ -156,11 +195,18 @@ class Chef
156
195
  role.description(o["description"])
157
196
  role.default_attributes(o["default_attributes"])
158
197
  role.override_attributes(o["override_attributes"])
159
- role.run_list(if o.has_key?("run_list")
160
- o["run_list"]
161
- else
162
- o["recipes"]
163
- end)
198
+
199
+ # _default run_list is in 'run_list' for newer clients, and
200
+ # 'recipes' for older clients.
201
+ env_run_list_hash = {"_default" => (o.has_key?("run_list") ? o["run_list"] : o["recipes"])}
202
+
203
+ # Clients before 0.10 do not include env_run_lists, so only
204
+ # merge if it's there.
205
+ if o["env_run_lists"]
206
+ env_run_list_hash.merge!(o["env_run_lists"])
207
+ end
208
+ role.env_run_lists(env_run_list_hash)
209
+
164
210
  role.couchdb_rev = o["_rev"] if o.has_key?("_rev")
165
211
  role.index_id = role.couchdb_id
166
212
  role.couchdb_id = o["_id"] if o.has_key?("_id")
@@ -206,6 +252,14 @@ class Chef
206
252
  end
207
253
  end
208
254
 
255
+ def environment(env_name)
256
+ chef_server_rest.get_rest("roles/#{@name}/environments/#{env_name}")
257
+ end
258
+
259
+ def environments
260
+ chef_server_rest.get_rest("roles/#{@name}/environments")
261
+ end
262
+
209
263
  # Remove this role from the CouchDB
210
264
  def cdb_destroy
211
265
  couchdb.delete("role", @name, couchdb_rev)
@@ -8,9 +8,9 @@
8
8
  # Licensed under the Apache License, Version 2.0 (the "License");
9
9
  # you may not use this file except in compliance with the License.
10
10
  # You may obtain a copy of the License at
11
- #
11
+ #
12
12
  # http://www.apache.org/licenses/LICENSE-2.0
13
- #
13
+ #
14
14
  # Unless required by applicable law or agreed to in writing, software
15
15
  # distributed under the License is distributed on an "AS IS" BASIS,
16
16
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -47,32 +47,61 @@ class Chef
47
47
  @cookbook_collection = cookbook_collection
48
48
  @resource_collection = Chef::ResourceCollection.new
49
49
  @definitions = Hash.new
50
-
50
+
51
51
  # TODO: 5/18/2010 cw/timh - See note on Chef::Node's
52
52
  # cookbook_collection attr_accessor
53
53
  node.cookbook_collection = cookbook_collection
54
+ end
54
55
 
55
- load
56
+ def load(run_list_expansion)
57
+ load_libraries
58
+ load_lwrp_providers
59
+ load_lwrp_resources
60
+ load_attributes
61
+ load_resource_definitions
62
+
63
+ # Precendence rules state that roles' attributes come after
64
+ # cookbooks. Now we've loaded attributes from cookbooks with
65
+ # load_attributes, apply the expansion attributes (loaded from
66
+ # roles) to the node.
67
+ @node.apply_expansion_attributes(run_list_expansion)
68
+
69
+ run_list_expansion.recipes.each do |recipe|
70
+ # TODO: timh/cw, 5-14-2010: It's distasteful to be including
71
+ # the DSL in a class outside the context of the DSL
72
+ include_recipe(recipe)
73
+ end
56
74
  end
57
75
 
58
- def load
76
+
77
+ private
78
+
79
+ def load_libraries
59
80
  foreach_cookbook_load_segment(:libraries) do |cookbook_name, filename|
60
81
  Chef::Log.debug("Loading cookbook #{cookbook_name}'s library file: #{filename}")
61
82
  require filename
62
83
  end
63
-
84
+ end
85
+
86
+ def load_lwrp_providers
64
87
  foreach_cookbook_load_segment(:providers) do |cookbook_name, filename|
65
88
  Chef::Log.debug("Loading cookbook #{cookbook_name}'s providers from #{filename}")
66
89
  Chef::Provider.build_from_file(cookbook_name, filename)
67
90
  end
68
-
91
+ end
92
+
93
+ def load_lwrp_resources
69
94
  foreach_cookbook_load_segment(:resources) do |cookbook_name, filename|
70
95
  Chef::Log.debug("Loading cookbook #{cookbook_name}'s resources from #{filename}")
71
96
  Chef::Resource.build_from_file(cookbook_name, filename)
72
97
  end
98
+ end
73
99
 
100
+ def load_attributes
74
101
  node.load_attributes
102
+ end
75
103
 
104
+ def load_resource_definitions
76
105
  foreach_cookbook_load_segment(:definitions) do |cookbook_name, filename|
77
106
  Chef::Log.debug("Loading cookbook #{cookbook_name}'s definitions from #{filename}")
78
107
  resourcelist = Chef::ResourceDefinitionList.new
@@ -82,21 +111,8 @@ class Chef
82
111
  newval
83
112
  end
84
113
  end
85
-
86
- # Retrieve the fully expanded list of recipes for the node by
87
- # resolving roles; this step also merges attributes into the
88
- # node from the roles/recipes included.
89
- recipe_names = node.expand!
90
-
91
- recipe_names.each do |recipe_name|
92
- # TODO: timh/cw, 5-14-2010: It's distasteful to be including
93
- # the DSL in a class outside the context of the DSL
94
- include_recipe(recipe_name)
95
- end
96
114
  end
97
115
 
98
- private
99
-
100
116
  def foreach_cookbook_load_segment(segment, &block)
101
117
  cookbook_collection.each do |cookbook_name, cookbook|
102
118
  segment_filenames = cookbook.segment_filenames(segment)
@@ -105,6 +121,6 @@ class Chef
105
121
  end
106
122
  end
107
123
  end
108
-
124
+
109
125
  end
110
126
  end