Moved clustering setup to an attribute

Clustering is set to false by default.  When enabled, will setup
rabbitmq disk node clustering.  Also, added opscode to attribution,
somehow had removed them in the previous rebase.

Change-Id: Idd249d0d950f5f4eb44cd7c10566ece254ed7f45
This commit is contained in:
John Dewey 2013-06-29 13:50:11 -07:00
parent 1c0e58dc33
commit c4bcd7ee7b
4 changed files with 85 additions and 37 deletions

View File

@ -44,6 +44,7 @@ None
* `openstack["mq"]["server_role"]` - which role should other nodes search on to find the messaging service, defaults to 'os-ops-messaging'
* `openstack["mq"]["service_type"]` - which service to use, defaults to 'rabbitmq'
* `openstack["mq"]["bind_interface"]` - bind to interfaces IPv4 address
* `openstack["mq"]["cluster"]` - whether or not to cluster rabbit, defaults to 'false'
* `openstack["mq"]["port"]` - which service port to use
Testing

View File

@ -18,6 +18,7 @@
#
default["openstack"]["mq"]["bind_interface"] = "lo"
default["openstack"]["mq"]["cluster"] = false
# TODO(retr0h): Delete when these attributes are merged into openstack-common
default["openstack"]["mq"]["server_role"] = "os-ops-messaging"
default["openstack"]["mq"]["service_type"] = "rabbitmq"

View File

@ -2,6 +2,7 @@
# Cookbook Name:: openstack-ops-messaging
# Recipe:: rabbitmq-server
#
# Copyright 2013, Opscode, Inc.
# Copyright 2013, AT&T Services, Inc.
# Copyright 2013, Craig Tracey <craigtracey@gmail.com>
#
@ -25,7 +26,6 @@ end
rabbit_server_role = node["openstack"]["mq"]["server_role"]
user = node["openstack"]["mq"]["user"]
pass = user_password user
cookie = service_password "rabbit_cookie"
vhost = node["openstack"]["mq"]["vhost"]
bind_interface = node["openstack"]["mq"]["bind_interface"]
listen_address = address_for node["openstack"]["mq"]["bind_interface"]
@ -37,12 +37,16 @@ node.override["rabbitmq"]["port"] = node["openstack"]["mq"]["port"]
node.override["rabbitmq"]["address"] = listen_address
node.override["rabbitmq"]["default_user"] = user
node.override["rabbitmq"]["default_pass"] = pass
node.override["rabbitmq"]["erlang_cookie"] = cookie
node.override["rabbitmq"]["use_distro_version"] = true
node.override["rabbitmq"]["cluster"] = true
qs = "roles:#{rabbit_server_role} AND environment:#{node.chef_environment}"
node.override["rabbitmq"]["cluster_disk_nodes"] = search(:node, qs).map do |n|
"#{user}@#{n['hostname']}"
# Clustering
if node["openstack"]["mq"]["cluster"]
node.override["rabbitmq"]["cluster"] = node["openstack"]["mq"]["cluster"]
node.override["rabbitmq"]["erlang_cookie"] = service_password "rabbit_cookie"
qs = "roles:#{rabbit_server_role} AND environment:#{node.chef_environment}"
node.override["rabbitmq"]["cluster_disk_nodes"] = search(:node, qs).map do |n|
"#{user}@#{n['hostname']}"
end
end
include_recipe "rabbitmq"
@ -85,7 +89,8 @@ end
# Remove the mnesia database. This is necessary so the nodes
# in the cluster will be able to recognize one another.
# TODO(retr0h): This should be handled upstream.
# TODO(retr0h): This should be handled upstream, and in a
# non-distro specific way (e.g.) `rabbitmqctl reset`.
execute "Reset mnesia" do
cwd "/var/lib/rabbitmq"
command <<-EOH.gsub(/^\s+/, "")
@ -96,4 +101,5 @@ execute "Reset mnesia" do
EOH
not_if { ::File.exists? "/var/lib/rabbitmq/.reset_mnesia_database" }
only_if { node["openstack"]["mq"]["cluster"] }
end

