puppet-mistral/lib/puppet/provider/mistral_workflow/openstack.rb
Pierre Gaxatte cc27c46f99 Add provider and type to deploy workflows
The new type defines a minimal workflow object and the provider allows
the creation/update/deletion of a workflow.
Since the creation command is a little different (because you can create
multiple workflows from a single definition file), the provider inherits
from an intermediate class that only overrides the creation action.

Change-Id: Ia22cfc031915fa56cdc2602a5746b2250a62963b
2018-06-11 12:02:10 +02:00

91 lines
2.3 KiB
Ruby

require File.join(File.dirname(__FILE__), '..','..','..', 'puppet/provider/mistral')
Puppet::Type.type(:mistral_workflow).provide(
:openstack,
:parent => Puppet::Provider::Mistral
) do
desc <<-EOT
Mistral provider to manage workflow type
EOT
@credentials = Puppet::Provider::Openstack::CredentialsV3.new
mk_resource_methods
def create
properties = []
properties << (@resource[:is_public] == :true ? '--public' : '--private')
properties << @resource[:definition_file]
self.class.request('workflow', 'create', properties)
@property_hash[:ensure] = :present
@property_hash[:definition_file] = resource[:definition_file]
@property_hash[:is_public] = resource[:is_public]
@property_hash[:name] = name
end
def exists?
@property_hash[:ensure] == :present
end
def destroy
self.class.request('workflow', 'delete', @resource[:name])
@property_hash.clear
end
def update
# Update the workflow if it exists, otherwise create it
if exists?
properties = []
if @resource[:is_public] == :true
properties << '--public'
end
properties << @resource[:definition_file]
self.class.request('workflow', 'update', properties)
@property_hash[:ensure] = :present
@property_hash[:definition_file] = resource[:definition_file]
@property_hash[:is_public] = resource[:is_public]
@property_hash[:name] = name
else
create
end
end
def self.instances
list = request('workflow', 'list')
list.collect do |wf|
attrs = request('workflow', 'show', wf[:id])
new({
:ensure => :present,
:id => wf[:id],
:name => wf[:name],
:is_public => (attrs[:scope] == "public")
})
end
end
def self.prefetch(resources)
workflows = instances
resources.keys.each do |name|
if provider = workflows.find{ |wf| wf.name == name }
resources[name].provider = provider
end
end
end
def flush
if @property_flush
opts = [@resource[:name]]
(opts << '--public') if @property_flush[:is_public] == :true
(opts << '--private') if @property_flush[:is_public] == :false
opts << @property_flush[:definition_file]
self.class.request('workflow', 'update', opts)
@property_flush.clear
end
end
end