From c6bae10c3f2a31ca6e605b78a78b31f5f5ce17d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 16:48:43 +1000 Subject: [PATCH 01/10] Refactor the instance agent helper require It allows devs to run individual test: `ruby -itest test/name_test.rb` --- test/test_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 160cdb26..47274f03 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -18,4 +18,4 @@ # require local test helpers. If you need a helper write, # keep this pattern or you'll be punished hard -require 'instance_agent_helper' +require_relative './helpers/instance_agent_helper' From 1d990ef8028b4a0612f81752588f93884a6fead6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 16:49:51 +1000 Subject: [PATCH 02/10] Add :time_zone option --- lib/instance_agent/config.rb | 11 +++++++++++ test/instance_agent/config_test.rb | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/instance_agent/config.rb b/lib/instance_agent/config.rb index 59a0bc0a..0f585595 100644 --- a/lib/instance_agent/config.rb +++ b/lib/instance_agent/config.rb @@ -3,6 +3,8 @@ module InstanceAgent class Config < ProcessManager::Config + VALID_TIME_ZONES = ['local', 'utc'] + def self.init @config = Config.new ProcessManager::Config.instance_variable_set("@config", @config) @@ -11,6 +13,7 @@ def self.init def validate errors = super validate_children(errors) + validate_time_zone(errors) errors end @@ -31,6 +34,7 @@ def initialize :instance_service_port => nil, :wait_between_runs => 30, :wait_after_error => 30, + :time_zone => 'local', :codedeploy_test_profile => 'prod', :kill_agent_max_wait_time_seconds => 7200, :on_premises_config_file => '/etc/codedeploy-agent/conf/codedeploy.onpremises.yml', @@ -39,10 +43,17 @@ def initialize }) end + private + def validate_children(errors = []) errors << 'children can only be set to 1' unless config[:children] == 1 errors end + def validate_time_zone(errors = []) + errors << 'time_zone can only be set to [local|utc]' unless VALID_TIME_ZONES.include?(config[:time_zone]) + errors + end + end end diff --git a/test/instance_agent/config_test.rb b/test/instance_agent/config_test.rb index 2b53bbaa..f863a8b3 100644 --- a/test/instance_agent/config_test.rb +++ b/test/instance_agent/config_test.rb @@ -26,6 +26,7 @@ class InstanceAgentConfigTest < InstanceAgentTestCase :instance_service_port => nil, :wait_between_runs => 30, :wait_after_error => 30, + :time_zone => 'local', :codedeploy_test_profile => 'prod', :on_premises_config_file => '/etc/codedeploy-agent/conf/codedeploy.onpremises.yml', :ongoing_deployment_tracking => 'ongoing-deployment', @@ -64,6 +65,18 @@ class InstanceAgentConfigTest < InstanceAgentTestCase InstanceAgent::Config.config[:children] = 1 assert InstanceAgent::Config.validate_config.empty?, InstanceAgent::Config.validate_config.inspect end + + should 'validate the time_zone setting' do + InstanceAgent::Config.config[:time_zone] = nil + puts InstanceAgent::Config.config.inspect + assert_equal 'time_zone can only be set to [local|utc]', InstanceAgent::Config.validate_config.pop + InstanceAgent::Config.config[:time_zone] = 'invalid_time_zone' + assert_equal 'time_zone can only be set to [local|utc]', InstanceAgent::Config.validate_config.pop + InstanceAgent::Config.config[:time_zone] = 'local' + assert InstanceAgent::Config.validate_config.empty?, InstanceAgent::Config.validate_config.inspect + InstanceAgent::Config.config[:time_zone] = 'utc' + assert InstanceAgent::Config.validate_config.empty?, InstanceAgent::Config.validate_config.inspect + end end end end From 0c84f5127a91630c5ff7e1a5800dad2c2e9a9dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 17:47:17 +1000 Subject: [PATCH 03/10] Add timecop gem --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 46eb04c0..6a483e13 100644 --- a/Gemfile +++ b/Gemfile @@ -19,4 +19,5 @@ group :test do gem 'shoulda' gem 'shoulda-matchers' gem 'shoulda-context' + gem 'timecop' end From 6c6beac60ca5b09b6fc7e5ef926bc6b15a8416a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 17:47:48 +1000 Subject: [PATCH 04/10] Cast timestamp to UTC ISO8601 format --- lib/instance_agent/log.rb | 16 ++++++++-- test/instance_agent/log_test.rb | 52 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 test/instance_agent/log_test.rb diff --git a/lib/instance_agent/log.rb b/lib/instance_agent/log.rb index ced996b0..c19fd148 100644 --- a/lib/instance_agent/log.rb +++ b/lib/instance_agent/log.rb @@ -1,5 +1,6 @@ require 'process_manager/log' require 'singleton' +require 'time' InstanceAgent::Log = ProcessManager::Log @@ -11,11 +12,22 @@ def initialize FileUtils.mkdir_p(deployment_logs_dir) unless File.exists? deployment_logs_dir @deployment_log ||= Logger.new(File.join(deployment_logs_dir, "#{InstanceAgent::Config.config[:program_name]}-deployments.log"), 8, 64 * 1024 * 1024) @deployment_log.formatter = proc do |severity, datetime, progname, msg| - "[#{datetime.strftime('%Y-%m-%d %H:%M:%S.%L')}] #{msg}\n" + "[#{format_datetime(datetime)}] #{msg}\n" end end def log(message) @deployment_log.info(message) - end + end + + private + + def format_datetime(datetime) + case InstanceAgent::Config.config[:time_zone] + when 'utc' + datetime.utc.iso8601(3) + else + datetime.strftime('%Y-%m-%d %H:%M:%S.%L') + end + end end diff --git a/test/instance_agent/log_test.rb b/test/instance_agent/log_test.rb new file mode 100644 index 00000000..0dddf693 --- /dev/null +++ b/test/instance_agent/log_test.rb @@ -0,0 +1,52 @@ +require 'test_helper' + +class InstanceAgentDeploymentLogTest < InstanceAgentTestCase + setup do + InstanceAgent::Config.config[:root_dir] = @dir + InstanceAgent::Config.config[:program_name] = 'app' + @log_file = File.join(@dir, 'deployment-logs', "app-deployments.log") + File.open(@log_file, 'w') { |file| file.truncate(0) } + end + + context 'The instance agent deployment log when no explicit :time_zone config option is given' do + should 'prints log output with local time' do + time = Time.local(2008, 9, 1, 12, 0, 0) + + Timecop.freeze(time) do + InstanceAgent::DeploymentLog.instance.log("Use local time") + assert_equal("[2008-09-01 12:00:00.000] Use local time\n", `cat #{@log_file}`) + end + end + end + + context 'The instance agent deployment log when :time_zone config option is local' do + setup do + InstanceAgent::Config.config[:time_zone] = 'local' + end + + should 'prints log output with local time' do + time = Time.local(2018, 9, 1, 15, 0, 0) + + Timecop.freeze(time) do + InstanceAgent::DeploymentLog.instance.log("Use local time") + assert_equal("[2018-09-01 15:00:00.000] Use local time\n", `cat #{@log_file}`) + end + end + end + + context 'The instance agent deployment log when :time_zone config option is utc' do + setup do + InstanceAgent::Config.config[:time_zone] = 'utc' + end + + should 'prints log output with UTC ISO8601 time' do + time = Time.local(2018, 9, 1, 14, 0, 0) + + Timecop.freeze(time) do + InstanceAgent::DeploymentLog.instance.log("Use UTC ISO8601 formatted time") + assert_equal("[2018-09-01T04:00:00.000Z] Use UTC ISO8601 formatted time\n", `cat #{@log_file}`) + end + end + end + +end From a9b39dabf6a3c276f33515e5c537e2c55c40003a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 17:51:29 +1000 Subject: [PATCH 05/10] rename to deployment_log_test --- test/instance_agent/{log_test.rb => deployment_log_test.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/instance_agent/{log_test.rb => deployment_log_test.rb} (100%) diff --git a/test/instance_agent/log_test.rb b/test/instance_agent/deployment_log_test.rb similarity index 100% rename from test/instance_agent/log_test.rb rename to test/instance_agent/deployment_log_test.rb From 49965e21ad7d14a45091db119e4498babd7e356b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 17:55:24 +1000 Subject: [PATCH 06/10] Add truncate_file helper --- test/helpers/instance_agent_helper.rb | 4 ++++ test/instance_agent/deployment_log_test.rb | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/test/helpers/instance_agent_helper.rb b/test/helpers/instance_agent_helper.rb index 9578172c..26f28654 100644 --- a/test/helpers/instance_agent_helper.rb +++ b/test/helpers/instance_agent_helper.rb @@ -24,4 +24,8 @@ def assert_raised_with_message(message, error_type = RuntimeError) error = assert_raise(error_type) { yield } assert_equal(message, error.message) end + + def truncate_file(filename) + File.open(filename, 'w') { |file| file.truncate(0) } if File.exists?(filename) + end end diff --git a/test/instance_agent/deployment_log_test.rb b/test/instance_agent/deployment_log_test.rb index 0dddf693..9c9d4ea8 100644 --- a/test/instance_agent/deployment_log_test.rb +++ b/test/instance_agent/deployment_log_test.rb @@ -5,7 +5,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase InstanceAgent::Config.config[:root_dir] = @dir InstanceAgent::Config.config[:program_name] = 'app' @log_file = File.join(@dir, 'deployment-logs', "app-deployments.log") - File.open(@log_file, 'w') { |file| file.truncate(0) } + truncate_file(@log_file) end context 'The instance agent deployment log when no explicit :time_zone config option is given' do @@ -48,5 +48,4 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase end end end - end From 749f4a4752917c4582334691efedb8d8cd64937a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 18:03:36 +1000 Subject: [PATCH 07/10] Code refactoring --- test/instance_agent/deployment_log_test.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/test/instance_agent/deployment_log_test.rb b/test/instance_agent/deployment_log_test.rb index 9c9d4ea8..40e37f01 100644 --- a/test/instance_agent/deployment_log_test.rb +++ b/test/instance_agent/deployment_log_test.rb @@ -5,14 +5,15 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase InstanceAgent::Config.config[:root_dir] = @dir InstanceAgent::Config.config[:program_name] = 'app' @log_file = File.join(@dir, 'deployment-logs', "app-deployments.log") + end + + teardown do truncate_file(@log_file) end context 'The instance agent deployment log when no explicit :time_zone config option is given' do should 'prints log output with local time' do - time = Time.local(2008, 9, 1, 12, 0, 0) - - Timecop.freeze(time) do + Timecop.freeze(Time.local(2008, 9, 1, 12, 0, 0)) do InstanceAgent::DeploymentLog.instance.log("Use local time") assert_equal("[2008-09-01 12:00:00.000] Use local time\n", `cat #{@log_file}`) end @@ -25,9 +26,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase end should 'prints log output with local time' do - time = Time.local(2018, 9, 1, 15, 0, 0) - - Timecop.freeze(time) do + Timecop.freeze(Time.local(2018, 9, 1, 15, 0, 0)) do InstanceAgent::DeploymentLog.instance.log("Use local time") assert_equal("[2018-09-01 15:00:00.000] Use local time\n", `cat #{@log_file}`) end @@ -40,9 +39,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase end should 'prints log output with UTC ISO8601 time' do - time = Time.local(2018, 9, 1, 14, 0, 0) - - Timecop.freeze(time) do + Timecop.freeze(Time.local(2018, 9, 1, 14, 0, 0)) do InstanceAgent::DeploymentLog.instance.log("Use UTC ISO8601 formatted time") assert_equal("[2018-09-01T04:00:00.000Z] Use UTC ISO8601 formatted time\n", `cat #{@log_file}`) end From 0506971dfa5111342cd9a3c28d0052db1758d687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 18:17:27 +1000 Subject: [PATCH 08/10] Fetch the last line --- test/instance_agent/deployment_log_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/instance_agent/deployment_log_test.rb b/test/instance_agent/deployment_log_test.rb index 40e37f01..f27f23ef 100644 --- a/test/instance_agent/deployment_log_test.rb +++ b/test/instance_agent/deployment_log_test.rb @@ -15,7 +15,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase should 'prints log output with local time' do Timecop.freeze(Time.local(2008, 9, 1, 12, 0, 0)) do InstanceAgent::DeploymentLog.instance.log("Use local time") - assert_equal("[2008-09-01 12:00:00.000] Use local time\n", `cat #{@log_file}`) + assert_equal("[2008-09-01 12:00:00.000] Use local time\n", `tail -n 1 #{@log_file}`) end end end @@ -28,7 +28,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase should 'prints log output with local time' do Timecop.freeze(Time.local(2018, 9, 1, 15, 0, 0)) do InstanceAgent::DeploymentLog.instance.log("Use local time") - assert_equal("[2018-09-01 15:00:00.000] Use local time\n", `cat #{@log_file}`) + assert_equal("[2018-09-01 15:00:00.000] Use local time\n", `tail -n 1 #{@log_file}`) end end end @@ -41,7 +41,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase should 'prints log output with UTC ISO8601 time' do Timecop.freeze(Time.local(2018, 9, 1, 14, 0, 0)) do InstanceAgent::DeploymentLog.instance.log("Use UTC ISO8601 formatted time") - assert_equal("[2018-09-01T04:00:00.000Z] Use UTC ISO8601 formatted time\n", `cat #{@log_file}`) + assert_equal("[2018-09-01T04:00:00.000Z] Use UTC ISO8601 formatted time\n", `tail -n 1 #{@log_file}`) end end end From 4945baaa7baa91241e5c03c6a7da8c49dca9851e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 18:18:14 +1000 Subject: [PATCH 09/10] Use tail to fetch last line --- test/helpers/instance_agent_helper.rb | 4 ---- test/instance_agent/deployment_log_test.rb | 4 ---- 2 files changed, 8 deletions(-) diff --git a/test/helpers/instance_agent_helper.rb b/test/helpers/instance_agent_helper.rb index 26f28654..9578172c 100644 --- a/test/helpers/instance_agent_helper.rb +++ b/test/helpers/instance_agent_helper.rb @@ -24,8 +24,4 @@ def assert_raised_with_message(message, error_type = RuntimeError) error = assert_raise(error_type) { yield } assert_equal(message, error.message) end - - def truncate_file(filename) - File.open(filename, 'w') { |file| file.truncate(0) } if File.exists?(filename) - end end diff --git a/test/instance_agent/deployment_log_test.rb b/test/instance_agent/deployment_log_test.rb index f27f23ef..6454dc49 100644 --- a/test/instance_agent/deployment_log_test.rb +++ b/test/instance_agent/deployment_log_test.rb @@ -7,10 +7,6 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase @log_file = File.join(@dir, 'deployment-logs', "app-deployments.log") end - teardown do - truncate_file(@log_file) - end - context 'The instance agent deployment log when no explicit :time_zone config option is given' do should 'prints log output with local time' do Timecop.freeze(Time.local(2008, 9, 1, 12, 0, 0)) do From aba35f899b85210073c65978ec0c04f6cd49ccf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trung=20L=C3=AA?= Date: Fri, 17 Aug 2018 18:34:00 +1000 Subject: [PATCH 10/10] Fix UTC test case --- test/instance_agent/deployment_log_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/instance_agent/deployment_log_test.rb b/test/instance_agent/deployment_log_test.rb index 6454dc49..9c3a66df 100644 --- a/test/instance_agent/deployment_log_test.rb +++ b/test/instance_agent/deployment_log_test.rb @@ -35,7 +35,7 @@ class InstanceAgentDeploymentLogTest < InstanceAgentTestCase end should 'prints log output with UTC ISO8601 time' do - Timecop.freeze(Time.local(2018, 9, 1, 14, 0, 0)) do + Timecop.freeze(Time.new(2018, 9, 1, 14, 0, 0, "+10:00")) do InstanceAgent::DeploymentLog.instance.log("Use UTC ISO8601 formatted time") assert_equal("[2018-09-01T04:00:00.000Z] Use UTC ISO8601 formatted time\n", `tail -n 1 #{@log_file}`) end