diff options
author | Daniel DeLeo <dan@opscode.com> | 2011-03-22 15:46:51 -0700 |
---|---|---|
committer | Daniel DeLeo <dan@opscode.com> | 2011-03-22 15:46:51 -0700 |
commit | 568861f072ed45523bf3778ca394419ecbe471cc (patch) | |
tree | 3a5554bd36f2000f091a1b04a955944a3c7adcb5 | |
parent | 60d28c312c6dafa4511c064ce290fc1a0cb8e3d2 (diff) | |
parent | a85d7ca5d7d9ca1d3b6fea0296c978ed71454c79 (diff) | |
download | chef-568861f072ed45523bf3778ca394419ecbe471cc.tar.gz |
Merge branch 'CHEF-1319'
-rw-r--r-- | chef/lib/chef/knife/tag_create.rb | 28 | ||||
-rw-r--r-- | chef/lib/chef/knife/tag_delete.rb | 28 | ||||
-rw-r--r-- | chef/lib/chef/knife/tag_list.rb | 26 | ||||
-rw-r--r-- | chef/lib/chef/node.rb | 11 | ||||
-rw-r--r-- | chef/spec/unit/knife/tag_create_spec.rb | 20 | ||||
-rw-r--r-- | chef/spec/unit/knife/tag_delete_spec.rb | 22 | ||||
-rw-r--r-- | chef/spec/unit/knife/tag_list_spec.rb | 23 |
7 files changed, 156 insertions, 2 deletions
diff --git a/chef/lib/chef/knife/tag_create.rb b/chef/lib/chef/knife/tag_create.rb new file mode 100644 index 0000000000..8e439a456a --- /dev/null +++ b/chef/lib/chef/knife/tag_create.rb @@ -0,0 +1,28 @@ +require 'chef/knife' +require 'chef/node' + +class Chef + class Knife + class TagCreate < Knife + + banner "knife tag create NODE TAG ..." + + def run + name = @name_args[0] + tags = @name_args[1..-1].join(",").split(/\s*,\s*/) + + unless name or tags.empty? + show_usage + # TODO: blah blah + Chef::Log.fatal("You must specify a name name") + exit 1 + end + + node = Chef::Node.load name + tags.each do |tag| + node.tags << tag + end + end + end + end +end diff --git a/chef/lib/chef/knife/tag_delete.rb b/chef/lib/chef/knife/tag_delete.rb new file mode 100644 index 0000000000..08ce32be69 --- /dev/null +++ b/chef/lib/chef/knife/tag_delete.rb @@ -0,0 +1,28 @@ +require 'chef/knife' +require 'chef/node' + +class Chef + class Knife + class TagDelete < Knife + + banner "knife tag delete NODE TAG ..." + + def run + name = @name_args[0] + tags = @name_args[1..-1].join(",").split(/\s*,\s*/) + + unless name or tags.empty? + show_usage + # TODO: blah blah + Chef::Log.fatal("You must specify a name name") + exit 1 + end + + node = Chef::Node.load name + tags.each do |tag| + node.tags.delete tag + end + end + end + end +end diff --git a/chef/lib/chef/knife/tag_list.rb b/chef/lib/chef/knife/tag_list.rb new file mode 100644 index 0000000000..e1b87ca6e6 --- /dev/null +++ b/chef/lib/chef/knife/tag_list.rb @@ -0,0 +1,26 @@ +require 'chef/knife' +require 'chef/node' + +class Chef + class Knife + class TagList < Knife + + banner "knife tag list NODE" + + def run + name = @name_args[0] + tags = @name_args[1..-1].join(",").split(/\s*,\s*/) + + unless name or tags.empty? + show_usage + # TODO: blah blah + Chef::Log.fatal("You must specify a name name") + exit 1 + end + + node = Chef::Node.load name + output node.tags + end + end + end +end diff --git a/chef/lib/chef/node.rb b/chef/lib/chef/node.rb index c15d660101..fd8f4d9146 100644 --- a/chef/lib/chef/node.rb +++ b/chef/lib/chef/node.rb @@ -390,7 +390,13 @@ class Chef normal_attrs_to_merge = consume_run_list(attrs) Chef::Log.debug("Applying attributes from json file") @normal_attrs = Chef::Mixin::DeepMerge.merge(@normal_attrs,normal_attrs_to_merge) - self[:tags] = Array.new unless attribute?(:tags) + self.tags # make sure they're defined + end + + # Lazy initializer for tags attribute + def tags + self[:tags] = [] unless attribute?(:tags) + self[:tags] end # Extracts the run list from +attrs+ and applies it. Returns the remaining attributes @@ -429,7 +435,8 @@ class Chef expansion = run_list.expand(chef_environment, data_source) raise Chef::Exceptions::MissingRole if expansion.errors? - self[:tags] = Array.new unless attribute?(:tags) + self.tags # make sure they're defined + @automatic_attrs[:recipes] = expansion.recipes @automatic_attrs[:roles] = expansion.roles diff --git a/chef/spec/unit/knife/tag_create_spec.rb b/chef/spec/unit/knife/tag_create_spec.rb new file mode 100644 index 0000000000..de27553e1c --- /dev/null +++ b/chef/spec/unit/knife/tag_create_spec.rb @@ -0,0 +1,20 @@ +require File.expand_path( "../../../spec_helper", __FILE__ ) + +describe Chef::Knife::TagCreate do + before(:each) do + Chef::Config[:node_name] = "webmonkey.example.com" + @knife = Chef::Knife::TagCreate.new + @knife.name_args = [ Chef::Config[:node_name], "happytag" ] + + @node = Chef::Node.new + @node.stub! :save + Chef::Node.stub!(:load).and_return @node + end + + describe "run" do + it "can create tags on a node" do + @knife.run + @node.tags.should == ["happytag"] + end + end +end diff --git a/chef/spec/unit/knife/tag_delete_spec.rb b/chef/spec/unit/knife/tag_delete_spec.rb new file mode 100644 index 0000000000..2510f38140 --- /dev/null +++ b/chef/spec/unit/knife/tag_delete_spec.rb @@ -0,0 +1,22 @@ +require File.expand_path( "../../../spec_helper", __FILE__ ) + +describe Chef::Knife::TagDelete do + before(:each) do + Chef::Config[:node_name] = "webmonkey.example.com" + @knife = Chef::Knife::TagDelete.new + @knife.name_args = [ Chef::Config[:node_name], "sadtag" ] + + @node = Chef::Node.new + @node.stub! :save + @node.tags << "sadtag" << "happytag" + Chef::Node.stub!(:load).and_return @node + end + + describe "run" do + it "can delete tags on a node" do + @node.tags.should == ["sadtag", "happytag"] + @knife.run + @node.tags.should == ["happytag"] + end + end +end diff --git a/chef/spec/unit/knife/tag_list_spec.rb b/chef/spec/unit/knife/tag_list_spec.rb new file mode 100644 index 0000000000..a07d62d7b7 --- /dev/null +++ b/chef/spec/unit/knife/tag_list_spec.rb @@ -0,0 +1,23 @@ +require File.expand_path( "../../../spec_helper", __FILE__ ) + +describe Chef::Knife::TagList do + before(:each) do + Chef::Config[:node_name] = "webmonkey.example.com" + @knife = Chef::Knife::TagList.new + @knife.name_args = [ Chef::Config[:node_name], "sadtag" ] + + @node = Chef::Node.new + @node.stub! :save + @node.tags << "sadtag" << "happytag" + Chef::Node.stub!(:load).and_return @node + end + + describe "run" do + it "can list tags on a node" do + expected = %w(sadtag happytag) + @node.tags.should == expected + @knife.should_receive(:output).with(expected) + @knife.run + end + end +end |