summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Wolfe <jes5199@gmail.com>2010-01-21 17:16:38 -0800
committertest branch <puppet-dev@googlegroups.com>2010-02-17 06:50:53 -0800
commit9acd0b2b6d83881dc529c117637aff63a6c44f8d (patch)
tree99d1d7939f2cb032d555717d8a90d32719f96691 /lib
parentb581c2348e784ce5d857a4c1c0686399b87cc13f (diff)
downloadpuppet-9acd0b2b6d83881dc529c117637aff63a6c44f8d.tar.gz
puppet-9acd0b2b6d83881dc529c117637aff63a6c44f8d.tar.xz
puppet-9acd0b2b6d83881dc529c117637aff63a6c44f8d.zip
Feature #3115 REST-ified status()
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. plus tests suggested by Brice. Signed-off-by: Jesse Wolfe <jes5199@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet.rb1
-rw-r--r--lib/puppet/indirector/status.rb3
-rw-r--r--lib/puppet/indirector/status/local.rb7
-rw-r--r--lib/puppet/indirector/status/rest.rb5
-rw-r--r--lib/puppet/network/http/api/v1.rb10
-rw-r--r--lib/puppet/network/rest_authconfig.rb1
-rw-r--r--lib/puppet/status.rb20
7 files changed, 46 insertions, 1 deletions
diff --git a/lib/puppet.rb b/lib/puppet.rb
index f53e664be..1fa51c3b4 100644
--- a/lib/puppet.rb
+++ b/lib/puppet.rb
@@ -156,6 +156,7 @@ require 'puppet/network'
require 'puppet/ssl'
require 'puppet/module'
require 'puppet/util/storage'
+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 000000000..f40bbc4d8
--- /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 000000000..377be89df
--- /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 000000000..22e70429b
--- /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 13df7c3d0..6a5ff156a 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 635ed1b8d..01ed412cd 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 000000000..f587a5a2a
--- /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