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.
- data/README.rdoc +0 -3
- data/distro/arch/etc/rc.d/chef-server +0 -4
- data/distro/arch/etc/rc.d/chef-server-webui +0 -4
- data/distro/arch/etc/rc.d/chef-solr +0 -4
- data/distro/arch/etc/rc.d/chef-solr-indexer +0 -4
- data/lib/chef.rb +3 -3
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/application.rb +11 -1
- data/lib/chef/application/client.rb +18 -22
- data/lib/chef/application/knife.rb +28 -29
- data/lib/chef/application/solo.rb +14 -12
- data/lib/chef/client.rb +112 -54
- data/lib/chef/config.rb +4 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +6 -5
- data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +10 -8
- data/lib/chef/cookbook/metadata.rb +200 -108
- data/lib/chef/cookbook_loader.rb +39 -163
- data/lib/chef/cookbook_uploader.rb +100 -78
- data/lib/chef/cookbook_version.rb +92 -47
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +9 -1
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +82 -1
- data/lib/chef/index_queue/amqp_client.rb +15 -12
- data/lib/chef/index_queue/indexable.rb +38 -4
- data/lib/chef/json_compat.rb +3 -3
- data/lib/chef/knife.rb +97 -202
- data/lib/chef/knife/bootstrap.rb +27 -61
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +4 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +6 -15
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -4
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -5
- data/lib/chef/knife/client_bulk_delete.rb +6 -3
- data/lib/chef/knife/client_create.rb +13 -10
- data/lib/chef/knife/client_delete.rb +10 -7
- data/lib/chef/knife/client_edit.rb +9 -6
- data/lib/chef/knife/client_list.rb +8 -5
- data/lib/chef/knife/client_reregister.rb +9 -6
- data/lib/chef/knife/client_show.rb +9 -6
- data/lib/chef/knife/configure.rb +15 -19
- data/lib/chef/knife/configure_client.rb +4 -4
- data/lib/chef/knife/cookbook_bulk_delete.rb +11 -8
- data/lib/chef/knife/cookbook_create.rb +120 -55
- data/lib/chef/knife/cookbook_delete.rb +18 -12
- data/lib/chef/knife/cookbook_download.rb +10 -6
- data/lib/chef/knife/cookbook_list.rb +15 -6
- data/lib/chef/knife/cookbook_metadata.rb +41 -21
- data/lib/chef/knife/cookbook_metadata_from_file.rb +4 -0
- data/lib/chef/knife/cookbook_show.rb +16 -5
- data/lib/chef/knife/cookbook_site_download.rb +2 -2
- data/lib/chef/knife/cookbook_site_share.rb +18 -13
- data/lib/chef/knife/cookbook_site_unshare.rb +7 -4
- data/lib/chef/knife/cookbook_site_vendor.rb +21 -18
- data/lib/chef/knife/cookbook_test.rb +14 -14
- data/lib/chef/knife/cookbook_upload.rb +91 -40
- data/lib/chef/knife/data_bag_create.rb +41 -6
- data/lib/chef/knife/data_bag_delete.rb +5 -3
- data/lib/chef/knife/data_bag_edit.rb +55 -11
- data/lib/chef/knife/data_bag_from_file.rb +47 -7
- data/lib/chef/knife/data_bag_list.rb +4 -1
- data/lib/chef/knife/data_bag_show.rb +44 -4
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +39 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +1 -1
- data/lib/chef/knife/index_rebuild.rb +8 -9
- data/lib/chef/knife/node_bulk_delete.rb +9 -6
- data/lib/chef/knife/node_create.rb +9 -6
- data/lib/chef/knife/node_delete.rb +10 -7
- data/lib/chef/knife/node_edit.rb +129 -10
- data/lib/chef/knife/node_from_file.rb +10 -7
- data/lib/chef/knife/node_list.rb +11 -6
- data/lib/chef/knife/node_run_list_add.rb +10 -7
- data/lib/chef/knife/node_run_list_remove.rb +9 -6
- data/lib/chef/knife/node_show.rb +15 -7
- data/lib/chef/knife/recipe_list.rb +4 -3
- data/lib/chef/knife/role_bulk_delete.rb +9 -6
- data/lib/chef/knife/role_create.rb +9 -6
- data/lib/chef/knife/role_delete.rb +10 -7
- data/lib/chef/knife/role_edit.rb +11 -8
- data/lib/chef/knife/role_from_file.rb +10 -7
- data/lib/chef/knife/role_list.rb +8 -5
- data/lib/chef/knife/role_show.rb +11 -8
- data/lib/chef/knife/search.rb +33 -10
- data/lib/chef/knife/ssh.rb +33 -61
- data/lib/chef/knife/status.rb +7 -4
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +229 -0
- data/lib/chef/knife/windows_bootstrap.rb +8 -5
- data/lib/chef/log.rb +5 -59
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixins.rb +1 -2
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +96 -34
- data/lib/chef/platform.rb +27 -0
- data/lib/chef/provider/cookbook_file.rb +21 -20
- data/lib/chef/provider/deploy/revision.rb +3 -0
- data/lib/chef/provider/file.rb +20 -11
- data/lib/chef/provider/git.rb +26 -26
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/groupadd.rb +7 -4
- data/lib/chef/provider/group/usermod.rb +1 -1
- data/lib/chef/provider/package.rb +28 -28
- data/lib/chef/provider/package/dpkg.rb +1 -1
- data/lib/chef/provider/package/portage.rb +50 -39
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/zypper.rb +3 -20
- data/lib/chef/provider/remote_directory.rb +0 -2
- data/lib/chef/provider/remote_file.rb +2 -3
- data/lib/chef/provider/service/arch.rb +28 -35
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/subversion.rb +22 -22
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +10 -12
- data/lib/chef/resource.rb +49 -42
- data/lib/chef/resource/gem_package.rb +7 -3
- data/lib/chef/resource/git.rb +5 -5
- data/lib/chef/resource/package.rb +7 -7
- data/lib/chef/resource/scm.rb +2 -1
- data/lib/chef/resource/solaris_package.rb +0 -1
- data/lib/chef/resource/yum_package.rb +0 -1
- data/lib/chef/rest.rb +7 -16
- data/lib/chef/rest/rest_request.rb +0 -16
- data/lib/chef/role.rb +67 -13
- data/lib/chef/run_context.rb +37 -21
- data/lib/chef/run_list.rb +30 -15
- data/lib/chef/run_list/run_list_expansion.rb +41 -20
- data/lib/chef/run_list/run_list_item.rb +20 -6
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/runner.rb +7 -15
- data/lib/chef/search/query.rb +12 -7
- data/lib/chef/shef.rb +6 -7
- data/lib/chef/shef/shef_session.rb +40 -35
- data/lib/chef/shell_out.rb +22 -201
- data/lib/chef/shell_out/unix.rb +224 -0
- data/lib/chef/shell_out/windows.rb +95 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +145 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +118 -0
- data/lib/chef/version.rb +4 -2
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- metadata +68 -37
- data/lib/chef/cookbook/metadata/version.rb +0 -87
- data/lib/chef/knife/bluebox_images_list.rb +0 -54
- data/lib/chef/knife/bluebox_server_create.rb +0 -157
- data/lib/chef/knife/bluebox_server_delete.rb +0 -63
- data/lib/chef/knife/bluebox_server_list.rb +0 -59
- data/lib/chef/knife/ec2_instance_data.rb +0 -46
- data/lib/chef/knife/ec2_server_create.rb +0 -218
- data/lib/chef/knife/ec2_server_delete.rb +0 -87
- data/lib/chef/knife/ec2_server_list.rb +0 -89
- data/lib/chef/knife/rackspace_server_create.rb +0 -184
- data/lib/chef/knife/rackspace_server_delete.rb +0 -57
- data/lib/chef/knife/rackspace_server_list.rb +0 -59
- data/lib/chef/knife/slicehost_images_list.rb +0 -53
- data/lib/chef/knife/slicehost_server_create.rb +0 -103
- data/lib/chef/knife/slicehost_server_delete.rb +0 -61
- data/lib/chef/knife/slicehost_server_list.rb +0 -64
- data/lib/chef/knife/terremark_server_create.rb +0 -152
- data/lib/chef/knife/terremark_server_delete.rb +0 -87
- data/lib/chef/knife/terremark_server_list.rb +0 -77
- 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
|
data/lib/chef/knife/exec.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
data/lib/chef/knife/node_edit.rb
CHANGED
|
@@ -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
|
-
|
|
30
|
-
|
|
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
|
|
139
|
+
if node_name.nil?
|
|
33
140
|
show_usage
|
|
34
|
-
|
|
141
|
+
ui.fatal("You must specify a node name")
|
|
35
142
|
exit 1
|
|
36
143
|
end
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
39
|
+
ui.info("Updated Node #{updated.name}!")
|
|
37
40
|
end
|
|
38
41
|
|
|
39
42
|
end
|