chef 0.10.0.beta.8 → 0.10.0.beta.9

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 (70) hide show
  1. data/distro/common/html/knife-bootstrap.1.html +69 -10
  2. data/distro/common/html/knife-client.1.html +25 -22
  3. data/distro/common/html/knife-configure.1.html +1 -1
  4. data/distro/common/html/knife-cookbook-site.1.html +91 -19
  5. data/distro/common/html/knife-cookbook.1.html +216 -76
  6. data/distro/common/html/knife-data-bag.1.html +1 -1
  7. data/distro/common/html/knife-environment.1.html +177 -3
  8. data/distro/common/html/knife-exec.1.html +44 -3
  9. data/distro/common/html/knife-index.1.html +1 -1
  10. data/distro/common/html/knife-node.1.html +5 -3
  11. data/distro/common/html/knife-recipe.1.html +1 -1
  12. data/distro/common/html/knife-role.1.html +83 -19
  13. data/distro/common/html/knife-search.1.html +43 -2
  14. data/distro/common/html/knife-ssh.1.html +57 -2
  15. data/distro/common/html/knife-status.1.html +33 -2
  16. data/distro/common/html/knife-tag.1.html +45 -1
  17. data/distro/common/html/knife.1.html +94 -161
  18. data/distro/common/html/shef.1.html +283 -0
  19. data/distro/common/man/man1/knife-bootstrap.1 +56 -4
  20. data/distro/common/man/man1/knife-client.1 +12 -11
  21. data/distro/common/man/man1/knife-configure.1 +1 -1
  22. data/distro/common/man/man1/knife-cookbook-site.1 +64 -22
  23. data/distro/common/man/man1/knife-cookbook.1 +200 -122
  24. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  25. data/distro/common/man/man1/knife-environment.1 +167 -2
  26. data/distro/common/man/man1/knife-exec.1 +36 -3
  27. data/distro/common/man/man1/knife-index.1 +1 -1
  28. data/distro/common/man/man1/knife-node.1 +2 -1
  29. data/distro/common/man/man1/knife-role.1 +48 -24
  30. data/distro/common/man/man1/knife-search.1 +27 -3
  31. data/distro/common/man/man1/knife-ssh.1 +43 -2
  32. data/distro/common/man/man1/knife-status.1 +14 -2
  33. data/distro/common/man/man1/knife-tag.1 +32 -2
  34. data/distro/common/man/man1/knife.1 +91 -186
  35. data/distro/common/man/man1/shef.1 +237 -26
  36. data/distro/common/markdown/man1/knife-bootstrap.mkd +57 -7
  37. data/distro/common/markdown/man1/knife-client.mkd +19 -17
  38. data/distro/common/markdown/man1/knife-cookbook-site.mkd +63 -15
  39. data/distro/common/markdown/man1/knife-cookbook.mkd +220 -103
  40. data/distro/common/markdown/man1/knife-environment.mkd +144 -1
  41. data/distro/common/markdown/man1/knife-exec.mkd +29 -1
  42. data/distro/common/markdown/man1/knife-node.mkd +1 -1
  43. data/distro/common/markdown/man1/knife-role.mkd +36 -30
  44. data/distro/common/markdown/man1/knife-search.mkd +0 -1
  45. data/distro/common/markdown/man1/knife-ssh.mkd +0 -2
  46. data/distro/common/markdown/man1/knife-status.mkd +0 -2
  47. data/distro/common/markdown/man1/knife-tag.mkd +31 -0
  48. data/distro/common/markdown/man1/knife.mkd +93 -165
  49. data/distro/common/markdown/man1/shef.mkd +189 -0
  50. data/lib/chef/api_client.rb +36 -35
  51. data/lib/chef/application/knife.rb +1 -1
  52. data/lib/chef/client.rb +1 -0
  53. data/lib/chef/cookbook/cookbook_version_loader.rb +29 -7
  54. data/lib/chef/cookbook_uploader.rb +55 -36
  55. data/lib/chef/cookbook_version.rb +3 -1
  56. data/lib/chef/couchdb.rb +0 -1
  57. data/lib/chef/knife/cookbook_list.rb +1 -1
  58. data/lib/chef/knife/cookbook_show.rb +1 -0
  59. data/lib/chef/knife/core/generic_presenter.rb +3 -3
  60. data/lib/chef/knife/help.rb +6 -2
  61. data/lib/chef/knife/tag_create.rb +26 -5
  62. data/lib/chef/knife/tag_delete.rb +34 -5
  63. data/lib/chef/knife/tag_list.rb +24 -6
  64. data/lib/chef/node.rb +1 -0
  65. data/lib/chef/role.rb +1 -0
  66. data/lib/chef/shef.rb +1 -0
  67. data/lib/chef/version.rb +1 -1
  68. metadata +4 -4
  69. data/distro/common/man/man1/knife-recipe.1 +0 -13
  70. data/distro/common/markdown/man1/knife-recipe.mkd +0 -24
