![Matthias Bastian](/assets/img/avatar_default.png)
When reading credentials from the configuration's keystone_authtoken section auth_uri was used as URL for Keystone. As auth_uri is a public endpoint that is not necessarily reachable for the Puppet agent, this change uses the more appropriate auth_url as Keystone URL. Change-Id: Ia5bcfaf9611340a3b01b69b678d7c541b62d5ca2
107 lines
3.2 KiB
Ruby
107 lines
3.2 KiB
Ruby
require 'puppet/util/inifile'
|
|
require 'puppet/provider/openstack/auth'
|
|
require 'puppet/provider/openstack/credentials'
|
|
require File.join(File.dirname(__FILE__), '..','..', 'puppet/provider/mistral_workflow_requester')
|
|
|
|
class Puppet::Provider::Mistral < Puppet::Provider::MistralWorkflowRequester
|
|
|
|
extend Puppet::Provider::Openstack::Auth
|
|
|
|
def self.request(service, action, properties=nil)
|
|
begin
|
|
super
|
|
rescue Puppet::Error::OpenstackAuthInputError, Puppet::Error::OpenstackUnauthorizedError => error
|
|
mistral_request(service, action, error, properties)
|
|
end
|
|
end
|
|
|
|
def self.mistral_request(service, action, error, properties=nil)
|
|
properties ||= []
|
|
@credentials.username = mistral_credentials['admin_username']
|
|
@credentials.password = mistral_credentials['admin_password']
|
|
@credentials.project_name = mistral_credentials['admin_project_name']
|
|
@credentials.auth_url = auth_endpoint
|
|
if mistral_credentials['region_name']
|
|
@credentials.region_name = mistral_credentials['region_name']
|
|
end
|
|
if @credentials.version == '3'
|
|
@credentials.user_domain_name = mistral_credentials['user_domain_name']
|
|
@credentials.project_domain_name = mistral_credentials['project_domain_name']
|
|
end
|
|
raise error unless @credentials.set?
|
|
|
|
if action == 'create'
|
|
mistral_create_request(action, properties)
|
|
else
|
|
Puppet::Provider::Openstack.request(service, action, properties, @credentials)
|
|
end
|
|
end
|
|
|
|
def self.conf_filename
|
|
'/etc/mistral/mistral.conf'
|
|
end
|
|
|
|
def self.mistral_conf
|
|
return @mistral_conf if @mistral_conf
|
|
@mistral_conf = Puppet::Util::IniConfig::File.new
|
|
@mistral_conf.read(conf_filename)
|
|
@mistral_conf
|
|
end
|
|
|
|
def self.mistral_credentials
|
|
@mistral_credentials ||= get_mistral_credentials
|
|
end
|
|
|
|
def mistral_credentials
|
|
self.class.mistral_credentials
|
|
end
|
|
|
|
def self.get_mistral_credentials
|
|
auth_keys = ['auth_url', 'admin_tenant_name', 'admin_user',
|
|
'admin_password']
|
|
conf = mistral_conf
|
|
if conf and conf['keystone_authtoken'] and
|
|
auth_keys.all?{|k| !conf['keystone_authtoken'][k].nil?}
|
|
creds = Hash[ auth_keys.map \
|
|
{ |k| [k, conf['keystone_authtoken'][k].strip] } ]
|
|
|
|
if conf['project_domain_name']
|
|
creds['project_domain_name'] = conf['project_domain_name']
|
|
else
|
|
creds['project_domain_name'] = 'Default'
|
|
end
|
|
|
|
if conf['user_domain_name']
|
|
creds['user_domain_name'] = conf['user_domain_name']
|
|
else
|
|
creds['user_domain_name'] = 'Default'
|
|
end
|
|
|
|
if conf['region_name']
|
|
creds['region_name'] = conf['region_name']
|
|
end
|
|
return creds
|
|
else
|
|
raise(Puppet::Error, "File: #{conf_filename} does not contain all " +
|
|
"required authentication options. Mistral types will not work " +
|
|
"if mistral is not correctly configured to use Keystone " +
|
|
"authentication.")
|
|
end
|
|
end
|
|
|
|
def self.get_auth_endpoint
|
|
m = mistral_credentials
|
|
"#{m['auth_url']}"
|
|
end
|
|
|
|
def self.auth_endpoint
|
|
@auth_endpoint ||= get_auth_endpoint
|
|
end
|
|
|
|
def self.reset
|
|
@mistral_conf = nil
|
|
@mistral_credentials = nil
|
|
end
|
|
|
|
end
|