summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuke Kanies <luke@puppetlabs.com>2011-04-12 21:41:06 -0700
committerLuke Kanies <luke@puppetlabs.com>2011-07-15 11:16:06 -0700
commitf4acb025f3a125d4c3c359fb6896ac20b36e06ab (patch)
tree8523e88922841e997d0006906232e13fa6e043a1
parent1cbe2ad70eddbf00ef2d3127a9ffcc9f220ee277 (diff)
downloadpuppet-f4acb025f3a125d4c3c359fb6896ac20b36e06ab.tar.gz
puppet-f4acb025f3a125d4c3c359fb6896ac20b36e06ab.tar.xz
puppet-f4acb025f3a125d4c3c359fb6896ac20b36e06ab.zip
Adding json support to Puppet::Node
Reviewed-by: Daniel Pittman <daniel@puppetlabs.com> Reviewed-by: Nick Lewis <nick@puppetlabs.com> Signed-off-by: Luke Kanies <luke@puppetlabs.com>
-rw-r--r--lib/puppet/node.rb23
-rwxr-xr-xspec/unit/node_spec.rb63
2 files changed, 86 insertions, 0 deletions
diff --git a/lib/puppet/node.rb b/lib/puppet/node.rb
index 5b0a98615..4bd4d1de6 100644
--- a/lib/puppet/node.rb
+++ b/lib/puppet/node.rb
@@ -20,6 +20,29 @@ class Puppet::Node
attr_accessor :name, :classes, :source, :ipaddress, :parameters
attr_reader :time
+ def self.from_pson(pson)
+ raise ArgumentError, "No name provided in pson data" unless name = pson['name']
+
+ node = new(name)
+ node.classes = pson['classes']
+ node.parameters = pson['parameters']
+ node.environment = pson['environment']
+ node
+ end
+
+ def to_pson(*args)
+ result = {
+ 'document_type' => "Puppet::Node",
+ 'data' => {}
+ }
+ result['data']['name'] = name
+ result['data']['classes'] = classes unless classes.empty?
+ result['data']['parameters'] = parameters unless parameters.empty?
+ result['data']['environment'] = environment.name
+
+ result.to_pson(*args)
+ end
+
def environment
return super if @environment
diff --git a/spec/unit/node_spec.rb b/spec/unit/node_spec.rb
index c15093d90..ae71046f0 100755
--- a/spec/unit/node_spec.rb
+++ b/spec/unit/node_spec.rb
@@ -36,6 +36,69 @@ describe Puppet::Node do
node.environment.name.should == :bar
end
end
+
+ describe "when converting to json" do
+ before do
+ @node = Puppet::Node.new("mynode")
+ end
+
+ it "should provide its name" do
+ PSON.parse(@node.to_pson)['data']['name'].should == "mynode"
+ end
+
+ it "should include the classes if set" do
+ @node.classes = %w{a b c}
+ PSON.parse(@node.to_pson)['data']['classes'].should == %w{a b c}
+ end
+
+ it "should not include the classes if there are none" do
+ PSON.parse(@node.to_pson)['data'].should_not be_include('classes')
+ end
+
+ it "should include parameters if set" do
+ @node.parameters = {"a" => "b", "c" => "d"}
+ PSON.parse(@node.to_pson)['data']['parameters'].should == {"a" => "b", "c" => "d"}
+ end
+
+ it "should not include the parameters if there are none" do
+ PSON.parse(@node.to_pson)['data'].should_not be_include('parameters')
+ end
+
+ it "should include the environment" do
+ @node.environment = "production"
+ PSON.parse(@node.to_pson)['data']['environment'].should == "production"
+ end
+ end
+
+ describe "when converting from json" do
+ before do
+ @node = Puppet::Node.new("mynode")
+ @format = Puppet::Network::FormatHandler.format('pson')
+ end
+
+ def from_json(json)
+ @format.intern(Puppet::Node, json)
+ end
+
+ it "should set its name" do
+ from_json(@node.to_pson).name.should == "mynode"
+ end
+
+ it "should include the classes if set" do
+ @node.classes = %w{a b c}
+ from_json(@node.to_pson).classes.should == %w{a b c}
+ end
+
+ it "should include parameters if set" do
+ @node.parameters = {"a" => "b", "c" => "d"}
+ from_json(@node.to_pson).parameters.should == {"a" => "b", "c" => "d"}
+ end
+
+ it "should include the environment" do
+ @node.environment = "production"
+ from_json(@node.to_pson).environment.name.should == :production
+ end
+ end
end
describe Puppet::Node, "when initializing" do