Skip to content

Commit

Permalink
Merge pull request ManageIQ#12964 from eclarizio/BZ1393982_async
Browse files Browse the repository at this point in the history
Fix for UI hangs if errors are encountered during Git Import
  • Loading branch information
mkanoor committed Dec 5, 2016
2 parents 3fe2410 + dbff1b6 commit f698c9e
Show file tree
Hide file tree
Showing 13 changed files with 618 additions and 168 deletions.
1 change: 1 addition & 0 deletions app/assets/javascripts/application.js
Expand Up @@ -34,6 +34,7 @@
//= require miq_application
//= require miq_change_stored_password
//= require miq_qe
//= require git_import
//= require automate_import_export
//= require dialog_field_refresh
//= require excanvas
Expand Down
18 changes: 7 additions & 11 deletions app/assets/javascripts/automate_import_export.js
Expand Up @@ -33,8 +33,9 @@ var Automate = {

renderGitImport: function(branches, tags, gitRepoId, messages) {
clearMessages();
var message = JSON.parse(messages).message;
var messageLevel = JSON.parse(messages).level;

var message = messages.message;
var messageLevel = messages.level;

if (messageLevel === 'error') {
showErrorMessage(message);
Expand All @@ -50,17 +51,14 @@ var Automate = {

var addToDropDown = function(identifier, child) {
$('select.git-' + identifier).append(
$('<option>', {
value: child,
text: child,
})
$('<option>', {value: child, text: child})
);
};

$.each(JSON.parse(branches), function(_index, child) {
$.each(branches, function(_index, child) {
addToDropDown('branches', child);
});
$.each(JSON.parse(tags), function(_index, child) {
$.each(tags, function(_index, child) {
addToDropDown('tags', child);
});

Expand Down Expand Up @@ -169,9 +167,7 @@ var Automate = {

Automate.setUpGitRefreshClickHandlers();

$('.git-retreive-datastore').click(function() {
miqSparkleOn();
});
GitImport.retrieveDatastoreClickHandler();

$('.git-import-submit').click(function(event) {
event.preventDefault();
Expand Down
50 changes: 50 additions & 0 deletions app/assets/javascripts/git_import.js
@@ -0,0 +1,50 @@
/* global miqSparkleOn miqSparkleOff showErrorMessage clearMessages */

var GitImport = {
TASK_POLL_TIMEOUT: 1500,

retrieveDatastoreClickHandler: function() {
$('.git-retrieve-datastore').click(function(event) {
event.preventDefault();
miqSparkleOn();
clearMessages();

$.post('retrieve_git_datastore', $('#retrieve-git-datastore-form').serialize(), function(data) {
var parsedData = JSON.parse(data);
var messages = parsedData.message;
if (messages && messages.level === 'error') {
showErrorMessage(messages.message);
miqSparkleOff();
} else {
GitImport.pollForGitTaskCompletion(parsedData);
}
});
});
},

pollForGitTaskCompletion: function(gitData) {
$.get('check_git_task', gitData, function(data) {
var parsedData = JSON.parse(data);
if (parsedData.state) {
setTimeout(GitImport.pollForGitTaskCompletion, GitImport.TASK_POLL_TIMEOUT, gitData);
} else {
GitImport.gitTaskCompleted(parsedData);
}
});
},

gitTaskCompleted: function(data) {
if (data.success) {
var postMessageData = {
git_repo_id: data.git_repo_id,
git_branches: data.git_branches,
git_tags: data.git_tags,
message: data.message
};

parent.postMessage(postMessageData, '*');
} else {
parent.postMessage({message: data.message}, '*');
}
},
};
3 changes: 1 addition & 2 deletions app/assets/javascripts/import.js
Expand Up @@ -19,8 +19,7 @@ var ImportSetup = {

listenForGitPostMessages: function() {
window.addEventListener('message', function(event) {
var unencodedMessage = event.data.message.replace(/&quot;/g, '"');
var messageData = JSON.parse(unencodedMessage);
var messageData = event.data.message;

if (messageData.level === 'error') {
showErrorMessage(messageData.message);
Expand Down
91 changes: 54 additions & 37 deletions app/controllers/miq_ae_tools_controller.rb
Expand Up @@ -199,57 +199,70 @@ def review_import
end

def retrieve_git_datastore
redirect_options = {:action => :review_git_import}
git_url = params[:git_url]
verify_ssl = params[:git_verify_ssl] == "true" ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
new_git_repo = false

if git_url.blank?
add_flash(_("Please provide a valid git URL"), :error)
response_json = {:message => @flash_array.first}
elsif !GitBasedDomainImportService.available?
add_flash(_("Please enable the git owner role in order to import git repositories"), :error)
response_json = {:message => @flash_array.first}
else
begin
git_repo = GitRepository.find_or_create_by!(:url => git_url) { new_git_repo = true }
git_repo.update_attributes(:verify_ssl => verify_ssl)
if params[:git_username] && params[:git_password]
git_repo.update_authentication(:values => {:userid => params[:git_username],
:password => params[:git_password]})
end
setup_results = git_repository_service.setup(
git_url,
params[:git_username],
params[:git_password],
params[:git_verify_ssl]
)
git_repo_id = setup_results[:git_repo_id]
new_git_repo = setup_results[:new_git_repo?]

task_options = {
:action => "Retrieve git repository",
:userid => current_user.userid
}
queue_options = {
:class_name => "GitRepository",
:method_name => "refresh",
:instance_id => git_repo.id,
:role => "git_owner",
:args => []
}

task_id = MiqTask.generic_action_with_callback(task_options, queue_options)
task = MiqTask.wait_for_taskid(task_id)

raise task.message unless task.status == "Ok"

branch_names = git_repo.git_branches.collect(&:name)
tag_names = git_repo.git_tags.collect(&:name)
redirect_options[:git_branches] = branch_names.to_json
redirect_options[:git_tags] = tag_names.to_json
redirect_options[:git_repo_id] = git_repo.id
flash_message = "Successfully found git repository, please choose a branch or tag"
add_flash(_(flash_message), :success)
task_id = git_based_domain_import_service.queue_refresh(git_repo_id)
response_json = {:task_id => task_id, :git_repo_id => git_repo_id, :new_git_repo => new_git_repo}
rescue => err
git_repo.destroy if git_repo && new_git_repo
add_flash(_("Error during repository fetch: %{error_message}") % {:error_message => err.message}, :error)
add_flash(_("Error during repository setup: %{error_message}") % {:error_message => err.message}, :error)
response_json = {:message => @flash_array.first}
end
end

redirect_options[:message] = @flash_array.first.to_json
respond_to do |format|
format.js { render :json => response_json.to_json, :status => 200 }
end
end

redirect_to redirect_options
def check_git_task
task = MiqTask.find(params[:task_id])
json = if task.state != MiqTask::STATE_FINISHED
{:state => task.state}
else
git_repo = GitRepository.find(params[:git_repo_id])

if task.status == "Ok"
branch_names = git_repo.git_branches.collect(&:name)
tag_names = git_repo.git_tags.collect(&:name)
flash_message = "Successfully found git repository, please choose a branch or tag"
add_flash(_(flash_message), :success)
{
:git_branches => branch_names,
:git_tags => tag_names,
:git_repo_id => git_repo.id,
:success => true,
:message => @flash_array.first
}
else
git_repo.destroy if git_repo && params[:new_git_repo] != "false"
add_flash(_("Error during repository fetch: #{task.message}"), :error)
{
:success => false,
:message => @flash_array.first
}
end
end

respond_to do |format|
format.js { render :json => json.to_json, :status => 200 }
end
end

def review_git_import
Expand Down Expand Up @@ -323,6 +336,10 @@ def git_based_domain_import_service
@git_based_domain_import_service ||= GitBasedDomainImportService.new
end

def git_repository_service
@git_repository_service ||= GitRepositoryService.new
end

def add_stats(stats_hash)
stats_hash.inject(0) do |result, key_value|
result + key_value[1]
Expand Down
15 changes: 15 additions & 0 deletions app/services/git_repository_service.rb
@@ -0,0 +1,15 @@
class GitRepositoryService
def setup(git_url, git_username, git_password, verify_ssl)
new_git_repo = false
git_repo = GitRepository.find_or_create_by!(:url => git_url) { new_git_repo = true }
git_repo.update_attributes(
:verify_ssl => verify_ssl == "true" ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
)

if git_username && git_password
git_repo.update_authentication(:values => {:userid => git_username, :password => git_password})
end

return {:git_repo_id => git_repo.id, :new_git_repo? => new_git_repo}
end
end
5 changes: 3 additions & 2 deletions app/views/miq_ae_tools/_import_export.html.haml
Expand Up @@ -27,7 +27,8 @@
= _('Import Datastore via git')
= form_tag({:action => "retrieve_git_datastore"},
:target => "upload_target",
:method => :post) do
:method => :post,
:id => "retrieve-git-datastore-form") do
.form-horizontal
.form-group
%label.col-sm-2.control-label
Expand All @@ -54,7 +55,7 @@
.col-md-8
= submit_tag(_("Submit"),
:id => "git-url-import",
:class => "git-retreive-datastore btn btn-default",
:class => "git-retrieve-datastore btn btn-default",
:disabled => !git_import_button_enabled?)
= git_import_submit_help

Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Expand Up @@ -1910,6 +1910,7 @@
:miq_ae_tools => {
:get => %w(
automate_json
check_git_task
export_datastore
fetch_log
import_export
Expand Down

0 comments on commit f698c9e

Please sign in to comment.