--- /dev/null
+require 'puppet/provider/openstack/credentials'
+
+module Puppet::Provider::Openstack::Auth
+
+ RCFILENAME = "#{ENV['HOME']}/openrc"
+
+ def get_os_vars_from_env
+ env = {}
+ ENV.each { |k,v| env.merge!(k => v) if k =~ /^OS_/ }
+ return env
+ end
+
+ def get_os_vars_from_rcfile(filename)
+ env = {}
+ if File.exists?(filename)
+ File.open(filename).readlines.delete_if{|l| l=~ /^#|^$/ }.each do |line|
+ key, value = line.split('=')
+ key = key.split(' ').last
+ value = value.chomp.gsub(/'/, '')
+ env.merge!(key => value) if key =~ /OS_/
+ end
+ end
+ return env
+ end
+
+ def rc_filename
+ RCFILENAME
+ end
+
+ def request(service, action, properties=nil)
+ properties ||= []
+ set_credentials(@credentials, get_os_vars_from_env)
+ unless @credentials.set?
+ @credentials.unset
+ set_credentials(@credentials, get_os_vars_from_rcfile(rc_filename))
+ end
+ unless @credentials.set?
+ raise(Puppet::Error::OpenstackAuthInputError, 'Insufficient credentials to authenticate')
+ end
+ super(service, action, properties, @credentials)
+ end
+
+ def set_credentials(creds, env)
+ env.each do |key, val|
+ var = key.sub(/^OS_/,'').downcase
+ creds.set(var, val)
+ end
+ end
+end