From f80ab8a69afd36b3ce705d0639689b26fd9b9816 Mon Sep 17 00:00:00 2001 From: uu59 Date: Wed, 14 Jan 2015 13:38:14 +0900 Subject: [PATCH 1/4] Add dryrun method to agents --- app/models/fluentd/agent/fluentd_gem.rb | 12 ++++++++---- app/models/fluentd/agent/td_agent/macosx.rb | 5 ++++- app/models/fluentd/agent/td_agent/unix.rb | 4 ++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/models/fluentd/agent/fluentd_gem.rb b/app/models/fluentd/agent/fluentd_gem.rb index 34b6047..640a6ac 100644 --- a/app/models/fluentd/agent/fluentd_gem.rb +++ b/app/models/fluentd/agent/fluentd_gem.rb @@ -5,7 +5,7 @@ class Fluentd include LocalCommon def self.default_options - { + { :pid_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.pid", :log_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.log", :config_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.conf", @@ -42,6 +42,12 @@ class Fluentd actual_reload end + def dryrun + Bundler.with_clean_env do + system("fluentd --dry-run #{options_to_argv}") + end + end + def version Bundler.with_clean_env do `fluentd --version`.strip @@ -60,9 +66,7 @@ class Fluentd end def validate_fluentd_options - Bundler.with_clean_env do - system("fluentd --dry-run #{options_to_argv}") - end + dryrun end def actual_start diff --git a/app/models/fluentd/agent/td_agent/macosx.rb b/app/models/fluentd/agent/td_agent/macosx.rb index 4d12099..78429a8 100644 --- a/app/models/fluentd/agent/td_agent/macosx.rb +++ b/app/models/fluentd/agent/td_agent/macosx.rb @@ -2,7 +2,6 @@ class Fluentd class Agent class TdAgent module Macosx - def start backup_running_config do detached_command("launchctl load #{plist}") && pid_from_launchctl @@ -17,6 +16,10 @@ class Fluentd stop && start end + def dryrun + detached_command("/usr/sbin/td-agent --dry-run -q --use-v1-config -c #{config_file} -o #{log_file}") + end + private def plist diff --git a/app/models/fluentd/agent/td_agent/unix.rb b/app/models/fluentd/agent/td_agent/unix.rb index 09f6353..db5ccc3 100644 --- a/app/models/fluentd/agent/td_agent/unix.rb +++ b/app/models/fluentd/agent/td_agent/unix.rb @@ -17,6 +17,10 @@ class Fluentd # https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.init#L156 detached_command('/etc/init.d/td-agent restart') end + + def dryrun + detached_command('/etc/init.d/td-agent configtest') + end end end end From afc6cca460541d216e4ccff996ca99d7285ed884 Mon Sep 17 00:00:00 2001 From: uu59 Date: Wed, 14 Jan 2015 13:38:33 +0900 Subject: [PATCH 2/4] Ensure exit status code for detached_command method result --- app/models/fluentd/agent/local_common.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/fluentd/agent/local_common.rb b/app/models/fluentd/agent/local_common.rb index 231d430..73b082b 100644 --- a/app/models/fluentd/agent/local_common.rb +++ b/app/models/fluentd/agent/local_common.rb @@ -133,11 +133,12 @@ class Fluentd end def detached_command(cmd) - Bundler.with_clean_env do + thread = Bundler.with_clean_env do pid = spawn(cmd) Process.detach(pid) end - sleep 1 # NOTE/FIXME: too early return will be caused incorrect status report, "sleep 1" is a adhoc hack + thread.join + thread.value.exitstatus end end end From 1c08790abfe55dbf76999545ac5c90b93a63f3f1 Mon Sep 17 00:00:00 2001 From: uu59 Date: Wed, 14 Jan 2015 14:29:41 +0900 Subject: [PATCH 3/4] Add tests and fix dryrun --- app/models/fluentd/agent/fluentd_gem.rb | 2 +- app/models/fluentd/agent/local_common.rb | 2 +- app/models/fluentd/agent/td_agent/macosx.rb | 4 +- spec/models/fluentd/agent_spec.rb | 49 +++++++++++++++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/app/models/fluentd/agent/fluentd_gem.rb b/app/models/fluentd/agent/fluentd_gem.rb index 640a6ac..2b09ede 100644 --- a/app/models/fluentd/agent/fluentd_gem.rb +++ b/app/models/fluentd/agent/fluentd_gem.rb @@ -44,7 +44,7 @@ class Fluentd def dryrun Bundler.with_clean_env do - system("fluentd --dry-run #{options_to_argv}") + system("fluentd -q --dry-run #{options_to_argv}") end end diff --git a/app/models/fluentd/agent/local_common.rb b/app/models/fluentd/agent/local_common.rb index 73b082b..14a89c5 100644 --- a/app/models/fluentd/agent/local_common.rb +++ b/app/models/fluentd/agent/local_common.rb @@ -138,7 +138,7 @@ class Fluentd Process.detach(pid) end thread.join - thread.value.exitstatus + thread.value.exitstatus.zero? end end end diff --git a/app/models/fluentd/agent/td_agent/macosx.rb b/app/models/fluentd/agent/td_agent/macosx.rb index 78429a8..f782f52 100644 --- a/app/models/fluentd/agent/td_agent/macosx.rb +++ b/app/models/fluentd/agent/td_agent/macosx.rb @@ -13,11 +13,11 @@ class Fluentd end def restart - stop && start + dryrun && stop && start end def dryrun - detached_command("/usr/sbin/td-agent --dry-run -q --use-v1-config -c #{config_file} -o #{log_file}") + detached_command("/usr/sbin/td-agent --dry-run -q --use-v1-config -c #{config_file}") end private diff --git a/spec/models/fluentd/agent_spec.rb b/spec/models/fluentd/agent_spec.rb index c5fe633..4df7744 100644 --- a/spec/models/fluentd/agent_spec.rb +++ b/spec/models/fluentd/agent_spec.rb @@ -22,6 +22,7 @@ describe Fluentd::Agent do end describe "#start" do + before { instance.config_write "" } # ensure valid config before { instance.stub(:running?).and_return(running) } context "running" do @@ -95,6 +96,29 @@ describe Fluentd::Agent do describe "#restart" do it_should_behave_like "Restart strategy" end + + describe "#dryrun" do + subject { instance.dryrun } + + describe "valid/invalid" do + before { instance.stub(:system).and_return(ret) } + + context "valid config" do + let(:ret) { true } + it { should be_truthy } + end + + context "invalid config" do + let(:ret) { false } + it { should be_falsy } + end + end + + it "invoke #system" do + instance.should_receive(:system).with(/--dry-run/) + subject + end + end end describe "TdAgent" do @@ -106,6 +130,7 @@ describe Fluentd::Agent do before do instance.stub(:detached_command).and_return(true) instance.stub(:pid_from_launchctl).and_return(true) + instance.config_write "" # ensure valid config end after do @@ -128,6 +153,30 @@ describe Fluentd::Agent do expect(File.read(backup_file)).to eq File.read(instance.config_file) end end + + describe "#dryrun" do + subject { instance.dryrun } + + describe "valid/invalid" do + before { instance.stub(:detached_command).and_return(ret) } + + context "valid config" do + let(:ret) { true } + it { should be_truthy } + end + + context "invalid config" do + let(:ret) { false } + it { should be_falsy } + end + end + + it "invoke #system" do + # --dry-run check on Mac, configtest for Unix + instance.should_receive(:detached_command).with(/(--dry-run|configtest)/) + subject + end + end end end From 5fe3ef7de4c2befdc9f76018ecf0b0af016f1229 Mon Sep 17 00:00:00 2001 From: uu59 Date: Wed, 14 Jan 2015 14:31:34 +0900 Subject: [PATCH 4/4] cosme --- app/models/fluentd/agent/fluentd_gem.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/fluentd/agent/fluentd_gem.rb b/app/models/fluentd/agent/fluentd_gem.rb index 2b09ede..b1a6f7d 100644 --- a/app/models/fluentd/agent/fluentd_gem.rb +++ b/app/models/fluentd/agent/fluentd_gem.rb @@ -5,7 +5,7 @@ class Fluentd include LocalCommon def self.default_options - { + { :pid_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.pid", :log_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.log", :config_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.conf",