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:
parent
8dc0fd90cd
commit
3b35ac204d
|
@ -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
|
||||
|
|
|
@ -19,3 +19,4 @@
|
|||
|
||||
default["openstack"]["mq"]["bind_interface"] = "lo"
|
||||
default["openstack"]["mq"]["cluster"] = false
|
||||
default["openstack"]["mq"]["erl_bind_networking"] = false
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue