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,7 +21,11 @@ require 'chef/knife'
21
21
  class Chef
22
22
  class Knife
23
23
  class CookbookDelete < Knife
24
-
24
+
25
+ deps do
26
+ require 'chef/cookbook_version'
27
+ end
28
+
25
29
  option :all, :short => '-a', :long => '--all', :boolean => true, :description => 'delete all versions'
26
30
 
27
31
  option :purge, :short => '-p', :long => '--purge', :boolean => true, :description => 'Permanently remove files from backing data store'
@@ -39,7 +43,7 @@ class Chef
39
43
  delete_without_explicit_version
40
44
  elsif @cookbook_name.nil?
41
45
  show_usage
42
- Chef::Log.fatal("You must provide the name of the cookbook to delete")
46
+ ui.fatal("You must provide the name of the cookbook to delete")
43
47
  exit(1)
44
48
  end
45
49
  end
@@ -79,10 +83,12 @@ class Chef
79
83
  end
80
84
 
81
85
  def available_versions
82
- @available_versions ||= rest.get_rest("cookbooks/#{@cookbook_name}").values.flatten
86
+ @available_versions ||= rest.get_rest("cookbooks/#{@cookbook_name}").map do |name, url_and_version|
87
+ url_and_version["versions"].map {|url_by_version| url_by_version["version"]}
88
+ end.flatten
83
89
  rescue Net::HTTPServerException => e
84
90
  if e.to_s =~ /^404/
85
- Chef::Log.error("Cannot find a cookbook named #{@cookbook_name} to delete")
91
+ ui.error("Cannot find a cookbook named #{@cookbook_name} to delete")
86
92
  nil
87
93
  else
88
94
  raise
@@ -99,16 +105,16 @@ class Chef
99
105
  valid_responses[(available_versions.size + 1).to_s] = :all
100
106
  question << "#{available_versions.size + 1}. All versions\n\n"
101
107
  responses = ask_question(question).split(',').map { |response| response.strip }
102
-
108
+
103
109
  if responses.empty?
104
- Chef::Log.error("No versions specified, exiting")
110
+ ui.error("No versions specified, exiting")
105
111
  exit(1)
106
112
  end
107
113
  versions = responses.map do |response|
108
114
  if version = valid_responses[response]
109
115
  version
110
116
  else
111
- Chef::Log.error("#{response} is not a valid choice, skipping it")
117
+ ui.error("#{response} is not a valid choice, skipping it")
112
118
  end
113
119
  end
114
120
  versions.compact
@@ -117,7 +123,7 @@ class Chef
117
123
  def delete_version_without_confirmation(version)
118
124
  object = delete_request("cookbooks/#{@cookbook_name}/#{version}")
119
125
  output(format_for_display(object)) if config[:print_after]
120
- Chef::Log.info("Deleted cookbook[#{@cookbook_name}][#{version}]")
126
+ ui.info("Deleted cookbook[#{@cookbook_name}][#{version}]")
121
127
  end
122
128
 
123
129
  def delete_versions_without_confirmation(versions)
@@ -130,9 +136,9 @@ class Chef
130
136
  end
131
137
  end
132
138
  end
133
-
139
+
134
140
  private
135
-
141
+
136
142
  def delete_request(path)
137
143
  path += "?purge=true" if config[:purge]
138
144
  rest.delete_rest(path)
@@ -23,6 +23,10 @@ class Chef
23
23
  class Knife
24
24
  class CookbookDownload < Knife
25
25
 
26
+ deps do
27
+ require 'chef/cookbook_version'
28
+ end
29
+
26
30
  banner "knife cookbook download COOKBOOK [VERSION] (options)"
27
31
 
28
32
  option :latest,
@@ -50,13 +54,13 @@ class Chef
50
54
 
51
55
  if @cookbook_name.nil?
52
56
  show_usage
53
- Chef::Log.fatal("You must specify a cookbook name")
57
+ ui.fatal("You must specify a cookbook name")
54
58
  exit 1
