[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