- }.split(/\n/).each do |line|
- # rabbitmq<3.2 does not support the applyto field
- # 1 2 3? 4 5 6
- # / ha-all all .* {"ha-mode":"all","ha-sync-mode":"automatic"} 0
- if line =~ /^(\S+)\s+(\S+)\s+(all|exchanges|queues)?\s*(\S+)\s+(\S+)\s+(\d+)$/
- applyto = $3 || 'all'
- @policies[vhost][$2] = {
- :applyto => applyto,
- :pattern => $4,
- :definition => JSON.parse($5),
- :priority => $6}
- else
- raise Puppet::Error, "cannot parse line from list_policies:#{line}"
- end
+ end
+
+ # rabbitmq<3.2 does not support the applyto field
+ # 1 2 3? 4 5 6
+ # / ha-all all .* {"ha-mode":"all","ha-sync-mode":"automatic"} 0 << This is for RabbitMQ v < 3.7.0
+ # / ha-all .* all {"ha-mode":"all","ha-sync-mode":"automatic"} 0 << This is for RabbitMQ v >= 3.7.0
+ if Puppet::Util::Package.versioncmp(rabbitmq_version, '3.7') >= 0
+ regex = %r{^(\S+)\s+(\S+)\s+(\S+)\s+(all|exchanges|queues)?\s+(\S+)\s+(\d+)$}
+ applyto_index = 4
+ pattern_index = 3
+ else
+ regex = %r{^(\S+)\s+(\S+)\s+(all|exchanges|queues)?\s*(\S+)\s+(\S+)\s+(\d+)$}
+ applyto_index = 3
+ pattern_index = 4
+ end
+
+ policy_list.split(%r{\n}).each do |line|
+ raise Puppet::Error, "cannot parse line from list_policies:#{line}" unless line =~ regex
+ n = Regexp.last_match(2)
+ applyto = Regexp.last_match(applyto_index) || 'all'
+ priority = Regexp.last_match(6)
+ definition = JSON.parse(Regexp.last_match(5))
+ # be aware that the gsub will reset the captures
+ # from the regexp above
+ pattern = Regexp.last_match(pattern_index).to_s.gsub(%r{\\\\}, '\\')
+
+ @policies[vhost][n] = {
+ applyto: applyto,
+ pattern: pattern,
+ definition: definition,
+ priority: priority
+ }