55
59
  elsif @version.nil?
56
60
  determine_version
57
61
  end
58
62
 
59
- Chef::Log.info("Downloading #{@cookbook_name} cookbook version #{@version}")
63
+ ui.info("Downloading #{@cookbook_name} cookbook version #{@version}")
60
64
 
61
65
  cookbook = rest.get_rest("cookbooks/#{@cookbook_name}/#{@version}")
62
66
  manifest = cookbook.manifest
@@ -67,14 +71,14 @@ class Chef
67
71
  Chef::Log.debug("Deleting #{basedir}")
68
72
  FileUtils.rm_rf(basedir)
69
73
  else
70
- Chef::Log.fatal("Directory #{basedir} exists, use --force to overwrite")
74
+ ui.fatal("Directory #{basedir} exists, use --force to overwrite")
71
75
  exit
72
76
  end
73
77
  end
74
78
 
75
79
  Chef::CookbookVersion::COOKBOOK_SEGMENTS.each do |segment|
76
80
  next unless manifest.has_key?(segment)
77
- Chef::Log.info("Downloading #{segment}")
81
+ ui.info("Downloading #{segment}")
78
82
  manifest[segment].each do |segment_file|
79
83
  dest = File.join(basedir, segment_file['path'].gsub('/', File::SEPARATOR))
80
84
  Chef::Log.debug("Downloading #{segment_file['path']} to #{dest}")
@@ -84,7 +88,7 @@ class Chef
84
88
  FileUtils.mv(tempfile.path, dest)
85
89
  end
86
90
  end
87
- Chef::Log.info("Cookbook downloaded to #{basedir}")
91
+ ui.info("Cookbook downloaded to #{basedir}")
88
92
  end
89
93
 
90
94
  def determine_version
@@ -120,7 +124,7 @@ class Chef
120
124
  response = ask_question(question).strip
121
125
 
122
126
  unless @version = valid_responses[response]
123
- Chef::Log.error("'#{response}' is not a valid value.")
127
+ ui.error("'#{response}' is not a valid value.")
124
128
  exit(1)
125
129
  end
126
130
  end
@@ -1,14 +1,15 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Copyright:: Copyright (c) 2009 Opscode, Inc.
3
+ # Author:: Nuo Yan (<nuo@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009, 2010, 2011 Opscode, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
7
8
  # you may not use this file except in compliance with the License.
8
9
  # You may obtain a copy of the License at
9
- #
10
+ #
10
11
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
+ #
12
13
  # Unless required by applicable law or agreed to in writing, software
13
14
  # distributed under the License is distributed on an "AS IS" BASIS,
14
15
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,7 +18,6 @@
17
18
  #
18
19
 
19
20
  require 'chef/knife'
20
- require 'chef/json_compat'
21
21
 
22
22
  class Chef
23
23
  class Knife
@@ -30,8 +30,17 @@ class Chef
30
30
  :long => "--with-uri",
31
31
  :description => "Show corresponding URIs"
32
32
 
33
- def run
34
- output(format_list_for_display(rest.get_rest('cookbooks')))
33
+ option :all_versions,
34
+ :short => "-a",
35
+ :long => "--show-all-versions",
36
+ :description => "Show all available versions."
37
+
38
+ def run
39
+ env = config[:environment]
40
+ num_versions = config[:all_versions] ? "num_versions=all" : "num_versions=1"
41
+ api_endpoint = env ? "/environments/#{env}/cookbooks?#{num_versions}" : "/cookbooks?#{num_versions}"
42
+ ui.info("Showing latest versions. Use --show-all to list all available versions.") unless config[:all_versions]
43
+ output(format_cookbook_list_for_display(rest.get_rest(api_endpoint)))
35
44
  end
36
45
  end
37
46
  end
@@ -23,6 +23,10 @@ class Chef
23
23
  class Knife
24
24
  class CookbookMetadata < Knife
25
25
 