@@ -1,3 +1,4 @@
1
+
1
2
  require 'rest_client'
2
3
  require 'chef/exceptions'
3
4
  require 'chef/knife/cookbook_metadata'
@@ -10,6 +11,23 @@ require 'chef/cookbook/file_system_file_vendor'
10
11
  class Chef
11
12
  class CookbookUploader
12
13
 
14
+ def self.work_queue
15
+ @work_queue ||= Queue.new
16
+ end
17
+
18
+ def self.setup_worker_threads
19
+ @worker_threads ||= begin
20
+ work_queue
21
+ (1...10).map do
22
+ Thread.new do
23
+ loop do
24
+ work_queue.pop.call
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
13
31
  attr_reader :cookbook
14
32
  attr_reader :path
15
33
  attr_reader :opts
@@ -35,51 +53,32 @@ class Chef
35
53
  end
36
54
 
37
55
  def upload_cookbook
56
+ Thread.abort_on_exception = true
38
57
  Chef::Log.info("Saving #{cookbook.name}")
39
58
 
40
59
  # Syntax Check
41
60
  validate_cookbook
42
- # Generate metadata.json from metadata.rb
43
- build_metadata
44
-
45
61
  # generate checksums of cookbook files and create a sandbox
46
62
  checksum_files = cookbook.checksums
47
63
  checksums = checksum_files.inject({}){|memo,elt| memo[elt.first]=nil ; memo}
48
64
  new_sandbox = rest.post_rest("sandboxes", { :checksums => checksums })
49
65
 
50
66
  Chef::Log.info("Uploading files")
67
+
68
+ self.class.setup_worker_threads
69
+
51
70
  # upload the new checksums and commit the sandbox
52
71
  new_sandbox['checksums'].each do |checksum, info|
53
72
  if info['needs_upload'] == true
54
73
  Chef::Log.info("Uploading #{checksum_files[checksum]} (checksum hex = #{checksum}) to #{info['url']}")
55
-
56
- # Checksum is the hexadecimal representation of the md5,
57
- # but we need the base64 encoding for the content-md5
58
- # header
59
- checksum64 = Base64.encode64([checksum].pack("H*")).strip
60
- timestamp = Time.now.utc.iso8601
61
- file_contents = File.read(checksum_files[checksum])
62
- # TODO - 5/28/2010, cw: make signing and sending the request streaming
63
- sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(
64
- :http_method => :put,
65
- :path => URI.parse(info['url']).path,
66
- :body => file_contents,
67
- :timestamp => timestamp,
68
- :user_id => rest.client_name
69
- )
70
- headers = { 'content-type' => 'application/x-binary', 'content-md5' => checksum64, :accept => 'application/json' }
71
- headers.merge!(sign_obj.sign(OpenSSL::PKey::RSA.new(rest.signing_key)))
72
-
73
- begin
74
- RestClient::Resource.new(info['url'], :headers=>headers, :timeout=>1800, :open_timeout=>1800).put(file_contents)
75
- rescue RestClient::Exception => e
76
- Chef::Log.error("Upload failed: #{e.message}\n#{e.response.body}")
77
- raise
78
- end
74
+ self.class.work_queue << uploader_function_for(checksum_files[checksum], checksum, info['url'])
79
75
  else
80
76
  Chef::Log.debug("#{checksum_files[checksum]} has not changed")
81
77
  end
82
78
  end
79
+
80
+ sleep 0.1 until self.class.work_queue.empty?
81
+
83
82
  sandbox_url = new_sandbox['uri']
84
83
  Chef::Log.debug("Committing sandbox")
