On Tue, 20 Dec 2011 14:33:30 -0500, Mo Morsi <mmorsi(a)redhat.com> wrote:
---
.../aeolus/lib/puppet/provider/web_request/curl.rb | 38 ++++++++++++++++++++
recipes/aeolus/lib/puppet/type/web_request.rb | 9 +++++
recipes/aeolus/manifests/conductor.pp | 2 +
3 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/recipes/aeolus/lib/puppet/provider/web_request/curl.rb
b/recipes/aeolus/lib/puppet/provider/web_request/curl.rb
index a857b36..15bef89 100644
--- a/recipes/aeolus/lib/puppet/provider/web_request/curl.rb
+++ b/recipes/aeolus/lib/puppet/provider/web_request/curl.rb
@@ -150,6 +150,7 @@ Puppet::Type.type(:web_request).provide :curl do
# Helper to process/parse web parameters
def process_params(request_method, params, uri)
begin
+ error = nil
cookies = nil
if params[:store_cookies_at]
FileUtils.touch(params[:store_cookies_at]) if
!File.exist?(params[:store_cookies_at])
@@ -169,17 +170,27 @@ Puppet::Type.type(:web_request).provide :curl do
:follow => params[:follow],
:username => params[:username],
:password => params[:password])
+
+ result_body = result.body_str.to_s
+
verify_result(result,
:returns => params[:returns],
:does_not_return => params[:does_not_return],
:contains => params[:contains],
:does_not_contain => params[:does_not_contain] )
+
result.close
rescue Exception => e
+ error = e
raise Puppet::Error, "An exception was raised when invoking web request:
#{e}"
ensure
+ unless result.nil?
+ log_response(:result => result_body,
+ :method => request_method, :uri => uri,
+ :puppet_params => params, :error => error)
+ end
FileUtils.rm_f(cookies) if params[:remove_cookies]
end
end
@@ -235,4 +246,31 @@ Puppet::Type.type(:web_request).provide :curl do
raise Puppet::Error, "Not expecting #{verify[:does_not_contain]} in the
result"
end
end
+
+ def log_response(params)
+ method = params[:method]
+ uri = params[:uri]
+ result = params[:result]
+ error = params[:error]
+ puppet_params = params[:puppet_params]
+
+ if puppet_params[:log_to]
+ return if puppet_params[:only_log_errors] == :true && error.nil?
+ logfile = puppet_params[:log_to].strip
+ exists = File.exists?(logfile)
+ isfile = File.file?(logfile) || (!exists && (logfile[-1].chr !=
'/'))
+ if !isfile
+ FileUtils.mkdir_p(logfile) if !exists
+ logfile += puppet_params[:name]
+ end
+
+ f = File.open(logfile, 'a')
+ f.write("=====BEGIN=====\n")
+ f.write(Time.now.strftime("%Y-%m-%d"))
+ f.write(" #{method} request to #{uri}\n")
+ f.write(result.to_s)
+ f.write("\n=====END=====\n\n")
+ f.close
+ end
+ end
end
diff --git a/recipes/aeolus/lib/puppet/type/web_request.rb
b/recipes/aeolus/lib/puppet/type/web_request.rb
index d20229e..225e3cf 100644
--- a/recipes/aeolus/lib/puppet/type/web_request.rb
+++ b/recipes/aeolus/lib/puppet/type/web_request.rb
@@ -126,6 +126,15 @@ Puppet::Type.newtype(:web_request) do
munge do |value| Puppet::Type::Web_request.munge_array_params(value) end
end
+ newparam(:log_to) do
+ desc "Log requests/responses to the specified file or directory"
+ end
+
+ newparam(:only_log_errors) do
+ desc "Boolean indicating if we should only log responses which did not pass
validations"
+ newvalues(:true, :false)
+ end
+
newparam(:if) do
desc "Invoke request only if the specified request returns true"
end
diff --git a/recipes/aeolus/manifests/conductor.pp
b/recipes/aeolus/manifests/conductor.pp
index e2d6b4f..ef95c93 100644
--- a/recipes/aeolus/manifests/conductor.pp
+++ b/recipes/aeolus/manifests/conductor.pp
@@ -230,6 +230,8 @@ define
aeolus::conductor::provider($deltacloud_driver="",$url="",
$deltacloud_pr
follow => true,
contains => "//html/body//li[text() = 'Provider added.']",
use_cookies_at => '/tmp/aeolus-admin',
+ log_to => '/tmp/configure-provider-request.log',
+ only_log_errors => true,
unless => { 'get' =>
'https://localhost/conductor/providers',
'contains' => "//html/body//a[text() =
'$name']" },
require => [Service['aeolus-conductor'],
Exec['grant_site_admin_privs'], Exec['deltacloud-core-startup-wait']]
--
1.7.6.4
Works for me.
I'd suggest changing the timestamp in the log to "%Y-%m-%d %H:%M:%S".
While I was testing I couldn't tell where one test ended and the next
one started since they all had the same datestamp.
Besides that, ACK