26
+ deps do
27
+ require 'chef/cookbook/metadata'
28
+ end
29
+
26
30
  banner "knife cookbook metadata COOKBOOK (options)"
27
31
 
28
32
  option :cookbook_path,
@@ -37,14 +41,10 @@ class Chef
37
41
  :description => "Generate metadata for all cookbooks, rather than just a single cookbook"
38
42
 
39
43
  def run
40
- if config[:cookbook_path]
41
- Chef::Config[:cookbook_path] = config[:cookbook_path]
42
- else
43
- config[:cookbook_path] = Chef::Config[:cookbook_path]
44
- end
44
+ config[:cookbook_path] ||= Chef::Config[:cookbook_path]
45
45
 
46
46
  if config[:all]
47
- cl = Chef::CookbookLoader.new
47
+ cl = Chef::CookbookLoader.new(config[:cookbook_path])
48
48
  cl.each do |cname, cookbook|
49
49
  generate_metadata(cname.to_s)
50
50
  end
@@ -54,29 +54,49 @@ class Chef
54
54
  end
55
55
 
56
56
  def generate_metadata(cookbook)
57
- Chef::Log.info("Generating Metadata")
57
+ ui.info("Generating Metadata")
58
58
  Array(config[:cookbook_path]).reverse.each do |path|
59
59
  file = File.expand_path(File.join(path, cookbook, 'metadata.rb'))
60
- generate_metadata_from_file(cookbook, file)
60
+ if File.exists?(file)
61
+ generate_metadata_from_file(cookbook, file)
62
+ else
63
+ validate_metadata_json(path, cookbook)
64
+ end
61
65
  end
62
66
  end
63
67
 
64
68
  def generate_metadata_from_file(cookbook, file)
65
- if File.exists?(file)
66
- Chef::Log.debug("Generating metadata for #{cookbook} from #{file}")
67
- md = Chef::Cookbook::Metadata.new
68
- md.name(cookbook)
69
- md.from_file(file)
70
- json_file = File.join(File.dirname(file), 'metadata.json')
71
- File.open(json_file, "w") do |f|
72
- f.write(Chef::JSONCompat.to_json_pretty(md))
73
- end
74
- generated = true
75
- Chef::Log.debug("Generated #{json_file}")
76
- else
77
- Chef::Log.debug("No #{file} found; skipping!")
69
+ Chef::Log.debug("Generating metadata for #{cookbook} from #{file}")
70
+ md = Chef::Cookbook::Metadata.new
71
+ md.name(cookbook)
72
+ md.from_file(file)
73
+ json_file = File.join(File.dirname(file), 'metadata.json')
74
+ File.open(json_file, "w") do |f|
75
+ f.write(Chef::JSONCompat.to_json_pretty(md))
78
76
  end
77
+ generated = true
78
+ Chef::Log.debug("Generated #{json_file}")
79
+ rescue Exceptions::ObsoleteDependencySyntax, Exceptions::InvalidVersionConstraint => e
80
+ STDERR.puts "ERROR: The cookbook '#{cookbook}' contains invalid or obsolete metadata syntax."
81
+ STDERR.puts "in #{file}:"
82
+ STDERR.puts
83
+ STDERR.puts e.message
84
+ exit 1
79
85
  end
86
+
87
+ def validate_metadata_json(path, cookbook)
88
+ json_file = File.join(path, cookbook, 'metadata.json')
89
+ if File.exist?(json_file)
90
+ Chef::Cookbook::Metadata.validate_json(IO.read(json_file))
91
+ end
92
+ rescue Exceptions::ObsoleteDependencySyntax, Exceptions::InvalidVersionConstraint => e
93
+ STDERR.puts "ERROR: The cookbook '#{cookbook}' contains invalid or obsolete metadata syntax."
94
+ STDERR.puts "in #{json_file}:"
95
+ STDERR.puts
96
+ STDERR.puts e.message
97
+ exit 1
98
+ end
99
+
80
100
  end
81
101
  end
82
102
  end