85
84
  # Retry if S3 is claims a checksum doesn't exist (the eventual
@@ -100,15 +99,35 @@ class Chef
100
99
  Chef::Log.info("Upload complete!")
101
100
  end
102
101
 
103
- def build_metadata
104
- Chef::Log.debug("Generating metadata")
105
- # FIXME: This knife command should be factored out into a
106
- # library for use here
107
- kcm = Chef::Knife::CookbookMetadata.new
108
- kcm.config[:cookbook_path] = path
109
- kcm.name_args = [ cookbook.name.to_s ]
110
- kcm.run
111
- cookbook.reload_metadata!
102
+ def worker_thread(work_queue)
103
+ end
104
+
105
+ def uploader_function_for(file, checksum, url)
106
+ lambda do
107
+ # Checksum is the hexadecimal representation of the md5,
108
+ # but we need the base64 encoding for the content-md5
109
+ # header
110
+ checksum64 = Base64.encode64([checksum].pack("H*")).strip
111
+ timestamp = Time.now.utc.iso8601
112
+ file_contents = File.read(file)
113
+ # TODO - 5/28/2010, cw: make signing and sending the request streaming
114
+ sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(
115
+ :http_method => :put,
116
+ :path => URI.parse(url).path,
117
+ :body => file_contents,
118
+ :timestamp => timestamp,
119
+ :user_id => rest.client_name
120
+ )
121
+ headers = { 'content-type' => 'application/x-binary', 'content-md5' => checksum64, :accept => 'application/json' }
122
+ headers.merge!(sign_obj.sign(OpenSSL::PKey::RSA.new(rest.signing_key)))
123
+
124
+ begin
125
+ RestClient::Resource.new(url, :headers=>headers, :timeout=>1800, :open_timeout=>1800).put(file_contents)
126
+ rescue RestClient::Exception => e
127
+ Chef::Log.error("Upload failed: #{e.message}\n#{e.response.body}")
128
+ raise
129
+ end
130
+ end
112
131
  end
113
132
 
114
133
  def validate_cookbook
@@ -861,7 +861,9 @@ class Chef
861
861
  # [String]:: Array of cookbook versions, which are strings like 'x.y.z'
862
862
  # nil:: if the cookbook doesn't exist. an error will also be logged.
863
863
  def self.available_versions(cookbook_name)
864
- chef_server_rest.get_rest("cookbooks/#{cookbook_name}").values.flatten
864
+ chef_server_rest.get_rest("cookbooks/#{cookbook_name}")[cookbook_name]["versions"].map do |cb|
865
+ cb["version"]
866
+ end
865
867
  rescue Net::HTTPServerException => e
866
868
  if e.to_s =~ /^404/
867
869
  Chef::Log.error("Cannot find a cookbook named #{cookbook_name}")
data/lib/chef/couchdb.rb CHANGED
@@ -78,7 +78,6 @@ class Chef
78
78
  end
79
79
 
80
80
  def create_design_document(name, data)
81
- create_db
82
81
  to_update = true
83
82
  begin
84
83
  old_doc = @rest.get_rest("#{couchdb_database}/_design/#{name}")
@@ -32,7 +32,7 @@ class Chef
32
32
 
33
33
  option :all_versions,
34
34
  :short => "-a",
35
- :long => "--show-all-versions",
35
+ :long => "--all",
36
36
  :description => "Show all available versions."
37
37
 
38
38
  def run
@@ -25,6 +25,7 @@ class Chef
25
25
  deps do
26
26
  require 'chef/json_compat'
27
27
  require 'uri'
28
+ require 'chef/cookbook_version'
28
29
  end
29
30
 
30
31
  banner "knife cookbook show COOKBOOK [VERSION] [PART] [FILENAME] (options)"
@@ -53,7 +53,7 @@ class Chef
53
53
 
54
54
  # Returns a String representation of +data+ that is suitable for output
55
55
  # to a terminal or perhaps for data interchange with another program.
56
- # The representation of the +data+ depends on the value of the
56
+ # The representation of the +data+ depends on the value of the
57
57
  # `config[:format]` setting.
58
58
  def format(data)
59
59
  case parse_format_option
@@ -171,9 +171,9 @@ class Chef
171
171
  collected[cookbook] = versions["versions"].map {|v| v['version']}
172
172
  collected
