try with modules from master
[mirror/dsa-puppet.git] / 3rdparty / modules / openstacklib / lib / puppet / provider / openstack / auth.rb
diff --git a/3rdparty/modules/openstacklib/lib/puppet/provider/openstack/auth.rb b/3rdparty/modules/openstacklib/lib/puppet/provider/openstack/auth.rb
new file mode 100644 (file)
index 0000000..93a054e
--- /dev/null
@@ -0,0 +1,49 @@
+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