diff --git a/README.md b/README.md index 347470f..023e82e 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/attributes/default.rb b/attributes/default.rb index 95782cc..394c573 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -19,3 +19,4 @@ default["openstack"]["mq"]["bind_interface"] = "lo" default["openstack"]["mq"]["cluster"] = false +default["openstack"]["mq"]["erl_bind_networking"] = false diff --git a/recipes/rabbitmq-server.rb b/recipes/rabbitmq-server.rb index 9d2e725..de5104b 100644 --- a/recipes/rabbitmq-server.rb +++ b/recipes/rabbitmq-server.rb @@ -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 diff --git a/spec/rabbitmq-server_spec.rb b/spec/rabbitmq-server_spec.rb index 817387d..ef050e7 100644 --- a/spec/rabbitmq-server_spec.rb +++ b/spec/rabbitmq-server_spec.rb @@ -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( diff --git a/spec/server_spec.rb b/spec/server_spec.rb index 139a7f4..b2f3014 100644 --- a/spec/server_spec.rb +++ b/spec/server_spec.rb @@ -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" diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 5a94c19..9d0c16c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -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"