173
173
  end
174
- key_length = versions_by_cookbook.keys.map {|name| name.size }.max + 2
174
+ key_length = versions_by_cookbook.empty? ? 0 : versions_by_cookbook.keys.map {|name| name.size }.max + 2
175
175
  versions_by_cookbook.sort.map do |cookbook, versions|
176
- "#{cookbook.ljust(key_length)} #{versions.join(',')}"
176
+ "#{cookbook.ljust(key_length)} #{versions.join(' ')}"
177
177
  end
178
178
  end
179
179
  end
@@ -25,14 +25,18 @@ class Chef
25
25
  def run
26
26
  if name_args.empty?
27
27
  ui.info "Usage: knife SUBCOMMAND (options)"
28
- show_usage
28
+ ui.msg ""
29
+ # This command is atypical, the user is likely not interested in usage of
30
+ # this command, but knife in general. So hack the banner.
31
+ opt_parser.banner = "General Knife Options:"
32
+ ui.msg opt_parser.to_s
29
33
  ui.msg ""
30
34
  ui.info "For further help:"
31
35
  ui.info(<<-MOAR_HELP)
32
36
  knife help list list help topics
33
37
  knife help knife show general knife help
34
38
  knife help TOPIC display the manual for TOPIC
35
- knife COMMAND --help show the options for a command
39
+ knife SUBCOMMAND --help show the options for a command
36
40
  MOAR_HELP
37
41
  exit 1
38
42
  else
@@ -1,3 +1,23 @@
1
+ #
2
+ # Author:: Ryan Davis (<ryand-ruby@zenspider.com>)
3
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Copyright:: Copyright (c) 2011 Ryan Davis and Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
1
21
  require 'chef/knife'
2
22
 
3
23
  class Chef
@@ -12,19 +32,20 @@ class Chef
12
32
 
13
33
  def run
14
34
  name = @name_args[0]
15
- tags = @name_args[1..-1].join(",").split(/\s*,\s*/)
35
+ tags = @name_args[1..-1]
16
36
 
17
- unless name or tags.empty?
37
+ if name.nil? || tags.nil? || tags.empty?
18
38
  show_usage
19
- # TODO: blah blah
20
- ui.fatal("You must specify a node name")
39
+ ui.fatal("You must specify a node name and at least one tag.")
21
40
  exit 1
22
41
  end
23
42
 
24
43
  node = Chef::Node.load name
25
44
  tags.each do |tag|
26
- node.tags << tag
45
+ (node.tags << tag).uniq!
27
46
  end
47
+ node.save
48
+ ui.info("Created tags #{tags.join(", ")} for node #{name}.")
28
49
  end
29
50
  end
30
51
  end
@@ -1,3 +1,23 @@
1
+ #
2
+ # Author:: Ryan Davis (<ryand-ruby@zenspider.com>)
3
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Copyright:: Copyright (c) 2011 Ryan Davis and Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
1
21
  require 'chef/knife'
2
22
 
3
23
  class Chef
@@ -12,19 +32,28 @@ class Chef
12
32
 
13
33
  def run
14
34
  name = @name_args[0]
15
- tags = @name_args[1..-1].join(",").split(/\s*,\s*/)
35
+ tags = @name_args[1..-1]
16
36
 
17
- unless name or tags.empty?
37
+ if name.nil? || tags.nil? || tags.empty?
18
38
  show_usage
19
- # TODO: blah blah
20
- ui.fatal("You must specify a node name")
39
+ ui.fatal("You must specify a node name and at least one tag.")
21
40
  exit 1
22
41
  end
23
42
 
24
43
  node = Chef::Node.load name
44
+ deleted_tags = Array.new
25
45
  tags.each do |tag|
26
- node.tags.delete tag
46
+ unless node.tags.delete(tag).nil?
47
+ deleted_tags << tag
48
+ end
27
49
  end
50
+ node.save
51
+ message = if deleted_tags.empty?
52
+ "Nothing has changed. The tags requested to be deleted do not exist."
53
+ else
54
+ "Deleted the following tags: #{deleted_tags.join(", ")}."
55
+ end
56
+ ui.info(message)
28
57
  end
29
58
  end
30
59
  end
