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
@@ -0,0 +1,42 @@
1
+ #
2
+ # Author:: Stephen Delano (<stephen@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class EnvironmentList < Knife
24
+
25
+ deps do
26
+ require 'chef/environment'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife environment list (options)"
31
+
32
+ option :with_uri,
33
+ :short => "-w",
34
+ :long => "--with-uri",
35
+ :description => "Show corresponding URIs"
36
+
37
+ def run
38
+ output(format_list_for_display(Chef::Environment.list))
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,46 @@
1
+ #
2
+ # Author:: Stephen Delano (<stephen@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class EnvironmentShow < Knife
24
+
25
+ deps do
26
+ require 'chef/environment'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife environment show ENVIRONMENT (options)"
31
+
32
+ def run
33
+ env_name = @name_args[0]
34
+
35
+ if env_name.nil?
36
+ show_usage
37
+ ui.fatal("You must specify an environment name")
38
+ exit 1
39
+ end
40
+
41
+ env = Chef::Environment.load(env_name)
42
+ output(format_for_display(env))
43
+ end
44
+ end
45
+ end
46
+ end
@@ -27,7 +27,7 @@ class Chef::Knife::Exec < Chef::Knife
27
27
  :long => "--exec CODE",
28
28
  :description => "a string of Chef code to execute"
29
29
 
30
- def late_load_deps
30
+ deps do
31
31
  require 'chef/shef/ext'
32
32
  end
33
33
 
@@ -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.
@@ -17,24 +17,23 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'pp'
21
20
 
22
21
  class Chef
23
22
  class Knife
24
23
  class IndexRebuild < Knife
25
-
24
+
26
25
  banner "knife index rebuild (options)"
27
26
  option :yes,
28
27
  :short => "-y",
29
28
  :long => "--yes",
30
29
  :boolean => true,
31
30
  :description => "don't bother to ask if I'm sure"
32
-
31
+
33
32
  def run
34
33
  nag
35
34
  output rest.post_rest("/search/reindex", {})
36
35
  end
37
-
36
+
38
37
  def nag
39
38
  unless config[:yes]
40
39
  yea_or_nay = ask_question("This operation is destructive. Rebuilding the index may take some time. You sure? (yes/no): ")
@@ -42,10 +41,10 @@ class Chef
42
41
  puts "aborting"
43
42
  exit 7
44
43
  end
45
- end
44
+ end
46
45
  end
47
-
48
-
46
+
47
+
49
48
  end
50
49
  end
51
50
  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.
@@ -17,18 +17,21 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/node'
21
- require 'chef/json_compat'
22
20
 
23
21
  class Chef
24
22
  class Knife
25
23
  class NodeBulkDelete < Knife
26
24
 
25
+ deps do
26
+ require 'chef/node'
27
+ require 'chef/json_compat'
28
+ end
29
+
27
30
  banner "knife node bulk delete REGEX (options)"
28
31
 
29
- def run
32
+ def run
30
33
  if @name_args.length < 1
31
- Chef::Log.fatal("You must supply a regular expression to match the results against")
34
+ ui.fatal("You must supply a regular expression to match the results against")
32
35
  exit 42
33
36
  else
34
37
  bulk_delete(Chef::Node, "node", nil, nil, @name_args[0])
@@ -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.
@@ -17,13 +17,16 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/node'
21
- require 'chef/json_compat'
22
20
 
23
21
  class Chef
24
22
  class Knife
25
23
  class NodeCreate < Knife
26
24
 
25
+ deps do
26
+ require 'chef/node'
27
+ require 'chef/json_compat'
28
+ end
29
+
27
30
  banner "knife node create NODE (options)"
28
31
 
29
32
  def run
@@ -31,10 +34,10 @@ class Chef
31
34
 
32
35
  if @node_name.nil?
33
36
  show_usage
34
- Chef::Log.fatal("You must specify a node name")
37
+ ui.fatal("You must specify a node name")
35
38
  exit 1
36
39
  end
37
-
40
+
38
41
  node = Chef::Node.new
39
42
  node.name(@node_name)
40
43
  create_object(node)
@@ -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.
@@ -17,24 +17,27 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/node'
21
- require 'chef/json_compat'
22
20
 
23
21
  class Chef
24
22
  class Knife
25
23
  class NodeDelete < Knife
26
24
 
25
+ deps do
26
+ require 'chef/node'
27
+ require 'chef/json_compat'
28
+ end
29
+
27
30
  banner "knife node delete NODE (options)"
28
31
 
29
- def run
32
+ def run
30
33
  @node_name = @name_args[0]
31
34
 
32
35
  if @node_name.nil?
33
36
  show_usage
34
- Chef::Log.fatal("You must specify a node name")
37
+ ui.fatal("You must specify a node name")
35
38
  exit 1
36
39
  end
37
-
40
+
38
41
  delete_object(Chef::Node, @node_name)
39
42
  end
40
43
 
@@ -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.
@@ -17,25 +17,144 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/node'
21
- require 'chef/json_compat'
22
20
 
23
21
  class Chef
24
22
  class Knife
