--- .../aeolus_recipe/lib/puppet/provider/web/curl.rb | 128 -------------------- .../lib/puppet/provider/web_request/curl.rb | 128 ++++++++++++++++++++ recipes/aeolus_recipe/lib/puppet/type/web.rb | 49 -------- .../aeolus_recipe/lib/puppet/type/web_request.rb | 49 ++++++++ recipes/aeolus_recipe/manifests/conductor.pp | 4 +- recipes/aeolus_recipe/manifests/defaults.pp | 2 +- 6 files changed, 180 insertions(+), 180 deletions(-) delete mode 100644 recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb create mode 100644 recipes/aeolus_recipe/lib/puppet/provider/web_request/curl.rb delete mode 100644 recipes/aeolus_recipe/lib/puppet/type/web.rb create mode 100644 recipes/aeolus_recipe/lib/puppet/type/web_request.rb
diff --git a/recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb b/recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb deleted file mode 100644 index 5f86e87..0000000 --- a/recipes/aeolus_recipe/lib/puppet/provider/web/curl.rb +++ /dev/null @@ -1,128 +0,0 @@ -require 'curb' -require 'uuid' -require 'fileutils' - -# Helper to invoke the web request w/ curl -def web_request(method, uri, request_params, params = {}) - raise Puppet::Error, "Must specify http method and uri" if method.nil? || uri.nil? - - curl = Curl::Easy.new - - if params.has_key?(:cookie) - curl.enable_cookies = true - curl.cookiefile = params[:cookie] - curl.cookiejar = params[:cookie] - end - - curl.follow_location = (params.has_key?(:follow) && params[:follow]) - - case(method) - when 'get' - url = uri - url += ";" + request_params.collect { |k,v| "#{k}=#{v}" }.join("&") unless request_params.nil? - curl.url = url - curl.http_get - return curl - - when 'post' - cparams = [] - request_params.each_pair { |k,v| cparams << Curl::PostField.content(k,v) } unless request_params.nil? - curl.url = uri - curl.http_post(cparams) - return curl - - #when 'put' - #when 'delete' - end -end - -# Helper to verify the response -def verify_result(result, verify = {}) - returns = (verify.has_key?(:returns) && !verify[:returns].nil?) ? verify[:returns] : "200" - returns = [returns] unless returns.is_a? Array - unless returns.include?(result.response_code.to_s) - raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code}, - was expecting one of #{returns.join(", ")}" - end - - if verify.has_key?(:body) && !verify[:body].nil? && !(result.body_str =~ Regexp.new(verify[:body])) - raise Puppet::Error, "Expecting #{verify[:body]} in the result" - end -end - -# Helper to process/parse web parameters -def process_params(request_method, params, uri) - begin - # Set request method and generate a unique session key - session = "/tmp/#{UUID.new.generate}" - - # Invoke a login request if necessary - if params[:login] - login_params = params[:login].reject { |k,v| ['http_method', 'uri'].include?(k) } - web_request(params[:login]['http_method'], params[:login]['uri'], - login_params, :cookie => session, :follow => params[:follow]).close - end - - # Check to see if we should actually run the request - skip_request = !params[:unless].nil? - if params[:unless] - result = web_request(params[:unless]['http_method'], params[:unless]['uri'], - params[:unless]['parameters'], - :cookie => session, :follow => params[:follow]) - begin - verify_result(result, - :returns => params[:unless]['returns'], - :body => params[:unless]['verify']) - rescue Puppet::Error => e - skip_request = false - end - result.close - end - return if skip_request - - # Actually run the request and verify the result - uri = params[:name] if uri.nil? - result = web_request(request_method, uri, params[:parameters], - :cookie => session, :follow => params[:follow]) - verify_result(result, - :returns => params[:returns], - :body => params[:verify]) - result.close - - # Invoke a logout request if necessary - if params[:logout] - logout_params = params[:login].reject { |k,v| ['http_method', 'uri'].include?(k) } - web_request(params[:logout]['http_method'], params[:logout]['uri'], - logout_params, :cookie => session, :follow => params[:follow]).close - end - - rescue Exception => e - raise Puppet::Error, "An exception was raised when invoking web request: #{e}" - - ensure - FileUtils.rm_f(session) if params[:logout] - end -end - -# Puppet provider definition -Puppet::Type.type(:web).provide :curl do - desc "Use curl to access web resources" - - def get - @uri - end - - def post - @uri - end - - def get=(uri) - @uri = uri - process_params('get', @resource, uri) - end - - def post=(uri) - @uri = uri - process_params('post', @resource, uri) - end -end diff --git a/recipes/aeolus_recipe/lib/puppet/provider/web_request/curl.rb b/recipes/aeolus_recipe/lib/puppet/provider/web_request/curl.rb new file mode 100644 index 0000000..925b865 --- /dev/null +++ b/recipes/aeolus_recipe/lib/puppet/provider/web_request/curl.rb @@ -0,0 +1,128 @@ +require 'curb' +require 'uuid' +require 'fileutils' + +# Helper to invoke the web request w/ curl +def web_request(method, uri, request_params, params = {}) + raise Puppet::Error, "Must specify http method and uri" if method.nil? || uri.nil? + + curl = Curl::Easy.new + + if params.has_key?(:cookie) + curl.enable_cookies = true + curl.cookiefile = params[:cookie] + curl.cookiejar = params[:cookie] + end + + curl.follow_location = (params.has_key?(:follow) && params[:follow]) + + case(method) + when 'get' + url = uri + url += ";" + request_params.collect { |k,v| "#{k}=#{v}" }.join("&") unless request_params.nil? + curl.url = url + curl.http_get + return curl + + when 'post' + cparams = [] + request_params.each_pair { |k,v| cparams << Curl::PostField.content(k,v) } unless request_params.nil? + curl.url = uri + curl.http_post(cparams) + return curl + + #when 'put' + #when 'delete' + end +end + +# Helper to verify the response +def verify_result(result, verify = {}) + returns = (verify.has_key?(:returns) && !verify[:returns].nil?) ? verify[:returns] : "200" + returns = [returns] unless returns.is_a? Array + unless returns.include?(result.response_code.to_s) + raise Puppet::Error, "Invalid HTTP Return Code: #{result.response_code}, + was expecting one of #{returns.join(", ")}" + end + + if verify.has_key?(:body) && !verify[:body].nil? && !(result.body_str =~ Regexp.new(verify[:body])) + raise Puppet::Error, "Expecting #{verify[:body]} in the result" + end +end + +# Helper to process/parse web parameters +def process_params(request_method, params, uri) + begin + # Set request method and generate a unique session key + session = "/tmp/#{UUID.new.generate}" + + # Invoke a login request if necessary + if params[:login] + login_params = params[:login].reject { |k,v| ['http_method', 'uri'].include?(k) } + web_request(params[:login]['http_method'], params[:login]['uri'], + login_params, :cookie => session, :follow => params[:follow]).close + end + + # Check to see if we should actually run the request + skip_request = !params[:unless].nil? + if params[:unless] + result = web_request(params[:unless]['http_method'], params[:unless]['uri'], + params[:unless]['parameters'], + :cookie => session, :follow => params[:follow]) + begin + verify_result(result, + :returns => params[:unless]['returns'], + :body => params[:unless]['verify']) + rescue Puppet::Error => e + skip_request = false + end + result.close + end + return if skip_request + + # Actually run the request and verify the result + uri = params[:name] if uri.nil? + result = web_request(request_method, uri, params[:parameters], + :cookie => session, :follow => params[:follow]) + verify_result(result, + :returns => params[:returns], + :body => params[:verify]) + result.close + + # Invoke a logout request if necessary + if params[:logout] + logout_params = params[:login].reject { |k,v| ['http_method', 'uri'].include?(k) } + web_request(params[:logout]['http_method'], params[:logout]['uri'], + logout_params, :cookie => session, :follow => params[:follow]).close + end + + rescue Exception => e + raise Puppet::Error, "An exception was raised when invoking web request: #{e}" + + ensure + FileUtils.rm_f(session) if params[:logout] + end +end + +# Puppet provider definition +Puppet::Type.type(:web_request).provide :curl do + desc "Use curl to access web resources" + + def get + @uri + end + + def post + @uri + end + + def get=(uri) + @uri = uri + process_params('get', @resource, uri) + end + + def post=(uri) + @uri = uri + process_params('post', @resource, uri) + end +end diff --git a/recipes/aeolus_recipe/lib/puppet/type/web.rb b/recipes/aeolus_recipe/lib/puppet/type/web.rb deleted file mode 100644 index 5701ac2..0000000 --- a/recipes/aeolus_recipe/lib/puppet/type/web.rb +++ /dev/null @@ -1,49 +0,0 @@ -Puppet::Type.newtype(:web) do - @doc = "Issue a request via the world wide web" - - newparam :name - - newproperty(:get) do - desc "Issue get request to the specified uri" - # TODO valid value to be a uri - end - - newproperty(:post) do - desc "Issue get request to the specified uri" - # TODO valid value to be a uri - end - - #newproperty(:delete) - #newproperty(:put) - - newparam(:parameters) do - desc "Hash of parameters to include in the web request" - end - - newparam(:returns) do - desc "Expected http return codes of the request" - defaultto "200" - # TODO validate value(s) is among possible valid http return codes - end - - newparam(:follow) do - desc "Boolean indicating if redirects should be followed" - newvalues(:true, :false) - end - - newparam(:verify) do - desc "String to verify as being part of the result" - end - - newparam(:login) do - desc "Login parameters to be used if a login is required before making the request" - end - - newparam(:logout) do - desc "Logout parameters to be used if a logout is requred after making the request" - end - - newparam(:unless) do - desc "Do not run request if the request specified here succeeds" - end -end diff --git a/recipes/aeolus_recipe/lib/puppet/type/web_request.rb b/recipes/aeolus_recipe/lib/puppet/type/web_request.rb new file mode 100644 index 0000000..5225633 --- /dev/null +++ b/recipes/aeolus_recipe/lib/puppet/type/web_request.rb @@ -0,0 +1,49 @@ +Puppet::Type.newtype(:web_request) do + @doc = "Issue a request via the world wide web" + + newparam :name + + newproperty(:get) do + desc "Issue get request to the specified uri" + # TODO valid value to be a uri + end + + newproperty(:post) do + desc "Issue get request to the specified uri" + # TODO valid value to be a uri + end + + #newproperty(:delete) + #newproperty(:put) + + newparam(:parameters) do + desc "Hash of parameters to include in the web request" + end + + newparam(:returns) do + desc "Expected http return codes of the request" + defaultto "200" + # TODO validate value(s) is among possible valid http return codes + end + + newparam(:follow) do + desc "Boolean indicating if redirects should be followed" + newvalues(:true, :false) + end + + newparam(:verify) do + desc "String to verify as being part of the result" + end + + newparam(:login) do + desc "Login parameters to be used if a login is required before making the request" + end + + newparam(:logout) do + desc "Logout parameters to be used if a logout is requred after making the request" + end + + newparam(:unless) do + desc "Do not run request if the request specified here succeeds" + end +end diff --git a/recipes/aeolus_recipe/manifests/conductor.pp b/recipes/aeolus_recipe/manifests/conductor.pp index 31c5145..c3a569a 100644 --- a/recipes/aeolus_recipe/manifests/conductor.pp +++ b/recipes/aeolus_recipe/manifests/conductor.pp @@ -230,7 +230,7 @@ define aeolus::site_admin($email="", $password="", $first_name="", $last_name=""
# Create a new provider via the conductor define aeolus::conductor::provider($type="",$url=""){ - web{ "provider-$name": + web_request{ "provider-$name": post => "https://localhost/conductor/admin/providers", parameters => { 'provider[name]' => $name, 'provider[url]' => $url, 'provider[provider_type_codename]' => $type }, @@ -245,7 +245,7 @@ define aeolus::conductor::provider($type="",$url=""){ }
define aeolus::conductor::hwp($memory='', $cpu='', $storage='', $architecture=''){ - web{ "hwp-$name": + web_request{ "hwp-$name": post => "https://localhost/conductor/admin/hardware_profiles", parameters => {'hardware_profile[name]' => $name, 'hardware_profile[memory_attributes][value]' => $memory, diff --git a/recipes/aeolus_recipe/manifests/defaults.pp b/recipes/aeolus_recipe/manifests/defaults.pp index 57b79f6..f2fc891 100644 --- a/recipes/aeolus_recipe/manifests/defaults.pp +++ b/recipes/aeolus_recipe/manifests/defaults.pp @@ -12,7 +12,7 @@ $admin_user='admin' $admin_password='password'
# Setup the default login/logout targets for web requests -Web{ +Web_request{ login => { 'http_method' => 'post', 'uri' => 'https://localhost/conductor/user_session', 'user_session[login]' => "$admin_user",