diff --git a/README.md b/README.md index bf37fd5f..7838a789 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,12 @@ Installs and configures [Consul][1] client, server and UI. Consul servers to join [] + + ['consul']['retry_on_join'] + Boolean + Set to true to wait for servers to be up before try to elect a leader + false + ['consul']['bind_addr'] String diff --git a/attributes/default.rb b/attributes/default.rb index e928c420..eec42f2f 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -45,6 +45,8 @@ # Service attributes default['consul']['service_mode'] = 'bootstrap' +default['consul']['retry_on_join'] = false + # In the cluster mode, set the default cluster size to 3 default['consul']['bootstrap_expect'] = 3 default['consul']['data_dir'] = '/var/lib/consul' diff --git a/recipes/_service.rb b/recipes/_service.rb index 856ae197..25b20147 100644 --- a/recipes/_service.rb +++ b/recipes/_service.rb @@ -62,6 +62,7 @@ service_config = JSON.parse(node['consul']['extra_params'].to_json) service_config['data_dir'] = node['consul']['data_dir'] num_cluster = node['consul']['bootstrap_expect'].to_i +join_mode = node['consul']['retry_on_join'] ? 'retry_join' : 'start_join' case node['consul']['service_mode'] when 'bootstrap' @@ -71,15 +72,15 @@ service_config['server'] = true if num_cluster > 1 service_config['bootstrap_expect'] = num_cluster - service_config['start_join'] = node['consul']['servers'] + service_config[join_mode] = node['consul']['servers'] else service_config['bootstrap'] = true end when 'server' service_config['server'] = true - service_config['start_join'] = node['consul']['servers'] + service_config[join_mode] = node['consul']['servers'] when 'client' - service_config['start_join'] = node['consul']['servers'] + service_config[join_mode] = node['consul']['servers'] else Chef::Application.fatal! %Q(node['consul']['service_mode'] must be "bootstrap", "cluster", "server", or "client") end diff --git a/spec/unit/recipes/_service_spec.rb b/spec/unit/recipes/_service_spec.rb index 73be083c..c384141e 100644 --- a/spec/unit/recipes/_service_spec.rb +++ b/spec/unit/recipes/_service_spec.rb @@ -103,6 +103,23 @@ end end + context 'with a cluster service_mode, bootstrap_expect > 1 and a server list to join in retry mode' do + let(:chef_run) do + ChefSpec::Runner.new(node_attributes) do |node| + node.set['consul']['service_mode'] = 'cluster' + node.set['consul']['bootstrap_expect'] = '3' + node.set['consul']['servers'] = [ 'server1', 'server2', 'server3' ] + end.converge(described_recipe) + end + it do + expect(chef_run).to create_file('/etc/consul.d/default.json') + .with_content(/retry_join/) + .with_content(/server9/) + .with_content(/server2/) + .with_content(/server3/) + end + end + context 'with a cluster service_mode, bootstrap_expect > 1, and a server list to join' do let(:chef_run) do ChefSpec::Runner.new(node_attributes) do |node|