@@ -25,6 +25,10 @@ class Chef
25
25
  class Knife
26
26
  class CookbookMetadataFromFile < Knife
27
27
 
28
+ deps do
29
+ require 'chef/cookbook/metadata'
30
+ end
31
+
28
32
  banner "knife cookbook metadata from FILE (options)"
29
33
 
30
34
  def run
@@ -17,13 +17,16 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/json_compat'
21
- require 'uri'
22
20
 
23
21
  class Chef
24
22
  class Knife
25
23
  class CookbookShow < Knife
26
24
 
25
+ deps do
26
+ require 'chef/json_compat'
27
+ require 'uri'
28
+ end
29
+
27
30
  banner "knife cookbook show COOKBOOK [VERSION] [PART] [FILENAME] (options)"
28
31
 
29
32
  option :fqdn,
@@ -41,6 +44,11 @@ class Chef
41
44
  :long => "--platform-version VERSION",
42
45
  :description => "The platform version to see the file for"
43
46
 
47
+ option :with_uri,
48
+ :short => "-w",
49
+ :long => "--with-uri",
50
+ :description => "Show corresponding URIs"
51
+
44
52
  def run
45
53
  case @name_args.length
46
54
  when 4 # We are showing a specific file
@@ -73,11 +81,14 @@ class Chef
73
81
  when 2 # We are showing the whole cookbook data
74
82
  cookbook_version = @name_args[1] == 'latest' ? '_latest' : @name_args[1]
75
83
  output(rest.get_rest("cookbooks/#{@name_args[0]}/#{cookbook_version}"))
76
- when 1 # We are showing the cookbook versions
77
- output(rest.get_rest("cookbooks/#{@name_args[0]}"))
84
+ when 1 # We are showing the cookbook versions (all of them)
85
+ cookbook_name = @name_args[0]
86
+ env = config[:environment]
87
+ api_endpoint = env ? "environments/#{env}/cookbooks/#{cookbook_name}" : "cookbooks/#{cookbook_name}"
88
+ output(format_cookbook_list_for_display(rest.get_rest(api_endpoint)))
78
89
  when 0
79
90
  show_usage
80
- Chef::Log.fatal("You must specify a cookbook name")
91
+ ui.fatal("You must specify a cookbook name")
81
92
  exit 1
82
93
  end
83
94
  end
@@ -41,14 +41,14 @@ class Chef
41
41
 
42
42
  @version = cookbook_data['version']
43
43
 
44
- Chef::Log.info("Downloading #{@name_args[0]} from the cookbooks site at version #{cookbook_data['version']}")
44
+ ui.info("Downloading #{@name_args[0]} from the cookbooks site at version #{cookbook_data['version']}")
45
45
  rest.sign_on_redirect = false
46
46
  tf = rest.get_rest(cookbook_data["file"], true)
47
47
  unless config[:file]
48
48
  config[:file] = File.join(Dir.pwd, "#{@name_args[0]}-#{cookbook_data['version']}.tar.gz")
49
49
  end
50
50
  FileUtils.cp(tf.path, config[:file])
51
- Chef::Log.info("Cookbook saved: #{config[:file]}")
51
+ ui.info("Cookbook saved: #{config[:file]}")
52
52
  end
53
53
 
54
54
  end
@@ -17,13 +17,16 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/cookbook_uploader'
21
- require 'chef/cookbook_site_streaming_uploader'
22
20
 
23
21
  class Chef
24
22
  class Knife
25
23
  class CookbookSiteShare < Knife
26
24
 
25
+ deps do
26
+ require 'chef/cookbook_uploader'
27
+ require 'chef/cookbook_site_streaming_uploader'
28
+ end
29
+
27
30
  banner "knife cookbook site share COOKBOOK CATEGORY (options)"
28
31
  category "cookbook site"
29
32
 
@@ -36,40 +39,42 @@ class Chef
36
39
  def run
37
40
  if @name_args.length < 2
38
41
  show_usage
