This patch re-implements the status() remote procedure as a REST interface.

A running server returns key-value pairs, currently the only implemented
key is "is_alive" which will always be set to true.

Some future tool will consume this by:
Puppet::Status.indirection.terminus_class = :rest
Puppet::Status.find('https://puppet:8140/production/status/default')

Now with unit tests.
plus fixes a typo.
plus integration test and default security setting.

Signed-off-by: Jesse Wolfe <[email protected]>
---
 lib/puppet.rb                         |    1 +
 lib/puppet/indirector/status.rb       |    3 +++
 lib/puppet/indirector/status/local.rb |    7 +++++++
 lib/puppet/indirector/status/rest.rb  |    5 +++++
 lib/puppet/network/http/api/v1.rb     |   10 +++++++++-
 lib/puppet/network/rest_authconfig.rb |    1 +
 lib/puppet/status.rb                  |   20 ++++++++++++++++++++
 spec/integration/bin/puppetmasterd.rb |   12 +++++++++++-
 spec/unit/status.rb                   |   23 +++++++++++++++++++++++
 9 files changed, 80 insertions(+), 2 deletions(-)
 create mode 100644 lib/puppet/indirector/status.rb
 create mode 100644 lib/puppet/indirector/status/local.rb
 create mode 100644 lib/puppet/indirector/status/rest.rb
 create mode 100644 lib/puppet/status.rb
 create mode 100644 spec/unit/status.rb

diff --git a/lib/puppet.rb b/lib/puppet.rb
index a78853a..8fe7853 100644
--- a/lib/puppet.rb
+++ b/lib/puppet.rb
@@ -171,6 +171,7 @@ require 'puppet/ssl'
 require 'puppet/module'
 require 'puppet/util/storage'
 require 'puppet/parser/interpreter'
+require 'puppet/status'
 
 if Puppet[:storeconfigs]
     require 'puppet/rails'
diff --git a/lib/puppet/indirector/status.rb b/lib/puppet/indirector/status.rb
new file mode 100644
index 0000000..f40bbc4
--- /dev/null
+++ b/lib/puppet/indirector/status.rb
@@ -0,0 +1,3 @@
+# A stub class, so our constants work.
+class Puppet::Indirector::Status
+end
diff --git a/lib/puppet/indirector/status/local.rb 
b/lib/puppet/indirector/status/local.rb
new file mode 100644
index 0000000..377be89
--- /dev/null
+++ b/lib/puppet/indirector/status/local.rb
@@ -0,0 +1,7 @@
+require 'puppet/indirector/status'
+
+class Puppet::Indirector::Status::Local < Puppet::Indirector::Code
+    def find( *anything )
+        return model.new
+    end
+end
diff --git a/lib/puppet/indirector/status/rest.rb 
b/lib/puppet/indirector/status/rest.rb
new file mode 100644
index 0000000..22e7042
--- /dev/null
+++ b/lib/puppet/indirector/status/rest.rb
@@ -0,0 +1,5 @@
+require 'puppet/indirector/status'
+require 'puppet/indirector/rest'
+
+class Puppet::Indirector::Status::Rest < Puppet::Indirector::REST
+end
diff --git a/lib/puppet/network/http/api/v1.rb 
b/lib/puppet/network/http/api/v1.rb
index 13df7c3..6a5ff15 100644
--- a/lib/puppet/network/http/api/v1.rb
+++ b/lib/puppet/network/http/api/v1.rb
@@ -34,7 +34,7 @@ module Puppet::Network::HTTP::API::V1
     end
 
     def indirection2uri(request)
-        indirection = request.method == :search ? 
request.indirection_name.to_s + "s" : request.indirection_name.to_s
+        indirection = request.method == :search ? 
pluralize(request.indirection_name.to_s) : request.indirection_name.to_s
         
"/#{request.environment.to_s}/#{indirection}/#{request.escaped_key}#{request.query_string}"
     end
 
@@ -50,12 +50,20 @@ module Puppet::Network::HTTP::API::V1
         return method
     end
 
+    def pluralize(indirection)
+        return "statuses" if indirection == "status"
+        return indirection + "s"
+    end
+
     def plurality(indirection)
         # NOTE This specific hook for facts is ridiculous, but it's a 
*many*-line
         # fix to not need this, and our goal is to move away from the 
complication
         # that leads to the fix being too long.
         return :singular if indirection == "facts"
 
+        # "status" really is singular
+        return :singular if indirection == "status"
+
         result = (indirection =~ /s$/) ? :plural : :singular
 
         indirection.sub!(/s$/, '') if result
diff --git a/lib/puppet/network/rest_authconfig.rb 
b/lib/puppet/network/rest_authconfig.rb
index 635ed1b..01ed412 100644
--- a/lib/puppet/network/rest_authconfig.rb
+++ b/lib/puppet/network/rest_authconfig.rb
@@ -15,6 +15,7 @@ module Puppet
             { :acl => "/certificate/ca", :method => :find, :authenticated => 
false },
             { :acl => "/certificate/", :method => :find, :authenticated => 
false },
             { :acl => "/certificate_request", :method => [:find, :save], 
:authenticated => false },
+            { :acl => "/status", :method => [:find], :authenticated => true },
         ]
 
         def self.main
diff --git a/lib/puppet/status.rb b/lib/puppet/status.rb
new file mode 100644
index 0000000..f587a5a
--- /dev/null
+++ b/lib/puppet/status.rb
@@ -0,0 +1,20 @@
+require 'puppet/indirector'
+
+class Puppet::Status
+    extend Puppet::Indirector
+    indirects :status, :terminus_class => :local
+
+    attr :status, true
+
+    def initialize( status = nil )
+        @status = status || {"is_alive" => true}
+    end
+
+    def to_pson
+        @status.to_pson
+    end
+
+    def self.from_pson( pson )
+        self.new( pson )
+    end
+end
diff --git a/spec/integration/bin/puppetmasterd.rb 
b/spec/integration/bin/puppetmasterd.rb
index f1d77ef..45504c4 100755
--- a/spec/integration/bin/puppetmasterd.rb
+++ b/spec/integration/bin/puppetmasterd.rb
@@ -85,7 +85,17 @@ describe "puppetmasterd" do
         FileTest.exist?(@pidfile).should be_true
     end
 
-    it "should be serving status information over REST"
+    it "should be serving status information over REST" do
+        start
+        sleep 6
+
+        Puppet::Status.indirection.terminus_class = :rest
+        status = 
Puppet::Status.find("https://localhost:#{@@port}/production/status/default";)
+
+        status.status["is_alive"].should == true
+
+        Puppet::Status.indirection.terminus_class = :local
+    end
 
     it "should be serving status information over xmlrpc" do
         start
diff --git a/spec/unit/status.rb b/spec/unit/status.rb
new file mode 100644
index 0000000..b13b246
--- /dev/null
+++ b/spec/unit/status.rb
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe Puppet::Status do
+    it "should implement find" do
+        Puppet::Status.find( :default ).should be_is_a(Puppet::Status)
+        Puppet::Status.find( :default ).status["is_alive"].should == true
+    end
+
+    it "should default to is_alive is true" do
+        Puppet::Status.new.status["is_alive"].should == true
+    end
+
+    it "should return a pson hash" do
+        Puppet::Status.new.status.to_pson.should == '{"is_alive":true}'
+    end
+
+    it "should accept a hash from pson" do
+        status = Puppet::Status.new( { "is_alive" => false } )
+        status.status.should == { "is_alive" => false }
+    end
+end
-- 
1.6.3.3

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to