View File

@ -19,13 +19,34 @@ describe "openstack-ops-messaging::rabbitmq-server" do
expect(@chef_run.node["rabbitmq"]["address"]).to eql "127.0.0.1"
expect(@chef_run.node["rabbitmq"]["default_user"]).to eql "rabbit-user"
expect(@chef_run.node['rabbitmq']['default_pass']).to eql "rabbit-pass"
expect(@chef_run.node['rabbitmq']['erlang_cookie']).to eql(
"erlang-cookie"
)
expect(@chef_run.node['rabbitmq']['cluster']).to be_true
expect(@chef_run.node['rabbitmq']['cluster_disk_nodes']).to eql(
["rabbit-user@host1", "rabbit-user@host2"]
)
end
describe "cluster" do
before do
@chef_run = ::ChefSpec::ChefRunner.new(::UBUNTU_OPTS) do |n|
n.set["openstack"]["mq"] = {
"user" => "rabbit-user",
"cluster" => true
}
end
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
end
it "overrides cluster" do
expect(@chef_run.node['rabbitmq']['cluster']).to be_true
end
it "overrides erlang_cookie" do
expect(@chef_run.node['rabbitmq']['erlang_cookie']).to eql(
"erlang-cookie"
)
end
it "overrides cluster_disk_nodes" do
expect(@chef_run.node['rabbitmq']['cluster_disk_nodes']).to eql(
["rabbit-user@host1", "rabbit-user@host2"]
)
end
end
it "includes rabbit recipes" do
@ -119,41 +140,60 @@ describe "openstack-ops-messaging::rabbitmq-server" do
describe "mnesia" do
before do
::File.stub(:exists?).and_call_original
opts = ::UBUNTU_OPTS.merge(:evaluate_guards => true)
@chef_run = ::ChefSpec::ChefRunner.new opts do |n|
n.set["openstack"]["mq"] = {
"user" => "rabbit-user",
"vhost" => "/test-vhost"
}
end
@cmd = <<-EOH.gsub(/^\s+/, "")
service rabbitmq-server stop;
rm -rf mnesia/;
touch .reset_mnesia_database;
service rabbitmq-server start
EOH
@file = "/var/lib/rabbitmq/.reset_mnesia_database"
end
it "resets database" do
::File.should_receive(:exists?).
with(@file).
and_return(false)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
it "doesn't reset the database" do
opts = ::UBUNTU_OPTS.merge(:evaluate_guards => true)
chef_run = ::ChefSpec::ChefRunner.new opts do |n|
n.set["openstack"]["mq"] = {
"user" => "rabbit-user",
"vhost" => "/test-vhost"
}
end
chef_run.converge "openstack-ops-messaging::rabbitmq-server"
expect(@chef_run).to execute_command(@cmd).with(
:cwd => "/var/lib/rabbitmq"
)
expect(chef_run).not_to execute_command(@cmd)
end
it "doesn't reset database when already did" do
::File.should_receive(:exists?).
with(@file).
and_return(true)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
describe "cluster" do
before do
::File.stub(:exists?).and_call_original
opts = ::UBUNTU_OPTS.merge(:evaluate_guards => true)
@chef_run = ::ChefSpec::ChefRunner.new opts do |n|
n.set["openstack"]["mq"] = {
"user" => "rabbit-user",
"vhost" => "/test-vhost",
"cluster" => true
}
end
@file = "/var/lib/rabbitmq/.reset_mnesia_database"
end
expect(@chef_run).not_to execute_command(@cmd)
it "resets database" do
::File.should_receive(:exists?).
with(@file).
and_return(false)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
expect(@chef_run).to execute_command(@cmd).with(
:cwd => "/var/lib/rabbitmq"
)
end
it "doesn't reset database when already did" do
::File.should_receive(:exists?).
with(@file).
and_return(true)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
expect(@chef_run).not_to execute_command(@cmd)
end
end
end
end