23
+
24
+ module NodeEditController
25
+ def edit_node
26
+ abort "You specified the --no-editor option, nothing to edit" if config[:no_editor]
27
+ assert_editor_set!
28
+
29
+ updated_node_data = edit_data(view)
30
+ apply_updates(updated_node_data)
31
+ @updated_node
32
+ end
33
+
34
+ def view
35
+ result = {}
36
+ result["name"] = node.name
37
+ result["chef_environment"] = node.chef_environment
38
+ result["normal"] = node.normal_attrs
39
+ result["run_list"] = node.run_list
40
+
41
+ if config[:all_attributes]
42
+ result["default"] = node.default_attrs
43
+ result["override"] = node.override_attrs
44
+ result["automatic"] = node.automatic_attrs
45
+ end
46
+ Chef::JSONCompat.to_json_pretty(result)
47
+ end
48
+
49
+ def edit_data(text)
50
+ edited_data = tempfile_for(text) {|filename| system("#{config[:editor]} #{filename}")}
51
+ Chef::JSONCompat.from_json(edited_data)
52
+ end
53
+
54
+ def apply_updates(updated_data)
55
+ # TODO: should warn/error/ask for confirmation when changing the
56
+ # name, since this results in a new node, not an edited node.
57
+ @updated_node = Node.new.tap do |n|
58
+ n.name( updated_data["name"] )
59
+ n.chef_environment( updated_data["chef_environment"] )
60
+ n.run_list( updated_data["run_list"])
61
+ n.normal_attrs = updated_data["normal"]
62
+
63
+ if config[:all_attributes]
64
+ n.default_attrs = updated_data["default"]
65
+ n.override_attrs = updated_data["override"]
66
+ n.automatic_attrs = updated_data["automatic"]
67
+ else
68
+ n.default_attrs = node.default_attrs
69
+ n.override_attrs = node.override_attrs
70
+ n.automatic_attrs = node.automatic_attrs
71
+ end
72
+ end
73
+ end
74
+
75
+ def updated?
76
+ pristine_copy = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(node), :create_additions => false)
77
+ updated_copy = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(@updated_node), :create_additions => false)
78
+ unless pristine_copy == updated_copy
79
+ updated_properties = %w{name normal chef_environment run_list default override automatic}.reject do |key|
80
+ pristine_copy[key] == updated_copy[key]
81
+ end
82
+ end
83
+ ( pristine_copy != updated_copy ) && updated_properties
84
+ end
85
+
86
+ private
87
+
88
+ def abort(message)
89
+ STDERR.puts("ERROR: #{message}")
90
+ exit 1
91
+ end
92
+
93
+ def assert_editor_set!
94
+ unless config[:editor]
95
+ abort "You must set your EDITOR environment variable or configure your editor via knife.rb"
96
+ end
97
+ end
98
+
99
+ def tempfile_for(data)
100
+ # TODO: include useful info like the node name in the temp file
101
+ # name
102
+ basename = "knife-edit-" << rand(1_000_000_000_000_000).to_s.rjust(15, '0') << '.js'
103
+ filename = File.join(Dir.tmpdir, basename)
104
+ File.open(filename, "w+") do |f|
105
+ f.sync = true
106
+ f.puts data
107
+ end
108
+
109
+ yield filename
110
+
111
+ IO.read(filename)
112
+ ensure
113
+ File.unlink(filename)
114
+ end
115
+ end
116
+
25
117
  class NodeEdit < Knife
118
+ include NodeEditController
119
+
120
+ deps do
121
+ require 'chef/node'
122
+ require 'chef/json_compat'
123
+ end
124
+
125
+ attr_reader :node_name
126
+ attr_reader :node
26
127
 
27
128
  banner "knife node edit NODE (options)"
28
129
 
29
- def run
30
- @node_name = @name_args[0]
130
+ option :all_attributes,
131
+ :short => "-a",
132
+ :long => "--all",
133
+ :boolean => true,
134
+ :description => "Display all attributes when editing"
135
+
136
+ def run
137
+ node_name = @name_args[0]
31
138
 
32
- if @node_name.nil?
139
+ if node_name.nil?
33
140
  show_usage
34
- Chef::Log.fatal("You must specify a node name")
141
+ ui.fatal("You must specify a node name")
35
142
  exit 1
36
143
  end
37
-
38
- edit_object(Chef::Node, @node_name)
144
+
145
+ load_node(node_name)
146
+ updated_node = edit_node
147
+ if updated_values = updated?
148
+ ui.info "Saving updated #{updated_values.join(', ')} on node #{node.name}"
149
+ updated_node.save
150
+ else
151
+ ui.info "Node not updated, skipping node save"
152
+ end
153
+ end
154
+
155
+ def load_node(node_name)
156
+ @node = Chef::Node.load(node_name)
157
+ # TODO: rescue errors with a helpful message
39
158
  end
40
159
  end
41
160
  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.
@@ -17,23 +17,26 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
- require 'chef/node'
21
- require 'chef/json_compat'
22
20
 
23
21
  class Chef
24
22
  class Knife
25
23
  class NodeFromFile < Knife
26
24
 
25
+ deps do
26
+ require 'chef/node'
27
+ require 'chef/json_compat'
28
+ end
29
+
27
30
  banner "knife node from file FILE (options)"
28
31
 
29
- def run
32
+ def run
30
33
  updated = load_from_file(Chef::Node, @name_args[0])
31
34
 
32
35
  updated.save
33
-
36
+
34
37
  output(format_for_display(updated)) if config[:print_after]
35
38
 
36
- Chef::Log.info("Updated Node #{updated.name}!")
39
+ ui.info("Updated Node #{updated.name}!")
37
40
  end
38
41
 
39
42
  end