39
- Chef::Log.fatal("You must specify the cookbook name and the category you want to share this cookbook to.")
42
+ ui.fatal("You must specify the cookbook name and the category you want to share this cookbook to.")
40
43
  exit 1
41
44
  end
42
45
 
46
+ config[:cookbook_path] ||= Chef::Config[:cookbook_path]
47
+
43
48
  cookbook_name = @name_args[0]
44
49
  category = @name_args[1]
45
- cl = Chef::CookbookLoader.new
50
+ cl = Chef::CookbookLoader.new(config[:cookbook_path])
46
51
  if cl.cookbook_exists?(cookbook_name)
47
52
  cookbook = cl[cookbook_name]
48
53
  Chef::CookbookUploader.validate_cookbook(cookbook)
49
54
  tmp_cookbook_dir = Chef::CookbookSiteStreamingUploader.create_build_dir(cookbook)
50
55
  begin
51
56
  Chef::Log.debug("temp cookbook directory is #{tmp_cookbook_dir.inspect}")
52
- Chef::Log.info("Making tarball #{cookbook_name}.tgz")
57
+ ui.info("Making tarball #{cookbook_name}.tgz")
53
58
  Chef::Mixin::Command.run_command(:command => "tar -czf #{cookbook_name}.tgz #{cookbook_name}", :cwd => tmp_cookbook_dir)
54
59
  rescue => e
55
- Chef::Log.error("Error making tarball #{cookbook_name}.tgz: #{e.message}. Set log level to debug (-l debug) for more information.")
60
+ ui.error("Error making tarball #{cookbook_name}.tgz: #{e.message}. Set log level to debug (-l debug) for more information.")
56
61
  Chef::Log.debug("\n#{e.backtrace.join("\n")}")
57
62
  exit(1)
58
63
  end
59
64
 
60
65
  begin
61
66
  do_upload("#{tmp_cookbook_dir}/#{cookbook_name}.tgz", category, Chef::Config[:node_name], Chef::Config[:client_key])
62
- Chef::Log.info("Upload complete!")
67
+ ui.info("Upload complete!")
63
68
  Chef::Log.debug("Removing local staging directory at #{tmp_cookbook_dir}")
64
69
  FileUtils.rm_rf tmp_cookbook_dir
65
70
  rescue => e
66
- Chef::Log.error("Error uploading cookbook #{cookbook_name} to the Opscode Cookbook Site: #{e.message}. Set log level to debug (-l debug) for more information.")
71
+ ui.error("Error uploading cookbook #{cookbook_name} to the Opscode Cookbook Site: #{e.message}. Set log level to debug (-l debug) for more information.")
67
72
  Chef::Log.debug("\n#{e.backtrace.join("\n")}")
68
73
  exit(1)
69
74
  end
70
75
 
71
76
  else
72
- Chef::Log.error("Could not find cookbook #{cookbook_name} in your cookbook path.")
77
+ ui.error("Could not find cookbook #{cookbook_name} in your cookbook path.")
73
78
  exit(1)
74
79
  end
75
80
 
@@ -89,15 +94,15 @@ class Chef
89
94
  if http_resp.code.to_i != 201
90
95
  if res['error_messages']
91
96
  if res['error_messages'][0] =~ /Version already exists/
92
- Chef::Log.error "The same version of this cookbook already exists on the Opscode Cookbook Site."
97
+ ui.error "The same version of this cookbook already exists on the Opscode Cookbook Site."
93
98
  exit(1)
94
99
  else
95
- Chef::Log.error "#{res['error_messages'][0]}"
100
+ ui.error "#{res['error_messages'][0]}"
96
101
  exit(1)
97
102
  end
98
103
  else
99
- Chef::Log.error "Unknown error while sharing cookbook"
100
- Chef::Log.error "Server response: #{http_resp.body}"
104
+ ui.error "Unknown error while sharing cookbook"
105
+ ui.error "Server response: #{http_resp.body}"
101
106
  exit(1)
102
107
  end
103
108
  end