--- /dev/null
+require 'puppet/provider/keystone'
+
+Puppet::Type.type(:keystone_endpoint).provide(
+ :openstack,
+ :parent => Puppet::Provider::Keystone
+) do
+
+ desc "Provider to manage keystone endpoints."
+
+ def initialize(value={})
+ super(value)
+ @property_flush = {}
+ end
+
+ def create
+ properties = []
+ # The region property is just ignored. We should fix this in kilo.
+ region, name = resource[:name].split('/')
+ properties << '--region'
+ properties << region
+ if resource[:public_url]
+ properties << '--publicurl'
+ properties << resource[:public_url]
+ end
+ if resource[:internal_url]
+ properties << '--internalurl'
+ properties << resource[:internal_url]
+ end
+ if resource[:admin_url]
+ properties << '--adminurl'
+ properties << resource[:admin_url]
+ end
+ @instance = request('endpoint', 'create', name, resource[:auth], properties)
+ end
+
+ def exists?
+ ! instance(resource[:name]).empty?
+ end
+
+ def destroy
+ id = instance(resource[:name])[:id]
+ request('endpoint', 'delete', id, resource[:auth])
+ end
+
+
+ def region
+ instance(resource[:name])[:region]
+ end
+
+
+ def public_url=(value)
+ @property_flush[:public_url] = value
+ end
+
+ def public_url
+ instance(resource[:name])[:public_url]
+ end
+
+
+ def internal_url=(value)
+ @property_flush[:internal_url] = value
+ end
+
+ def internal_url
+ instance(resource[:name])[:internal_url]
+ end
+
+
+ def admin_url=(value)
+ @property_flush[:admin_url] = value
+ end
+
+ def admin_url
+ instance(resource[:name])[:admin_url]
+ end
+
+ def id
+ instance(resource[:name])[:id]
+ end
+
+ def self.instances
+ list = request('endpoint', 'list', nil, nil, '--long')
+ list.collect do |endpoint|
+ new(
+ :name => "#{endpoint[:region]}/#{endpoint[:service_name]}",
+ :ensure => :present,
+ :id => endpoint[:id],
+ :region => endpoint[:region],
+ :public_url => endpoint[:publicurl],
+ :internal_url => endpoint[:internalurl],
+ :admin_url => endpoint[:adminurl]
+ )
+ end
+ end
+
+ def instances
+ instances = request('endpoint', 'list', nil, resource[:auth], '--long')
+ instances.collect do |endpoint|
+ {
+ :name => "#{endpoint[:region]}/#{endpoint[:service_name]}",
+ :id => endpoint[:id],
+ :region => endpoint[:region],
+ :public_url => endpoint[:publicurl],
+ :internal_url => endpoint[:internalurl],
+ :admin_url => endpoint[:adminurl]
+ }
+ end
+ end
+
+ def instance(name)
+ @instance ||= instances.select { |instance| instance[:name] == name }.first || {}
+ end
+
+ def flush
+ if ! @property_flush.empty?
+ destroy
+ create
+ @property_flush.clear
+ end
+ end
+
+end