Replaced "/etc/puppet/liberty-8.0/modules/rabbitmq/lib/puppet/provider/rabbitmqctl.rb" in rabbitmq image with:
class Puppet::Provider::Rabbitmqctl < Puppet::Provider
initvars
commands :rabbitmqctl => 'rabbitmqctl'
def self.rabbitmq_version
output = rabbitmqctl('-q', 'status')
version = output.match(/\{rabbit,"RabbitMQ","([\d\.]+)"\}/)
version[1] if version
end
# Retry the given code block 'count' retries or until the
# command suceeeds. Use 'step' delay between retries.
# Limit each query time by 'timeout'.
# For example:
# users = self.class.run_with_retries { rabbitmqctl 'list_users' }
def self.run_with_retries(count=30, step=6, timeout=10)
count.times do |n|
begin
output = Timeout::timeout(timeout) do
yield
end
rescue Puppet::ExecutionFailure, Timeout::Error => e
if e.to_s.include? "already_exists"
return output
else Puppet.debug "Fail: #{e.to_s} Retry: #{n + 1}"
sleep step
end
else Puppet.debug 'Command succeeded'
return output
end
end
raise Puppet::Error, "Command is still failing after #{count * step} seconds expired!"
end
end
- Now when executing expires it is retried and succeeds even if object exists. Patch is not nice but worked for me.
- OK I have finally managed to install
Replaced "/etc/puppet/ liberty- 8.0/modules/ rabbitmq/ lib/puppet/ provider/ rabbitmqctl. rb" in rabbitmq image with:
class Puppet: :Provider: :Rabbitmqctl < Puppet::Provider
initvars
commands :rabbitmqctl => 'rabbitmqctl'
def self.rabbitmq_ version match(/ \{rabbit, "RabbitMQ" ,"([\d\ .]+)"\} /)
output = rabbitmqctl('-q', 'status')
version = output.
version[1] if version
end
# Retry the given code block 'count' retries or until the run_with_ retries { rabbitmqctl 'list_users' } with_retries( count=30, step=6, timeout=10) :timeout( timeout) do :ExecutionFailu re, Timeout::Error => e
Puppet. debug "Fail: #{e.to_s} Retry: #{n + 1}"
Puppet. debug 'Command succeeded'
# command suceeeds. Use 'step' delay between retries.
# Limit each query time by 'timeout'.
# For example:
# users = self.class.
def self.run_
count.times do |n|
begin
output = Timeout:
yield
end
rescue Puppet:
if e.to_s.include? "already_exists"
return output
else
sleep step
end
else
return output
end
end
raise Puppet::Error, "Command is still failing after #{count * step} seconds expired!"
end
end
- Now when executing expires it is retried and succeeds even if object exists. Patch is not nice but worked for me.
/var/log/ docker- logs/puppet/ rabbitmq. log:
2016-10-06 13:00:53 +0000 Puppet (debug): Executing '/usr/sbin/ rabbitmqctl -q list_vhosts' rabbitmqctl add_vhost /' rabbitmqctl add_vhost /' main]/Nailgun: :Rabbitmq/ Rabbitmq_ vhost[/ ]/ensure (notice): created main]/Nailgun: :Rabbitmq/ Rabbitmq_ vhost[/ ] (debug): The container Class[Nailgun: :Rabbitmq] will propagate my refresh event rabbitmqctl -q list_user_ permissions naily'
2016-10-06 13:00:54 +0000 Puppet (debug): Command succeeded
2016-10-06 13:00:54 +0000 Puppet (debug): Executing '/usr/sbin/
2016-10-06 13:01:04 +0000 Puppet (debug): Fail: execution expired Retry: 1
2016-10-06 13:01:10 +0000 Puppet (debug): Executing '/usr/sbin/
2016-10-06 13:01:10 +0000 /Stage[
2016-10-06 13:01:10 +0000 /Stage[
2016-10-06 13:01:10 +0000 Puppet (debug): Executing '/usr/sbin/
2016-10-06 13:01:11 +0000 Puppet (debug): Command succeeded