diff --git a/lib/embulk/input/jira.rb b/lib/embulk/input/jira.rb
index c6954b7..99a3c5c 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.check_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.check_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.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|
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..839f0cc 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 check_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
diff --git a/spec/embulk/input/jira_spec.rb b/spec/embulk/input/jira_spec.rb
index efce35a..98c775b 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(: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)
@@ -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(: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)]
@@ -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(: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)