summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel DeLeo <dan@opscode.com>2011-03-22 15:46:51 -0700
committerDaniel DeLeo <dan@opscode.com>2011-03-22 15:46:51 -0700
commit568861f072ed45523bf3778ca394419ecbe471cc (patch)
tree3a5554bd36f2000f091a1b04a955944a3c7adcb5
parent60d28c312c6dafa4511c064ce290fc1a0cb8e3d2 (diff)
parenta85d7ca5d7d9ca1d3b6fea0296c978ed71454c79 (diff)
downloadchef-568861f072ed45523bf3778ca394419ecbe471cc.tar.gz
Merge branch 'CHEF-1319'
-rw-r--r--chef/lib/chef/knife/tag_create.rb28
-rw-r--r--chef/lib/chef/knife/tag_delete.rb28
-rw-r--r--chef/lib/chef/knife/tag_list.rb26
-rw-r--r--chef/lib/chef/node.rb11
-rw-r--r--chef/spec/unit/knife/tag_create_spec.rb20
-rw-r--r--chef/spec/unit/knife/tag_delete_spec.rb22
-rw-r--r--chef/spec/unit/knife/tag_list_spec.rb23
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