[PATCH] BZ #766661 - provide mechanism to log aeolus-configure web requests, responses, and errors
John Eckersberg
jeckersb at redhat.com
Wed Dec 21 20:39:10 UTC 2011
On Tue, 20 Dec 2011 14:33:30 -0500, Mo Morsi <mmorsi at 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
More information about the aeolus-devel
mailing list