@@ -1,3 +1,23 @@
1
+ #
2
+ # Author:: Ryan Davis (<ryand-ruby@zenspider.com>)
3
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Copyright:: Copyright (c) 2011 Ryan Davis and Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
1
21
  require 'chef/knife'
2
22
 
3
23
  class Chef
@@ -12,17 +32,15 @@ class Chef
12
32
 
13
33
  def run
14
34
  name = @name_args[0]
15
- tags = @name_args[1..-1].join(",").split(/\s*,\s*/)
16
35
 
17
- unless name or tags.empty?
36
+ if name.nil?
18
37
  show_usage
19
- # TODO: blah blah
20
- ui.fatal("You must specify a node name")
38
+ ui.fatal("You must specify a node name.")
21
39
  exit 1
22
40
  end
23
41
 
24
- node = Chef::Node.load name
25
- output node.tags
42
+ node = Chef::Node.load(name)
43
+ output(node.tags)
26
44
  end
27
45
  end
28
46
  end
data/lib/chef/node.rb CHANGED
@@ -36,6 +36,7 @@ require 'chef/node/attribute'
36
36
  require 'chef/index_queue'
37
37
  require 'chef/mash'
38
38
  require 'chef/json_compat'
39
+ require 'chef/search/query'
39
40
 
40
41
  class Chef
41
42
  class Node
data/lib/chef/role.rb CHANGED
@@ -26,6 +26,7 @@ require 'chef/run_list'
26
26
  require 'chef/index_queue'
27
27
  require 'chef/mash'
28
28
  require 'chef/json_compat'
29
+ require 'chef/search/query'
29
30
 
30
31
  class Chef
31
32
  class Role
data/lib/chef/shef.rb CHANGED
@@ -20,6 +20,7 @@ require 'pp'
20
20
  require 'etc'
21
21
  require 'mixlib/cli'
22
22
 
23
+ require 'chef'
23
24
  require 'chef/version'
24
25
  require 'chef/client'
25
26
  require 'chef/config'
data/lib/chef/version.rb CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  class Chef
19
19
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
20
- VERSION = '0.10.0.beta.8'
20
+ VERSION = '0.10.0.beta.9'
21
21
  end
22
22
 
23
23
  # NOTE: the Chef::Version class is defined in version_class.rb
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: chef
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 7
5
- version: 0.10.0.beta.8
5
+ version: 0.10.0.beta.9
6
6
  platform: ruby
7
7
  authors:
8
8
  - Adam Jacob
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-08 00:00:00 -07:00
13
+ date: 2011-04-10 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -226,6 +226,7 @@ files:
226
226
  - distro/common/html/knife-status.1.html
227
227
  - distro/common/html/knife-tag.1.html
228
228
  - distro/common/html/knife.1.html
229
+ - distro/common/html/shef.1.html
229
230
  - distro/common/man/man1/knife-bootstrap.1
230
231
  - distro/common/man/man1/knife-client.1
231
232
  - distro/common/man/man1/knife-configure.1
@@ -236,7 +237,6 @@ files:
236
237
  - distro/common/man/man1/knife-exec.1
237
238
  - distro/common/man/man1/knife-index.1
238
239
  - distro/common/man/man1/knife-node.1
239
- - distro/common/man/man1/knife-recipe.1
240
240
  - distro/common/man/man1/knife-role.1
241
241
  - distro/common/man/man1/knife-search.1
242
242
  - distro/common/man/man1/knife-ssh.1
@@ -259,13 +259,13 @@ files:
259
259
  - distro/common/markdown/man1/knife-exec.mkd
260
260
  - distro/common/markdown/man1/knife-index.mkd
261
261
  - distro/common/markdown/man1/knife-node.mkd
262
- - distro/common/markdown/man1/knife-recipe.mkd
263
262
  - distro/common/markdown/man1/knife-role.mkd
264
263
  - distro/common/markdown/man1/knife-search.mkd
265
264
  - distro/common/markdown/man1/knife-ssh.mkd
266
265
  - distro/common/markdown/man1/knife-status.mkd
267
266
  - distro/common/markdown/man1/knife-tag.mkd
268
267
  - distro/common/markdown/man1/knife.mkd
268
+ - distro/common/markdown/man1/shef.mkd
269
269
  - distro/common/markdown/README
270
270
  - distro/debian/etc/default/chef-client
271
271
  - distro/debian/etc/default/chef-server