From 154ad8a025ade4cde448dd7b48046fc0ccdfbd43 Mon Sep 17 00:00:00 2001 From: Thang Nguyen Date: Tue, 19 Sep 2017 23:52:13 +0700 Subject: [PATCH 1/3] [fix_wrong_credential] Added checking credentials before searching issues --- lib/embulk/input/jira.rb | 7 +++++++ lib/embulk/input/jira_api/client.rb | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/embulk/input/jira.rb b/lib/embulk/input/jira.rb index c6954b7..fc27c11 100644 --- a/lib/embulk/input/jira.rb +++ b/lib/embulk/input/jira.rb @@ -62,6 +62,9 @@ def self.guess(config) retry_initial_wait_sec = config.param(:retry_initial_wait_sec, :integer, default: 1) retryer = retryer(retry_limit, retry_initial_wait_sec) + # Get credential before going to search issue + jira.get_user_credential(username) + # TODO: we use 0..10 issues to guess config? records = retryer.with_retry do jira.search_issues(jql, max_results: GUESS_RECORDS_COUNT).map do |issue| @@ -93,6 +96,8 @@ def init def run return preview if preview? + + @jira.get_user_credential(task[:username]) options = {} total_count = @jira.total_count(@jql) last_page = (total_count.to_f / PER_PAGE).ceil @@ -136,6 +141,8 @@ def logger private def preview + @jira.get_user_credential(task[:username]) + logger.debug "For preview mode, JIRA input plugin fetches records at most #{PREVIEW_RECORDS_COUNT}" @jira.search_issues(@jql, max_results: PREVIEW_RECORDS_COUNT).each do |issue| values = @attributes.map do |(attribute_name, type)| diff --git a/lib/embulk/input/jira_api/client.rb b/lib/embulk/input/jira_api/client.rb index c0b1bc8..ca136cf 100644 --- a/lib/embulk/input/jira_api/client.rb +++ b/lib/embulk/input/jira_api/client.rb @@ -40,6 +40,19 @@ def total_count(jql) search(jql, max_results: 1).num_results end + def get_user_credential(username) + Jiralicious::Issue.find(username) + rescue Jiralicious::JqlError, Jiralicious::AuthenticationError, Jiralicious::NotLoggedIn, Jiralicious::InvalidLogin => e + raise Embulk::ConfigError.new(e.message) + rescue ::SocketError => e + # wrong `uri` option given + raise Embulk::ConfigError.new(e.message) + rescue MultiJson::ParseError => e + html = e.message + title = html[%r|(.*?)|, 1] #=> e.g. "Unauthorized (401)" + raise ConfigError.new("Can not authorize with your credential.") if title == 'Unauthorized (401)' + end + private def timeout_and_retry(wait, retry_times = DEFAULT_SEARCH_RETRY_TIMES, &block) @@ -61,13 +74,12 @@ def timeout_and_retry(wait, retry_times = DEFAULT_SEARCH_RETRY_TIMES, &block) title = html[%r|(.*?)|, 1] #=> e.g. "Unauthorized (401)" if title # (a) - Embulk.logger.warn "JIRA returns HTML: #{html}" case title when "Atlassian Cloud Notifications - Page Unavailable" # a.k.a. HTTP 503 raise title when "Unauthorized (401)" - Embulk.logger.warn "JIRA returns error: #{title}" + Embulk.logger.warn "JIRA returns error: #{title}. Will go to retry" count += 1 retry end From 4f9684a108a31caa67d74058145b4e5fdb7b920b Mon Sep 17 00:00:00 2001 From: Thang Nguyen Date: Wed, 20 Sep 2017 17:36:15 +0700 Subject: [PATCH 2/3] [fix_wrong_credential] Fixed unit test --- spec/embulk/input/jira_spec.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spec/embulk/input/jira_spec.rb b/spec/embulk/input/jira_spec.rb index efce35a..4faf7f8 100644 --- a/spec/embulk/input/jira_spec.rb +++ b/spec/embulk/input/jira_spec.rb @@ -131,6 +131,7 @@ end before do + allow(jira_api).to receive(:get_user_credential).with(username).and_return(username) allow(jira_api).to receive(:search_issues).with(jql, max_results: described_class::GUESS_RECORDS_COUNT).and_return(jira_issues) allow(config).to receive(:param).with(:username, :string).and_return(username) @@ -211,12 +212,14 @@ end let(:commit_report) { {} } + let(:username) { "jira-user" } before do allow(jira_api).to receive(:preview?).and_return(false) # TODO: create stubs without each `it` expected allow(Embulk::Input::JiraApi::Client).to receive(:setup).and_return(jira_api) + allow(jira_api).to receive(:get_user_credential).and_return(username) 0.step(total_count, max_result) do |start_at| issues = jira_issues[start_at..(start_at + max_result - 1)] @@ -256,6 +259,7 @@ let(:page_builder) { double("page_builder") } let(:jira_api) { Embulk::Input::JiraApi::Client.new } let(:jira_issues) { [Embulk::Input::JiraApi::Issue.new(attributes)] } + let(:username) { "jira-user" } let(:attributes) do { "id" => "100", @@ -281,6 +285,7 @@ allow(Embulk::Input::JiraApi::Client).to receive(:setup).and_return(jira_api) allow(plugin).to receive(:logger).and_return(::Logger.new(File::NULL)) allow(plugin).to receive(:preview?).and_return(true) + allow(jira_api).to receive(:get_user_credential).and_return(username) allow(jira_api).to receive(:search_issues).and_return(jira_issues) allow(page_builder).to receive(:add) allow(page_builder).to receive(:finish) From f4af0642d784cbde45eb37f16db8fbf39972a8af Mon Sep 17 00:00:00 2001 From: Thang Nguyen Date: Thu, 21 Sep 2017 16:55:25 +0700 Subject: [PATCH 3/3] [fix_wrong_credential] Renamed method --- lib/embulk/input/jira.rb | 6 +++--- lib/embulk/input/jira_api/client.rb | 2 +- spec/embulk/input/jira_spec.rb | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/embulk/input/jira.rb b/lib/embulk/input/jira.rb index fc27c11..99a3c5c 100644 --- a/lib/embulk/input/jira.rb +++ b/lib/embulk/input/jira.rb @@ -63,7 +63,7 @@ def self.guess(config) retryer = retryer(retry_limit, retry_initial_wait_sec) # Get credential before going to search issue - jira.get_user_credential(username) + jira.check_user_credential(username) # TODO: we use 0..10 issues to guess config? records = retryer.with_retry do @@ -97,7 +97,7 @@ def init def run return preview if preview? - @jira.get_user_credential(task[:username]) + @jira.check_user_credential(task[:username]) options = {} total_count = @jira.total_count(@jql) last_page = (total_count.to_f / PER_PAGE).ceil @@ -141,7 +141,7 @@ def logger private def preview - @jira.get_user_credential(task[:username]) + @jira.check_user_credential(task[:username]) logger.debug "For preview mode, JIRA input plugin fetches records at most #{PREVIEW_RECORDS_COUNT}" @jira.search_issues(@jql, max_results: PREVIEW_RECORDS_COUNT).each do |issue| diff --git a/lib/embulk/input/jira_api/client.rb b/lib/embulk/input/jira_api/client.rb index ca136cf..839f0cc 100644 --- a/lib/embulk/input/jira_api/client.rb +++ b/lib/embulk/input/jira_api/client.rb @@ -40,7 +40,7 @@ def total_count(jql) search(jql, max_results: 1).num_results end - def get_user_credential(username) + def check_user_credential(username) Jiralicious::Issue.find(username) rescue Jiralicious::JqlError, Jiralicious::AuthenticationError, Jiralicious::NotLoggedIn, Jiralicious::InvalidLogin => e raise Embulk::ConfigError.new(e.message) diff --git a/spec/embulk/input/jira_spec.rb b/spec/embulk/input/jira_spec.rb index 4faf7f8..98c775b 100644 --- a/spec/embulk/input/jira_spec.rb +++ b/spec/embulk/input/jira_spec.rb @@ -131,7 +131,7 @@ end before do - allow(jira_api).to receive(:get_user_credential).with(username).and_return(username) + allow(jira_api).to receive(:check_user_credential).with(username).and_return(username) allow(jira_api).to receive(:search_issues).with(jql, max_results: described_class::GUESS_RECORDS_COUNT).and_return(jira_issues) allow(config).to receive(:param).with(:username, :string).and_return(username) @@ -219,7 +219,7 @@ # TODO: create stubs without each `it` expected allow(Embulk::Input::JiraApi::Client).to receive(:setup).and_return(jira_api) - allow(jira_api).to receive(:get_user_credential).and_return(username) + allow(jira_api).to receive(:check_user_credential).and_return(username) 0.step(total_count, max_result) do |start_at| issues = jira_issues[start_at..(start_at + max_result - 1)] @@ -285,7 +285,7 @@ allow(Embulk::Input::JiraApi::Client).to receive(:setup).and_return(jira_api) allow(plugin).to receive(:logger).and_return(::Logger.new(File::NULL)) allow(plugin).to receive(:preview?).and_return(true) - allow(jira_api).to receive(:get_user_credential).and_return(username) + allow(jira_api).to receive(:check_user_credential).and_return(username) allow(jira_api).to receive(:search_issues).and_return(jira_issues) allow(page_builder).to receive(:add) allow(page_builder).to receive(:finish)