Update 3rdparty rabbitmq module
[mirror/dsa-puppet.git] / 3rdparty / modules / rabbitmq / lib / puppet / provider / rabbitmq_parameter / rabbitmqctl.rb
diff --git a/3rdparty/modules/rabbitmq/lib/puppet/provider/rabbitmq_parameter/rabbitmqctl.rb b/3rdparty/modules/rabbitmq/lib/puppet/provider/rabbitmq_parameter/rabbitmqctl.rb
new file mode 100644 (file)
index 0000000..5c910d7
--- /dev/null
@@ -0,0 +1,81 @@
+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