Skip to content

Commit

Permalink
Start work on supporting vhost metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
jimmybigcommerce committed Nov 24, 2023
1 parent 8854872 commit aa9af1c
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 14 deletions.
45 changes: 41 additions & 4 deletions lib/puppet/provider/rabbitmq_vhost/rabbitmqctl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,57 @@
Puppet::Type.type(:rabbitmq_vhost).provide(:rabbitmqctl, parent: Puppet::Provider::RabbitmqCli) do
confine feature: :posix

# To maintain compatibility with older versions of RabbitMQ,
# we only deal with vhost metadata >= version 3.13.0
def supports_metadata?
Puppet::Util::Package.versioncmp(self.class.rabbitmq_version, '3.13') >= 0
end

def self.instances

vhost_list = run_with_retries do
rabbitmqctl_list('vhosts')
supports_metadata? \
? rabbitmqctl_list('vhosts', 'name,description,default_queue_type,tags', '-s') \
: rabbitmqctl_list('vhosts')
end

vhost_list.split(%r{\n}).map do |line|
raise Puppet::Error, "Cannot parse invalid vhost line: #{line}" unless line =~ %r{^(\S+)$}

new(name: Regexp.last_match(1))
if supports_metadata?
raise Puppet::Error, "Cannot parse invalid vhost line: #{line}" unless \
(matches = line.match(/^(\S+)\t+(.*?)\t+(undefined|quorum|classic|stream)?\t+\[(.*?)\]$/i))
name, description, default_queue_type, tags = matches.captures
new(name: name, description: description, default_queue_type: default_queue_type, tags: tags.split(%r{,\s*}))
else

raise Puppet::Error, "Cannot parse invalid vhost line: #{line}" unless line =~ %r{^(\S+)$}
new(name: Regexp.last_match(1))
end

end

end

def create
rabbitmqctl('add_vhost', resource[:name])
rabbitmqctl('add_vhost', *params)
end

def update
rabbitmqctl('update_vhost_metadata', *params)
end

def params
params = [resource[:name]]
if supports_metadata?
params << ['--description', resource[:description] ? resource[:description] : '""']
if resource[:default_queue_type] && resource[:default_queue_type] != "undefined"
params << ['--default-queue-type', resource[:default_queue_type]]
end
if resource[:tags]
params << ['--tags', resource[:tags].join(',')]
end
end
params
end

def destroy
Expand Down
34 changes: 33 additions & 1 deletion lib/puppet/type/rabbitmq_vhost.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
@example Create a rabbitmq_vhost
rabbitmq_vhost { 'myvhost':
ensure => present,
ensure => present,
description => 'myvhost description',
tags => ['myvhost tags'],
default_queue_type => 'quorum',
}
DESC

Expand All @@ -29,4 +32,33 @@
desc 'The name of the vhost to add'
newvalues(%r{^\S+$})
end

newparam(:description) do
desc 'A description of the vhost'
defaultto('')
#newvalues(%r{^\S+$})
end

newparam(:default_queue_type) do
desc 'The default queue type for queues in this vhost'
newvalues(%r{undefined|classic|quorum|stream})
defaultto('undefined')
end

newproperty(:tags, array_matching: :all) do
desc 'additional tags for the vhost'
validate do |value|
raise ArgumentError, "Invalid tag: #{value.inspect}" unless value =~ %r{^\S+$}
end
defaultto []

def insync?(is)
is.sort == should.sort
end

def should_to_s(value)
Array(value)
end
end

end
50 changes: 41 additions & 9 deletions spec/unit/puppet/provider/rabbitmq_vhost/rabbitmqctl_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
# frozen_string_literal: true

require 'spec_helper'

provider_class = Puppet::Type.type(:rabbitmq_vhost).provider(:rabbitmqctl)
describe provider_class do
describe Puppet::Type.type(:rabbitmq_vhost).provider(:rabbitmqctl) do
let(:resource) do
Puppet::Type::Rabbitmq_vhost.new(
name: 'foo'
name: 'foo',
description: 'foo description',
default_queue_type: 'quorum',
tags: ['foo', 'bar']
)
end
let(:provider) { provider_class.new(resource) }
let(:provider) { described_class.new(resource) }

it 'matches vhost names' do
provider.expects(:rabbitmqctl_list).with('vhosts').returns <<~EOT
Expand Down Expand Up @@ -37,13 +38,44 @@
expect(provider.exists?).to eq(false)
end

it 'calls rabbitmqctl to create' do
provider.expects(:rabbitmqctl).with('add_vhost', 'foo')
provider.create
context 'with RabbitMQ version <3.13.0 (no metadata support)' do

it 'calls rabbitmqctl to create' do
provider.class.expects(:rabbitmq_version).returns '3.12.0'
provider.expects(:rabbitmqctl).with('add_vhost', 'foo')
provider.create
end

end

context 'with RabbitMQ version >=3.13.0 (metadata support)' do

it 'calls rabbitmqctl to create with metadata' do
provider.class.expects(:rabbitmq_version).returns '3.13.0'
provider.expects(:rabbitmqctl).with('add_vhost', 'foo', ["--description", "foo description"], \
["--default-queue-type", "quorum"], ["--tags", "foo,bar"])
provider.create
end

# it 'calls rabbitmqctl to create without metadata' do
# provider.class.expects(:rabbitmq_version).returns '3.13.0'
# provider.expects(:rabbitmqctl).with('add_vhost', 'foo', ["--description", "foo description"], \
# ["--default-queue-type", "quorum"], ["--tags", "foo,bar"])
# provider.create
# end

it 'calls rabbitmqctl to update' do
provider.class.expects(:rabbitmq_version).returns '3.13.0'
provider.expects(:rabbitmqctl).with('update_vhost_metadata', 'foo', ["--description", "foo description"], \
["--default-queue-type", "quorum"], ["--tags", "foo,bar"])
provider.update
end

end

it 'calls rabbitmqctl to create' do
it 'calls rabbitmqctl to delete' do
provider.expects(:rabbitmqctl).with('delete_vhost', 'foo')
provider.destroy
end

end

0 comments on commit aa9af1c

Please sign in to comment.