Configure rabbit and EPMD to bind to an address

This change integrates against a rabbitmq cookbook feature which
is not yet merged upstream.  However, given the default code path
does not change, felt okay to get this out there.  Especially b/c
we are dependant on it.  This feature allows one to run rabbit
and clustering across a specific address.  For more details, see:
  http://tickets.opscode.com/browse/COOK-3320

Change-Id: I2a10c551cb2176dadaee8842eeadfdfc8cb93e44
This commit is contained in:
John Dewey 2013-07-13 12:43:03 -07:00
parent 8dc0fd90cd
commit 3b35ac204d
6 changed files with 75 additions and 3 deletions

View File

@ -42,6 +42,7 @@ None
# Attributes #
* `openstack["mq"]["bind_interface"]` - bind to interfaces IPv4 address
* `openstack["mq"]["erl_bind_networking"]` - whether or not to bind rabbit and epmd to the listen address determined by `openstack["mq"]["bind_interface"]`
* `openstack["mq"]["cluster"]` - whether or not to cluster rabbit, defaults to 'false'
Testing

View File

@ -19,3 +19,4 @@
default["openstack"]["mq"]["bind_interface"] = "lo"
default["openstack"]["mq"]["cluster"] = false
default["openstack"]["mq"]["erl_bind_networking"] = false

View File

@ -19,6 +19,8 @@
# limitations under the License.
#
require "resolv"
class ::Chef::Recipe
include ::Openstack
end
@ -39,13 +41,33 @@ node.override["rabbitmq"]["default_user"] = user
node.override["rabbitmq"]["default_pass"] = pass
node.override["rabbitmq"]["use_distro_version"] = true
# Bind EPMD to the `listen_address`.
# http://tickets.opscode.com/browse/COOK-3320
if node["openstack"]["mq"]["erl_bind_networking"]
begin
fqdn = ::Resolv.getname listen_address
host = fqdn.split(/\./)[0]
node.override["rabbitmq"]["erl_networking_bind_address"] = listen_address
node.set["rabbitmq"]["nodename"] = "#{user}@#{host}"
node.save
rescue ::Resolv::ResolvError
log "IP '#{listen_address}' failed to resolve reverse DNS!" do
level :error
end
end
else
node.set["rabbitmq"]["nodename"] = "#{user}@#{node["hostname"]}"
node.save
end
# 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 chef_environment:#{node.chef_environment}"
node.override["rabbitmq"]["cluster_disk_nodes"] = search(:node, qs).map do |n|
"#{user}@#{n['hostname']}"
n["rabbitmq"]["nodename"]
end.sort
end

View File

@ -1,10 +1,12 @@
require_relative "spec_helper"
require "resolv"
describe "openstack-ops-messaging::rabbitmq-server" do
before { ops_messaging_stubs }
describe "ubuntu" do
before do
@chef_run = ::ChefSpec::ChefRunner.new ::UBUNTU_OPTS
@chef_run.node.stub(:save)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
end
@ -14,6 +16,49 @@ 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 "guest"
expect(@chef_run.node['rabbitmq']['default_pass']).to eql "rabbit-pass"
expect(@chef_run.node['rabbitmq']['nodename']).to eql "guest@Fauxhai"
end
describe "erl_bind_networking" do
before do
::Chef::Recipe.any_instance.stub(:address_for).
with("lo").
and_return "10.0.0.10"
::Resolv.stub(:getname).
with("10.0.0.10").
and_return "foo.example.com"
@chef_run = ::ChefSpec::ChefRunner.new(::UBUNTU_OPTS) do |n|
n.set["openstack"]["mq"] = {
"erl_bind_networking" => true
}
end
@chef_run.node.stub(:save)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
end
it "overrides rabbit's erl_networking_bind_address" do
attr = @chef_run.node["rabbitmq"]["erl_networking_bind_address"]
expect(attr).to eql "10.0.0.10"
end
it "overrides rabbit's nodename" do
expect(@chef_run.node["rabbitmq"]["nodename"]).to eql "guest@foo"
end
it "logs an error when IP does not resolve r/DNS" do
::Resolv.stub(:getname).
with("10.0.0.10").
and_raise ::Resolv::ResolvError.new("test exception")
chef_run = ::ChefSpec::ChefRunner.new(::UBUNTU_OPTS) do |n|
n.set["openstack"]["mq"] = {
"erl_bind_networking" => true
}
end
chef_run.node.stub(:save)
chef_run.converge "openstack-ops-messaging::rabbitmq-server"
expect(chef_run).to log "IP '10.0.0.10' failed to resolve reverse DNS!"
end
end
describe "cluster" do
@ -23,6 +68,7 @@ describe "openstack-ops-messaging::rabbitmq-server" do
"cluster" => true
}
end
@chef_run.node.stub(:save)
@chef_run.converge "openstack-ops-messaging::rabbitmq-server"
end
@ -64,6 +110,7 @@ describe "openstack-ops-messaging::rabbitmq-server" do
it "doesn't delete guest user" do
opts = ::UBUNTU_OPTS.merge(:evaluate_guards => true)
chef_run = ::ChefSpec::ChefRunner.new opts
chef_run.node.stub(:save)
chef_run.converge "openstack-ops-messaging::rabbitmq-server"
resource = chef_run.find_resource(

View File

@ -6,6 +6,7 @@ describe "openstack-ops-messaging::server" do
it "uses proper messaging server recipe" do
chef_run = ::ChefSpec::ChefRunner.new ::UBUNTU_OPTS
chef_run.node.stub(:save)
chef_run.converge "openstack-ops-messaging::server"
expect(chef_run).to include_recipe "openstack-ops-messaging::rabbitmq-server"

View File

@ -19,8 +19,8 @@ def ops_messaging_stubs
::Chef::Recipe.any_instance.stub(:search).
with(:node, "roles:os-ops-messaging AND chef_environment:_default").
and_return [
{ 'hostname' => 'host2' },
{ 'hostname' => 'host1' }
{ 'rabbitmq' => { 'nodename' => 'guest@host2' }},
{ 'rabbitmq' => { 'nodename' => 'guest@host1' }}
]
::Chef::Recipe.any_instance.stub(:user_password).
and_return "rabbit-pass"