--- /dev/null
+require 'json'
+require 'puppet/util/package'
+
+require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rabbitmqctl'))
+Puppet::Type.type(:rabbitmq_parameter).provide(:rabbitmqctl, parent: Puppet::Provider::Rabbitmqctl) do
+ confine feature: :posix
+
+ # cache parameters
+ def self.parameters(name, vhost)
+ @parameters = {} unless @parameters
+ unless @parameters[vhost]
+ @parameters[vhost] = {}
+ parameter_list = run_with_retries do
+ rabbitmqctl('list_parameters', '-q', '-p', vhost)
+ end
+ parameter_list.split(%r{\n}).each do |line|
+ raise Puppet::Error, "cannot parse line from list_parameter:#{line}" unless line =~ %r{^(\S+)\s+(\S+)\s+(\S+)$}
+ @parameters[vhost][Regexp.last_match(2)] = {
+ component_name: Regexp.last_match(1),
+ value: JSON.parse(Regexp.last_match(3))
+ }
+ end
+ end
+ @parameters[vhost][name]
+ end
+
+ def parameters(name, vhost)
+ self.class.parameters(vhost, name)
+ end
+
+ def should_parameter
+ @should_parameter ||= resource[:name].rpartition('@').first
+ end
+
+ def should_vhost
+ @should_vhost ||= resource[:name].rpartition('@').last
+ end
+
+ def create
+ set_parameter
+ end
+
+ def destroy
+ rabbitmqctl('clear_parameter', '-p', should_vhost, 'shovel', should_parameter)
+ end
+
+ def exists?
+ parameters(should_vhost, should_parameter)
+ end
+
+ def component_name
+ parameters(should_vhost, should_parameter)[:component_name]
+ end
+
+ def component_name=(_component_name)
+ set_parameter
+ end
+
+ def value
+ parameters(should_vhost, should_parameter)[:value]
+ end
+
+ def value=(_value)
+ set_parameter
+ end
+
+ def set_parameter
+ return if @set_parameter
+
+ @set_parameter = true
+ resource[:value] ||= value
+ resource[:component_name] ||= component_name
+ rabbitmqctl(
+ 'set_parameter',
+ '-p', should_vhost,
+ resource[:component_name],
+ should_parameter,
+ resource[:value].to_json
+ )
+ end
+end